Commit a60c9ef8 authored by Yang Tse's avatar Yang Tse
Browse files

Improved parsing of resolver configuration files

parent 4e3d235e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
  Changelog for the c-ares project

* May 5 2008 (Yang Tse)

- Improved parsing of resolver configuration files.

* April 4 2008 (Daniel Stenberg)

- Eino Tuominen improved the code when a file is used to seed the randomizer.
+2 −2
Original line number Diff line number Diff line
This is what's new and changed in the c-ares 1.5.2 release:

 o 
 o improved parsing of resolver configuration files

Thanks go to these friendly people for their efforts and contributions:

 
 Yang Tse

Have fun!
+52 −7
Original line number Diff line number Diff line
@@ -1245,16 +1245,61 @@ static int set_options(ares_channel channel, const char *str)
static char *try_config(char *s, const char *opt)
{
  size_t len;
  ssize_t i;
  ssize_t j;
  char *p;

  len = strlen(opt);
  if (strncmp(s, opt, len) != 0 || !ISSPACE(s[len]))
  if (!s || !opt)
    /* no line or no option */
    return NULL;

  /* trim line comment */
  for (i = 0; s[i] && s[i] != '#'; ++i);
  s[i] = '\0';

  /* trim trailing whitespace */
  for (j = i-1; j >= 0 && ISSPACE(s[j]); --j);
  s[++j] = '\0';

  /* skip leading whitespace */
  for (i = 0; s[i] && ISSPACE(s[i]); ++i);
  p = &s[i];

  if (!*p)
    /* empty line */
    return NULL;

  if ((len = strlen(opt)) == 0)
    /* empty option */
    return NULL;

  if (strncmp(p, opt, len) != 0)
    /* line and option do not match */
    return NULL;
  s += len;
  while (ISSPACE(*s))
    s++;
  return s;
}

  /* skip over given option name */
  p += len;

  if (!*p)
    /* no option value */
    return NULL;

  if ((opt[len-1] != ':') && (opt[len-1] != '=') && !ISSPACE(*p))
    /* whitespace between option name and value is mandatory
       for given option names which do not end with ':' or '=' */
    return NULL;

  /* skip over whitespace */
  while (*p && ISSPACE(*p))
    p++;

  if (!*p)
    /* no option value */
    return NULL;

  /* return pointer to option value */
  return p;
}
#endif

static const char *try_option(const char *p, const char *q, const char *opt)