]> code.delx.au - gnu-emacs/commitdiff
* misc.texi (emacsclient Options): Describe what an empty string
authorDan Nicolaescu <dann@ics.uci.edu>
Wed, 10 Dec 2008 07:56:51 +0000 (07:56 +0000)
committerDan Nicolaescu <dann@ics.uci.edu>
Wed, 10 Dec 2008 07:56:51 +0000 (07:56 +0000)
argument does for --alternate-editor.

* emacsclient.1: Describe what an empty string argument does for
--alternate-editor.

* emacsclient.c (print_help_and_exit): Describe what an empty
string argument does for --alternate-editor.
(set_socket): Make it possible to not exit in case of an error.
(start_daemon_and_retry_set_socket): New function.
(main): Use it.  Restore the NULL value for socket_name and
server_file after the set_socket call.

doc/emacs/ChangeLog
doc/emacs/misc.texi
doc/man/ChangeLog
doc/man/emacsclient.1
lib-src/ChangeLog
lib-src/emacsclient.c

index b8cc586536d527a11dc1642782b9f79d9d3b1b34..4d611b2233f384dd2d69914919f8660fc7f761fc 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-10  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * misc.texi (emacsclient Options): Describe what an empty string
+       argument does for --alternate-editor.
+
 2008-12-09  Frank Schmitt  <ich@frank-schmitt.net>
 
        * cmdargs.texi (Font X): Distinguish between client-side and
index 5c81f2ae004804185d43e145f83fbfb7597a5831..4b2ee4020735de52f1b88f6a60a17853dc073c55 100644 (file)
@@ -1574,10 +1574,11 @@ listed below:
 @item -a @var{command}
 @itemx --alternate-editor=@var{command}
 Specify a command to run if @code{emacsclient} fails to contact Emacs.
-This is useful when running @code{emacsclient} in a script.  For
-example, the following setting for the @env{EDITOR} environment
-variable will always give you an editor, even if no Emacs server is
-running:
+This is useful when running @code{emacsclient} in a script.  If
+@var{command} is the empty string, then start Emacs in daemon mode and
+try connecting again.  For example, the following setting for the
+@env{EDITOR} environment variable will always give you an editor, even
+if no Emacs server is running:
 
 @example
 EDITOR="emacsclient --alternate-editor emacs +%d %s"
index 4da2f2db177ad5f08dfc79c1927a8d28a9e41eff..32148a54c7e1357239b8a57e5f8999b8dc0b46d4 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-10  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * emacsclient.1: Describe what an empty string argument does for
+       --alternate-editor.
+
 2008-11-27  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * emacsclient.1: Mention -nw and -c. Fix the character for --help.
index ce5829d8d0daeec1c9e82e39e479b6347ad30c99..73bf432136eb1c164abb6889195871a0fb173ada 100644 (file)
@@ -72,6 +72,8 @@ This can also be specified via the `EMACS_SERVER_FILE' environment variable.
 .B \-a, \-\-alternate-editor=EDITOR
 if the Emacs server is not running, run the specified editor instead.
 This can also be specified via the `ALTERNATE_EDITOR' environment variable.
+If the value of EDITOR is the empty string, then Emacs is started in
+daemon mode and emacsclient will try to connect to it.
 .TP
 .B \-d, \-\-display=DISPLAY
 tell the server to display the files on the given display.
index acd9ef9f3cfaff39dae5ca71ceb1013965c48358..7cb4cda201327cac0502a7da22b38072718812b5 100644 (file)
@@ -1,3 +1,12 @@
+2008-12-10  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * emacsclient.c (print_help_and_exit): Describe what an empty
+       string argument does for --alternate-editor.
+       (set_socket): Make it possible to not exit in case of an error.
+       (start_daemon_and_retry_set_socket): New function.
+       (main): Use it.  Restore the NULL value for socket_name and
+       server_file after the set_socket call.
+
 2008-12-03  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * emacsclient.c: Include <arpa/inet.h>.
index 2a5b23faeafb1bf596bd1f6d47c4a714e28709e3..e96cf4ef358e8e55f0254abf5f405d89ff4102b1 100644 (file)
@@ -616,6 +616,8 @@ The following OPTIONS are accepted:\n\
                        Set filename of the TCP authentication file\n\
 -a, --alternate-editor=EDITOR\n\
                        Editor to fallback to if the server is not running\n\
+                        If EDITOR is the empty string, start Emacs in daemon\n\
+                        mode and try connecting again
 \n\
 Report bugs to bug-gnu-emacs@gnu.org.\n", progname);
   exit (EXIT_SUCCESS);
