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