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