X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0613f5d515c2f7fe7930ad5f7d3e177e1fd3b44c..ec6ad6f20a885e8a87f31c4fd2c76d470ae61d12:/lib-src/emacsclient.c diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index cbc1dfe3f6..e5484b987e 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -1,6 +1,5 @@ /* 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, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1986-1987, 1994, 1999-2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -39,6 +38,9 @@ along with GNU Emacs. If not, see . */ # define CLOSE_SOCKET closesocket # define INITIALIZE() (initialize_sockets ()) +char *w32_getenv (char *); +#define egetenv(VAR) w32_getenv(VAR) + #else /* !WINDOWSNT */ # include "syswait.h" @@ -62,6 +64,8 @@ along with GNU Emacs. If not, see . */ # define WCONTINUED 8 # endif +#define egetenv(VAR) getenv(VAR) + #endif /* !WINDOWSNT */ #undef signal @@ -69,10 +73,8 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include "getopt.h" -#ifdef HAVE_UNISTD_H -# include -#endif +#include +#include #include #include @@ -86,13 +88,6 @@ char *getenv (const char *), *getwd (char *); char *(getcwd) (char *, size_t); #endif -#ifdef WINDOWSNT -char *w32_getenv (char *); -#define egetenv(VAR) w32_getenv(VAR) -#else -#define egetenv(VAR) getenv(VAR) -#endif - #ifndef VERSION #define VERSION "unspecified" #endif @@ -119,7 +114,7 @@ char *w32_getenv (char *); /* Name used to invoke this program. */ -char *progname; +const char *progname; /* The second argument to main. */ char **main_argv; @@ -134,7 +129,7 @@ int eval = 0; int current_frame = 1; /* The display on which Emacs should work. --display. */ -char *display = NULL; +const char *display = NULL; /* The parent window ID, if we are opening a frame via XEmbed. */ char *parent_id = NULL; @@ -150,7 +145,7 @@ const char *alternate_editor = NULL; char *socket_name = NULL; /* If non-NULL, the filename of the authentication file. */ -char *server_file = NULL; +const char *server_file = NULL; /* PID of the Emacs server process. */ int emacs_pid = 0; @@ -479,7 +474,7 @@ ttyname (int fd) /* Display a normal or error message. On Windows, use a message box if compiled as a Windows app. */ void -message (int is_error, char *message, ...) +message (int is_error, const char *message, ...) { char msg[2048]; va_list args; @@ -724,7 +719,7 @@ HSOCKET emacs_socket = 0; /* On Windows, the socket library was historically separate from the standard C library, so errors are handled differently. */ void -sock_err_message (char *function_name) +sock_err_message (const char *function_name) { #ifdef WINDOWSNT char* msg = NULL; @@ -748,11 +743,11 @@ sock_err_message (char *function_name) - the buffer is full (but this shouldn't happen) Otherwise, we just accumulate it. */ void -send_to_emacs (HSOCKET s, char *data) +send_to_emacs (HSOCKET s, const char *data) { while (data) { - int dlen = strlen (data); + size_t dlen = strlen (data); if (dlen + sblen >= SEND_BUFFER_SIZE) { int part = SEND_BUFFER_SIZE - sblen; @@ -787,10 +782,11 @@ send_to_emacs (HSOCKET s, char *data) Does not change the string. Outputs the result to S. */ void -quote_argument (HSOCKET s, char *str) +quote_argument (HSOCKET s, const char *str) { char *copy = (char *) xmalloc (strlen (str) * 2 + 1); - char *p, *q; + const char *p; + char *q; p = str; q = copy; @@ -858,7 +854,7 @@ unquote_argument (char *str) int -file_name_absolute_p (const unsigned char *filename) +file_name_absolute_p (const char *filename) { /* Sanity check, it shouldn't happen. */ if (! filename) return FALSE; @@ -871,7 +867,7 @@ file_name_absolute_p (const unsigned char *filename) #ifdef WINDOWSNT /* X:\xxx is always absolute. */ - if (isalpha (filename[0]) + if (isalpha ((unsigned char) filename[0]) && filename[1] == ':' && (filename[2] == '\\' || filename[2] == '/')) return TRUE; @@ -909,14 +905,13 @@ initialize_sockets (void) /* * Read the information needed to set up a TCP comm channel with - * the Emacs server: host, port, pid and authentication string. + * the Emacs server: host, port, and authentication string. */ int get_server_config (struct sockaddr_in *server, char *authentication) { char dotted[32]; char *port; - char *pid; FILE *config = NULL; if (file_name_absolute_p (server_file)) @@ -947,12 +942,8 @@ get_server_config (struct sockaddr_in *server, char *authentication) return FALSE; if (fgets (dotted, sizeof dotted, config) - && (port = strchr (dotted, ':')) - && (pid = strchr (port, ' '))) - { - *port++ = '\0'; - *pid++ = '\0'; - } + && (port = strchr (dotted, ':'))) + *port++ = '\0'; else { message (TRUE, "%s: invalid configuration info\n", progname); @@ -971,8 +962,6 @@ get_server_config (struct sockaddr_in *server, char *authentication) fclose (config); - emacs_pid = atoi (pid); - return TRUE; } @@ -1026,7 +1015,7 @@ set_tcp_socket (void) /* Returns 1 if PREFIX is a prefix of STRING. */ static int -strprefix (char *prefix, char *string) +strprefix (const char *prefix, const char *string) { return !strncmp (prefix, string, strlen (prefix)); } @@ -1215,8 +1204,8 @@ set_local_socket (void) int sock_status = 0; int default_sock = !socket_name; int saved_errno = 0; - char *server_name = "server"; - char *tmpdir; + const char *server_name = "server"; + const char *tmpdir; if (socket_name && !strchr (socket_name, '/') && !strchr (socket_name, '\\')) @@ -1231,7 +1220,21 @@ set_local_socket (void) { tmpdir = egetenv ("TMPDIR"); if (!tmpdir) - tmpdir = "/tmp"; + { +#ifdef DARWIN_OS +#ifndef _CS_DARWIN_USER_TEMP_DIR +#define _CS_DARWIN_USER_TEMP_DIR 65537 +#endif + size_t n = confstr (_CS_DARWIN_USER_TEMP_DIR, NULL, (size_t) 0); + if (n > 0) + { + tmpdir = alloca (n); + confstr (_CS_DARWIN_USER_TEMP_DIR, tmpdir, n); + } + else +#endif + tmpdir = "/tmp"; + } socket_name = alloca (strlen (tmpdir) + strlen (server_name) + EXTRA_SPACE); sprintf (socket_name, "%s/emacs%d/%s", @@ -1475,15 +1478,17 @@ start_daemon_and_retry_set_socket (void) else if (dpid < 0) { fprintf (stderr, "Error: Cannot fork!\n"); - exit (1); + exit (EXIT_FAILURE); } else { - char *d_argv[] = {"emacs", "--daemon", 0 }; + char emacs[] = "emacs"; + char daemon[] = "--daemon"; + char *d_argv[] = {emacs, daemon, 0 }; if (socket_name != NULL) { /* Pass --daemon=socket_name as argument. */ - char *deq = "--daemon="; + const char *deq = "--daemon="; char *daemon_arg = alloca (strlen (deq) + strlen (socket_name) + 1); strcpy (daemon_arg, deq); @@ -1503,6 +1508,7 @@ main (int argc, char **argv) char *cwd, *str; char string[BUFSIZ+1]; int null_socket_name, null_server_file, start_daemon_if_needed; + int exit_status = EXIT_SUCCESS; main_argv = argv; progname = argv[0]; @@ -1573,8 +1579,6 @@ main (int argc, char **argv) int i; for (i = 0; environ[i]; i++) { - char *name = xstrdup (environ[i]); - char *value = strchr (name, '='); send_to_emacs (emacs_socket, "-env "); quote_argument (emacs_socket, environ[i]); send_to_emacs (emacs_socket, " "); @@ -1704,7 +1708,8 @@ main (int argc, char **argv) fsync (1); /* Now, wait for an answer and print any messages. */ - while ((rl = recv (emacs_socket, string, BUFSIZ, 0)) > 0) + while (exit_status == EXIT_SUCCESS + && (rl = recv (emacs_socket, string, BUFSIZ, 0)) > 0) { char *p; string[rl] = '\0'; @@ -1743,6 +1748,7 @@ main (int argc, char **argv) printf ("\n"); fprintf (stderr, "*ERROR*: %s", str); needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n'; + exit_status = EXIT_FAILURE; } #ifdef SIGSTOP else if (strprefix ("-suspend ", string)) @@ -1760,7 +1766,8 @@ main (int argc, char **argv) if (needlf) printf ("\n"); printf ("*ERROR*: Unknown message: %s", string); - needlf = string[0] == '\0' ? needlf : string[strlen (string) - 1] != '\n'; + needlf = string[0] + == '\0' ? needlf : string[strlen (string) - 1] != '\n'; } } @@ -1769,8 +1776,11 @@ main (int argc, char **argv) fflush (stdout); fsync (1); + if (rl < 0) + exit_status = EXIT_FAILURE; + CLOSE_SOCKET (emacs_socket); - return EXIT_SUCCESS; + return exit_status; } #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */ @@ -1791,7 +1801,5 @@ strerror (errnum) #endif /* ! HAVE_STRERROR */ -/* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7 - (do not change this comment) */ /* emacsclient.c ends here */