tAdd function to save file list - libeech - bittorrent library
(HTM) git clone git://z3bra.org/libeech.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit ebf503552dc21e5192be8f126dc9f65ae8f2529c
(DIR) parent af359fd15ba51750850011b0fd8525d0fe08f45c
(HTM) Author: z3bra <contactatz3bradotorg>
Date: Mon, 23 Oct 2017 14:10:41 +0200
Add function to save file list
Diffstat:
M libeech.c | 43 ++++++++++++++++++++++++++++++
M libeech.h | 7 +++++++
M torrent.c | 4 ++++
3 files changed, 54 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/libeech.c b/libeech.c
t@@ -14,6 +14,7 @@
/* helpers to retrieve attributes from metadata */
static char * peerid();
static long torrentsize(struct torrent *);
+static long torrentfiles(struct torrent *);
static int chktorrent(struct be *);
static char *
t@@ -56,6 +57,47 @@ torrentsize(struct torrent *t)
return sz;
}
+static long
+torrentfiles(struct torrent *t)
+{
+ int i;
+ long n = 0;
+ char basedir[PATH_MAX], *sp;
+ struct be file, tmp;
+
+ bekstr(&t->info, "name", 4, &tmp);
+ memset(basedir, 0, PATH_MAX);
+ memcpy(basedir, tmp.off, tmp.end - tmp.off);
+
+ /* multi-file torrent */
+ if (!bekv(&t->info, "files", 5, &file)) {
+ t->files = NULL;
+ belist(&file, (unsigned long *)&n);
+ t->files = malloc(sizeof(*t->files) * n);
+ if (!t->files)
+ return -1;
+
+ for (i = 0; !belistnext(&file) && !belistover(&file); i++) {
+ /* save file length */
+ t->files[i].sz = bekint(&file, "length", 6);
+
+ /* save file path */
+ sp = t->files[i].path;
+ memcpy(t->files[i].path, basedir, PATH_MAX);
+ bekv(&file, "path", 4, &tmp);
+ bepath(&tmp, &sp, PATH_MAX);
+ }
+ n = i;
+ /* single-file torrent */
+ } else {
+ n = 1;
+ t->files = malloc(sizeof(*t->files));
+ t->files[0].sz = bekint(&t->info, "length", 6);
+ memcpy(t->files[0].path, basedir, PATH_MAX);
+ }
+
+ return n;
+}
static int
chktorrent(struct be *b)
{
t@@ -130,6 +172,7 @@ glch_loadtorrent(struct torrent *t, char *b, size_t s)
t->ul = 0;
t->dl = 0;
t->sz = torrentsize(t);
+ t->nfile = torrentfiles(t);
return 0;
}
(DIR) diff --git a/libeech.h b/libeech.h
t@@ -22,12 +22,19 @@ struct peer {
int state;
};
+struct file {
+ size_t sz;
+ char path[PATH_MAX];
+};
+
struct torrent {
char id[21];
char ih[20];
char tr[PATH_MAX];
struct be be;
struct be info;
+ struct file *files;
+ long nfile;
long sz;
long dl;
long ul;
(DIR) diff --git a/torrent.c b/torrent.c
t@@ -38,6 +38,7 @@ readfile(char *f, char **b)
int
main(int argc, char *argv[])
{
+ int i;
long s;
char *b;
char hex[41];
t@@ -58,6 +59,9 @@ main(int argc, char *argv[])
printf("Peer ID: %s\n", t.id);
printf("Tracker: %s\n", t.tr);
printf("Length: %ld bytes\n", t.sz);
+ printf("Files:\n");
+ for (i=0; i<t.nfile; i++)
+ printf("\t%s\n", t.files[i].path);
return 0;
}