X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/b0126eac41487b9bca5af5cbb2212ff5b2c58b80..ec6ad6f20a885e8a87f31c4fd2c76d470ae61d12:/lib-src/emacsclient.c
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index e8ffbe7c56..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;
@@ -752,7 +747,7 @@ 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;
@@ -859,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;
@@ -872,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;
@@ -910,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))
@@ -948,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);
@@ -972,8 +962,6 @@ get_server_config (struct sockaddr_in *server, char *authentication)
fclose (config);
- emacs_pid = atoi (pid);
-
return TRUE;
}
@@ -1232,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",
@@ -1476,7 +1478,7 @@ start_daemon_and_retry_set_socket (void)
else if (dpid < 0)
{
fprintf (stderr, "Error: Cannot fork!\n");
- exit (1);
+ exit (EXIT_FAILURE);
}
else
{
@@ -1506,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];
@@ -1576,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, " ");
@@ -1707,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';
@@ -1746,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))
@@ -1763,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';
}
}
@@ -1772,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 */
@@ -1794,7 +1801,5 @@ strerror (errnum)
#endif /* ! HAVE_STRERROR */
-/* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
- (do not change this comment) */
/* emacsclient.c ends here */