X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/bc2e93eb8e6562590492e39349b37c38711a05ce..f0fca04e4e136c4a487a922e8fb09acf46aeafa0:/main.c diff --git a/main.c b/main.c index 527daeb6..0bcc7f54 100644 --- a/main.c +++ b/main.c @@ -21,7 +21,7 @@ int verbose = 0; int always_checksum = 0; -time_t starttime; +time_t starttime = 0; int64 total_size = 0; int block_size=BLOCK_SIZE; @@ -57,6 +57,9 @@ int numeric_ids = 0; int force_delete = 0; int io_timeout = 0; int io_error = 0; +int read_only = 0; +static int module_id; + static int port = RSYNC_PORT; static char *shell_cmd; @@ -64,9 +67,9 @@ static char *shell_cmd; extern int csum_length; int am_server = 0; -int am_sender; +int am_sender=0; int recurse = 0; -int am_daemon; +int am_daemon=0; static void usage(int fd); @@ -335,12 +338,24 @@ static void do_server_sender(int f_in, int f_out, int argc,char *argv[]) argv[i] += l+1; } + if (am_daemon) { + char *name = lp_name(module_id); + int l = strlen(name); + for (i=0;i 2) rprintf(FINFO,"server_recv(%d) starting pid=%d\n",argc,(int)getpid()); + if (am_daemon) { + char *name = lp_name(module_id); + int i, l = strlen(name); + for (i=0;i 0) { dir = argv[0]; argc--; argv++; - if (chdir(dir) != 0) { + if (!am_daemon && chdir(dir) != 0) { rprintf(FERROR,"chdir %s : %s (4)\n", dir,strerror(errno)); exit_cleanup(1); @@ -487,13 +514,15 @@ static int client_run(int f_in, int f_out, int pid, int argc, char *argv[]) int start_socket_client(char *host, char *path, int argc, char *argv[]) { - int fd; - char *sargs[100]; + int fd, i; + char *sargs[MAX_ARGS]; int sargc=0; - + char line[1024]; + char *p; + int version; + fd = open_socket_out(host, port); if (fd == -1) { - rprintf(FERROR,"failed to connect to %s - %s\n", host, strerror(errno)); exit_cleanup(1); } @@ -506,6 +535,41 @@ int start_socket_client(char *host, char *path, int argc, char *argv[]) sargs[sargc] = NULL; + p = strchr(path,'/'); + if (p) *p = 0; + io_printf(fd,"%s\n",path); + if (p) *p = '/'; + + if (!read_line(fd, line, sizeof(line)-1)) { + return -1; + } + + if (sscanf(line,"RSYNCD %d", &version) != 1) { + return -1; + } + + while (1) { + if (!read_line(fd, line, sizeof(line)-1)) { + return -1; + } + if (strcmp(line,"RSYNCD: OK") == 0) break; + rprintf(FINFO,"%s\n", line); + } + + for (i=0;i 1) verbose = 1; + + argc -= optind; + argp = argv + optind; + optind = 0; + + start_server(fd, fd, argc, argp); + + return 0; +} + +static void send_listing(int fd) +{ + int n = lp_numservices(); + int i; + + for (i=0;i 0) { + line[len] = 0; + io_printf(fd,"%s", line); + } + } + if (f) fclose(f); + io_printf(fd,"\n"); + } + + /* read a single line indicating the resource that is wanted */ + while (1) { + int i; + + line[0] = 0; + if (!read_line(fd, line, sizeof(line)-1)) { + return -1; + } + + if (!*line || strcmp(line,"#list")==0) { + send_listing(fd); + return -1; + } + + if (*line == '#') { + /* it's some sort of command that I don't understand */ + io_printf(fd,"ERROR: Unknown command '%s'\n", line); + return -1; + } + + i = lp_number(line); + if (i == -1) { + io_printf(fd,"ERROR: Unknown module '%s'\n", line); + return -1; + } + + return rsync_module(fd, i); + } + + return 0; +} + + +static int daemon_main(void) +{ + if (!lp_load(RSYNCD_CONF)) { + exit_cleanup(1); + } + + if (is_a_socket(STDIN_FILENO)) { + /* we are running via inetd */ + return start_daemon(STDIN_FILENO); + } + + become_daemon(); + + return start_accept_loop(port, start_daemon); +} + int main(int argc,char *argv[]) { @@ -888,17 +1107,19 @@ int main(int argc,char *argv[]) parse_arguments(argc, argv); - while (optind) { - argc--; - argv++; - optind--; - } + argc -= optind; + argv += optind; + optind = 0; signal(SIGCHLD,SIG_IGN); signal(SIGINT,SIGNAL_CAST sig_int); signal(SIGPIPE,SIGNAL_CAST sig_int); signal(SIGHUP,SIGNAL_CAST sig_int); + if (am_daemon) { + return daemon_main(); + } + if (dry_run) verbose = MAX(verbose,1);