This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PING][PATCH v2][BZ #14799] Allow to disable options in RES_OPTIONS
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: Andreas Schwab <schwab at linux-m68k dot org>
- Cc: libc-alpha at sourceware dot org
- Date: Sun, 21 Dec 2014 17:56:35 +0100
- Subject: Re: [PING][PATCH v2][BZ #14799] Allow to disable options in RES_OPTIONS
- Authentication-results: sourceware.org; auth=none
- References: <20141126001713 dot GA27914 at domone> <87a93eqns0 dot fsf at igel dot home> <20141127153740 dot GA10402 at domone> <20141206203813 dot GA19633 at domone> <87fvcs33o6 dot fsf at igel dot home> <20141221155320 dot GA32563 at domone> <87zjah2dfi dot fsf at igel dot home>
On Sun, Dec 21, 2014 at 05:08:33PM +0100, Andreas Schwab wrote:
> OndÅej BÃlka <neleai@seznam.cz> writes:
>
> > Do you have testcase that shows that?
>
> I don't need a testcase. (options[i].clear ^ invert) is obviously
> always nonzero.
>
Like when you pass inet6 there and options[i].clear == 0 and invert = 0?
But it needs update clear format to match invert.
diff --git a/resolv/res_init.c b/resolv/res_init.c
index d492a08..039116a 100644
--- a/resolv/res_init.c
+++ b/resolv/res_init.c
@@ -527,32 +527,38 @@ res_setoptions(res_state statp, const char *options, const char *source) {
{
char str[22];
uint8_t len;
- uint8_t clear;
+ unsigned long clear;
unsigned long int flag;
} options[] = {
#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 ("ip6-dotint"), ~0, ~RES_NOIP6DOTINT },
{ STRnLEN ("rotate"), 0, RES_ROTATE },
- { STRnLEN ("no-check-names"), 0, RES_NOCHECKNAME },
+ { STRnLEN ("check-names"), ~0, ~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"), ~0, ~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) {