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