]> code.delx.au - gnu-emacs/blobdiff - lib-src/emacsclient.c
(Program Modes): Replace inforef to emacs-xtra by conditional xref's, depending
[gnu-emacs] / lib-src / emacsclient.c
index dbdde16db0293516723c6eba3824b69f3718d67c..46cb7ec2aea6b34fc69151464e056e033b932e18 100644 (file)
@@ -1,6 +1,6 @@
 /* Client process that communicates with GNU Emacs acting as server.
-   Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003
-   Free Software Foundation, Inc.
+   Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2002, 2003, 2004,
+                 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -16,8 +16,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 
 #define NO_SHORTNAMES
@@ -42,10 +42,7 @@ Boston, MA 02111-1307, USA.  */
 #endif /* not VMS */
 
 char *getenv (), *getwd ();
-char *getcwd ();
-
-/* This is defined with -D from the compilation command,
-   which extracts it from ../lisp/version.el.  */
+char *(getcwd) ();
 
 #ifndef VERSION
 #define VERSION "unspecified"
@@ -92,6 +89,8 @@ decode_options (argc, argv)
      int argc;
      char **argv;
 {
+  alternate_editor = getenv ("ALTERNATE_EDITOR");
+
   while (1)
     {
       int opt = getopt_long (argc, argv,
@@ -100,8 +99,6 @@ decode_options (argc, argv)
       if (opt == EOF)
        break;
 
-      alternate_editor = getenv ("ALTERNATE_EDITOR");
-
       switch (opt)
        {
        case 0:
@@ -131,7 +128,7 @@ decode_options (argc, argv)
 
        case 'V':
          printf ("emacsclient %s\n", VERSION);
-         exit (0);
+         exit (EXIT_SUCCESS);
          break;
 
        case 'H':
@@ -140,7 +137,7 @@ decode_options (argc, argv)
 
        default:
          fprintf (stderr, "Try `%s --help' for more information\n", progname);
-         exit (1);
+         exit (EXIT_FAILURE);
          break;
        }
     }
@@ -166,12 +163,11 @@ The following OPTIONS are accepted:\n\
                         Editor to fallback to if the server is not running\n\
 \n\
 Report bugs to bug-gnu-emacs@gnu.org.\n", progname);
-  exit (0);
+  exit (EXIT_SUCCESS);
 }
 
-/* Inserting a &
-   before each &, each space, each newline, and any initial -.
-   Change spaces to underscores, too, so that the
+/* In NAME, insert a & before each &, each space, each newline, and
+   any initial -.  Change spaces to underscores, too, so that the
    return value never contains a space.  */
 
 void
@@ -207,7 +203,7 @@ quote_file_name (name, stream)
     }
   *q++ = 0;
 
-  fprintf (stream, copy);
+  fprintf (stream, "%s", copy);
 
   free (copy);
 }
@@ -222,7 +218,7 @@ xmalloc (size)
   if (result == NULL)
   {
     perror ("malloc");
-    exit (1);
+    exit (EXIT_FAILURE);
   }
   return result;
 }
@@ -244,7 +240,7 @@ fail (argc, argv)
     }
   else
     {
-      exit (1);
+      exit (EXIT_FAILURE);
     }
 }
 
