Revert changes adding format args to yes-or-no-p and y-or-n-p.
[emacs.git] / lib-src / emacsclient.c
blobab0057d62736c7fe68ea27ca1031707c8fac4e25
1 /* Client process that communicates with GNU Emacs acting as server.
2 Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
23 #ifdef WINDOWSNT
25 /* config.h defines these, which disables sockets altogether! */
26 # undef _WINSOCKAPI_
27 # undef _WINSOCK_H
29 # include <malloc.h>
30 # include <stdlib.h>
31 # include <windows.h>
32 # include <commctrl.h>
33 # include <io.h>
34 # include <winsock2.h>
36 # define NO_SOCKETS_IN_FILE_SYSTEM
38 # define HSOCKET SOCKET
39 # define CLOSE_SOCKET closesocket
40 # define INITIALIZE() (initialize_sockets ())
42 char *w32_getenv (char *);
43 #define egetenv(VAR) w32_getenv(VAR)
45 #else /* !WINDOWSNT */
47 # include "syswait.h"
49 # ifdef HAVE_INET_SOCKETS
50 # include <netinet/in.h>
51 # ifdef HAVE_SOCKETS
52 # include <sys/types.h>
53 # include <sys/socket.h>
54 # include <sys/un.h>
55 # endif /* HAVE_SOCKETS */
56 # endif
57 # include <arpa/inet.h>
59 # define INVALID_SOCKET -1
60 # define HSOCKET int
61 # define CLOSE_SOCKET close
62 # define INITIALIZE()
64 # ifndef WCONTINUED
65 # define WCONTINUED 8
66 # endif
68 #define egetenv(VAR) getenv(VAR)
70 #endif /* !WINDOWSNT */
72 #undef signal
74 #include <stdarg.h>
75 #include <ctype.h>
76 #include <stdio.h>
77 #include <getopt.h>
78 #include <unistd.h>
80 #include <pwd.h>
81 #include <sys/stat.h>
82 #include <signal.h>
83 #include <errno.h>
87 char *getenv (const char *), *getwd (char *);
88 #ifdef HAVE_GETCWD
89 char *(getcwd) (char *, size_t);
90 #endif
92 #ifndef VERSION
93 #define VERSION "unspecified"
94 #endif
97 #ifndef EXIT_SUCCESS
98 #define EXIT_SUCCESS 0
99 #endif
101 #ifndef EXIT_FAILURE
102 #define EXIT_FAILURE 1
103 #endif
105 #ifndef FALSE
106 #define FALSE 0
107 #endif
109 #ifndef TRUE
110 #define TRUE 1
111 #endif
113 /* Additional space when allocating buffers for filenames, etc. */
114 #define EXTRA_SPACE 100
117 /* Name used to invoke this program. */
118 const char *progname;
120 /* The second argument to main. */
121 char **main_argv;
123 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
124 int nowait = 0;
126 /* Nonzero means args are expressions to be evaluated. --eval. */
127 int eval = 0;
129 /* Nonzero means don't open a new frame. Inverse of --create-frame. */
130 int current_frame = 1;
132 /* The display on which Emacs should work. --display. */
133 const char *display = NULL;
135 /* The parent window ID, if we are opening a frame via XEmbed. */
136 char *parent_id = NULL;
138 /* Nonzero means open a new Emacs frame on the current terminal. */
139 int tty = 0;
141 /* If non-NULL, the name of an editor to fallback to if the server
142 is not running. --alternate-editor. */
143 const char *alternate_editor = NULL;
145 /* If non-NULL, the filename of the UNIX socket. */
146 char *socket_name = NULL;
148 /* If non-NULL, the filename of the authentication file. */
149 const char *server_file = NULL;
151 /* PID of the Emacs server process. */
152 int emacs_pid = 0;
154 void print_help_and_exit (void) NO_RETURN;
155 void fail (void) NO_RETURN;
158 struct option longopts[] =
160 { "no-wait", no_argument, NULL, 'n' },
161 { "eval", no_argument, NULL, 'e' },
162 { "help", no_argument, NULL, 'H' },
163 { "version", no_argument, NULL, 'V' },
164 { "tty", no_argument, NULL, 't' },
165 { "nw", no_argument, NULL, 't' },
166 { "create-frame", no_argument, NULL, 'c' },
167 { "alternate-editor", required_argument, NULL, 'a' },
168 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
169 { "socket-name", required_argument, NULL, 's' },
170 #endif
171 { "server-file", required_argument, NULL, 'f' },
172 #ifndef WINDOWSNT
173 { "display", required_argument, NULL, 'd' },
174 #endif
175 { "parent-id", required_argument, NULL, 'p' },
176 { 0, 0, 0, 0 }
180 /* Like malloc but get fatal error if memory is exhausted. */
182 long *
183 xmalloc (unsigned int size)
185 long *result = (long *) malloc (size);
186 if (result == NULL)
188 perror ("malloc");
189 exit (EXIT_FAILURE);
191 return result;
194 /* Like strdup but get a fatal error if memory is exhausted. */
196 char *
197 xstrdup (const char *s)
199 char *result = strdup (s);
200 if (result == NULL)
202 perror ("strdup");
203 exit (EXIT_FAILURE);
205 return result;
208 /* From sysdep.c */
209 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
211 /* From lisp.h */
212 #ifndef DIRECTORY_SEP
213 #define DIRECTORY_SEP '/'
214 #endif
215 #ifndef IS_DIRECTORY_SEP
216 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
217 #endif
218 #ifndef IS_DEVICE_SEP
219 #ifndef DEVICE_SEP
220 #define IS_DEVICE_SEP(_c_) 0
221 #else
222 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
223 #endif
224 #endif
225 #ifndef IS_ANY_SEP
226 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
227 #endif
230 /* Return the current working directory. Returns NULL on errors.
231 Any other returned value must be freed with free. This is used
232 only when get_current_dir_name is not defined on the system. */
233 char*
234 get_current_dir_name (void)
236 char *buf;
237 char *pwd;
238 struct stat dotstat, pwdstat;
239 /* If PWD is accurate, use it instead of calling getwd. PWD is
240 sometimes a nicer name, and using it may avoid a fatal error if a
241 parent directory is searchable but not readable. */
242 if ((pwd = egetenv ("PWD")) != 0
243 && (IS_DIRECTORY_SEP (*pwd) || (*pwd && IS_DEVICE_SEP (pwd[1])))
244 && stat (pwd, &pwdstat) == 0
245 && stat (".", &dotstat) == 0
246 && dotstat.st_ino == pwdstat.st_ino
247 && dotstat.st_dev == pwdstat.st_dev
248 #ifdef MAXPATHLEN
249 && strlen (pwd) < MAXPATHLEN
250 #endif
253 buf = (char *) xmalloc (strlen (pwd) + 1);
254 if (!buf)
255 return NULL;
256 strcpy (buf, pwd);
258 #ifdef HAVE_GETCWD
259 else
261 size_t buf_size = 1024;
262 buf = (char *) xmalloc (buf_size);
263 if (!buf)
264 return NULL;
265 for (;;)
267 if (getcwd (buf, buf_size) == buf)
268 break;
269 if (errno != ERANGE)
271 int tmp_errno = errno;
272 free (buf);
273 errno = tmp_errno;
274 return NULL;
276 buf_size *= 2;
277 buf = (char *) realloc (buf, buf_size);
278 if (!buf)
279 return NULL;
282 #else
283 else
285 /* We need MAXPATHLEN here. */
286 buf = (char *) xmalloc (MAXPATHLEN + 1);
287 if (!buf)
288 return NULL;
289 if (getwd (buf) == NULL)
291 int tmp_errno = errno;
292 free (buf);
293 errno = tmp_errno;
294 return NULL;
297 #endif
298 return buf;
300 #endif
302 #ifdef WINDOWSNT
304 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
306 /* Retrieve an environment variable from the Emacs subkeys of the registry.
307 Return NULL if the variable was not found, or it was empty.
308 This code is based on w32_get_resource (w32.c). */
309 char *
310 w32_get_resource (HKEY predefined, char *key, LPDWORD type)
312 HKEY hrootkey = NULL;
313 char *result = NULL;
314 DWORD cbData;
316 if (RegOpenKeyEx (predefined, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
318 if (RegQueryValueEx (hrootkey, key, NULL, NULL, NULL, &cbData) == ERROR_SUCCESS)
320 result = (char *) xmalloc (cbData);
322 if ((RegQueryValueEx (hrootkey, key, NULL, type, result, &cbData) != ERROR_SUCCESS)
323 || (*result == 0))
325 free (result);
326 result = NULL;
330 RegCloseKey (hrootkey);
333 return result;
337 getenv wrapper for Windows
339 This is needed to duplicate Emacs's behavior, which is to look for environment
340 variables in the registry if they don't appear in the environment.
342 char *
343 w32_getenv (char *envvar)
345 char *value;
346 DWORD dwType;
348 if (value = getenv (envvar))
349 /* Found in the environment. */
350 return value;
352 if (! (value = w32_get_resource (HKEY_CURRENT_USER, envvar, &dwType)) &&
353 ! (value = w32_get_resource (HKEY_LOCAL_MACHINE, envvar, &dwType)))
355 /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */
356 if (strcmp (envvar, "TERM") == 0)
357 return xstrdup ("w32console");
358 /* Found neither in the environment nor in the registry. */
359 return NULL;
362 if (dwType == REG_SZ)
363 /* Registry; no need to expand. */
364 return value;
366 if (dwType == REG_EXPAND_SZ)
368 DWORD size;
370 if (size = ExpandEnvironmentStrings (value, NULL, 0))
372 char *buffer = (char *) xmalloc (size);
373 if (ExpandEnvironmentStrings (value, buffer, size))
375 /* Found and expanded. */
376 free (value);
377 return buffer;
380 /* Error expanding. */
381 free (buffer);
385 /* Not the right type, or not correctly expanded. */
386 free (value);
387 return NULL;
390 void
391 w32_set_user_model_id (void)
393 HMODULE shell;
394 HRESULT (WINAPI * set_user_model) (wchar_t * id);
396 /* On Windows 7 and later, we need to set the user model ID
397 to associate emacsclient launched files with Emacs frames
398 in the UI. */
399 shell = LoadLibrary ("shell32.dll");
400 if (shell)
402 set_user_model
403 = (void *) GetProcAddress (shell,
404 "SetCurrentProcessExplicitAppUserModelID");
405 /* If the function is defined, then we are running on Windows 7
406 or newer, and the UI uses this to group related windows
407 together. Since emacs, runemacs, emacsclient are related, we
408 want them grouped even though the executables are different,
409 so we need to set a consistent ID between them. */
410 if (set_user_model)
411 set_user_model (L"GNU.Emacs");
413 FreeLibrary (shell);
418 w32_window_app (void)
420 static int window_app = -1;
421 char szTitle[MAX_PATH];
423 if (window_app < 0)
425 /* Checking for STDOUT does not work; it's a valid handle also in
426 nonconsole apps. Testing for the console title seems to work. */
427 window_app = (GetConsoleTitleA (szTitle, MAX_PATH) == 0);
428 if (window_app)
429 InitCommonControls ();
432 return window_app;
436 execvp wrapper for Windows. Quotes arguments with embedded spaces.
438 This is necessary due to the broken implementation of exec* routines in
439 the Microsoft libraries: they concatenate the arguments together without
440 quoting special characters, and pass the result to CreateProcess, with
441 predictably bad results. By contrast, POSIX execvp passes the arguments
442 directly into the argv array of the child process.
445 w32_execvp (const char *path, char **argv)
447 int i;
449 /* Required to allow a .BAT script as alternate editor. */
450 argv[0] = (char *) alternate_editor;
452 for (i = 0; argv[i]; i++)
453 if (strchr (argv[i], ' '))
455 char *quoted = alloca (strlen (argv[i]) + 3);
456 sprintf (quoted, "\"%s\"", argv[i]);
457 argv[i] = quoted;
460 return execvp (path, argv);
463 #undef execvp
464 #define execvp w32_execvp
466 /* Emulation of ttyname for Windows. */
467 char *
468 ttyname (int fd)
470 return "CONOUT$";
473 #endif /* WINDOWSNT */
475 /* Display a normal or error message.
476 On Windows, use a message box if compiled as a Windows app. */
477 void
478 message (int is_error, const char *message, ...)
480 char msg[2048];
481 va_list args;
483 va_start (args, message);
484 vsprintf (msg, message, args);
485 va_end (args);
487 #ifdef WINDOWSNT
488 if (w32_window_app ())
490 if (is_error)
491 MessageBox (NULL, msg, "Emacsclient ERROR", MB_ICONERROR);
492 else
493 MessageBox (NULL, msg, "Emacsclient", MB_ICONINFORMATION);
495 else
496 #endif
498 FILE *f = is_error ? stderr : stdout;
500 fputs (msg, f);
501 fflush (f);
505 /* Decode the options from argv and argc.
506 The global variable `optind' will say how many arguments we used up. */
508 void
509 decode_options (int argc, char **argv)
511 alternate_editor = egetenv ("ALTERNATE_EDITOR");
513 while (1)
515 int opt = getopt_long_only (argc, argv,
516 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
517 "VHnea:s:f:d:tc",
518 #else
519 "VHnea:f:d:tc",
520 #endif
521 longopts, 0);
523 if (opt == EOF)
524 break;
526 switch (opt)
528 case 0:
529 /* If getopt returns 0, then it has already processed a
530 long-named option. We should do nothing. */
531 break;
533 case 'a':
534 alternate_editor = optarg;
535 break;
537 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
538 case 's':
539 socket_name = optarg;
540 break;
541 #endif
543 case 'f':
544 server_file = optarg;
545 break;
547 /* We used to disallow this argument in w32, but it seems better
548 to allow it, for the occasional case where the user is
549 connecting with a w32 client to a server compiled with X11
550 support. */
551 case 'd':
552 display = optarg;
553 break;
555 case 'n':
556 nowait = 1;
557 break;
559 case 'e':
560 eval = 1;
561 break;
563 case 'V':
564 message (FALSE, "emacsclient %s\n", VERSION);
565 exit (EXIT_SUCCESS);
566 break;
568 case 't':
569 tty = 1;
570 current_frame = 0;
571 break;
573 case 'c':
574 current_frame = 0;
575 break;
577 case 'p':
578 parent_id = optarg;
579 current_frame = 0;
580 break;
582 case 'H':
583 print_help_and_exit ();
584 break;
586 default:
587 message (TRUE, "Try `%s --help' for more information\n", progname);
588 exit (EXIT_FAILURE);
589 break;
593 /* If the -c option is used (without -t) and no --display argument
594 is provided, try $DISPLAY.
595 Without the -c option, we used to set `display' to $DISPLAY by
596 default, but this changed the default behavior and is sometimes
597 inconvenient. So we force users to use "--display $DISPLAY" if
598 they want Emacs to connect to their current display. */
599 if (!current_frame && !tty && !display)
601 display = egetenv ("DISPLAY");
602 #ifdef NS_IMPL_COCOA
603 /* Under Cocoa, we don't really use displays the same way as in X,
604 so provide a dummy. */
605 if (!display || strlen (display) == 0)
606 display = "ns";
607 #endif
610 /* A null-string display is invalid. */
611 if (display && strlen (display) == 0)
612 display = NULL;
614 /* If no display is available, new frames are tty frames. */
615 if (!current_frame && !display)
616 tty = 1;
618 /* --no-wait implies --current-frame on ttys when there are file
619 arguments or expressions given. */
620 if (nowait && tty && argc - optind > 0)
621 current_frame = 1;
623 #ifdef WINDOWSNT
624 if (alternate_editor && alternate_editor[0] == '\0')
626 message (TRUE, "--alternate-editor argument or ALTERNATE_EDITOR variable cannot be\n\
627 an empty string");
628 exit (EXIT_FAILURE);
630 #endif /* WINDOWSNT */
634 void
635 print_help_and_exit (void)
637 /* Spaces and tabs are significant in this message; they're chosen so the
638 message aligns properly both in a tty and in a Windows message box.
639 Please try to preserve them; otherwise the output is very hard to read
640 when using emacsclientw. */
641 message (FALSE,
642 "Usage: %s [OPTIONS] FILE...\n\
643 Tell the Emacs server to visit the specified files.\n\
644 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
646 The following OPTIONS are accepted:\n\
647 -V, --version Just print version info and return\n\
648 -H, --help Print this usage information message\n\
649 -nw, -t, --tty Open a new Emacs frame on the current terminal\n\
650 -c, --create-frame Create a new frame instead of trying to\n\
651 use the current Emacs frame\n\
652 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
653 -n, --no-wait Don't wait for the server to return\n\
654 -d DISPLAY, --display=DISPLAY\n\
655 Visit the file in the given display\n\
656 --parent-id=ID Open in parent window ID, via XEmbed\n"
657 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
658 "-s SOCKET, --socket-name=SOCKET\n\
659 Set filename of the UNIX socket for communication\n"
660 #endif
661 "-f SERVER, --server-file=SERVER\n\
662 Set filename of the TCP authentication file\n\
663 -a EDITOR, --alternate-editor=EDITOR\n\
664 Editor to fallback to if the server is not running\n"
665 #ifndef WINDOWSNT
666 " If EDITOR is the empty string, start Emacs in daemon\n\
667 mode and try connecting again\n"
668 #endif /* not WINDOWSNT */
669 "\n\
670 Report bugs with M-x report-emacs-bug.\n", progname);
671 exit (EXIT_SUCCESS);
675 Try to run a different command, or --if no alternate editor is
676 defined-- exit with an errorcode.
677 Uses argv, but gets it from the global variable main_argv.
679 void
680 fail (void)
682 if (alternate_editor)
684 int i = optind - 1;
686 execvp (alternate_editor, main_argv + i);
687 message (TRUE, "%s: error executing alternate editor \"%s\"\n",
688 progname, alternate_editor);
690 exit (EXIT_FAILURE);
694 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
697 main (int argc, char **argv)
699 main_argv = argv;
700 progname = argv[0];
701 message (TRUE, "%s: Sorry, the Emacs server is supported only\n"
702 "on systems with Berkeley sockets.\n",
703 argv[0]);
704 fail ();
707 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
709 #define AUTH_KEY_LENGTH 64
710 #define SEND_BUFFER_SIZE 4096
712 extern char *strerror (int);
714 /* Buffer to accumulate data to send in TCP connections. */
715 char send_buffer[SEND_BUFFER_SIZE + 1];
716 int sblen = 0; /* Fill pointer for the send buffer. */
717 /* Socket used to communicate with the Emacs server process. */
718 HSOCKET emacs_socket = 0;
720 /* On Windows, the socket library was historically separate from the standard
721 C library, so errors are handled differently. */
722 void
723 sock_err_message (const char *function_name)
725 #ifdef WINDOWSNT
726 char* msg = NULL;
728 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
729 | FORMAT_MESSAGE_ALLOCATE_BUFFER
730 | FORMAT_MESSAGE_ARGUMENT_ARRAY,
731 NULL, WSAGetLastError (), 0, (LPTSTR)&msg, 0, NULL);
733 message (TRUE, "%s: %s: %s\n", progname, function_name, msg);
735 LocalFree (msg);
736 #else
737 message (TRUE, "%s: %s: %s\n", progname, function_name, strerror (errno));
738 #endif
742 /* Let's send the data to Emacs when either
743 - the data ends in "\n", or
744 - the buffer is full (but this shouldn't happen)
745 Otherwise, we just accumulate it. */
746 void
747 send_to_emacs (HSOCKET s, const char *data)
749 while (data)
751 size_t dlen = strlen (data);
752 if (dlen + sblen >= SEND_BUFFER_SIZE)
754 int part = SEND_BUFFER_SIZE - sblen;
755 strncpy (&send_buffer[sblen], data, part);
756 data += part;
757 sblen = SEND_BUFFER_SIZE;
759 else if (dlen)
761 strcpy (&send_buffer[sblen], data);
762 data = NULL;
763 sblen += dlen;
765 else
766 break;
768 if (sblen == SEND_BUFFER_SIZE
769 || (sblen > 0 && send_buffer[sblen-1] == '\n'))
771 int sent = send (s, send_buffer, sblen, 0);
772 if (sent != sblen)
773 strcpy (send_buffer, &send_buffer[sent]);
774 sblen -= sent;
780 /* In STR, insert a & before each &, each space, each newline, and
781 any initial -. Change spaces to underscores, too, so that the
782 return value never contains a space.
784 Does not change the string. Outputs the result to S. */
785 void
786 quote_argument (HSOCKET s, const char *str)
788 char *copy = (char *) xmalloc (strlen (str) * 2 + 1);
789 const char *p;
790 char *q;
792 p = str;
793 q = copy;
794 while (*p)
796 if (*p == ' ')
798 *q++ = '&';
799 *q++ = '_';
800 p++;
802 else if (*p == '\n')
804 *q++ = '&';
805 *q++ = 'n';
806 p++;
808 else
810 if (*p == '&' || (*p == '-' && p == str))
811 *q++ = '&';
812 *q++ = *p++;
815 *q++ = 0;
817 send_to_emacs (s, copy);
819 free (copy);
823 /* The inverse of quote_argument. Removes quoting in string STR by
824 modifying the string in place. Returns STR. */
826 char *
827 unquote_argument (char *str)
829 char *p, *q;
831 if (! str)
832 return str;
834 p = str;
835 q = str;
836 while (*p)
838 if (*p == '&')
840 p++;
841 if (*p == '&')
842 *p = '&';
843 else if (*p == '_')
844 *p = ' ';
845 else if (*p == 'n')
846 *p = '\n';
847 else if (*p == '-')
848 *p = '-';
850 *q++ = *p++;
852 *q = 0;
853 return str;
858 file_name_absolute_p (const unsigned char *filename)
860 /* Sanity check, it shouldn't happen. */
861 if (! filename) return FALSE;
863 /* /xxx is always an absolute path. */
864 if (filename[0] == '/') return TRUE;
866 /* Empty filenames (which shouldn't happen) are relative. */
867 if (filename[0] == '\0') return FALSE;
869 #ifdef WINDOWSNT
870 /* X:\xxx is always absolute. */
871 if (isalpha (filename[0])
872 && filename[1] == ':' && (filename[2] == '\\' || filename[2] == '/'))
873 return TRUE;
875 /* Both \xxx and \\xxx\yyy are absolute. */
876 if (filename[0] == '\\') return TRUE;
877 #endif
879 return FALSE;
882 #ifdef WINDOWSNT
883 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
884 void __cdecl
885 close_winsock (void)
887 WSACleanup ();
890 /* Initialize the WinSock2 library. */
891 void
892 initialize_sockets (void)
894 WSADATA wsaData;
896 if (WSAStartup (MAKEWORD (2, 0), &wsaData))
898 message (TRUE, "%s: error initializing WinSock2\n", progname);
899 exit (EXIT_FAILURE);
902 atexit (close_winsock);
904 #endif /* WINDOWSNT */
908 * Read the information needed to set up a TCP comm channel with
909 * the Emacs server: host, port, and authentication string.
912 get_server_config (struct sockaddr_in *server, char *authentication)
914 char dotted[32];
915 char *port;
916 FILE *config = NULL;
918 if (file_name_absolute_p (server_file))
919 config = fopen (server_file, "rb");
920 else
922 char *home = egetenv ("HOME");
924 if (home)
926 char *path = alloca (strlen (home) + strlen (server_file)
927 + EXTRA_SPACE);
928 sprintf (path, "%s/.emacs.d/server/%s", home, server_file);
929 config = fopen (path, "rb");
931 #ifdef WINDOWSNT
932 if (!config && (home = egetenv ("APPDATA")))
934 char *path = alloca (strlen (home) + strlen (server_file)
935 + EXTRA_SPACE);
936 sprintf (path, "%s/.emacs.d/server/%s", home, server_file);
937 config = fopen (path, "rb");
939 #endif
942 if (! config)
943 return FALSE;
945 if (fgets (dotted, sizeof dotted, config)
946 && (port = strchr (dotted, ':')))
947 *port++ = '\0';
948 else
950 message (TRUE, "%s: invalid configuration info\n", progname);
951 exit (EXIT_FAILURE);
954 server->sin_family = AF_INET;
955 server->sin_addr.s_addr = inet_addr (dotted);
956 server->sin_port = htons (atoi (port));
958 if (! fread (authentication, AUTH_KEY_LENGTH, 1, config))
960 message (TRUE, "%s: cannot read authentication info\n", progname);
961 exit (EXIT_FAILURE);
964 fclose (config);
966 return TRUE;
969 HSOCKET
970 set_tcp_socket (void)
972 HSOCKET s;
973 struct sockaddr_in server;
974 struct linger l_arg = {1, 1};
975 char auth_string[AUTH_KEY_LENGTH + 1];
977 if (! get_server_config (&server, auth_string))
978 return INVALID_SOCKET;
980 if (server.sin_addr.s_addr != inet_addr ("127.0.0.1"))
981 message (FALSE, "%s: connected to remote socket at %s\n",
982 progname, inet_ntoa (server.sin_addr));
985 * Open up an AF_INET socket
987 if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
989 sock_err_message ("socket");
990 return INVALID_SOCKET;
994 * Set up the socket
996 if (connect (s, (struct sockaddr *) &server, sizeof server) < 0)
998 sock_err_message ("connect");
999 return INVALID_SOCKET;
1002 setsockopt (s, SOL_SOCKET, SO_LINGER, (char *) &l_arg, sizeof l_arg);
1005 * Send the authentication
1007 auth_string[AUTH_KEY_LENGTH] = '\0';
1009 send_to_emacs (s, "-auth ");
1010 send_to_emacs (s, auth_string);
1011 send_to_emacs (s, " ");
1013 return s;
1017 /* Returns 1 if PREFIX is a prefix of STRING. */
1018 static int
1019 strprefix (const char *prefix, const char *string)
1021 return !strncmp (prefix, string, strlen (prefix));
1024 /* Get tty name and type. If successful, return the type in TTY_TYPE
1025 and the name in TTY_NAME, and return 1. Otherwise, fail if NOABORT
1026 is zero, or return 0 if NOABORT is non-zero. */
1029 find_tty (char **tty_type, char **tty_name, int noabort)
1031 char *type = egetenv ("TERM");
1032 char *name = ttyname (fileno (stdout));
1034 if (!name)
1036 if (noabort)
1037 return 0;
1038 else
1040 message (TRUE, "%s: could not get terminal name\n", progname);
1041 fail ();
1045 if (!type)
1047 if (noabort)
1048 return 0;
1049 else
1051 message (TRUE, "%s: please set the TERM variable to your terminal type\n",
1052 progname);
1053 fail ();
1057 if (strcmp (type, "eterm") == 0)
1059 if (noabort)
1060 return 0;
1061 else
1063 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1064 message (TRUE, "%s: opening a frame in an Emacs term buffer"
1065 " is not supported\n", progname);
1066 fail ();
1070 *tty_name = name;
1071 *tty_type = type;
1072 return 1;
1076 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1078 /* Three possibilities:
1079 2 - can't be `stat'ed (sets errno)
1080 1 - isn't owned by us
1081 0 - success: none of the above */
1083 static int
1084 socket_status (char *socket_name)
1086 struct stat statbfr;
1088 if (stat (socket_name, &statbfr) == -1)
1089 return 2;
1091 if (statbfr.st_uid != geteuid ())
1092 return 1;
1094 return 0;
1098 /* A signal handler that passes the signal to the Emacs process.
1099 Useful for SIGWINCH. */
1101 SIGTYPE
1102 pass_signal_to_emacs (int signalnum)
1104 int old_errno = errno;
1106 if (emacs_pid)
1107 kill (emacs_pid, signalnum);
1109 signal (signalnum, pass_signal_to_emacs);
1110 errno = old_errno;
1113 /* Signal handler for SIGCONT; notify the Emacs process that it can
1114 now resume our tty frame. */
1116 SIGTYPE
1117 handle_sigcont (int signalnum)
1119 int old_errno = errno;
1121 if (tcgetpgrp (1) == getpgrp ())
1123 /* We are in the foreground. */
1124 send_to_emacs (emacs_socket, "-resume \n");
1126 else
1128 /* We are in the background; cancel the continue. */
1129 kill (getpid (), SIGSTOP);
1132 signal (signalnum, handle_sigcont);
1133 errno = old_errno;
1136 /* Signal handler for SIGTSTP; notify the Emacs process that we are
1137 going to sleep. Normally the suspend is initiated by Emacs via
1138 server-handle-suspend-tty, but if the server gets out of sync with
1139 reality, we may get a SIGTSTP on C-z. Handling this signal and
1140 notifying Emacs about it should get things under control again. */
1142 SIGTYPE
1143 handle_sigtstp (int signalnum)
1145 int old_errno = errno;
1146 sigset_t set;
1148 if (emacs_socket)
1149 send_to_emacs (emacs_socket, "-suspend \n");
1151 /* Unblock this signal and call the default handler by temporarily
1152 changing the handler and resignalling. */
1153 sigprocmask (SIG_BLOCK, NULL, &set);
1154 sigdelset (&set, signalnum);
1155 signal (signalnum, SIG_DFL);
1156 kill (getpid (), signalnum);
1157 sigprocmask (SIG_SETMASK, &set, NULL); /* Let's the above signal through. */
1158 signal (signalnum, handle_sigtstp);
1160 errno = old_errno;
1164 /* Set up signal handlers before opening a frame on the current tty. */
1166 void
1167 init_signals (void)
1169 /* Set up signal handlers. */
1170 signal (SIGWINCH, pass_signal_to_emacs);
1172 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1173 deciding which terminal the signal came from. C-g is now a
1174 normal input event on secondary terminals. */
1175 #if 0
1176 signal (SIGINT, pass_signal_to_emacs);
1177 signal (SIGQUIT, pass_signal_to_emacs);
1178 #endif
1180 signal (SIGCONT, handle_sigcont);
1181 signal (SIGTSTP, handle_sigtstp);
1182 signal (SIGTTOU, handle_sigtstp);
1186 HSOCKET
1187 set_local_socket (void)
1189 HSOCKET s;
1190 struct sockaddr_un server;
1193 * Open up an AF_UNIX socket in this person's home directory
1196 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
1198 message (TRUE, "%s: socket: %s\n", progname, strerror (errno));
1199 return INVALID_SOCKET;
1202 server.sun_family = AF_UNIX;
1205 int sock_status = 0;
1206 int default_sock = !socket_name;
1207 int saved_errno = 0;
1208 const char *server_name = "server";
1209 const char *tmpdir;
1211 if (socket_name && !strchr (socket_name, '/')
1212 && !strchr (socket_name, '\\'))
1214 /* socket_name is a file name component. */
1215 server_name = socket_name;
1216 socket_name = NULL;
1217 default_sock = 1; /* Try both UIDs. */
1220 if (default_sock)
1222 tmpdir = egetenv ("TMPDIR");
1223 if (!tmpdir)
1225 #ifdef DARWIN_OS
1226 #ifndef _CS_DARWIN_USER_TEMP_DIR
1227 #define _CS_DARWIN_USER_TEMP_DIR 65537
1228 #endif
1229 size_t n = confstr (_CS_DARWIN_USER_TEMP_DIR, NULL, (size_t) 0);
1230 if (n > 0)
1232 tmpdir = alloca (n);
1233 confstr (_CS_DARWIN_USER_TEMP_DIR, tmpdir, n);
1235 else
1236 #endif
1237 tmpdir = "/tmp";
1239 socket_name = alloca (strlen (tmpdir) + strlen (server_name)
1240 + EXTRA_SPACE);
1241 sprintf (socket_name, "%s/emacs%d/%s",
1242 tmpdir, (int) geteuid (), server_name);
1245 if (strlen (socket_name) < sizeof (server.sun_path))
1246 strcpy (server.sun_path, socket_name);
1247 else
1249 message (TRUE, "%s: socket-name %s too long\n",
1250 progname, socket_name);
1251 fail ();
1254 /* See if the socket exists, and if it's owned by us. */
1255 sock_status = socket_status (server.sun_path);
1256 saved_errno = errno;
1257 if (sock_status && default_sock)
1259 /* Failing that, see if LOGNAME or USER exist and differ from
1260 our euid. If so, look for a socket based on the UID
1261 associated with the name. This is reminiscent of the logic
1262 that init_editfns uses to set the global Vuser_full_name. */
1264 char *user_name = (char *) egetenv ("LOGNAME");
1266 if (!user_name)
1267 user_name = (char *) egetenv ("USER");
1269 if (user_name)
1271 struct passwd *pw = getpwnam (user_name);
1273 if (pw && (pw->pw_uid != geteuid ()))
1275 /* We're running under su, apparently. */
1276 socket_name = alloca (strlen (tmpdir) + strlen (server_name)
1277 + EXTRA_SPACE);
1278 sprintf (socket_name, "%s/emacs%d/%s",
1279 tmpdir, (int) pw->pw_uid, server_name);
1281 if (strlen (socket_name) < sizeof (server.sun_path))
1282 strcpy (server.sun_path, socket_name);
1283 else
1285 message (TRUE, "%s: socket-name %s too long\n",
1286 progname, socket_name);
1287 exit (EXIT_FAILURE);
1290 sock_status = socket_status (server.sun_path);
1291 saved_errno = errno;
1293 else
1294 errno = saved_errno;
1298 switch (sock_status)
1300 case 1:
1301 /* There's a socket, but it isn't owned by us. This is OK if
1302 we are root. */
1303 if (0 != geteuid ())
1305 message (TRUE, "%s: Invalid socket owner\n", progname);
1306 return INVALID_SOCKET;
1308 break;
1310 case 2:
1311 /* `stat' failed */
1312 if (saved_errno == ENOENT)
1313 message (TRUE,
1314 "%s: can't find socket; have you started the server?\n\
1315 To start the server in Emacs, type \"M-x server-start\".\n",
1316 progname);
1317 else
1318 message (TRUE, "%s: can't stat %s: %s\n",
1319 progname, server.sun_path, strerror (saved_errno));
1320 return INVALID_SOCKET;
1324 if (connect (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2)
1325 < 0)
1327 message (TRUE, "%s: connect: %s\n", progname, strerror (errno));
1328 return INVALID_SOCKET;
1331 return s;
1333 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1335 HSOCKET
1336 set_socket (int no_exit_if_error)
1338 HSOCKET s;
1340 INITIALIZE ();
1342 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1343 /* Explicit --socket-name argument. */
1344 if (socket_name)
1346 s = set_local_socket ();
1347 if ((s != INVALID_SOCKET) || no_exit_if_error)
1348 return s;
1349 message (TRUE, "%s: error accessing socket \"%s\"\n",
1350 progname, socket_name);
1351 exit (EXIT_FAILURE);
1353 #endif
1355 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1356 if (!server_file)
1357 server_file = egetenv ("EMACS_SERVER_FILE");
1359 if (server_file)
1361 s = set_tcp_socket ();
1362 if ((s != INVALID_SOCKET) || no_exit_if_error)
1363 return s;
1365 message (TRUE, "%s: error accessing server file \"%s\"\n",
1366 progname, server_file);
1367 exit (EXIT_FAILURE);
1370 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1371 /* Implicit local socket. */
1372 s = set_local_socket ();
1373 if (s != INVALID_SOCKET)
1374 return s;
1375 #endif
1377 /* Implicit server file. */
1378 server_file = "server";
1379 s = set_tcp_socket ();
1380 if ((s != INVALID_SOCKET) || no_exit_if_error)
1381 return s;
1383 /* No implicit or explicit socket, and no alternate editor. */
1384 message (TRUE, "%s: No socket or alternate editor. Please use:\n\n"
1385 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1386 "\t--socket-name\n"
1387 #endif
1388 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1389 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1390 progname);
1391 exit (EXIT_FAILURE);
1394 #ifdef WINDOWSNT
1395 FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */
1396 FARPROC get_wc; /* Pointer to RealGetWindowClassA. */
1398 BOOL CALLBACK
1399 w32_find_emacs_process (HWND hWnd, LPARAM lParam)
1401 DWORD pid;
1402 char class[6];
1404 /* Reject any window not of class "Emacs". */
1405 if (! get_wc (hWnd, class, sizeof (class))
1406 || strcmp (class, "Emacs"))
1407 return TRUE;
1409 /* We only need the process id, not the thread id. */
1410 (void) GetWindowThreadProcessId (hWnd, &pid);
1412 /* Not the one we're looking for. */
1413 if (pid != (DWORD) emacs_pid) return TRUE;
1415 /* OK, let's raise it. */
1416 set_fg (emacs_pid);
1418 /* Stop enumeration. */
1419 return FALSE;
1423 * Search for a window of class "Emacs" and owned by a process with
1424 * process id = emacs_pid. If found, allow it to grab the focus.
1426 void
1427 w32_give_focus (void)
1429 HANDLE user32;
1431 /* It shouldn't happen when dealing with TCP sockets. */
1432 if (!emacs_pid) return;
1434 user32 = GetModuleHandle ("user32.dll");
1436 if (!user32)
1437 return;
1439 /* Modern Windows restrict which processes can set the foreground window.
1440 emacsclient can allow Emacs to grab the focus by calling the function
1441 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1442 NT) lack this function, so we have to check its availability. */
1443 if ((set_fg = GetProcAddress (user32, "AllowSetForegroundWindow"))
1444 && (get_wc = GetProcAddress (user32, "RealGetWindowClassA")))
1445 EnumWindows (w32_find_emacs_process, (LPARAM) 0);
1447 #endif
1449 /* Start the emacs daemon and try to connect to it. */
1451 void
1452 start_daemon_and_retry_set_socket (void)
1454 #ifndef WINDOWSNT
1455 pid_t dpid;
1456 int status;
1458 dpid = fork ();
1460 if (dpid > 0)
1462 pid_t w;
1463 w = waitpid (dpid, &status, WUNTRACED | WCONTINUED);
1465 if ((w == -1) || !WIFEXITED (status) || WEXITSTATUS (status))
1467 message (TRUE, "Error: Could not start the Emacs daemon\n");
1468 exit (EXIT_FAILURE);
1471 /* Try connecting, the daemon should have started by now. */
1472 message (TRUE, "Emacs daemon should have started, trying to connect again\n");
1473 if ((emacs_socket = set_socket (1)) == INVALID_SOCKET)
1475 message (TRUE, "Error: Cannot connect even after starting the Emacs daemon\n");
1476 exit (EXIT_FAILURE);
1479 else if (dpid < 0)
1481 fprintf (stderr, "Error: Cannot fork!\n");
1482 exit (EXIT_FAILURE);
1484 else
1486 char emacs[] = "emacs";
1487 char daemon[] = "--daemon";
1488 char *d_argv[] = {emacs, daemon, 0 };
1489 if (socket_name != NULL)
1491 /* Pass --daemon=socket_name as argument. */
1492 const char *deq = "--daemon=";
1493 char *daemon_arg = alloca (strlen (deq)
1494 + strlen (socket_name) + 1);
1495 strcpy (daemon_arg, deq);
1496 strcat (daemon_arg, socket_name);
1497 d_argv[1] = daemon_arg;
1499 execvp ("emacs", d_argv);
1500 message (TRUE, "%s: error starting emacs daemon\n", progname);
1502 #endif /* WINDOWSNT */
1506 main (int argc, char **argv)
1508 int i, rl, needlf = 0;
1509 char *cwd, *str;
1510 char string[BUFSIZ+1];
1511 int null_socket_name, null_server_file, start_daemon_if_needed;
1512 int exit_status = EXIT_SUCCESS;
1514 main_argv = argv;
1515 progname = argv[0];
1517 #ifdef WINDOWSNT
1518 /* On Windows 7 and later, we need to explicitly associate emacsclient
1519 with emacs so the UI behaves sensibly. */
1520 w32_set_user_model_id ();
1521 #endif
1523 /* Process options. */
1524 decode_options (argc, argv);
1526 if ((argc - optind < 1) && !eval && current_frame)
1528 message (TRUE, "%s: file name or argument required\n"
1529 "Try `%s --help' for more information\n",
1530 progname, progname);
1531 exit (EXIT_FAILURE);
1534 /* If alternate_editor is the empty string, start the emacs daemon
1535 in case of failure to connect. */
1536 start_daemon_if_needed = (alternate_editor
1537 && (alternate_editor[0] == '\0'));
1538 if (start_daemon_if_needed)
1540 /* set_socket changes the values for socket_name and
1541 server_file, we need to reset them, if they were NULL before
1542 for the second call to set_socket. */
1543 null_socket_name = (socket_name == NULL);
1544 null_server_file = (server_file == NULL);
1547 if ((emacs_socket = set_socket (alternate_editor
1548 || start_daemon_if_needed)) == INVALID_SOCKET)
1549 if (start_daemon_if_needed)
1551 /* Reset socket_name and server_file if they were NULL
1552 before the set_socket call. */
1553 if (null_socket_name)
1554 socket_name = NULL;
1555 if (null_server_file)
1556 server_file = NULL;
1558 start_daemon_and_retry_set_socket ();
1560 else
1561 fail ();
1563 cwd = get_current_dir_name ();
1564 if (cwd == 0)
1566 /* getwd puts message in STRING if it fails. */
1567 message (TRUE, "%s: %s\n", progname,
1568 "Cannot get current working directory");
1569 fail ();
1572 #ifdef WINDOWSNT
1573 w32_give_focus ();
1574 #endif
1576 /* Send over our environment and current directory. */
1577 if (!current_frame)
1579 extern char **environ;
1580 int i;
1581 for (i = 0; environ[i]; i++)
1583 send_to_emacs (emacs_socket, "-env ");
1584 quote_argument (emacs_socket, environ[i]);
1585 send_to_emacs (emacs_socket, " ");
1588 send_to_emacs (emacs_socket, "-dir ");
1589 quote_argument (emacs_socket, cwd);
1590 send_to_emacs (emacs_socket, "/");
1591 send_to_emacs (emacs_socket, " ");
1593 retry:
1594 if (nowait)
1595 send_to_emacs (emacs_socket, "-nowait ");
1597 if (current_frame)
1598 send_to_emacs (emacs_socket, "-current-frame ");
1600 if (display)
1602 send_to_emacs (emacs_socket, "-display ");
1603 quote_argument (emacs_socket, display);
1604 send_to_emacs (emacs_socket, " ");
1607 if (parent_id)
1609 send_to_emacs (emacs_socket, "-parent-id ");
1610 quote_argument (emacs_socket, parent_id);
1611 send_to_emacs (emacs_socket, " ");
1614 /* If using the current frame, send tty information to Emacs anyway.
1615 In daemon mode, Emacs may need to occupy this tty if no other
1616 frame is available. */
1617 if (tty || (current_frame && !eval))
1619 char *tty_type, *tty_name;
1621 if (find_tty (&tty_type, &tty_name, !tty))
1623 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1624 init_signals ();
1625 #endif
1626 send_to_emacs (emacs_socket, "-tty ");
1627 quote_argument (emacs_socket, tty_name);
1628 send_to_emacs (emacs_socket, " ");
1629 quote_argument (emacs_socket, tty_type);
1630 send_to_emacs (emacs_socket, " ");
1634 if (!current_frame && !tty)
1635 send_to_emacs (emacs_socket, "-window-system ");
1637 if ((argc - optind > 0))
1639 for (i = optind; i < argc; i++)
1642 if (eval)
1644 /* Don't prepend cwd or anything like that. */
1645 send_to_emacs (emacs_socket, "-eval ");
1646 quote_argument (emacs_socket, argv[i]);
1647 send_to_emacs (emacs_socket, " ");
1648 continue;
1651 if (*argv[i] == '+')
1653 char *p = argv[i] + 1;
1654 while (isdigit ((unsigned char) *p) || *p == ':') p++;
1655 if (*p == 0)
1657 send_to_emacs (emacs_socket, "-position ");
1658 quote_argument (emacs_socket, argv[i]);
1659 send_to_emacs (emacs_socket, " ");
1660 continue;
1663 #ifdef WINDOWSNT
1664 else if (! file_name_absolute_p (argv[i])
1665 && (isalpha (argv[i][0]) && argv[i][1] == ':'))
1666 /* Windows can have a different default directory for each
1667 drive, so the cwd passed via "-dir" is not sufficient
1668 to account for that.
1669 If the user uses <drive>:<relpath>, we hence need to be
1670 careful to expand <relpath> with the default directory
1671 corresponding to <drive>. */
1673 char *filename = (char *) xmalloc (MAX_PATH);
1674 DWORD size;
1676 size = GetFullPathName (argv[i], MAX_PATH, filename, NULL);
1677 if (size > 0 && size < MAX_PATH)
1678 argv[i] = filename;
1679 else
1680 free (filename);
1682 #endif
1684 send_to_emacs (emacs_socket, "-file ");
1685 quote_argument (emacs_socket, argv[i]);
1686 send_to_emacs (emacs_socket, " ");
1689 else if (eval)
1691 /* Read expressions interactively. */
1692 while ((str = fgets (string, BUFSIZ, stdin)))
1694 send_to_emacs (emacs_socket, "-eval ");
1695 quote_argument (emacs_socket, str);
1697 send_to_emacs (emacs_socket, " ");
1700 send_to_emacs (emacs_socket, "\n");
1702 /* Wait for an answer. */
1703 if (!eval && !tty && !nowait)
1705 printf ("Waiting for Emacs...");
1706 needlf = 2;
1708 fflush (stdout);
1709 fsync (1);
1711 /* Now, wait for an answer and print any messages. */
1712 while (exit_status == EXIT_SUCCESS
1713 && (rl = recv (emacs_socket, string, BUFSIZ, 0)) > 0)
1715 char *p;
1716 string[rl] = '\0';
1718 p = string + strlen (string) - 1;
1719 while (p > string && *p == '\n')
1720 *p-- = 0;
1722 if (strprefix ("-emacs-pid ", string))
1724 /* -emacs-pid PID: The process id of the Emacs process. */
1725 emacs_pid = strtol (string + strlen ("-emacs-pid"), NULL, 10);
1727 else if (strprefix ("-window-system-unsupported ", string))
1729 /* -window-system-unsupported: Emacs was compiled without X
1730 support. Try again on the terminal. */
1731 nowait = 0;
1732 tty = 1;
1733 goto retry;
1735 else if (strprefix ("-print ", string))
1737 /* -print STRING: Print STRING on the terminal. */
1738 str = unquote_argument (string + strlen ("-print "));
1739 if (needlf)
1740 printf ("\n");
1741 printf ("%s", str);
1742 needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
1744 else if (strprefix ("-error ", string))
1746 /* -error DESCRIPTION: Signal an error on the terminal. */
1747 str = unquote_argument (string + strlen ("-error "));
1748 if (needlf)
1749 printf ("\n");
1750 fprintf (stderr, "*ERROR*: %s", str);
1751 needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
1752 exit_status = EXIT_FAILURE;
1754 #ifdef SIGSTOP
1755 else if (strprefix ("-suspend ", string))
1757 /* -suspend: Suspend this terminal, i.e., stop the process. */
1758 if (needlf)
1759 printf ("\n");
1760 needlf = 0;
1761 kill (0, SIGSTOP);
1763 #endif
1764 else
1766 /* Unknown command. */
1767 if (needlf)
1768 printf ("\n");
1769 printf ("*ERROR*: Unknown message: %s", string);
1770 needlf = string[0]
1771 == '\0' ? needlf : string[strlen (string) - 1] != '\n';
1775 if (needlf)
1776 printf ("\n");
1777 fflush (stdout);
1778 fsync (1);
1780 if (rl < 0)
1781 exit_status = EXIT_FAILURE;
1783 CLOSE_SOCKET (emacs_socket);
1784 return exit_status;
1787 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1790 #ifndef HAVE_STRERROR
1791 char *
1792 strerror (errnum)
1793 int errnum;
1795 extern char *sys_errlist[];
1796 extern int sys_nerr;
1798 if (errnum >= 0 && errnum < sys_nerr)
1799 return sys_errlist[errnum];
1800 return (char *) "Unknown error";
1803 #endif /* ! HAVE_STRERROR */
1806 /* emacsclient.c ends here */