adns_query qu;
void *qun_v;
adns_answer *answer;
- int r, maxfd;
+ int r, maxfd, invert;
fd_set readfds, writefds, exceptfds;
while ((arg= *++argv)) {
- if (arg[0] == '-') {
- if (arg[1] == '-') {
- oip= opt_findl(arg+2);
+ if (arg[0] == '-' || arg[0] == '+') {
+ if (arg[0] == '-' && arg[1] == '-') {
+ if (!strncmp(arg,"--no-",5)) {
+ invert= 1;
+ oip= opt_findl(arg+5);
+ } else {
+ invert= 0;
+ oip= opt_findl(arg+2);
+ }
if (oip->type == ot_funcarg) {
arg= *++argv;
if (!arg) usageerr("option --%s requires a value argument",oip->lopt);
} else {
arg= 0;
}
- opt_do(oip,arg);
- } else if (arg[1] == 0) {
+ opt_do(oip,arg,invert);
+ } else if (arg[0] == '-' && arg[1] == 0) {
arg= *++argv;
if (!arg) usageerr("option `-' must be followed by a domain");
domain_do_arg(arg);
} else { /* arg[1] != '-', != '\0' */
+ invert= (arg[0] == '+');
++arg;
while (*arg) {
oip= opt_finds(&arg);
arg= *++argv;
if (!arg) usageerr("option -%s requires a value argument",oip->sopt);
}
+ opt_do(oip,arg,invert);
arg= "";
} else {
- arg= 0;
+ opt_do(oip,0,invert);
}
- opt_do(oip,arg);
}
}
} else { /* arg[0] != '-' */
const struct optioninfo *opt_findl(const char *opt) { return find(&opt,"--",oc_long); }
const struct optioninfo *opt_finds(const char **optp) { return find(optp,"-",oc_short); }
-void opt_do(const struct optioninfo *oip, const char *arg) {
+static void noninvert(const struct optioninfo *oip) NONRETURNING;
+static void noninvert(const struct optioninfo *oip) {
+ usageerr("option %s%s%s%s%s may not be inverted",
+ oip->sopt ? "-" : "", oip->sopt ? oip->sopt : "",
+ oip->lopt && oip->sopt ? " / " : "",
+ oip->lopt ? "--" : "", oip->lopt ? oip->lopt : "");
+}
+
+void opt_do(const struct optioninfo *oip, const char *arg, int invert) {
switch (oip->type) {
- case ot_flag: case ot_value:
+ case ot_flag:
+ assert(!arg);
+ *oip->storep= invert ? !oip->value : oip->value;
+ return;
+ case ot_value:
assert(!arg);
+ if (invert) noninvert(oip);
*oip->storep= oip->value;
return;
case ot_func: case ot_funcarg:
- oip->func(oip,0);
+ if (invert) noninvert(oip);
+ oip->func(oip,arg);
return;
default:
abort();
st= answer->status;
nrrs= answer->nrrs;
if (ov_asynch) {
- if (printf("%s %d", qun->id, nrrs) == EOF) outerr();
+ if (printf("%s %d ", qun->id, nrrs) == EOF) outerr();
print_status(st,qun,answer);
} else {
if (st) {
- if (fputs("; failed",stdout) == EOF) outerr();
+ if (fputs("; failed ",stdout) == EOF) outerr();
print_status(st,qun,answer);
} else if (answer->cname) {
print_owner_ttl(qun,answer);
const struct optioninfo *opt_findl(const char *opt);
const struct optioninfo *opt_finds(const char **optp);
-void opt_do(const struct optioninfo *oip, const char *arg);
+void opt_do(const struct optioninfo *oip, const char *arg, int invert);
/* declarations related to query processing */