diff --git a/plugins/pidfile.c b/plugins/pidfile.c index e2a55023..b525952f 100644 --- a/plugins/pidfile.c +++ b/plugins/pidfile.c @@ -138,8 +138,8 @@ static void pidfile_handle_dir(struct iwatch *iw, char *dir, char *name, int mas if (mask & IN_CREATE) { if (!iwp) { - pidfile_add_path(iw, path); - pidfile_scandir(iw, path, sizeof(path)); + if (!pidfile_add_path(iw, path)) + pidfile_scandir(iw, path, sizeof(path)); } } else if (mask & IN_DELETE) { if (iwp) @@ -265,9 +265,9 @@ static void pidfile_init(void *arg) * * service /sbin/dropbear ... * - * Which provides the condition, will not be - * set by pidfile.so during `initctl reload` because dropbear is - * still SIGSTP:ed waiting for . + * Which provides the condition, will not be set by + * pidfile.so during `initctl reload` because dropbear is still + * SIGSTP:ed waiting for . */ static plugin_t plugin = { .name = __FILE__, diff --git a/src/cond-w.c b/src/cond-w.c index d748e10a..e5f7456e 100644 --- a/src/cond-w.c +++ b/src/cond-w.c @@ -71,7 +71,6 @@ char *mkcond(svc_t *svc, char *buf, size_t len) char ident[sizeof(svc->name) + sizeof(svc->id) + 2]; snprintf(buf, len, "pid/%s", svc_ident(svc, ident, sizeof(ident))); - _d("Created condition => %s", buf); return buf; } @@ -243,7 +242,6 @@ void cond_reload(void) _d(""); cond_bump_reconf(); - cond_update(NULL); } static int reassert(const char *fpath, const struct stat *sb, int tflg, struct FTW *ftw) diff --git a/src/conf.c b/src/conf.c index 0b68aa7f..8cec98d7 100644 --- a/src/conf.c +++ b/src/conf.c @@ -626,7 +626,7 @@ static int parse_conf(char *file) _d("%s", line); parse_static(line); - parse_dynamic(line, global_rlimit, NULL); + parse_dynamic(line, global_rlimit, file); } fclose(fp); diff --git a/src/iwatch.c b/src/iwatch.c index 48bedea1..ee241a66 100644 --- a/src/iwatch.c +++ b/src/iwatch.c @@ -48,7 +48,7 @@ int iwatch_init(struct iwatch *iw) iw->fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC); if (iw->fd < 0) { - _pe("inotify_init()"); + _pe("Failed creating inotify descriptor"); return -1; } initialized = 1; @@ -90,7 +90,7 @@ int iwatch_add(struct iwatch *iw, char *file, uint32_t mask) wd = inotify_add_watch(iw->fd, path, IWATCH_MASK | mask); if (wd < 0) { - _pe("inotify_add_watch(%s)", path); + _pe("Failed adding watcher for %s", path); free(path); return -1; } diff --git a/src/iwatch.h b/src/iwatch.h index b59c3fb9..adff92a3 100644 --- a/src/iwatch.h +++ b/src/iwatch.h @@ -29,9 +29,16 @@ #include #include +#ifndef IN_MASK_CREATE +#define IN_MASK_CREATE 0x10000000 /* since Linux 4.18 */ +#endif -/* Monitors changes to both directories and files by default */ -#define IWATCH_MASK (IN_CREATE | IN_DELETE | IN_MODIFY | IN_ATTRIB | IN_MOVE) +/* + * Monitors changes to both directories and files by default, but only + * add watcher once (IN_MASK_CREATE) to avoid clobbering any already + * monitored paths. + */ +#define IWATCH_MASK (IN_CREATE | IN_DELETE | IN_MODIFY | IN_ATTRIB | IN_MOVE | IN_MASK_CREATE) struct iwatch_path { TAILQ_ENTRY(iwatch_path) link; diff --git a/src/service.c b/src/service.c index 25452d60..eaa3d551 100644 --- a/src/service.c +++ b/src/service.c @@ -1107,6 +1107,7 @@ int service_register(int type, char *cfg, struct rlimit rlimit[], char *file) else svc_mark_clean(svc); + /* for finit native services only, e.g. plugins/hotplug.c */ if (!file) svc->protect = 1;