Browse Source

Add optional label to be associated with torrent.

If none given, use announce URL as label.
Torrents added with previous versions of btpd will show up as "bad torrent entry"

Closes GH-26
master
Marq Schneider 12 years ago
parent
commit
2fd1f7c34e
8 changed files with 49 additions and 16 deletions
  1. +10
    -2
      btpd/cli_if.c
  2. +9
    -3
      btpd/tlib.c
  3. +3
    -2
      btpd/tlib.h
  4. +13
    -4
      cli/add.c
  5. +8
    -2
      cli/list.c
  6. +3
    -1
      misc/btpd_if.c
  7. +1
    -1
      misc/btpd_if.h
  8. +2
    -1
      misc/ipcdefs.h

+ 10
- 2
btpd/cli_if.c View File

@@ -158,6 +158,12 @@ write_ans(struct iobuf *iob, struct tlib *tl, enum ipc_tval val)
iobuf_print(iob, "i%dei%de", IPC_TYPE_NUM, iobuf_print(iob, "i%dei%de", IPC_TYPE_NUM,
tl->tp == NULL ? 0 : tr_good_count(tl->tp)); tl->tp == NULL ? 0 : tr_good_count(tl->tp));
return; return;
case IPC_TVAL_LABEL:
if (tl->label != NULL)
iobuf_print(iob, "i%de%d:%s", IPC_TYPE_STR, (int)strlen(tl->label), tl->label);
else
iobuf_print(iob, "i%dei%de", IPC_TYPE_ERR, IPC_EBADTENT);
return;
case IPC_TVALCOUNT: case IPC_TVALCOUNT:
break; break;
} }
@@ -261,10 +267,12 @@ cmd_add(struct cli *cli, int argc, const char *args)
return write_code_buffer(cli, IPC_ETENTEXIST); return write_code_buffer(cli, IPC_ETENTEXIST);
if (tl != NULL) { if (tl != NULL) {
tl = tlib_readd(tl, hash, mi, mi_size, content, tl = tlib_readd(tl, hash, mi, mi_size, content,
benc_dget_str(args, "name", NULL));
benc_dget_str(args, "name", NULL),
benc_dget_str(args, "label", NULL));
} else { } else {
tl = tlib_add(hash, mi, mi_size, content, tl = tlib_add(hash, mi, mi_size, content,
benc_dget_str(args, "name", NULL));
benc_dget_str(args, "name", NULL),
benc_dget_str(args, "label", NULL));
} }
return write_add_buffer(cli, tl->num); return write_add_buffer(cli, tl->num);
} }


+ 9
- 3
btpd/tlib.c View File

@@ -51,6 +51,8 @@ tlib_kill(struct tlib *tl)
free(tl->name); free(tl->name);
if (tl->dir != NULL) if (tl->dir != NULL)
free(tl->dir); free(tl->dir);
if (tl->label != NULL)
free(tl->label);
free(tl); free(tl);
m_ntlibs--; m_ntlibs--;
} }
@@ -166,6 +168,7 @@ load_info(struct tlib *tl, const char *path)


info = benc_dget_dct(buf, "info"); info = benc_dget_dct(buf, "info");
tl->name = benc_dget_str(info, "name", NULL); tl->name = benc_dget_str(info, "name", NULL);
tl->label = benc_dget_str(info, "label", NULL);
tl->dir = benc_dget_str(info, "dir", NULL); tl->dir = benc_dget_str(info, "dir", NULL);
tl->tot_up = benc_dget_int(info, "total upload"); tl->tot_up = benc_dget_int(info, "total upload");
tl->tot_down = benc_dget_int(info, "total download"); tl->tot_down = benc_dget_int(info, "total download");
@@ -186,10 +189,12 @@ save_info(struct tlib *tl)
"d4:infod" "d4:infod"
"12:content havei%llde12:content sizei%llde" "12:content havei%llde12:content sizei%llde"
"3:dir%d:%s4:name%d:%s" "3:dir%d:%s4:name%d:%s"
"5:label%d:%s"
"14:total downloadi%llde12:total uploadi%llde" "14:total downloadi%llde12:total uploadi%llde"
"ee", "ee",
(long long)tl->content_have, (long long)tl->content_size, (long long)tl->content_have, (long long)tl->content_size,
(int)strlen(tl->dir), tl->dir, (int)strlen(tl->name), tl->name, (int)strlen(tl->dir), tl->dir, (int)strlen(tl->name), tl->name,
(int)strlen(tl->label), tl->label,
tl->tot_down, tl->tot_up); tl->tot_down, tl->tot_up);
if (iob.error) if (iob.error)
btpd_err("Out of memory.\n"); btpd_err("Out of memory.\n");
@@ -245,7 +250,7 @@ err:


