Revision
23039
Author
zarzycki@apple.com
Date
2007-02-07 13:07:49 -0800 (Wed, 07 Feb 2007)

Log Message

Clean up. Now if we can properly make our reflector threads go away, we should be able to go to single user mode again. :-)

Modified Paths

Diff

Modified: trunk/launchd/src/launchd.c (23038 => 23039)


--- trunk/launchd/src/launchd.c	2007-02-07 20:19:36 UTC (rev 23038)
+++ trunk/launchd/src/launchd.c	2007-02-07 21:07:49 UTC (rev 23039)
@@ -300,11 +300,11 @@
 	 * to skip it.
 	 */
 	if (!h && stat(ldconf, &sb) == 0) {
-		job_dispatch(rlcj, true);
+		rlcj = job_dispatch(rlcj, true);
 	}
 
 	if (fbj) {
-		job_dispatch(fbj, true);
+		fbj = job_dispatch(fbj, true);
 	}
 
 	char *doom_why = "at instruction";
@@ -474,24 +474,15 @@
 void
 launchd_single_user(void)
 {
-	int tries;
+	syslog(LOG_NOTICE, "Going to single-user mode");
 
+	re_exec_in_single_user_mode = true;
+
 	launchd_shutdown();
 
-	kill(-1, SIGTERM);
+	sleep(3);
 
-	for (tries = 0; tries < 10; tries++) {
-		sleep(1);
-		if (kill(-1, 0) == -1 && errno == ESRCH) {
-			goto out;
-		}
-	}
-
-	syslog(LOG_WARNING, "Gave up waiting for processes to exit while going to single user mode, sending SIGKILL");
 	kill(-1, SIGKILL);
-
-out:
-	re_exec_in_single_user_mode = true;
 }
 
 static void signal_callback(void *obj __attribute__((unused)), struct kevent *kev)
@@ -501,7 +492,7 @@
 	switch (kev->ident) {
 	case SIGHUP:
 		if (rlcj) {
-			job_dispatch(rlcj, true);
+			rlcj = job_dispatch(rlcj, true);
 		}
 		break;
 	case SIGTERM:
@@ -691,6 +682,7 @@
 			exit(EXIT_SUCCESS);
 		} else if (re_exec_in_single_user_mode) {
 			re_exec_in_single_user_mode = false;
+			kill(-1, SIGKILL); /* One last time, just to clear the room */
 			launchd_assumes(execl("/sbin/launchd", "/sbin/launchd", "-s", NULL) != -1);
 		}
 	}