diff --git a/cmd/Makemodule.am b/cmd/Makemodule.am index f2c7d5f..78692d1 100644 --- a/cmd/Makemodule.am +++ b/cmd/Makemodule.am @@ -8,7 +8,7 @@ runsvc_SOURCES = cmd/runsvc/runsvc.c cmd/runsvc/env.c cmd/runsvc/runsvc.h runsvc_CPPFLAGS = $(AM_CPPFLAGS) runsvc_CFLAGS = $(AM_CFLAGS) runsvc_LDFLAGS = $(AM_LDFLAGS) -runsvc_LDADD = libinit.a libutil.a libcfg.a +runsvc_LDADD = libinit.a libcfg.a libutil.a killall5_SOURCES = cmd/killall5.c killall5_CPPFLAGS = $(AM_CPPFLAGS) @@ -24,7 +24,7 @@ service_SOURCES += $(SRVHEADERS) service_CPPFLAGS = $(AM_CPPFLAGS) service_CFLAGS = $(AM_CFLAGS) service_LDFLAGS = $(AM_LDFLAGS) -service_LDADD = libinit.a libutil.a libcfg.a +service_LDADD = libinit.a libcfg.a libutil.a if GCROND service_SOURCES += cmd/service/schedule.c diff --git a/cmd/runsvc/env.c b/cmd/runsvc/env.c index 1e73ee4..e58d803 100644 --- a/cmd/runsvc/env.c +++ b/cmd/runsvc/env.c @@ -86,17 +86,12 @@ static struct entry *list_from_file(void) { struct entry *list; rdline_t rd; - int fd; - fd = open(ENVFILE, O_RDONLY); - if (fd < 0) { - perror(ENVFILE); + if (rdline_init(&rd, AT_FDCWD, ENVFILE, 0, NULL)) return NULL; - } - rdline_init(&rd, fd, ENVFILE, 0, NULL); list = parse_list(&rd); - close(fd); + rdline_cleanup(&rd); return list; } diff --git a/crond/Makemodule.am b/crond/Makemodule.am index 6beeff1..fb52b9a 100644 --- a/crond/Makemodule.am +++ b/crond/Makemodule.am @@ -3,7 +3,7 @@ gcrond_SOURCES = crond/main.c crond/gcrond.h crond/runjob.c gcrond_CPPFLAGS = $(AM_CPPFLAGS) gcrond_CFLAGS = $(AM_CFLAGS) gcrond_LDFLAGS = $(AM_LDFLAGS) -gcrond_LDADD = libcron.a libutil.a libcfg.a +gcrond_LDADD = libcron.a libcfg.a libutil.a sbin_PROGRAMS += gcrond endif diff --git a/initd/Makemodule.am b/initd/Makemodule.am index e6260f5..8552e45 100644 --- a/initd/Makemodule.am +++ b/initd/Makemodule.am @@ -3,6 +3,6 @@ init_SOURCES += initd/status.c initd/supervisor.c init_CPPFLAGS = $(AM_CPPFLAGS) init_CFLAGS = $(AM_CFLAGS) init_LDFLAGS = $(AM_LDFLAGS) -init_LDADD = libinit.a libutil.a libcfg.a +init_LDADD = libinit.a libcfg.a libutil.a sbin_PROGRAMS += init diff --git a/lib/cron/rdcron.c b/lib/cron/rdcron.c index 520f969..8781a6f 100644 --- a/lib/cron/rdcron.c +++ b/lib/cron/rdcron.c @@ -473,21 +473,17 @@ static const cfg_param_t cron_params[] = { crontab_t *rdcron(int dirfd, const char *filename) { - crontab_t *cron; + crontab_t *cron = NULL; rdline_t rd; - int fd, ret; + int ret; - fd = openat(dirfd, filename, O_RDONLY); - if (fd < 0) { - perror(filename); + if (rdline_init(&rd, dirfd, filename, 0, NULL)) return NULL; - } cron = calloc(1, sizeof(*cron)); if (cron == NULL) { fputs("out of memory\n", stderr); - close(fd); - return NULL; + goto out; } cron->minute = 0xFFFFFFFFFFFFFFFFUL; @@ -496,12 +492,12 @@ crontab_t *rdcron(int dirfd, const char *filename) cron->month = 0xFFFF; cron->dayofweek = 0xFF; - rdline_init(&rd, fd, filename, 0, NULL); ret = rdcfg(cron, &rd, cron_params, ARRAY_SIZE(cron_params), 0); if (ret) { delcron(cron); cron = NULL; } +out: rdline_cleanup(&rd); return cron; } diff --git a/lib/include/libcfg.h b/lib/include/libcfg.h index 95f91a8..3e631d1 100644 --- a/lib/include/libcfg.h +++ b/lib/include/libcfg.h @@ -49,12 +49,14 @@ typedef struct { /* Initialize the config line scanner. - The scanner reads from the provided fd. The filename is used for - error reporting. An argument count and vector can be set for argument - substitution in rdline. + The scanner opens the filename relative to the passed dirfd. An + argument count and vector can be set for argument substitution + in rdline. + + Returns 0 on success. */ -void rdline_init(rdline_t *t, int fd, const char *filename, - int argc, const char *const *argv); +int rdline_init(rdline_t *t, int dirfd, const char *filename, + int argc, const char *const *argv); void rdline_cleanup(rdline_t *t); diff --git a/lib/init/rdsvc.c b/lib/init/rdsvc.c index ca60731..e8cb530 100644 --- a/lib/init/rdsvc.c +++ b/lib/init/rdsvc.c @@ -250,13 +250,6 @@ service_t *rdsvc(int dirfd, const char *filename, int flags) service_t *svc = NULL; size_t argc, nlen; rdline_t rd; - int fd; - - fd = openat(dirfd, filename, O_RDONLY); - if (fd < 0) { - perror(filename); - return NULL; - } arg = strchr(filename, '@'); if (arg != NULL) { @@ -266,6 +259,9 @@ service_t *rdsvc(int dirfd, const char *filename, int flags) argc = 0; } + if (rdline_init(&rd, dirfd, filename, argc, args)) + return NULL; + nlen = (arg != NULL) ? (size_t)(arg - filename) : strlen(filename); svc = calloc(1, sizeof(*svc) + nlen + 1); @@ -280,18 +276,16 @@ service_t *rdsvc(int dirfd, const char *filename, int flags) memcpy(svc->name, filename, nlen); - rdline_init(&rd, fd, filename, argc, args); - - if (rdcfg(svc, &rd, svc_params, ARRAY_SIZE(svc_params), flags)) { - delsvc(svc); - svc = NULL; - } + if (rdcfg(svc, &rd, svc_params, ARRAY_SIZE(svc_params), flags)) + goto fail; +out: rdline_cleanup(&rd); return svc; fail_oom: fputs("out of memory\n", stderr); +fail: delsvc(svc); - close(fd); - return NULL; + svc = NULL; + goto out; } diff --git a/lib/libcfg/rdline.c b/lib/libcfg/rdline.c index dbb3069..b0cd789 100644 --- a/lib/libcfg/rdline.c +++ b/lib/libcfg/rdline.c @@ -23,15 +23,23 @@ #include #include "libcfg.h" +#include "util.h" -void rdline_init(rdline_t *t, int fd, const char *filename, - int argc, const char *const *argv) +int rdline_init(rdline_t *t, int dirfd, const char *filename, + int argc, const char *const *argv) { memset(t, 0, sizeof(*t)); - t->fp = fdopen(fd, "r"); + + t->fp = fopenat(dirfd, filename, "r"); + if (t->fp == NULL) { + perror(filename); + return -1; + } + t->filename = filename; t->argc = argc; t->argv = argv; + return 0; } void rdline_cleanup(rdline_t *t)