]> git.eshelyaron.com Git - emacs.git/commitdiff
* emacs.c (main): Do fork+exec under --daemon in Cocoa.
authorAdrian Robert <Adrian.B.Robert@gmail.com>
Fri, 23 Jan 2009 09:12:53 +0000 (09:12 +0000)
committerAdrian Robert <Adrian.B.Robert@gmail.com>
Fri, 23 Jan 2009 09:12:53 +0000 (09:12 +0000)
src/ChangeLog
src/emacs.c

index e662d87e8d9b5aa8c3fb0662f5fb05ac1511615a..953e1241c98bb09d14657d30e7d852cfc6c4f091 100644 (file)
@@ -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
index f2cb4ac64549aedef0bf38d8a6ecb391ad3d5324..df5e4cdeeb492bf10188e0c8ded22e03eafff177 100644 (file)
@@ -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.  */