[launchd-changes] [23097] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 22 10:22:47 PST 2007
Revision: 23097
http://trac.macosforge.org/projects/launchd/changeset/23097
Author: zarzycki at apple.com
Date: 2007-02-22 10:22:46 -0800 (Thu, 22 Feb 2007)
Log Message:
-----------
<rdar://problem/5016362> Step one of 4746572 (seatbelt stuff)
Modified Paths:
--------------
trunk/launchd/src/Makefile.am
trunk/launchd/src/Makefile.in
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/libbootstrap.c
trunk/launchd/src/protocol_job.defs
Added Paths:
-----------
trunk/launchd/src/libbootstrap_private.h
Modified: trunk/launchd/src/Makefile.am
===================================================================
--- trunk/launchd/src/Makefile.am 2007-02-22 01:34:11 UTC (rev 23096)
+++ trunk/launchd/src/Makefile.am 2007-02-22 18:22:46 UTC (rev 23097)
@@ -70,22 +70,23 @@
install-data-hook:
mkdir -p $(DESTDIR)/usr/libexec
+ mkdir -p $(DESTDIR)/usr/include/servers
+ mkdir -p $(DESTDIR)/usr/local/include
+ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d
+ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d
+ mkdir -p $(DESTDIR)/Library/LaunchDaemons
+ mkdir -p $(DESTDIR)/Library/LaunchAgents
+ mkdir -p $(DESTDIR)/System/Library/LaunchAgents
+ mkdir -p $(DESTDIR)/System/Library/LaunchDaemons
cp $(srcdir)/StartupItemContext $(DESTDIR)/usr/libexec
- mkdir -p $(DESTDIR)/usr/include/servers
cp $(srcdir)/liblaunch_public.h $(DESTDIR)/usr/include/launch.h
cp $(srcdir)/libvproc_public.h $(DESTDIR)/usr/include/vproc.h
cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap.h
cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap_defs.h
- mkdir -p $(DESTDIR)/usr/local/include
+ cp $(srcdir)/libbootstrap_private.h $(DESTDIR)/usr/local/include/bootstrap_priv.h
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)/reboot2.h $(DESTDIR)/usr/local/include/reboot2.h
- mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d
- mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d
- mkdir -p $(DESTDIR)/Library/LaunchDaemons
- mkdir -p $(DESTDIR)/Library/LaunchAgents
- mkdir -p $(DESTDIR)/System/Library/LaunchAgents
- mkdir -p $(DESTDIR)/System/Library/LaunchDaemons
cp $(srcdir)/com.apple.SystemStarter.plist $(DESTDIR)/System/Library/LaunchDaemons
endif
Modified: trunk/launchd/src/Makefile.in
===================================================================
--- trunk/launchd/src/Makefile.in 2007-02-22 01:34:11 UTC (rev 23096)
+++ trunk/launchd/src/Makefile.in 2007-02-22 18:22:46 UTC (rev 23097)
@@ -1060,22 +1060,23 @@
@LIBS_ONLY_FALSE at install-data-hook:
@LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/libexec
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/include/servers
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/local/include
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchDaemons
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchAgents
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/System/Library/LaunchAgents
+ at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/System/Library/LaunchDaemons
@LIBS_ONLY_FALSE@ cp $(srcdir)/StartupItemContext $(DESTDIR)/usr/libexec
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/include/servers
@LIBS_ONLY_FALSE@ cp $(srcdir)/liblaunch_public.h $(DESTDIR)/usr/include/launch.h
@LIBS_ONLY_FALSE@ cp $(srcdir)/libvproc_public.h $(DESTDIR)/usr/include/vproc.h
@LIBS_ONLY_FALSE@ cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap.h
@LIBS_ONLY_FALSE@ cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap_defs.h
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/local/include
+ at LIBS_ONLY_FALSE@ cp $(srcdir)/libbootstrap_private.h $(DESTDIR)/usr/local/include/bootstrap_priv.h
@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
@LIBS_ONLY_FALSE@ cp $(srcdir)/reboot2.h $(DESTDIR)/usr/local/include/reboot2.h
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchDaemons
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchAgents
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/System/Library/LaunchAgents
- at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/System/Library/LaunchDaemons
@LIBS_ONLY_FALSE@ cp $(srcdir)/com.apple.SystemStarter.plist $(DESTDIR)/System/Library/LaunchDaemons
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-02-22 01:34:11 UTC (rev 23096)
+++ trunk/launchd/src/launchd_core_logic.c 2007-02-22 18:22:46 UTC (rev 23097)
@@ -76,6 +76,7 @@
#include "liblaunch_public.h"
#include "liblaunch_private.h"
#include "libbootstrap_public.h"
+#include "libbootstrap_private.h"
#include "libvproc_public.h"
#include "libvproc_internal.h"
@@ -101,14 +102,14 @@
SLIST_ENTRY(machservice) sle;
job_t job;
mach_port_name_t port;
- unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, must_match_uid:1, debug_on_close:1;
+ unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, must_match_uid:1, debug_on_close:1, per_pid:1;
char name[0];
};
static void machservice_setup(launch_data_t obj, const char *key, void *context);
static void machservice_setup_options(launch_data_t obj, const char *key, void *context);
static void machservice_resetport(job_t j, struct machservice *ms);
-static struct machservice *machservice_new(job_t j, const char *name, mach_port_t *serviceport);
+static struct machservice *machservice_new(job_t j, const char *name, mach_port_t *serviceport, bool pid_local);
static void machservice_ignore(job_t j, struct machservice *ms);
static void machservice_watch(job_t j, struct machservice *ms);
static void machservice_delete(struct machservice *);
@@ -223,7 +224,7 @@
static void jobmgr_callback(void *obj, struct kevent *kev);
static pid_t jobmgr_fork(jobmgr_t jm);
static void jobmgr_setup_env_from_other_jobs(jobmgr_t jm);
-static struct machservice *jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent);
+static struct machservice *jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent, pid_t target_pid);
static void jobmgr_logv(jobmgr_t jm, int pri, int err, const char *msg, va_list ap) __attribute__((format(printf, 4, 0)));
static void jobmgr_log(jobmgr_t jm, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4)));
/* static void jobmgr_log_error(jobmgr_t jm, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); */
@@ -3097,7 +3098,7 @@
}
struct machservice *
-machservice_new(job_t j, const char *name, mach_port_t *serviceport)
+machservice_new(job_t j, const char *name, mach_port_t *serviceport, bool pid_local)
{
struct machservice *ms;
@@ -3107,6 +3108,7 @@
strcpy(ms->name, name);
ms->job = j;
+ ms->per_pid = pid_local;
if (*serviceport == MACH_PORT_NULL) {
if (!job_assumes(j, launchd_mport_create_recv(&ms->port) == KERN_SUCCESS)) {
@@ -3236,12 +3238,12 @@
struct machservice *ms;
mach_port_t p = MACH_PORT_NULL;
- if ((ms = jobmgr_lookup_service(j->mgr, key, false))) {
+ if ((ms = jobmgr_lookup_service(j->mgr, key, false, 0))) {
job_log(j, LOG_WARNING, "Conflict with job: %s over Mach service: %s", ms->job->label, key);
return;
}
- if ((ms = machservice_new(j, key, &p)) == NULL) {
+ if ((ms = machservice_new(j, key, &p, false)) == NULL) {
job_log_error(j, LOG_WARNING, "Cannot add service: %s", key);
return;
}
@@ -3516,13 +3518,23 @@
}
struct machservice *
-jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent)
+jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent, pid_t target_pid)
{
struct machservice *ms;
job_t ji;
+ if (target_pid) {
+ jobmgr_assumes(jm, !check_parent);
+ }
+
TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ if (target_pid && (ji->p != target_pid)) {
+ continue;
+ }
SLIST_FOREACH(ms, &ji->machservices, sle) {
+ if (target_pid && !ms->per_pid) {
+ continue;
+ }
if (strcmp(name, ms->name) == 0) {
return ms;
}
@@ -3537,7 +3549,7 @@
return NULL;
}
- return jobmgr_lookup_service(jm->parentmgr, name, true);
+ return jobmgr_lookup_service(jm->parentmgr, name, true, 0);
}
mach_port_t
@@ -4270,7 +4282,7 @@
ji->mach_uid = which_user;
- if ((ms = machservice_new(ji, lbuf, up_cont)) == NULL) {
+ if ((ms = machservice_new(ji, lbuf, up_cont, false)) == NULL) {
job_remove(ji);
return BOOTSTRAP_NO_MEMORY;
}
@@ -4301,7 +4313,7 @@
runtime_get_caller_creds(&ldc);
- ms = jobmgr_lookup_service(j->mgr, servicename, true);
+ ms = jobmgr_lookup_service(j->mgr, servicename, true, 0);
if (ms == NULL) {
job_log(j, LOG_DEBUG, "Check-in of Mach service failed. Unknown: %s", servicename);
@@ -4329,7 +4341,7 @@
}
kern_return_t
-job_mig_register(job_t j, name_t servicename, mach_port_t serviceport)
+job_mig_register2(job_t j, name_t servicename, mach_port_t serviceport, uint64_t flags)
{
struct machservice *ms;
struct ldcred ldc;
@@ -4344,7 +4356,7 @@
job_log(j, LOG_NOTICE, "bootstrap_register() is deprecated. PID: %u Service: %s", ldc.pid, servicename);
#endif
- job_log(j, LOG_DEBUG, "Mach service registration attempt: %s", servicename);
+ job_log(j, LOG_DEBUG, "%sMach service registration attempt: %s", flags & BOOTSTRAP_PER_PID_SERVICE ? "Per PID " : "", servicename);
/*
* From a per-user/session launchd's perspective, SecurityAgent (UID
@@ -4359,7 +4371,7 @@
}
}
- ms = jobmgr_lookup_service(j->mgr, servicename, false);
+ ms = jobmgr_lookup_service(j->mgr, servicename, false, flags & BOOTSTRAP_PER_PID_SERVICE ? ldc.pid : 0);
if (ms) {
if (machservice_job(ms) != j) {
@@ -4374,7 +4386,7 @@
}
if (serviceport != MACH_PORT_NULL) {
- if ((ms = machservice_new(j, servicename, &serviceport))) {
+ if ((ms = machservice_new(j, servicename, &serviceport, flags & BOOTSTRAP_PER_PID_SERVICE ? true : false))) {
machservice_request_notifications(ms);
} else {
return BOOTSTRAP_NO_MEMORY;
@@ -4385,7 +4397,7 @@
}
kern_return_t
-job_mig_look_up(job_t j, name_t servicename, mach_port_t *serviceportp, mach_msg_type_name_t *ptype)
+job_mig_look_up2(job_t j, name_t servicename, mach_port_t *serviceportp, mach_msg_type_name_t *ptype, pid_t target_pid, uint64_t flags)
{
struct machservice *ms;
struct ldcred ldc;
@@ -4400,7 +4412,11 @@
return VPROC_ERR_TRY_PER_USER;
}
- ms = jobmgr_lookup_service(j->mgr, servicename, true);
+ if (flags & BOOTSTRAP_PER_PID_SERVICE) {
+ ms = jobmgr_lookup_service(j->mgr, servicename, false, target_pid);
+ } else {
+ ms = jobmgr_lookup_service(j->mgr, servicename, true, 0);
+ }
if (ms && machservice_hidden(ms) && !job_active(machservice_job(ms))) {
ms = NULL;
@@ -4410,16 +4426,16 @@
if (ms) {
launchd_assumes(machservice_port(ms) != MACH_PORT_NULL);
- job_log(j, LOG_DEBUG, "Mach service lookup (by PID %d): %s", ldc.pid, servicename);
+ job_log(j, LOG_DEBUG, "%sMach service lookup (by PID %d): %s", flags & BOOTSTRAP_PER_PID_SERVICE ? "Per PID " : "", ldc.pid, servicename);
*serviceportp = machservice_port(ms);
*ptype = MACH_MSG_TYPE_COPY_SEND;
return BOOTSTRAP_SUCCESS;
- } else if (inherited_bootstrap_port != MACH_PORT_NULL) {
+ } else if (!(flags & BOOTSTRAP_PER_PID_SERVICE) && (inherited_bootstrap_port != MACH_PORT_NULL)) {
job_log(j, LOG_DEBUG, "Mach service lookup (by PID %d) forwarded: %s", ldc.pid, servicename);
*ptype = MACH_MSG_TYPE_MOVE_SEND;
return bootstrap_look_up(inherited_bootstrap_port, servicename, serviceportp);
} else {
- job_log(j, LOG_DEBUG, "Mach service lookup (by PID %d) failed: %s", ldc.pid, servicename);
+ job_log(j, LOG_DEBUG, "%sMach service lookup (by PID %d) failed: %s", flags & BOOTSTRAP_PER_PID_SERVICE ? "Per PID " : "", ldc.pid, servicename);
return BOOTSTRAP_UNKNOWN_SERVICE;
}
}
@@ -4572,7 +4588,7 @@
for (l2l_i = 0; l2l_i < l2l_name_cnt; l2l_i++) {
struct machservice *ms;
- if ((ms = machservice_new(jmr->anonj, l2l_names[l2l_i], &l2l_ports[l2l_i]))) {
+ if ((ms = machservice_new(jmr->anonj, l2l_names[l2l_i], &l2l_ports[l2l_i], false))) {
machservice_request_notifications(ms);
}
}
@@ -4721,7 +4737,7 @@
return BOOTSTRAP_NOT_PRIVILEGED;
}
- ms = jobmgr_lookup_service(j->mgr, servicename, false);
+ ms = jobmgr_lookup_service(j->mgr, servicename, false, 0);
if (ms) {
job_log(j, LOG_DEBUG, "Mach service creation attempt for failed. Already exists: %s", servicename);
return BOOTSTRAP_NAME_IN_USE;
@@ -4730,7 +4746,7 @@
job_checkin(j);
*serviceportp = MACH_PORT_NULL;
- ms = machservice_new(j, servicename, serviceportp);
+ ms = machservice_new(j, servicename, serviceportp, false);
if (!launchd_assumes(ms != NULL)) {
goto out_bad;
Modified: trunk/launchd/src/libbootstrap.c
===================================================================
--- trunk/launchd/src/libbootstrap.c 2007-02-22 01:34:11 UTC (rev 23096)
+++ trunk/launchd/src/libbootstrap.c 2007-02-22 18:22:46 UTC (rev 23097)
@@ -20,6 +20,7 @@
#include "config.h"
#include "libbootstrap_public.h"
+#include "libbootstrap_private.h"
#include "libvproc_public.h"
#include "libvproc_private.h"
@@ -66,13 +67,19 @@
kern_return_t
bootstrap_register(mach_port_t bp, name_t service_name, mach_port_t sp)
{
- kern_return_t kr = vproc_mig_register(bp, service_name, sp);
+ return bootstrap_register2(bp, service_name, sp, 0);
+}
+kern_return_t
+bootstrap_register2(mach_port_t bp, name_t service_name, mach_port_t sp, uint64_t flags)
+{
+ kern_return_t kr = vproc_mig_register2(bp, service_name, sp, flags);
+
if (kr == VPROC_ERR_TRY_PER_USER) {
mach_port_t puc;
if (vproc_mig_lookup_per_user_context(bp, 0, &puc) == 0) {
- kr = vproc_mig_register(puc, service_name, sp);
+ kr = vproc_mig_register2(puc, service_name, sp, flags);
mach_port_deallocate(mach_task_self(), puc);
}
}
@@ -95,10 +102,16 @@
kern_return_t
bootstrap_look_up(mach_port_t bp, name_t service_name, mach_port_t *sp)
{
+ return bootstrap_look_up2(bp, service_name, sp, 0, 0);
+}
+
+kern_return_t
+bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags)
+{
kern_return_t kr;
mach_port_t puc;
- if ((kr = vproc_mig_look_up(bp, service_name, sp)) != VPROC_ERR_TRY_PER_USER) {
+ if ((kr = vproc_mig_look_up2(bp, service_name, sp, target_pid, flags)) != VPROC_ERR_TRY_PER_USER) {
return kr;
}
@@ -106,7 +119,7 @@
return kr;
}
- kr = vproc_mig_look_up(puc, service_name, sp);
+ kr = vproc_mig_look_up2(puc, service_name, sp, target_pid, flags);
mach_port_deallocate(mach_task_self(), puc);
return kr;
Added: trunk/launchd/src/libbootstrap_private.h
===================================================================
--- trunk/launchd/src/libbootstrap_private.h (rev 0)
+++ trunk/launchd/src/libbootstrap_private.h 2007-02-22 18:22:46 UTC (rev 23097)
@@ -0,0 +1,40 @@
+#ifndef _BOOTSTRAP_PRIVATE_H_
+#define _BOOTSTRAP_PRIVATE_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 <servers/bootstrap.h>
+#include <sys/types.h>
+
+__BEGIN_DECLS
+
+#pragma GCC visibility push(default)
+
+#define BOOTSTRAP_PER_PID_SERVICE 1
+
+kern_return_t bootstrap_register2(mach_port_t bp, name_t service_name, mach_port_t sp, uint64_t flags);
+
+kern_return_t bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags);
+
+#pragma GCC visibility pop
+
+__END_DECLS
+
+#endif
Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs 2007-02-22 01:34:11 UTC (rev 23096)
+++ trunk/launchd/src/protocol_job.defs 2007-02-22 18:22:46 UTC (rev 23097)
@@ -54,15 +54,18 @@
__service_name : name_t;
out __service_port : mach_port_move_receive_t);
-routine register(
+routine register2(
__bs_port : job_t;
__service_name : name_t;
- __service_port : mach_port_t);
+ __service_port : mach_port_t;
+ __flags : uint64_t);
-routine look_up(
+routine look_up2(
__bs_port : job_t;
__service_name : name_t;
- out __service_port : mach_port_send_t);
+ out __service_port : mach_port_send_t;
+ __target_pid : pid_t;
+ __flags : uint64_t);
skip; /* last used in 10.4 */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070222/a680b397/attachment.html
More information about the launchd-changes
mailing list