[launchd-changes] [23138] trunk/launchd

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 6 16:32:49 PST 2007


Revision: 23138
          http://trac.macosforge.org/projects/launchd/changeset/23138
Author:   zarzycki at apple.com
Date:     2007-03-06 16:32:48 -0800 (Tue, 06 Mar 2007)

Log Message:
-----------
<rdar://problem/5040403> Supply an API for CoreFoundation to get the PID of the per user launchd

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_mig_types.defs
    trunk/launchd/src/libvproc.c
    trunk/launchd/src/libvproc_internal.h
    trunk/launchd/src/libvproc_public.h
    trunk/launchd/src/protocol_job.defs

Added Paths:
-----------
    trunk/launchd/testing/vproc_gsk_test.c

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-03-06 21:38:02 UTC (rev 23137)
+++ trunk/launchd/src/launchd_core_logic.c	2007-03-07 00:32:48 UTC (rev 23138)
@@ -4170,7 +4170,7 @@
 }
 
 kern_return_t
-job_mig_get_integer(job_t j, get_set_int_key_t key, int64_t *val)
+job_mig_swap_integer(job_t j, vproc_gsk_t inkey, vproc_gsk_t outkey, int64_t inval, int64_t *outval)
 {
 	kern_return_t kr = 0;
 
@@ -4178,15 +4178,38 @@
 		return BOOTSTRAP_NO_MEMORY;
 	}
 
-	switch (key) {
-	case LAST_EXIT_STATUS:
-		*val = j->last_exit_status;
+	switch (outkey) {
+	case VPROC_GSK_LAST_EXIT_STATUS:
+		*outval = j->last_exit_status;
 		break;
+	case VPROC_GSK_MGR_UID:
+		*outval = getuid();
+		break;
+	case VPROC_GSK_MGR_PID:
+		*outval = getpid();
+		break;
+	case 0:
+		*outval = 0;
+		break;
 	default:
 		kr = 1;
 		break;
 	}
 
+	switch (inkey) {
+	case VPROC_GSK_GLOBAL_ON_DEMAND:
+		kr = job_set_global_on_demand(j, (bool)inval) ? 0 : 1;
+		break;
+	case 0:
+		break;
+	case VPROC_GSK_LAST_EXIT_STATUS:
+	case VPROC_GSK_MGR_UID:
+	case VPROC_GSK_MGR_PID:
+	default:
+		kr = 1;
+		break;
+	}
+
 	return kr;
 }
 
@@ -4213,27 +4236,6 @@
 }
 
 kern_return_t
