]> code.delx.au - gnu-emacs/blobdiff - lib-src/emacsclient.c
Merged in changes from CVS HEAD
[gnu-emacs] / lib-src / emacsclient.c
index cfbf73a20c7ba7d163fe8d650dc4ed0b132436a0..6cf07d35e8a76faccdab67ff5c71f61187a92098 100644 (file)
@@ -1,5 +1,5 @@
 /* Client process that communicates with GNU Emacs acting as server.
-   Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003
+   Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003, 2004
    Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -438,9 +438,10 @@ main (argc, argv)
 
   {
     int sock_status = 0;
+    int default_sock = !socket_name;
     int saved_errno = 0;
     
-    if (! socket_name)
+    if (default_sock)
       {
        socket_name = alloca (system_name_length + 100);
        sprintf (socket_name, "/tmp/emacs%d-%s/server",
@@ -459,7 +460,7 @@ main (argc, argv)
     /* See if the socket exists, and if it's owned by us. */
     sock_status = socket_status (server.sun_path);
     saved_errno = errno;
-    if (sock_status)
+    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
@@ -476,8 +477,18 @@ main (argc, argv)
            if (pw && (pw->pw_uid != geteuid ()))
              {
                /* We're running under su, apparently. */
-               sprintf (server.sun_path, "/tmp/emacs%d-%s/server",
+               sprintf (socket_name, "/tmp/emacs%d-%s/server",
                         (int) pw->pw_uid, system_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 (1);
+                 }
+
                sock_status = socket_status (server.sun_path);
                 saved_errno = errno;
              }