Modified: trunk/launchd/src/Makefile.am (22938 => 22939)
--- trunk/launchd/src/Makefile.am 2006-11-07 01:31:33 UTC (rev 22938)
+++ trunk/launchd/src/Makefile.am 2006-11-09 16:13:53 UTC (rev 22939)
@@ -37,7 +37,7 @@
sysconf_DATA = hostconfig rc.common rc.netboot rc.shutdown
launchctl_CFLAGS = $(AM_CFLAGS) -I/System/Library/Frameworks/System.framework/PrivateHeaders
-launchctl_LDFLAGS = -framework CoreFoundation -weak_library /usr/lib/libedit.dylib
+launchctl_LDFLAGS = -framework CoreFoundation -framework IOKit -weak_library /usr/lib/libedit.dylib
SystemStarter_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS)
SystemStarter_LDFLAGS = -framework CoreFoundation
Modified: trunk/launchd/src/Makefile.in (22938 => 22939)
--- trunk/launchd/src/Makefile.in 2006-11-07 01:31:33 UTC (rev 22938)
+++ trunk/launchd/src/Makefile.in 2006-11-09 16:13:53 UTC (rev 22939)
@@ -238,7 +238,7 @@
@LIBS_ONLY_FALSE@sbin_SCRIPTS = service
@LIBS_ONLY_FALSE@sysconf_DATA = hostconfig rc.common rc.netboot rc.shutdown
@LIBS_ONLY_FALSE@launchctl_CFLAGS = $(AM_CFLAGS) -I/System/Library/Frameworks/System.framework/PrivateHeaders
-@LIBS_ONLY_FALSE@launchctl_LDFLAGS = -framework CoreFoundation -weak_library /usr/lib/libedit.dylib
+@LIBS_ONLY_FALSE@launchctl_LDFLAGS = -framework CoreFoundation -framework IOKit -weak_library /usr/lib/libedit.dylib
@LIBS_ONLY_FALSE@SystemStarter_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS)
@LIBS_ONLY_FALSE@SystemStarter_LDFLAGS = -framework CoreFoundation
@LIBS_ONLY_FALSE@SystemStarter_SOURCES = StartupItems.c IPC.c SystemStarter.c
Modified: trunk/launchd/src/launchctl.c (22938 => 22939)
--- trunk/launchd/src/launchctl.c 2006-11-07 01:31:33 UTC (rev 22938)
+++ trunk/launchd/src/launchctl.c 2006-11-09 16:13:53 UTC (rev 22939)
@@ -22,6 +22,7 @@
#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFPriv.h>
+#include <IOKit/IOKitLib.h>
#include <NSSystemDirectories.h>
#include <mach/mach.h>
#include <sys/types.h>
@@ -58,6 +59,8 @@
#include <paths.h>
#include <utmp.h>
#include <utmpx.h>
+#include <bootfiles.h>
+#include <sysexits.h>
#include "libbootstrap_public.h"
#include "libvproc_internal.h"
@@ -133,6 +136,7 @@
static void workaround4465949(void);
static void do_application_firewall_magic(int sfd, launch_data_t thejob);
static void preheat_page_cache_hack(void);
+static void do_bootroot_magic(void);
static int bootstrap_cmd(int argc, char *const argv[]);
static int load_and_unload_cmd(int argc, char *const argv[]);
@@ -1202,6 +1206,8 @@
do_potential_fsck();
}
+ do_bootroot_magic();
+
if (path_check("/var/account/acct")) {
assumes(acct("/var/account/acct") != -1);
}
@@ -2762,3 +2768,42 @@
closedir(thedir);
}
+
+
+void
+do_bootroot_magic(void)
+{
+ const char *kextcache_tool[] = { "kextcache", "-U", "/", NULL };
+ CFTypeRef bootrootProp;
+ io_service_t chosen;
+ int wstatus;
+ pid_t p;
+
+ chosen = IORegistryEntryFromPath(kIOMasterPortDefault, "IODeviceTree:/chosen");
+
+ if (!assumes(chosen)) {
+ return;
+ }
+
+ bootrootProp = IORegistryEntryCreateCFProperty(chosen, CFSTR(kBootRootActiveKey), kCFAllocatorDefault, 0);
+
+ IOObjectRelease(chosen);
+
+ if (!bootrootProp) {
+ return;
+ }
+
+ CFRelease(bootrootProp);
+
+ if (!assumes((p = fwexec(kextcache_tool, false)) != -1)) {
+ return;
+ }
+
+ if (!assumes(waitpid(p, &wstatus, 0) != -1)) {
+ return;
+ }
+
+ if (!WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == EX_OSFILE) {
+ assumes(reboot(RB_AUTOBOOT) != -1);
+ }
+}