static lwres_result_t lwres_conf_parsesortlist(lwres_context_t *ctx, FILE *fp) { int delim, res, idx; char word[LWRES_CONFMAXLINELEN]; char *p; lwres_conf_t *confdata; confdata = &ctx->confdata; delim = getword(fp, word, sizeof(word)); if (strlen(word) == 0U) return (LWRES_R_FAILURE); /* Empty line after keyword. */ while (strlen(word) > 0U) { if (confdata->sortlistnxt == LWRES_CONFMAXSORTLIST) return (LWRES_R_FAILURE); /* Too many values. */ p = strchr(word, '/'); if (p != NULL) *p++ = '\0'; idx = confdata->sortlistnxt; res = lwres_create_addr(word, &confdata->sortlist[idx].addr, 1); if (res != LWRES_R_SUCCESS) return (res); if (p != NULL) { res = lwres_create_addr(p, &confdata->sortlist[idx].mask, 0); if (res != LWRES_R_SUCCESS) return (res); } else { /* * Make up a mask. */ confdata->sortlist[idx].mask = confdata->sortlist[idx].addr; memset(&confdata->sortlist[idx].mask.address, 0xff, confdata->sortlist[idx].addr.length); } confdata->sortlistnxt++; if (delim == EOF || delim == '\n') break; else delim = getword(fp, word, sizeof(word)); } return (LWRES_R_SUCCESS); }
static lwres_result_t lwres_conf_parselwserver(lwres_context_t *ctx, FILE *fp) { char word[LWRES_CONFMAXLINELEN]; int res; lwres_conf_t *confdata; confdata = &ctx->confdata; if (confdata->lwnext == LWRES_CONFMAXLWSERVERS) return (LWRES_R_SUCCESS); res = getword(fp, word, sizeof(word)); if (strlen(word) == 0U) return (LWRES_R_FAILURE); /* Nothing on line. */ else if (res == ' ' || res == '\t') res = eatwhite(fp); if (res != EOF && res != '\n') return (LWRES_R_FAILURE); /* Extra junk on line. */ res = lwres_create_addr(word, &confdata->lwservers[confdata->lwnext++], 1); if (res != LWRES_R_SUCCESS) return (res); return (LWRES_R_SUCCESS); }
static lwres_result_t lwres_conf_parsenameserver(lwres_context_t *ctx, FILE *fp) { char word[LWRES_CONFMAXLINELEN]; int res; lwres_conf_t *confdata; lwres_addr_t address; confdata = &ctx->confdata; if (confdata->nsnext == LWRES_CONFMAXNAMESERVERS) return (LWRES_R_SUCCESS); res = getword(fp, word, sizeof(word)); if (strlen(word) == 0U) return (LWRES_R_FAILURE); /* Nothing on line. */ else if (res == ' ' || res == '\t') res = eatwhite(fp); if (res != EOF && res != '\n') return (LWRES_R_FAILURE); /* Extra junk on line. */ res = lwres_create_addr(word, &address, 1); if (res == LWRES_R_SUCCESS && ((address.family == LWRES_ADDRTYPE_V4 && ctx->use_ipv4 == 1) || (address.family == LWRES_ADDRTYPE_V6 && ctx->use_ipv6 == 1))) { confdata->nameservers[confdata->nsnext++] = address; } return (LWRES_R_SUCCESS); }
static lwres_result_t lwres_conf_parsenameserver(lwres_context_t *ctx, FILE *fp) { char word[LWRES_CONFMAXLINELEN]; char pbuf[NI_MAXSERV]; char *cp, *q; const char *errstr; lwres_uint16_t port; int res; lwres_conf_t *confdata; lwres_addr_t address; confdata = &ctx->confdata; if (confdata->nsnext == LWRES_CONFMAXNAMESERVERS) return (LWRES_R_SUCCESS); res = getword(fp, word, sizeof(word)); if (strlen(word) == 0U) return (LWRES_R_FAILURE); /* Nothing on line. */ else if (res == ' ' || res == '\t') res = eatwhite(fp); if (res != EOF && res != '\n') return (LWRES_R_FAILURE); /* Extra junk on line. */ /* Handle addresses enclosed in [] * (adapted from lib/libc/net/res_init.c) */ *pbuf = '\0'; cp = word; if (*cp == '[') { cp++; if ((q = strchr(cp, ']')) == NULL) return (LWRES_R_FAILURE); *q++ = '\0'; /* Extract port, if specified */ if (*q++ == ':') { if (strlcpy(pbuf, q, sizeof(pbuf)) >= sizeof(pbuf)) return (LWRES_R_FAILURE); } } if (*pbuf != '\0') { port = strtonum(pbuf, 1, 65535, &errstr); if (errstr) return (LWRES_R_FAILURE); } else { port = NAMESERVER_PORT; } res = lwres_create_addr(cp, &address, 1); if (res == LWRES_R_SUCCESS) { confdata->nameservers[confdata->nsnext] = address; confdata->nameserverports[confdata->nsnext++] = port; } return (LWRES_R_SUCCESS); }
lwres_result_t lwres_conf_parse(lwres_context_t *ctx, const char *filename) { lwres_result_t ret; lwres_conf_t *confdata; FIXED_INFO * FixedInfo; ULONG BufLen = sizeof(FIXED_INFO); DWORD dwRetVal; IP_ADDR_STRING *pIPAddr; REQUIRE(ctx != NULL); confdata = &ctx->confdata; REQUIRE(confdata != NULL); /* Use the resolver if there is one */ ret = generic_lwres_conf_parse(ctx, filename); if ((ret != LWRES_R_NOTFOUND && ret != LWRES_R_SUCCESS) || (ret == LWRES_R_SUCCESS && confdata->nsnext > 0)) return (ret); /* * We didn't get any nameservers so we need to do this ourselves */ FixedInfo = (FIXED_INFO *) GlobalAlloc(GPTR, BufLen); dwRetVal = GetNetworkParams(FixedInfo, &BufLen); if (dwRetVal == ERROR_BUFFER_OVERFLOW) { GlobalFree(FixedInfo); FixedInfo = GlobalAlloc(GPTR, BufLen); dwRetVal = GetNetworkParams(FixedInfo, &BufLen); } if (dwRetVal != ERROR_SUCCESS) { GlobalFree(FixedInfo); return (LWRES_R_FAILURE); } /* Get the search list from the registry */ get_win32_searchlist(ctx); /* Use only if there is no search list */ if (confdata->searchnxt == 0 && strlen(FixedInfo->DomainName) > 0) { confdata->domainname = lwres_strdup(ctx, FixedInfo->DomainName); if (confdata->domainname == NULL) { GlobalFree(FixedInfo); return (LWRES_R_FAILURE); } } else confdata->domainname = NULL; /* Get the list of nameservers */ pIPAddr = &FixedInfo->DnsServerList; while (pIPAddr) { if (confdata->nsnext >= LWRES_CONFMAXNAMESERVERS) break; ret = lwres_create_addr(pIPAddr->IpAddress.String, &confdata->nameservers[confdata->nsnext++], 1); if (ret != LWRES_R_SUCCESS) { GlobalFree(FixedInfo); return (ret); } pIPAddr = pIPAddr ->Next; } GlobalFree(FixedInfo); return (LWRES_R_SUCCESS); }