Revision: 23039 http://trac.macosforge.org/projects/launchd/changeset/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: -------------- trunk/launchd/src/launchd.c Modified: trunk/launchd/src/launchd.c =================================================================== --- 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); } }
participants (1)
-
source_changes@macosforge.org