- p = fullpath;
- q = fullpath + strlen(bak_path);
- if (*q == '/')
- q++; /* Point past the middle '/' added by pathjoin(). */
-
- /* Make the directories */
- while ((p = strchr(p, '/')) != NULL) {
- *p = 0;
- if (do_lstat(fullpath, &st) != 0) {
- do_mkdir(fullpath, 0777 & ~orig_umask);
- if (p > q) {
- if (do_lstat(q, &st) != 0) {
- 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 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",
- full_fname(fullpath), strerror(errno));
- }
- }
- }
+#endif
+ if (do_rename(from, to) == 0) {
+ if (stp->st_nlink > 1 && !S_ISDIR(stp->st_mode)) {
+ /* If someone has hard-linked the file into the backup
+ * dir, rename() might return success but do nothing! */
+ robust_unlink(from); /* Just in case... */