@@ -1294,7 +1296,7 @@ To start the server in Emacs, type \"M-x server-start\".\n",
 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
 
 HSOCKET
-set_socket ()
+set_socket (int no_exit_if_error)
 {
   HSOCKET s;
 
@@ -1305,7 +1307,7 @@ set_socket ()
   if (socket_name)
     {
       s = set_local_socket ();
-      if ((s != INVALID_SOCKET) || alternate_editor)
+      if ((s != INVALID_SOCKET) || no_exit_if_error)
        return s;
       message (TRUE, "%s: error accessing socket \"%s\"\n",
               progname, socket_name);
@@ -1320,7 +1322,7 @@ set_socket ()
   if (server_file)
     {
       s = set_tcp_socket ();
-      if ((s != INVALID_SOCKET) || alternate_editor)
+      if ((s != INVALID_SOCKET) || no_exit_if_error)
        return s;
 
       message (TRUE, "%s: error accessing server file \"%s\"\n",
@@ -1338,7 +1340,7 @@ set_socket ()
   /* Implicit server file.  */
   server_file = "server";
   s = set_tcp_socket ();
-  if ((s != INVALID_SOCKET) || alternate_editor)
+  if ((s != INVALID_SOCKET) || no_exit_if_error)
     return s;
 
   /* No implicit or explicit socket, and no alternate editor.  */
@@ -1408,6 +1410,52 @@ w32_give_focus ()
 }
 #endif
 
+
+/* Start the emacs daemon and try to connect to it.  */
+
+void
+start_daemon_and_retry_set_socket (void)
+{
+  pid_t dpid;
+  int status;
+  pid_t p;
+
+  dpid = fork ();
+
+  if (dpid > 0)
+    {
+      p = waitpid (dpid, &status, WUNTRACED | WCONTINUED);
+
+      /* Try connecting again, the daemon should have started by
+        now.  */
+      message (TRUE, "daemon should have started, trying to connect again\n", dpid);
+      if ((emacs_socket = set_socket (1)) == INVALID_SOCKET)
+       message (TRUE, "Cannot connect even after starting the daemon\n");
+    }
+  else if (dpid < 0)
+    {
+      fprintf (stderr, "Cannot fork!\n");
+      exit (1);
+    }
+  else
+    {
+      char *d_argv[] = {"emacs", "--daemon", 0 };
+      if (socket_name != NULL)
+       {
+         /* Pass  --daemon=socket_name as argument.  */
+         char *deq = "--daemon=";
+         char *daemon_arg = alloca (strlen (deq)
+                                    + strlen (socket_name) + 1);
+         strcpy (daemon_arg, deq);
+         strcat (daemon_arg, socket_name);
+         d_argv[1] = daemon_arg;
+       }
+      execvp ("emacs", d_argv);
+      message (TRUE, "%s: error starting emacs daemon\n", progname);
+    }
+}
+
+
 int
 main (argc, argv)
      int argc;
@@ -1416,6 +1464,7 @@ main (argc, argv)
   int i, rl, needlf = 0;
   char *cwd, *str;
   char string[BUFSIZ+1];
+  int null_socket_name, null_server_file, start_daemon_if_needed;
 
   main_argv = argv;
   progname = argv[0];
@@ -1431,9 +1480,34 @@ main (argc, argv)
       exit (EXIT_FAILURE);
     }
 
-  if ((emacs_socket = set_socket ()) == INVALID_SOCKET)
-    fail ();
+  /* If alternate_editor is the empty string, start the emacs daemon
+     in case of failure to connect.  */
+  start_daemon_if_needed = (alternate_editor
+                           && (alternate_editor[0] == '\0'));
+  if (start_daemon_if_needed)
+    {
+      /* set_socket changes the values for socket_name and
+        server_file, we need to reset them, if they were NULL before
+        for the second call to set_socket.  */
+      null_socket_name = (socket_name == NULL);
+      null_server_file = (server_file == NULL);
+    }
 
+  if ((emacs_socket = set_socket (alternate_editor
+                                 || start_daemon_if_needed)) == INVALID_SOCKET)
+    if (start_daemon_if_needed)
+      {
+       /* Reset socket_name and server_file if they were NULL
+          before the set_socket call.  */
+       if (null_socket_name)
+         socket_name = NULL;
+       if (null_server_file)
+         server_file = NULL;
+
+       start_daemon_and_retry_set_socket ();
+      }
+    else
+      fail ();
 
   cwd = get_current_dir_name ();
   if (cwd == 0)