Quellcode durchsuchen

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 vor 14 Jahren
Ursprung
Commit
79641da4f2
1 geänderte Dateien mit 41 neuen und 28 gelöschten Zeilen
  1. +41
    -28
      cli/add.c

+ 41
- 28
cli/add.c Datei anzeigen

@@ -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;
}

Laden…
Abbrechen
Speichern