]> code.delx.au - gnu-emacs/blobdiff - src/emacs.c
* emacs.c (standard_args): Add --daemon.
[gnu-emacs] / src / emacs.c
index 21c57f045df2354474562965446c9115fff702fa..131662c27a1aa0d4234e4c2d8e09ac69eb22b0e7 100644 (file)
@@ -232,6 +232,9 @@ int noninteractive;
 
 int noninteractive1;
 
+/* Nonzero means Emacs was started as a daemon.  */
+int is_daemon = 0;
+
 /* Save argv and argc.  */
 char **initial_argv;
 int initial_argc;
@@ -1068,6 +1071,34 @@ main (int argc, char **argv)
       exit (0);
     }
 
+#ifndef DOS_NT
+  if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args))
+    {
+      pid_t f = fork();
+      int nfd;
+      if (f > 0)
+       exit(0);
+      if (f < 0)
+       {
+         fprintf (stderr, "Cannot fork!\n");
+         exit(1);
+       }
+
+      nfd = open("/dev/null", O_RDWR);
+      dup2(nfd, 0);
+      dup2(nfd, 1);
+      dup2(nfd, 2);
+      close (nfd);
+      is_daemon = 1;
+#ifdef HAVE_SETSID
+      setsid();
+#endif
+    }
+#else /* DOS_NT */
+  fprintf (stderr, "This platform does not support the -daemon flag.\n");
+  exit (1);
+#endif /* DOS_NT */
+
   if (! noninteractive)
     {
 #ifdef BSD_PGRPS
@@ -1552,6 +1583,10 @@ main (int argc, char **argv)
       syms_of_fontset ();
 #endif /* HAVE_NTGUI */
 
+#ifdef MSDOS
+      syms_of_xmenu ();
+#endif /* MSDOS */
+
 #ifdef HAVE_NS
       syms_of_nsterm ();
       syms_of_nsfns ();
@@ -1715,6 +1750,7 @@ struct standard_args standard_args[] =
   { "-nw", "--no-windows", 110, 0 },
   { "-batch", "--batch", 100, 0 },
   { "-script", "--script", 100, 1 },
+  { "-daemon", "--daemon", 99, 0 },
   { "-help", "--help", 90, 0 },
   { "-no-unibyte", "--no-unibyte", 83, 0 },
   { "-multibyte", "--multibyte", 82, 0 },
@@ -2346,6 +2382,13 @@ decode_env_path (evarname, defalt)
   return Fnreverse (lpath);
 }
 
+DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
+       doc: /* Make the current emacs process a daemon.*/)
+  (void)
+{
+  return is_daemon ? Qt : Qnil;
+}
+
 void
 syms_of_emacs ()
 {
@@ -2364,6 +2407,7 @@ syms_of_emacs ()
 
   defsubr (&Sinvocation_name);
   defsubr (&Sinvocation_directory);
+  defsubr (&Sdaemonp);
 
   DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
               doc: /* Args passed by shell to Emacs, as a list of strings.