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 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 */
44 # include <sys/types.h>
46 # ifdef HAVE_INET_SOCKETS
47 # include <netinet/in.h>
50 # define INVALID_SOCKET -1
52 # define CLOSE_SOCKET close
55 #endif /* !WINDOWSNT */
69 #else /* not WINDOWSNT */
71 #endif /* not WINDOWSNT */
78 char *getenv (), *getwd ();
83 #define egetenv(VAR) w32_getenv(VAR)
85 #define egetenv(VAR) getenv(VAR)
89 #define VERSION "unspecified"
94 #define EXIT_SUCCESS 0
98 #define EXIT_FAILURE 1
113 /* Name used to invoke this program. */
116 /* The second argument to main. */
119 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
122 /* Nonzero means args are expressions to be evaluated. --eval. */
125 /* Nonzero means don't open a new frame. Inverse of --create-frame. */
126 int current_frame
= 1;
128 /* Nonzero means open a new graphical frame. */
129 int window_system
= 0;
131 /* The display on which Emacs should work. --display. */
132 char *display
= NULL
;
134 /* Nonzero means open a new Emacs frame on the current terminal. */
137 /* If non-NULL, the name of an editor to fallback to if the server
138 is not running. --alternate-editor. */
139 const char *alternate_editor
= NULL
;
141 /* If non-NULL, the filename of the UNIX socket. */
142 char *socket_name
= NULL
;
144 /* If non-NULL, the filename of the authentication file. */
145 char *server_file
= NULL
;
147 /* PID of the Emacs server process. */
150 void print_help_and_exit () NO_RETURN
;
152 struct option longopts
[] =
154 { "no-wait", no_argument
, NULL
, 'n' },
155 { "eval", no_argument
, NULL
, 'e' },
156 { "help", no_argument
, NULL
, 'H' },
157 { "version", no_argument
, NULL
, 'V' },
158 { "tty", no_argument
, NULL
, 't' },
159 { "create-frame", no_argument
, NULL
, 'c' },
160 { "alternate-editor", required_argument
, NULL
, 'a' },
161 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
162 { "socket-name", required_argument
, NULL
, 's' },
164 { "server-file", required_argument
, NULL
, 'f' },
166 { "display", required_argument
, NULL
, 'd' },
172 /* Like malloc but get fatal error if memory is exhausted. */
178 long *result
= (long *) malloc (size
);
187 /* Like strdup but get a fatal error if memory is exhausted. */
190 xstrdup (const char *s
)
192 char *result
= strdup (s
);
202 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
205 #ifndef DIRECTORY_SEP
206 #define DIRECTORY_SEP '/'
208 #ifndef IS_DIRECTORY_SEP
209 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
211 #ifndef IS_DEVICE_SEP
213 #define IS_DEVICE_SEP(_c_) 0
215 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
219 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
223 /* Return the current working directory. Returns NULL on errors.
224 Any other returned value must be freed with free. This is used
225 only when get_current_dir_name is not defined on the system. */
227 get_current_dir_name ()
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. */
235 if ((pwd
= egetenv ("PWD")) != 0
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
242 && strlen (pwd
) < MAXPATHLEN
246 buf
= (char *) xmalloc (strlen (pwd
) + 1);
254 size_t buf_size
= 1024;
255 buf
= (char *) xmalloc (buf_size
);
260 if (getcwd (buf
, buf_size
) == buf
)
264 int tmp_errno
= errno
;
270 buf
= (char *) realloc (buf
, buf_size
);
278 /* We need MAXPATHLEN here. */
279 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
282 if (getwd (buf
) == NULL
)
284 int tmp_errno
= errno
;
297 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
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). */
303 w32_get_resource (predefined
, key
, type
)
308 HKEY hrootkey
= NULL
;
312 if (RegOpenKeyEx (predefined
, REG_ROOT
, 0, KEY_READ
, &hrootkey
) == ERROR_SUCCESS
)
314 if (RegQueryValueEx (hrootkey
, key
, NULL
, NULL
, NULL
, &cbData
) == ERROR_SUCCESS
)
316 result
= (char *) xmalloc (cbData
);
318 if ((RegQueryValueEx (hrootkey
, key
, NULL
, type
, result
, &cbData
) != ERROR_SUCCESS
) ||
326 RegCloseKey (hrootkey
);
333 getenv wrapper for Windows
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.
345 if (value
= getenv (envvar
))
346 /* Found in the environment. */
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. */
354 if (dwType
== REG_SZ
)
355 /* Registry; no need to expand. */
358 if (dwType
== REG_EXPAND_SZ
)
362 if (size
= ExpandEnvironmentStrings (value
, NULL
, 0))
364 char *buffer
= (char *) xmalloc (size
);
365 if (ExpandEnvironmentStrings (value
, buffer
, size
))
367 /* Found and expanded. */
372 /* Error expanding. */
377 /* Not the right type, or not correctly expanded. */
385 static int window_app
= -1;
386 char szTitle
[MAX_PATH
];
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);
394 InitCommonControls();
401 execvp wrapper for Windows. Quotes arguments with embedded spaces.
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.
410 w32_execvp (path
, argv
)
416 /* Required to allow a .BAT script as alternate editor. */
417 argv
[0] = (char *) alternate_editor
;
419 for (i
= 0; argv
[i
]; i
++)
420 if (strchr (argv
[i
], ' '))
422 char *quoted
= alloca (strlen (argv
[i
]) + 3);
423 sprintf (quoted
, "\"%s\"", argv
[i
]);
427 return execvp (path
, argv
);
431 #define execvp w32_execvp
433 #endif /* WINDOWSNT */
435 /* Display a normal or error message.
436 On Windows, use a message box if compiled as a Windows app. */
438 message (int is_error
, char *message
, ...)
443 va_start (args
, message
);
444 vsprintf (msg
, message
, args
);
448 if (w32_window_app ())
451 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
453 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
458 FILE *f
= is_error
? stderr
: stdout
;
465 /* Decode the options from argv and argc.
466 The global variable `optind' will say how many arguments we used up. */
469 decode_options (argc
, argv
)
473 alternate_editor
= egetenv ("ALTERNATE_EDITOR");
477 int opt
= getopt_long (argc
, argv
,
478 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
491 /* If getopt returns 0, then it has already processed a
492 long-named option. We should do nothing. */
496 alternate_editor
= optarg
;
499 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
501 socket_name
= optarg
;
506 server_file
= optarg
;
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
513 #if 1 /* !defined WINDOWS */
528 message (FALSE
, "emacsclient %s\n", VERSION
);
542 print_help_and_exit ();
546 message (TRUE
, "Try `%s --help' for more information\n", progname
);
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. */
560 if (!current_frame
&& !tty
&& !display
)
561 display
= egetenv ("DISPLAY");
563 if (display
&& strlen (display
) == 0)
568 #if !defined (WINDOWSNT)
569 else if (!current_frame
)
573 /* --no-wait implies --current-frame on ttys when there are file
574 arguments or expressions given. */
575 if (nowait
&& tty
&& argc
- optind
> 0)
590 print_help_and_exit ()
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. */
597 "Usage: %s [OPTIONS] FILE...\n\
598 Tell the Emacs server to visit the specified files.\n\
599 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
601 The following OPTIONS are accepted:\n\
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\
605 -c, --create-frame Create a new frame instead of trying to\n\
606 use the current Emacs frame\n\
607 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
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"
610 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
611 "-s, --socket-name=FILENAME\n\
612 Set filename of the UNIX socket for communication\n"
614 "-f, --server-file=FILENAME\n\
615 Set filename of the TCP authentication file\n\
616 -a, --alternate-editor=EDITOR\n\
617 Editor to fallback to if the server is not running\n\
619 Report bugs to bug-gnu-emacs@gnu.org.\n", progname
);
624 Try to run a different command, or --if no alternate editor is
625 defined-- exit with an errorcode.
626 Uses argv, but gets it from the global variable main_argv.
631 if (alternate_editor
)
635 execvp (alternate_editor
, main_argv
+ i
);
636 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
637 progname
, alternate_editor
);
643 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
652 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
653 "on systems with Berkeley sockets.\n",
658 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
661 # include <winsock2.h>
663 # include <sys/types.h>
664 # include <sys/socket.h>
668 #define AUTH_KEY_LENGTH 64
669 #define SEND_BUFFER_SIZE 4096
671 extern char *strerror ();
674 /* Buffer to accumulate data to send in TCP connections. */
675 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
676 int sblen
= 0; /* Fill pointer for the send buffer. */
677 /* Socket used to communicate with the Emacs server process. */
678 HSOCKET emacs_socket
= 0;
680 /* On Windows, the socket library was historically separate from the standard
681 C library, so errors are handled differently. */
683 sock_err_message (function_name
)
689 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
690 | FORMAT_MESSAGE_ALLOCATE_BUFFER
691 | FORMAT_MESSAGE_ARGUMENT_ARRAY
,
692 NULL
, WSAGetLastError (), 0, (LPTSTR
)&msg
, 0, NULL
);
694 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, msg
);
698 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, strerror (errno
));
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. */
708 send_to_emacs (s
, data
)
714 int dlen
= strlen (data
);
715 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
717 int part
= SEND_BUFFER_SIZE
- sblen
;
718 strncpy (&send_buffer
[sblen
], data
, part
);
720 sblen
= SEND_BUFFER_SIZE
;
724 strcpy (&send_buffer
[sblen
], data
);
731 if (sblen
== SEND_BUFFER_SIZE
732 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
734 int sent
= send (s
, send_buffer
, sblen
, 0);
736 strcpy (send_buffer
, &send_buffer
[sent
]);
743 /* In STR, insert a & before each &, each space, each newline, and
744 any initial -. Change spaces to underscores, too, so that the
745 return value never contains a space.
747 Does not change the string. Outputs the result to STREAM. */
749 quote_argument (s
, str
)
753 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
774 if (*p
== '&' || (*p
== '-' && p
== str
))
781 send_to_emacs (s
, copy
);
787 /* The inverse of quote_argument. Removes quoting in string STR by
788 modifying the string in place. Returns STR. */
791 unquote_argument (str
)
823 file_name_absolute_p (filename
)
824 const unsigned char *filename
;
826 /* Sanity check, it shouldn't happen. */
827 if (! filename
) return FALSE
;
829 /* /xxx is always an absolute path. */
830 if (filename
[0] == '/') return TRUE
;
832 /* Empty filenames (which shouldn't happen) are relative. */
833 if (filename
[0] == '\0') return FALSE
;
836 /* X:\xxx is always absolute. */
837 if (isalpha (filename
[0])
838 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
841 /* Both \xxx and \\xxx\yyy are absolute. */
842 if (filename
[0] == '\\') return TRUE
;
849 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
851 __cdecl
close_winsock ()
856 /* Initialize the WinSock2 library. */
858 initialize_sockets ()
862 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
864 message (TRUE
, "%s: error initializing WinSock2\n", progname
);
868 atexit (close_winsock
);
870 #endif /* WINDOWSNT */
874 * Read the information needed to set up a TCP comm channel with
875 * the Emacs server: host, port, pid and authentication string.
878 get_server_config (server
, authentication
)
879 struct sockaddr_in
*server
;
880 char *authentication
;
887 if (file_name_absolute_p (server_file
))
888 config
= fopen (server_file
, "rb");
891 char *home
= egetenv ("HOME");
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");
900 if (!config
&& (home
= egetenv ("APPDATA")))
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");
912 if (fgets (dotted
, sizeof dotted
, config
)
913 && (port
= strchr (dotted
, ':'))
914 && (pid
= strchr (port
, ' ')))
921 message (TRUE
, "%s: invalid configuration info\n", progname
);
925 server
->sin_family
= AF_INET
;
926 server
->sin_addr
.s_addr
= inet_addr (dotted
);
927 server
->sin_port
= htons (atoi (port
));
929 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
931 message (TRUE
, "%s: cannot read authentication info\n", progname
);
937 emacs_pid
= atoi (pid
);
946 struct sockaddr_in server
;
947 struct linger l_arg
= {1, 1};
948 char auth_string
[AUTH_KEY_LENGTH
+ 1];
950 if (! get_server_config (&server
, auth_string
))
951 return INVALID_SOCKET
;
953 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
954 message (FALSE
, "%s: connected to remote socket at %s\n",
955 progname
, inet_ntoa (server
.sin_addr
));
958 * Open up an AF_INET socket
960 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
962 sock_err_message ("socket");
963 return INVALID_SOCKET
;
969 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
971 sock_err_message ("connect");
972 return INVALID_SOCKET
;
975 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
978 * Send the authentication
980 auth_string
[AUTH_KEY_LENGTH
] = '\0';
982 send_to_emacs (s
, "-auth ");
983 send_to_emacs (s
, auth_string
);
984 send_to_emacs (s
, " ");
990 /* Returns 1 if PREFIX is a prefix of STRING. */
992 strprefix (char *prefix
, char *string
)
994 return !strncmp (prefix
, string
, strlen (prefix
));
998 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
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 */
1006 socket_status (socket_name
)
1009 struct stat statbfr
;
1011 if (stat (socket_name
, &statbfr
) == -1)
1014 if (statbfr
.st_uid
!= geteuid ())
1021 /* A signal handler that passes the signal to the Emacs process.
1022 Useful for SIGWINCH. */
1025 pass_signal_to_emacs (int signalnum
)
1027 int old_errno
= errno
;
1030 kill (emacs_pid
, signalnum
);
1032 signal (signalnum
, pass_signal_to_emacs
);
1036 /* Signal handler for SIGCONT; notify the Emacs process that it can
1037 now resume our tty frame. */
1040 handle_sigcont (int signalnum
)
1042 int old_errno
= errno
;
1044 if (tcgetpgrp (1) == getpgrp ())
1046 /* We are in the foreground. */
1047 send_to_emacs (emacs_socket
, "-resume \n");
1051 /* We are in the background; cancel the continue. */
1052 kill (getpid (), SIGSTOP
);
1055 signal (signalnum
, handle_sigcont
);
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. */
1066 handle_sigtstp (int signalnum
)
1068 int old_errno
= errno
;
1072 send_to_emacs (emacs_socket
, "-suspend \n");
1074 /* Unblock this signal and call the default handler by temporarily
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
);
1085 /* Set up signal handlers before opening a frame on the current tty. */
1090 /* Set up signal handlers. */
1091 signal (SIGWINCH
, pass_signal_to_emacs
);
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. */
1097 signal (SIGINT
, pass_signal_to_emacs
);
1098 signal (SIGQUIT
, pass_signal_to_emacs
);
1101 signal (SIGCONT
, handle_sigcont
);
1102 signal (SIGTSTP
, handle_sigtstp
);
1103 signal (SIGTTOU
, handle_sigtstp
);
1111 struct sockaddr_un server
;
1114 * Open up an AF_UNIX socket in this person's home directory
1117 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1119 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1120 return INVALID_SOCKET
;
1123 server
.sun_family
= AF_UNIX
;
1126 int sock_status
= 0;
1127 int default_sock
= !socket_name
;
1128 int saved_errno
= 0;
1129 char *server_name
= "server";
1131 if (socket_name
&& !index (socket_name
, '/') && !index (socket_name
, '\\'))
1132 { /* socket_name is a file name component. */
1133 server_name
= socket_name
;
1135 default_sock
= 1; /* Try both UIDs. */
1140 socket_name
= alloca (100 + strlen (server_name
));
1141 sprintf (socket_name
, "/tmp/emacs%d/%s",
1142 (int) geteuid (), server_name
);
1145 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1146 strcpy (server
.sun_path
, socket_name
);
1149 message (TRUE
, "%s: socket-name %s too long\n",
1150 progname
, socket_name
);
1154 /* See if the socket exists, and if it's owned by us. */
1155 sock_status
= socket_status (server
.sun_path
);
1156 saved_errno
= errno
;
1157 if (sock_status
&& default_sock
)
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. */
1164 char *user_name
= (char *) egetenv ("LOGNAME");
1167 user_name
= (char *) egetenv ("USER");
1171 struct passwd
*pw
= getpwnam (user_name
);
1173 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1175 /* We're running under su, apparently. */
1176 socket_name
= alloca (100 + strlen (server_name
));
1177 sprintf (socket_name
, "/tmp/emacs%d/%s",
1178 (int) pw
->pw_uid
, server_name
);
1180 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1181 strcpy (server
.sun_path
, socket_name
);
1184 message (TRUE
, "%s: socket-name %s too long\n",
1185 progname
, socket_name
);
1186 exit (EXIT_FAILURE
);
1189 sock_status
= socket_status (server
.sun_path
);
1190 saved_errno
= errno
;
1193 errno
= saved_errno
;
1197 switch (sock_status
)
1200 /* There's a socket, but it isn't owned by us. This is OK if
1202 if (0 != geteuid ())
1204 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1205 return INVALID_SOCKET
;
1211 if (saved_errno
== ENOENT
)
1213 "%s: can't find socket; have you started the server?\n\
1214 To start the server in Emacs, type \"M-x server-start\".\n",
1217 message (TRUE
, "%s: can't stat %s: %s\n",
1218 progname
, server
.sun_path
, strerror (saved_errno
));
1219 return INVALID_SOCKET
;
1223 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1226 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1227 return INVALID_SOCKET
;
1232 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1241 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1242 /* Explicit --socket-name argument. */
1245 s
= set_local_socket ();
1246 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1248 message (TRUE
, "%s: error accessing socket \"%s\"\n",
1249 progname
, socket_name
);
1250 exit (EXIT_FAILURE
);
1254 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1256 server_file
= egetenv ("EMACS_SERVER_FILE");
1260 s
= set_tcp_socket ();
1261 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1264 message (TRUE
, "%s: error accessing server file \"%s\"\n",
1265 progname
, server_file
);
1266 exit (EXIT_FAILURE
);
1269 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1270 /* Implicit local socket. */
1271 s
= set_local_socket ();
1272 if (s
!= INVALID_SOCKET
)
1276 /* Implicit server file. */
1277 server_file
= "server";
1278 s
= set_tcp_socket ();
1279 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1282 /* No implicit or explicit socket, and no alternate editor. */
1283 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1284 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1287 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1288 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1290 exit (EXIT_FAILURE
);
1294 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1295 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1298 w32_find_emacs_process (hWnd
, lParam
)
1305 /* Reject any window not of class "Emacs". */
1306 if (! get_wc (hWnd
, class, sizeof (class))
1307 || strcmp (class, "Emacs"))
1310 /* We only need the process id, not the thread id. */
1311 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1313 /* Not the one we're looking for. */
1314 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1316 /* OK, let's raise it. */
1319 /* Stop enumeration. */
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.
1332 /* It shouldn't happen when dealing with TCP sockets. */
1333 if (!emacs_pid
) return;
1335 if (!(hUser32
= LoadLibrary ("user32.dll"))) return;
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);
1345 FreeLibrary (hUser32
);
1354 int i
, rl
, needlf
= 0;
1356 char string
[BUFSIZ
+1];
1361 /* Process options. */
1362 decode_options (argc
, argv
);
1364 if ((argc
- optind
< 1) && !eval
&& !tty
&& !window_system
)
1366 message (TRUE
, "%s: file name or argument required\n"
1367 "Try `%s --help' for more information\n",
1368 progname
, progname
);
1369 exit (EXIT_FAILURE
);
1372 if ((emacs_socket
= set_socket ()) == INVALID_SOCKET
)
1376 cwd
= get_current_dir_name ();
1379 /* getwd puts message in STRING if it fails. */
1380 message (TRUE
, "%s: %s\n", progname
,
1381 "Cannot get current working directory");
1389 /* Send over our environment. */
1392 extern char **environ
;
1394 for (i
= 0; environ
[i
]; i
++)
1396 char *name
= xstrdup (environ
[i
]);
1397 char *value
= strchr (name
, '=');
1398 send_to_emacs (emacs_socket
, "-env ");
1399 quote_argument (emacs_socket
, environ
[i
]);
1400 send_to_emacs (emacs_socket
, " ");
1404 /* Send over our current directory. */
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
, " ");
1415 send_to_emacs (emacs_socket
, "-nowait ");
1418 send_to_emacs (emacs_socket
, "-current-frame ");
1422 send_to_emacs (emacs_socket
, "-display ");
1423 quote_argument (emacs_socket
, display
);
1424 send_to_emacs (emacs_socket
, " ");
1429 char *type
= egetenv ("TERM");
1430 char *tty_name
= NULL
;
1432 tty_name
= ttyname (fileno (stdin
));
1437 message (TRUE
, "%s: could not get terminal name\n", progname
);
1443 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1448 if (! strcmp (type
, "eterm"))
1450 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1451 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1452 " is not supported\n", progname
);
1455 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
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
, " ");
1467 send_to_emacs (emacs_socket
, "-window-system ");
1469 if ((argc
- optind
> 0))
1471 for (i
= optind
; i
< argc
; i
++)
1477 /* Don't prepend cwd or anything like that. */
1478 send_to_emacs (emacs_socket
, "-eval ");
1479 quote_argument (emacs_socket
, argv
[i
]);
1480 send_to_emacs (emacs_socket
, " ");
1484 if (*argv
[i
] == '+')
1486 char *p
= argv
[i
] + 1;
1487 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1490 send_to_emacs (emacs_socket
, "-position ");
1491 quote_argument (emacs_socket
, argv
[i
]);
1492 send_to_emacs (emacs_socket
, " ");
1498 else if (! file_name_absolute_p (argv
[i
]))
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,
1506 .\X:Y), but it is not very useful, as Emacs currently does a
1507 very bad job of dealing wih NTFS streams. */
1509 char *filename
= (char *) xmalloc (MAX_PATH
);
1512 size
= GetFullPathName (argv
[i
], MAX_PATH
, filename
, NULL
);
1513 if (size
> 0 && size
< MAX_PATH
)
1523 send_to_emacs (emacs_socket
, "-file ");
1526 quote_argument (emacs_socket
, cwd
);
1527 send_to_emacs (emacs_socket
, "/");
1529 quote_argument (emacs_socket
, argv
[i
]);
1530 send_to_emacs (emacs_socket
, " ");
1535 if (!tty
&& !window_system
)
1537 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1540 send_to_emacs (emacs_socket
, "-eval ");
1542 send_to_emacs (emacs_socket
, "-file ");
1543 quote_argument (emacs_socket
, str
);
1545 send_to_emacs (emacs_socket
, " ");
1549 send_to_emacs (emacs_socket
, "\n");
1551 /* Wait for an answer. */
1552 if (!eval
&& !tty
&& !nowait
)
1554 printf ("Waiting for Emacs...");
1560 /* Now, wait for an answer and print any messages. */
1561 while ((rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1566 p
= string
+ strlen (string
) - 1;
1567 while (p
> string
&& *p
== '\n')
1570 if (strprefix ("-emacs-pid ", string
))
1572 /* -emacs-pid PID: The process id of the Emacs process. */
1573 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1575 else if (strprefix ("-window-system-unsupported ", string
))
1577 /* -window-system-unsupported: Emacs was compiled without X
1578 support. Try again on the terminal. */
1584 else if (strprefix ("-print ", string
))
1586 /* -print STRING: Print STRING on the terminal. */
1587 str
= unquote_argument (string
+ strlen ("-print "));
1591 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1593 else if (strprefix ("-error ", string
))
1595 /* -error DESCRIPTION: Signal an error on the terminal. */
1596 str
= unquote_argument (string
+ strlen ("-error "));
1599 fprintf (stderr
, "*ERROR*: %s", str
);
1600 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1603 else if (strprefix ("-suspend ", string
))
1605 /* -suspend: Suspend this terminal, i.e., stop the process. */
1614 /* Unknown command. */
1617 printf ("*ERROR*: Unknown message: %s", string
);
1618 needlf
= string
[0] == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1627 CLOSE_SOCKET (emacs_socket
);
1628 return EXIT_SUCCESS
;
1631 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1634 #ifndef HAVE_STRERROR
1639 extern char *sys_errlist
[];
1640 extern int sys_nerr
;
1642 if (errnum
>= 0 && errnum
< sys_nerr
)
1643 return sys_errlist
[errnum
];
1644 return (char *) "Unknown error";
1647 #endif /* ! HAVE_STRERROR */
1649 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1650 (do not change this comment) */
1652 /* emacsclient.c ends here */