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