/* * Unix SMB/CIFS implementation. * Internal DNS query structures * Copyright (C) Volker Lendecke 2018 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include "replace.h" #include #include #include "libcli/dns/resolvconf.h" #include "lib/util/memory.h" int parse_resolvconf_fp( FILE *fp, TALLOC_CTX *mem_ctx, char ***pnameservers, size_t *pnum_nameservers) { char *line = NULL; char **nameservers = NULL; size_t num_nameservers = 0; int ret = 0; while (true) { char *saveptr, *option, *ns; char **tmp; ssize_t n; size_t len; n = getline(&line, &len, fp); if (n < 0) { if (!feof(fp)) { /* real error */ ret = errno; } break; } if ((n > 0) && (line[n-1] == '\n')) { line[n-1] = '\0'; } if ((line[0] == '#') || (line[0] == ';')) { continue; } option = strtok_r(line, " \t", &saveptr); if (option == NULL) { continue; } if (strcmp(option, "nameserver") != 0) { continue; } ns = strtok_r(NULL, " \t", &saveptr); if (ns == NULL) { continue; } tmp = talloc_realloc( mem_ctx, nameservers, char *, num_nameservers+1); if (tmp == NULL) { ret = ENOMEM; break; } nameservers = tmp; nameservers[num_nameservers] = talloc_strdup(nameservers, ns); if (nameservers[num_nameservers] == NULL) { ret = ENOMEM; break; } num_nameservers += 1; } SAFE_FREE(line); if (ret == 0) { *pnameservers = nameservers; *pnum_nameservers = num_nameservers; } else { TALLOC_FREE(nameservers); } return ret; } int parse_resolvconf( const char *resolvconf, TALLOC_CTX *mem_ctx, char ***pnameservers, size_t *pnum_nameservers) { FILE *fp; int ret; fp = fopen(resolvconf ? resolvconf : "/etc/resolv.conf", "r"); if (fp == NULL) { return errno; } ret = parse_resolvconf_fp(fp, mem_ctx, pnameservers, pnum_nameservers); fclose(fp); return ret; }