Submitting final version of this patch, if we have any activity around deciding it we want to parse the options more strictly they can be addressed separately. - Stefan On Sun, Apr 30, 2017 at 1:53 PM Stefan Sedich wrote: > Currently glibc supports using the RES_OPTIONS environment variable > to customize the resolv.conf options on a per-process basis, this > adds the same support to musl > --- > Changed in v4: > - apply feedback from Alexander > > src/network/resolvconf.c | 48 > ++++++++++++++++++++++++++++++------------------ > 1 file changed, 30 insertions(+), 18 deletions(-) > > diff --git a/src/network/resolvconf.c b/src/network/resolvconf.c > index 4c3e4c4b..16ca395f 100644 > --- a/src/network/resolvconf.c > +++ b/src/network/resolvconf.c > @@ -5,6 +5,30 @@ > #include > #include > > +void __parse_resolv_opts(struct resolvconf *conf, const char *opts) > +{ > + char *p, *z; > + > + p = strstr(opts, "ndots:"); > + if (p && isdigit(p[6])) { > + p += 6; > + unsigned long x = strtoul(p, &z, 10); > + if (z != p) conf->ndots = x > 15 ? 15 : x; > + } > + p = strstr(opts, "attempts:"); > + if (p && isdigit(p[9])) { > + p += 9; > + unsigned long x = strtoul(p, &z, 10); > + if (z != p) conf->attempts = x > 10 ? 10 : x; > + } > + p = strstr(opts, "timeout:"); > + if (p && (isdigit(p[8]) || p[8]=='.')) { > + p += 8; > + unsigned long x = strtoul(p, &z, 10); > + if (z != p) conf->timeout = x > 60 ? 60 : x; > + } > +} > + > int __get_resolv_conf(struct resolvconf *conf, char *search, size_t > search_sz) > { > char line[256]; > @@ -38,24 +62,7 @@ int __get_resolv_conf(struct resolvconf *conf, char > *search, size_t search_sz) > continue; > } > if (!strncmp(line, "options", 7) && isspace(line[7])) { > - p = strstr(line, "ndots:"); > - if (p && isdigit(p[6])) { > - p += 6; > - unsigned long x = strtoul(p, &z, 10); > - if (z != p) conf->ndots = x > 15 ? 15 : x; > - } > - p = strstr(line, "attempts:"); > - if (p && isdigit(p[9])) { > - p += 9; > - unsigned long x = strtoul(p, &z, 10); > - if (z != p) conf->attempts = x > 10 ? 10 : > x; > - } > - p = strstr(line, "timeout:"); > - if (p && (isdigit(p[8]) || p[8]=='.')) { > - p += 8; > - unsigned long x = strtoul(p, &z, 10); > - if (z != p) conf->timeout = x > 60 ? 60 : > x; > - } > + __parse_resolv_opts(conf, line); > continue; > } > if (!strncmp(line, "nameserver", 10) && isspace(line[10])) > { > @@ -89,5 +96,10 @@ no_resolv_conf: > > conf->nns = nns; > > + if (!libc.secure) { > + const char *opts = getenv("RES_OPTIONS"); > + if (opts) __parse_resolv_opts(conf, opts); > + } > + > return 0; > } > -- > 2.11.0 > >