* emacs.c (main): Do fork+exec under --daemon in Cocoa.
This commit is contained in:
parent
e7534fc4ed
commit
b3243e6f1a
2 changed files with 55 additions and 0 deletions
|
@ -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
|
||||
|
|
51
src/emacs.c
51
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. */
|
||||
|
|
Loading…
Add table
Reference in a new issue