diff options
author | Wayne Davison <wayned@samba.org> | 2008-05-17 07:44:20 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2008-05-17 08:25:22 -0700 |
commit | f1ca7c4429f2a8e9de72f91d95218bb324df6a9e (patch) | |
tree | cb01777f2395148447f2f33a5e3ad5b9f65c3703 /backup.c | |
parent | adc4ebdd76cf98aacbe87b9664dd291199294297 (diff) | |
download | android_external_rsync-f1ca7c4429f2a8e9de72f91d95218bb324df6a9e.tar.gz android_external_rsync-f1ca7c4429f2a8e9de72f91d95218bb324df6a9e.tar.bz2 android_external_rsync-f1ca7c4429f2a8e9de72f91d95218bb324df6a9e.zip |
Preserve the right errno value when trying adjunct functions during
robust backup, copy, and renaming activities.
Diffstat (limited to 'backup.c')
-rw-r--r-- | backup.c | 68 |
1 files changed, 49 insertions, 19 deletions
@@ -180,10 +180,19 @@ int make_bak_dir(const char *fullpath) /* robustly move a file, creating new directory structures if necessary */ static int robust_move(const char *src, char *dst) { - if (robust_rename(src, dst, NULL, 0755) < 0 - && (errno != ENOENT || make_bak_dir(dst) < 0 - || robust_rename(src, dst, NULL, 0755) < 0)) - return -1; + if (robust_rename(src, dst, NULL, 0755) < 0) { + int save_errno = errno ? errno : EINVAL; /* 0 paranoia */ + if (errno == ENOENT && make_bak_dir(dst) == 0) { + if (robust_rename(src, dst, NULL, 0755) < 0) + save_errno = errno ? errno : save_errno; + else + save_errno = 0; + } + if (save_errno) { + errno = save_errno; + return -1; + } + } return 0; } @@ -237,11 +246,18 @@ static int keep_backup(const char *fname) uint32 *devp = F_RDEV_P(file); dev_t rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp)); do_unlink(buf); - if (do_mknod(buf, file->mode, rdev) < 0 - && (errno != ENOENT || make_bak_dir(buf) < 0 - || do_mknod(buf, file->mode, rdev) < 0)) { - rsyserr(FERROR, errno, "mknod %s failed", - full_fname(buf)); + if (do_mknod(buf, file->mode, rdev) < 0) { + int save_errno = errno ? errno : EINVAL; /* 0 paranoia */ + if (errno == ENOENT && make_bak_dir(buf) == 0) { + if (do_mknod(buf, file->mode, rdev) < 0) + save_errno = errno ? errno : save_errno; + else + save_errno = 0; + } + if (save_errno) { + rsyserr(FERROR, save_errno, "mknod %s failed", + full_fname(buf)); + } } else if (verbose > 2) { rprintf(FINFO, "make_backup: DEVICE %s successful.\n", fname); @@ -252,11 +268,18 @@ static int keep_backup(const char *fname) if (!kept && S_ISDIR(file->mode)) { /* make an empty directory */ - if (do_mkdir(buf, file->mode) < 0 - && (errno != ENOENT || make_bak_dir(buf) < 0 - || do_mkdir(buf, file->mode) < 0)) { - rsyserr(FINFO, errno, "mkdir %s failed", - full_fname(buf)); + if (do_mkdir(buf, file->mode) < 0) { + int save_errno = errno ? errno : EINVAL; /* 0 paranoia */ + if (errno == ENOENT && make_bak_dir(buf) == 0) { + if (do_mkdir(buf, file->mode) < 0) + save_errno = errno ? errno : save_errno; + else + save_errno = 0; + } + if (save_errno) { + rsyserr(FINFO, save_errno, "mkdir %s failed", + full_fname(buf)); + } } ret_code = do_rmdir(fname); @@ -278,11 +301,18 @@ static int keep_backup(const char *fname) kept = 1; } else { do_unlink(buf); - if (do_symlink(sl, buf) < 0 - && (errno != ENOENT || make_bak_dir(buf) < 0 - || do_symlink(sl, buf) < 0)) { - rsyserr(FERROR, errno, "link %s -> \"%s\"", - full_fname(buf), sl); + if (do_symlink(sl, buf) < 0) { + int save_errno = errno ? errno : EINVAL; /* 0 paranoia */ + if (errno == ENOENT && make_bak_dir(buf) == 0) { + if (do_symlink(sl, buf) < 0) + save_errno = errno ? errno : save_errno; + else + save_errno = 0; + } + if (save_errno) { + rsyserr(FERROR, save_errno, "link %s -> \"%s\"", + full_fname(buf), sl); + } } do_unlink(fname); kept = 1; |