(tool-bar-add-item-from-menu): Use
[bpt/emacs.git] / lib-src / emacsserver.c
index 9fbf3e8..fd532ce 100644 (file)
@@ -1,5 +1,5 @@
 /* Communication subprocess for GNU Emacs acting as server.
-   Copyright (C) 1986, 1987, 1992, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1986, 1987, 1992, 1994, 1999 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -26,17 +26,14 @@ Boston, MA 02111-1307, USA.  */
    up to the Emacs which then executes them.  */
 
 #define NO_SHORTNAMES
-#include <signal.h>
 #include <../src/config.h>
-#undef read
-#undef write
-#undef open
-#undef close
+#include <signal.h>
 #undef signal
 
 #if !defined (HAVE_SOCKETS) && !defined (HAVE_SYSVIPC)
 #include <stdio.h>
 
+int
 main ()
 {
   fprintf (stderr, "Sorry, the Emacs server is supported only on systems\n");
@@ -46,6 +43,9 @@ main ()
 
 #else /* HAVE_SOCKETS or HAVE_SYSVIPC */
 
+void perror_1 ();
+void fatal_error ();
+
 #if defined (HAVE_SOCKETS) && ! defined (NO_SOCKETS_IN_FILE_SYSTEM)
 /* BSD code is very different from SYSV IPC code */
 
@@ -57,7 +57,13 @@ main ()
 #include <errno.h>
 #include <sys/stat.h>
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef errno
 extern int errno;
+#endif
 
 /* Copied from src/process.c */
 #ifdef FD_SET
@@ -104,6 +110,7 @@ delete_socket (sig)
 
 /* Set up to handle all the signals.  */
 
+void
 handle_signals ()
 {
   signal (SIGHUP, delete_socket);
@@ -204,9 +211,14 @@ main (argc, argv)
      int argc;
      char **argv;
 {
-  char system_name[32];
+  char *system_name;
+  int system_name_length;
   int s, infd;
+#ifdef SOCKLEN_TYPE
+  SOCKLEN_TYPE fromlen;
+#else
   size_t fromlen;
+#endif
   struct sockaddr_un server, fromunix;
   char *homedir;
   char *str, string[BUFSIZ], code[BUFSIZ];
@@ -236,8 +248,23 @@ main (argc, argv)
       exit (1);
     }
   server.sun_family = AF_UNIX;
+
+  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;
+    }
+
 #ifndef SERVER_HOME_DIR
-  gethostname (system_name, sizeof (system_name));
   sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name);
 
   if (unlink (server.sun_path) == -1 && errno != ENOENT)
@@ -251,7 +278,6 @@ main (argc, argv)
 
   strcpy (server.sun_path, homedir);
   strcat (server.sun_path, "/.emacs-server-");
-  gethostname (system_name, sizeof (system_name));
   strcat (server.sun_path, system_name);
   /* Delete anyone else's old server.  */
   unlink (server.sun_path);
@@ -410,6 +436,7 @@ msgcatch ()
    Its stderr always exists--rms.  */
 #include <stdio.h>
 
+int
 main ()
 {
   int s, infd, fromlen, ioproc;
@@ -539,10 +566,10 @@ main ()
 
 #endif /* HAVE_SYSVIPC */
 
-#endif /* HAVE_SOCKETS or HAVE_SYSVIPC */
 \f
 /* This is like perror but puts `Error: ' at the beginning.  */
 
+void
 perror_1 (string)
      char *string;
 {
@@ -555,6 +582,7 @@ perror_1 (string)
   perror (copy);
 }
 
+void
 fatal_error (string)
      char *string;
 {
@@ -562,3 +590,4 @@ fatal_error (string)
   fprintf (stderr, string);
   exit (1);
 }
+#endif /* HAVE_SOCKETS or HAVE_SYSVIPC */