-job_mig_set_integer(job_t j, get_set_int_key_t key, int64_t val)
-{
-	kern_return_t kr = 0;
-
-	if (!launchd_assumes(j != NULL)) {
-		return BOOTSTRAP_NO_MEMORY;
-	}
-
-	switch (key) {
-	case GLOBAL_ON_DEMAND:
-		kr = job_set_global_on_demand(j, (bool)val) ? 0 : 1;
-		break;
-	default:
-		kr = 1;
-		break;
-	}
-
-	return kr;
-}
-
-kern_return_t
 job_mig_getsocket(job_t j, name_t spr)
 {
 	if (!launchd_assumes(j != NULL)) {

Modified: trunk/launchd/src/launchd_mig_types.defs
===================================================================
--- trunk/launchd/src/launchd_mig_types.defs	2007-03-06 21:38:02 UTC (rev 23137)
+++ trunk/launchd/src/launchd_mig_types.defs	2007-03-07 00:32:48 UTC (rev 23138)
@@ -26,7 +26,7 @@
 type pid_t			= integer_t;
 type uid_t			= integer_t;
 type gid_t			= integer_t;
-type get_set_int_key_t		= integer_t;
+type vproc_gsk_t		= integer_t;
 type logmsg_t			= c_string[*:2048];
 type cmd_t			= c_string[512];
 type cmd_array_t		= ^array [] of cmd_t;

Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c	2007-03-06 21:38:02 UTC (rev 23137)
+++ trunk/launchd/src/libvproc.c	2007-03-07 00:32:48 UTC (rev 23138)
@@ -201,7 +201,7 @@
 {
 	int64_t val;
 
-	if (vproc_mig_get_integer(bootstrap_port, LAST_EXIT_STATUS, &val) == 0) {
+	if (vproc_swap_integer(NULL, VPROC_GSK_LAST_EXIT_STATUS, 0, &val) == 0) {
 		*wstatus = (int)val;
 		return NULL;
 	}
@@ -209,6 +209,18 @@
 	return (vproc_err_t)_vproc_get_last_exit_status;
 }
 
+vproc_err_t
+vproc_swap_integer(vproc_t vp __attribute__((unused)), vproc_gsk_t key, int64_t *inval, int64_t *outval)
+{
+	int64_t dummyval = 0;
+
+	if (vproc_mig_swap_integer(bootstrap_port, inval ? key : 0, outval ? key : 0, inval ? *inval : 0, outval ? outval : &dummyval) == 0) {
+		return NULL;
+	}
+
+	return (vproc_err_t)vproc_swap_integer;
+}
+
 void *
 reboot2(uint64_t flags)
 {
@@ -242,7 +254,7 @@
 {
 	int64_t val = state ? ~0 : 0;
 
-	if (vproc_mig_set_integer(bootstrap_port, GLOBAL_ON_DEMAND, val) == 0) {
+	if (vproc_swap_integer(NULL, VPROC_GSK_GLOBAL_ON_DEMAND, &val, NULL) == 0) {
 		return NULL;
 	}
 

Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h	2007-03-06 21:38:02 UTC (rev 23137)
+++ trunk/launchd/src/libvproc_internal.h	2007-03-07 00:32:48 UTC (rev 23138)
@@ -28,10 +28,6 @@
 typedef char * logmsg_t;
 typedef mach_port_t vproc_mig_t;
 typedef integer_t binpref_t[8];
-typedef enum {
-	LAST_EXIT_STATUS = 1,
-	GLOBAL_ON_DEMAND,
-} get_set_int_key_t;
 
 #ifdef protocol_vproc_MSG_COUNT
 /* HACK */

Modified: trunk/launchd/src/libvproc_public.h
===================================================================
--- trunk/launchd/src/libvproc_public.h	2007-03-06 21:38:02 UTC (rev 23137)
+++ trunk/launchd/src/libvproc_public.h	2007-03-07 00:32:48 UTC (rev 23138)
@@ -21,16 +21,30 @@
  */
 
 #include <sys/cdefs.h>
+#include <sys/types.h>
 
 __BEGIN_DECLS
 
+#pragma GCC visibility push(default)
+
+typedef enum {
+	VPROC_GSK_LAST_EXIT_STATUS = 1,
+	VPROC_GSK_GLOBAL_ON_DEMAND,
+	VPROC_GSK_MGR_UID,
+	VPROC_GSK_MGR_PID,
+} vproc_gsk_t;
+
 typedef void * vproc_err_t;
 
 typedef void * vproc_t;
 typedef void * vprocmgr_t;
 
+vproc_err_t vproc_swap_integer(vproc_t vp, vproc_gsk_t key, int64_t *inval, int64_t *outval);
+
 const char *vproc_strerror(vproc_err_t r);
 
+#pragma GCC visibility pop
+
 __END_DECLS
 
 #endif

Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs	2007-03-06 21:38:02 UTC (rev 23137)
+++ trunk/launchd/src/protocol_job.defs	2007-03-07 00:32:48 UTC (rev 23138)
@@ -121,15 +121,14 @@
 routine uncork_fork(
 		__bs_port	: job_t);
 
-routine get_integer(
+routine swap_integer(
 		__bs_port	: job_t;
-		__key		: get_set_int_key_t;
-	out	__val		: int64_t);
+		__inkey		: vproc_gsk_t;
+		__outkey	: vproc_gsk_t;
+		__inval		: int64_t;
+	out	__outval	: int64_t);
 
-routine set_integer(
-		__bs_port	: job_t;
-		__key		: get_set_int_key_t;
-		__val		: int64_t);
+skip;
 
 simpleroutine log(
 		__bs_port	: job_t;

Added: trunk/launchd/testing/vproc_gsk_test.c
===================================================================
--- trunk/launchd/testing/vproc_gsk_test.c	                        (rev 0)
+++ trunk/launchd/testing/vproc_gsk_test.c	2007-03-07 00:32:48 UTC (rev 23138)
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <vproc.h>
+
+int main(void)
+{
+	int64_t val;
+	pid_t p;
+	uid_t u;
+
+	/* we assign val to p or u due to 64 bit to 32 bit trucation */
+
+	assert(vproc_swap_integer(NULL, VPROC_GSK_MGR_PID, NULL, &val) == NULL);
+	p = val;
+
+	assert(vproc_swap_integer(NULL, VPROC_GSK_MGR_UID, NULL, &val) == NULL);
+	u = val;
+
+	fprintf(stdout, "UID = %u PID = %u\n", u, p);
+
+	return 0;
+}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070306/2ebcdc66/attachment.html


More information about the launchd-changes mailing list