Selaa lähdekoodia

Add multiple torrents at once.

Modified patch from savrus and nicm.
Allows adding multiple torrents from one 'btcli add' command.
Also made minor improvements to add code.

Closes GH-9
master
Marq Schneider 14 vuotta sitten
vanhempi
commit
79641da4f2
1 muutettua tiedostoa jossa 41 lisäystä ja 28 poistoa
  1. +41
    -28
      cli/add.c

+ 41
- 28
cli/add.c Näytä tiedosto

@@ -6,7 +6,7 @@ usage_add(void)
printf(
"Add torrents to btpd.\n"
"\n"
"Usage: add [--topdir] -d dir file\n"
"Usage: add [-n name] [-T] [-N] -d dir file(s)\n"
"\n"
"Arguments:\n"
"file\n"
@@ -22,7 +22,7 @@ usage_add(void)
"--nostart, -N\n"
"\tDon't activate the torrent after adding it.\n"
"\n"
"--topdir\n"
"--topdir, -T\n"
"\tAppend the torrent top directory (if any) to the content path.\n"
"\n"
);
@@ -39,11 +39,11 @@ static struct option add_opts [] = {
void
cmd_add(int argc, char **argv)
{
int ch, topdir = 0, start = 1;
int ch, topdir = 0, start = 1, nfile, nloaded = 0;
size_t dirlen = 0;
char *dir = NULL, *name = NULL;

while ((ch = getopt_long(argc, argv, "Nd:n:", add_opts, NULL)) != -1) {
while ((ch = getopt_long(argc, argv, "NTd:n:", add_opts, NULL)) != -1) {
switch (ch) {
case 'N':
start = 0;
@@ -66,7 +66,7 @@ cmd_add(int argc, char **argv)
argc -= optind;
argv += optind;

if (argc != 1 || dir == NULL)
if (argc < 1 || dir == NULL)
usage_add();

btpd_connect();
@@ -76,29 +76,42 @@ cmd_add(int argc, char **argv)
char dpath[PATH_MAX];
struct iobuf iob;

if ((mi = mi_load(argv[0], &mi_size)) == NULL)
diemsg("error loading '%s' (%s).\n", argv[0], strerror(errno));

iob = iobuf_init(PATH_MAX);
iobuf_write(&iob, dir, dirlen);
if (topdir && !mi_simple(mi)) {
size_t tdlen;
const char *td =
benc_dget_mem(benc_dget_dct(mi, "info"), "name", &tdlen);
iobuf_swrite(&iob, "/");
iobuf_write(&iob, td, tdlen);
for (nfile = 0; nfile < argc; nfile++) {
if ((mi = mi_load(argv[nfile], &mi_size)) == NULL) {
fprintf(stderr, "error loading '%s' (%s).\n", argv[nfile], strerror(errno));
continue;
}
iob = iobuf_init(PATH_MAX);
iobuf_write(&iob, dir, dirlen);
if (topdir && !mi_simple(mi)) {
size_t tdlen;
const char *td =
benc_dget_mem(benc_dget_dct(mi, "info"), "name", &tdlen);
iobuf_swrite(&iob, "/");
iobuf_write(&iob, td, tdlen);
}
iobuf_swrite(&iob, "\0");
if ((errno = make_abs_path(iob.buf, dpath)) != 0) {
fprintf(stderr, "make_abs_path '%s' failed (%s).\n", dpath, strerror(errno));
iobuf_free(&iob);
continue;
}
code = btpd_add(ipc, mi, mi_size, dpath, name);
if ((code == IPC_OK) && start) {
struct ipc_torrent tspec;
tspec.by_hash = 1;
mi_info_hash(mi, tspec.u.hash);
code = btpd_start(ipc, &tspec);
}
if (code != IPC_OK) {
fprintf(stderr, "command failed for '%s' (%s).\n", argv[nfile], ipc_strerror(code));
} else {
nloaded++;
}
iobuf_free(&iob);
}
iobuf_swrite(&iob, "\0");
if ((errno = make_abs_path(iob.buf, dpath)) != 0)
diemsg("make_abs_path '%s' failed (%s).\n", dpath, strerror(errno));
code = btpd_add(ipc, mi, mi_size, dpath, name);
if (code == 0 && start) {
struct ipc_torrent tspec;
tspec.by_hash = 1;
mi_info_hash(mi, tspec.u.hash);
code = btpd_start(ipc, &tspec);

if (nloaded != nfile) {
diemsg("error loaded %d of %d files.\n", nloaded, nfile);
}
if (code != IPC_OK)
diemsg("command failed (%s).\n", ipc_strerror(code));
return;
}

Loading…
Peruuta
Tallenna