check for munmap as well as mmap. NextStep only has mmap in standard
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index bc1ceba..9ebed25 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -262,6 +262,12 @@ static void receive_file_entry(struct file_struct **fptr,
 
   clean_fname(thisname);
 
+  if (relative_paths && thisname[0] == '/') {
+         /* strip / off absolute paths in destination */
+         memmove(thisname, thisname+1, strlen(thisname));
+         if (!thisname[0]) strcpy(thisname,".");
+  }
+
   if ((p = strrchr(thisname,'/'))) {
          static char *lastdir;
          *p = 0;
@@ -507,7 +513,7 @@ static void send_directory(int f,struct file_list *flist,char *dir)
        d = opendir(dir);
        if (!d) {
                io_error = 1;
-               rprintf(FERROR,"%s: %s\n",
+               rprintf(FERROR,"opendir(%s): %s\n",
                        dir,strerror(errno));
                return;
        }
@@ -616,11 +622,14 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
                           thus getting their permissions right */
                        *p = 0;
                        if (strcmp(lastpath,fname)) {
-                               strcpy(lastpath, fname);
+                               strlcpy(lastpath, fname, sizeof(lastpath)-1);
                                *p = '/';
                                for (p=fname+1; (p=strchr(p,'/')); p++) {
+                                       int copy_links_saved = copy_links;
                                        *p = 0;
+                                       copy_links = 0;
                                        send_file_name(f, flist, fname, 0, 0);
+                                       copy_links = copy_links_saved;
                                        *p = '/';
                                }
                        } else {