summaryrefslogtreecommitdiff
path: root/src/libs6dns/s6dns_hosts_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs6dns/s6dns_hosts_init.c')
-rw-r--r--src/libs6dns/s6dns_hosts_init.c46
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 ;