* emacs.c (standard_args): Add --daemon.
authorDan Nicolaescu <dann@ics.uci.edu>
Sun, 21 Sep 2008 23:31:40 +0000 (23:31 +0000)
committerDan Nicolaescu <dann@ics.uci.edu>
Sun, 21 Sep 2008 23:31:40 +0000 (23:31 +0000)
(main): Disconnect from the terminal when --daemon is passed.
(is_daemon): New variable.
(Fdaemonp): New function.
(syms_of_emacs): Defsubr it.

* startup.el (command-line): Start the server when in daemon mode.

* cmdargs.texi (Initial Options): Document --daemon.

doc/emacs/ChangeLog
doc/emacs/cmdargs.texi
etc/NEWS
lisp/ChangeLog
lisp/startup.el
src/ChangeLog
src/emacs.c

index bae3e02..c3b98fc 100644 (file)
@@ -1,3 +1,7 @@
+2008-09-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * cmdargs.texi (Initial Options): Document --daemon.
+
 2008-09-20  Glenn Morris  <rgm@gnu.org>
 
        * files.texi (Numbered Backups): Mention that some modes set
index 74ebe3c..1e73375 100644 (file)
@@ -277,6 +277,15 @@ option and @samp{-Q} are the only options that block it.
 Start emacs with minimum customizations.  This is like using @samp{-q}
 and @samp{--no-site-file}, but also disables the startup screen.
 
+@item -daemon
+@opindex -daemon
+@itemx --daemon
+@opindex --daemon
+Start emacs in background as a daemon (i.e. it will disconnect from the
+terminal), do not open any frames and start the server.  Clients can
+connect and create graphical or terminal frames using
+@code{emacsclient}.
+
 @item --no-splash
 @opindex --no-splash
 @vindex inhibit-splash-screen
index 13685fd..e8bfb7d 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -130,6 +130,11 @@ Now, the default behavior is to open a new Emacs frame by default.
 Use the -c option to get the old behavior of opening files in the
 currently selected Emacs frame.
 
+*** Emacs can now start in background, as a daemon when using the
+--daemon command line argument.  It disconnects from the terminal and
+starts the server.  Clients can connect and create graphical or
+terminal frames using emacsclient.
+
 *** The new command close-display-connection closes a connection to a
 remote display.
 
index a43dd64..4479267 100644 (file)
@@ -1,5 +1,7 @@
 2008-09-21  Dan Nicolaescu  <dann@ics.uci.edu>
 
+       * startup.el (command-line): Start the server when in daemon mode.
+
        * frame.el (frame-initialize): Remove spurious setting of
        special-display-function with the default value.
 
index 6c4f209..5ad00c2 100644 (file)
@@ -881,9 +881,15 @@ opening the first frame (e.g. open a connection to an X server).")
 
   (run-hooks 'before-init-hook)
 
-  ;; Under X Window, this creates the X frame and deletes the terminal frame.
-  (when (fboundp 'frame-initialize)
-    (frame-initialize))
+  (if (daemonp)
+      ;; Just start the server here, no need to run
+      ;; `frame-initialize', it deals with creating a frame and
+      ;; setting the parameters for the initial frame, we don't need
+      ;; any oxof those.
+      (server-start)
+    ;; Under X Window, this creates the X frame and deletes the terminal frame.
+    (when (fboundp 'frame-initialize)
+      (frame-initialize)))
 
   ;; Turn off blinking cursor if so specified in X resources.  This is here
   ;; only because all other settings of no-blinking-cursor are here.
index 9e855a4..97f11fb 100644 (file)
@@ -1,3 +1,11 @@
+2008-09-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * emacs.c (standard_args): Add --daemon.
+       (main): Disconnect from the terminal when --daemon is passed.
+       (is_daemon): New variable.
+       (Fdaemonp): New function.
+       (syms_of_emacs): Defsubr it.
+
 2008-09-20  Chong Yidong  <cyd@stupidchicken.com>
 
        * xdisp.c (get_next_display_element): Handle string display
index 68127df..131662c 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
@@ -1719,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 },
@@ -2350,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 ()
 {
@@ -2368,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.