summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--btpd/cli_if.c14
-rw-r--r--cli/stop.c39
-rw-r--r--misc/btpd_if.c8
-rw-r--r--misc/btpd_if.h1
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
@@ -357,6 +357,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)
 {
     int err = write_code_buffer(cli, IPC_OK);
@@ -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);