X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/27ed20f7a086fa62e84d4cdac278555e70b207eb..fd4893155d5226d32f350d15cc3e29beec677f39:/options.c diff --git a/options.c b/options.c index 64ee6651..166faf85 100644 --- a/options.c +++ b/options.c @@ -303,7 +303,8 @@ void usage(enum logcode F) enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM, OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_LINK_DEST, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, - OPT_READ_BATCH, OPT_WRITE_BATCH}; + OPT_READ_BATCH, OPT_WRITE_BATCH, + OPT_REFUSED_BASE = 9000}; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ @@ -425,9 +426,15 @@ static void set_refuse_options(char *bp) while (1) { if ((cp = strchr(bp, ' ')) != NULL) *cp= '\0'; - for (op = long_options; op->longName; op++) { + for (op = long_options; ; op++) { + if (!op->longName) { + rprintf(FLOG, + "Unknown option %s in \"refuse options\" setting\n", + bp); + break; + } if (strcmp(bp, op->longName) == 0) { - op->val = -(op - long_options) - 1; + op->val = (op - long_options)+OPT_REFUSED_BASE; break; } } @@ -571,10 +578,11 @@ int parse_arguments(int *argc, const char ***argv, int frommain) #endif default: - /* A negative opt value means that set_refuse_options() - * turned this option off (-opt-1 is its index). */ - if (opt < 0) { - struct poptOption *op = &long_options[-opt-1]; + /* A large opt value means that set_refuse_options() + * turned this option off (opt-BASE is its index). */ + if (opt >= OPT_REFUSED_BASE) { + struct poptOption *op = + &long_options[opt-OPT_REFUSED_BASE]; int n = snprintf(err_buf, sizeof err_buf, "This server does not support --%s\n", op->longName) - 1;