sbin/hammer - Remove trailing '/' from paths.
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 4 Mar 2014 23:24:38 +0000 (00:24 +0100)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Tue, 4 Mar 2014 23:40:54 +0000 (00:40 +0100)
  When operating PFSes through symbolic links, it was not
  possible to specify the trailing backslash since that
  translated to the PFS root dir instead of the symbolic link
  to the PFS itself. This caused problems when upgrading or
  downgrading PFSes (and probably in other cases too).
  The error was "Directory not empty".

  This commit should solve those cases, but keep in mind
  there are other cases where it is actually not possible
  to complete certain operations (like while destroying
  PFSes).

Reported-by: Siju George, others
sbin/hammer/cmd_mirror.c
sbin/hammer/cmd_pseudofs.c
sbin/hammer/hammer.h

index a3039be..4ccbb1d 100644 (file)
@@ -87,7 +87,7 @@ hammer_cmd_mirror_read(char **av, int ac, int streaming)
        hammer_ioc_mrecord_any_t mrec;
        hammer_tid_t sync_tid;
        histogram_t histogram_ary;
-       const char *filesystem;
+       char *filesystem;
        char *buf = malloc(SERIALBUF_SIZE);
        int interrupted = 0;
        int error;
@@ -757,7 +757,7 @@ void
 hammer_cmd_mirror_write(char **av, int ac)
 {
        struct hammer_ioc_mirror_rw mirror;
-       const char *filesystem;
+       char *filesystem;
        char *buf = malloc(SERIALBUF_SIZE);
        struct hammer_ioc_pseudofs_rw pfs;
        struct hammer_ioc_mrecord_head pickup;
index 030f6c4..7efc5e5 100644 (file)
@@ -48,12 +48,13 @@ static int timetosecs(char *str);
  * softlink.
  */
 int
-getpfs(struct hammer_ioc_pseudofs_rw *pfs, const char *path)
+getpfs(struct hammer_ioc_pseudofs_rw *pfs, char *path)
 {
        uintmax_t dummy_tid;
        struct stat st;
        char *dirpath;
        char buf[64];
+       size_t len;
        int fd;
        int n;
 
@@ -62,6 +63,16 @@ getpfs(struct hammer_ioc_pseudofs_rw *pfs, const char *path)
        bzero(pfs->ondisk, sizeof(*pfs->ondisk));
        pfs->bytes = sizeof(*pfs->ondisk);
 
+       /*
+        * Remove the trailing '/' if there is one so that
+        * in the case path is a symbolic link to the PFS,
+        * the symbolic link is used and not the root dir of
+        * the PFS
+        */
+       len = strnlen(path, MAXPATHLEN);
+       if (path[len-1] == '/' && path[len] == '\0')
+               path[len-1] = '\0';
+
        /*
         * Calculate the directory containing the softlink
         */
index 2a52f12..946554f 100644 (file)
@@ -137,7 +137,7 @@ void hammer_get_cycle(hammer_base_elm_t base, hammer_tid_t *tidp);
 void hammer_set_cycle(hammer_base_elm_t base, hammer_tid_t tid);
 void hammer_reset_cycle(void);
 
-int getpfs(struct hammer_ioc_pseudofs_rw *pfs, const char *path);
+int getpfs(struct hammer_ioc_pseudofs_rw *pfs, char *path);
 void relpfs(int fd, struct hammer_ioc_pseudofs_rw *pfs);
 void hammer_check_restrict(const char *path);
 void hammer_softprune_scandir(struct softprune **basep,