[launchd-changes] [22966] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Mon Dec 4 09:34:49 PST 2006
Revision: 22966
http://trac.macosforge.org/projects/launchd/changeset/22966
Author: zarzycki at 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);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061204/32555104/attachment.html
More information about the launchd-changes
mailing list