about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-09-12 15:37:55 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-09-12 15:37:55 +0000
commit334c94db4691131b11f95e3bce6b5fda70edd3a1 (patch)
tree423fdbc1cc8966cc4befe5dc950a7f1c30fbf454
parentcd0eb82f20b4b0186207b8f5653b83dde83ca03c (diff)
downloadbtpd-334c94db4691131b11f95e3bce6b5fda70edd3a1.tar.gz
btpd-334c94db4691131b11f95e3bce6b5fda70edd3a1.zip
There is no spoon^H^H^H^Htruct metainfo. Use struct mi_file instead.
-rw-r--r--misc/stream.c35
-rw-r--r--misc/stream.h8
2 files changed, 24 insertions, 19 deletions
diff --git a/misc/stream.c b/misc/stream.c
index 14aada4..fd8042b 100644
--- a/misc/stream.c
+++ b/misc/stream.c
@@ -12,18 +12,22 @@
 #include "stream.h"
 
 int
-bts_open(struct bt_stream **res, struct metainfo *meta, fdcb_t fd_cb,
-    void *fd_arg)
+bts_open(struct bt_stream **res, unsigned nfiles, struct mi_file *files,
+    fdcb_t fd_cb, void *fd_arg)
 {
     struct bt_stream *bts = calloc(1, sizeof(*bts));
     if (bts == NULL)
         return ENOMEM;
 
-    bts->meta = meta;
+    bts->nfiles = nfiles;
+    bts->files = files;
     bts->fd_cb = fd_cb;
     bts->fd_arg = fd_arg;
     bts->fd = -1;
 
+    for (unsigned i = 0; i < bts->nfiles; i++)
+        bts->totlen += bts->files[i].length;
+
     *res = bts;
     return 0;
 }
@@ -46,10 +50,9 @@ bts_seek(struct bt_stream *bts, off_t off)
 
     bts->t_off = off;
 
-    struct fileinfo *files = bts->meta->files;
     unsigned i;
-    for (i = 0; off >= files[i].length; i++)
-        off -= files[i].length;
+    for (i = 0; off >= bts->files[i].length; i++)
+        off -= bts->files[i].length;
 
     if (i != bts->index) {
         if (bts->fd != -1) {
@@ -69,26 +72,26 @@ bts_seek(struct bt_stream *bts, off_t off)
 int
 bts_get(struct bt_stream *bts, off_t off, uint8_t *buf, size_t len)
 {
-    struct fileinfo *files = bts->meta->files;
     size_t boff, wantread;
     ssize_t didread;
     int err;
 
-    assert(off + len <= bts->meta->total_length);
+    assert(off + len <= bts->totlen);
     if ((err = bts_seek(bts, off)) != 0)
         return err;
 
     boff = 0;
     while (boff < len) {
         if (bts->fd == -1) {
-            err = bts->fd_cb(files[bts->index].path, &bts->fd, bts->fd_arg);
+            err = bts->fd_cb(bts->files[bts->index].path,
+                &bts->fd, bts->fd_arg);
             if (err != 0)
                 return err;
             if (bts->f_off != 0)
                 lseek(bts->fd, bts->f_off, SEEK_SET);
         }
 
-        wantread = min(len - boff, files[bts->index].length - bts->f_off);
+        wantread = min(len - boff, bts->files[bts->index].length - bts->f_off);
         didread = read(bts->fd, buf + boff, wantread);
         if (didread == -1)
             return errno;
@@ -96,7 +99,7 @@ bts_get(struct bt_stream *bts, off_t off, uint8_t *buf, size_t len)
         boff += didread;
         bts->f_off += didread;
         bts->t_off += didread;
-        if (bts->f_off == files[bts->index].length) {
+        if (bts->f_off == bts->files[bts->index].length) {
             close(bts->fd);
             bts->fd = -1;
             bts->f_off = 0;
@@ -111,26 +114,26 @@ bts_get(struct bt_stream *bts, off_t off, uint8_t *buf, size_t len)
 int
 bts_put(struct bt_stream *bts, off_t off, const uint8_t *buf, size_t len)
 {
-    struct fileinfo *files = bts->meta->files;
     size_t boff, wantwrite;
     ssize_t didwrite;
     int err;
 
-    assert(off + len <= bts->meta->total_length);
+    assert(off + len <= bts->totlen);
     if ((err = bts_seek(bts, off)) != 0)
         return err;
 
     boff = 0;
     while (boff < len) {
         if (bts->fd == -1) {
-            err = bts->fd_cb(files[bts->index].path, &bts->fd, bts->fd_arg);
+            err = bts->fd_cb(bts->files[bts->index].path,
+                &bts->fd, bts->fd_arg);
             if (err != 0)
                 return err;
             if (bts->f_off != 0)
                 lseek(bts->fd, bts->f_off, SEEK_SET);
         }
 
-        wantwrite = min(len - boff, files[bts->index].length - bts->f_off);
+        wantwrite = min(len - boff, bts->files[bts->index].length - bts->f_off);
         didwrite = write(bts->fd, buf + boff, wantwrite);
         if (didwrite == -1)
             return errno;
@@ -138,7 +141,7 @@ bts_put(struct bt_stream *bts, off_t off, const uint8_t *buf, size_t len)
         boff += didwrite;
         bts->f_off += didwrite;
         bts->t_off += didwrite;
-        if (bts->f_off == files[bts->index].length) {
+        if (bts->f_off == bts->files[bts->index].length) {
             if (fsync(bts->fd) == -1) {
                 int err = errno;
                 close(bts->fd);
diff --git a/misc/stream.h b/misc/stream.h
index 30ce443..0b2e9c2 100644
--- a/misc/stream.h
+++ b/misc/stream.h
@@ -5,7 +5,9 @@ typedef int (*fdcb_t)(const char *, int *, void *);
 typedef void (*hashcb_t)(uint32_t, uint8_t *, void *);
 
 struct bt_stream {
-    struct metainfo *meta;
+    unsigned nfiles;
+    struct mi_file *files;
+    off_t totlen;
     fdcb_t fd_cb;
     void *fd_arg;
     unsigned index;
@@ -14,8 +16,8 @@ struct bt_stream {
     int fd;
 };
 
-int bts_open(struct bt_stream **res, struct metainfo *meta, fdcb_t fd_cb,
-    void *fd_arg);
+int bts_open(struct bt_stream **res, unsigned nfiles, struct mi_file *files,
+    fdcb_t fd_cb, void *fd_arg);
 int bts_get(struct bt_stream *bts, off_t off, uint8_t *buf, size_t len);
 int bts_put(struct bt_stream *bts, off_t off, const uint8_t *buf, size_t len);
 int bts_close(struct bt_stream *bts);