If none given, use announce URL as label. Torrents added with previous versions of btpd will show up as "bad torrent entry" Closes GH-26master
@@ -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); | ||||
} | } | ||||
@@ -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; | ||||
} | } | ||||
@@ -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); | ||||
@@ -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; | ||||
@@ -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) { | ||||
@@ -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"); | ||||
@@ -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); | ||||
@@ -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 | ||||