ok benno@ much better as the list grows
Claudio Jeker(cje...@diehard.n-r-g.com) on 2021.07.13 20:06:39 +0200: > I never really liked the getopt_long definitions in rsync. Too much magic > and chaos. > > This moves the table out of main to gain some more space and to make it a > proper read-only object. Because of this struct opts also needs to become > a global but that is OK. > > Clean up the required_argument options that have no short from. Instead of > small numbers use some defines and make the values larger than any char > value (I chose 1000 and up). > > Fix --no-motd, it is just a flag setting a value. So just use the > getopt_long() method for doing that. > > Sort the options alphabetically with the exception of no-XYZ options which > I added below the XYZ option itself. > > IMO the result is better than what was there before. > -- > :wq Claudio > > Index: main.c > =================================================================== > RCS file: /cvs/src/usr.bin/rsync/main.c,v > retrieving revision 1.55 > diff -u -p -r1.55 main.c > --- main.c 30 Jun 2021 13:10:04 -0000 1.55 > +++ main.c 13 Jul 2021 17:54:13 -0000 > @@ -269,61 +269,67 @@ fargs_parse(size_t argc, char *argv[], s > return f; > } > > +static struct opts opts; > + > +#define OP_ADDRESS 1000 > +#define OP_PORT 1001 > +#define OP_RSYNCPATH 1002 > +#define OP_TIMEOUT 1003 > +#define OP_VERSION 1004 > + > +const struct option lopts[] = { > + { "address", required_argument, NULL, OP_ADDRESS }, > + { "archive", no_argument, NULL, 'a' }, > + { "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 }, > + { "group", no_argument, &opts.preserve_gids, 1 }, > + { "no-group", no_argument, &opts.preserve_gids, 0 }, > + { "help", no_argument, NULL, 'h' }, > + { "links", no_argument, &opts.preserve_links, 1 }, > + { "no-links", no_argument, &opts.preserve_links, 0 }, > + { "no-motd", no_argument, &opts.no_motd, 1 }, > + { "numeric-ids", no_argument, &opts.numeric_ids, 1 }, > + { "owner", no_argument, &opts.preserve_uids, 1 }, > + { "no-owner", no_argument, &opts.preserve_uids, 0 }, > + { "perms", no_argument, &opts.preserve_perms, 1 }, > + { "no-perms", no_argument, &opts.preserve_perms, 0 }, > + { "port", required_argument, NULL, OP_PORT > }, > + { "recursive", no_argument, &opts.recursive, 1 }, > + { "no-recursive", no_argument, &opts.recursive, 0 }, > + { "rsh", required_argument, NULL, 'e' }, > + { "rsync-path", required_argument, NULL, OP_RSYNCPATH }, > + { "sender", no_argument, &opts.sender, 1 }, > + { "server", no_argument, &opts.server, 1 }, > + { "specials", no_argument, &opts.specials, 1 }, > + { "no-specials", no_argument, &opts.specials, 0 }, > + { "timeout", required_argument, NULL, OP_TIMEOUT }, > + { "times", no_argument, &opts.preserve_times, 1 }, > + { "no-times", no_argument, &opts.preserve_times, 0 }, > + { "verbose", no_argument, &verbose, 1 }, > + { "no-verbose", no_argument, &verbose, 0 }, > + { "version", no_argument, NULL, OP_VERSION }, > + { NULL, 0, NULL, 0 } > +}; > + > int > main(int argc, char *argv[]) > { > - struct opts opts; > pid_t child; > int fds[2], sd = -1, rc, c, st, i; > struct sess sess; > struct fargs *fargs; > char **args; > const char *errstr; > - const struct option lopts[] = { > - { "port", required_argument, NULL, 3 }, > - { "rsh", required_argument, NULL, 'e' }, > - { "rsync-path", required_argument, NULL, 1 }, > - { "sender", no_argument, &opts.sender, 1 }, > - { "server", no_argument, &opts.server, 1 }, > - { "dry-run", no_argument, &opts.dry_run, 1 }, > - { "version", no_argument, NULL, 2 }, > - { "archive", no_argument, NULL, 'a' }, > - { "help", no_argument, NULL, 'h' }, > - { "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 }, > - { "group", no_argument, &opts.preserve_gids, 1 }, > - { "no-group", no_argument, &opts.preserve_gids, 0 }, > - { "links", no_argument, &opts.preserve_links, 1 }, > - { "no-links", no_argument, &opts.preserve_links, 0 }, > - { "owner", no_argument, &opts.preserve_uids, 1 }, > - { "no-owner", no_argument, &opts.preserve_uids, 0 }, > - { "perms", no_argument, &opts.preserve_perms, 1 }, > - { "no-perms", no_argument, &opts.preserve_perms, 0 }, > - { "numeric-ids", no_argument, &opts.numeric_ids, 1 }, > - { "recursive", no_argument, &opts.recursive, 1 }, > - { "no-recursive", no_argument, &opts.recursive, 0 }, > - { "specials", no_argument, &opts.specials, 1 }, > - { "no-specials", no_argument, &opts.specials, 0 }, > - { "timeout", required_argument, NULL, 5 }, > - { "times", no_argument, &opts.preserve_times, 1 }, > - { "no-times", no_argument, &opts.preserve_times, 0 }, > - { "verbose", no_argument, &verbose, 1 }, > - { "no-verbose", no_argument, &verbose, 0 }, > - { "address", required_argument, NULL, 4 }, > - { "no-motd", no_argument, NULL, 6 }, > - { NULL, 0, NULL, 0 }}; > - > /* Global pledge. */ > > if (pledge("stdio unix rpath wpath cpath dpath inet fattr chown dns > getpw proc exec unveil", > NULL) == -1) > err(ERR_IPC, "pledge"); > > - memset(&opts, 0, sizeof(struct opts)); > - > while ((c = getopt_long(argc, argv, "Dae:ghlnoprtvxz", lopts, NULL)) > != -1) { > switch (c) { > @@ -377,28 +383,25 @@ main(int argc, char *argv[]) > case 0: > /* Non-NULL flag values (e.g., --sender). */ > break; > - case 1: > - opts.rsync_path = optarg; > + case OP_ADDRESS: > + opts.address = optarg; > break; > - case 2: > - fprintf(stderr, "openrsync: protocol version %u\n", > - RSYNC_PROTOCOL); > - exit(0); > - case 3: > + case OP_PORT: > opts.port = optarg; > break; > - case 4: > - opts.address = optarg; > + case OP_RSYNCPATH: > + opts.rsync_path = optarg; > break; > - case 5: > + case OP_TIMEOUT: > poll_timeout = strtonum(optarg, 0, 60*60, &errstr); > if (errstr != NULL) > errx(ERR_SYNTAX, "timeout is %s: %s", > errstr, optarg); > break; > - case 6: > - opts.no_motd = 1; > - break; > + case OP_VERSION: > + fprintf(stderr, "openrsync: protocol version %u\n", > + RSYNC_PROTOCOL); > + exit(0); > case 'h': > default: > goto usage; >