Added RERR_VANISHED.
[rsync/rsync.git] / backup.c
index 990b0d8..c45b3df 100644 (file)
--- a/backup.c
+++ b/backup.c
 #include "rsync.h"
 
 extern int verbose;
-extern int suffix_specified;
+extern int backup_suffix_len;
+extern int backup_dir_len;
 extern char *backup_suffix;
 extern char *backup_dir;
 
-
 extern int am_root;
 extern int preserve_devices;
 extern int preserve_links;
@@ -35,7 +35,7 @@ extern int preserve_hard_links;
 static int make_simple_backup(char *fname)
 {
        char fnamebak[MAXPATHLEN];
-       if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
+       if (strlen(fname) + backup_suffix_len > MAXPATHLEN-1) {
                rprintf(FERROR, "backup filename too long\n");
                return 0;
        }
@@ -108,15 +108,18 @@ static int make_bak_dir(char *fname, char *bak_path)
                        do_mkdir(fullpath, 0777 & ~orig_umask);
                        if(p>q) {
                                if(do_lstat(q, &st) != 0) {
-                                       rprintf(FERROR, "make_bak_dir stat %s : %s\n", fullpath, strerror(errno));
+                                       rprintf(FERROR, "make_bak_dir stat %s failed: %s\n",
+                                               full_fname(fullpath), strerror(errno));
                                } else {
                                        st2 = &st;
                                        set_modtime(fullpath, st2->st_mtime);
                                        if(do_lchown(fullpath, st2->st_uid, st2->st_gid) != 0) {
-                                               rprintf(FERROR, "make_bak_dir chown %s : %s\n", fullpath, strerror(errno));
+                                               rprintf(FERROR, "make_bak_dir chown %s failed: %s\n",
+                                                       full_fname(fullpath), strerror(errno));
                                        }
                                        if(do_chmod(fullpath, st2->st_mode) != 0) {
-                                               rprintf(FERROR, "make_bak_dir failed to set permissions on %s : %s\n", fullpath, strerror(errno));
+                                               rprintf(FERROR, "make_bak_dir failed to set permissions on %s: %s\n",
+                                                       full_fname(fullpath), strerror(errno));
                                        }
                                }
                        }
@@ -156,7 +159,7 @@ static int robust_move(char *src, char *dst)
                                        break;
                                /* no directory to write to */
                                case ENOENT:
-                                       make_dir (dst, 0755);
+                                       make_dir(dst, 0700);
                                        keep_trying--;
                                        break;
                                default:
@@ -184,8 +187,8 @@ static int keep_backup(char *fname)
        int ret_code;
 
        if (!initialised) {
-               if (backup_dir[strlen(backup_dir) - 1] == '/')
-                       backup_dir[strlen(backup_dir) - 1] = 0;
+               if (backup_dir_len && backup_dir[backup_dir_len - 1] == '/')
+                       backup_dir[--backup_dir_len] = '\0';
                if (verbose > 0)
                        rprintf (FINFO, "backup_dir is %s\n", backup_dir);
                initialised = 1;
@@ -204,20 +207,13 @@ static int keep_backup(char *fname)
        if (!file) return 1;
 
        /* make a complete pathname for backup file */
-       if (strlen(backup_dir) + strlen(fname) +
-               (suffix_specified ? strlen(backup_suffix) : 0) > (MAXPATHLEN - 1)) {
+       if (backup_dir_len+strlen(fname)+backup_suffix_len > MAXPATHLEN-1) {
                rprintf (FERROR, "keep_backup filename too long\n");
                return 0;
        }
 
-       if (suffix_specified) {
-               snprintf(keep_name, sizeof (keep_name), "%s/%s%s",
-                   backup_dir, fname, backup_suffix);
-       } else {
-               snprintf(keep_name, sizeof (keep_name), "%s/%s",
-                   backup_dir, fname);
-       }
-
+       snprintf(keep_name, sizeof (keep_name), "%s/%s%s",
+           backup_dir, fname, backup_suffix);
 
 #ifdef HAVE_MKNOD
        /* Check to see if this is a device file, or link */
@@ -225,10 +221,10 @@ static int keep_backup(char *fname)
                if(am_root && preserve_devices) {
                        make_bak_dir(fname, backup_dir);
                        if(do_mknod(keep_name, file->mode, file->rdev) != 0) {
-                               rprintf(FERROR, "mknod %s : %s\n",
-                                   keep_name, strerror(errno));
+                               rprintf(FERROR, "mknod %s failed: %s\n",
+                                       full_fname(keep_name), strerror(errno));
                        } else if(verbose>2) {
-                               rprintf(FINFO, "make_backup : DEVICE %s successful.\n", fname);
+                               rprintf(FINFO, "make_backup: DEVICE %s successful.\n", fname);
                        }
                }
                kept = 1;
@@ -243,8 +239,8 @@ static int keep_backup(char *fname)
                ret_code = do_rmdir(fname);
 
                if(verbose>2) {
-                       rprintf(FINFO, "make_backup : RMDIR %s returns %i\n",
-                           fname, ret_code);
+                       rprintf(FINFO, "make_backup: RMDIR %s returns %i\n",
+                               full_fname(fname), ret_code);
                }
                kept = 1;
        }
@@ -255,14 +251,14 @@ static int keep_backup(char *fname)
                if (safe_symlinks && unsafe_symlink(file->link, keep_name)) {
                        if (verbose) {
                                rprintf(FINFO, "ignoring unsafe symlink %s -> %s\n",
-                                       keep_name, file->link);
+                                       full_fname(keep_name), file->link);
                        }
                        kept = 1;
                }
                make_bak_dir(fname, backup_dir);
                if(do_symlink(file->link, keep_name) != 0) {
                        rprintf(FERROR, "link %s -> %s : %s\n",
-                           keep_name, file->link, strerror(errno));
+                               full_fname(keep_name), file->link, strerror(errno));
                }
                do_unlink(fname);
                kept = 1;
@@ -281,8 +277,8 @@ static int keep_backup(char *fname)
        /* move to keep tree if a file */
        if(!kept) {
                if (!robust_move (fname, keep_name)) {
-                       rprintf(FERROR, "keep_backup failed %s -> %s : %s\n",
-                           fname, keep_name, strerror(errno));
+                       rprintf(FERROR, "keep_backup failed: %s -> \"%s\": %s\n",
+                               full_fname(fname), keep_name, strerror(errno));
                }
        }
        set_perms (keep_name, file, NULL, 0);