fixed a bug in the handling of -R with --delete
[rsync/rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index 7776ed0..c1ce0b5 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -384,10 +384,10 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
       }
       statret = -1;
     }
-    if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
+    if (statret != 0 && do_mkdir(fname,file->mode) != 0 && errno != EEXIST) {
            if (!(relative_paths && errno==ENOENT && 
                  create_directory_path(fname)==0 && 
-                 mkdir(fname,file->mode)==0)) {
+                 do_mkdir(fname,file->mode)==0)) {
                    fprintf(FERROR,"mkdir %s : %s (2)\n",
                            fname,strerror(errno));
            }
@@ -561,7 +561,7 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
 
       sum_update(data,i);
 
-      if (fd != -1 && write_sparse(fd,data,i) != i) {
+      if (fd != -1 && write_file(fd,data,i) != i) {
        fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
        exit_cleanup(1);
       }
@@ -582,7 +582,7 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
       see_token(map, len);
       sum_update(map,len);
 
-      if (fd != -1 && write_sparse(fd,map,len) != len) {
+      if (fd != -1 && write_file(fd,map,len) != len) {
        fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
        exit_cleanup(1);
       }
@@ -649,6 +649,8 @@ static int delete_already_done(struct file_list *flist,int j)
                exit_cleanup(1);
        }
 
+       name[strlen(name)-2] = 0;
+
        p = strrchr(name,'/');
        if (!p) {
                free(name);
@@ -656,6 +658,8 @@ static int delete_already_done(struct file_list *flist,int j)
        }
        *p = 0;
 
+       strcat(name,"/.");
+
        while (low != high) {
                int mid = (low+high)/2;
                int ret = strcmp(f_name(flist->files[flist_up(flist, mid)]),name);
@@ -703,6 +707,8 @@ static void delete_files(struct file_list *flist)
 
          if (!S_ISDIR(flist->files[j]->mode)) continue;
 
+         if (strlen(name)<2 || strcmp(name+strlen(name)-2,"/.")!=0) continue;
+
          if (delete_already_done(flist, j)) continue;
 
          if (!(local_file_list = send_file_list(-1,1,&name)))
@@ -834,7 +840,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
       } else {
              sprintf(fnametmp,"%s.XXXXXX",fname);
       }
-      if (NULL == mktemp(fnametmp)) {
+      if (NULL == do_mktemp(fnametmp)) {
        fprintf(FERROR,"mktemp %s failed\n",fnametmp);
        receive_data(f_in,buf,-1,NULL);
        if (buf) unmap_file(buf);
@@ -878,14 +884,14 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
                continue;
        }
        sprintf(fnamebak,"%s%s",fname,backup_suffix);
-       if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
+       if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
          fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
          continue;
        }
       }
 
       /* move tmp file over real file */
-      if (rename(fnametmp,fname) != 0) {
+      if (do_rename(fnametmp,fname) != 0) {
              if (errno == EXDEV) {
                      /* rename failed on cross-filesystem link.  
                         Copy the file instead. */