[v2,BZ,#14799] Allow to disable options in RES_OPTIONS
Commit Message
On Wed, Nov 26, 2014 at 11:06:23AM +0100, Andreas Schwab wrote:
> Ondřej Bílka <neleai@seznam.cz> writes:
>
> > + int invert = 0;
> > + if (strncmp (cp, "no-", 3))
> > + {
> > + cp += 3;
> > + invert = 1;
> > + }
> > +
> > for (i = 0; i < noptions; ++i)
> > if (strncmp (cp, options[i].str, options[i].len) == 0)
> > {
> > - if (options[i].clear)
> > - statp->options &= options[i].flag;
> > + if (options[i].clear ^ invert)
> > + statp->options &= options[i].flag ^ invert;
> > else
> > - statp->options |= options[i].flag;
> > + statp->options |= options[i].flag ^ invert;
>
> That doesn't work.
>
Oops, somewhat included older patch. I meant to send this.
[BZ #14799]
* resolv/res_init.c (res_setoptions): Detect no- prefix to
disable option.
Comments
ping.
On Thu, Nov 27, 2014 at 04:37:40PM +0100, wizard wrote:
> On Wed, Nov 26, 2014 at 11:06:23AM +0100, Andreas Schwab wrote:
> > Ondřej Bílka <neleai@seznam.cz> writes:
> >
> > > + int invert = 0;
> > > + if (strncmp (cp, "no-", 3))
> > > + {
> > > + cp += 3;
> > > + invert = 1;
> > > + }
> > > +
> > > for (i = 0; i < noptions; ++i)
> > > if (strncmp (cp, options[i].str, options[i].len) == 0)
> > > {
> > > - if (options[i].clear)
> > > - statp->options &= options[i].flag;
> > > + if (options[i].clear ^ invert)
> > > + statp->options &= options[i].flag ^ invert;
> > > else
> > > - statp->options |= options[i].flag;
> > > + statp->options |= options[i].flag ^ invert;
> >
> > That doesn't work.
> >
> Oops, somewhat included older patch. I meant to send this.
>
> [BZ #14799]
> * resolv/res_init.c (res_setoptions): Detect no- prefix to
> disable option.
>
> diff --git a/resolv/res_init.c b/resolv/res_init.c
> index ea133f8..9ea43e9 100644
> --- a/resolv/res_init.c
> +++ b/resolv/res_init.c
> @@ -533,26 +533,32 @@ res_setoptions(res_state statp, const char *options, const char *source) {
> #define STRnLEN(str) str, sizeof (str) - 1
> { STRnLEN ("inet6"), 0, RES_USE_INET6 },
> { STRnLEN ("ip6-bytestring"), 0, RES_USEBSTRING },
> - { STRnLEN ("no-ip6-dotint"), 0, RES_NOIP6DOTINT },
> { STRnLEN ("ip6-dotint"), 1, ~RES_NOIP6DOTINT },
> { STRnLEN ("rotate"), 0, RES_ROTATE },
> - { STRnLEN ("no-check-names"), 0, RES_NOCHECKNAME },
> + { STRnLEN ("check-names"), 1, ~RES_NOCHECKNAME },
> { STRnLEN ("edns0"), 0, RES_USE_EDNS0 },
> { STRnLEN ("single-request-reopen"), 0, RES_SNGLKUPREOP },
> { STRnLEN ("single-request"), 0, RES_SNGLKUP },
> { STRnLEN ("no_tld_query"), 0, RES_NOTLDQUERY },
> - { STRnLEN ("no-tld-query"), 0, RES_NOTLDQUERY },
> + { STRnLEN ("tld-query"), 1, ~RES_NOTLDQUERY },
> { STRnLEN ("use-vc"), 0, RES_USEVC }
> };
> #define noptions (sizeof (options) / sizeof (options[0]))
> int i;
> + unsigned long int invert = 0;
> + if (strncmp (cp, "no-", 3) == 0)
> + {
> + cp += 3;
> + invert = ~0;
> + }
> +
> for (i = 0; i < noptions; ++i)
> if (strncmp (cp, options[i].str, options[i].len) == 0)
> {
> - if (options[i].clear)
> - statp->options &= options[i].flag;
> + if (options[i].clear ^ invert)
> + statp->options &= options[i].flag ^ invert;
> else
> - statp->options |= options[i].flag;
> + statp->options |= options[i].flag ^ invert;
> break;
> }
> if (i == noptions) {
That doesn't work.
Andreas.
@@ -533,26 +533,32 @@ res_setoptions(res_state statp, const char *options, const char *source) {
#define STRnLEN(str) str, sizeof (str) - 1
{ STRnLEN ("inet6"), 0, RES_USE_INET6 },
{ STRnLEN ("ip6-bytestring"), 0, RES_USEBSTRING },
- { STRnLEN ("no-ip6-dotint"), 0, RES_NOIP6DOTINT },
{ STRnLEN ("ip6-dotint"), 1, ~RES_NOIP6DOTINT },
{ STRnLEN ("rotate"), 0, RES_ROTATE },
- { STRnLEN ("no-check-names"), 0, RES_NOCHECKNAME },
+ { STRnLEN ("check-names"), 1, ~RES_NOCHECKNAME },
{ STRnLEN ("edns0"), 0, RES_USE_EDNS0 },
{ STRnLEN ("single-request-reopen"), 0, RES_SNGLKUPREOP },
{ STRnLEN ("single-request"), 0, RES_SNGLKUP },
{ STRnLEN ("no_tld_query"), 0, RES_NOTLDQUERY },
- { STRnLEN ("no-tld-query"), 0, RES_NOTLDQUERY },
+ { STRnLEN ("tld-query"), 1, ~RES_NOTLDQUERY },
{ STRnLEN ("use-vc"), 0, RES_USEVC }
};
#define noptions (sizeof (options) / sizeof (options[0]))
int i;
+ unsigned long int invert = 0;
+ if (strncmp (cp, "no-", 3) == 0)
+ {
+ cp += 3;
+ invert = ~0;
+ }
+
for (i = 0; i < noptions; ++i)
if (strncmp (cp, options[i].str, options[i].len) == 0)
{
- if (options[i].clear)
- statp->options &= options[i].flag;
+ if (options[i].clear ^ invert)
+ statp->options &= options[i].flag ^ invert;
else
- statp->options |= options[i].flag;
+ statp->options |= options[i].flag ^ invert;
break;
}
if (i == noptions) {