~ubuntu-branches/ubuntu/lucid/rsync/lucid

« back to all changes in this revision

Viewing changes to backup.c

  • Committer: Bazaar Package Importer
  • Author(s): Chuck Short
  • Date: 2008-07-03 00:01:48 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20080703000148-xli84l1ummkj4fxp
Tags: 3.0.3-1ubuntu1
* Merge from debian unstable, remaining changes:
  - Remove stop lilnks from rc0 and rc6
    (and use update-rc.d multiuser instead of defauts). (TearDown spec)
  - depend on sysv-rc to accomodate the TearDown changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
180
180
/* robustly move a file, creating new directory structures if necessary */
181
181
static int robust_move(const char *src, char *dst)
182
182
{
183
 
        if (robust_rename(src, dst, NULL, 0755) < 0
184
 
         && (errno != ENOENT || make_bak_dir(dst) < 0
185
 
          || robust_rename(src, dst, NULL, 0755) < 0))
186
 
                return -1;
 
183
        if (robust_rename(src, dst, NULL, 0755) < 0) {
 
184
                int save_errno = errno ? errno : EINVAL; /* 0 paranoia */
 
185
                if (errno == ENOENT && make_bak_dir(dst) == 0) {
 
186
                        if (robust_rename(src, dst, NULL, 0755) < 0)
 
187
                                save_errno = errno ? errno : save_errno;
 
188
                        else
 
189
                                save_errno = 0;
 
190
                }
 
191
                if (save_errno) {
 
192
                        errno = save_errno;
 
193
                        return -1;
 
194
                }
 
195
        }
187
196
        return 0;
188
197
}
189
198
 
195
204
        stat_x sx;
196
205
        struct file_struct *file;
197
206
        char *buf;
 
207
        int save_preserve_xattrs = preserve_xattrs;
198
208
        int kept = 0;
199
209
        int ret_code;
200
210
 
234
244
        /* Check to see if this is a device file, or link */
235
245
        if ((am_root && preserve_devices && IS_DEVICE(file->mode))
236
246
         || (preserve_specials && IS_SPECIAL(file->mode))) {
237
 
                uint32 *devp = F_RDEV_P(file);
238
 
                dev_t rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
 
247
                int save_errno;
239
248
                do_unlink(buf);
240
 
                if (do_mknod(buf, file->mode, rdev) < 0
241
 
                    && (errno != ENOENT || make_bak_dir(buf) < 0
242
 
                     || do_mknod(buf, file->mode, rdev) < 0)) {
243
 
                        rsyserr(FERROR, errno, "mknod %s failed",
244
 
                                full_fname(buf));
245
 
                } else if (verbose > 2) {
 
249
                if (do_mknod(buf, file->mode, sx.st.st_rdev) < 0) {
 
250
                        save_errno = errno ? errno : EINVAL; /* 0 paranoia */
 
251
                        if (errno == ENOENT && make_bak_dir(buf) == 0) {
 
252
                                if (do_mknod(buf, file->mode, sx.st.st_rdev) < 0)
 
253
                                        save_errno = errno ? errno : save_errno;
 
254
                                else
 
255
                                        save_errno = 0;
 
256
                        }
 
257
                        if (save_errno) {
 
258
                                rsyserr(FERROR, save_errno, "mknod %s failed",
 
259
                                        full_fname(buf));
 
260
                        }
 
261
                } else
 
262
                        save_errno = 0;
 
263
                if (verbose > 2 && save_errno == 0) {
246
264
                        rprintf(FINFO, "make_backup: DEVICE %s successful.\n",
247
265
                                fname);
248
266
                }
252
270
 
253
271
        if (!kept && S_ISDIR(file->mode)) {
254
272
                /* make an empty directory */
255
 
                if (do_mkdir(buf, file->mode) < 0
256
 
                    && (errno != ENOENT || make_bak_dir(buf) < 0
257
 
                     || do_mkdir(buf, file->mode) < 0)) {
258
 
                        rsyserr(FINFO, errno, "mkdir %s failed",
259
 
                                full_fname(buf));
 
273
                if (do_mkdir(buf, file->mode) < 0) {
 
274
                        int save_errno = errno ? errno : EINVAL; /* 0 paranoia */
 
275
                        if (errno == ENOENT && make_bak_dir(buf) == 0) {
 
276
                                if (do_mkdir(buf, file->mode) < 0)
 
277
                                        save_errno = errno ? errno : save_errno;
 
278
                                else
 
279
                                        save_errno = 0;
 
280
                        }
 
281
                        if (save_errno) {
 
282
                                rsyserr(FINFO, save_errno, "mkdir %s failed",
 
283
                                        full_fname(buf));
 
284
                        }
260
285
                }
261
286
 
262
287
                ret_code = do_rmdir(fname);
278
303
                        kept = 1;
279
304
                } else {
280
305
                        do_unlink(buf);
281
 
                        if (do_symlink(sl, buf) < 0
282
 
                            && (errno != ENOENT || make_bak_dir(buf) < 0
283
 
                             || do_symlink(sl, buf) < 0)) {
284
 
                                rsyserr(FERROR, errno, "link %s -> \"%s\"",
285
 
                                        full_fname(buf), sl);
 
306
                        if (do_symlink(sl, buf) < 0) {
 
307
                                int save_errno = errno ? errno : EINVAL; /* 0 paranoia */
 
308
                                if (errno == ENOENT && make_bak_dir(buf) == 0) {
 
309
                                        if (do_symlink(sl, buf) < 0)
 
310
                                                save_errno = errno ? errno : save_errno;
 
311
                                        else
 
312
                                                save_errno = 0;
 
313
                                }
 
314
                                if (save_errno) {
 
315
                                        rsyserr(FERROR, save_errno, "link %s -> \"%s\"",
 
316
                                                full_fname(buf), sl);
 
317
                                }
286
318
                        }
287
319
                        do_unlink(fname);
288
320
                        kept = 1;
308
340
                        robust_unlink(fname); /* Just in case... */
309
341
                }
310
342
        }
 
343
        preserve_xattrs = 0;
311
344
        set_file_attrs(buf, file, NULL, fname, 0);
 
345
        preserve_xattrs = save_preserve_xattrs;
312
346
        unmake_file(file);
313
347
 
314
348
        if (verbose > 1) {