diff options
author | Leah Neukirchen <leah@vuxu.org> | 2023-11-26 17:50:57 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2023-11-26 17:50:57 +0100 |
commit | f7e7e62419c456e01ca777bf0d5465f2be6aea98 (patch) | |
tree | 178c87591166189f47c80ccef4e3f8bc6b535ffa | |
parent | b31f4ac85374ca52b6625a3f8b891b75a4f0137f (diff) | |
download | nitro-f7e7e62419c456e01ca777bf0d5465f2be6aea98.tar.gz nitro-f7e7e62419c456e01ca777bf0d5465f2be6aea98.tar.xz nitro-f7e7e62419c456e01ca777bf0d5465f2be6aea98.zip |
add oneshots, which do nothing yet
-rw-r--r-- | nitro.c | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/nitro.c b/nitro.c index 6a9a027..7998bb5 100644 --- a/nitro.c +++ b/nitro.c @@ -37,6 +37,7 @@ enum process_state { PROC_DOWN = 1, PROC_STARTING, PROC_UP, + PROC_ONESHOT, PROC_SHUTDOWN, PROC_RESTART, PROC_FATAL, @@ -95,9 +96,30 @@ steprn(char *dst, char *end, const char *fmt, ...) return r > end - dst ? end : dst + r; } +int +stat_slash(const char *dir, const char *name, struct stat *st) +{ + char buf[PATH_MAX]; + + snprintf(buf, sizeof buf, "%s/%s", dir, name); + + return stat(buf, st); +} + void proc_launch(int i) { + struct stat st; + if (stat_slash(services[i].name, "run", &st) < 0 && errno == ENOENT) { + services[i].pid = 0; + services[i].startstop = time_now(); + services[i].state = PROC_ONESHOT; + services[i].timeout = 0; + services[i].deadline = 0; + + return; + } + unsigned char status; int alivepipefd[2]; if (pipe(alivepipefd) < 0) @@ -218,6 +240,7 @@ process_step(int i, enum process_events ev) if (global_state != GLBL_UP) break; switch (services[i].state) { + case PROC_ONESHOT: case PROC_STARTING: case PROC_UP: case PROC_RESTART: @@ -247,6 +270,7 @@ process_step(int i, enum process_events ev) case PROC_FATAL: case PROC_DELAY: + case PROC_ONESHOT: services[i].state = PROC_DOWN; services[i].timeout = 0; services[i].deadline = 0; @@ -269,6 +293,12 @@ process_step(int i, enum process_events ev) services[i].state = PROC_RESTART; break; + case PROC_ONESHOT: + services[i].state = PROC_DELAY; + services[i].timeout = 1000; + services[i].deadline = 0; + break; + case PROC_DOWN: case PROC_FATAL: case PROC_DELAY: @@ -304,8 +334,9 @@ process_step(int i, enum process_events ev) break; case PROC_DOWN: /* can't happen */ - case PROC_FATAL: /* can't happen */ - case PROC_DELAY: /* can't happen */ + case PROC_FATAL: /* can't happen */ + case PROC_DELAY: /* can't happen */ + case PROC_ONESHOT: /* can't happen */ assert(!"invalid state transition"); break; } @@ -332,6 +363,7 @@ process_step(int i, enum process_events ev) case PROC_UP: case PROC_DOWN: case PROC_FATAL: + case PROC_ONESHOT: assert(!"invalid timeout handler"); break; } @@ -428,20 +460,15 @@ rescan(int first) fcntl(globallog[1], F_SETFD, FD_CLOEXEC); } - char buf[PATH_MAX]; - - if (first) { - snprintf(buf, sizeof buf, "%s/down", name); - if (stat(buf, &st) == 0) { - services[i].state = PROC_DOWN; - services[i].timeout = 0; - } + if (first && stat_slash(name, "down", &st) == 0) { + services[i].state = PROC_DOWN; + services[i].timeout = 0; } + char buf[PATH_MAX]; snprintf(buf, sizeof buf, "%s/log", name); - printf("buf=%s\n" ,buf); - if (stat(buf, &st) == 0 && S_ISDIR(st.st_mode)) { + if (stat_slash(name, "log", &st) == 0 && S_ISDIR(st.st_mode)) { printf("SCAN %s\n", buf); int j = add_service(buf); services[j].islog = 1; @@ -541,6 +568,7 @@ proc_state_str(enum process_state state) case PROC_RESTART: return "RESTART"; case PROC_FATAL: return "FATAL"; case PROC_DELAY: return "DELAY"; + case PROC_ONESHOT: return "ONESHOT"; } assert(!"unreachable"); |