diff options
author | Adrian Robert <Adrian.B.Robert@gmail.com> | 2009-01-23 09:12:53 +0000 |
---|---|---|
committer | Adrian Robert <Adrian.B.Robert@gmail.com> | 2009-01-23 09:12:53 +0000 |
commit | b3243e6f1a45b2dc2dfda676332a0fd20d0e6e57 (patch) | |
tree | ef77a58d8ccde2592758c75b95a71382ae102115 /src | |
parent | e7534fc4ed352b0d11dc3426d42f46482ed1353a (diff) | |
download | emacs-b3243e6f1a45b2dc2dfda676332a0fd20d0e6e57.tar.gz |
* emacs.c (main): Do fork+exec under --daemon in Cocoa.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 4 | ||||
-rw-r--r-- | src/emacs.c | 51 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index e662d87e8d9..953e1241c98 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2009-01-23 Adrian Robert <Adrian.B.Robert@gmail.com> + + * emacs.c (main): Do fork+exec under --daemon in Cocoa. + 2009-01-23 Giorgos Keramidas <keramida@freebsd.org> (tiny change) * alloc.c (mark_stack): Use "flushw" instead of "ta 3" assembly diff --git a/src/emacs.c b/src/emacs.c index f2cb4ac6454..df5e4cdeeb4 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -797,6 +797,9 @@ main (int argc, char **argv) int no_loadup = 0; char *junk = 0; char *dname_arg = 0; +#ifdef NS_IMPL_COCOA + char dname_arg2[80]; +#endif #if GC_MARK_STACK extern Lisp_Object *stack_base; @@ -1108,7 +1111,19 @@ main (int argc, char **argv) exit (1); } +#ifndef NS_IMPL_COCOA f = fork (); +#else + /* Under Cocoa we must do fork+exec: + (http://developer.apple.com/ReleaseNotes/CoreFoundation/CoreFoundation.html) + We mark being in the exec'd process by a daemon name argument of + form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors, + NAME is the original daemon name, if any. */ + if (!dname_arg || !strchr (dname_arg, '\n')) + f = fork (); /* in orig */ + else + f = 0; /* in exec'd */ +#endif if (f > 0) { int retval; @@ -1144,6 +1159,42 @@ main (int argc, char **argv) exit (1); } +#ifdef NS_IMPL_COCOA + { + /* in orig process, forked as child, OR in exec'd */ + if (!dname_arg || !strchr (dname_arg, '\n')) + { /* in orig, child: now exec w/special daemon name */ + char fdStr[80]; + + if (dname_arg && strlen (dname_arg) > 70) + { + fprintf (stderr, "daemon: child name too long\n"); + exit (1); + } + + sprintf (fdStr, "--daemon=\n%d,%d\n%s", daemon_pipe[0], + daemon_pipe[1], dname_arg ? dname_arg : ""); + argv[skip_args] = fdStr; + + execv (argv[0], argv); + fprintf (stderr, "emacs daemon: exec failed: %d\t%d\n", errno); + exit (1); + } + + /* in exec'd: parse special dname into pipe and name info */ + if (!dname_arg || !strchr (dname_arg, '\n') + || strlen (dname_arg) < 1 || strlen (dname_arg) > 70) + { + fprintf (stderr, "emacs daemon: daemon name absent or too long\n"); + exit(1); + } + dname_arg2[0] = '\0'; + sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]), + dname_arg2); + dname_arg = strlen (dname_arg2) ? dname_arg2 : NULL; + } +#endif + if (dname_arg) daemon_name = xstrdup (dname_arg); /* Close unused reading end of the pipe. */ |