X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/31e125226d429c2f6df010a9277bb9ebfdc2cf54..3bee67337d0491f55654cf8e926592365e5a8502:/util.c diff --git a/util.c b/util.c index 4d293f22..f61e91da 100644 --- a/util.c +++ b/util.c @@ -159,10 +159,67 @@ int piped_child(char **command,int *f_in,int *f_out) return pid; } +int local_child(int argc, char **argv,int *f_in,int *f_out) +{ + int pid; + int to_child_pipe[2]; + int from_child_pipe[2]; + + if (pipe(to_child_pipe) < 0 || + pipe(from_child_pipe) < 0) { + fprintf(FERROR,"pipe: %s\n",strerror(errno)); + exit_cleanup(1); + } + + + pid = do_fork(); + if (pid < 0) { + fprintf(FERROR,"fork: %s\n",strerror(errno)); + exit_cleanup(1); + } + + if (pid == 0) { + extern int am_sender; + extern int am_server; + + am_sender = !am_sender; + am_server = 1; + + if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || + close(to_child_pipe[1]) < 0 || + close(from_child_pipe[0]) < 0 || + dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { + fprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno)); + exit_cleanup(1); + } + if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]); + if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]); + start_server(argc, argv); + } + + if (close(from_child_pipe[1]) < 0 || + close(to_child_pipe[0]) < 0) { + fprintf(FERROR,"Failed to close : %s\n",strerror(errno)); + exit_cleanup(1); + } + + *f_in = from_child_pipe[0]; + *f_out = to_child_pipe[1]; + + return pid; +} + + void out_of_memory(char *str) { - fprintf(FERROR,"out of memory in %s\n",str); + fprintf(FERROR,"ERROR: out of memory in %s\n",str); + exit_cleanup(1); +} + +void overflow(char *str) +{ + fprintf(FERROR,"ERROR: buffer overflow in %s\n",str); exit_cleanup(1); } @@ -241,7 +298,7 @@ int create_directory_path(char *fname) p = fname; while ((p=strchr(p,'/'))) { *p = 0; - mkdir(fname,0777 & ~orig_umask); + do_mkdir(fname,0777 & ~orig_umask); *p = '/'; p++; }