Look in -lresolv for inet_ntop
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index cda3508..5bc0288 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -47,6 +47,9 @@ extern int remote_version;
 extern int io_error;
 extern int sanitize_paths;
 
+extern int read_batch;
+extern int write_batch;
+
 static char topsrcname[MAXPATHLEN];
 
 static struct exclude_struct **local_exclude_list;
@@ -150,7 +153,7 @@ int readlink_stat(const char *Path, STRUCT_STAT *Buffer, char *Linkbuf)
        }
        if (S_ISLNK(Buffer->st_mode)) {
                int l;
-               if ((l = readlink(Path,Linkbuf,MAXPATHLEN-1)) == -1) {
+               if ((l = readlink((char *) Path, Linkbuf, MAXPATHLEN-1))== -1) {
                        return -1;
                }
                Linkbuf[l] = 0;
@@ -182,12 +185,18 @@ int link_stat(const char *Path, STRUCT_STAT *Buffer)
   This function is used to check if a file should be included/excluded
   from the list of files based on its name and type etc
  */
-static int match_file_name(char *fname,STRUCT_STAT *st)
+static int check_exclude_file(int f,char *fname,STRUCT_STAT *st)
 {
-  if (check_exclude(fname,local_exclude_list,st)) {
-    return 0;
-  }
-  return 1;
+       extern int delete_excluded;
+
+       /* f is set to -1 when calculating deletion file list */
+       if ((f == -1) && delete_excluded) {
+               return 0;
+       }
+       if (check_exclude(fname,local_exclude_list,st)) {
+               return 1;
+       }
+       return 0;
 }
 
 /* used by the one_file_system code */
@@ -476,7 +485,6 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap,
        char *p;
        char cleaned_name[MAXPATHLEN];
        char linkbuf[MAXPATHLEN];
-       extern int delete_excluded;
        extern int module_id;
 
        strlcpy(cleaned_name, fname, MAXPATHLEN);
@@ -490,9 +498,18 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap,
        memset(sum,0,SUM_LENGTH);
 
        if (readlink_stat(fname,&st,linkbuf) != 0) {
+               int save_errno = errno;
+               if ((errno == ENOENT) && copy_links && !noexcludes) {
+                       /* symlink pointing nowhere, see if excluded */
+                       memset((char *)&st, 0, sizeof(st));
+                       if (check_exclude_file(f,fname,&st)) {
+                               /* file is excluded anyway, ignore silently */
+                               return NULL;
+                       }
+               }
                io_error = 1;
                rprintf(FERROR,"readlink %s: %s\n",
-                       fname,strerror(errno));
+                       fname,strerror(save_errno));
                return NULL;
        }
 
@@ -509,8 +526,7 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap,
                        return NULL;
        }
        
-       /* f is set to -1 when calculating deletion file list */
-       if (((f != -1) || !delete_excluded) && !match_file_name(fname,&st))
+       if (check_exclude_file(f,fname,&st))
                return NULL;
 
 
@@ -613,6 +629,9 @@ void send_file_name(int f,struct file_list *flist,char *fname,
                  out_of_memory("send_file_name");
   }
 
+  if (write_batch) /*  dw  */
+    file->flags = FLAG_DELETE;
+
   if (strcmp(file->basename,"")) {
     flist->files[flist->count++] = file;
     send_file_entry(file,f,base_flags);
@@ -841,6 +860,8 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
                io_end_buffering(f);
                stats.flist_size = stats.total_written - start_write;
                stats.num_files = flist->count;
+               if (write_batch) /*  dw  */
+                   write_batch_flist_info(flist->count, flist->files);
        }
 
        if (verbose > 2)
@@ -918,7 +939,7 @@ struct file_list *recv_file_list(int f)
   }
 
   /* if protocol version is >= 17 then recv the io_error flag */
-  if (f != -1 && remote_version >= 17) {
+  if (f != -1 && remote_version >= 17  && !read_batch) {  /* dw-added readbatch */
          extern int module_id;
          extern int ignore_errors;
          if (lp_ignore_errors(module_id) || ignore_errors) {
@@ -1096,10 +1117,10 @@ static void clean_flist(struct file_list *flist, int strip_root)
 
        for (i=0;i<flist->count;i++) {
                rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%.0f\n",
-                       getpid(), i, 
+                       (int) getpid(), i, 
                        NS(flist->files[i]->dirname),
                        NS(flist->files[i]->basename),
-                       flist->files[i]->mode,
+                       (int) flist->files[i]->mode,
                        (double)flist->files[i]->length);
        }
 }