[launchd-changes] [23478] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Wed Jan 9 09:35:13 PST 2008


Revision: 23478
          http://trac.macosforge.org/projects/launchd/changeset/23478
Author:   zarzycki at apple.com
Date:     2008-01-09 09:35:12 -0800 (Wed, 09 Jan 2008)

Log Message:
-----------
More misc. branch hints, plus basic (and untested) "StandardInPath" support.

Modified Paths:
--------------
    trunk/launchd/src/launchd.plist.5
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/liblaunch_public.h

Modified: trunk/launchd/src/launchd.plist.5
===================================================================
--- trunk/launchd/src/launchd.plist.5	2008-01-09 17:30:02 UTC (rev 23477)
+++ trunk/launchd/src/launchd.plist.5	2008-01-09 17:35:12 UTC (rev 23478)
@@ -226,6 +226,9 @@
 .It Sy Month <integer>
 The month on which this job will be run.
 .El
+.It Sy StandardInPath <string>
+This optional key specifies what file should be used for data being supplied to stdin when using
+.Xr stdio 3 .
 .It Sy StandardOutPath <string>
 This optional key specifies what file should be used for data being sent to stdout when using
 .Xr stdio 3 .

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2008-01-09 17:30:02 UTC (rev 23477)
+++ trunk/launchd/src/launchd_core_logic.c	2008-01-09 17:35:12 UTC (rev 23478)
@@ -331,6 +331,7 @@
 	char *workingdir;
 	char *username;
 	char *groupname;
+	char *stdinpath;
 	char *stdoutpath;
 	char *stderrpath;
 	char *alt_exc_handler;
@@ -343,7 +344,8 @@
 	pid_t p;
 	int argc;
 	int last_exit_status;
-	int forkfd;
+	int stdin_fd;
+	int fork_fd;
 	int log_redirect_fd;
 	int nice;
 	unsigned int timeout;
@@ -458,7 +460,7 @@
 static size_t total_anon_children;
 static mach_port_t the_exception_server;
 static bool did_first_per_user_launchd_BootCache_hack;
-#define JOB_BOOTCACHE_HACK_CHECK(j)	(j->per_user && !did_first_per_user_launchd_BootCache_hack && (j->mach_uid >= 500) && (j->mach_uid != (uid_t)-2))
+#define JOB_BOOTCACHE_HACK_CHECK(j)	(unlikely(j->per_user && !did_first_per_user_launchd_BootCache_hack && (j->mach_uid >= 500) && (j->mach_uid != (uid_t)-2)))
 static jobmgr_t background_jobmgr;
 static job_t workaround_5477111;
 
@@ -576,6 +578,9 @@
 	if (j->prog && (tmp = launch_data_new_string(j->prog))) {
 		launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_PROGRAM);
 	}
+	if (j->stdinpath && (tmp = launch_data_new_string(j->stdinpath))) {
+		launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_STANDARDINPATH);
+	}
 	if (j->stdoutpath && (tmp = launch_data_new_string(j->stdoutpath))) {
 		launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_STANDARDOUTPATH);
 	}
@@ -810,10 +815,14 @@
 		job_set_global_on_demand(j, false);
 	}
 
-	if (!job_assumes(j, j->forkfd == 0)) {
-		job_assumes(j, runtime_close(j->forkfd) != -1);
+	if (!job_assumes(j, j->fork_fd == 0)) {
+		job_assumes(j, runtime_close(j->fork_fd) != -1);
 	}
 
+	if (j->stdin_fd) {
+		job_assumes(j, runtime_close(j->stdin_fd) != -1);
+	}
+
 	if (!job_assumes(j, j->log_redirect_fd == 0)) {
 		job_assumes(j, runtime_close(j->log_redirect_fd) != -1);
 	}
@@ -872,6 +881,9 @@
 	if (j->groupname) {
 		free(j->groupname);
 	}
+	if (j->stdinpath) {
+		free(j->stdinpath);
+	}
 	if (j->stdoutpath) {
 		free(j->stdoutpath);
 	}
@@ -1499,6 +1511,17 @@
 			where2put = &j->stdoutpath;
 		} else if (strcasecmp(key, LAUNCH_JOBKEY_STANDARDERRORPATH) == 0) {
 			where2put = &j->stderrpath;
+		} else if (strcasecmp(key, LAUNCH_JOBKEY_STANDARDINPATH) == 0) {
+			where2put = &j->stdinpath;
+			j->stdin_fd = _fd(open(value, O_RDONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, DEFFILEMODE));
+			if (job_assumes(j, j->stdin_fd != -1)) {
+				/* open() should not block, but regular IO by the job should */
+				job_assumes(j, fcntl(j->stdin_fd, F_SETFL, 0) != -1);
+				/* XXX -- EV_CLEAR should make named pipes happy? */
+				job_assumes(j, kevent_mod(j->stdin_fd, EVFILT_READ, EV_ADD|EV_CLEAR, 0, 0, j) != -1);
+			} else {
+				j->stdin_fd = 0;
+			}
 		} else if (strcasecmp(key, LAUNCH_JOBKEY_SANDBOXPROFILE) == 0) {
 			where2put = &j->seatbelt_profile;
 		}
