[launchd-changes] [23070] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 15 10:26:23 PST 2007
Revision: 23070
http://trac.macosforge.org/projects/launchd/changeset/23070
Author: zarzycki at apple.com
Date: 2007-02-15 10:26:22 -0800 (Thu, 15 Feb 2007)
Log Message:
-----------
<rdar://problem/5001306> poweroff() API to wrap reboot()
Modified Paths:
--------------
trunk/launchd/src/Makefile.am
trunk/launchd/src/Makefile.in
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/libvproc.c
trunk/launchd/src/protocol_job.defs
Added Paths:
-----------
trunk/launchd/src/poweroff.h
Modified: trunk/launchd/src/Makefile.am
===================================================================
--- trunk/launchd/src/Makefile.am 2007-02-15 16:12:48 UTC (rev 23069)
+++ trunk/launchd/src/Makefile.am 2007-02-15 18:26:22 UTC (rev 23070)
@@ -89,6 +89,7 @@
mkdir -p $(DESTDIR)/usr/local/include
cp $(srcdir)/liblaunch_private.h $(DESTDIR)/usr/local/include/launch_priv.h
cp $(srcdir)/libvproc_private.h $(DESTDIR)/usr/local/include/vproc_priv.h
+ cp $(srcdir)/poweroff.h $(DESTDIR)/usr/local/include/poweroff.h
mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d
mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d
mkdir -p $(DESTDIR)/Library/LaunchDaemons
Modified: trunk/launchd/src/Makefile.in
===================================================================
--- trunk/launchd/src/Makefile.in 2007-02-15 16:12:48 UTC (rev 23069)
+++ trunk/launchd/src/Makefile.in 2007-02-15 18:26:22 UTC (rev 23070)
@@ -1103,6 +1103,7 @@
@LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/local/include
@LIBS_ONLY_FALSE@ cp $(srcdir)/liblaunch_private.h $(DESTDIR)/usr/local/include/launch_priv.h
@LIBS_ONLY_FALSE@ cp $(srcdir)/libvproc_private.h $(DESTDIR)/usr/local/include/vproc_priv.h
+ at LIBS_ONLY_FALSE@ cp $(srcdir)/poweroff.h $(DESTDIR)/usr/local/include/poweroff.h
@LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d
@LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d
@LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchDaemons
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-02-15 16:12:48 UTC (rev 23069)
+++ trunk/launchd/src/launchd_core_logic.c 2007-02-15 18:26:22 UTC (rev 23070)
@@ -80,6 +80,8 @@
#include "libvproc_public.h"
#include "libvproc_internal.h"
+#include "poweroff.h"
+
#include "launchd.h"
#include "launchd_runtime.h"
#include "launchd_unix_ipc.h"
@@ -201,7 +203,7 @@
char *jm_stdout;
char *jm_stderr;
unsigned int global_on_demand_cnt;
- unsigned int transfer_bstrap:1, sent_stop_to_hopeful_jobs:1, shutting_down:1;
+ unsigned int transfer_bstrap:1, sent_stop_to_hopeful_jobs:1, shutting_down:1, power_cycle:1;
char name[0];
};
@@ -586,7 +588,7 @@
SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle);
jobmgr_tickle(jm->parentmgr);
} else if (getpid() == 1) {
- jobmgr_assumes(jm, reboot(RB_HALT) != -1);
+ jobmgr_assumes(jm, reboot(jm->power_cycle ? RB_AUTOBOOT : RB_HALT) != -1);
} else {
exit(EXIT_SUCCESS);
}
@@ -4111,6 +4113,30 @@
}
kern_return_t
+job_mig_poweroff(job_t j, uint64_t flags)
+{
+ struct ldcred ldc;
+
+ if (getpid() != 1) {
+ return BOOTSTRAP_NOT_PRIVILEGED;
+ }
+
+ runtime_get_caller_creds(&ldc);
+
+ if (ldc.euid) {
+ return BOOTSTRAP_NOT_PRIVILEGED;
+ }
+
+ if (flags & POWEROFF_RESET) {
+ root_jobmgr->power_cycle = true;
+ }
+
+ launchd_shutdown();
+
+ return 0;
+}
+
+kern_return_t
job_mig_set_integer(job_t j, get_set_int_key_t key, int64_t val)
{
kern_return_t kr = 0;
Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c 2007-02-15 16:12:48 UTC (rev 23069)
+++ trunk/launchd/src/libvproc.c 2007-02-15 18:26:22 UTC (rev 23070)
@@ -36,6 +36,8 @@
#include "protocol_vproc.h"
+#include "poweroff.h"
+
kern_return_t
_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
@@ -217,6 +219,34 @@
return (vproc_err_t)__vproc_tag_loginwindow_context;
}
+void *
+poweroff(uint64_t flags)
+{
+ mach_port_t parent_port = 0;
+ mach_port_t previous_port = 0;
+
+ do {
+ if (previous_port) {
+ mach_port_deallocate(mach_task_self(), previous_port);
+ previous_port = parent_port;
+ } else {
+ previous_port = bootstrap_port;
+ }
+
+ if (bootstrap_parent(previous_port, &parent_port) != 0) {
+ goto out_bad;
+ }
+
+ } while (parent_port != previous_port);
+
+ if (vproc_mig_poweroff(parent_port, flags) == 0) {
+ return NULL;
+ }
+
+out_bad:
+ return poweroff;
+}
+
vproc_err_t
_vproc_set_global_on_demand(bool state)
{
Added: trunk/launchd/src/poweroff.h
===================================================================
--- trunk/launchd/src/poweroff.h (rev 0)
+++ trunk/launchd/src/poweroff.h 2007-02-15 18:26:22 UTC (rev 23070)
@@ -0,0 +1,36 @@
+#ifndef _POWEROFF_H_
+#define _POWEROFF_H_
+/*
+ * Copyright (c) 2007 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+#include <sys/cdefs.h>
+#include <stdint.h>
+
+__BEGIN_DECLS
+
+#define POWEROFF_RESET 1
+
+/* Returns NULL on success. Not NULL on failure */
+
+__attribute__((visibility("default"))) void *poweroff(uint64_t flags);
+
+__END_DECLS
+
+#endif
Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs 2007-02-15 16:12:48 UTC (rev 23069)
+++ trunk/launchd/src/protocol_job.defs 2007-02-15 18:26:22 UTC (rev 23070)
@@ -41,7 +41,9 @@
__on_demand : boolean_t;
out __server_port : mach_port_make_send_t);
-skip; /* Last used in 10.4. Was bootstrap_unprivileged() */
+routine poweroff(
+ __bs_port : job_t;
+ __flags : uint64_t);
routine check_in(
__bs_port : job_t;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070215/20d01ba6/attachment.html
More information about the launchd-changes
mailing list