struct tlib * struct tlib *
tlib_add(const uint8_t *hash, const char *mi, size_t mi_size, tlib_add(const uint8_t *hash, const char *mi, size_t mi_size,
const char *content, char *name)
const char *content, char *name, char *label)
{ {
struct tlib *tl = tlib_create(hash); struct tlib *tl = tlib_create(hash);
char relpath[RELPATH_SIZE], file[PATH_MAX]; char relpath[RELPATH_SIZE], file[PATH_MAX];
@@ -257,6 +262,7 @@ tlib_add(const uint8_t *hash, const char *mi, size_t mi_size,


tl->content_size = mi_total_length(mi); tl->content_size = mi_total_length(mi);
tl->name = name; tl->name = name;
tl->label = label;
tl->dir = strdup(content); tl->dir = strdup(content);
if (tl->name == NULL || tl->dir == NULL) if (tl->name == NULL || tl->dir == NULL)
btpd_err("out of memory.\n"); btpd_err("out of memory.\n");
@@ -272,13 +278,13 @@ tlib_add(const uint8_t *hash, const char *mi, size_t mi_size,


struct tlib * struct tlib *
tlib_readd(struct tlib *tl, const uint8_t *hash, const char *mi, tlib_readd(struct tlib *tl, const uint8_t *hash, const char *mi,
size_t mi_size, const char *content, char *name)
size_t mi_size, const char *content, char *name, char *label)
{ {
struct tlib *tln; struct tlib *tln;
struct torrent *tp = tl->tp; struct torrent *tp = tl->tp;
tp->delete = 0; tp->delete = 0;
tlib_kill(tl); tlib_kill(tl);
tln = tlib_add(hash, mi, mi_size, content, name);
tln = tlib_add(hash, mi, mi_size, content, name, label);
tln->tp = tp; tln->tp = tp;
return tln; return tln;
} }


+ 3
- 2
btpd/tlib.h View File

@@ -8,6 +8,7 @@ struct tlib {


char *name; char *name;
char *dir; char *dir;
char *label;


unsigned long long tot_up, tot_down; unsigned long long tot_up, tot_down;
off_t content_size, content_have; off_t content_size, content_have;
@@ -27,9 +28,9 @@ struct tlib *tlib_iter_first(struct htbl_iter *it);
struct tlib *tlib_iter_next(struct htbl_iter *it); struct tlib *tlib_iter_next(struct htbl_iter *it);


struct tlib *tlib_add(const uint8_t *hash, const char *mi, size_t mi_size, struct tlib *tlib_add(const uint8_t *hash, const char *mi, size_t mi_size,
const char *content, char *name);
const char *content, char *name, char *label);
struct tlib *tlib_readd(struct tlib *tl, const uint8_t *hash, const char *mi, struct tlib *tlib_readd(struct tlib *tl, const uint8_t *hash, const char *mi,
size_t mi_size, const char *content, char *name);
size_t mi_size, const char *content, char *name, char *label);
int tlib_del(struct tlib *tl); int tlib_del(struct tlib *tl);
void tlib_kill(struct tlib *tl); void tlib_kill(struct tlib *tl);




+ 13
- 4
cli/add.c View File

@@ -40,10 +40,10 @@ void
cmd_add(int argc, char **argv) cmd_add(int argc, char **argv)
{ {
int ch, topdir = 0, start = 1, nfile, nloaded = 0; int ch, topdir = 0, start = 1, nfile, nloaded = 0;
size_t dirlen = 0;
char *dir = NULL, *name = NULL;
size_t dirlen = 0, labellen = 0;
char *dir = NULL, *name = NULL, *glabel = NULL, *label;


while ((ch = getopt_long(argc, argv, "NTd:n:", add_opts, NULL)) != -1) {
while ((ch = getopt_long(argc, argv, "NTd:l:n:", add_opts, NULL)) != -1) {
switch (ch) { switch (ch) {
case 'N': case 'N':
start = 0; start = 0;
@@ -56,6 +56,11 @@ cmd_add(int argc, char **argv)
if ((dirlen = strlen(dir)) == 0) if ((dirlen = strlen(dir)) == 0)
diemsg("bad option value for -d.\n"); diemsg("bad option value for -d.\n");
break; break;
case 'l':
glabel = optarg;
if ((labellen = strlen(dir)) == 0)
diemsg("bad option value for -l.\n");
break;
case 'n': case 'n':
name = optarg; name = optarg;
break; break;
@@ -96,7 +101,11 @@ cmd_add(int argc, char **argv)
iobuf_free(&iob); iobuf_free(&iob);
continue; continue;
} }
code = btpd_add(ipc, mi, mi_size, dpath, name);
if(NULL == glabel)
label = benc_dget_str(mi, "announce", NULL);
else
label = glabel;
code = btpd_add(ipc, mi, mi_size, dpath, name, label);
if ((code == IPC_OK) && start) { if ((code == IPC_OK) && start) {
struct ipc_torrent tspec; struct ipc_torrent tspec;
tspec.by_hash = 1; tspec.by_hash = 1;


+ 8
- 2
cli/list.c View File

@@ -28,7 +28,7 @@ usage_list(void)


struct item { struct item {
unsigned num, peers; unsigned num, peers;
char *name, *dir;
char *name, *dir, *label;
char hash[SHAHEXSIZE]; char hash[SHAHEXSIZE];
char st; char st;
long long cgot, csize, totup, downloaded, uploaded, rate_up, rate_down; long long cgot, csize, totup, downloaded, uploaded, rate_up, rate_down;
@@ -79,6 +79,11 @@ list_cb(int obji, enum ipc_err objerr, struct ipc_get_res *res, void *arg)
else else
asprintf(&itm->dir, "%.*s", (int)res[IPC_TVAL_DIR].v.str.l, asprintf(&itm->dir, "%.*s", (int)res[IPC_TVAL_DIR].v.str.l,
res[IPC_TVAL_DIR].v.str.p); res[IPC_TVAL_DIR].v.str.p);
if (res[IPC_TVAL_LABEL].type == IPC_TYPE_ERR)
asprintf(&itm->label, "%s", ipc_strerror(res[IPC_TVAL_LABEL].v.num));
else
asprintf(&itm->label, "%.*s", (int)res[IPC_TVAL_LABEL].v.str.l,
res[IPC_TVAL_LABEL].v.str.p);
bin2hex(res[IPC_TVAL_IHASH].v.str.p, itm->hash, 20); bin2hex(res[IPC_TVAL_IHASH].v.str.p, itm->hash, 20);
itm->cgot = res[IPC_TVAL_CGOT].v.num; itm->cgot = res[IPC_TVAL_CGOT].v.num;
itm->csize = res[IPC_TVAL_CSIZE].v.num; itm->csize = res[IPC_TVAL_CSIZE].v.num;
@@ -121,6 +126,7 @@ print_items(struct items* itms, char *format)
case 'd': printf("%s", p->dir); break; case 'd': printf("%s", p->dir); break;
case 'g': printf("%lld", p->cgot); break; case 'g': printf("%lld", p->cgot); break;
case 'h': printf("%s", p->hash); break; case 'h': printf("%s", p->hash); break;
case 'l': printf("%s", p->label); break;
case 'n': printf("%s", p->name); break; case 'n': printf("%s", p->name); break;
case 'p': print_percent(p->cgot, p->csize); break; case 'p': print_percent(p->cgot, p->csize); break;
case 'r': print_ratio(p->totup, p->csize); break; case 'r': print_ratio(p->totup, p->csize); break;
@@ -170,7 +176,7 @@ cmd_list(int argc, char **argv)
IPC_TVAL_TOTUP, IPC_TVAL_CSIZE, IPC_TVAL_CGOT, IPC_TVAL_PCOUNT, IPC_TVAL_TOTUP, IPC_TVAL_CSIZE, IPC_TVAL_CGOT, IPC_TVAL_PCOUNT,
IPC_TVAL_PCCOUNT, IPC_TVAL_PCSEEN, IPC_TVAL_PCGOT, IPC_TVAL_SESSUP, IPC_TVAL_PCCOUNT, IPC_TVAL_PCSEEN, IPC_TVAL_PCGOT, IPC_TVAL_SESSUP,
IPC_TVAL_SESSDWN, IPC_TVAL_RATEUP, IPC_TVAL_RATEDWN, IPC_TVAL_IHASH, IPC_TVAL_SESSDWN, IPC_TVAL_RATEUP, IPC_TVAL_RATEDWN, IPC_TVAL_IHASH,
IPC_TVAL_DIR };
IPC_TVAL_DIR, IPC_TVAL_LABEL };
size_t nkeys = ARRAY_COUNT(keys); size_t nkeys = ARRAY_COUNT(keys);
struct items itms; struct items itms;
while ((ch = getopt_long(argc, argv, "aif:", list_opts, NULL)) != -1) { while ((ch = getopt_long(argc, argv, "aif:", list_opts, NULL)) != -1) {


+ 3
- 1
misc/btpd_if.c View File

@@ -264,13 +264,15 @@ btpd_tget_wc(struct ipc *ipc, enum ipc_twc twc, enum ipc_tval *keys,


enum ipc_err enum ipc_err
btpd_add(struct ipc *ipc, const char *mi, size_t mi_size, const char *content, btpd_add(struct ipc *ipc, const char *mi, size_t mi_size, const char *content,
const char *name)
const char *name, const char *label)
{ {
struct iobuf iob = iobuf_init(1 << 10); struct iobuf iob = iobuf_init(1 << 10);
iobuf_print(&iob, "l3:addd7:content%d:%s", (int)strlen(content), iobuf_print(&iob, "l3:addd7:content%d:%s", (int)strlen(content),
content); content);
if (name != NULL) if (name != NULL)
iobuf_print(&iob, "4:name%d:%s", (int)strlen(name), name); iobuf_print(&iob, "4:name%d:%s", (int)strlen(name), name);
if (label != NULL)
iobuf_print(&iob, "5:label%d:%s", (int)strlen(label), label);
iobuf_print(&iob, "7:torrent%lu:", (unsigned long)mi_size); iobuf_print(&iob, "7:torrent%lu:", (unsigned long)mi_size);
iobuf_write(&iob, mi, mi_size); iobuf_write(&iob, mi, mi_size);
iobuf_swrite(&iob, "ee"); iobuf_swrite(&iob, "ee");


+ 1
- 1
misc/btpd_if.h View File

@@ -75,7 +75,7 @@ void ipc_close(struct ipc *ipc);
const char *ipc_strerror(enum ipc_err err); const char *ipc_strerror(enum ipc_err err);


enum ipc_err btpd_add(struct ipc *ipc, const char *mi, size_t mi_size, enum ipc_err btpd_add(struct ipc *ipc, const char *mi, size_t mi_size,
const char *content, const char *name);
const char *content, const char *name, const char *label);
enum ipc_err btpd_del(struct ipc *ipc, struct ipc_torrent *tp); enum ipc_err btpd_del(struct ipc *ipc, struct ipc_torrent *tp);
enum ipc_err btpd_rate(struct ipc *ipc, unsigned up, unsigned down); enum ipc_err btpd_rate(struct ipc *ipc, unsigned up, unsigned down);
enum ipc_err btpd_start(struct ipc *ipc, struct ipc_torrent *tp); enum ipc_err btpd_start(struct ipc *ipc, struct ipc_torrent *tp);


+ 2
- 1
misc/ipcdefs.h View File

@@ -41,7 +41,8 @@ TVDEF(STATE, TSTATE, "state")
TVDEF(TOTDWN, NUM, "total_down") TVDEF(TOTDWN, NUM, "total_down")
TVDEF(TOTUP, NUM, "total_up") TVDEF(TOTUP, NUM, "total_up")
TVDEF(TRERR, NUM, "tr_errors") TVDEF(TRERR, NUM, "tr_errors")
TVDEF(TRGOOD, NUM, "tr_good")
TVDEF(TRGOOD, NUM, "tr_good")
TVDEF(LABEL, STR, "label")
#ifdef __IPCTV #ifdef __IPCTV
#undef __IPCTV #undef __IPCTV
#undef TVDEF #undef TVDEF


Loading…
Cancel
Save