* server.el (server-process-filter): Use expand-file-name rather than
[bpt/emacs.git] / lib-src / emacsclient.c
index 005d885..3197b2a 100644 (file)
@@ -1,6 +1,6 @@
 /* Client process that communicates with GNU Emacs acting as server.
    Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2002, 2003, 2004,
-                 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+                 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -41,7 +41,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #else /* !WINDOWSNT */
 
-# include <sys/types.h>
+# include "syswait.h"
 
 # ifdef HAVE_INET_SOCKETS
 #  include <netinet/in.h>
@@ -54,7 +54,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 # define CLOSE_SOCKET close
 # define INITIALIZE()
 
-# define EMACS_DAEMON
+# ifndef WCONTINUED
+#  define WCONTINUED 8
+# endif
 
 #endif /* !WINDOWSNT */
 
@@ -572,7 +574,15 @@ decode_options (argc, argv)
      inconvenient.  So we force users to use "--display $DISPLAY" if
      they want Emacs to connect to their current display.  */
   if (!current_frame && !tty && !display)
-    display = egetenv ("DISPLAY");
+    {
+      display = egetenv ("DISPLAY");
+#ifdef NS_IMPL_COCOA
+      /* Under Cocoa, we don't really use displays the same way as in X,
+         so provide a dummy. */
+      if (!display || strlen (display) == 0)
+        display = "ns";
+#endif
+    }
 
   /* A null-string display is invalid.  */
   if (display && strlen (display) == 0)
@@ -586,6 +596,15 @@ decode_options (argc, argv)
      arguments or expressions given.  */
   if (nowait && tty && argc - optind > 0)
     current_frame = 1;
+
+#ifdef WINDOWSNT
+  if (alternate_editor && alternate_editor[0] == '\0')
+    {
+      message (TRUE, "--alternate-editor argument or ALTERNATE_EDITOR variable cannot be\n\
+an empty string");
+      exit (EXIT_FAILURE);
+    }
+#endif /* WINDOWSNT */
 }
 
 \f
@@ -618,10 +637,10 @@ 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"
-#ifdef EMACS_DAEMON
+#ifdef WINDOWSNT
 "                      If EDITOR is the empty string, start Emacs in daemon\n\
                        mode and try connecting again\n"
-#endif
+#endif /* WINDOWSNT */
 "\n\
 Report bugs to bug-gnu-emacs@gnu.org.\n", progname);
   exit (EXIT_SUCCESS);
@@ -1419,26 +1438,34 @@ w32_give_focus ()
 void
 start_daemon_and_retry_set_socket (void)
 {
-#ifdef EMACS_DAEMON
+#ifndef WINDOWSNT
   pid_t dpid;
   int status;
-  pid_t p;
 
   dpid = fork ();
 
   if (dpid > 0)
     {
-      p = waitpid (dpid, &status, WUNTRACED | WCONTINUED);
+      pid_t w;
+      w = 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 ((w == -1) || !WIFEXITED (status) || WEXITSTATUS(status))
+       {
+         message (TRUE, "Error: Could not start the Emacs daemon\n");
+         exit (EXIT_FAILURE);
+       }
+
+      /* Try connecting, the daemon should have started by now.  */
+      message (TRUE, "Emacs daemon should have started, trying to connect again\n");
       if ((emacs_socket = set_socket (1)) == INVALID_SOCKET)
-       message (TRUE, "Cannot connect even after starting the daemon\n");
+       {
+         message (TRUE, "Error: Cannot connect even after starting the Emacs daemon\n");
+         exit (EXIT_FAILURE);
+       }
     }
   else if (dpid < 0)
     {
-      fprintf (stderr, "Cannot fork!\n");
+      fprintf (stderr, "Error: Cannot fork!\n");
       exit (1);
     }
   else
@@ -1457,7 +1484,7 @@ start_daemon_and_retry_set_socket (void)
       execvp ("emacs", d_argv);
       message (TRUE, "%s: error starting emacs daemon\n", progname);
     }
-#endif /* EMACS_DAEMON */
+#endif /* WINDOWSNT */
 }
 
 int
@@ -1468,7 +1495,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 = 0;
+  int null_socket_name, null_server_file, start_daemon_if_needed;
 
   main_argv = argv;
   progname = argv[0];
@@ -1484,12 +1511,10 @@ main (argc, argv)
       exit (EXIT_FAILURE);
     }
 
-#ifdef EMACS_DAEMON
   /* 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'));
-#endif /* EMACS_DAEMON */
   if (start_daemon_if_needed)
     {
       /* set_socket changes the values for socket_name and
@@ -1541,11 +1566,11 @@ main (argc, argv)
           quote_argument (emacs_socket, environ[i]);
           send_to_emacs (emacs_socket, " ");
         }
-      send_to_emacs (emacs_socket, "-dir ");
-      quote_argument (emacs_socket, cwd);
-      send_to_emacs (emacs_socket, "/");
-      send_to_emacs (emacs_socket, " ");
     }
+  send_to_emacs (emacs_socket, "-dir ");
+  quote_argument (emacs_socket, cwd);
+  send_to_emacs (emacs_socket, "/");
+  send_to_emacs (emacs_socket, " ");
 
  retry:
   if (nowait)
@@ -1588,7 +1613,6 @@ main (argc, argv)
     {
       for (i = optind; i < argc; i++)
        {
-          int relative = 0;
 
          if (eval)
             {
@@ -1610,40 +1634,9 @@ main (argc, argv)
                   send_to_emacs (emacs_socket, " ");
                   continue;
                 }
-              else
-                relative = 1;
             }
-         else if (! file_name_absolute_p (argv[i]))
-#ifndef WINDOWSNT
-           relative = 1;
-#else
-           /* Call GetFullPathName so filenames of the form X:Y, where X is
-              a valid drive designator, are interpreted as drive:path, not
-              file:stream, and treated as absolute.
-              The user can still pass a file:stream if desired (for example,
-              .\X:Y), but it is not very useful, as Emacs currently does a
-              very bad job of dealing with NTFS streams. */
-           {
-             char *filename = (char *) xmalloc (MAX_PATH);
-             DWORD size;
-
-             size = GetFullPathName (argv[i], MAX_PATH, filename, NULL);
-             if (size > 0 && size < MAX_PATH)
-               argv[i] = filename;
-             else
-               {
-                 relative = 1;
-                 free (filename);
-               }
-           }
-#endif
 
           send_to_emacs (emacs_socket, "-file ");
-          if (relative)
-            {
-              quote_argument (emacs_socket, cwd);
-              send_to_emacs (emacs_socket, "/");
-            }
           quote_argument (emacs_socket, argv[i]);
           send_to_emacs (emacs_socket, " ");
         }