From 3591c0660c52cec9fa06e7539b56604a7499fa10 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 10 May 1998 01:46:06 +0000 Subject: cleanup code a bit --- Makefile.in | 2 +- clientserver.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.c | 242 ++++---------------------------------------------------- rsync.h | 1 + 4 files changed, 263 insertions(+), 227 deletions(-) create mode 100644 clientserver.c diff --git a/Makefile.in b/Makefile.in index f8ed5464..46fe29e5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -22,7 +22,7 @@ SHELL=/bin/sh LIBOBJ=lib/getopt.o lib/fnmatch.o lib/zlib.o lib/compat.o OBJS1=rsync.o exclude.o util.o md4.o main.o checksum.o match.o syscall.o log.o -DAEMON_OBJ = params.o loadparm.o +DAEMON_OBJ = params.o loadparm.o clientserver.o OBJS=$(OBJS1) $(DAEMON_OBJ) flist.o io.o compat.o hlink.o token.o uidlist.o socket.o $(LIBOBJ) # note that the -I. is needed to handle config.h when using VPATH diff --git a/clientserver.c b/clientserver.c new file mode 100644 index 00000000..6d6e01d6 --- /dev/null +++ b/clientserver.c @@ -0,0 +1,245 @@ +/* + Copyright (C) Andrew Tridgell 1998 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* the socket based protocol for setting up a connection wit rsyncd */ + +#include "rsync.h" + +extern int module_id; +extern int read_only; +extern int verbose; +extern int rsync_port; + +int start_socket_client(char *host, char *path, int argc, char *argv[]) +{ + int fd, i; + char *sargs[MAX_ARGS]; + int sargc=0; + char line[1024]; + char *p; + int version; + + fd = open_socket_out(host, rsync_port); + if (fd == -1) { + exit_cleanup(1); + } + + server_options(sargs,&sargc); + + sargs[sargc++] = "."; + + if (path && *path) + sargs[sargc++] = path; + + 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; +} + + +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(rsync_port, start_daemon); +} + diff --git a/main.c b/main.c index 0bcc7f54..fc4dc60d 100644 --- a/main.c +++ b/main.c @@ -58,9 +58,9 @@ int force_delete = 0; int io_timeout = 0; int io_error = 0; int read_only = 0; -static int module_id; +int module_id = -1; -static int port = RSYNC_PORT; +int rsync_port = RSYNC_PORT; static char *shell_cmd; @@ -105,7 +105,7 @@ static void report(int f) } -static void server_options(char **args,int *argc) +void server_options(char **args,int *argc) { int ac = *argc; static char argstr[50]; @@ -464,7 +464,7 @@ void start_server(int f_in, int f_out, int argc, char *argv[]) exit_cleanup(0); } -static int client_run(int f_in, int f_out, int pid, int argc, char *argv[]) +int client_run(int f_in, int f_out, int pid, int argc, char *argv[]) { struct file_list *flist; int status = 0, status2 = 0; @@ -512,67 +512,6 @@ 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, i; - char *sargs[MAX_ARGS]; - int sargc=0; - char line[1024]; - char *p; - int version; - - fd = open_socket_out(host, port); - if (fd == -1) { - exit_cleanup(1); - } - - server_options(sargs,&sargc); - - sargs[sargc++] = "."; - - if (path && *path) - sargs[sargc++] = path; - - 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[]) { @@ -1134,11 +929,6 @@ int main(int argc,char *argv[]) start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv); } - if (argc < 2) { - usage(FERROR); - exit_cleanup(1); - } - return start_client(argc, argv); } diff --git a/rsync.h b/rsync.h index e2d77453..62c03467 100644 --- a/rsync.h +++ b/rsync.h @@ -73,6 +73,7 @@ #include #endif #include +#include #ifdef HAVE_SYS_PARAM_H #include -- cgit v1.2.1