From ba9ae40fe714e7a4afa382aca08ee16336a8c50d Mon Sep 17 00:00:00 2001 From: Richard Nyberg Date: Fri, 6 Oct 2006 15:02:35 +0000 Subject: [PATCH] Add command to stop all active torrents. The command is sent by 'btcli stop -a'. --- btpd/cli_if.c | 14 ++++++++++++++ cli/stop.c | 39 ++++++++++++++++++++++++++++++++++----- misc/btpd_if.c | 8 ++++++++ misc/btpd_if.h | 1 + 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/btpd/cli_if.c b/btpd/cli_if.c index ef82d07..b7ec364 100644 --- a/btpd/cli_if.c +++ b/btpd/cli_if.c @@ -356,6 +356,19 @@ cmd_stop(struct cli *cli, int argc, const char *args) } } +static int +cmd_stop_all(struct cli *cli, int argc, const char *args) +{ + struct torrent *tp; + int ret = write_code_buffer(cli, IPC_OK); + active_clear(); + BTPDQ_FOREACH(tp, torrent_get_all(), entry) + if (tp->state != T_STOPPING) { + torrent_stop(tp); + } + return ret; +} + static int cmd_die(struct cli *cli, int argc, const char *args) { @@ -380,6 +393,7 @@ static struct { { "die", 3, cmd_die }, { "start", 5, cmd_start }, { "stop", 4, cmd_stop }, + { "stop-all", 8, cmd_stop_all}, { "tget", 4, cmd_tget } }; diff --git a/cli/stop.c b/cli/stop.c index 4d8258d..2377980 100644 --- a/cli/stop.c +++ b/cli/stop.c @@ -6,22 +6,51 @@ usage_stop(void) printf( "Stop torrents.\n" "\n" - "Usage: stop torrent ...\n" + "Usage: stop -a\n" + " stop torrent ...\n" + "\n" + "Options:\n" + "-a\n" + "\tStop all active torrents.\n" "\n" ); exit(1); } +static struct option stop_opts [] = { + { "help", no_argument, NULL, 'H' }, + {NULL, 0, NULL, 0} +}; + void cmd_stop(int argc, char **argv) { + int ch, all = 0; struct ipc_torrent t; - if (argc < 2) + while ((ch = getopt_long(argc, argv, "a", stop_opts, NULL)) != -1) { + switch (ch) { + case 'a': + all = 1; + break; + default: + usage_stop(); + } + } + argc -= optind; + argv += optind; + + if ((argc == 0 && !all) || (all && argc != 0)) usage_stop(); btpd_connect(); - for (int i = 1; i < argc; i++) - if (torrent_spec(argv[i], &t)) - handle_ipc_res(btpd_stop(ipc, &t), "stop", argv[i]); + if (all) { + enum ipc_err code = btpd_stop_all(ipc); + if (code != IPC_OK) + errx(1, "%s", ipc_strerror(code)); + } else { + for (int i = 0; i < argc; i++) + if (torrent_spec(argv[i], &t)) + handle_ipc_res(btpd_stop(ipc, &t), "stop", argv[i]); + } } diff --git a/misc/btpd_if.c b/misc/btpd_if.c index 13b216c..6705963 100644 --- a/misc/btpd_if.c +++ b/misc/btpd_if.c @@ -311,3 +311,11 @@ btpd_stop(struct ipc *ipc, struct ipc_torrent *tp) { return simple_treq(ipc, "stop", tp); } + +enum ipc_err +btpd_stop_all(struct ipc *ipc) +{ + struct io_buffer iob = buf_init(16); + buf_swrite(&iob, "l8:stop-alle"); + return ipc_buf_req_code(ipc, &iob); +} diff --git a/misc/btpd_if.h b/misc/btpd_if.h index ed0d9ba..0879bd4 100644 --- a/misc/btpd_if.h +++ b/misc/btpd_if.h @@ -79,6 +79,7 @@ enum ipc_err btpd_add(struct ipc *ipc, const char *mi, size_t mi_size, enum ipc_err btpd_del(struct ipc *ipc, struct ipc_torrent *tp); enum ipc_err btpd_start(struct ipc *ipc, struct ipc_torrent *tp); enum ipc_err btpd_stop(struct ipc *ipc, struct ipc_torrent *tp); +enum ipc_err btpd_stop_all(struct ipc *ipc); enum ipc_err btpd_die(struct ipc *ipc, int seconds); enum ipc_err btpd_get(struct ipc *ipc, enum ipc_dval *keys, size_t nkeys, tget_cb_t cb, void *arg);