diff --git a/btpd/cli_if.c b/btpd/cli_if.c index 8be8320..1ae894a 100644 --- a/btpd/cli_if.c +++ b/btpd/cli_if.c @@ -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, tl->tp == NULL ? 0 : tr_good_count(tl->tp)); 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: break; } @@ -261,10 +267,12 @@ cmd_add(struct cli *cli, int argc, const char *args) return write_code_buffer(cli, IPC_ETENTEXIST); if (tl != NULL) { 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 { 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); } diff --git a/btpd/tlib.c b/btpd/tlib.c index 8909c1a..5e3dfb1 100644 --- a/btpd/tlib.c +++ b/btpd/tlib.c @@ -51,6 +51,8 @@ tlib_kill(struct tlib *tl) free(tl->name); if (tl->dir != NULL) free(tl->dir); + if (tl->label != NULL) + free(tl->label); free(tl); m_ntlibs--; } @@ -166,6 +168,7 @@ load_info(struct tlib *tl, const char *path) info = benc_dget_dct(buf, "info"); 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->tot_up = benc_dget_int(info, "total upload"); tl->tot_down = benc_dget_int(info, "total download"); @@ -186,10 +189,12 @@ save_info(struct tlib *tl) "d4:infod" "12:content havei%llde12:content sizei%llde" "3:dir%d:%s4:name%d:%s" + "5:label%d:%s" "14:total downloadi%llde12:total uploadi%llde" "ee", (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->label), tl->label, tl->tot_down, tl->tot_up); if (iob.error) btpd_err("Out of memory.\n"); @@ -245,7 +250,7 @@ err: 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 *tl = tlib_create(hash); 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->name = name; + tl->label = label; tl->dir = strdup(content); if (tl->name == NULL || tl->dir == NULL) 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 * 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 torrent *tp = tl->tp; tp->delete = 0; 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; return tln; } diff --git a/btpd/tlib.h b/btpd/tlib.h index c0b3aca..b55a7b1 100644 --- a/btpd/tlib.h +++ b/btpd/tlib.h @@ -8,6 +8,7 @@ struct tlib { char *name; char *dir; + char *label; unsigned long long tot_up, tot_down; 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_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, - 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); void tlib_kill(struct tlib *tl); diff --git a/cli/add.c b/cli/add.c index 53b4ac2..83af7df 100644 --- a/cli/add.c +++ b/cli/add.c @@ -40,10 +40,10 @@ void cmd_add(int argc, char **argv) { 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) { case 'N': start = 0; @@ -56,6 +56,11 @@ cmd_add(int argc, char **argv) if ((dirlen = strlen(dir)) == 0) diemsg("bad option value for -d.\n"); break; + case 'l': + glabel = optarg; + if ((labellen = strlen(dir)) == 0) + diemsg("bad option value for -l.\n"); + break; case 'n': name = optarg; break; @@ -96,7 +101,11 @@ cmd_add(int argc, char **argv) iobuf_free(&iob); 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) { struct ipc_torrent tspec; tspec.by_hash = 1; diff --git a/cli/list.c b/cli/list.c index f8659f3..bc4edf0 100644 --- a/cli/list.c +++ b/cli/list.c @@ -28,7 +28,7 @@ usage_list(void) struct item { unsigned num, peers; - char *name, *dir; + char *name, *dir, *label; char hash[SHAHEXSIZE]; char st; 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 asprintf(&itm->dir, "%.*s", (int)res[IPC_TVAL_DIR].v.str.l, 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); itm->cgot = res[IPC_TVAL_CGOT].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 'g': printf("%lld", p->cgot); break; case 'h': printf("%s", p->hash); break; + case 'l': printf("%s", p->label); break; case 'n': printf("%s", p->name); break; case 'p': print_percent(p->cgot, 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_PCCOUNT, IPC_TVAL_PCSEEN, IPC_TVAL_PCGOT, IPC_TVAL_SESSUP, 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); struct items itms; while ((ch = getopt_long(argc, argv, "aif:", list_opts, NULL)) != -1) { diff --git a/misc/btpd_if.c b/misc/btpd_if.c index e208d64..3c32b9c 100644 --- a/misc/btpd_if.c +++ b/misc/btpd_if.c @@ -264,13 +264,15 @@ btpd_tget_wc(struct ipc *ipc, enum ipc_twc twc, enum ipc_tval *keys, enum ipc_err 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); iobuf_print(&iob, "l3:addd7:content%d:%s", (int)strlen(content), content); if (name != NULL) 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_write(&iob, mi, mi_size); iobuf_swrite(&iob, "ee"); diff --git a/misc/btpd_if.h b/misc/btpd_if.h index 66b247a..070cb29 100644 --- a/misc/btpd_if.h +++ b/misc/btpd_if.h @@ -75,7 +75,7 @@ void ipc_close(struct ipc *ipc); const char *ipc_strerror(enum ipc_err err); 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_rate(struct ipc *ipc, unsigned up, unsigned down); enum ipc_err btpd_start(struct ipc *ipc, struct ipc_torrent *tp); diff --git a/misc/ipcdefs.h b/misc/ipcdefs.h index fa06949..573c007 100644 --- a/misc/ipcdefs.h +++ b/misc/ipcdefs.h @@ -41,7 +41,8 @@ TVDEF(STATE, TSTATE, "state") TVDEF(TOTDWN, NUM, "total_down") TVDEF(TOTUP, NUM, "total_up") TVDEF(TRERR, NUM, "tr_errors") -TVDEF(TRGOOD, NUM, "tr_good") +TVDEF(TRGOOD, NUM, "tr_good") +TVDEF(LABEL, STR, "label") #ifdef __IPCTV #undef __IPCTV #undef TVDEF