@@ -2094,9 +2117,9 @@
 		}
 	}
 
-	if (j->forkfd) {
-		job_assumes(j, runtime_close(j->forkfd) != -1);
-		j->forkfd = 0;
+	if (j->fork_fd) {
+		job_assumes(j, runtime_close(j->fork_fd) != -1);
+		j->fork_fd = 0;
 	}
 
 	if (j->anonymous) {
@@ -2460,6 +2483,8 @@
 {
 	if (ident == j->log_redirect_fd) {
 		job_log_stdouterr(j);
+	} else if (ident == j->stdin_fd) {
+		job_dispatch(j, true);
 	} else {
 		socketgroup_callback(j);
 	}
@@ -2580,7 +2605,7 @@
 		return;
 	}
 
-	if (job_active(j)) {
+	if (unlikely(job_active(j))) {
 		job_log(j, LOG_DEBUG, "Already started");
 		return;
 	}
@@ -2611,7 +2636,7 @@
 
 	j->sent_sigterm_time = 0;
 
-	if (!j->legacy_mach_job) {
+	if (likely(!j->legacy_mach_job)) {
 		sipc = (!SLIST_EMPTY(&j->sockets) || !SLIST_EMPTY(&j->machservices));
 	}
 
@@ -2623,7 +2648,7 @@
 
 	job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, execspair) != -1);
 
-	if (!j->legacy_mach_job && job_assumes(j, pipe(oepair) != -1)) {
+	if (likely(!j->legacy_mach_job) && job_assumes(j, pipe(oepair) != -1)) {
 		j->log_redirect_fd = _fd(oepair[0]);
 		job_assumes(j, fcntl(j->log_redirect_fd, F_SETFL, O_NONBLOCK) != -1);
 		job_assumes(j, kevent_mod(j->log_redirect_fd, EVFILT_READ, EV_ADD, 0, 0, j) != -1);
@@ -2640,14 +2665,14 @@
 			job_assumes(j, runtime_close(spair[0]) == 0);
 			job_assumes(j, runtime_close(spair[1]) == 0);
 		}
-		if (!j->legacy_mach_job) {
+		if (likely(!j->legacy_mach_job)) {
 			job_assumes(j, runtime_close(oepair[0]) != -1);
 			job_assumes(j, runtime_close(oepair[1]) != -1);
 			j->log_redirect_fd = 0;
 		}
 		break;
 	case 0:
-		if (_vproc_post_fork_ping()) {
+		if (unlikely(_vproc_post_fork_ping())) {
 			_exit(EXIT_FAILURE);
 		}
 		if (!j->legacy_mach_job) {
@@ -2679,16 +2704,16 @@
 			did_first_per_user_launchd_BootCache_hack = true;
 		}
 
-		if (!j->legacy_mach_job) {
+		if (likely(!j->legacy_mach_job)) {
 			job_assumes(j, runtime_close(oepair[1]) != -1);
 		}
 		j->p = c;
-		if (j->hopefully_exits_first) {
+		if (unlikely(j->hopefully_exits_first)) {
 			j->mgr->hopefully_first_cnt++;
-		} else if (!j->hopefully_exits_last) {
+		} else if (likely(!j->hopefully_exits_last)) {
 			j->mgr->normal_active_cnt++;
 		}
-		j->forkfd = _fd(execspair[0]);
+		j->fork_fd = _fd(execspair[0]);
 		job_assumes(j, runtime_close(execspair[1]) == 0);
 		if (sipc) {
 			job_assumes(j, runtime_close(spair[1]) == 0);
@@ -2700,7 +2725,7 @@
 			job_reap(j);
 		}
 
-		if (!j->stall_before_exec) {
+		if (likely(!j->stall_before_exec)) {
 			job_uncork_fork(j);
 		}
 		break;
@@ -2745,7 +2770,7 @@
 
 	job_setup_attributes(j);
 
-	if (j->argv && j->globargv) {
+	if (unlikely(j->argv && j->globargv)) {
 		g.gl_offs = 1;
 		for (i = 0; i < j->argc; i++) {
 			if (i > 0) {
@@ -2772,18 +2797,18 @@
 		argv[2] = NULL;
 	}
 
-	if (!j->inetcompat) {
+	if (likely(!j->inetcompat)) {
 		argv++;
 	}
 
-	if (j->wait4debugger) {
+	if (unlikely(j->wait4debugger)) {
 		job_log(j, LOG_WARNING, "Spawned and waiting for the debugger to attach before continuing...");
 		spflags |= POSIX_SPAWN_START_SUSPENDED;
 	}
 
 	job_assumes(j, posix_spawnattr_setflags(&spattr, spflags) == 0);
 
-	if (j->j_binpref_cnt) {
+	if (unlikely(j->j_binpref_cnt)) {
 		job_assumes(j, posix_spawnattr_setbinpref_np(&spattr, j->j_binpref_cnt, j->j_binpref, &binpref_out_cnt) == 0);
 		job_assumes(j, binpref_out_cnt == j->j_binpref_cnt);
 	}
@@ -2811,7 +2836,7 @@
 
 	psf = j->prog ? posix_spawn : posix_spawnp;
 
-	if (!j->inetcompat) {
+	if (likely(!j->inetcompat)) {
 		file2exec = j->prog ? j->prog : argv[0];
 	}
 
@@ -2964,22 +2989,22 @@
 	strlcpy(loginname, pwe->pw_name, sizeof(loginname));
 	strlcpy(homedir, pwe->pw_dir, sizeof(homedir));
 
-	if (pwe->pw_expire && time(NULL) >= pwe->pw_expire) {
+	if (unlikely(pwe->pw_expire && time(NULL) >= pwe->pw_expire)) {
 		job_log(j, LOG_ERR, "Expired account");
 		_exit(EXIT_FAILURE);
 	}
 
 
-	if (j->username && strcmp(j->username, loginname) != 0) {
+	if (unlikely(j->username && strcmp(j->username, loginname) != 0)) {
 		job_log(j, LOG_WARNING, "Suspicious setup: User \"%s\" maps to user: %s", j->username, loginname);
-	} else if (j->mach_uid && (j->mach_uid != desired_uid)) {
+	} else if (unlikely(j->mach_uid && (j->mach_uid != desired_uid))) {
 		job_log(j, LOG_WARNING, "Suspicious setup: UID %u maps to UID %u", j->mach_uid, desired_uid);
 	}
 
 	if (j->groupname) {
 		struct group *gre;
 
-		if ((gre = getgrnam(j->groupname)) == NULL) {
+		if (unlikely((gre = getgrnam(j->groupname)) == NULL)) {
 			job_log(j, LOG_ERR, "getgrnam(\"%s\") failed", j->groupname);
 			_exit(EXIT_FAILURE);
 		}
@@ -3000,7 +3025,7 @@
 	 * called after setgid(). See 4616864 for more information.
 	 */
 
-	if (!j->no_init_groups) {
+	if (likely(!j->no_init_groups)) {
 		if (!job_assumes(j, initgroups(loginname, desired_gid) != -1)) {
 			_exit(EXIT_FAILURE);
 		}
@@ -3012,7 +3037,7 @@
 
 	r = confstr(_CS_DARWIN_USER_TEMP_DIR, tmpdirpath, sizeof(tmpdirpath));
 
-	if (r > 0 && r < sizeof(tmpdirpath)) {
+	if (likely(r > 0 && r < sizeof(tmpdirpath))) {
 		setenv("TMPDIR", tmpdirpath, 0);
 	}
 
@@ -3028,7 +3053,7 @@
 	struct limititem *li;
 	struct envitem *ei;
 
-	if (j->setnice) {
+	if (unlikely(j->setnice)) {
 		job_assumes(j, setpriority(PRIO_PROCESS, 0, j->nice) != -1);
 	}
 
@@ -3051,30 +3076,35 @@
 		}
 	}
 
-	if (!j->inetcompat && j->session_create) {
+	if (unlikely(!j->inetcompat && j->session_create)) {
 		launchd_SessionCreate();
 	}
 
-	if (j->low_pri_io) {
+	if (unlikely(j->low_pri_io)) {
 		job_assumes(j, setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE) != -1);
 	}
-	if (j->rootdir) {
+	if (unlikely(j->rootdir)) {
 		job_assumes(j, chroot(j->rootdir) != -1);
 		job_assumes(j, chdir(".") != -1);
 	}
 
 	job_postfork_become_user(j);
 
-	if (j->workingdir) {
+	if (unlikely(j->workingdir)) {
 		job_assumes(j, chdir(j->workingdir) != -1);
 	}
 
-	if (j->setmask) {
+	if (unlikely(j->setmask)) {
 		umask(j->mask);
 	}
 
-	job_setup_fd(j, STDOUT_FILENO, j->stdoutpath, O_WRONLY|O_APPEND|O_CREAT);
-	job_setup_fd(j, STDERR_FILENO, j->stderrpath, O_WRONLY|O_APPEND|O_CREAT);
+	if (j->stdin_fd) {
+		job_assumes(j, dup2(j->stdin_fd, STDIN_FILENO) != -1);
+	} else {
+		job_setup_fd(j, STDIN_FILENO,  j->stdinpath,  O_RDONLY|O_CREAT);
+	}
+	job_setup_fd(j, STDOUT_FILENO, j->stdoutpath, O_WRONLY|O_CREAT|O_APPEND);
+	job_setup_fd(j, STDERR_FILENO, j->stderrpath, O_WRONLY|O_CREAT|O_APPEND);
 
 	jobmgr_setup_env_from_other_jobs(j->mgr);
 
@@ -3119,7 +3149,7 @@
 	struct dirent *de;
 	bool r = 0;
 
-	if (!dd) {
+	if (unlikely(!dd)) {
 		return -1;
 	}
 
@@ -3185,7 +3215,7 @@
 		ctime_r(&later, time_string);
 		time_string_len = strlen(time_string);
 
-		if (time_string_len && time_string[time_string_len - 1] == '\n') {
+		if (likely(time_string_len && time_string[time_string_len - 1] == '\n')) {
 			time_string[time_string_len - 1] = '\0';
 		}
 
@@ -3287,13 +3317,13 @@
 		snprintf(newmsg, newmsgsz, "%s", msg);
 	}
 
-	if (j->debug) {
+	if (unlikely(j->debug)) {
 		oldmask = setlogmask(LOG_UPTO(LOG_DEBUG));
 	}
 
 	runtime_vsyslog(&attr, newmsg, ap);
 
-	if (j->debug) {
+	if (unlikely(j->debug)) {
 		setlogmask(oldmask);
 	}
 }
@@ -4414,9 +4444,9 @@
 	job_log(j, LOG_DEBUG, "Uncorking the fork().");
 	/* this unblocks the child and avoids a race
 	 * between the above fork() and the kevent_mod() */
-	job_assumes(j, write(j->forkfd, &c, sizeof(c)) == sizeof(c));
-	job_assumes(j, runtime_close(j->forkfd) != -1);
-	j->forkfd = 0;
+	job_assumes(j, write(j->fork_fd, &c, sizeof(c)) == sizeof(c));
+	job_assumes(j, runtime_close(j->fork_fd) != -1);
+	j->fork_fd = 0;
 }
 
 jobmgr_t 

Modified: trunk/launchd/src/liblaunch_public.h
===================================================================
--- trunk/launchd/src/liblaunch_public.h	2008-01-09 17:30:02 UTC (rev 23477)
+++ trunk/launchd/src/liblaunch_public.h	2008-01-09 17:35:12 UTC (rev 23478)
@@ -85,6 +85,7 @@
 #define LAUNCH_JOBKEY_STARTONMOUNT		"StartOnMount"
 #define LAUNCH_JOBKEY_SOFTRESOURCELIMITS	"SoftResourceLimits"
 #define LAUNCH_JOBKEY_HARDRESOURCELIMITS	"HardResourceLimits"
+#define LAUNCH_JOBKEY_STANDARDINPATH		"StandardInPath"
 #define LAUNCH_JOBKEY_STANDARDOUTPATH		"StandardOutPath"
 #define LAUNCH_JOBKEY_STANDARDERRORPATH		"StandardErrorPath"
 #define LAUNCH_JOBKEY_DEBUG			"Debug"

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20080109/1b82a5f4/attachment-0001.html


More information about the launchd-changes mailing list