diff options
Diffstat (limited to 'src/libs6dns')
-rw-r--r-- | src/libs6dns/s6dns_hosts_init.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/libs6dns/s6dns_hosts_init.c b/src/libs6dns/s6dns_hosts_init.c index d3cd863..762d738 100644 --- a/src/libs6dns/s6dns_hosts_init.c +++ b/src/libs6dns/s6dns_hosts_init.c @@ -1,5 +1,6 @@ /* ISC license. */ +#include <string.h> #include <unistd.h> #include <errno.h> #include <stdlib.h> @@ -11,16 +12,15 @@ #include <s6-dns/hosts.h> -int s6dns_hosts_init (void) +int s6dns_hosts_init_r (cdb *c, char const *txtfile, char const *cdbfile, char const *tmpprefix) { - int fdr, fdw ; - char tmp[24] = "/tmp/hosts.cdb:XXXXXX" ; - int fdc = openc_read("/etc/hosts.cdb") ; + int fdr ; + int fdc = openc_read(cdbfile) ; if (fdc >= 0) { struct stat stc, str ; if (fstat(fdc, &stc) == -1) goto errc ; - if (stat("/etc/hosts", &str) == -1) + if (stat(txtfile, &str) == -1) { if (errno == ENOENT) goto useit ; else goto errc ; @@ -28,21 +28,29 @@ int s6dns_hosts_init (void) if (stc.st_mtim > str.st_mtim) goto useit ; fd_close(fdc) ; } - fdr = openc_read("/etc/hosts") ; + + fdr = openc_read(txtfile) ; if (fdr == -1) return errno == ENOENT ? (errno = 0, 0) : -1 ; - fdw = mkstemp(tmp) ; - if (fdw == -1) goto errr ; - if (!s6dns_hosts_compile(fdr, fdw)) goto errw ; - if (lseek(fdw, 0, SEEK_SET) == -1) goto errw ; - if (!cdb_init_fromfd(&s6dns_hosts_here, fdw)) goto errw ; - fd_close(fdw) ; - unlink_void(tmp) ; - fd_close(fdr) ; - return 1 ; + { + int fdw ; + size_t len = strlen(tmpprefix) ; + char tmp[len + 8] ; + memcpy(tmp, tmpprefix, len) ; + memcpy(tmp + len, ":XXXXXX", 8) ; + fdw = mkstemp(tmp) ; + if (fdw == -1) goto errr ; + if (!s6dns_hosts_compile(fdr, fdw)) goto errw ; + if (lseek(fdw, 0, SEEK_SET) == -1) goto errw ; + if (!cdb_init_fromfd(c, fdw)) goto errw ; + fd_close(fdw) ; + unlink_void(tmp) ; + fd_close(fdr) ; + return 1 ; - errw: - fd_close(fdw) ; - unlink_void(tmp) ; + errw: + fd_close(fdw) ; + unlink_void(tmp) ; + } errr: fd_close(fdr) ; return -1 ; @@ -52,7 +60,7 @@ int s6dns_hosts_init (void) return -1 ; useit: - if (!cdb_init_fromfd(&s6dns_hosts_here, fdc)) + if (!cdb_init_fromfd(c, fdc)) { fd_close(fdc) ; return 0 ; |