about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2023-12-23 00:33:47 +0100
committerLeah Neukirchen <leah@vuxu.org>2023-12-23 00:33:47 +0100
commitfb20a155ca63b4701284e584424018d7bb3aaeab (patch)
tree72d1069f4e64099a9f306d7d0e8e29dfde63ba80
parent23b054269d8a3be98dcef42de16fb652f1964c2e (diff)
downloadnitro-fb20a155ca63b4701284e584424018d7bb3aaeab.tar.gz
nitro-fb20a155ca63b4701284e584424018d7bb3aaeab.tar.xz
nitro-fb20a155ca63b4701284e584424018d7bb3aaeab.zip
add rc.boot
-rw-r--r--nitro.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/nitro.c b/nitro.c
index 1cb4c4a..c86f5a0 100644
--- a/nitro.c
+++ b/nitro.c
@@ -585,7 +585,7 @@ find_service(char *name)
 }
 
 int
-add_service(char *name)
+add_service(const char *name)
 {
 	int i;
 	for (i = 0; i < max_service; i++)
@@ -629,6 +629,10 @@ rescan(int first)
 		if (!S_ISDIR(st.st_mode))
 			continue;
 
+		// ignore magic boot service
+		if (strcmp(name, "rc.boot") == 0)
+			continue;
+
 		printf("SCAN %s\n", name);
 
 		int i = add_service(name);
@@ -826,7 +830,10 @@ handle_control_sock() {
 	case 'd':
 	case 'r':
 	{
+		struct stat st;
 		int i = find_service(buf + 1);
+		if (stat(buf + 1, &st) == 0)
+			i = add_service(buf + 1);
 		if (i < 0)
 			goto fail;
 
@@ -890,6 +897,14 @@ has_died(pid_t pid, int status)
 				services[i].deadline = 0;
 			}
 
+			if (strcmp(services[i].name, "rc.boot") == 0) {
+				services[i].seen = 0;
+				proc_cleanup(i);
+				proc_zap(i);
+				// bring up rest of the services
+				rescan(1);
+			}
+
 			return;
 		}
 
@@ -1068,7 +1083,15 @@ main(int argc, char *argv[])
 
 	global_state = GLBL_UP;
 
-	rescan(1);
+	{
+		struct stat st;
+		if (stat("rc.boot", &st) == 0) {
+			int b = add_service("rc.boot");
+			process_step(b, EVNT_WANT_UP);
+		} else {
+			rescan(1);
+		}
+	}
 
 	struct pollfd fds[3];
 	fds[CHLD].fd = selfpipe[0];