=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/rsync/main.c,v retrieving revision 1.59 retrieving revision 1.59.2.1 diff -u -r1.59 -r1.59.2.1 --- src/usr.bin/rsync/main.c 2021/09/01 09:48:08 1.59 +++ src/usr.bin/rsync/main.c 2021/11/09 13:40:41 1.59.2.1 @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.59 2021/09/01 09:48:08 claudio Exp $ */ +/* $OpenBSD: main.c,v 1.59.2.1 2021/11/09 13:40:41 benno Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -26,6 +26,7 @@ #include #include #include +#include #include "extern.h" @@ -280,24 +281,36 @@ #define OP_INCLUDE 1006 #define OP_EXCLUDE_FROM 1007 #define OP_INCLUDE_FROM 1008 +#define OP_COMP_DEST 1009 +#define OP_COPY_DEST 1010 +#define OP_LINK_DEST 1011 +#define OP_MAX_SIZE 1012 +#define OP_MIN_SIZE 1013 const struct option lopts[] = { { "address", required_argument, NULL, OP_ADDRESS }, { "archive", no_argument, NULL, 'a' }, + { "compare-dest", required_argument, NULL, OP_COMP_DEST }, +#if 0 + { "copy-dest", required_argument, NULL, OP_COPY_DEST }, + { "link-dest", required_argument, NULL, OP_LINK_DEST }, +#endif { "compress", no_argument, NULL, 'z' }, { "del", no_argument, &opts.del, 1 }, { "delete", no_argument, &opts.del, 1 }, { "devices", no_argument, &opts.devices, 1 }, { "no-devices", no_argument, &opts.devices, 0 }, { "dry-run", no_argument, &opts.dry_run, 1 }, - { "exclude", required_argument, NULL, OP_EXCLUDE }, + { "exclude", required_argument, NULL, OP_EXCLUDE }, { "exclude-from", required_argument, NULL, OP_EXCLUDE_FROM }, { "group", no_argument, &opts.preserve_gids, 1 }, { "no-group", no_argument, &opts.preserve_gids, 0 }, { "help", no_argument, NULL, 'h' }, - { "include", required_argument, NULL, OP_INCLUDE }, + { "include", required_argument, NULL, OP_INCLUDE }, { "include-from", required_argument, NULL, OP_INCLUDE_FROM }, { "links", no_argument, &opts.preserve_links, 1 }, + { "max-size", required_argument, NULL, OP_MAX_SIZE }, + { "min-size", required_argument, NULL, OP_MIN_SIZE }, { "no-links", no_argument, &opts.preserve_links, 0 }, { "no-motd", no_argument, &opts.no_motd, 1 }, { "numeric-ids", no_argument, &opts.numeric_ids, 1 }, @@ -327,11 +340,12 @@ main(int argc, char *argv[]) { pid_t child; - int fds[2], sd = -1, rc, c, st, i; - struct sess sess; + int fds[2], sd = -1, rc, c, st, i, lidx; + size_t basedir_cnt = 0; + struct sess sess; struct fargs *fargs; char **args; - const char *errstr; + const char *errstr; /* Global pledge. */ @@ -339,7 +353,9 @@ NULL) == -1) err(ERR_IPC, "pledge"); - while ((c = getopt_long(argc, argv, "Dae:ghlnoprtvxz", lopts, NULL)) + opts.max_size = opts.min_size = -1; + + while ((c = getopt_long(argc, argv, "Dae:ghlnoprtvxz", lopts, &lidx)) != -1) { switch (c) { case 'D': @@ -423,6 +439,49 @@ case OP_INCLUDE_FROM: parse_file(optarg, RULE_INCLUDE); break; + case OP_COMP_DEST: + if (opts.alt_base_mode !=0 && + opts.alt_base_mode != BASE_MODE_COMPARE) { + errx(1, "option --%s conflicts with %s", + lopts[lidx].name, + alt_base_mode(opts.alt_base_mode)); + } + opts.alt_base_mode = BASE_MODE_COMPARE; +#if 0 + goto basedir; + case OP_COPY_DEST: + if (opts.alt_base_mode !=0 && + opts.alt_base_mode != BASE_MODE_COPY) { + errx(1, "option --%s conflicts with %s", + lopts[lidx].name, + alt_base_mode(opts.alt_base_mode)); + } + opts.alt_base_mode = BASE_MODE_COPY; + goto basedir; + case OP_LINK_DEST: + if (opts.alt_base_mode !=0 && + opts.alt_base_mode != BASE_MODE_LINK) { + errx(1, "option --%s conflicts with %s", + lopts[lidx].name, + alt_base_mode(opts.alt_base_mode)); + } + opts.alt_base_mode = BASE_MODE_LINK; + +basedir: +#endif + if (basedir_cnt >= MAX_BASEDIR) + errx(1, "too many --%s directories specified", + lopts[lidx].name); + opts.basedir[basedir_cnt++] = optarg; + break; + case OP_MAX_SIZE: + if (scan_scaled(optarg, &opts.max_size) == -1) + err(1, "bad max-size"); + break; + case OP_MIN_SIZE: + if (scan_scaled(optarg, &opts.min_size) == -1) + err(1, "bad min-size"); + break; case OP_VERSION: fprintf(stderr, "openrsync: protocol version %u\n", RSYNC_PROTOCOL); @@ -554,12 +613,11 @@ exit(rc); usage: fprintf(stderr, "usage: %s" - " [-aDglnoprtvx] [-e program] [--address=sourceaddr] [--del]\n" - "\t[--exclude] [--exclude-from=file] [--include] " - "[--include-from=file]\n" - "\t[--no-motd] [--numeric-ids] [--port=portnumber] " - "[--rsync-path=program]\n\t[--timeout=seconds] [--version] " - "source ... directory\n", + " [-aDglnoprtvx] [-e program] [--address=sourceaddr]\n" + "\t[--compare-dest=dir] [--del] [--exclude] [--exclude-from=file]\n" + "\t[--include] [--include-from=file] [--no-motd] [--numeric-ids]\n" + "\t[--port=portnumber] [--rsync-path=program] [--timeout=seconds]\n" + "\t[--version] source ... directory\n", getprogname()); exit(ERR_SYNTAX); }