From eef8a3a83778fd89e5d6ab5067bd015653eebb6b Mon Sep 17 00:00:00 2001 From: Richard Nyberg Date: Fri, 10 Feb 2006 20:45:22 +0000 Subject: [PATCH] Call realpath after creating the dir. At least on linux the call to realpath may fail if the last path component doesn't exist. --- cli/btcli.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/cli/btcli.c b/cli/btcli.c index 306df1c..bd66201 100644 --- a/cli/btcli.c +++ b/cli/btcli.c @@ -131,7 +131,7 @@ void cmd_add(int argc, char **argv) { int ch, topdir = 0; - char *dir = NULL, bdir[PATH_MAX]; + char *dir = NULL; while ((ch = getopt_long(argc, argv, "d:", add_opts, NULL)) != -1) { switch (ch) { @@ -151,14 +151,10 @@ cmd_add(int argc, char **argv) if (argc < 1 || (topdir == 1 && dir == NULL) || (dir != NULL && argc > 1)) usage_add(); - if (dir != NULL) - if (realpath(dir, bdir) == NULL) - err(1, "path error on %s", bdir); - btpd_connect(); for (int i = 0; i < argc; i++) { struct metainfo *mi; - char dpath[PATH_MAX], fpath[PATH_MAX]; + char rdpath[PATH_MAX], dpath[PATH_MAX], fpath[PATH_MAX]; if ((errno = load_metainfo(argv[i], -1, 0, &mi)) != 0) { warn("error loading torrent %s", argv[i]); @@ -168,9 +164,9 @@ cmd_add(int argc, char **argv) if ((topdir && !(mi->nfiles == 1 && strcmp(mi->name, mi->files[0].path) == 0))) - snprintf(dpath, PATH_MAX, "%s/%s", bdir, mi->name); + snprintf(dpath, PATH_MAX, "%s/%s", dir, mi->name); else if (dir != NULL) - strncpy(dpath, bdir, PATH_MAX); + strncpy(dpath, dir, PATH_MAX); else { if (content_link(mi->info_hash, dpath) != 0) { warnx("unknown content dir for %s", argv[i]); @@ -181,10 +177,13 @@ cmd_add(int argc, char **argv) if (mkdir(dpath, 0777) != 0 && errno != EEXIST) err(1, "couldn't create directory %s", dpath); + if (realpath(dpath, rdpath) == NULL) + err(1, "path error on %s", dpath); + if (realpath(argv[i], fpath) == NULL) err(1, "path error on %s", fpath); - handle_ipc_res(btpd_add(ipc, mi->info_hash, fpath, dpath), argv[i]); + handle_ipc_res(btpd_add(ipc, mi->info_hash, fpath, rdpath), argv[i]); clear_metainfo(mi); free(mi); }