- if(bak_path[strlen(bak_path)-1] != '/') {
- snprintf(fullpath, sizeof(fullpath), "%s/", bak_path);
- } else {
- snprintf(fullpath, sizeof(fullpath), "%s", bak_path);
- }
- p = fullpath;
- q = &fullpath[strlen(fullpath)]; /* End of bak_path string */
- strcat(fullpath, fname);
-
- /* Make the directories */
- while ((p = strchr(p, '/'))) {
- *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));
- }
- }
- }
+ while (mkdir_defmode(backup_dir_buf) < 0) {
+ if (errno == EEXIST) {
+ val = validate_backup_dir();
+ if (val > 0)
+ break;
+ if (val == 0)
+ continue;
+ } else
+ rsyserr(FERROR, errno, "backup mkdir %s failed", backup_dir_buf);
+ *name = '\0';
+ ret = False;
+ goto cleanup;