X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/47d6a60c2f4f891fb590a850adf7d48e829976b1..e0ed4e4087ebeff0b0fe8f3419bcccf84fbd89a9:/backup.c diff --git a/backup.c b/backup.c index 990b0d85..c45b3df3 100644 --- a/backup.c +++ b/backup.c @@ -21,11 +21,11 @@ #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);