From 8a88ad5deb609e8bb8c557bb512b9641a0cbbd9f Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Thu, 14 Oct 2010 17:15:18 +0200 Subject: [PATCH] Trying to get rel_path right --- bin/ad/ad_mv.c | 1 + bin/ad/ad_util.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/bin/ad/ad_mv.c b/bin/ad/ad_mv.c index b7c611d9..0c973d06 100644 --- a/bin/ad/ad_mv.c +++ b/bin/ad/ad_mv.c @@ -207,6 +207,7 @@ int ad_mv(int argc, char *argv[]) rval = do_move(argv[0], argv[1]); closevol(&svolume); closevol(&dvolume); + return 1; } /* It's a directory, move each file into it. */ diff --git a/bin/ad/ad_util.c b/bin/ad/ad_util.c index 24bee8ad..972c2484 100644 --- a/bin/ad/ad_util.c +++ b/bin/ad/ad_util.c @@ -202,14 +202,38 @@ static bstring rel_path_in_vol(const char *path, const char *volpath) int cwd = -1; bstring fpath = NULL; char *dname = NULL; + struct stat st; if (path == NULL || volpath == NULL) return NULL; EC_NEG1_LOG(cwd = open(".", O_RDONLY)); - EC_NULL_LOG(dname = strdup(path)); - EC_ZERO_LOGSTR(chdir(dirname(dname)), "chdir(%s): %s", dirname, strerror(errno)); - EC_NULL(fpath = bfromcstr(getcwdpath())); + + EC_ZERO_LOGSTR(stat(path, &st), "stat(%s): %s", path, strerror(errno)); + switch (S_IFMT & st.st_mode) { + + case S_IFREG: + EC_NULL_LOG(dname = strdup(path)); + EC_ZERO_LOGSTR(chdir(dirname(dname)), "chdir(%s): %s", dirname, strerror(errno)); + free(dname); + dname = NULL; + EC_NULL(fpath = bfromcstr(getcwdpath())); + BSTRING_STRIP_SLASH(fpath); + EC_ZERO(bcatcstr(fpath, "/")); + EC_NULL_LOG(dname = strdup(path)); + EC_ZERO(bcatcstr(fpath, basename(dname))); + break; + + case S_IFDIR: + EC_ZERO_LOGSTR(chdir(path), "chdir(%s): %s", path, strerror(errno)); + EC_NULL(fpath = bfromcstr(getcwdpath())); + break; + + default: + SLOG("special: %s", path); + EC_FAIL; + } + BSTRING_STRIP_SLASH(fpath); /* -- 2.39.2