Revision: 22966 http://trac.macosforge.org/projects/launchd/changeset/22966 Author: zarzycki@apple.com Date: 2006-12-04 09:34:49 -0800 (Mon, 04 Dec 2006) Log Message: ----------- Less globals and no more need for a mount table update callback from the kernel (via kqueue). Now we can have stdout/stderr per jobmgr. Modified Paths: -------------- trunk/launchd/src/launchctl.c trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_core_logic.h Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2006-12-04 17:26:23 UTC (rev 22965) +++ trunk/launchd/src/launchctl.c 2006-12-04 17:34:49 UTC (rev 22966) @@ -1719,22 +1719,16 @@ stdio_cmd(int argc, char *const argv[]) { launch_data_t resp, msg, tmp; - int e, fd = -1, r = 0; + int e, r = 0; if (argc != 2) { fprintf(stderr, "usage: %s %s <path>\n", getprogname(), argv[0]); return 1; } - fd = open(argv[1], O_CREAT|O_APPEND|O_WRONLY|O_NOCTTY, DEFFILEMODE); - msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY); - if (fd == -1) { - tmp = launch_data_new_string(argv[1]); - } else { - tmp = launch_data_new_fd(fd); - } + tmp = launch_data_new_string(argv[1]); if (!strcmp(argv[0], "stdout")) { launch_data_dict_insert(msg, tmp, LAUNCH_KEY_SETSTDOUT); @@ -1758,9 +1752,6 @@ r = 1; } - if (fd != -1) - close(fd); - launch_data_free(resp); return r; Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-12-04 17:26:23 UTC (rev 22965) +++ trunk/launchd/src/launchd.c 2006-12-04 17:34:49 UTC (rev 22966) @@ -81,12 +81,10 @@ extern char **environ; static void signal_callback(void *, struct kevent *); -static void fs_callback(void); static void ppidexit_callback(void); static void pfsystem_callback(void *, struct kevent *); static kq_callback kqsignal_callback = signal_callback; -static kq_callback kqfs_callback = (kq_callback)fs_callback; static kq_callback kqppidexit_callback = (kq_callback)ppidexit_callback; static kq_callback kqpfsystem_callback = pfsystem_callback; @@ -101,8 +99,6 @@ static void handle_pid1_crashes_separately(void); static bool re_exec_in_single_user_mode = false; -static char *pending_stdout = NULL; -static char *pending_stderr = NULL; static job_t rlcj = NULL; static jmp_buf doom_doom_doom; static void *crash_addr; @@ -269,9 +265,6 @@ monitor_networking_state(); - /* do this after pid1_magic_init() to not catch ourselves mounting stuff */ - launchd_assumes(kevent_mod(0, EVFILT_FS, EV_ADD, 0, 0, &kqfs_callback) != -1); - if (session_type) { pid_t pp = getppid(); @@ -475,29 +468,6 @@ } void -fs_callback(void) -{ - if (pending_stdout) { - int fd = open(pending_stdout, O_CREAT|O_APPEND|O_WRONLY|O_NOCTTY, DEFFILEMODE); - if (fd != -1) { - launchd_assumes(dup2(fd, STDOUT_FILENO) != -1); - launchd_assumes(close(fd) == 0); - free(pending_stdout); - pending_stdout = NULL; - } - } - if (pending_stderr) { - int fd = open(pending_stderr, O_CREAT|O_APPEND|O_WRONLY|O_NOCTTY, DEFFILEMODE); - if (fd != -1) { - launchd_assumes(dup2(fd, STDERR_FILENO) != -1); - launchd_assumes(close(fd) == 0); - free(pending_stderr); - pending_stderr = NULL; - } - } -} - -void launchd_SessionCreate(void) { OSStatus (*sescr)(SessionCreationFlags flags, SessionAttributeBits attributes); @@ -534,17 +504,17 @@ launch_data_t resp = launch_data_new_errno(0); if (launch_data_get_type(o) == LAUNCH_DATA_STRING) { - char **where = &pending_stderr; - - if (d == STDOUT_FILENO) { - where = &pending_stdout; + switch (d) { + case STDOUT_FILENO: + jobmgr_set_stdout(root_jobmgr, launch_data_get_string(o)); + break; + case STDERR_FILENO: + jobmgr_set_stderr(root_jobmgr, launch_data_get_string(o)); + break; + default: + launch_data_set_errno(resp, EINVAL); + break; } - if (*where) { - free(*where); - } - *where = strdup(launch_data_get_string(o)); - } else if (launch_data_get_type(o) == LAUNCH_DATA_FD) { - launchd_assumes(dup2(launch_data_get_fd(o), d) != -1); } else { launch_data_set_errno(resp, EINVAL); } Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-12-04 17:26:23 UTC (rev 22965) +++ trunk/launchd/src/launchd_core_logic.c 2006-12-04 17:34:49 UTC (rev 22966) @@ -3018,6 +3018,26 @@ return true; } +void +jobmgr_set_stdout(jobmgr_t jm, const char *what) +{ + if (jm->jm_stdout) { + free(jm->jm_stdout); + } + + jm->jm_stdout = strdup(what); +} + +void +jobmgr_set_stderr(jobmgr_t jm, const char *what) +{ + if (jm->jm_stderr) { + free(jm->jm_stderr); + } + + jm->jm_stderr = strdup(what); +} + char * jobmgr_get_stdout(jobmgr_t jm) { Modified: trunk/launchd/src/launchd_core_logic.h =================================================================== --- trunk/launchd/src/launchd_core_logic.h 2006-12-04 17:26:23 UTC (rev 22965) +++ trunk/launchd/src/launchd_core_logic.h 2006-12-04 17:34:49 UTC (rev 22966) @@ -29,6 +29,8 @@ extern jobmgr_t root_jobmgr; extern jobmgr_t gc_this_jobmgr; +void jobmgr_set_stdout(jobmgr_t jm, const char *what); +void jobmgr_set_stderr(jobmgr_t jm, const char *what); bool jobmgr_is_idle(jobmgr_t jm); void jobmgr_remove_all_inactive(jobmgr_t jm); void jobmgr_dispatch_all_other_semaphores(jobmgr_t jm, job_t nj);
participants (1)
-
source_changes@macosforge.org