etc/NEWS updates.
[bpt/emacs.git] / lib-src / emacsclient.c
CommitLineData
efb859b4 1/* Client process that communicates with GNU Emacs acting as server.
92b47a4a 2 Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2002, 2003, 2004,
114f9c96 3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
46cec291
RS
4
5This file is part of GNU Emacs.
6
294981c7 7GNU Emacs is free software: you can redistribute it and/or modify
46cec291 8it under the terms of the GNU General Public License as published by
294981c7
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
46cec291
RS
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
294981c7 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
46cec291
RS
19
20
2f8fe2f4 21#include <config.h>
e69233c2 22
aa0b6932 23#ifdef WINDOWSNT
aa0b6932 24
bc28de71
JB
25/* config.h defines these, which disables sockets altogether! */
26# undef _WINSOCKAPI_
27# undef _WINSOCK_H
28
411b80a5
JB
29# include <malloc.h>
30# include <stdlib.h>
42073bfb 31# include <windows.h>
dbf60b07 32# include <commctrl.h>
0613f5d5
DN
33# include <io.h>
34# include <winsock2.h>
411b80a5 35
411b80a5
JB
36# define NO_SOCKETS_IN_FILE_SYSTEM
37
aa0b6932
JB
38# define HSOCKET SOCKET
39# define CLOSE_SOCKET closesocket
aa0b6932 40# define INITIALIZE() (initialize_sockets ())
411b80a5
JB
41
42#else /* !WINDOWSNT */
43
67c1df01 44# include "syswait.h"
ed4a3730 45
1e7823d0
JB
46# ifdef HAVE_INET_SOCKETS
47# include <netinet/in.h>
0613f5d5
DN
48# ifdef HAVE_SOCKETS
49# include <sys/types.h>
50# include <sys/socket.h>
51# include <sys/un.h>
52# endif /* HAVE_SOCKETS */
1e7823d0 53# endif
18d2ad29 54# include <arpa/inet.h>
448d4085 55
e35fc962 56# define INVALID_SOCKET -1
aa0b6932
JB
57# define HSOCKET int
58# define CLOSE_SOCKET close
aa0b6932 59# define INITIALIZE()
411b80a5 60
5445ab06
DN
61# ifndef WCONTINUED
62# define WCONTINUED 8
63# endif
64
411b80a5 65#endif /* !WINDOWSNT */
aa0b6932 66
4e23f2ba 67#undef signal
46cec291 68
42073bfb 69#include <stdarg.h>
e69233c2 70#include <ctype.h>
8f9aaa0a 71#include <stdio.h>
aa0b6932 72#include "getopt.h"
79f13bba 73#ifdef HAVE_UNISTD_H
0613f5d5 74# include <unistd.h>
79f13bba 75#endif
8f9aaa0a 76
0613f5d5 77#include <pwd.h>
dc4a4a14 78#include <sys/stat.h>
9628b887 79#include <signal.h>
4d553a13 80#include <errno.h>
9628b887 81
0613f5d5 82
9628b887 83\f
873fbd0b 84char *getenv (const char *), *getwd (char *);
35a7804d
JB
85#ifdef HAVE_GETCWD
86char *(getcwd) (char *, size_t);
87#endif
8f9aaa0a 88
7ce8671d 89#ifdef WINDOWSNT
361358ea 90char *w32_getenv (char *);
7ce8671d
JB
91#define egetenv(VAR) w32_getenv(VAR)
92#else
93#define egetenv(VAR) getenv(VAR)
94#endif
95
8f9aaa0a
RS
96#ifndef VERSION
97#define VERSION "unspecified"
98#endif
99\f
aa0b6932
JB
100
101#ifndef EXIT_SUCCESS
102#define EXIT_SUCCESS 0
103#endif
104
105#ifndef EXIT_FAILURE
106#define EXIT_FAILURE 1
107#endif
108
109#ifndef FALSE
110#define FALSE 0
111#endif
112
113#ifndef TRUE
114#define TRUE 1
115#endif
116
bc558f3e
JB
117/* Additional space when allocating buffers for filenames, etc. */
118#define EXTRA_SPACE 100
119
aa0b6932 120\f
8f9aaa0a
RS
121/* Name used to invoke this program. */
122char *progname;
123
0a125897
KL
124/* The second argument to main. */
125char **main_argv;
126
749ae770 127/* Nonzero means don't wait for a response from Emacs. --no-wait. */
8f9aaa0a
RS
128int nowait = 0;
129
30be2360
SM
130/* Nonzero means args are expressions to be evaluated. --eval. */
131int eval = 0;
132
31fa6595
SM
133/* Nonzero means don't open a new frame. Inverse of --create-frame. */
134int current_frame = 1;
92071250 135
30be2360 136/* The display on which Emacs should work. --display. */
988e88ab 137const char *display = NULL;
30be2360 138
0191e222
CY
139/* The parent window ID, if we are opening a frame via XEmbed. */
140char *parent_id = NULL;
141
9628b887 142/* Nonzero means open a new Emacs frame on the current terminal. */
77134727 143int tty = 0;
9628b887 144
30be2360
SM
145/* If non-NULL, the name of an editor to fallback to if the server
146 is not running. --alternate-editor. */
b03d27bd 147const char *alternate_editor = NULL;
30be2360 148
3db926be 149/* If non-NULL, the filename of the UNIX socket. */
254107e4
RS
150char *socket_name = NULL;
151
aa0b6932 152/* If non-NULL, the filename of the authentication file. */
988e88ab 153const char *server_file = NULL;
aa0b6932 154
c66648e0
JB
155/* PID of the Emacs server process. */
156int emacs_pid = 0;
157
873fbd0b 158void print_help_and_exit (void) NO_RETURN;
68441b90
DN
159void fail (void) NO_RETURN;
160
7f3bff3e 161
8f9aaa0a
RS
162struct option longopts[] =
163{
749ae770 164 { "no-wait", no_argument, NULL, 'n' },
30be2360 165 { "eval", no_argument, NULL, 'e' },
8f9aaa0a
RS
166 { "help", no_argument, NULL, 'H' },
167 { "version", no_argument, NULL, 'V' },
b28c910d 168 { "tty", no_argument, NULL, 't' },
dc1cd5f7 169 { "nw", no_argument, NULL, 't' },
31fa6595 170 { "create-frame", no_argument, NULL, 'c' },
3cf8c6aa 171 { "alternate-editor", required_argument, NULL, 'a' },
b03d27bd 172#ifndef NO_SOCKETS_IN_FILE_SYSTEM
254107e4 173 { "socket-name", required_argument, NULL, 's' },
b03d27bd 174#endif
aa0b6932 175 { "server-file", required_argument, NULL, 'f' },
0ebec7d3 176#ifndef WINDOWSNT
30be2360 177 { "display", required_argument, NULL, 'd' },
0ebec7d3 178#endif
0191e222 179 { "parent-id", required_argument, NULL, 'p' },
30be2360 180 { 0, 0, 0, 0 }
8f9aaa0a
RS
181};
182
974b73e8
KL
183\f
184/* Like malloc but get fatal error if memory is exhausted. */
185
186long *
873fbd0b 187xmalloc (unsigned int size)
974b73e8
KL
188{
189 long *result = (long *) malloc (size);
190 if (result == NULL)
191 {
192 perror ("malloc");
193 exit (EXIT_FAILURE);
194 }
195 return result;
196}
197
198/* Like strdup but get a fatal error if memory is exhausted. */
199
200char *
201xstrdup (const char *s)
202{
203 char *result = strdup (s);
204 if (result == NULL)
205 {
206 perror ("strdup");
207 exit (EXIT_FAILURE);
208 }
209 return result;
210}
211
212/* From sysdep.c */
213#if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
214
cb06b8dc
SM
215/* From lisp.h */
216#ifndef DIRECTORY_SEP
217#define DIRECTORY_SEP '/'
218#endif
219#ifndef IS_DIRECTORY_SEP
220#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
221#endif
222#ifndef IS_DEVICE_SEP
223#ifndef DEVICE_SEP
224#define IS_DEVICE_SEP(_c_) 0
225#else
226#define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
227#endif
228#endif
229#ifndef IS_ANY_SEP
230#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
231#endif
232
233
974b73e8 234/* Return the current working directory. Returns NULL on errors.
5ab73228 235 Any other returned value must be freed with free. This is used
974b73e8
KL
236 only when get_current_dir_name is not defined on the system. */
237char*
7c3320d8 238get_current_dir_name (void)
974b73e8
KL
239{
240 char *buf;
241 char *pwd;
242 struct stat dotstat, pwdstat;
243 /* If PWD is accurate, use it instead of calling getwd. PWD is
244 sometimes a nicer name, and using it may avoid a fatal error if a
245 parent directory is searchable but not readable. */
7ce8671d 246 if ((pwd = egetenv ("PWD")) != 0
974b73e8
KL
247 && (IS_DIRECTORY_SEP (*pwd) || (*pwd && IS_DEVICE_SEP (pwd[1])))
248 && stat (pwd, &pwdstat) == 0
249 && stat (".", &dotstat) == 0
250 && dotstat.st_ino == pwdstat.st_ino
251 && dotstat.st_dev == pwdstat.st_dev
252#ifdef MAXPATHLEN
253 && strlen (pwd) < MAXPATHLEN
254#endif
255 )
256 {
257 buf = (char *) xmalloc (strlen (pwd) + 1);
258 if (!buf)
259 return NULL;
260 strcpy (buf, pwd);
261 }
262#ifdef HAVE_GETCWD
263 else
264 {
265 size_t buf_size = 1024;
266 buf = (char *) xmalloc (buf_size);
267 if (!buf)
268 return NULL;
269 for (;;)
270 {
271 if (getcwd (buf, buf_size) == buf)
272 break;
273 if (errno != ERANGE)
274 {
275 int tmp_errno = errno;
276 free (buf);
277 errno = tmp_errno;
278 return NULL;
279 }
280 buf_size *= 2;
281 buf = (char *) realloc (buf, buf_size);
282 if (!buf)
283 return NULL;
284 }
285 }
286#else
287 else
288 {
289 /* We need MAXPATHLEN here. */
290 buf = (char *) xmalloc (MAXPATHLEN + 1);
291 if (!buf)
292 return NULL;
293 if (getwd (buf) == NULL)
294 {
295 int tmp_errno = errno;
296 free (buf);
297 errno = tmp_errno;
298 return NULL;
299 }
300 }
301#endif
302 return buf;
303}
304#endif
305
42073bfb 306#ifdef WINDOWSNT
7ce8671d
JB
307
308#define REG_ROOT "SOFTWARE\\GNU\\Emacs"
309
310/* Retrieve an environment variable from the Emacs subkeys of the registry.
311 Return NULL if the variable was not found, or it was empty.
312 This code is based on w32_get_resource (w32.c). */
313char *
7c3320d8 314w32_get_resource (HKEY predefined, char *key, LPDWORD type)
7ce8671d
JB
315{
316 HKEY hrootkey = NULL;
317 char *result = NULL;
318 DWORD cbData;
319
320 if (RegOpenKeyEx (predefined, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
321 {
322 if (RegQueryValueEx (hrootkey, key, NULL, NULL, NULL, &cbData) == ERROR_SUCCESS)
323 {
324 result = (char *) xmalloc (cbData);
325
bc558f3e
JB
326 if ((RegQueryValueEx (hrootkey, key, NULL, type, result, &cbData) != ERROR_SUCCESS)
327 || (*result == 0))
7ce8671d
JB
328 {
329 free (result);
330 result = NULL;
331 }
332 }
333
334 RegCloseKey (hrootkey);
335 }
336
337 return result;
338}
339
340/*
341 getenv wrapper for Windows
342
768c0c0f 343 This is needed to duplicate Emacs's behavior, which is to look for environment
7ce8671d
JB
344 variables in the registry if they don't appear in the environment.
345*/
346char *
7c3320d8 347w32_getenv (char *envvar)
7ce8671d
JB
348{
349 char *value;
350 DWORD dwType;
351
352 if (value = getenv (envvar))
353 /* Found in the environment. */
354 return value;
355
356 if (! (value = w32_get_resource (HKEY_CURRENT_USER, envvar, &dwType)) &&
357 ! (value = w32_get_resource (HKEY_LOCAL_MACHINE, envvar, &dwType)))
d41784ee
EZ
358 {
359 /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */
360 if (strcmp (envvar, "TERM") == 0)
361 return xstrdup ("w32console");
362 /* Found neither in the environment nor in the registry. */
363 return NULL;
364 }
7ce8671d
JB
365
366 if (dwType == REG_SZ)
367 /* Registry; no need to expand. */
368 return value;
369
370 if (dwType == REG_EXPAND_SZ)
371 {
372 DWORD size;
373
374 if (size = ExpandEnvironmentStrings (value, NULL, 0))
375 {
376 char *buffer = (char *) xmalloc (size);
377 if (ExpandEnvironmentStrings (value, buffer, size))
378 {
379 /* Found and expanded. */
380 free (value);
381 return buffer;
382 }
383
384 /* Error expanding. */
385 free (buffer);
386 }
387 }
388
389 /* Not the right type, or not correctly expanded. */
390 free (value);
391 return NULL;
392}
393
ff90fbde 394void
7c3320d8 395w32_set_user_model_id (void)
ff90fbde
JR
396{
397 HMODULE shell;
0a3472c7 398 HRESULT (WINAPI * set_user_model) (wchar_t * id);
ff90fbde
JR
399
400 /* On Windows 7 and later, we need to set the user model ID
401 to associate emacsclient launched files with Emacs frames
402 in the UI. */
361358ea 403 shell = LoadLibrary ("shell32.dll");
ff90fbde
JR
404 if (shell)
405 {
406 set_user_model
407 = (void *) GetProcAddress (shell,
408 "SetCurrentProcessExplicitAppUserModelID");
409 /* If the function is defined, then we are running on Windows 7
410 or newer, and the UI uses this to group related windows
411 together. Since emacs, runemacs, emacsclient are related, we
412 want them grouped even though the executables are different,
413 so we need to set a consistent ID between them. */
414 if (set_user_model)
415 set_user_model (L"GNU.Emacs");
416
417 FreeLibrary (shell);
418 }
419}
420
42073bfb 421int
7c3320d8 422w32_window_app (void)
42073bfb
JB
423{
424 static int window_app = -1;
425 char szTitle[MAX_PATH];
426
427 if (window_app < 0)
dbf60b07
JR
428 {
429 /* Checking for STDOUT does not work; it's a valid handle also in
430 nonconsole apps. Testing for the console title seems to work. */
431 window_app = (GetConsoleTitleA (szTitle, MAX_PATH) == 0);
432 if (window_app)
361358ea 433 InitCommonControls ();
dbf60b07 434 }
42073bfb
JB
435
436 return window_app;
437}
105faa84
DN
438
439/*
cb06b8dc 440 execvp wrapper for Windows. Quotes arguments with embedded spaces.
105faa84
DN
441
442 This is necessary due to the broken implementation of exec* routines in
443 the Microsoft libraries: they concatenate the arguments together without
444 quoting special characters, and pass the result to CreateProcess, with
7c3320d8 445 predictably bad results. By contrast, POSIX execvp passes the arguments
105faa84
DN
446 directly into the argv array of the child process.
447*/
448int
7c3320d8 449w32_execvp (const char *path, char **argv)
105faa84
DN
450{
451 int i;
452
453 /* Required to allow a .BAT script as alternate editor. */
454 argv[0] = (char *) alternate_editor;
455
456 for (i = 0; argv[i]; i++)
457 if (strchr (argv[i], ' '))
458 {
459 char *quoted = alloca (strlen (argv[i]) + 3);
460 sprintf (quoted, "\"%s\"", argv[i]);
461 argv[i] = quoted;
462 }
463
464 return execvp (path, argv);
465}
466
467#undef execvp
468#define execvp w32_execvp
469
d41784ee
EZ
470/* Emulation of ttyname for Windows. */
471char *
472ttyname (int fd)
473{
474 return "CONOUT$";
475}
476
105faa84 477#endif /* WINDOWSNT */
42073bfb 478
f387c1ee
JB
479/* Display a normal or error message.
480 On Windows, use a message box if compiled as a Windows app. */
42073bfb 481void
988e88ab 482message (int is_error, const char *message, ...)
42073bfb 483{
361358ea 484 char msg[2048];
42073bfb
JB
485 va_list args;
486
487 va_start (args, message);
42073bfb
JB
488 vsprintf (msg, message, args);
489 va_end (args);
490
491#ifdef WINDOWSNT
492 if (w32_window_app ())
493 {
494 if (is_error)
495 MessageBox (NULL, msg, "Emacsclient ERROR", MB_ICONERROR);
496 else
497 MessageBox (NULL, msg, "Emacsclient", MB_ICONINFORMATION);
498 }
499 else
500#endif
9219db75
JB
501 {
502 FILE *f = is_error ? stderr : stdout;
503
504 fputs (msg, f);
505 fflush (f);
506 }
42073bfb
JB
507}
508
8f9aaa0a 509/* Decode the options from argv and argc.
5212210c 510 The global variable `optind' will say how many arguments we used up. */
8f9aaa0a 511
5212210c 512void
873fbd0b 513decode_options (int argc, char **argv)
8f9aaa0a 514{
7ce8671d 515 alternate_editor = egetenv ("ALTERNATE_EDITOR");
0ea5797a 516
8f9aaa0a
RS
517 while (1)
518 {
dc1cd5f7 519 int opt = getopt_long_only (argc, argv,
b03d27bd 520#ifndef NO_SOCKETS_IN_FILE_SYSTEM
974b73e8 521 "VHnea:s:f:d:tc",
b03d27bd 522#else
974b73e8 523 "VHnea:f:d:tc",
b03d27bd 524#endif
974b73e8 525 longopts, 0);
8f9aaa0a
RS
526
527 if (opt == EOF)
528 break;
529
530 switch (opt)
531 {
532 case 0:
533 /* If getopt returns 0, then it has already processed a
534 long-named option. We should do nothing. */
535 break;
e69233c2 536
97e3214d
GM
537 case 'a':
538 alternate_editor = optarg;
539 break;
e69233c2 540
b03d27bd 541#ifndef NO_SOCKETS_IN_FILE_SYSTEM
254107e4
RS
542 case 's':
543 socket_name = optarg;
544 break;
b03d27bd 545#endif
254107e4 546
aa0b6932
JB
547 case 'f':
548 server_file = optarg;
549 break;
254107e4 550
0ea5797a
SM
551 /* We used to disallow this argument in w32, but it seems better
552 to allow it, for the occasional case where the user is
553 connecting with a w32 client to a server compiled with X11
554 support. */
30be2360
SM
555 case 'd':
556 display = optarg;
557 break;
558
8f9aaa0a
RS
559 case 'n':
560 nowait = 1;
561 break;
562
30be2360
SM
563 case 'e':
564 eval = 1;
565 break;
566
8f9aaa0a 567 case 'V':
42073bfb 568 message (FALSE, "emacsclient %s\n", VERSION);
65396510 569 exit (EXIT_SUCCESS);
8f9aaa0a 570 break;
46cec291 571
819b8f00 572 case 't':
77134727 573 tty = 1;
c1b8e896 574 current_frame = 0;
77134727
KL
575 break;
576
e5299d8d 577 case 'c':
31fa6595 578 current_frame = 0;
9628b887 579 break;
0b0d3e0b 580
0191e222
CY
581 case 'p':
582 parent_id = optarg;
583 current_frame = 0;
584 break;
585
8f9aaa0a 586 case 'H':
8f9aaa0a 587 print_help_and_exit ();
20c396e8
JB
588 break;
589
590 default:
42073bfb 591 message (TRUE, "Try `%s --help' for more information\n", progname);
65396510 592 exit (EXIT_FAILURE);
20c396e8 593 break;
8f9aaa0a
RS
594 }
595 }
9628b887 596
273b9028
CY
597 /* If the -c option is used (without -t) and no --display argument
598 is provided, try $DISPLAY.
599 Without the -c option, we used to set `display' to $DISPLAY by
600 default, but this changed the default behavior and is sometimes
601 inconvenient. So we force users to use "--display $DISPLAY" if
602 they want Emacs to connect to their current display. */
09317bf4 603 if (!current_frame && !tty && !display)
e7534fc4
AR
604 {
605 display = egetenv ("DISPLAY");
606#ifdef NS_IMPL_COCOA
607 /* Under Cocoa, we don't really use displays the same way as in X,
608 so provide a dummy. */
609 if (!display || strlen (display) == 0)
610 display = "ns";
611#endif
612 }
9997dc15 613
273b9028 614 /* A null-string display is invalid. */
0ea5797a
SM
615 if (display && strlen (display) == 0)
616 display = NULL;
617
273b9028
CY
618 /* If no display is available, new frames are tty frames. */
619 if (!current_frame && !display)
92071250 620 tty = 1;
c0f342ab 621
b8ccaf6f 622 /* --no-wait implies --current-frame on ttys when there are file
273b9028 623 arguments or expressions given. */
b8ccaf6f 624 if (nowait && tty && argc - optind > 0)
92071250 625 current_frame = 1;
802bdb3c
DN
626
627#ifdef WINDOWSNT
69157c99 628 if (alternate_editor && alternate_editor[0] == '\0')
802bdb3c
DN
629 {
630 message (TRUE, "--alternate-editor argument or ALTERNATE_EDITOR variable cannot be\n\
631an empty string");
632 exit (EXIT_FAILURE);
633 }
634#endif /* WINDOWSNT */
8f9aaa0a
RS
635}
636
974b73e8 637\f
7f3bff3e 638void
873fbd0b 639print_help_and_exit (void)
8f9aaa0a 640{
c0f342ab
JB
641 /* Spaces and tabs are significant in this message; they're chosen so the
642 message aligns properly both in a tty and in a Windows message box.
643 Please try to preserve them; otherwise the output is very hard to read
644 when using emacsclientw. */
42073bfb 645 message (FALSE,
974b73e8 646 "Usage: %s [OPTIONS] FILE...\n\
30be2360
SM
647Tell the Emacs server to visit the specified files.\n\
648Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
20c396e8 649\n\
30be2360 650The following OPTIONS are accepted:\n\
c0f342ab
JB
651-V, --version Just print version info and return\n\
652-H, --help Print this usage information message\n\
dc1cd5f7 653-nw, -t, --tty Open a new Emacs frame on the current terminal\n\
c4b858e3 654-c, --create-frame Create a new frame instead of trying to\n\
9dfda22f 655 use the current Emacs frame\n\
c0f342ab 656-e, --eval Evaluate the FILE arguments as ELisp expressions\n\
d07529f3 657-n, --no-wait Don't wait for the server to return\n\
24d5010d 658-d DISPLAY, --display=DISPLAY\n\
0191e222
CY
659 Visit the file in the given display\n\
660--parent-id=ID Open in parent window ID, via XEmbed\n"
aa0b6932 661#ifndef NO_SOCKETS_IN_FILE_SYSTEM
24d5010d 662"-s SOCKET, --socket-name=SOCKET\n\
9dfda22f 663 Set filename of the UNIX socket for communication\n"
aa0b6932 664#endif
24d5010d 665"-f SERVER, --server-file=SERVER\n\
9dfda22f 666 Set filename of the TCP authentication file\n\
24d5010d 667-a EDITOR, --alternate-editor=EDITOR\n\
9dfda22f 668 Editor to fallback to if the server is not running\n"
6133a1a9 669#ifndef WINDOWSNT
c3f995a2
JB
670" If EDITOR is the empty string, start Emacs in daemon\n\
671 mode and try connecting again\n"
6133a1a9 672#endif /* not WINDOWSNT */
c3f995a2 673"\n\
5f54cae6 674Report bugs with M-x report-emacs-bug.\n", progname);
65396510 675 exit (EXIT_SUCCESS);
8f9aaa0a 676}
5212210c 677
aa0b6932
JB
678/*
679 Try to run a different command, or --if no alternate editor is
680 defined-- exit with an errorcode.
cb06b8dc 681 Uses argv, but gets it from the global variable main_argv.
aa0b6932
JB
682*/
683void
974b73e8 684fail (void)
9002956f 685{
aa0b6932 686 if (alternate_editor)
9002956f 687 {
aa0b6932 688 int i = optind - 1;
4472aef4 689
974b73e8 690 execvp (alternate_editor, main_argv + i);
42073bfb 691 message (TRUE, "%s: error executing alternate editor \"%s\"\n",
974b73e8 692 progname, alternate_editor);
9002956f 693 }
aa0b6932 694 exit (EXIT_FAILURE);
9002956f
KL
695}
696
aa0b6932 697\f
1e7823d0 698#if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
9002956f 699
aa0b6932 700int
0613f5d5 701main (int argc, char **argv)
9002956f 702{
974b73e8
KL
703 main_argv = argv;
704 progname = argv[0];
705 message (TRUE, "%s: Sorry, the Emacs server is supported only\n"
c0f342ab 706 "on systems with Berkeley sockets.\n",
aa0b6932 707 argv[0]);
974b73e8 708 fail ();
9002956f
KL
709}
710
1e7823d0 711#else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
2828d5f9 712
aa0b6932
JB
713#define AUTH_KEY_LENGTH 64
714#define SEND_BUFFER_SIZE 4096
715
873fbd0b 716extern char *strerror (int);
aa0b6932
JB
717
718/* Buffer to accumulate data to send in TCP connections. */
719char send_buffer[SEND_BUFFER_SIZE + 1];
720int sblen = 0; /* Fill pointer for the send buffer. */
4b7b77f6
JR
721/* Socket used to communicate with the Emacs server process. */
722HSOCKET emacs_socket = 0;
aa0b6932 723
d22b00e5
JR
724/* On Windows, the socket library was historically separate from the standard
725 C library, so errors are handled differently. */
726void
988e88ab 727sock_err_message (const char *function_name)
d22b00e5
JR
728{
729#ifdef WINDOWSNT
730 char* msg = NULL;
731
732 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
733 | FORMAT_MESSAGE_ALLOCATE_BUFFER
734 | FORMAT_MESSAGE_ARGUMENT_ARRAY,
735 NULL, WSAGetLastError (), 0, (LPTSTR)&msg, 0, NULL);
736
737 message (TRUE, "%s: %s: %s\n", progname, function_name, msg);
738
739 LocalFree (msg);
740#else
741 message (TRUE, "%s: %s: %s\n", progname, function_name, strerror (errno));
742#endif
743}
744
745
aa0b6932
JB
746/* Let's send the data to Emacs when either
747 - the data ends in "\n", or
748 - the buffer is full (but this shouldn't happen)
749 Otherwise, we just accumulate it. */
b03d27bd 750void
988e88ab 751send_to_emacs (HSOCKET s, const char *data)
aa0b6932
JB
752{
753 while (data)
2828d5f9 754 {
aa0b6932
JB
755 int dlen = strlen (data);
756 if (dlen + sblen >= SEND_BUFFER_SIZE)
757 {
758 int part = SEND_BUFFER_SIZE - sblen;
759 strncpy (&send_buffer[sblen], data, part);
760 data += part;
761 sblen = SEND_BUFFER_SIZE;
762 }
763 else if (dlen)
764 {
765 strcpy (&send_buffer[sblen], data);
766 data = NULL;
767 sblen += dlen;
768 }
769 else
770 break;
771
772 if (sblen == SEND_BUFFER_SIZE
773 || (sblen > 0 && send_buffer[sblen-1] == '\n'))
774 {
775 int sent = send (s, send_buffer, sblen, 0);
776 if (sent != sblen)
777 strcpy (send_buffer, &send_buffer[sent]);
778 sblen -= sent;
779 }
2828d5f9 780 }
2828d5f9 781}
2828d5f9
KL
782
783\f
0b0d3e0b 784/* In STR, insert a & before each &, each space, each newline, and
a4cf2096 785 any initial -. Change spaces to underscores, too, so that the
0b0d3e0b
KL
786 return value never contains a space.
787
3a35a84c 788 Does not change the string. Outputs the result to S. */
87209357 789void
988e88ab 790quote_argument (HSOCKET s, const char *str)
5212210c 791{
9002956f 792 char *copy = (char *) xmalloc (strlen (str) * 2 + 1);
988e88ab
J
793 const char *p;
794 char *q;
5212210c 795
0b0d3e0b 796 p = str;
5212210c
RS
797 q = copy;
798 while (*p)
799 {
800 if (*p == ' ')
801 {
f1db6a73 802 *q++ = '&';
5212210c
RS
803 *q++ = '_';
804 p++;
805 }
3cf8c6aa
SM
806 else if (*p == '\n')
807 {
808 *q++ = '&';
809 *q++ = 'n';
810 p++;
811 }
5212210c
RS
812 else
813 {
0b0d3e0b 814 if (*p == '&' || (*p == '-' && p == str))
f1db6a73 815 *q++ = '&';
5212210c
RS
816 *q++ = *p++;
817 }
818 }
f1db6a73 819 *q++ = 0;
5212210c 820
486ba65f 821 send_to_emacs (s, copy);
87209357
EZ
822
823 free (copy);
5212210c 824}
0c76956f 825
0b0d3e0b
KL
826
827/* The inverse of quote_argument. Removes quoting in string STR by
828 modifying the string in place. Returns STR. */
829
830char *
873fbd0b 831unquote_argument (char *str)
0b0d3e0b
KL
832{
833 char *p, *q;
834
835 if (! str)
836 return str;
837
838 p = str;
839 q = str;
840 while (*p)
841 {
842 if (*p == '&')
843 {
844 p++;
845 if (*p == '&')
846 *p = '&';
847 else if (*p == '_')
848 *p = ' ';
849 else if (*p == 'n')
850 *p = '\n';
851 else if (*p == '-')
852 *p = '-';
853 }
854 *q++ = *p++;
855 }
856 *q = 0;
857 return str;
858}
859
8f9aaa0a 860\f
b03d27bd 861int
873fbd0b 862file_name_absolute_p (const unsigned char *filename)
b03d27bd
JB
863{
864 /* Sanity check, it shouldn't happen. */
865 if (! filename) return FALSE;
866
867 /* /xxx is always an absolute path. */
868 if (filename[0] == '/') return TRUE;
869
870 /* Empty filenames (which shouldn't happen) are relative. */
871 if (filename[0] == '\0') return FALSE;
872
873#ifdef WINDOWSNT
71b8f735 874 /* X:\xxx is always absolute. */
5f7a4874 875 if (isalpha (filename[0])
cb0297bb 876 && filename[1] == ':' && (filename[2] == '\\' || filename[2] == '/'))
b03d27bd
JB
877 return TRUE;
878
879 /* Both \xxx and \\xxx\yyy are absolute. */
880 if (filename[0] == '\\') return TRUE;
881#endif
882
883 return FALSE;
884}
885
aa0b6932 886#ifdef WINDOWSNT
f0384499 887/* Wrapper to make WSACleanup a cdecl, as required by atexit. */
7c3320d8
JB
888void __cdecl
889close_winsock (void)
aa0b6932
JB
890{
891 WSACleanup ();
892}
0c76956f 893
b03d27bd
JB
894/* Initialize the WinSock2 library. */
895void
7c3320d8 896initialize_sockets (void)
0c76956f 897{
aa0b6932
JB
898 WSADATA wsaData;
899
aa0b6932
JB
900 if (WSAStartup (MAKEWORD (2, 0), &wsaData))
901 {
78da39c6 902 message (TRUE, "%s: error initializing WinSock2\n", progname);
aa0b6932
JB
903 exit (EXIT_FAILURE);
904 }
905
906 atexit (close_winsock);
0c76956f 907}
e35fc962 908#endif /* WINDOWSNT */
974b73e8 909
8f9aaa0a 910\f
97e3214d 911/*
aa0b6932 912 * Read the information needed to set up a TCP comm channel with
434a6c5d 913 * the Emacs server: host, port, pid and authentication string.
0e0dced5 914 */
b03d27bd 915int
873fbd0b 916get_server_config (struct sockaddr_in *server, char *authentication)
97e3214d 917{
aa0b6932
JB
918 char dotted[32];
919 char *port;
434a6c5d 920 char *pid;
b03d27bd 921 FILE *config = NULL;
aa0b6932 922
b03d27bd
JB
923 if (file_name_absolute_p (server_file))
924 config = fopen (server_file, "rb");
925 else
97e3214d 926 {
7ce8671d 927 char *home = egetenv ("HOME");
88b46d84 928
aa0b6932
JB
929 if (home)
930 {
bc558f3e
JB
931 char *path = alloca (strlen (home) + strlen (server_file)
932 + EXTRA_SPACE);
aa0b6932
JB
933 sprintf (path, "%s/.emacs.d/server/%s", home, server_file);
934 config = fopen (path, "rb");
935 }
88b46d84 936#ifdef WINDOWSNT
7ce8671d 937 if (!config && (home = egetenv ("APPDATA")))
88b46d84 938 {
bc558f3e
JB
939 char *path = alloca (strlen (home) + strlen (server_file)
940 + EXTRA_SPACE);
88b46d84
JB
941 sprintf (path, "%s/.emacs.d/server/%s", home, server_file);
942 config = fopen (path, "rb");
943 }
944#endif
aa0b6932
JB
945 }
946
947 if (! config)
948 return FALSE;
949
950 if (fgets (dotted, sizeof dotted, config)
434a6c5d
JB
951 && (port = strchr (dotted, ':'))
952 && (pid = strchr (port, ' ')))
aa0b6932
JB
953 {
954 *port++ = '\0';
434a6c5d 955 *pid++ = '\0';
97e3214d
GM
956 }
957 else
958 {
78da39c6 959 message (TRUE, "%s: invalid configuration info\n", progname);
65396510 960 exit (EXIT_FAILURE);
97e3214d 961 }
97e3214d 962
aa0b6932
JB
963 server->sin_family = AF_INET;
964 server->sin_addr.s_addr = inet_addr (dotted);
965 server->sin_port = htons (atoi (port));
97e3214d 966
aa0b6932
JB
967 if (! fread (authentication, AUTH_KEY_LENGTH, 1, config))
968 {
78da39c6 969 message (TRUE, "%s: cannot read authentication info\n", progname);
aa0b6932
JB
970 exit (EXIT_FAILURE);
971 }
46cec291 972
aa0b6932 973 fclose (config);
97e3214d 974
c66648e0 975 emacs_pid = atoi (pid);
434a6c5d 976
aa0b6932 977 return TRUE;
97e3214d
GM
978}
979
aa0b6932 980HSOCKET
873fbd0b 981set_tcp_socket (void)
aa0b6932
JB
982{
983 HSOCKET s;
984 struct sockaddr_in server;
aa0b6932
JB
985 struct linger l_arg = {1, 1};
986 char auth_string[AUTH_KEY_LENGTH + 1];
9628b887 987
aa0b6932
JB
988 if (! get_server_config (&server, auth_string))
989 return INVALID_SOCKET;
990
b03d27bd 991 if (server.sin_addr.s_addr != inet_addr ("127.0.0.1"))
9219db75 992 message (FALSE, "%s: connected to remote socket at %s\n",
b03d27bd
JB
993 progname, inet_ntoa (server.sin_addr));
994
aa0b6932
JB
995 /*
996 * Open up an AF_INET socket
997 */
998 if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
999 {
d22b00e5 1000 sock_err_message ("socket");
aa0b6932
JB
1001 return INVALID_SOCKET;
1002 }
1003
1004 /*
1005 * Set up the socket
1006 */
1007 if (connect (s, (struct sockaddr *) &server, sizeof server) < 0)
1008 {
d22b00e5 1009 sock_err_message ("connect");
aa0b6932
JB
1010 return INVALID_SOCKET;
1011 }
1012
aa0b6932
JB
1013 setsockopt (s, SOL_SOCKET, SO_LINGER, (char *) &l_arg, sizeof l_arg);
1014
1015 /*
1016 * Send the authentication
1017 */
1018 auth_string[AUTH_KEY_LENGTH] = '\0';
1019
486ba65f
JR
1020 send_to_emacs (s, "-auth ");
1021 send_to_emacs (s, auth_string);
5ab73228 1022 send_to_emacs (s, " ");
aa0b6932
JB
1023
1024 return s;
1025}
1026
b2ff54a0
JR
1027
1028/* Returns 1 if PREFIX is a prefix of STRING. */
1029static int
988e88ab 1030strprefix (const char *prefix, const char *string)
b2ff54a0 1031{
cb06b8dc 1032 return !strncmp (prefix, string, strlen (prefix));
b2ff54a0
JR
1033}
1034
a336ee5b
CY
1035/* Get tty name and type. If successful, return the type in TTY_TYPE
1036 and the name in TTY_NAME, and return 1. Otherwise, fail if NOABORT
1037 is zero, or return 0 if NOABORT is non-zero. */
1038
1039int
1040find_tty (char **tty_type, char **tty_name, int noabort)
1041{
1042 char *type = egetenv ("TERM");
1043 char *name = ttyname (fileno (stdout));
1044
1045 if (!name)
1046 {
1047 if (noabort)
1048 return 0;
1049 else
1050 {
1051 message (TRUE, "%s: could not get terminal name\n", progname);
1052 fail ();
1053 }
1054 }
1055
1056 if (!type)
1057 {
1058 if (noabort)
1059 return 0;
1060 else
1061 {
1062 message (TRUE, "%s: please set the TERM variable to your terminal type\n",
1063 progname);
1064 fail ();
1065 }
1066 }
1067
1068 if (strcmp (type, "eterm") == 0)
1069 {
1070 if (noabort)
1071 return 0;
1072 else
1073 {
1074 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1075 message (TRUE, "%s: opening a frame in an Emacs term buffer"
1076 " is not supported\n", progname);
1077 fail ();
1078 }
1079 }
1080
1081 *tty_name = name;
1082 *tty_type = type;
1083 return 1;
1084}
1085
b2ff54a0 1086
aa0b6932 1087#if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
46cec291 1088
9f637eea
GM
1089/* Three possibilities:
1090 2 - can't be `stat'ed (sets errno)
1091 1 - isn't owned by us
1092 0 - success: none of the above */
1093
1094static int
873fbd0b 1095socket_status (char *socket_name)
9f637eea
GM
1096{
1097 struct stat statbfr;
1098
1099 if (stat (socket_name, &statbfr) == -1)
1100 return 2;
1101
1102 if (statbfr.st_uid != geteuid ())
1103 return 1;
0b0d3e0b 1104
9f637eea
GM
1105 return 0;
1106}
1107
974b73e8 1108\f
da8e1115
KL
1109/* A signal handler that passes the signal to the Emacs process.
1110 Useful for SIGWINCH. */
1111
9628b887 1112SIGTYPE
428a555e 1113pass_signal_to_emacs (int signalnum)
9628b887
KL
1114{
1115 int old_errno = errno;
1116
9f729af5 1117 if (emacs_pid)
428a555e 1118 kill (emacs_pid, signalnum);
9f729af5 1119
428a555e 1120 signal (signalnum, pass_signal_to_emacs);
9f729af5
KL
1121 errno = old_errno;
1122}
1123
0b0d3e0b
KL
1124/* Signal handler for SIGCONT; notify the Emacs process that it can
1125 now resume our tty frame. */
1126
1127SIGTYPE
1128handle_sigcont (int signalnum)
1129{
1130 int old_errno = errno;
1131
1132 if (tcgetpgrp (1) == getpgrp ())
1133 {
1134 /* We are in the foreground. */
486ba65f 1135 send_to_emacs (emacs_socket, "-resume \n");
0b0d3e0b
KL
1136 }
1137 else
1138 {
1139 /* We are in the background; cancel the continue. */
1140 kill (getpid (), SIGSTOP);
1141 }
c6c53c3e
KL
1142
1143 signal (signalnum, handle_sigcont);
0b0d3e0b
KL
1144 errno = old_errno;
1145}
1146
1147/* Signal handler for SIGTSTP; notify the Emacs process that we are
1148 going to sleep. Normally the suspend is initiated by Emacs via
1149 server-handle-suspend-tty, but if the server gets out of sync with
1150 reality, we may get a SIGTSTP on C-z. Handling this signal and
1151 notifying Emacs about it should get things under control again. */
1152
1153SIGTYPE
1154handle_sigtstp (int signalnum)
1155{
1156 int old_errno = errno;
1157 sigset_t set;
c0f342ab 1158
90843190 1159 if (emacs_socket)
486ba65f 1160 send_to_emacs (emacs_socket, "-suspend \n");
0b0d3e0b 1161
5ab73228 1162 /* Unblock this signal and call the default handler by temporarily
0b0d3e0b
KL
1163 changing the handler and resignalling. */
1164 sigprocmask (SIG_BLOCK, NULL, &set);
1165 sigdelset (&set, signalnum);
1166 signal (signalnum, SIG_DFL);
1167 kill (getpid (), signalnum);
1168 sigprocmask (SIG_SETMASK, &set, NULL); /* Let's the above signal through. */
1169 signal (signalnum, handle_sigtstp);
1170
1171 errno = old_errno;
1172}
273b9028
CY
1173
1174
da8e1115 1175/* Set up signal handlers before opening a frame on the current tty. */
0b0d3e0b 1176
4d553a13
KL
1177void
1178init_signals (void)
9628b887
KL
1179{
1180 /* Set up signal handlers. */
428a555e 1181 signal (SIGWINCH, pass_signal_to_emacs);
4ca927b4
KL
1182
1183 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1184 deciding which terminal the signal came from. C-g is now a
1185 normal input event on secondary terminals. */
1186#if 0
428a555e
KL
1187 signal (SIGINT, pass_signal_to_emacs);
1188 signal (SIGQUIT, pass_signal_to_emacs);
4ca927b4 1189#endif
0b0d3e0b
KL
1190
1191 signal (SIGCONT, handle_sigcont);
1192 signal (SIGTSTP, handle_sigtstp);
1193 signal (SIGTTOU, handle_sigtstp);
9628b887
KL
1194}
1195
46cec291 1196
aa0b6932 1197HSOCKET
873fbd0b 1198set_local_socket (void)
46cec291 1199{
aa0b6932 1200 HSOCKET s;
46cec291 1201 struct sockaddr_un server;
46cec291 1202
e69233c2 1203 /*
46cec291
RS
1204 * Open up an AF_UNIX socket in this person's home directory
1205 */
1206
1207 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
1208 {
42073bfb 1209 message (TRUE, "%s: socket: %s\n", progname, strerror (errno));
aa0b6932 1210 return INVALID_SOCKET;
46cec291 1211 }
e69233c2 1212
46cec291 1213 server.sun_family = AF_UNIX;
c5fee545 1214
c5fee545 1215 {
9f637eea 1216 int sock_status = 0;
5c9659d3 1217 int default_sock = !socket_name;
b80bf66e 1218 int saved_errno = 0;
988e88ab
J
1219 const char *server_name = "server";
1220 const char *tmpdir;
0b0d3e0b 1221
8966b757
AS
1222 if (socket_name && !strchr (socket_name, '/')
1223 && !strchr (socket_name, '\\'))
1224 {
1225 /* socket_name is a file name component. */
d3a6748c
KL
1226 server_name = socket_name;
1227 socket_name = NULL;
1228 default_sock = 1; /* Try both UIDs. */
0734b0d0 1229 }
efb859b4 1230
5c9659d3 1231 if (default_sock)
254107e4 1232 {
f77b11a0
JB
1233 tmpdir = egetenv ("TMPDIR");
1234 if (!tmpdir)
1235 tmpdir = "/tmp";
bc558f3e
JB
1236 socket_name = alloca (strlen (tmpdir) + strlen (server_name)
1237 + EXTRA_SPACE);
f77b11a0
JB
1238 sprintf (socket_name, "%s/emacs%d/%s",
1239 tmpdir, (int) geteuid (), server_name);
254107e4
RS
1240 }
1241
1242 if (strlen (socket_name) < sizeof (server.sun_path))
1243 strcpy (server.sun_path, socket_name);
1244 else
819b8f00 1245 {
78da39c6 1246 message (TRUE, "%s: socket-name %s too long\n",
974b73e8 1247 progname, socket_name);
819b8f00
KL
1248 fail ();
1249 }
efb859b4 1250
9f637eea
GM
1251 /* See if the socket exists, and if it's owned by us. */
1252 sock_status = socket_status (server.sun_path);
152b6e83 1253 saved_errno = errno;
5c9659d3 1254 if (sock_status && default_sock)
efb859b4 1255 {
9f637eea
GM
1256 /* Failing that, see if LOGNAME or USER exist and differ from
1257 our euid. If so, look for a socket based on the UID
1258 associated with the name. This is reminiscent of the logic
1259 that init_editfns uses to set the global Vuser_full_name. */
e69233c2 1260
7ce8671d 1261 char *user_name = (char *) egetenv ("LOGNAME");
293f9f2a 1262
9f637eea 1263 if (!user_name)
7ce8671d 1264 user_name = (char *) egetenv ("USER");
e69233c2 1265
9f637eea
GM
1266 if (user_name)
1267 {
1268 struct passwd *pw = getpwnam (user_name);
293f9f2a 1269
9f637eea
GM
1270 if (pw && (pw->pw_uid != geteuid ()))
1271 {
1272 /* We're running under su, apparently. */
bc558f3e
JB
1273 socket_name = alloca (strlen (tmpdir) + strlen (server_name)
1274 + EXTRA_SPACE);
f77b11a0
JB
1275 sprintf (socket_name, "%s/emacs%d/%s",
1276 tmpdir, (int) pw->pw_uid, server_name);
5c9659d3
SM
1277
1278 if (strlen (socket_name) < sizeof (server.sun_path))
1279 strcpy (server.sun_path, socket_name);
1280 else
1281 {
78da39c6 1282 message (TRUE, "%s: socket-name %s too long\n",
aa0b6932 1283 progname, socket_name);
65396510 1284 exit (EXIT_FAILURE);
5c9659d3
SM
1285 }
1286
9f637eea 1287 sock_status = socket_status (server.sun_path);
b80bf66e 1288 saved_errno = errno;
9f637eea 1289 }
293f9f2a
RS
1290 else
1291 errno = saved_errno;
9f637eea 1292 }
efb859b4 1293 }
e69233c2 1294
aa0b6932
JB
1295 switch (sock_status)
1296 {
1297 case 1:
974b73e8
KL
1298 /* There's a socket, but it isn't owned by us. This is OK if
1299 we are root. */
1300 if (0 != geteuid ())
1301 {
1302 message (TRUE, "%s: Invalid socket owner\n", progname);
aa0b6932 1303 return INVALID_SOCKET;
974b73e8
KL
1304 }
1305 break;
aa0b6932
JB
1306
1307 case 2:
974b73e8
KL
1308 /* `stat' failed */
1309 if (saved_errno == ENOENT)
1310 message (TRUE,
1311 "%s: can't find socket; have you started the server?\n\
45adde32 1312To start the server in Emacs, type \"M-x server-start\".\n",
aa0b6932 1313 progname);
974b73e8
KL
1314 else
1315 message (TRUE, "%s: can't stat %s: %s\n",
aa0b6932 1316 progname, server.sun_path, strerror (saved_errno));
974b73e8 1317 return INVALID_SOCKET;
aa0b6932 1318 }
efb859b4 1319 }
46cec291 1320
4e23f2ba
JB
1321 if (connect (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2)
1322 < 0)
46cec291 1323 {
42073bfb 1324 message (TRUE, "%s: connect: %s\n", progname, strerror (errno));
aa0b6932 1325 return INVALID_SOCKET;
46cec291 1326 }
23a7488d 1327
aa0b6932
JB
1328 return s;
1329}
1330#endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1331
1332HSOCKET
636b507b 1333set_socket (int no_exit_if_error)
aa0b6932 1334{
b03d27bd 1335 HSOCKET s;
c0f342ab 1336
b03d27bd 1337 INITIALIZE ();
c0f342ab 1338
aa0b6932 1339#ifndef NO_SOCKETS_IN_FILE_SYSTEM
b03d27bd
JB
1340 /* Explicit --socket-name argument. */
1341 if (socket_name)
46cec291 1342 {
b03d27bd 1343 s = set_local_socket ();
636b507b 1344 if ((s != INVALID_SOCKET) || no_exit_if_error)
974b73e8 1345 return s;
355a326e 1346 message (TRUE, "%s: error accessing socket \"%s\"\n",
974b73e8 1347 progname, socket_name);
b03d27bd 1348 exit (EXIT_FAILURE);
46cec291 1349 }
b03d27bd
JB
1350#endif
1351
1352 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1353 if (!server_file)
7ce8671d 1354 server_file = egetenv ("EMACS_SERVER_FILE");
46cec291 1355
b03d27bd 1356 if (server_file)
23a7488d 1357 {
b03d27bd 1358 s = set_tcp_socket ();
636b507b 1359 if ((s != INVALID_SOCKET) || no_exit_if_error)
974b73e8 1360 return s;
c0f342ab 1361
78da39c6 1362 message (TRUE, "%s: error accessing server file \"%s\"\n",
974b73e8 1363 progname, server_file);
b03d27bd 1364 exit (EXIT_FAILURE);
23a7488d 1365 }
c0f342ab 1366
b03d27bd
JB
1367#ifndef NO_SOCKETS_IN_FILE_SYSTEM
1368 /* Implicit local socket. */
1369 s = set_local_socket ();
1370 if (s != INVALID_SOCKET)
1371 return s;
1372#endif
23a7488d 1373
b03d27bd
JB
1374 /* Implicit server file. */
1375 server_file = "server";
1376 s = set_tcp_socket ();
636b507b 1377 if ((s != INVALID_SOCKET) || no_exit_if_error)
b03d27bd
JB
1378 return s;
1379
1380 /* No implicit or explicit socket, and no alternate editor. */
42073bfb 1381 message (TRUE, "%s: No socket or alternate editor. Please use:\n\n"
b03d27bd
JB
1382#ifndef NO_SOCKETS_IN_FILE_SYSTEM
1383"\t--socket-name\n"
ee6a193c 1384#endif
b03d27bd
JB
1385"\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1386\t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1387 progname);
1388 exit (EXIT_FAILURE);
aa0b6932 1389}
46cec291 1390
0e0dced5
JB
1391#ifdef WINDOWSNT
1392FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */
1393FARPROC get_wc; /* Pointer to RealGetWindowClassA. */
1394
1395BOOL CALLBACK
7c3320d8 1396w32_find_emacs_process (HWND hWnd, LPARAM lParam)
0e0dced5
JB
1397{
1398 DWORD pid;
1399 char class[6];
1400
1401 /* Reject any window not of class "Emacs". */
1402 if (! get_wc (hWnd, class, sizeof (class))
1403 || strcmp (class, "Emacs"))
1404 return TRUE;
1405
1406 /* We only need the process id, not the thread id. */
1407 (void) GetWindowThreadProcessId (hWnd, &pid);
1408
1409 /* Not the one we're looking for. */
1410 if (pid != (DWORD) emacs_pid) return TRUE;
1411
1412 /* OK, let's raise it. */
1413 set_fg (emacs_pid);
1414
1415 /* Stop enumeration. */
1416 return FALSE;
1417}
1418
1419/*
1420 * Search for a window of class "Emacs" and owned by a process with
1421 * process id = emacs_pid. If found, allow it to grab the focus.
1422 */
1423void
7c3320d8 1424w32_give_focus (void)
0e0dced5 1425{
ff90fbde 1426 HANDLE user32;
0e0dced5 1427
71b8f735 1428 /* It shouldn't happen when dealing with TCP sockets. */
0e0dced5
JB
1429 if (!emacs_pid) return;
1430
ff90fbde
JR
1431 user32 = GetModuleHandle ("user32.dll");
1432
1433 if (!user32)
1434 return;
0e0dced5
JB
1435
1436 /* Modern Windows restrict which processes can set the foreground window.
1437 emacsclient can allow Emacs to grab the focus by calling the function
1438 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1439 NT) lack this function, so we have to check its availability. */
ff90fbde
JR
1440 if ((set_fg = GetProcAddress (user32, "AllowSetForegroundWindow"))
1441 && (get_wc = GetProcAddress (user32, "RealGetWindowClassA")))
0e0dced5 1442 EnumWindows (w32_find_emacs_process, (LPARAM) 0);
0e0dced5
JB
1443}
1444#endif
1445
636b507b
DN
1446/* Start the emacs daemon and try to connect to it. */
1447
1448void
1449start_daemon_and_retry_set_socket (void)
1450{
802bdb3c 1451#ifndef WINDOWSNT
636b507b
DN
1452 pid_t dpid;
1453 int status;
636b507b
DN
1454
1455 dpid = fork ();
1456
1457 if (dpid > 0)
1458 {
fd95644b
DN
1459 pid_t w;
1460 w = waitpid (dpid, &status, WUNTRACED | WCONTINUED);
636b507b 1461
361358ea 1462 if ((w == -1) || !WIFEXITED (status) || WEXITSTATUS (status))
fd95644b
DN
1463 {
1464 message (TRUE, "Error: Could not start the Emacs daemon\n");
1465 exit (EXIT_FAILURE);
1466 }
1467
1468 /* Try connecting, the daemon should have started by now. */
1469 message (TRUE, "Emacs daemon should have started, trying to connect again\n");
636b507b 1470 if ((emacs_socket = set_socket (1)) == INVALID_SOCKET)
fd95644b
DN
1471 {
1472 message (TRUE, "Error: Cannot connect even after starting the Emacs daemon\n");
1473 exit (EXIT_FAILURE);
1474 }
636b507b
DN
1475 }
1476 else if (dpid < 0)
1477 {
fd95644b 1478 fprintf (stderr, "Error: Cannot fork!\n");
6ab88e02 1479 exit (EXIT_FAILURE);
636b507b
DN
1480 }
1481 else
1482 {
988e88ab
J
1483 char emacs[] = "emacs";
1484 char daemon[] = "--daemon";
1485 char *d_argv[] = {emacs, daemon, 0 };
636b507b
DN
1486 if (socket_name != NULL)
1487 {
1488 /* Pass --daemon=socket_name as argument. */
988e88ab 1489 const char *deq = "--daemon=";
636b507b
DN
1490 char *daemon_arg = alloca (strlen (deq)
1491 + strlen (socket_name) + 1);
1492 strcpy (daemon_arg, deq);
1493 strcat (daemon_arg, socket_name);
1494 d_argv[1] = daemon_arg;
1495 }
1496 execvp ("emacs", d_argv);
1497 message (TRUE, "%s: error starting emacs daemon\n", progname);
1498 }
802bdb3c 1499#endif /* WINDOWSNT */
636b507b
DN
1500}
1501
aa0b6932 1502int
873fbd0b 1503main (int argc, char **argv)
aa0b6932 1504{
aa0b6932 1505 int i, rl, needlf = 0;
974b73e8 1506 char *cwd, *str;
aa0b6932 1507 char string[BUFSIZ+1];
802bdb3c 1508 int null_socket_name, null_server_file, start_daemon_if_needed;
aa0b6932 1509
974b73e8 1510 main_argv = argv;
aa0b6932
JB
1511 progname = argv[0];
1512
ff90fbde
JR
1513#ifdef WINDOWSNT
1514 /* On Windows 7 and later, we need to explicitly associate emacsclient
1515 with emacs so the UI behaves sensibly. */
1516 w32_set_user_model_id ();
1517#endif
1518
aa0b6932
JB
1519 /* Process options. */
1520 decode_options (argc, argv);
1521
273b9028 1522 if ((argc - optind < 1) && !eval && current_frame)
23a7488d 1523 {
974b73e8
KL
1524 message (TRUE, "%s: file name or argument required\n"
1525 "Try `%s --help' for more information\n",
1526 progname, progname);
aa0b6932 1527 exit (EXIT_FAILURE);
23a7488d
RS
1528 }
1529
636b507b
DN
1530 /* If alternate_editor is the empty string, start the emacs daemon
1531 in case of failure to connect. */
1532 start_daemon_if_needed = (alternate_editor
1533 && (alternate_editor[0] == '\0'));
1534 if (start_daemon_if_needed)
1535 {
1536 /* set_socket changes the values for socket_name and
1537 server_file, we need to reset them, if they were NULL before
1538 for the second call to set_socket. */
1539 null_socket_name = (socket_name == NULL);
1540 null_server_file = (server_file == NULL);
1541 }
aa0b6932 1542
636b507b
DN
1543 if ((emacs_socket = set_socket (alternate_editor
1544 || start_daemon_if_needed)) == INVALID_SOCKET)
1545 if (start_daemon_if_needed)
1546 {
1547 /* Reset socket_name and server_file if they were NULL
1548 before the set_socket call. */
1549 if (null_socket_name)
1550 socket_name = NULL;
1551 if (null_server_file)
1552 server_file = NULL;
1553
1554 start_daemon_and_retry_set_socket ();
1555 }
1556 else
1557 fail ();
974b73e8
KL
1558
1559 cwd = get_current_dir_name ();
46cec291
RS
1560 if (cwd == 0)
1561 {
1562 /* getwd puts message in STRING if it fails. */
974b73e8
KL
1563 message (TRUE, "%s: %s\n", progname,
1564 "Cannot get current working directory");
819b8f00 1565 fail ();
46cec291
RS
1566 }
1567
c66648e0 1568#ifdef WINDOWSNT
0e0dced5 1569 w32_give_focus ();
c66648e0
JB
1570#endif
1571
273b9028 1572 /* Send over our environment and current directory. */
59e085e0
KL
1573 if (!current_frame)
1574 {
1575 extern char **environ;
1576 int i;
1577 for (i = 0; environ[i]; i++)
1578 {
486ba65f
JR
1579 send_to_emacs (emacs_socket, "-env ");
1580 quote_argument (emacs_socket, environ[i]);
1581 send_to_emacs (emacs_socket, " ");
59e085e0 1582 }
2828d5f9 1583 }
ba528748
SM
1584 send_to_emacs (emacs_socket, "-dir ");
1585 quote_argument (emacs_socket, cwd);
1586 send_to_emacs (emacs_socket, "/");
1587 send_to_emacs (emacs_socket, " ");
2828d5f9 1588
6afdd335 1589 retry:
5212210c 1590 if (nowait)
486ba65f 1591 send_to_emacs (emacs_socket, "-nowait ");
292d74a3 1592
92071250 1593 if (current_frame)
486ba65f 1594 send_to_emacs (emacs_socket, "-current-frame ");
c0f342ab 1595
30be2360 1596 if (display)
87209357 1597 {
486ba65f
JR
1598 send_to_emacs (emacs_socket, "-display ");
1599 quote_argument (emacs_socket, display);
1600 send_to_emacs (emacs_socket, " ");
87209357 1601 }
30be2360 1602
0191e222
CY
1603 if (parent_id)
1604 {
1605 send_to_emacs (emacs_socket, "-parent-id ");
1606 quote_argument (emacs_socket, parent_id);
1607 send_to_emacs (emacs_socket, " ");
1608 }
1609
8536c0f5
CY
1610 /* If using the current frame, send tty information to Emacs anyway.
1611 In daemon mode, Emacs may need to occupy this tty if no other
1612 frame is available. */
322ca650 1613 if (tty || (current_frame && !eval))
9628b887 1614 {
273b9028 1615 char *tty_type, *tty_name;
0b0d3e0b 1616
273b9028
CY
1617 if (find_tty (&tty_type, &tty_name, !tty))
1618 {
b2ff54a0 1619#if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
273b9028 1620 init_signals ();
b2ff54a0 1621#endif
273b9028
CY
1622 send_to_emacs (emacs_socket, "-tty ");
1623 quote_argument (emacs_socket, tty_name);
1624 send_to_emacs (emacs_socket, " ");
1625 quote_argument (emacs_socket, tty_type);
1626 send_to_emacs (emacs_socket, " ");
1627 }
9628b887 1628 }
77134727 1629
273b9028 1630 if (!current_frame && !tty)
486ba65f 1631 send_to_emacs (emacs_socket, "-window-system ");
0b0d3e0b 1632
87209357 1633 if ((argc - optind > 0))
5212210c 1634 {
87209357 1635 for (i = optind; i < argc; i++)
46cec291 1636 {
0b0d3e0b 1637
87209357 1638 if (eval)
0b0d3e0b 1639 {
974b73e8 1640 /* Don't prepend cwd or anything like that. */
486ba65f
JR
1641 send_to_emacs (emacs_socket, "-eval ");
1642 quote_argument (emacs_socket, argv[i]);
1643 send_to_emacs (emacs_socket, " ");
0b0d3e0b
KL
1644 continue;
1645 }
1646
1647 if (*argv[i] == '+')
1648 {
87209357
EZ
1649 char *p = argv[i] + 1;
1650 while (isdigit ((unsigned char) *p) || *p == ':') p++;
0b0d3e0b
KL
1651 if (*p == 0)
1652 {
486ba65f
JR
1653 send_to_emacs (emacs_socket, "-position ");
1654 quote_argument (emacs_socket, argv[i]);
1655 send_to_emacs (emacs_socket, " ");
0b0d3e0b
KL
1656 continue;
1657 }
0b0d3e0b 1658 }
6cde1b21
JB
1659#ifdef WINDOWSNT
1660 else if (! file_name_absolute_p (argv[i])
1661 && (isalpha (argv[i][0]) && argv[i][1] == ':'))
1662 /* Windows can have a different default directory for each
1663 drive, so the cwd passed via "-dir" is not sufficient
1664 to account for that.
1665 If the user uses <drive>:<relpath>, we hence need to be
1666 careful to expand <relpath> with the default directory
1667 corresponding to <drive>. */
1668 {
1669 char *filename = (char *) xmalloc (MAX_PATH);
1670 DWORD size;
1671
1672 size = GetFullPathName (argv[i], MAX_PATH, filename, NULL);
1673 if (size > 0 && size < MAX_PATH)
1674 argv[i] = filename;
1675 else
1676 free (filename);
1677 }
1678#endif
0b0d3e0b 1679
486ba65f 1680 send_to_emacs (emacs_socket, "-file ");
486ba65f
JR
1681 quote_argument (emacs_socket, argv[i]);
1682 send_to_emacs (emacs_socket, " ");
0b0d3e0b 1683 }
46cec291 1684 }
273b9028 1685 else if (eval)
87209357 1686 {
273b9028
CY
1687 /* Read expressions interactively. */
1688 while ((str = fgets (string, BUFSIZ, stdin)))
1689 {
1690 send_to_emacs (emacs_socket, "-eval ");
1691 quote_argument (emacs_socket, str);
1692 }
1693 send_to_emacs (emacs_socket, " ");
87209357 1694 }
0b0d3e0b 1695
486ba65f 1696 send_to_emacs (emacs_socket, "\n");
46cec291 1697
fc2040c0
KL
1698 /* Wait for an answer. */
1699 if (!eval && !tty && !nowait)
30be2360
SM
1700 {
1701 printf ("Waiting for Emacs...");
1702 needlf = 2;
1703 }
46cec291 1704 fflush (stdout);
0b0d3e0b 1705 fsync (1);
46cec291 1706
3cf8c6aa 1707 /* Now, wait for an answer and print any messages. */
4b7b77f6 1708 while ((rl = recv (emacs_socket, string, BUFSIZ, 0)) > 0)
3cf8c6aa 1709 {
974b73e8
KL
1710 char *p;
1711 string[rl] = '\0';
1712
1713 p = string + strlen (string) - 1;
1714 while (p > string && *p == '\n')
0b0d3e0b
KL
1715 *p-- = 0;
1716
31fa6595 1717 if (strprefix ("-emacs-pid ", string))
4d553a13 1718 {
6afdd335 1719 /* -emacs-pid PID: The process id of the Emacs process. */
77134727
KL
1720 emacs_pid = strtol (string + strlen ("-emacs-pid"), NULL, 10);
1721 }
974b73e8 1722 else if (strprefix ("-window-system-unsupported ", string))
6afdd335
KL
1723 {
1724 /* -window-system-unsupported: Emacs was compiled without X
1725 support. Try again on the terminal. */
6afdd335
KL
1726 nowait = 0;
1727 tty = 1;
1728 goto retry;
1729 }
974b73e8 1730 else if (strprefix ("-print ", string))
77134727 1731 {
6afdd335 1732 /* -print STRING: Print STRING on the terminal. */
974b73e8 1733 str = unquote_argument (string + strlen ("-print "));
0b0d3e0b 1734 if (needlf)
77134727 1735 printf ("\n");
0b0d3e0b
KL
1736 printf ("%s", str);
1737 needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
77134727 1738 }
974b73e8 1739 else if (strprefix ("-error ", string))
77134727 1740 {
6afdd335 1741 /* -error DESCRIPTION: Signal an error on the terminal. */
974b73e8 1742 str = unquote_argument (string + strlen ("-error "));
0b0d3e0b
KL
1743 if (needlf)
1744 printf ("\n");
974b73e8 1745 fprintf (stderr, "*ERROR*: %s", str);
0b0d3e0b
KL
1746 needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
1747 }
c801ad51 1748#ifdef SIGSTOP
382707ec 1749 else if (strprefix ("-suspend ", string))
0b0d3e0b 1750 {
6afdd335 1751 /* -suspend: Suspend this terminal, i.e., stop the process. */
0b0d3e0b 1752 if (needlf)
77134727 1753 printf ("\n");
0b0d3e0b
KL
1754 needlf = 0;
1755 kill (0, SIGSTOP);
4d553a13 1756 }
b2ff54a0 1757#endif
4d553a13
KL
1758 else
1759 {
6afdd335 1760 /* Unknown command. */
0b0d3e0b 1761 if (needlf)
4d553a13 1762 printf ("\n");
974b73e8
KL
1763 printf ("*ERROR*: Unknown message: %s", string);
1764 needlf = string[0] == '\0' ? needlf : string[strlen (string) - 1] != '\n';
4d553a13 1765 }
3cf8c6aa
SM
1766 }
1767
1768 if (needlf)
1769 printf ("\n");
1770 fflush (stdout);
0b0d3e0b 1771 fsync (1);
23a7488d 1772
4b7b77f6 1773 CLOSE_SOCKET (emacs_socket);
65396510 1774 return EXIT_SUCCESS;
46cec291
RS
1775}
1776
1e7823d0 1777#endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
aa0b6932 1778
27711600
RM
1779\f
1780#ifndef HAVE_STRERROR
1781char *
1782strerror (errnum)
1783 int errnum;
1784{
1785 extern char *sys_errlist[];
1786 extern int sys_nerr;
1787
1788 if (errnum >= 0 && errnum < sys_nerr)
1789 return sys_errlist[errnum];
1790 return (char *) "Unknown error";
1791}
1792
1793#endif /* ! HAVE_STRERROR */
ab5796a9
MB
1794
1795/* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1796 (do not change this comment) */
65396510
TTN
1797
1798/* emacsclient.c ends here */