about summary refs log tree commit diff
path: root/cli/add.c
diff options
context:
space:
mode:
Diffstat (limited to 'cli/add.c')
-rw-r--r--cli/add.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/cli/add.c b/cli/add.c
new file mode 100644
index 0000000..34edb1c
--- /dev/null
+++ b/cli/add.c
@@ -0,0 +1,87 @@
+#include "btcli.h"
+
+void
+usage_add(void)
+{
+    printf(
+        "Add torrents to btpd.\n"
+        "\n"
+        "Usage: add [--topdir] -d dir file\n"
+        "       add file ...\n"
+        "\n"
+        "Arguments:\n"
+        "file ...\n"
+        "\tOne or more torrents to add.\n"
+        "\n"
+        "Options:\n"
+        "-d dir\n"
+        "\tUse the dir for content.\n"
+        "\n"
+        "--topdir\n"
+        "\tAppend the torrent top directory (if any) to the content path.\n"
+        "\tThis option cannot be used without the '-d' option.\n"
+        "\n"
+        );
+    exit(1);
+}
+
+static struct option add_opts [] = {
+    { "help", no_argument, NULL, 'H' },
+    { "topdir", no_argument, NULL, 'T'},
+    {NULL, 0, NULL, 0}
+};
+
+void
+cmd_add(int argc, char **argv)
+{
+    int ch, topdir = 0;
+    size_t dirlen = 0;
+    char *dir = NULL, *name = NULL;
+
+    while ((ch = getopt_long(argc, argv, "d:n:", add_opts, NULL)) != -1) {
+        switch (ch) {
+        case 'T':
+            topdir = 1;
+            break;
+        case 'd':
+            dir = optarg;
+            if ((dirlen = strlen(dir)) == 0)
+                errx(1, "bad option value for -d");
+            break;
+        case 'n':
+            name = optarg;
+            break;
+        default:
+            usage_add();
+        }
+    }
+    argc -= optind;
+    argv += optind;
+
+    if (argc != 1 || dir == NULL)
+        usage_add();
+
+    btpd_connect();
+    char *mi;
+    size_t mi_size;
+    char dpath[PATH_MAX];
+    struct io_buffer iob;
+
+    if ((mi = mi_load(argv[0], &mi_size)) == NULL)
+        err(1, "error loading '%s'", argv[0]);
+
+    buf_init(&iob, PATH_MAX);
+    buf_write(&iob, dir, dirlen);
+    if (topdir) {
+        size_t tdlen;
+        const char *td =
+            benc_dget_mem(benc_dget_dct(mi, "info"), "name", &tdlen);
+        buf_swrite(&iob, "/");
+        buf_write(&iob, td, tdlen);
+    }
+    buf_swrite(&iob, "");
+    if (realpath(iob.buf, dpath) == NULL)
+        err(1, "realpath '%s'", dpath);
+    handle_ipc_res(btpd_add(ipc, mi, mi_size, dpath, name), argv[0]);
+    return;
+}