@@ -300,8 +296,6 @@ main (argc, argv)
      int argc;
      char **argv;
 {
-  char *system_name;
-  int system_name_length;
   int s, i, needlf = 0;
   FILE *out, *in;
   struct sockaddr_un server;
@@ -317,7 +311,7 @@ main (argc, argv)
     {
       fprintf (stderr, "%s: file name or argument required\n", progname);
       fprintf (stderr, "Try `%s --help' for more information\n", progname);
-      exit (1);
+      exit (EXIT_FAILURE);
     }
 
   /*
@@ -333,49 +327,39 @@ main (argc, argv)
 
   server.sun_family = AF_UNIX;
 
-  {
-    char *dot;
-    system_name_length = 32;
-
-    while (1)
-      {
-       system_name = (char *) xmalloc (system_name_length + 1);
-
-       /* system_name must be null-terminated string.  */
-       system_name[system_name_length] = '\0';
-
-       if (gethostname (system_name, system_name_length) == 0)
-         break;
-
-       free (system_name);
-       system_name_length *= 2;
-      }
-
-    /* We always use the non-dotted host name, for simplicity.  */
-    dot = index (system_name, '.');
-    if (dot)
-      *dot = '\0';
-  }
-
   {
     int sock_status = 0;
+    int default_sock = !socket_name;
+    int saved_errno;
+    char *server_name = "server";
+
+    if (socket_name && !index (socket_name, '/') && !index (socket_name, '\\'))
+      { /* socket_name is a file name component.  */
+       server_name = socket_name;
+       socket_name = NULL;
+       default_sock = 1;       /* Try both UIDs.  */
+      }
 
-    if (! socket_name)
+    if (default_sock)
       {
-       socket_name = alloca (system_name_length + 100);
-       sprintf (socket_name, "/tmp/emacs%d-%s/server",
-                (int) geteuid (), system_name);
+       socket_name = alloca (100 + strlen (server_name));
+       sprintf (socket_name, "/tmp/emacs%d/%s",
+                (int) geteuid (), server_name);
       }
 
     if (strlen (socket_name) < sizeof (server.sun_path))
       strcpy (server.sun_path, socket_name);
     else
-      fprintf (stderr, "%s: socket-name %s too long",
-              argv[0], socket_name);
+      {
+       fprintf (stderr, "%s: socket-name %s too long",
+                argv[0], socket_name);
+       exit (EXIT_FAILURE);
+      }
 
     /* See if the socket exists, and if it's owned by us. */
     sock_status = socket_status (server.sun_path);
-    if (sock_status)
+    saved_errno = errno;
+    if (sock_status && default_sock)
       {
        /* Failing that, see if LOGNAME or USER exist and differ from
           our euid.  If so, look for a socket based on the UID
@@ -383,19 +367,35 @@ main (argc, argv)
           that init_editfns uses to set the global Vuser_full_name.  */
 
        char *user_name = (char *) getenv ("LOGNAME");
+
        if (!user_name)
          user_name = (char *) getenv ("USER");
 
        if (user_name)
          {
            struct passwd *pw = getpwnam (user_name);
+
            if (pw && (pw->pw_uid != geteuid ()))
              {
                /* We're running under su, apparently. */
-               sprintf (server.sun_path, "/tmp/esrv%d-%s",
-                        (int) pw->pw_uid, system_name);
+               socket_name = alloca (100 + strlen (server_name));
+               sprintf (socket_name, "/tmp/emacs%d/%s",
+                        (int) pw->pw_uid, server_name);
+
+               if (strlen (socket_name) < sizeof (server.sun_path))
+                 strcpy (server.sun_path, socket_name);
+               else
+                 {
+                   fprintf (stderr, "%s: socket-name %s too long",
+                            argv[0], socket_name);
+                   exit (EXIT_FAILURE);
+                 }
+
                sock_status = socket_status (server.sun_path);
+               saved_errno = errno;
              }
+           else
+             errno = saved_errno;
          }
       }
 
@@ -413,14 +413,14 @@ main (argc, argv)
 
        case 2:
         /* `stat' failed */
-        if (errno == ENOENT)
+        if (saved_errno == ENOENT)
           fprintf (stderr,
                    "%s: can't find socket; have you started the server?\n\
 To start the server in Emacs, type \"M-x server-start\".\n",
                    argv[0]);
         else
           fprintf (stderr, "%s: can't stat %s: %s\n",
-                   argv[0], server.sun_path, strerror (errno));
+                   argv[0], server.sun_path, strerror (saved_errno));
         fail (argc, argv);
         break;
        }
@@ -519,13 +519,13 @@ To start the server in Emacs, type \"M-x server-start\".\n",
        }
       fprintf (out, " ");
     }
-  
+
   fprintf (out, "\n");
   fflush (out);
 
   /* Maybe wait for an answer.   */
   if (nowait)
-    return 0;
+    return EXIT_SUCCESS;
 
   if (!eval)
     {
@@ -547,7 +547,7 @@ To start the server in Emacs, type \"M-x server-start\".\n",
     printf ("\n");
   fflush (stdout);
 
-  return 0;
+  return EXIT_SUCCESS;
 }
 
 #endif /* HAVE_SOCKETS */
@@ -569,3 +569,5 @@ strerror (errnum)
 
 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
    (do not change this comment) */
+
+/* emacsclient.c ends here */