-static void usage(int F)
-{
- rprintf(F,"rsync version %s Copyright Andrew Tridgell and Paul Mackerras\n\n",
- VERSION);
- rprintf(F,"Usage:\t%s [options] src user@host:dest\nOR",RSYNC_NAME);
- rprintf(F,"\t%s [options] user@host:src dest\n\n",RSYNC_NAME);
- rprintf(F,"Options:\n");
- rprintf(F,"-v, --verbose increase verbosity\n");
- rprintf(F,"-c, --checksum always checksum\n");
- rprintf(F,"-a, --archive archive mode (same as -rlptDog)\n");
- rprintf(F,"-r, --recursive recurse into directories\n");
- rprintf(F,"-R, --relative use relative path names\n");
- rprintf(F,"-b, --backup make backups (default ~ extension)\n");
- rprintf(F,"-u, --update update only (don't overwrite newer files)\n");
- rprintf(F,"-l, --links preserve soft links\n");
- rprintf(F,"-L, --copy-links treat soft links like regular files\n");
- rprintf(F,"-H, --hard-links preserve hard links\n");
- rprintf(F,"-p, --perms preserve permissions\n");
- rprintf(F,"-o, --owner preserve owner (root only)\n");
- rprintf(F,"-g, --group preserve group\n");
- rprintf(F,"-D, --devices preserve devices (root only)\n");
- rprintf(F,"-t, --times preserve times\n");
- rprintf(F,"-S, --sparse handle sparse files efficiently\n");
- rprintf(F,"-n, --dry-run show what would have been transferred\n");
- rprintf(F,"-W, --whole-file copy whole files, no incremental checks\n");
- rprintf(F,"-x, --one-file-system don't cross filesystem boundaries\n");
- rprintf(F,"-B, --block-size SIZE checksum blocking size\n");
- rprintf(F,"-e, --rsh COMMAND specify rsh replacement\n");
- rprintf(F," --rsync-path PATH specify path to rsync on the remote machine\n");
- rprintf(F,"-C, --cvs-exclude auto ignore files in the same way CVS does\n");
- rprintf(F," --delete delete files that don't exist on the sending side\n");
- rprintf(F," --force force deletion of directories even if not empty\n");
- rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n");
- rprintf(F," --timeout TIME set IO timeout in seconds\n");
- rprintf(F,"-I, --ignore-times don't exclude files that match length and time\n");
- rprintf(F,"-T --temp-dir DIR create temporary files in directory DIR\n");
- rprintf(F,"-z, --compress compress file data\n");
- rprintf(F," --exclude FILE exclude file FILE\n");
- rprintf(F," --exclude-from FILE exclude files listed in FILE\n");
- rprintf(F," --suffix SUFFIX override backup suffix\n");
- rprintf(F," --version print version number\n");
-
- rprintf(F,"\n");
- rprintf(F,"the backup suffix defaults to %s\n",BACKUP_SUFFIX);
- rprintf(F,"the block size defaults to %d\n",BLOCK_SIZE);
-}
-
-enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE,
- OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH,
- OPT_FORCE,OPT_TIMEOUT,OPT_DAEMON};
-
-static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z";
-
-static struct option long_options[] = {
- {"version", 0, 0, OPT_VERSION},
- {"server", 0, 0, OPT_SERVER},
- {"sender", 0, 0, OPT_SENDER},
- {"delete", 0, 0, OPT_DELETE},
- {"force", 0, 0, OPT_FORCE},
- {"numeric-ids", 0, 0, OPT_NUMERIC_IDS},
- {"exclude", 1, 0, OPT_EXCLUDE},
- {"exclude-from",1, 0, OPT_EXCLUDE_FROM},
- {"rsync-path", 1, 0, OPT_RSYNC_PATH},
- {"one-file-system",0, 0, 'x'},
- {"ignore-times",0, 0, 'I'},
- {"help", 0, 0, 'h'},
- {"dry-run", 0, 0, 'n'},
- {"sparse", 0, 0, 'S'},
- {"cvs-exclude", 0, 0, 'C'},
- {"archive", 0, 0, 'a'},
- {"checksum", 0, 0, 'c'},
- {"backup", 0, 0, 'b'},
- {"update", 0, 0, 'u'},
- {"verbose", 0, 0, 'v'},
- {"recursive", 0, 0, 'r'},
- {"relative", 0, 0, 'R'},
- {"devices", 0, 0, 'D'},
- {"perms", 0, 0, 'p'},
- {"links", 0, 0, 'l'},
- {"copy-links", 0, 0, 'L'},
- {"whole-file", 0, 0, 'W'},
- {"hard-links", 0, 0, 'H'},
- {"owner", 0, 0, 'o'},
- {"group", 0, 0, 'g'},
- {"times", 0, 0, 't'},
- {"rsh", 1, 0, 'e'},
- {"suffix", 1, 0, OPT_SUFFIX},
- {"block-size", 1, 0, 'B'},
- {"timeout", 1, 0, OPT_TIMEOUT},
- {"temp-dir", 1, 0, 'T'},
- {"compress", 0, 0, 'z'},
- {"daemon", 0, 0, OPT_DAEMON},
- {0,0,0,0}};
-
-RETSIGTYPE sigusr1_handler(int val) {
- exit_cleanup(1);
-}
-
-
-static void parse_arguments(int argc, char *argv[])
-{
- int opt;
- int option_index;
-
- while ((opt = getopt_long(argc, argv,
- short_options, long_options, &option_index))
- != -1) {
- switch (opt)
- {
- case OPT_VERSION:
- printf("rsync version %s protocol version %d\n",
- VERSION,PROTOCOL_VERSION);
- exit_cleanup(0);
-
- case OPT_SUFFIX:
- backup_suffix = optarg;
- break;
-
- case OPT_RSYNC_PATH:
- rsync_path = optarg;
- break;
-
- case 'I':
- ignore_times = 1;
- break;
-
- case 'x':
- one_file_system=1;
- break;
-
- case OPT_DELETE:
- delete_mode = 1;
- break;
-
- case OPT_FORCE:
- force_delete = 1;
- break;
-
- case OPT_NUMERIC_IDS:
- numeric_ids = 1;
- break;
-
- case OPT_EXCLUDE:
- add_exclude(optarg);
- break;
-
- case OPT_EXCLUDE_FROM:
- add_exclude_file(optarg,1);
- break;
-
- case 'h':
- usage(FINFO);
- exit_cleanup(0);
-
- case 'b':
- make_backups=1;
- break;
-
- case 'n':
- dry_run=1;
- break;
-
- case 'S':
- sparse_files=1;
- break;
-
- case 'C':
- cvs_exclude=1;
- break;
-
- case 'u':
- update_only=1;
- break;
-
- case 'l':
- preserve_links=1;
- break;
-
- case 'L':
- copy_links=1;
- break;
-
- case 'W':
- whole_file=1;
- break;
-
- case 'H':
-#if SUPPORT_HARD_LINKS
- preserve_hard_links=1;
-#else
- rprintf(FERROR,"ERROR: hard links not supported on this platform\n");
- exit_cleanup(1);
-#endif
- break;
-
- case 'p':
- preserve_perms=1;
- break;
-
- case 'o':
- preserve_uid=1;
- break;
-
- case 'g':
- preserve_gid=1;
- break;
-
- case 'D':
- preserve_devices=1;
- break;
-
- case 't':
- preserve_times=1;
- break;
-
- case 'c':
- always_checksum=1;
- break;
-
- case 'v':
- verbose++;
- break;
-
- case 'a':
- recurse=1;
-#if SUPPORT_LINKS
- preserve_links=1;
-#endif
- preserve_perms=1;
- preserve_times=1;
- preserve_gid=1;
- if (am_root) {
- preserve_devices=1;
- preserve_uid=1;
- }
- break;
-
- case OPT_SERVER:
- am_server = 1;
- break;
-
- case OPT_SENDER:
- if (!am_server) {
- usage(FERROR);
- exit_cleanup(1);
- }
- am_sender = 1;
- break;
-
- case 'r':
- recurse = 1;
- break;
-
- case 'R':
- relative_paths = 1;
- break;
-
- case 'e':
- shell_cmd = optarg;
- break;
-
- case 'B':
- block_size = atoi(optarg);
- break;
-
- case OPT_TIMEOUT:
- io_timeout = atoi(optarg);
- break;
-
- case 'T':
- tmpdir = optarg;
- break;
-
- case 'z':
- do_compression = 1;
- break;
-
- case OPT_DAEMON:
- am_daemon = 1;
- break;
-
- default:
- /* rprintf(FERROR,"bad option -%c\n",opt); */
- exit_cleanup(1);
- }
- }
-}
-
-static int rsync_module(int fd, int i)
-{
- int argc=0;
- char *argv[MAX_ARGS];
- char **argp;
- char line[1024];
-
- module_id = i;
-
- if (lp_read_only(i))
- read_only = 1;
-
- rprintf(FERROR,"rsyncd starting\n");
-
- if (chroot(lp_path(i))) {
- io_printf(fd,"ERROR: chroot failed\n");
- return -1;
- }
-
- if (chdir("/")) {
- io_printf(fd,"ERROR: chdir failed\n");
- return -1;