|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #include "btcli.h"
-
- void
- usage_list(void)
- {
- printf(
- "List torrents.\n"
- "\n"
- "Usage: list [-a] [-i]\n"
- "\n"
- );
- exit(1);
- }
-
- struct item {
- unsigned num;
- char *name;
- char st;
- BTPDQ_ENTRY(item) entry;
- };
-
- struct items {
- int count;
- BTPDQ_HEAD(item_tq, item) hd;
- };
-
- void
- itm_insert(struct items *itms, struct item *itm)
- {
- struct item *p;
- BTPDQ_FOREACH(p, &itms->hd, entry)
- if (itm->num < p->num)
- #if 0
- if (strcmp(itm->name, p->name) < 0)
- #endif
- break;
- if (p != NULL)
- BTPDQ_INSERT_BEFORE(p, itm, entry);
- else
- BTPDQ_INSERT_TAIL(&itms->hd, itm, entry);
- }
-
- static void
- list_cb(int obji, enum ipc_err objerr, struct ipc_get_res *res, void *arg)
- {
- struct items *itms = arg;
- struct item *itm = calloc(1, sizeof(*itm));
- itms->count++;
- itm->num = (unsigned)res[IPC_TVAL_NUM].v.num;
- itm->st = tstate_char(res[IPC_TVAL_STATE].v.num);
- if (res[IPC_TVAL_NAME].type == IPC_TYPE_ERR)
- asprintf(&itm->name, "%s", ipc_strerror(res[IPC_TVAL_NAME].v.num));
- else
- asprintf(&itm->name, "%.*s", (int)res[IPC_TVAL_NAME].v.str.l,
- res[IPC_TVAL_NAME].v.str.p);
- itm_insert(itms, itm);
- #if 0
- int *count = arg;
- (*count)++;
- printf("%4u %c.", (unsigned)res[IPC_TVAL_NUM].v.num,
- tstate_char(res[IPC_TVAL_STATE].v.num));
- if (res[IPC_TVAL_NAME].type == IPC_TYPE_ERR)
- printf(" %s\n", ipc_strerror(res[IPC_TVAL_NAME].v.num));
- else
- printf(" %.*s\n", (int)res[IPC_TVAL_NAME].v.str.l,
- res[IPC_TVAL_NAME].v.str.p);
- #endif
- }
-
- void
- print_items(struct items* itms)
- {
- int n;
- struct item *p;
- BTPDQ_FOREACH(p, &itms->hd, entry) {
- n = printf("%u: ", p->num);
- while (n < 7) {
- putchar(' ');
- n++;
- }
- printf("%c. %s\n", p->st, p->name);
- }
- }
-
- static struct option list_opts [] = {
- { "help", no_argument, NULL, 'H' },
- {NULL, 0, NULL, 0}
- };
-
- void
- cmd_list(int argc, char **argv)
- {
- int ch, /*count = 0,*/ inactive = 0, active = 0;
- enum ipc_twc twc;
- enum ipc_tval keys[] = { IPC_TVAL_NUM, IPC_TVAL_STATE, IPC_TVAL_NAME };
- struct items itms;
- while ((ch = getopt_long(argc, argv, "ai", list_opts, NULL)) != -1) {
- switch (ch) {
- case 'a':
- active = 1;
- break;
- case 'i':
- inactive = 1;
- break;
- default:
- usage_list();
- }
- }
-
- if (inactive == active)
- twc = IPC_TWC_ALL;
- else if (inactive)
- twc = IPC_TWC_INACTIVE;
- else
- twc = IPC_TWC_ACTIVE;
-
- btpd_connect();
- printf("NUM ST NAME\n");
- itms.count = 0;
- BTPDQ_INIT(&itms.hd);
- handle_ipc_res(btpd_tget_wc(ipc, twc, keys, 3, list_cb, &itms), "tget");
- print_items(&itms);
- printf("Listed %d torrent%s.\n", itms.count, itms.count == 1 ? "" : "s");
- }
|