+/****************************************************************************
+Create a directory given an absolute path, perms based upon another directory
+path
+****************************************************************************/
+static int make_bak_dir(char *fname, char *bak_path)
+{
+ STRUCT_STAT st;
+ STRUCT_STAT *st2;
+ char fullpath[MAXPATHLEN];
+ extern int orig_umask;
+ char *p;
+ char *q;
+
+ while(strncmp(bak_path, "./", 2) == 0) bak_path += 2;
+
+ 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));
+ }
+ }
+ }
+ }
+ *p = '/';
+ p++;
+ }
+ return 0;
+}
+