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 */