Fixed a problem with --fake-super not getting the fully tweaked new_mode
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 98b94e0..7434193 100644 (file)
--- a/util.c
+++ b/util.c
@@ -152,7 +152,7 @@ int set_modtime(const char *fname, time_t modtime, mode_t mode)
                }
 # endif
                return utimes(fname, t);
-#elif defined HAVE_UTIMBUF
+#elif defined HAVE_STRUCT_UTIMBUF
                struct utimbuf tbuf;
                tbuf.actime = time(NULL);
                tbuf.modtime = modtime;
@@ -274,20 +274,20 @@ int copy_file(const char *source, const char *dest, int ofd,
        int len;   /* Number of bytes read into `buf'. */
 
        if ((ifd = do_open(source, O_RDONLY, 0)) < 0) {
-               rsyserr(FERROR, errno, "open %s", full_fname(source));
+               rsyserr(FERROR_XFER, errno, "open %s", full_fname(source));
                return -1;
        }
 
        if (ofd < 0) {
                if (robust_unlink(dest) && errno != ENOENT) {
-                       rsyserr(FERROR, errno, "unlink %s", full_fname(dest));
+                       rsyserr(FERROR_XFER, errno, "unlink %s", full_fname(dest));
                        return -1;
                }
 
                if ((ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode)) < 0
                 && (!create_bak_dir || errno != ENOENT || make_bak_dir(dest) < 0
                  || (ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode)) < 0)) {
-                       rsyserr(FERROR, errno, "open %s", full_fname(dest));
+                       rsyserr(FERROR_XFER, errno, "open %s", full_fname(dest));
                        close(ifd);
                        return -1;
                }
@@ -295,7 +295,7 @@ int copy_file(const char *source, const char *dest, int ofd,
 
        while ((len = safe_read(ifd, buf, sizeof buf)) > 0) {
                if (full_write(ofd, buf, len) < 0) {
-                       rsyserr(FERROR, errno, "write %s", full_fname(dest));
+                       rsyserr(FERROR_XFER, errno, "write %s", full_fname(dest));
                        close(ifd);
                        close(ofd);
                        return -1;
@@ -303,19 +303,19 @@ int copy_file(const char *source, const char *dest, int ofd,
        }
 
        if (len < 0) {
-               rsyserr(FERROR, errno, "read %s", full_fname(source));
+               rsyserr(FERROR_XFER, errno, "read %s", full_fname(source));
                close(ifd);
                close(ofd);
                return -1;
        }
 
        if (close(ifd) < 0) {
-               rsyserr(FINFO, errno, "close failed on %s",
+               rsyserr(FWARNING, errno, "close failed on %s",
                        full_fname(source));
        }
 
        if (close(ofd) < 0) {
-               rsyserr(FERROR, errno, "close failed on %s",
+               rsyserr(FERROR_XFER, errno, "close failed on %s",
                        full_fname(dest));
                return -1;
        }
@@ -371,7 +371,7 @@ int robust_unlink(const char *fname)
        } while ((rc = access(path, 0)) == 0 && counter != start);
 
        if (verbose > 0) {
-               rprintf(FINFO,"renaming %s to %s because of text busy\n",
+               rprintf(FWARNING, "renaming %s to %s because of text busy\n",
                        fname, path);
        }
 
@@ -549,7 +549,7 @@ void glob_expand(char *s, char ***argv_ptr, int *argc_ptr, int *maxargs_ptr)
                s = ".";
 
        if (sanitize_paths)
-               s = sanitize_path(NULL, s, "", 0, NULL);
+               s = sanitize_path(NULL, s, "", 0);
        else
                s = strdup(s);
        if (!s)
@@ -766,8 +766,7 @@ unsigned int clean_fname(char *name, int flags)
  * Specify NULL to get the default of "module_dir".
  *
  * The depth var is a count of how many '..'s to allow at the start of the
- * path.  If symlink is set, combine its value with the "p" value to get
- * the target path, and **return NULL if any '..'s try to escape**.
+ * path.
  *
  * We also clean the path in a manner similar to clean_fname() but with a
  * few differences:
@@ -777,17 +776,11 @@ unsigned int clean_fname(char *name, int flags)
  * ALWAYS collapses ".." elements (except for those at the start of the
  * string up to "depth" deep).  If the resulting name would be empty,
  * change it into a ".". */
-char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth,
-                   const char *symlink)
+char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth)
 {
-       char *start, *sanp, *save_dest = dest;
+       char *start, *sanp;
        int rlen = 0, leave_one_dotdir = relative_paths;
 
-       if (symlink && *symlink == '/') {
-               p = symlink;
-               symlink = "";
-       }
-
        if (dest != p) {
                int plen = strlen(p);
                if (*p == '/') {
@@ -810,18 +803,7 @@ char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth,
        }
 
        start = sanp = dest + rlen;
-       while (1) {
-               if (*p == '\0') {
-                       if (!symlink || !*symlink)
-                               break;
-                       while (sanp != start && sanp[-1] != '/') {
-                               /* strip last element */
-                               sanp--;
-                       }
-                       /* Append a relative symlink */
-                       p = symlink;
-                       symlink = "";
-               }
+       while (*p) {
                /* discard leading or extra slashes */
                if (*p == '/') {
                        p++;
@@ -843,11 +825,6 @@ char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth,
                if (*p == '.' && p[1] == '.' && (p[2] == '/' || p[2] == '\0')) {
                        /* ".." component followed by slash or end */
                        if (depth <= 0 || sanp != start) {
-                               if (symlink && sanp == start) {
-                                       if (!save_dest)
-                                               free(dest);
-                                       return NULL;
-                               }
                                p += 2;
                                if (sanp != start) {
                                        /* back up sanp one level */