1 /* Client process that communicates with GNU Emacs acting as server.
2 Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
27 /* config.h defines these, which disables sockets altogether! */
34 # include <commctrl.h>
36 # define NO_SOCKETS_IN_FILE_SYSTEM
38 # define HSOCKET SOCKET
39 # define CLOSE_SOCKET closesocket
40 # define INITIALIZE() (initialize_sockets ())
42 #else /* !WINDOWSNT */
46 # ifdef HAVE_INET_SOCKETS
47 # include <netinet/in.h>
50 # include <arpa/inet.h>
52 # define INVALID_SOCKET -1
54 # define CLOSE_SOCKET close
61 #endif /* !WINDOWSNT */
75 #else /* not WINDOWSNT */
77 #endif /* not WINDOWSNT */
84 char *getenv (const char *), *getwd (char *);
89 #define egetenv(VAR) w32_getenv(VAR)
91 #define egetenv(VAR) getenv(VAR)
95 #define VERSION "unspecified"
100 #define EXIT_SUCCESS 0
104 #define EXIT_FAILURE 1
119 /* Additional space when allocating buffers for filenames, etc. */
120 #define EXTRA_SPACE 100
123 /* Name used to invoke this program. */
126 /* The second argument to main. */
129 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
132 /* Nonzero means args are expressions to be evaluated. --eval. */
135 /* Nonzero means don't open a new frame. Inverse of --create-frame. */
136 int current_frame
= 1;
138 /* The display on which Emacs should work. --display. */
139 char *display
= NULL
;
141 /* The parent window ID, if we are opening a frame via XEmbed. */
142 char *parent_id
= NULL
;
144 /* Nonzero means open a new Emacs frame on the current terminal. */
147 /* If non-NULL, the name of an editor to fallback to if the server
148 is not running. --alternate-editor. */
149 const char *alternate_editor
= NULL
;
151 /* If non-NULL, the filename of the UNIX socket. */
152 char *socket_name
= NULL
;
154 /* If non-NULL, the filename of the authentication file. */
155 char *server_file
= NULL
;
157 /* PID of the Emacs server process. */
160 void print_help_and_exit (void) NO_RETURN
;
161 void fail (void) NO_RETURN
;
164 struct option longopts
[] =
166 { "no-wait", no_argument
, NULL
, 'n' },
167 { "eval", no_argument
, NULL
, 'e' },
168 { "help", no_argument
, NULL
, 'H' },
169 { "version", no_argument
, NULL
, 'V' },
170 { "tty", no_argument
, NULL
, 't' },
171 { "nw", no_argument
, NULL
, 't' },
172 { "create-frame", no_argument
, NULL
, 'c' },
173 { "alternate-editor", required_argument
, NULL
, 'a' },
174 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
175 { "socket-name", required_argument
, NULL
, 's' },
177 { "server-file", required_argument
, NULL
, 'f' },
179 { "display", required_argument
, NULL
, 'd' },
181 { "parent-id", required_argument
, NULL
, 'p' },
186 /* Like malloc but get fatal error if memory is exhausted. */
189 xmalloc (unsigned int size
)
191 long *result
= (long *) malloc (size
);
200 /* Like strdup but get a fatal error if memory is exhausted. */
203 xstrdup (const char *s
)
205 char *result
= strdup (s
);
215 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
218 #ifndef DIRECTORY_SEP
219 #define DIRECTORY_SEP '/'
221 #ifndef IS_DIRECTORY_SEP
222 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
224 #ifndef IS_DEVICE_SEP
226 #define IS_DEVICE_SEP(_c_) 0
228 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
232 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
236 /* Return the current working directory. Returns NULL on errors.
237 Any other returned value must be freed with free. This is used
238 only when get_current_dir_name is not defined on the system. */
240 get_current_dir_name (void)
244 struct stat dotstat
, pwdstat
;
245 /* If PWD is accurate, use it instead of calling getwd. PWD is
246 sometimes a nicer name, and using it may avoid a fatal error if a
247 parent directory is searchable but not readable. */
248 if ((pwd
= egetenv ("PWD")) != 0
249 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
250 && stat (pwd
, &pwdstat
) == 0
251 && stat (".", &dotstat
) == 0
252 && dotstat
.st_ino
== pwdstat
.st_ino
253 && dotstat
.st_dev
== pwdstat
.st_dev
255 && strlen (pwd
) < MAXPATHLEN
259 buf
= (char *) xmalloc (strlen (pwd
) + 1);
267 size_t buf_size
= 1024;
268 buf
= (char *) xmalloc (buf_size
);
273 if (getcwd (buf
, buf_size
) == buf
)
277 int tmp_errno
= errno
;
283 buf
= (char *) realloc (buf
, buf_size
);
291 /* We need MAXPATHLEN here. */
292 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
295 if (getwd (buf
) == NULL
)
297 int tmp_errno
= errno
;
310 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
312 /* Retrieve an environment variable from the Emacs subkeys of the registry.
313 Return NULL if the variable was not found, or it was empty.
314 This code is based on w32_get_resource (w32.c). */
316 w32_get_resource (HKEY predefined
, char *key
, LPDWORD type
)
318 HKEY hrootkey
= NULL
;
322 if (RegOpenKeyEx (predefined
, REG_ROOT
, 0, KEY_READ
, &hrootkey
) == ERROR_SUCCESS
)
324 if (RegQueryValueEx (hrootkey
, key
, NULL
, NULL
, NULL
, &cbData
) == ERROR_SUCCESS
)
326 result
= (char *) xmalloc (cbData
);
328 if ((RegQueryValueEx (hrootkey
, key
, NULL
, type
, result
, &cbData
) != ERROR_SUCCESS
)
336 RegCloseKey (hrootkey
);
343 getenv wrapper for Windows
345 This is needed to duplicate Emacs's behavior, which is to look for environment
346 variables in the registry if they don't appear in the environment.
349 w32_getenv (char *envvar
)
354 if (value
= getenv (envvar
))
355 /* Found in the environment. */
358 if (! (value
= w32_get_resource (HKEY_CURRENT_USER
, envvar
, &dwType
)) &&
359 ! (value
= w32_get_resource (HKEY_LOCAL_MACHINE
, envvar
, &dwType
)))
361 /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */
362 if (strcmp (envvar
, "TERM") == 0)
363 return xstrdup ("w32console");
364 /* Found neither in the environment nor in the registry. */
368 if (dwType
== REG_SZ
)
369 /* Registry; no need to expand. */
372 if (dwType
== REG_EXPAND_SZ
)
376 if (size
= ExpandEnvironmentStrings (value
, NULL
, 0))
378 char *buffer
= (char *) xmalloc (size
);
379 if (ExpandEnvironmentStrings (value
, buffer
, size
))
381 /* Found and expanded. */
386 /* Error expanding. */
391 /* Not the right type, or not correctly expanded. */
397 w32_set_user_model_id (void)
400 HRESULT (WINAPI
* set_user_model
) (wchar_t * id
);
402 /* On Windows 7 and later, we need to set the user model ID
403 to associate emacsclient launched files with Emacs frames
405 shell
= LoadLibrary("shell32.dll");
409 = (void *) GetProcAddress (shell
,
410 "SetCurrentProcessExplicitAppUserModelID");
411 /* If the function is defined, then we are running on Windows 7
412 or newer, and the UI uses this to group related windows
413 together. Since emacs, runemacs, emacsclient are related, we
414 want them grouped even though the executables are different,
415 so we need to set a consistent ID between them. */
417 set_user_model (L
"GNU.Emacs");
424 w32_window_app (void)
426 static int window_app
= -1;
427 char szTitle
[MAX_PATH
];
431 /* Checking for STDOUT does not work; it's a valid handle also in
432 nonconsole apps. Testing for the console title seems to work. */
433 window_app
= (GetConsoleTitleA (szTitle
, MAX_PATH
) == 0);
435 InitCommonControls();
442 execvp wrapper for Windows. Quotes arguments with embedded spaces.
444 This is necessary due to the broken implementation of exec* routines in
445 the Microsoft libraries: they concatenate the arguments together without
446 quoting special characters, and pass the result to CreateProcess, with
447 predictably bad results. By contrast, POSIX execvp passes the arguments
448 directly into the argv array of the child process.
451 w32_execvp (const char *path
, char **argv
)
455 /* Required to allow a .BAT script as alternate editor. */
456 argv
[0] = (char *) alternate_editor
;
458 for (i
= 0; argv
[i
]; i
++)
459 if (strchr (argv
[i
], ' '))
461 char *quoted
= alloca (strlen (argv
[i
]) + 3);
462 sprintf (quoted
, "\"%s\"", argv
[i
]);
466 return execvp (path
, argv
);
470 #define execvp w32_execvp
472 /* Emulation of ttyname for Windows. */
479 #endif /* WINDOWSNT */
481 /* Display a normal or error message.
482 On Windows, use a message box if compiled as a Windows app. */
484 message (int is_error
, char *message
, ...)
489 va_start (args
, message
);
490 vsprintf (msg
, message
, args
);
494 if (w32_window_app ())
497 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
499 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
504 FILE *f
= is_error
? stderr
: stdout
;
511 /* Decode the options from argv and argc.
512 The global variable `optind' will say how many arguments we used up. */
515 decode_options (int argc
, char **argv
)
517 alternate_editor
= egetenv ("ALTERNATE_EDITOR");
521 int opt
= getopt_long_only (argc
, argv
,
522 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
535 /* If getopt returns 0, then it has already processed a
536 long-named option. We should do nothing. */
540 alternate_editor
= optarg
;
543 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
545 socket_name
= optarg
;
550 server_file
= optarg
;
553 /* We used to disallow this argument in w32, but it seems better
554 to allow it, for the occasional case where the user is
555 connecting with a w32 client to a server compiled with X11
570 message (FALSE
, "emacsclient %s\n", VERSION
);
589 print_help_and_exit ();
593 message (TRUE
, "Try `%s --help' for more information\n", progname
);
599 /* If the -c option is used (without -t) and no --display argument
600 is provided, try $DISPLAY.
601 Without the -c option, we used to set `display' to $DISPLAY by
602 default, but this changed the default behavior and is sometimes
603 inconvenient. So we force users to use "--display $DISPLAY" if
604 they want Emacs to connect to their current display. */
605 if (!current_frame
&& !tty
&& !display
)
607 display
= egetenv ("DISPLAY");
609 /* Under Cocoa, we don't really use displays the same way as in X,
610 so provide a dummy. */
611 if (!display
|| strlen (display
) == 0)
616 /* A null-string display is invalid. */
617 if (display
&& strlen (display
) == 0)
620 /* If no display is available, new frames are tty frames. */
621 if (!current_frame
&& !display
)
624 /* --no-wait implies --current-frame on ttys when there are file
625 arguments or expressions given. */
626 if (nowait
&& tty
&& argc
- optind
> 0)
630 if (alternate_editor
&& alternate_editor
[0] == '\0')
632 message (TRUE
, "--alternate-editor argument or ALTERNATE_EDITOR variable cannot be\n\
636 #endif /* WINDOWSNT */
641 print_help_and_exit (void)
643 /* Spaces and tabs are significant in this message; they're chosen so the
644 message aligns properly both in a tty and in a Windows message box.
645 Please try to preserve them; otherwise the output is very hard to read
646 when using emacsclientw. */
648 "Usage: %s [OPTIONS] FILE...\n\
649 Tell the Emacs server to visit the specified files.\n\
650 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
652 The following OPTIONS are accepted:\n\
653 -V, --version Just print version info and return\n\
654 -H, --help Print this usage information message\n\
655 -nw, -t, --tty Open a new Emacs frame on the current terminal\n\
656 -c, --create-frame Create a new frame instead of trying to\n\
657 use the current Emacs frame\n\
658 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
659 -n, --no-wait Don't wait for the server to return\n\
660 -d DISPLAY, --display=DISPLAY\n\
661 Visit the file in the given display\n\
662 --parent-id=ID Open in parent window ID, via XEmbed\n"
663 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
664 "-s SOCKET, --socket-name=SOCKET\n\
665 Set filename of the UNIX socket for communication\n"
667 "-f SERVER, --server-file=SERVER\n\
668 Set filename of the TCP authentication file\n\
669 -a EDITOR, --alternate-editor=EDITOR\n\
670 Editor to fallback to if the server is not running\n"
672 " If EDITOR is the empty string, start Emacs in daemon\n\
673 mode and try connecting again\n"
674 #endif /* not WINDOWSNT */
676 Report bugs with M-x report-emacs-bug.\n", progname
);
681 Try to run a different command, or --if no alternate editor is
682 defined-- exit with an errorcode.
683 Uses argv, but gets it from the global variable main_argv.
688 if (alternate_editor
)
692 execvp (alternate_editor
, main_argv
+ i
);
693 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
694 progname
, alternate_editor
);
700 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
709 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
710 "on systems with Berkeley sockets.\n",
715 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
718 # include <winsock2.h>
720 # include <sys/types.h>
721 # include <sys/socket.h>
725 #define AUTH_KEY_LENGTH 64
726 #define SEND_BUFFER_SIZE 4096
728 extern char *strerror (int);
730 /* Buffer to accumulate data to send in TCP connections. */
731 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
732 int sblen
= 0; /* Fill pointer for the send buffer. */
733 /* Socket used to communicate with the Emacs server process. */
734 HSOCKET emacs_socket
= 0;
736 /* On Windows, the socket library was historically separate from the standard
737 C library, so errors are handled differently. */
739 sock_err_message (char *function_name
)
744 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
745 | FORMAT_MESSAGE_ALLOCATE_BUFFER
746 | FORMAT_MESSAGE_ARGUMENT_ARRAY
,
747 NULL
, WSAGetLastError (), 0, (LPTSTR
)&msg
, 0, NULL
);
749 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, msg
);
753 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, strerror (errno
));
758 /* Let's send the data to Emacs when either
759 - the data ends in "\n", or
760 - the buffer is full (but this shouldn't happen)
761 Otherwise, we just accumulate it. */
763 send_to_emacs (HSOCKET s
, char *data
)
767 int dlen
= strlen (data
);
768 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
770 int part
= SEND_BUFFER_SIZE
- sblen
;
771 strncpy (&send_buffer
[sblen
], data
, part
);
773 sblen
= SEND_BUFFER_SIZE
;
777 strcpy (&send_buffer
[sblen
], data
);
784 if (sblen
== SEND_BUFFER_SIZE
785 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
787 int sent
= send (s
, send_buffer
, sblen
, 0);
789 strcpy (send_buffer
, &send_buffer
[sent
]);
796 /* In STR, insert a & before each &, each space, each newline, and
797 any initial -. Change spaces to underscores, too, so that the
798 return value never contains a space.
800 Does not change the string. Outputs the result to S. */
802 quote_argument (HSOCKET s
, char *str
)
804 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
825 if (*p
== '&' || (*p
== '-' && p
== str
))
832 send_to_emacs (s
, copy
);
838 /* The inverse of quote_argument. Removes quoting in string STR by
839 modifying the string in place. Returns STR. */
842 unquote_argument (char *str
)
873 file_name_absolute_p (const unsigned char *filename
)
875 /* Sanity check, it shouldn't happen. */
876 if (! filename
) return FALSE
;
878 /* /xxx is always an absolute path. */
879 if (filename
[0] == '/') return TRUE
;
881 /* Empty filenames (which shouldn't happen) are relative. */
882 if (filename
[0] == '\0') return FALSE
;
885 /* X:\xxx is always absolute. */
886 if (isalpha (filename
[0])
887 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
890 /* Both \xxx and \\xxx\yyy are absolute. */
891 if (filename
[0] == '\\') return TRUE
;
898 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
905 /* Initialize the WinSock2 library. */
907 initialize_sockets (void)
911 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
913 message (TRUE
, "%s: error initializing WinSock2\n", progname
);
917 atexit (close_winsock
);
919 #endif /* WINDOWSNT */
923 * Read the information needed to set up a TCP comm channel with
924 * the Emacs server: host, port, pid and authentication string.
927 get_server_config (struct sockaddr_in
*server
, char *authentication
)
934 if (file_name_absolute_p (server_file
))
935 config
= fopen (server_file
, "rb");
938 char *home
= egetenv ("HOME");
942 char *path
= alloca (strlen (home
) + strlen (server_file
)
944 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
945 config
= fopen (path
, "rb");
948 if (!config
&& (home
= egetenv ("APPDATA")))
950 char *path
= alloca (strlen (home
) + strlen (server_file
)
952 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
953 config
= fopen (path
, "rb");
961 if (fgets (dotted
, sizeof dotted
, config
)
962 && (port
= strchr (dotted
, ':'))
963 && (pid
= strchr (port
, ' ')))
970 message (TRUE
, "%s: invalid configuration info\n", progname
);
974 server
->sin_family
= AF_INET
;
975 server
->sin_addr
.s_addr
= inet_addr (dotted
);
976 server
->sin_port
= htons (atoi (port
));
978 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
980 message (TRUE
, "%s: cannot read authentication info\n", progname
);
986 emacs_pid
= atoi (pid
);
992 set_tcp_socket (void)
995 struct sockaddr_in server
;
996 struct linger l_arg
= {1, 1};
997 char auth_string
[AUTH_KEY_LENGTH
+ 1];
999 if (! get_server_config (&server
, auth_string
))
1000 return INVALID_SOCKET
;
1002 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
1003 message (FALSE
, "%s: connected to remote socket at %s\n",
1004 progname
, inet_ntoa (server
.sin_addr
));
1007 * Open up an AF_INET socket
1009 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
1011 sock_err_message ("socket");
1012 return INVALID_SOCKET
;
1018 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
1020 sock_err_message ("connect");
1021 return INVALID_SOCKET
;
1024 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
1027 * Send the authentication
1029 auth_string
[AUTH_KEY_LENGTH
] = '\0';
1031 send_to_emacs (s
, "-auth ");
1032 send_to_emacs (s
, auth_string
);
1033 send_to_emacs (s
, " ");
1039 /* Returns 1 if PREFIX is a prefix of STRING. */
1041 strprefix (char *prefix
, char *string
)
1043 return !strncmp (prefix
, string
, strlen (prefix
));
1046 /* Get tty name and type. If successful, return the type in TTY_TYPE
1047 and the name in TTY_NAME, and return 1. Otherwise, fail if NOABORT
1048 is zero, or return 0 if NOABORT is non-zero. */
1051 find_tty (char **tty_type
, char **tty_name
, int noabort
)
1053 char *type
= egetenv ("TERM");
1054 char *name
= ttyname (fileno (stdout
));
1062 message (TRUE
, "%s: could not get terminal name\n", progname
);
1073 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1079 if (strcmp (type
, "eterm") == 0)
1085 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1086 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1087 " is not supported\n", progname
);
1098 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1100 /* Three possibilities:
1101 2 - can't be `stat'ed (sets errno)
1102 1 - isn't owned by us
1103 0 - success: none of the above */
1106 socket_status (char *socket_name
)
1108 struct stat statbfr
;
1110 if (stat (socket_name
, &statbfr
) == -1)
1113 if (statbfr
.st_uid
!= geteuid ())
1120 /* A signal handler that passes the signal to the Emacs process.
1121 Useful for SIGWINCH. */
1124 pass_signal_to_emacs (int signalnum
)
1126 int old_errno
= errno
;
1129 kill (emacs_pid
, signalnum
);
1131 signal (signalnum
, pass_signal_to_emacs
);
1135 /* Signal handler for SIGCONT; notify the Emacs process that it can
1136 now resume our tty frame. */
1139 handle_sigcont (int signalnum
)
1141 int old_errno
= errno
;
1143 if (tcgetpgrp (1) == getpgrp ())
1145 /* We are in the foreground. */
1146 send_to_emacs (emacs_socket
, "-resume \n");
1150 /* We are in the background; cancel the continue. */
1151 kill (getpid (), SIGSTOP
);
1154 signal (signalnum
, handle_sigcont
);
1158 /* Signal handler for SIGTSTP; notify the Emacs process that we are
1159 going to sleep. Normally the suspend is initiated by Emacs via
1160 server-handle-suspend-tty, but if the server gets out of sync with
1161 reality, we may get a SIGTSTP on C-z. Handling this signal and
1162 notifying Emacs about it should get things under control again. */
1165 handle_sigtstp (int signalnum
)
1167 int old_errno
= errno
;
1171 send_to_emacs (emacs_socket
, "-suspend \n");
1173 /* Unblock this signal and call the default handler by temporarily
1174 changing the handler and resignalling. */
1175 sigprocmask (SIG_BLOCK
, NULL
, &set
);
1176 sigdelset (&set
, signalnum
);
1177 signal (signalnum
, SIG_DFL
);
1178 kill (getpid (), signalnum
);
1179 sigprocmask (SIG_SETMASK
, &set
, NULL
); /* Let's the above signal through. */
1180 signal (signalnum
, handle_sigtstp
);
1186 /* Set up signal handlers before opening a frame on the current tty. */
1191 /* Set up signal handlers. */
1192 signal (SIGWINCH
, pass_signal_to_emacs
);
1194 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1195 deciding which terminal the signal came from. C-g is now a
1196 normal input event on secondary terminals. */
1198 signal (SIGINT
, pass_signal_to_emacs
);
1199 signal (SIGQUIT
, pass_signal_to_emacs
);
1202 signal (SIGCONT
, handle_sigcont
);
1203 signal (SIGTSTP
, handle_sigtstp
);
1204 signal (SIGTTOU
, handle_sigtstp
);
1209 set_local_socket (void)
1212 struct sockaddr_un server
;
1215 * Open up an AF_UNIX socket in this person's home directory
1218 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1220 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1221 return INVALID_SOCKET
;
1224 server
.sun_family
= AF_UNIX
;
1227 int sock_status
= 0;
1228 int default_sock
= !socket_name
;
1229 int saved_errno
= 0;
1230 char *server_name
= "server";
1233 if (socket_name
&& !strchr (socket_name
, '/')
1234 && !strchr (socket_name
, '\\'))
1236 /* socket_name is a file name component. */
1237 server_name
= socket_name
;
1239 default_sock
= 1; /* Try both UIDs. */
1244 tmpdir
= egetenv ("TMPDIR");
1247 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1249 sprintf (socket_name
, "%s/emacs%d/%s",
1250 tmpdir
, (int) geteuid (), server_name
);
1253 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1254 strcpy (server
.sun_path
, socket_name
);
1257 message (TRUE
, "%s: socket-name %s too long\n",
1258 progname
, socket_name
);
1262 /* See if the socket exists, and if it's owned by us. */
1263 sock_status
= socket_status (server
.sun_path
);
1264 saved_errno
= errno
;
1265 if (sock_status
&& default_sock
)
1267 /* Failing that, see if LOGNAME or USER exist and differ from
1268 our euid. If so, look for a socket based on the UID
1269 associated with the name. This is reminiscent of the logic
1270 that init_editfns uses to set the global Vuser_full_name. */
1272 char *user_name
= (char *) egetenv ("LOGNAME");
1275 user_name
= (char *) egetenv ("USER");
1279 struct passwd
*pw
= getpwnam (user_name
);
1281 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1283 /* We're running under su, apparently. */
1284 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1286 sprintf (socket_name
, "%s/emacs%d/%s",
1287 tmpdir
, (int) pw
->pw_uid
, server_name
);
1289 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1290 strcpy (server
.sun_path
, socket_name
);
1293 message (TRUE
, "%s: socket-name %s too long\n",
1294 progname
, socket_name
);
1295 exit (EXIT_FAILURE
);
1298 sock_status
= socket_status (server
.sun_path
);
1299 saved_errno
= errno
;
1302 errno
= saved_errno
;
1306 switch (sock_status
)
1309 /* There's a socket, but it isn't owned by us. This is OK if
1311 if (0 != geteuid ())
1313 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1314 return INVALID_SOCKET
;
1320 if (saved_errno
== ENOENT
)
1322 "%s: can't find socket; have you started the server?\n\
1323 To start the server in Emacs, type \"M-x server-start\".\n",
1326 message (TRUE
, "%s: can't stat %s: %s\n",
1327 progname
, server
.sun_path
, strerror (saved_errno
));
1328 return INVALID_SOCKET
;
1332 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1335 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1336 return INVALID_SOCKET
;
1341 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1344 set_socket (int no_exit_if_error
)
1350 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1351 /* Explicit --socket-name argument. */
1354 s
= set_local_socket ();
1355 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1357 message (TRUE
, "%s: error accessing socket \"%s\"\n",
1358 progname
, socket_name
);
1359 exit (EXIT_FAILURE
);
1363 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1365 server_file
= egetenv ("EMACS_SERVER_FILE");
1369 s
= set_tcp_socket ();
1370 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1373 message (TRUE
, "%s: error accessing server file \"%s\"\n",
1374 progname
, server_file
);
1375 exit (EXIT_FAILURE
);
1378 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1379 /* Implicit local socket. */
1380 s
= set_local_socket ();
1381 if (s
!= INVALID_SOCKET
)
1385 /* Implicit server file. */
1386 server_file
= "server";
1387 s
= set_tcp_socket ();
1388 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1391 /* No implicit or explicit socket, and no alternate editor. */
1392 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1393 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1396 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1397 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1399 exit (EXIT_FAILURE
);
1403 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1404 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1407 w32_find_emacs_process (HWND hWnd
, LPARAM lParam
)
1412 /* Reject any window not of class "Emacs". */
1413 if (! get_wc (hWnd
, class, sizeof (class))
1414 || strcmp (class, "Emacs"))
1417 /* We only need the process id, not the thread id. */
1418 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1420 /* Not the one we're looking for. */
1421 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1423 /* OK, let's raise it. */
1426 /* Stop enumeration. */
1431 * Search for a window of class "Emacs" and owned by a process with
1432 * process id = emacs_pid. If found, allow it to grab the focus.
1435 w32_give_focus (void)
1439 /* It shouldn't happen when dealing with TCP sockets. */
1440 if (!emacs_pid
) return;
1442 user32
= GetModuleHandle ("user32.dll");
1447 /* Modern Windows restrict which processes can set the foreground window.
1448 emacsclient can allow Emacs to grab the focus by calling the function
1449 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1450 NT) lack this function, so we have to check its availability. */
1451 if ((set_fg
= GetProcAddress (user32
, "AllowSetForegroundWindow"))
1452 && (get_wc
= GetProcAddress (user32
, "RealGetWindowClassA")))
1453 EnumWindows (w32_find_emacs_process
, (LPARAM
) 0);
1457 /* Start the emacs daemon and try to connect to it. */
1460 start_daemon_and_retry_set_socket (void)
1471 w
= waitpid (dpid
, &status
, WUNTRACED
| WCONTINUED
);
1473 if ((w
== -1) || !WIFEXITED (status
) || WEXITSTATUS(status
))
1475 message (TRUE
, "Error: Could not start the Emacs daemon\n");
1476 exit (EXIT_FAILURE
);
1479 /* Try connecting, the daemon should have started by now. */
1480 message (TRUE
, "Emacs daemon should have started, trying to connect again\n");
1481 if ((emacs_socket
= set_socket (1)) == INVALID_SOCKET
)
1483 message (TRUE
, "Error: Cannot connect even after starting the Emacs daemon\n");
1484 exit (EXIT_FAILURE
);
1489 fprintf (stderr
, "Error: Cannot fork!\n");
1494 char *d_argv
[] = {"emacs", "--daemon", 0 };
1495 if (socket_name
!= NULL
)
1497 /* Pass --daemon=socket_name as argument. */
1498 char *deq
= "--daemon=";
1499 char *daemon_arg
= alloca (strlen (deq
)
1500 + strlen (socket_name
) + 1);
1501 strcpy (daemon_arg
, deq
);
1502 strcat (daemon_arg
, socket_name
);
1503 d_argv
[1] = daemon_arg
;
1505 execvp ("emacs", d_argv
);
1506 message (TRUE
, "%s: error starting emacs daemon\n", progname
);
1508 #endif /* WINDOWSNT */
1512 main (int argc
, char **argv
)
1514 int i
, rl
, needlf
= 0;
1516 char string
[BUFSIZ
+1];
1517 int null_socket_name
, null_server_file
, start_daemon_if_needed
;
1523 /* On Windows 7 and later, we need to explicitly associate emacsclient
1524 with emacs so the UI behaves sensibly. */
1525 w32_set_user_model_id ();
1528 /* Process options. */
1529 decode_options (argc
, argv
);
1531 if ((argc
- optind
< 1) && !eval
&& current_frame
)
1533 message (TRUE
, "%s: file name or argument required\n"
1534 "Try `%s --help' for more information\n",
1535 progname
, progname
);
1536 exit (EXIT_FAILURE
);
1539 /* If alternate_editor is the empty string, start the emacs daemon
1540 in case of failure to connect. */
1541 start_daemon_if_needed
= (alternate_editor
1542 && (alternate_editor
[0] == '\0'));
1543 if (start_daemon_if_needed
)
1545 /* set_socket changes the values for socket_name and
1546 server_file, we need to reset them, if they were NULL before
1547 for the second call to set_socket. */
1548 null_socket_name
= (socket_name
== NULL
);
1549 null_server_file
= (server_file
== NULL
);
1552 if ((emacs_socket
= set_socket (alternate_editor
1553 || start_daemon_if_needed
)) == INVALID_SOCKET
)
1554 if (start_daemon_if_needed
)
1556 /* Reset socket_name and server_file if they were NULL
1557 before the set_socket call. */
1558 if (null_socket_name
)
1560 if (null_server_file
)
1563 start_daemon_and_retry_set_socket ();
1568 cwd
= get_current_dir_name ();
1571 /* getwd puts message in STRING if it fails. */
1572 message (TRUE
, "%s: %s\n", progname
,
1573 "Cannot get current working directory");
1581 /* Send over our environment and current directory. */
1584 extern char **environ
;
1586 for (i
= 0; environ
[i
]; i
++)
1588 char *name
= xstrdup (environ
[i
]);
1589 char *value
= strchr (name
, '=');
1590 send_to_emacs (emacs_socket
, "-env ");
1591 quote_argument (emacs_socket
, environ
[i
]);
1592 send_to_emacs (emacs_socket
, " ");
1595 send_to_emacs (emacs_socket
, "-dir ");
1596 quote_argument (emacs_socket
, cwd
);
1597 send_to_emacs (emacs_socket
, "/");
1598 send_to_emacs (emacs_socket
, " ");
1602 send_to_emacs (emacs_socket
, "-nowait ");
1605 send_to_emacs (emacs_socket
, "-current-frame ");
1609 send_to_emacs (emacs_socket
, "-display ");
1610 quote_argument (emacs_socket
, display
);
1611 send_to_emacs (emacs_socket
, " ");
1616 send_to_emacs (emacs_socket
, "-parent-id ");
1617 quote_argument (emacs_socket
, parent_id
);
1618 send_to_emacs (emacs_socket
, " ");
1621 /* If using the current frame, send tty information to Emacs anyway.
1622 In daemon mode, Emacs may need to occupy this tty if no other
1623 frame is available. */
1624 if (tty
|| (current_frame
&& !eval
))
1626 char *tty_type
, *tty_name
;
1628 if (find_tty (&tty_type
, &tty_name
, !tty
))
1630 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1633 send_to_emacs (emacs_socket
, "-tty ");
1634 quote_argument (emacs_socket
, tty_name
);
1635 send_to_emacs (emacs_socket
, " ");
1636 quote_argument (emacs_socket
, tty_type
);
1637 send_to_emacs (emacs_socket
, " ");
1641 if (!current_frame
&& !tty
)
1642 send_to_emacs (emacs_socket
, "-window-system ");
1644 if ((argc
- optind
> 0))
1646 for (i
= optind
; i
< argc
; i
++)
1651 /* Don't prepend cwd or anything like that. */
1652 send_to_emacs (emacs_socket
, "-eval ");
1653 quote_argument (emacs_socket
, argv
[i
]);
1654 send_to_emacs (emacs_socket
, " ");
1658 if (*argv
[i
] == '+')
1660 char *p
= argv
[i
] + 1;
1661 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1664 send_to_emacs (emacs_socket
, "-position ");
1665 quote_argument (emacs_socket
, argv
[i
]);
1666 send_to_emacs (emacs_socket
, " ");
1671 else if (! file_name_absolute_p (argv
[i
])
1672 && (isalpha (argv
[i
][0]) && argv
[i
][1] == ':'))
1673 /* Windows can have a different default directory for each
1674 drive, so the cwd passed via "-dir" is not sufficient
1675 to account for that.
1676 If the user uses <drive>:<relpath>, we hence need to be
1677 careful to expand <relpath> with the default directory
1678 corresponding to <drive>. */
1680 char *filename
= (char *) xmalloc (MAX_PATH
);
1683 size
= GetFullPathName (argv
[i
], MAX_PATH
, filename
, NULL
);
1684 if (size
> 0 && size
< MAX_PATH
)
1691 send_to_emacs (emacs_socket
, "-file ");
1692 quote_argument (emacs_socket
, argv
[i
]);
1693 send_to_emacs (emacs_socket
, " ");
1698 /* Read expressions interactively. */
1699 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1701 send_to_emacs (emacs_socket
, "-eval ");
1702 quote_argument (emacs_socket
, str
);
1704 send_to_emacs (emacs_socket
, " ");
1707 send_to_emacs (emacs_socket
, "\n");
1709 /* Wait for an answer. */
1710 if (!eval
&& !tty
&& !nowait
)
1712 printf ("Waiting for Emacs...");
1718 /* Now, wait for an answer and print any messages. */
1719 while ((rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1724 p
= string
+ strlen (string
) - 1;
1725 while (p
> string
&& *p
== '\n')
1728 if (strprefix ("-emacs-pid ", string
))
1730 /* -emacs-pid PID: The process id of the Emacs process. */
1731 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1733 else if (strprefix ("-window-system-unsupported ", string
))
1735 /* -window-system-unsupported: Emacs was compiled without X
1736 support. Try again on the terminal. */
1741 else if (strprefix ("-print ", string
))
1743 /* -print STRING: Print STRING on the terminal. */
1744 str
= unquote_argument (string
+ strlen ("-print "));
1748 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1750 else if (strprefix ("-error ", string
))
1752 /* -error DESCRIPTION: Signal an error on the terminal. */
1753 str
= unquote_argument (string
+ strlen ("-error "));
1756 fprintf (stderr
, "*ERROR*: %s", str
);
1757 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1760 else if (strprefix ("-suspend ", string
))
1762 /* -suspend: Suspend this terminal, i.e., stop the process. */
1771 /* Unknown command. */
1774 printf ("*ERROR*: Unknown message: %s", string
);
1775 needlf
= string
[0] == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1784 CLOSE_SOCKET (emacs_socket
);
1785 return EXIT_SUCCESS
;
1788 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1791 #ifndef HAVE_STRERROR
1796 extern char *sys_errlist
[];
1797 extern int sys_nerr
;
1799 if (errnum
>= 0 && errnum
< sys_nerr
)
1800 return sys_errlist
[errnum
];
1801 return (char *) "Unknown error";
1804 #endif /* ! HAVE_STRERROR */
1806 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1807 (do not change this comment) */
1809 /* emacsclient.c ends here */