X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/7b8356d0bcc11d7681294afde83a18dfd46fa1ad..aa7ed2014183d671b61b785d1eb68fde9f6f48ec:/main.c diff --git a/main.c b/main.c index 8ca252fb..246a6ac2 100644 --- a/main.c +++ b/main.c @@ -49,6 +49,7 @@ int sparse_files=0; int do_compression=0; int am_root=0; int orig_umask=0; +int relative_paths=0; extern int csum_length; @@ -134,6 +135,8 @@ static void server_options(char **args,int *argc) argstr[x++] = 'C'; if (ignore_times) argstr[x++] = 'I'; + if (relative_paths) + argstr[x++] = 'R'; if (one_file_system) argstr[x++] = 'x'; if (sparse_files) @@ -199,7 +202,7 @@ int do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int *f_out) if (path && *path) { char *dir = strdup(path); p = strrchr(dir,'/'); - if (p) { + if (p && !relative_paths) { *p = 0; if (!dir[0]) args[argc++] = "/"; @@ -240,7 +243,7 @@ static char *get_local_name(struct file_list *flist,char *name) if (stat(name,&st) == 0) { if (S_ISDIR(st.st_mode)) { if (chdir(name) != 0) { - fprintf(FERROR,"chdir %s : %s\n",name,strerror(errno)); + fprintf(FERROR,"chdir %s : %s (1)\n",name,strerror(errno)); exit_cleanup(1); } return NULL; @@ -259,14 +262,14 @@ static char *get_local_name(struct file_list *flist,char *name) return NULL; if (mkdir(name,0777 & ~orig_umask) != 0) { - fprintf(FERROR,"mkdir %s : %s\n",name,strerror(errno)); + fprintf(FERROR,"mkdir %s : %s (1)\n",name,strerror(errno)); exit_cleanup(1); } else { fprintf(FINFO,"created directory %s\n",name); } if (chdir(name) != 0) { - fprintf(FERROR,"chdir %s : %s\n",name,strerror(errno)); + fprintf(FERROR,"chdir %s : %s (2)\n",name,strerror(errno)); exit_cleanup(1); } @@ -285,8 +288,8 @@ void do_server_sender(int argc,char *argv[]) if (verbose > 2) fprintf(FERROR,"server_sender starting pid=%d\n",(int)getpid()); - if (chdir(dir) != 0) { - fprintf(FERROR,"chdir %s: %s\n",dir,strerror(errno)); + if (!relative_paths && chdir(dir) != 0) { + fprintf(FERROR,"chdir %s: %s (3)\n",dir,strerror(errno)); exit_cleanup(1); } argc--; @@ -294,6 +297,8 @@ void do_server_sender(int argc,char *argv[]) if (strcmp(dir,".")) { int l = strlen(dir); + if (strcmp(dir,"/") == 0) + l = 0; for (i=0;i 3) fprintf(FERROR,"parent=%d child=%d sender=%d recurse=%d\n", (int)getpid(),pid,sender,recurse);