📄 lwconfig.c
字号:
* Search and domain are mutually exclusive. */ for (i = 0; i < LWRES_CONFMAXSEARCH; i++) { if (confdata->search[i] != NULL) { CTXFREE(confdata->search[i], strlen(confdata->search[i])+1); confdata->search[i] = NULL; } } confdata->searchnxt = 0; confdata->domainname = lwres_strdup(ctx, word); if (confdata->domainname == NULL) return (LWRES_R_FAILURE); return (LWRES_R_SUCCESS);}static lwres_result_tlwres_conf_parsesearch(lwres_context_t *ctx, FILE *fp) { int idx, delim; char word[LWRES_CONFMAXLINELEN]; lwres_conf_t *confdata; confdata = &ctx->confdata; if (confdata->domainname != NULL) { /* * Search and domain are mutually exclusive. */ CTXFREE(confdata->domainname, strlen(confdata->domainname) + 1); confdata->domainname = NULL; } /* * Remove any previous search definitions. */ for (idx = 0; idx < LWRES_CONFMAXSEARCH; idx++) { if (confdata->search[idx] != NULL) { CTXFREE(confdata->search[idx], strlen(confdata->search[idx])+1); confdata->search[idx] = NULL; } } confdata->searchnxt = 0; delim = getword(fp, word, sizeof(word)); if (strlen(word) == 0U) return (LWRES_R_FAILURE); /* Nothing else on line. */ idx = 0; while (strlen(word) > 0U) { if (confdata->searchnxt == LWRES_CONFMAXSEARCH) goto ignore; /* Too many domains. */ confdata->search[idx] = lwres_strdup(ctx, word); if (confdata->search[idx] == NULL) return (LWRES_R_FAILURE); idx++; confdata->searchnxt++; ignore: if (delim == EOF || delim == '\n') break; else delim = getword(fp, word, sizeof(word)); } return (LWRES_R_SUCCESS);}static lwres_result_tlwres_create_addr(const char *buffer, lwres_addr_t *addr, int convert_zero) { struct in_addr v4; struct in6_addr v6; if (lwres_net_aton(buffer, &v4) == 1) { if (convert_zero) { unsigned char zeroaddress[] = {0, 0, 0, 0}; unsigned char loopaddress[] = {127, 0, 0, 1}; if (memcmp(&v4, zeroaddress, 4) == 0) memcpy(&v4, loopaddress, 4); } addr->family = LWRES_ADDRTYPE_V4; addr->length = NS_INADDRSZ; memcpy((void *)addr->address, &v4, NS_INADDRSZ); } else if (lwres_net_pton(AF_INET6, buffer, &v6) == 1) { addr->family = LWRES_ADDRTYPE_V6; addr->length = NS_IN6ADDRSZ; memcpy((void *)addr->address, &v6, NS_IN6ADDRSZ); } else { return (LWRES_R_FAILURE); /* Unrecognised format. */ } return (LWRES_R_SUCCESS);}static lwres_result_tlwres_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_tlwres_conf_parseoption(lwres_context_t *ctx, FILE *fp) { int delim; long ndots; char *p; char word[LWRES_CONFMAXLINELEN]; lwres_conf_t *confdata; REQUIRE(ctx != NULL); 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 (strcmp("debug", word) == 0) { confdata->resdebug = 1; } else if (strcmp("no_tld_query", word) == 0) { confdata->no_tld_query = 1; } else if (strncmp("ndots:", word, 6) == 0) { ndots = strtol(word + 6, &p, 10); if (*p != '\0') /* Bad string. */ return (LWRES_R_FAILURE); if (ndots < 0 || ndots > 0xff) /* Out of range. */ return (LWRES_R_FAILURE); confdata->ndots = (lwres_uint8_t)ndots; } if (delim == EOF || delim == '\n') break; else delim = getword(fp, word, sizeof(word)); } return (LWRES_R_SUCCESS);}lwres_result_tlwres_conf_parse(lwres_context_t *ctx, const char *filename) { FILE *fp = NULL; char word[256]; lwres_result_t rval, ret; lwres_conf_t *confdata; int stopchar; REQUIRE(ctx != NULL); confdata = &ctx->confdata; REQUIRE(filename != NULL); REQUIRE(strlen(filename) > 0U); REQUIRE(confdata != NULL); errno = 0; if ((fp = fopen(filename, "r")) == NULL) return (LWRES_R_FAILURE); ret = LWRES_R_SUCCESS; do { stopchar = getword(fp, word, sizeof(word)); if (stopchar == EOF) { rval = LWRES_R_SUCCESS; break; } if (strlen(word) == 0U) rval = LWRES_R_SUCCESS; else if (strcmp(word, "nameserver") == 0) rval = lwres_conf_parsenameserver(ctx, fp); else if (strcmp(word, "lwserver") == 0) rval = lwres_conf_parselwserver(ctx, fp); else if (strcmp(word, "domain") == 0) rval = lwres_conf_parsedomain(ctx, fp); else if (strcmp(word, "search") == 0) rval = lwres_conf_parsesearch(ctx, fp); else if (strcmp(word, "sortlist") == 0) rval = lwres_conf_parsesortlist(ctx, fp); else if (strcmp(word, "options") == 0) rval = lwres_conf_parseoption(ctx, fp); else { /* unrecognised word. Ignore entire line */ rval = LWRES_R_SUCCESS; stopchar = eatline(fp); if (stopchar == EOF) { break; } } if (ret == LWRES_R_SUCCESS && rval != LWRES_R_SUCCESS) ret = rval; } while (1); fclose(fp); return (ret);}lwres_result_tlwres_conf_print(lwres_context_t *ctx, FILE *fp) { int i; int af; char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; const char *p; lwres_conf_t *confdata; lwres_addr_t tmpaddr; REQUIRE(ctx != NULL); confdata = &ctx->confdata; REQUIRE(confdata->nsnext <= LWRES_CONFMAXNAMESERVERS); for (i = 0; i < confdata->nsnext; i++) { af = lwresaddr2af(confdata->nameservers[i].family); p = lwres_net_ntop(af, confdata->nameservers[i].address, tmp, sizeof(tmp)); if (p != tmp) return (LWRES_R_FAILURE); fprintf(fp, "nameserver %s\n", tmp); } for (i = 0; i < confdata->lwnext; i++) { af = lwresaddr2af(confdata->lwservers[i].family); p = lwres_net_ntop(af, confdata->lwservers[i].address, tmp, sizeof(tmp)); if (p != tmp) return (LWRES_R_FAILURE); fprintf(fp, "lwserver %s\n", tmp); } if (confdata->domainname != NULL) { fprintf(fp, "domain %s\n", confdata->domainname); } else if (confdata->searchnxt > 0) { REQUIRE(confdata->searchnxt <= LWRES_CONFMAXSEARCH); fprintf(fp, "search"); for (i = 0; i < confdata->searchnxt; i++) fprintf(fp, " %s", confdata->search[i]); fputc('\n', fp); } REQUIRE(confdata->sortlistnxt <= LWRES_CONFMAXSORTLIST); if (confdata->sortlistnxt > 0) { fputs("sortlist", fp); for (i = 0; i < confdata->sortlistnxt; i++) { af = lwresaddr2af(confdata->sortlist[i].addr.family); p = lwres_net_ntop(af, confdata->sortlist[i].addr.address, tmp, sizeof(tmp)); if (p != tmp) return (LWRES_R_FAILURE); fprintf(fp, " %s", tmp); tmpaddr = confdata->sortlist[i].mask; memset(&tmpaddr.address, 0xff, tmpaddr.length); if (memcmp(&tmpaddr.address, confdata->sortlist[i].mask.address, confdata->sortlist[i].mask.length) != 0) { af = lwresaddr2af( confdata->sortlist[i].mask.family); p = lwres_net_ntop (af, confdata->sortlist[i].mask.address, tmp, sizeof(tmp)); if (p != tmp) return (LWRES_R_FAILURE); fprintf(fp, "/%s", tmp); } } fputc('\n', fp); } if (confdata->resdebug) fprintf(fp, "options debug\n"); if (confdata->ndots > 0) fprintf(fp, "options ndots:%d\n", confdata->ndots); if (confdata->no_tld_query) fprintf(fp, "options no_tld_query\n"); return (LWRES_R_SUCCESS);}lwres_conf_t *lwres_conf_get(lwres_context_t *ctx) { REQUIRE(ctx != NULL); return (&ctx->confdata);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -