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, 2011 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/>. */
25 /* config.h defines these, which disables sockets altogether! */
32 # include <commctrl.h>
34 # include <winsock2.h>
36 # define NO_SOCKETS_IN_FILE_SYSTEM
38 # define HSOCKET SOCKET
39 # define CLOSE_SOCKET closesocket
40 # define INITIALIZE() (initialize_sockets ())
42 char *w32_getenv (char *);
43 #define egetenv(VAR) w32_getenv(VAR)
45 #else /* !WINDOWSNT */
49 # ifdef HAVE_INET_SOCKETS
50 # include <netinet/in.h>
52 # include <sys/types.h>
53 # include <sys/socket.h>
55 # endif /* HAVE_SOCKETS */
57 # include <arpa/inet.h>
59 # define INVALID_SOCKET -1
61 # define CLOSE_SOCKET close
68 #define egetenv(VAR) getenv(VAR)
70 #endif /* !WINDOWSNT */
87 char *getenv (const char *), *getwd (char *);
89 char *(getcwd
) (char *, size_t);
93 #define VERSION "unspecified"
98 #define EXIT_SUCCESS 0
102 #define EXIT_FAILURE 1
113 /* Additional space when allocating buffers for filenames, etc. */
114 #define EXTRA_SPACE 100
117 /* Name used to invoke this program. */
118 const char *progname
;
120 /* The second argument to main. */
123 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
126 /* Nonzero means args are expressions to be evaluated. --eval. */
129 /* Nonzero means don't open a new frame. Inverse of --create-frame. */
130 int current_frame
= 1;
132 /* The display on which Emacs should work. --display. */
133 const char *display
= NULL
;
135 /* The parent window ID, if we are opening a frame via XEmbed. */
136 char *parent_id
= NULL
;
138 /* Nonzero means open a new Emacs frame on the current terminal. */
141 /* If non-NULL, the name of an editor to fallback to if the server
142 is not running. --alternate-editor. */
143 const char *alternate_editor
= NULL
;
145 /* If non-NULL, the filename of the UNIX socket. */
146 char *socket_name
= NULL
;
148 /* If non-NULL, the filename of the authentication file. */
149 const char *server_file
= NULL
;
151 /* PID of the Emacs server process. */
154 void print_help_and_exit (void) NO_RETURN
;
155 void fail (void) NO_RETURN
;
158 struct option longopts
[] =
160 { "no-wait", no_argument
, NULL
, 'n' },
161 { "eval", no_argument
, NULL
, 'e' },
162 { "help", no_argument
, NULL
, 'H' },
163 { "version", no_argument
, NULL
, 'V' },
164 { "tty", no_argument
, NULL
, 't' },
165 { "nw", no_argument
, NULL
, 't' },
166 { "create-frame", no_argument
, NULL
, 'c' },
167 { "alternate-editor", required_argument
, NULL
, 'a' },
168 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
169 { "socket-name", required_argument
, NULL
, 's' },
171 { "server-file", required_argument
, NULL
, 'f' },
173 { "display", required_argument
, NULL
, 'd' },
175 { "parent-id", required_argument
, NULL
, 'p' },
180 /* Like malloc but get fatal error if memory is exhausted. */
183 xmalloc (unsigned int size
)
185 long *result
= (long *) malloc (size
);
194 /* Like strdup but get a fatal error if memory is exhausted. */
197 xstrdup (const char *s
)
199 char *result
= strdup (s
);
209 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
212 #ifndef DIRECTORY_SEP
213 #define DIRECTORY_SEP '/'
215 #ifndef IS_DIRECTORY_SEP
216 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
218 #ifndef IS_DEVICE_SEP
220 #define IS_DEVICE_SEP(_c_) 0
222 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
226 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
230 /* Return the current working directory. Returns NULL on errors.
231 Any other returned value must be freed with free. This is used
232 only when get_current_dir_name is not defined on the system. */
234 get_current_dir_name (void)
238 struct stat dotstat
, pwdstat
;
239 /* If PWD is accurate, use it instead of calling getwd. PWD is
240 sometimes a nicer name, and using it may avoid a fatal error if a
241 parent directory is searchable but not readable. */
242 if ((pwd
= egetenv ("PWD")) != 0
243 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
244 && stat (pwd
, &pwdstat
) == 0
245 && stat (".", &dotstat
) == 0
246 && dotstat
.st_ino
== pwdstat
.st_ino
247 && dotstat
.st_dev
== pwdstat
.st_dev
249 && strlen (pwd
) < MAXPATHLEN
253 buf
= (char *) xmalloc (strlen (pwd
) + 1);
261 size_t buf_size
= 1024;
262 buf
= (char *) xmalloc (buf_size
);
267 if (getcwd (buf
, buf_size
) == buf
)
271 int tmp_errno
= errno
;
277 buf
= (char *) realloc (buf
, buf_size
);
285 /* We need MAXPATHLEN here. */
286 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
289 if (getwd (buf
) == NULL
)
291 int tmp_errno
= errno
;
304 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
306 /* Retrieve an environment variable from the Emacs subkeys of the registry.
307 Return NULL if the variable was not found, or it was empty.
308 This code is based on w32_get_resource (w32.c). */
310 w32_get_resource (HKEY predefined
, char *key
, LPDWORD type
)
312 HKEY hrootkey
= NULL
;
316 if (RegOpenKeyEx (predefined
, REG_ROOT
, 0, KEY_READ
, &hrootkey
) == ERROR_SUCCESS
)
318 if (RegQueryValueEx (hrootkey
, key
, NULL
, NULL
, NULL
, &cbData
) == ERROR_SUCCESS
)
320 result
= (char *) xmalloc (cbData
);
322 if ((RegQueryValueEx (hrootkey
, key
, NULL
, type
, result
, &cbData
) != ERROR_SUCCESS
)
330 RegCloseKey (hrootkey
);
337 getenv wrapper for Windows
339 This is needed to duplicate Emacs's behavior, which is to look for environment
340 variables in the registry if they don't appear in the environment.
343 w32_getenv (char *envvar
)
348 if (value
= getenv (envvar
))
349 /* Found in the environment. */
352 if (! (value
= w32_get_resource (HKEY_CURRENT_USER
, envvar
, &dwType
)) &&
353 ! (value
= w32_get_resource (HKEY_LOCAL_MACHINE
, envvar
, &dwType
)))
355 /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */
356 if (strcmp (envvar
, "TERM") == 0)
357 return xstrdup ("w32console");
358 /* Found neither in the environment nor in the registry. */
362 if (dwType
== REG_SZ
)
363 /* Registry; no need to expand. */
366 if (dwType
== REG_EXPAND_SZ
)
370 if (size
= ExpandEnvironmentStrings (value
, NULL
, 0))
372 char *buffer
= (char *) xmalloc (size
);
373 if (ExpandEnvironmentStrings (value
, buffer
, size
))
375 /* Found and expanded. */
380 /* Error expanding. */
385 /* Not the right type, or not correctly expanded. */
391 w32_set_user_model_id (void)
394 HRESULT (WINAPI
* set_user_model
) (wchar_t * id
);
396 /* On Windows 7 and later, we need to set the user model ID
397 to associate emacsclient launched files with Emacs frames
399 shell
= LoadLibrary ("shell32.dll");
403 = (void *) GetProcAddress (shell
,
404 "SetCurrentProcessExplicitAppUserModelID");
405 /* If the function is defined, then we are running on Windows 7
406 or newer, and the UI uses this to group related windows
407 together. Since emacs, runemacs, emacsclient are related, we
408 want them grouped even though the executables are different,
409 so we need to set a consistent ID between them. */
411 set_user_model (L
"GNU.Emacs");
418 w32_window_app (void)
420 static int window_app
= -1;
421 char szTitle
[MAX_PATH
];
425 /* Checking for STDOUT does not work; it's a valid handle also in
426 nonconsole apps. Testing for the console title seems to work. */
427 window_app
= (GetConsoleTitleA (szTitle
, MAX_PATH
) == 0);
429 InitCommonControls ();
436 execvp wrapper for Windows. Quotes arguments with embedded spaces.
438 This is necessary due to the broken implementation of exec* routines in
439 the Microsoft libraries: they concatenate the arguments together without
440 quoting special characters, and pass the result to CreateProcess, with
441 predictably bad results. By contrast, POSIX execvp passes the arguments
442 directly into the argv array of the child process.
445 w32_execvp (const char *path
, char **argv
)
449 /* Required to allow a .BAT script as alternate editor. */
450 argv
[0] = (char *) alternate_editor
;
452 for (i
= 0; argv
[i
]; i
++)
453 if (strchr (argv
[i
], ' '))
455 char *quoted
= alloca (strlen (argv
[i
]) + 3);
456 sprintf (quoted
, "\"%s\"", argv
[i
]);
460 return execvp (path
, argv
);
464 #define execvp w32_execvp
466 /* Emulation of ttyname for Windows. */
473 #endif /* WINDOWSNT */
475 /* Display a normal or error message.
476 On Windows, use a message box if compiled as a Windows app. */
478 message (int is_error
, const char *message
, ...)
483 va_start (args
, message
);
484 vsprintf (msg
, message
, args
);
488 if (w32_window_app ())
491 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
493 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
498 FILE *f
= is_error
? stderr
: stdout
;
505 /* Decode the options from argv and argc.
506 The global variable `optind' will say how many arguments we used up. */
509 decode_options (int argc
, char **argv
)
511 alternate_editor
= egetenv ("ALTERNATE_EDITOR");
515 int opt
= getopt_long_only (argc
, argv
,
516 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
529 /* If getopt returns 0, then it has already processed a
530 long-named option. We should do nothing. */
534 alternate_editor
= optarg
;
537 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
539 socket_name
= optarg
;
544 server_file
= optarg
;
547 /* We used to disallow this argument in w32, but it seems better
548 to allow it, for the occasional case where the user is
549 connecting with a w32 client to a server compiled with X11
564 message (FALSE
, "emacsclient %s\n", VERSION
);
583 print_help_and_exit ();
587 message (TRUE
, "Try `%s --help' for more information\n", progname
);
593 /* If the -c option is used (without -t) and no --display argument
594 is provided, try $DISPLAY.
595 Without the -c option, we used to set `display' to $DISPLAY by
596 default, but this changed the default behavior and is sometimes
597 inconvenient. So we force users to use "--display $DISPLAY" if
598 they want Emacs to connect to their current display. */
599 if (!current_frame
&& !tty
&& !display
)
601 display
= egetenv ("DISPLAY");
603 /* Under Cocoa, we don't really use displays the same way as in X,
604 so provide a dummy. */
605 if (!display
|| strlen (display
) == 0)
610 /* A null-string display is invalid. */
611 if (display
&& strlen (display
) == 0)
614 /* If no display is available, new frames are tty frames. */
615 if (!current_frame
&& !display
)
618 /* --no-wait implies --current-frame on ttys when there are file
619 arguments or expressions given. */
620 if (nowait
&& tty
&& argc
- optind
> 0)
624 if (alternate_editor
&& alternate_editor
[0] == '\0')
626 message (TRUE
, "--alternate-editor argument or ALTERNATE_EDITOR variable cannot be\n\
630 #endif /* WINDOWSNT */
635 print_help_and_exit (void)
637 /* Spaces and tabs are significant in this message; they're chosen so the
638 message aligns properly both in a tty and in a Windows message box.
639 Please try to preserve them; otherwise the output is very hard to read
640 when using emacsclientw. */
642 "Usage: %s [OPTIONS] FILE...\n\
643 Tell the Emacs server to visit the specified files.\n\
644 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
646 The following OPTIONS are accepted:\n\
647 -V, --version Just print version info and return\n\
648 -H, --help Print this usage information message\n\
649 -nw, -t, --tty Open a new Emacs frame on the current terminal\n\
650 -c, --create-frame Create a new frame instead of trying to\n\
651 use the current Emacs frame\n\
652 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
653 -n, --no-wait Don't wait for the server to return\n\
654 -d DISPLAY, --display=DISPLAY\n\
655 Visit the file in the given display\n\
656 --parent-id=ID Open in parent window ID, via XEmbed\n"
657 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
658 "-s SOCKET, --socket-name=SOCKET\n\
659 Set filename of the UNIX socket for communication\n"
661 "-f SERVER, --server-file=SERVER\n\
662 Set filename of the TCP authentication file\n\
663 -a EDITOR, --alternate-editor=EDITOR\n\
664 Editor to fallback to if the server is not running\n"
666 " If EDITOR is the empty string, start Emacs in daemon\n\
667 mode and try connecting again\n"
668 #endif /* not WINDOWSNT */
670 Report bugs with M-x report-emacs-bug.\n", progname
);
675 Try to run a different command, or --if no alternate editor is
676 defined-- exit with an errorcode.
677 Uses argv, but gets it from the global variable main_argv.
682 if (alternate_editor
)
686 execvp (alternate_editor
, main_argv
+ i
);
687 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
688 progname
, alternate_editor
);
694 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
697 main (int argc
, char **argv
)
701 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
702 "on systems with Berkeley sockets.\n",
707 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
709 #define AUTH_KEY_LENGTH 64
710 #define SEND_BUFFER_SIZE 4096
712 extern char *strerror (int);
714 /* Buffer to accumulate data to send in TCP connections. */
715 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
716 int sblen
= 0; /* Fill pointer for the send buffer. */
717 /* Socket used to communicate with the Emacs server process. */
718 HSOCKET emacs_socket
= 0;
720 /* On Windows, the socket library was historically separate from the standard
721 C library, so errors are handled differently. */
723 sock_err_message (const char *function_name
)
728 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
729 | FORMAT_MESSAGE_ALLOCATE_BUFFER
730 | FORMAT_MESSAGE_ARGUMENT_ARRAY
,
731 NULL
, WSAGetLastError (), 0, (LPTSTR
)&msg
, 0, NULL
);
733 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, msg
);
737 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, strerror (errno
));
742 /* Let's send the data to Emacs when either
743 - the data ends in "\n", or
744 - the buffer is full (but this shouldn't happen)
745 Otherwise, we just accumulate it. */
747 send_to_emacs (HSOCKET s
, const char *data
)
751 size_t dlen
= strlen (data
);
752 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
754 int part
= SEND_BUFFER_SIZE
- sblen
;
755 strncpy (&send_buffer
[sblen
], data
, part
);
757 sblen
= SEND_BUFFER_SIZE
;
761 strcpy (&send_buffer
[sblen
], data
);
768 if (sblen
== SEND_BUFFER_SIZE
769 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
771 int sent
= send (s
, send_buffer
, sblen
, 0);
773 strcpy (send_buffer
, &send_buffer
[sent
]);
780 /* In STR, insert a & before each &, each space, each newline, and
781 any initial -. Change spaces to underscores, too, so that the
782 return value never contains a space.
784 Does not change the string. Outputs the result to S. */
786 quote_argument (HSOCKET s
, const char *str
)
788 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
810 if (*p
== '&' || (*p
== '-' && p
== str
))
817 send_to_emacs (s
, copy
);
823 /* The inverse of quote_argument. Removes quoting in string STR by
824 modifying the string in place. Returns STR. */
827 unquote_argument (char *str
)
858 file_name_absolute_p (const unsigned char *filename
)
860 /* Sanity check, it shouldn't happen. */
861 if (! filename
) return FALSE
;
863 /* /xxx is always an absolute path. */
864 if (filename
[0] == '/') return TRUE
;
866 /* Empty filenames (which shouldn't happen) are relative. */
867 if (filename
[0] == '\0') return FALSE
;
870 /* X:\xxx is always absolute. */
871 if (isalpha (filename
[0])
872 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
875 /* Both \xxx and \\xxx\yyy are absolute. */
876 if (filename
[0] == '\\') return TRUE
;
883 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
890 /* Initialize the WinSock2 library. */
892 initialize_sockets (void)
896 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
898 message (TRUE
, "%s: error initializing WinSock2\n", progname
);
902 atexit (close_winsock
);
904 #endif /* WINDOWSNT */
908 * Read the information needed to set up a TCP comm channel with
909 * the Emacs server: host, port, and authentication string.
912 get_server_config (struct sockaddr_in
*server
, char *authentication
)
918 if (file_name_absolute_p (server_file
))
919 config
= fopen (server_file
, "rb");
922 char *home
= egetenv ("HOME");
926 char *path
= alloca (strlen (home
) + strlen (server_file
)
928 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
929 config
= fopen (path
, "rb");
932 if (!config
&& (home
= egetenv ("APPDATA")))
934 char *path
= alloca (strlen (home
) + strlen (server_file
)
936 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
937 config
= fopen (path
, "rb");
945 if (fgets (dotted
, sizeof dotted
, config
)
946 && (port
= strchr (dotted
, ':')))
950 message (TRUE
, "%s: invalid configuration info\n", progname
);
954 server
->sin_family
= AF_INET
;
955 server
->sin_addr
.s_addr
= inet_addr (dotted
);
956 server
->sin_port
= htons (atoi (port
));
958 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
960 message (TRUE
, "%s: cannot read authentication info\n", progname
);
970 set_tcp_socket (void)
973 struct sockaddr_in server
;
974 struct linger l_arg
= {1, 1};
975 char auth_string
[AUTH_KEY_LENGTH
+ 1];
977 if (! get_server_config (&server
, auth_string
))
978 return INVALID_SOCKET
;
980 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
981 message (FALSE
, "%s: connected to remote socket at %s\n",
982 progname
, inet_ntoa (server
.sin_addr
));
985 * Open up an AF_INET socket
987 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
989 sock_err_message ("socket");
990 return INVALID_SOCKET
;
996 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
998 sock_err_message ("connect");
999 return INVALID_SOCKET
;
1002 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
1005 * Send the authentication
1007 auth_string
[AUTH_KEY_LENGTH
] = '\0';
1009 send_to_emacs (s
, "-auth ");
1010 send_to_emacs (s
, auth_string
);
1011 send_to_emacs (s
, " ");
1017 /* Returns 1 if PREFIX is a prefix of STRING. */
1019 strprefix (const char *prefix
, const char *string
)
1021 return !strncmp (prefix
, string
, strlen (prefix
));
1024 /* Get tty name and type. If successful, return the type in TTY_TYPE
1025 and the name in TTY_NAME, and return 1. Otherwise, fail if NOABORT
1026 is zero, or return 0 if NOABORT is non-zero. */
1029 find_tty (char **tty_type
, char **tty_name
, int noabort
)
1031 char *type
= egetenv ("TERM");
1032 char *name
= ttyname (fileno (stdout
));
1040 message (TRUE
, "%s: could not get terminal name\n", progname
);
1051 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1057 if (strcmp (type
, "eterm") == 0)
1063 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1064 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1065 " is not supported\n", progname
);
1076 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1078 /* Three possibilities:
1079 2 - can't be `stat'ed (sets errno)
1080 1 - isn't owned by us
1081 0 - success: none of the above */
1084 socket_status (char *socket_name
)
1086 struct stat statbfr
;
1088 if (stat (socket_name
, &statbfr
) == -1)
1091 if (statbfr
.st_uid
!= geteuid ())
1098 /* A signal handler that passes the signal to the Emacs process.
1099 Useful for SIGWINCH. */
1102 pass_signal_to_emacs (int signalnum
)
1104 int old_errno
= errno
;
1107 kill (emacs_pid
, signalnum
);
1109 signal (signalnum
, pass_signal_to_emacs
);
1113 /* Signal handler for SIGCONT; notify the Emacs process that it can
1114 now resume our tty frame. */
1117 handle_sigcont (int signalnum
)
1119 int old_errno
= errno
;
1121 if (tcgetpgrp (1) == getpgrp ())
1123 /* We are in the foreground. */
1124 send_to_emacs (emacs_socket
, "-resume \n");
1128 /* We are in the background; cancel the continue. */
1129 kill (getpid (), SIGSTOP
);
1132 signal (signalnum
, handle_sigcont
);
1136 /* Signal handler for SIGTSTP; notify the Emacs process that we are
1137 going to sleep. Normally the suspend is initiated by Emacs via
1138 server-handle-suspend-tty, but if the server gets out of sync with
1139 reality, we may get a SIGTSTP on C-z. Handling this signal and
1140 notifying Emacs about it should get things under control again. */
1143 handle_sigtstp (int signalnum
)
1145 int old_errno
= errno
;
1149 send_to_emacs (emacs_socket
, "-suspend \n");
1151 /* Unblock this signal and call the default handler by temporarily
1152 changing the handler and resignalling. */
1153 sigprocmask (SIG_BLOCK
, NULL
, &set
);
1154 sigdelset (&set
, signalnum
);
1155 signal (signalnum
, SIG_DFL
);
1156 kill (getpid (), signalnum
);
1157 sigprocmask (SIG_SETMASK
, &set
, NULL
); /* Let's the above signal through. */
1158 signal (signalnum
, handle_sigtstp
);
1164 /* Set up signal handlers before opening a frame on the current tty. */
1169 /* Set up signal handlers. */
1170 signal (SIGWINCH
, pass_signal_to_emacs
);
1172 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1173 deciding which terminal the signal came from. C-g is now a
1174 normal input event on secondary terminals. */
1176 signal (SIGINT
, pass_signal_to_emacs
);
1177 signal (SIGQUIT
, pass_signal_to_emacs
);
1180 signal (SIGCONT
, handle_sigcont
);
1181 signal (SIGTSTP
, handle_sigtstp
);
1182 signal (SIGTTOU
, handle_sigtstp
);
1187 set_local_socket (void)
1190 struct sockaddr_un server
;
1193 * Open up an AF_UNIX socket in this person's home directory
1196 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1198 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1199 return INVALID_SOCKET
;
1202 server
.sun_family
= AF_UNIX
;
1205 int sock_status
= 0;
1206 int default_sock
= !socket_name
;
1207 int saved_errno
= 0;
1208 const char *server_name
= "server";
1211 if (socket_name
&& !strchr (socket_name
, '/')
1212 && !strchr (socket_name
, '\\'))
1214 /* socket_name is a file name component. */
1215 server_name
= socket_name
;
1217 default_sock
= 1; /* Try both UIDs. */
1222 tmpdir
= egetenv ("TMPDIR");
1226 #ifndef _CS_DARWIN_USER_TEMP_DIR
1227 #define _CS_DARWIN_USER_TEMP_DIR 65537
1229 size_t n
= confstr (_CS_DARWIN_USER_TEMP_DIR
, NULL
, (size_t) 0);
1232 tmpdir
= alloca (n
);
1233 confstr (_CS_DARWIN_USER_TEMP_DIR
, tmpdir
, n
);
1239 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1241 sprintf (socket_name
, "%s/emacs%d/%s",
1242 tmpdir
, (int) geteuid (), server_name
);
1245 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1246 strcpy (server
.sun_path
, socket_name
);
1249 message (TRUE
, "%s: socket-name %s too long\n",
1250 progname
, socket_name
);
1254 /* See if the socket exists, and if it's owned by us. */
1255 sock_status
= socket_status (server
.sun_path
);
1256 saved_errno
= errno
;
1257 if (sock_status
&& default_sock
)
1259 /* Failing that, see if LOGNAME or USER exist and differ from
1260 our euid. If so, look for a socket based on the UID
1261 associated with the name. This is reminiscent of the logic
1262 that init_editfns uses to set the global Vuser_full_name. */
1264 char *user_name
= (char *) egetenv ("LOGNAME");
1267 user_name
= (char *) egetenv ("USER");
1271 struct passwd
*pw
= getpwnam (user_name
);
1273 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1275 /* We're running under su, apparently. */
1276 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1278 sprintf (socket_name
, "%s/emacs%d/%s",
1279 tmpdir
, (int) pw
->pw_uid
, server_name
);
1281 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1282 strcpy (server
.sun_path
, socket_name
);
1285 message (TRUE
, "%s: socket-name %s too long\n",
1286 progname
, socket_name
);
1287 exit (EXIT_FAILURE
);
1290 sock_status
= socket_status (server
.sun_path
);
1291 saved_errno
= errno
;
1294 errno
= saved_errno
;
1298 switch (sock_status
)
1301 /* There's a socket, but it isn't owned by us. This is OK if
1303 if (0 != geteuid ())
1305 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1306 return INVALID_SOCKET
;
1312 if (saved_errno
== ENOENT
)
1314 "%s: can't find socket; have you started the server?\n\
1315 To start the server in Emacs, type \"M-x server-start\".\n",
1318 message (TRUE
, "%s: can't stat %s: %s\n",
1319 progname
, server
.sun_path
, strerror (saved_errno
));
1320 return INVALID_SOCKET
;
1324 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1327 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1328 return INVALID_SOCKET
;
1333 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1336 set_socket (int no_exit_if_error
)
1342 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1343 /* Explicit --socket-name argument. */
1346 s
= set_local_socket ();
1347 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1349 message (TRUE
, "%s: error accessing socket \"%s\"\n",
1350 progname
, socket_name
);
1351 exit (EXIT_FAILURE
);
1355 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1357 server_file
= egetenv ("EMACS_SERVER_FILE");
1361 s
= set_tcp_socket ();
1362 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1365 message (TRUE
, "%s: error accessing server file \"%s\"\n",
1366 progname
, server_file
);
1367 exit (EXIT_FAILURE
);
1370 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1371 /* Implicit local socket. */
1372 s
= set_local_socket ();
1373 if (s
!= INVALID_SOCKET
)
1377 /* Implicit server file. */
1378 server_file
= "server";
1379 s
= set_tcp_socket ();
1380 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1383 /* No implicit or explicit socket, and no alternate editor. */
1384 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1385 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1388 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1389 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1391 exit (EXIT_FAILURE
);
1395 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1396 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1399 w32_find_emacs_process (HWND hWnd
, LPARAM lParam
)
1404 /* Reject any window not of class "Emacs". */
1405 if (! get_wc (hWnd
, class, sizeof (class))
1406 || strcmp (class, "Emacs"))
1409 /* We only need the process id, not the thread id. */
1410 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1412 /* Not the one we're looking for. */
1413 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1415 /* OK, let's raise it. */
1418 /* Stop enumeration. */
1423 * Search for a window of class "Emacs" and owned by a process with
1424 * process id = emacs_pid. If found, allow it to grab the focus.
1427 w32_give_focus (void)
1431 /* It shouldn't happen when dealing with TCP sockets. */
1432 if (!emacs_pid
) return;
1434 user32
= GetModuleHandle ("user32.dll");
1439 /* Modern Windows restrict which processes can set the foreground window.
1440 emacsclient can allow Emacs to grab the focus by calling the function
1441 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1442 NT) lack this function, so we have to check its availability. */
1443 if ((set_fg
= GetProcAddress (user32
, "AllowSetForegroundWindow"))
1444 && (get_wc
= GetProcAddress (user32
, "RealGetWindowClassA")))
1445 EnumWindows (w32_find_emacs_process
, (LPARAM
) 0);
1449 /* Start the emacs daemon and try to connect to it. */
1452 start_daemon_and_retry_set_socket (void)
1463 w
= waitpid (dpid
, &status
, WUNTRACED
| WCONTINUED
);
1465 if ((w
== -1) || !WIFEXITED (status
) || WEXITSTATUS (status
))
1467 message (TRUE
, "Error: Could not start the Emacs daemon\n");
1468 exit (EXIT_FAILURE
);
1471 /* Try connecting, the daemon should have started by now. */
1472 message (TRUE
, "Emacs daemon should have started, trying to connect again\n");
1473 if ((emacs_socket
= set_socket (1)) == INVALID_SOCKET
)
1475 message (TRUE
, "Error: Cannot connect even after starting the Emacs daemon\n");
1476 exit (EXIT_FAILURE
);
1481 fprintf (stderr
, "Error: Cannot fork!\n");
1482 exit (EXIT_FAILURE
);
1486 char emacs
[] = "emacs";
1487 char daemon
[] = "--daemon";
1488 char *d_argv
[] = {emacs
, daemon
, 0 };
1489 if (socket_name
!= NULL
)
1491 /* Pass --daemon=socket_name as argument. */
1492 const char *deq
= "--daemon=";
1493 char *daemon_arg
= alloca (strlen (deq
)
1494 + strlen (socket_name
) + 1);
1495 strcpy (daemon_arg
, deq
);
1496 strcat (daemon_arg
, socket_name
);
1497 d_argv
[1] = daemon_arg
;
1499 execvp ("emacs", d_argv
);
1500 message (TRUE
, "%s: error starting emacs daemon\n", progname
);
1502 #endif /* WINDOWSNT */
1506 main (int argc
, char **argv
)
1508 int i
, rl
, needlf
= 0;
1510 char string
[BUFSIZ
+1];
1511 int null_socket_name
, null_server_file
, start_daemon_if_needed
;
1512 int exit_status
= EXIT_SUCCESS
;
1518 /* On Windows 7 and later, we need to explicitly associate emacsclient
1519 with emacs so the UI behaves sensibly. */
1520 w32_set_user_model_id ();
1523 /* Process options. */
1524 decode_options (argc
, argv
);
1526 if ((argc
- optind
< 1) && !eval
&& current_frame
)
1528 message (TRUE
, "%s: file name or argument required\n"
1529 "Try `%s --help' for more information\n",
1530 progname
, progname
);
1531 exit (EXIT_FAILURE
);
1534 /* If alternate_editor is the empty string, start the emacs daemon
1535 in case of failure to connect. */
1536 start_daemon_if_needed
= (alternate_editor
1537 && (alternate_editor
[0] == '\0'));
1538 if (start_daemon_if_needed
)
1540 /* set_socket changes the values for socket_name and
1541 server_file, we need to reset them, if they were NULL before
1542 for the second call to set_socket. */
1543 null_socket_name
= (socket_name
== NULL
);
1544 null_server_file
= (server_file
== NULL
);
1547 if ((emacs_socket
= set_socket (alternate_editor
1548 || start_daemon_if_needed
)) == INVALID_SOCKET
)
1549 if (start_daemon_if_needed
)
1551 /* Reset socket_name and server_file if they were NULL
1552 before the set_socket call. */
1553 if (null_socket_name
)
1555 if (null_server_file
)
1558 start_daemon_and_retry_set_socket ();
1563 cwd
= get_current_dir_name ();
1566 /* getwd puts message in STRING if it fails. */
1567 message (TRUE
, "%s: %s\n", progname
,
1568 "Cannot get current working directory");
1576 /* Send over our environment and current directory. */
1579 extern char **environ
;
1581 for (i
= 0; environ
[i
]; i
++)
1583 send_to_emacs (emacs_socket
, "-env ");
1584 quote_argument (emacs_socket
, environ
[i
]);
1585 send_to_emacs (emacs_socket
, " ");
1588 send_to_emacs (emacs_socket
, "-dir ");
1589 quote_argument (emacs_socket
, cwd
);
1590 send_to_emacs (emacs_socket
, "/");
1591 send_to_emacs (emacs_socket
, " ");
1595 send_to_emacs (emacs_socket
, "-nowait ");
1598 send_to_emacs (emacs_socket
, "-current-frame ");
1602 send_to_emacs (emacs_socket
, "-display ");
1603 quote_argument (emacs_socket
, display
);
1604 send_to_emacs (emacs_socket
, " ");
1609 send_to_emacs (emacs_socket
, "-parent-id ");
1610 quote_argument (emacs_socket
, parent_id
);
1611 send_to_emacs (emacs_socket
, " ");
1614 /* If using the current frame, send tty information to Emacs anyway.
1615 In daemon mode, Emacs may need to occupy this tty if no other
1616 frame is available. */
1617 if (tty
|| (current_frame
&& !eval
))
1619 char *tty_type
, *tty_name
;
1621 if (find_tty (&tty_type
, &tty_name
, !tty
))
1623 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1626 send_to_emacs (emacs_socket
, "-tty ");
1627 quote_argument (emacs_socket
, tty_name
);
1628 send_to_emacs (emacs_socket
, " ");
1629 quote_argument (emacs_socket
, tty_type
);
1630 send_to_emacs (emacs_socket
, " ");
1634 if (!current_frame
&& !tty
)
1635 send_to_emacs (emacs_socket
, "-window-system ");
1637 if ((argc
- optind
> 0))
1639 for (i
= optind
; i
< argc
; i
++)
1644 /* Don't prepend cwd or anything like that. */
1645 send_to_emacs (emacs_socket
, "-eval ");
1646 quote_argument (emacs_socket
, argv
[i
]);
1647 send_to_emacs (emacs_socket
, " ");
1651 if (*argv
[i
] == '+')
1653 char *p
= argv
[i
] + 1;
1654 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1657 send_to_emacs (emacs_socket
, "-position ");
1658 quote_argument (emacs_socket
, argv
[i
]);
1659 send_to_emacs (emacs_socket
, " ");
1664 else if (! file_name_absolute_p (argv
[i
])
1665 && (isalpha (argv
[i
][0]) && argv
[i
][1] == ':'))
1666 /* Windows can have a different default directory for each
1667 drive, so the cwd passed via "-dir" is not sufficient
1668 to account for that.
1669 If the user uses <drive>:<relpath>, we hence need to be
1670 careful to expand <relpath> with the default directory
1671 corresponding to <drive>. */
1673 char *filename
= (char *) xmalloc (MAX_PATH
);
1676 size
= GetFullPathName (argv
[i
], MAX_PATH
, filename
, NULL
);
1677 if (size
> 0 && size
< MAX_PATH
)
1684 send_to_emacs (emacs_socket
, "-file ");
1685 quote_argument (emacs_socket
, argv
[i
]);
1686 send_to_emacs (emacs_socket
, " ");
1691 /* Read expressions interactively. */
1692 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1694 send_to_emacs (emacs_socket
, "-eval ");
1695 quote_argument (emacs_socket
, str
);
1697 send_to_emacs (emacs_socket
, " ");
1700 send_to_emacs (emacs_socket
, "\n");
1702 /* Wait for an answer. */
1703 if (!eval
&& !tty
&& !nowait
)
1705 printf ("Waiting for Emacs...");
1711 /* Now, wait for an answer and print any messages. */
1712 while (exit_status
== EXIT_SUCCESS
1713 && (rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1718 p
= string
+ strlen (string
) - 1;
1719 while (p
> string
&& *p
== '\n')
1722 if (strprefix ("-emacs-pid ", string
))
1724 /* -emacs-pid PID: The process id of the Emacs process. */
1725 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1727 else if (strprefix ("-window-system-unsupported ", string
))
1729 /* -window-system-unsupported: Emacs was compiled without X
1730 support. Try again on the terminal. */
1735 else if (strprefix ("-print ", string
))
1737 /* -print STRING: Print STRING on the terminal. */
1738 str
= unquote_argument (string
+ strlen ("-print "));
1742 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1744 else if (strprefix ("-error ", string
))
1746 /* -error DESCRIPTION: Signal an error on the terminal. */
1747 str
= unquote_argument (string
+ strlen ("-error "));
1750 fprintf (stderr
, "*ERROR*: %s", str
);
1751 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1752 exit_status
= EXIT_FAILURE
;
1755 else if (strprefix ("-suspend ", string
))
1757 /* -suspend: Suspend this terminal, i.e., stop the process. */
1766 /* Unknown command. */
1769 printf ("*ERROR*: Unknown message: %s", string
);
1771 == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1781 exit_status
= EXIT_FAILURE
;
1783 CLOSE_SOCKET (emacs_socket
);
1787 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1790 #ifndef HAVE_STRERROR
1795 extern char *sys_errlist
[];
1796 extern int sys_nerr
;
1798 if (errnum
>= 0 && errnum
< sys_nerr
)
1799 return sys_errlist
[errnum
];
1800 return (char *) "Unknown error";
1803 #endif /* ! HAVE_STRERROR */
1806 /* emacsclient.c ends here */