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, or (at your option)
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; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
29 /* config.h defines these, which disables sockets altogether! */
36 # include <commctrl.h>
38 # define NO_SOCKETS_IN_FILE_SYSTEM
40 # define HSOCKET SOCKET
41 # define CLOSE_SOCKET closesocket
42 # define INITIALIZE() (initialize_sockets ())
44 #else /* !WINDOWSNT */
46 # include <sys/types.h>
48 # ifdef HAVE_INET_SOCKETS
49 # include <netinet/in.h>
52 # define INVALID_SOCKET -1
54 # define CLOSE_SOCKET close
57 #endif /* !WINDOWSNT */
74 #else /* not WINDOWSNT */
76 #endif /* not WINDOWSNT */
84 char *getenv (), *getwd ();
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 /* Name used to invoke this program. */
122 /* The second argument to main. */
125 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
128 /* Nonzero means args are expressions to be evaluated. --eval. */
131 /* Nonzero means don't open a new frame. Inverse of --create-frame. */
132 int current_frame
= 1;
134 /* Nonzero means open a new graphical frame. */
135 int window_system
= 0;
137 /* The display on which Emacs should work. --display. */
138 char *display
= NULL
;
140 /* Nonzero means open a new Emacs frame on the current terminal. */
143 /* If non-NULL, the name of an editor to fallback to if the server
144 is not running. --alternate-editor. */
145 const char *alternate_editor
= NULL
;
147 /* If non-NULL, the filename of the UNIX socket. */
148 char *socket_name
= NULL
;
150 /* If non-NULL, the filename of the authentication file. */
151 char *server_file
= NULL
;
153 /* PID of the Emacs server process. */
156 void print_help_and_exit () 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 { "create-frame", no_argument
, NULL
, 'c' },
166 { "alternate-editor", required_argument
, NULL
, 'a' },
167 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
168 { "socket-name", required_argument
, NULL
, 's' },
170 { "server-file", required_argument
, NULL
, 'f' },
172 { "display", required_argument
, NULL
, 'd' },
178 /* Like malloc but get fatal error if memory is exhausted. */
184 long *result
= (long *) malloc (size
);
193 /* Like strdup but get a fatal error if memory is exhausted. */
196 xstrdup (const char *s
)
198 char *result
= strdup (s
);
208 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
211 #ifndef DIRECTORY_SEP
212 #define DIRECTORY_SEP '/'
214 #ifndef IS_DIRECTORY_SEP
215 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
217 #ifndef IS_DEVICE_SEP
219 #define IS_DEVICE_SEP(_c_) 0
221 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
225 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
229 /* Return the current working directory. Returns NULL on errors.
230 Any other returned value must be freed with free. This is used
231 only when get_current_dir_name is not defined on the system. */
233 get_current_dir_name ()
237 struct stat dotstat
, pwdstat
;
238 /* If PWD is accurate, use it instead of calling getwd. PWD is
239 sometimes a nicer name, and using it may avoid a fatal error if a
240 parent directory is searchable but not readable. */
241 if ((pwd
= egetenv ("PWD")) != 0
242 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
243 && stat (pwd
, &pwdstat
) == 0
244 && stat (".", &dotstat
) == 0
245 && dotstat
.st_ino
== pwdstat
.st_ino
246 && dotstat
.st_dev
== pwdstat
.st_dev
248 && strlen (pwd
) < MAXPATHLEN
252 buf
= (char *) xmalloc (strlen (pwd
) + 1);
260 size_t buf_size
= 1024;
261 buf
= (char *) xmalloc (buf_size
);
266 if (getcwd (buf
, buf_size
) == buf
)
270 int tmp_errno
= errno
;
276 buf
= (char *) realloc (buf
, buf_size
);
284 /* We need MAXPATHLEN here. */
285 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
288 if (getwd (buf
) == NULL
)
290 int tmp_errno
= errno
;
303 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
305 /* Retrieve an environment variable from the Emacs subkeys of the registry.
306 Return NULL if the variable was not found, or it was empty.
307 This code is based on w32_get_resource (w32.c). */
309 w32_get_resource (predefined
, key
, type
)
314 HKEY hrootkey
= NULL
;
318 if (RegOpenKeyEx (predefined
, REG_ROOT
, 0, KEY_READ
, &hrootkey
) == ERROR_SUCCESS
)
320 if (RegQueryValueEx (hrootkey
, key
, NULL
, NULL
, NULL
, &cbData
) == ERROR_SUCCESS
)
322 result
= (char *) xmalloc (cbData
);
324 if ((RegQueryValueEx (hrootkey
, key
, NULL
, type
, result
, &cbData
) != ERROR_SUCCESS
) ||
332 RegCloseKey (hrootkey
);
339 getenv wrapper for Windows
341 This is needed to duplicate Emacs's behavior, which is to look for enviroment
342 variables in the registry if they don't appear in the environment.
351 if (value
= getenv (envvar
))
352 /* Found in the environment. */
355 if (! (value
= w32_get_resource (HKEY_CURRENT_USER
, envvar
, &dwType
)) &&
356 ! (value
= w32_get_resource (HKEY_LOCAL_MACHINE
, envvar
, &dwType
)))
357 /* Not found in the registry. */
360 if (dwType
== REG_SZ
)
361 /* Registry; no need to expand. */
364 if (dwType
== REG_EXPAND_SZ
)
368 if (size
= ExpandEnvironmentStrings (value
, NULL
, 0))
370 char *buffer
= (char *) xmalloc (size
);
371 if (ExpandEnvironmentStrings (value
, buffer
, size
))
373 /* Found and expanded. */
378 /* Error expanding. */
383 /* Not the right type, or not correctly expanded. */
391 static int window_app
= -1;
392 char szTitle
[MAX_PATH
];
396 /* Checking for STDOUT does not work; it's a valid handle also in
397 nonconsole apps. Testing for the console title seems to work. */
398 window_app
= (GetConsoleTitleA (szTitle
, MAX_PATH
) == 0);
400 InitCommonControls();
407 execvp wrapper for Windows. Quotes arguments with embedded spaces.
409 This is necessary due to the broken implementation of exec* routines in
410 the Microsoft libraries: they concatenate the arguments together without
411 quoting special characters, and pass the result to CreateProcess, with
412 predictably bad results. By contrast, Posix execvp passes the arguments
413 directly into the argv array of the child process.
416 w32_execvp (path
, argv
)
422 /* Required to allow a .BAT script as alternate editor. */
423 argv
[0] = (char *) alternate_editor
;
425 for (i
= 0; argv
[i
]; i
++)
426 if (strchr (argv
[i
], ' '))
428 char *quoted
= alloca (strlen (argv
[i
]) + 3);
429 sprintf (quoted
, "\"%s\"", argv
[i
]);
433 return execvp (path
, argv
);
437 #define execvp w32_execvp
439 #endif /* WINDOWSNT */
441 /* Display a normal or error message.
442 On Windows, use a message box if compiled as a Windows app. */
444 message (int is_error
, char *message
, ...)
449 va_start (args
, message
);
450 vsprintf (msg
, message
, args
);
454 if (w32_window_app ())
457 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
459 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
464 FILE *f
= is_error
? stderr
: stdout
;
471 /* Decode the options from argv and argc.
472 The global variable `optind' will say how many arguments we used up. */
475 decode_options (argc
, argv
)
479 alternate_editor
= egetenv ("ALTERNATE_EDITOR");
483 int opt
= getopt_long (argc
, argv
,
484 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
497 /* If getopt returns 0, then it has already processed a
498 long-named option. We should do nothing. */
502 alternate_editor
= optarg
;
505 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
507 socket_name
= optarg
;
512 server_file
= optarg
;
515 /* We used to disallow this argument in w32, but it seems better
516 to allow it, for the occasional case where the user is
517 connecting with a w32 client to a server compiled with X11
519 #if 1 /* !defined WINDOWS */
534 message (FALSE
, "emacsclient %s\n", VERSION
);
548 print_help_and_exit ();
552 message (TRUE
, "Try `%s --help' for more information\n", progname
);
558 /* We used to set `display' to $DISPLAY by default, but this changed the
559 default behavior and is sometimes inconvenient. So instead of forcing
560 users to say "--display ''" when they want to use Emacs's existing tty
561 or display connection, we force them to use "--display $DISPLAY" if
562 they want Emacs to connect to their current display.
563 -c still implicitly passes --display $DISPLAY unless -t was specified
564 so as to try and mimick the behavior of `emacs' which either uses
565 the current tty or the current $DISPLAY. */
566 if (!current_frame
&& !tty
&& !display
)
567 display
= egetenv ("DISPLAY");
569 if (display
&& strlen (display
) == 0)
574 #if !defined (WINDOWSNT) && !defined (HAVE_CARBON)
575 else if (!current_frame
)
579 /* --no-wait implies --current-frame on ttys when there are file
580 arguments or expressions given. */
581 if (nowait
&& tty
&& argc
- optind
> 0)
596 print_help_and_exit ()
598 /* Spaces and tabs are significant in this message; they're chosen so the
599 message aligns properly both in a tty and in a Windows message box.
600 Please try to preserve them; otherwise the output is very hard to read
601 when using emacsclientw. */
603 "Usage: %s [OPTIONS] FILE...\n\
604 Tell the Emacs server to visit the specified files.\n\
605 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
607 The following OPTIONS are accepted:\n\
608 -V, --version Just print version info and return\n\
609 -H, --help Print this usage information message\n\
610 -t, --tty Open a new Emacs frame on the current terminal\n\
611 -c, --create-frame Create a new frame instead of trying to\n\
612 use the current Emacs frame\n\
613 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
614 -n, --no-wait Don't wait for the server to return\n\
615 -d, --display=DISPLAY Visit the file in the given display\n"
616 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
617 "-s, --socket-name=FILENAME\n\
618 Set filename of the UNIX socket for communication\n"
620 "-f, --server-file=FILENAME\n\
621 Set filename of the TCP authentication file\n\
622 -a, --alternate-editor=EDITOR\n\
623 Editor to fallback to if the server is not running\n\
625 Report bugs to bug-gnu-emacs@gnu.org.\n", progname
);
630 Try to run a different command, or --if no alternate editor is
631 defined-- exit with an errorcode.
632 Uses argv, but gets it from the global variable main_argv.
637 if (alternate_editor
)
641 execvp (alternate_editor
, main_argv
+ i
);
642 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
643 progname
, alternate_editor
);
649 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
658 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
659 "on systems with Berkeley sockets.\n",
664 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
667 # include <winsock2.h>
669 # include <sys/types.h>
670 # include <sys/socket.h>
674 #define AUTH_KEY_LENGTH 64
675 #define SEND_BUFFER_SIZE 4096
677 extern char *strerror ();
680 /* Buffer to accumulate data to send in TCP connections. */
681 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
682 int sblen
= 0; /* Fill pointer for the send buffer. */
683 /* Socket used to communicate with the Emacs server process. */
684 HSOCKET emacs_socket
= 0;
686 /* On Windows, the socket library was historically separate from the standard
687 C library, so errors are handled differently. */
689 sock_err_message (function_name
)
695 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
696 | FORMAT_MESSAGE_ALLOCATE_BUFFER
697 | FORMAT_MESSAGE_ARGUMENT_ARRAY
,
698 NULL
, WSAGetLastError (), 0, (LPTSTR
)&msg
, 0, NULL
);
700 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, msg
);
704 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, strerror (errno
));
709 /* Let's send the data to Emacs when either
710 - the data ends in "\n", or
711 - the buffer is full (but this shouldn't happen)
712 Otherwise, we just accumulate it. */
714 send_to_emacs (s
, data
)
720 int dlen
= strlen (data
);
721 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
723 int part
= SEND_BUFFER_SIZE
- sblen
;
724 strncpy (&send_buffer
[sblen
], data
, part
);
726 sblen
= SEND_BUFFER_SIZE
;
730 strcpy (&send_buffer
[sblen
], data
);
737 if (sblen
== SEND_BUFFER_SIZE
738 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
740 int sent
= send (s
, send_buffer
, sblen
, 0);
742 strcpy (send_buffer
, &send_buffer
[sent
]);
749 /* In STR, insert a & before each &, each space, each newline, and
750 any initial -. Change spaces to underscores, too, so that the
751 return value never contains a space.
753 Does not change the string. Outputs the result to STREAM. */
755 quote_argument (s
, str
)
759 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
780 if (*p
== '&' || (*p
== '-' && p
== str
))
787 send_to_emacs (s
, copy
);
793 /* The inverse of quote_argument. Removes quoting in string STR by
794 modifying the string in place. Returns STR. */
797 unquote_argument (str
)
829 file_name_absolute_p (filename
)
830 const unsigned char *filename
;
832 /* Sanity check, it shouldn't happen. */
833 if (! filename
) return FALSE
;
835 /* /xxx is always an absolute path. */
836 if (filename
[0] == '/') return TRUE
;
838 /* Empty filenames (which shouldn't happen) are relative. */
839 if (filename
[0] == '\0') return FALSE
;
842 /* X:\xxx is always absolute. */
843 if (isalpha (filename
[0])
844 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
847 /* Both \xxx and \\xxx\yyy are absolute. */
848 if (filename
[0] == '\\') return TRUE
;
855 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
857 __cdecl
close_winsock ()
862 /* Initialize the WinSock2 library. */
864 initialize_sockets ()
868 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
870 message (TRUE
, "%s: error initializing WinSock2\n", progname
);
874 atexit (close_winsock
);
876 #endif /* WINDOWSNT */
880 * Read the information needed to set up a TCP comm channel with
881 * the Emacs server: host, port, pid and authentication string.
884 get_server_config (server
, authentication
)
885 struct sockaddr_in
*server
;
886 char *authentication
;
893 if (file_name_absolute_p (server_file
))
894 config
= fopen (server_file
, "rb");
897 char *home
= egetenv ("HOME");
901 char *path
= alloca (32 + strlen (home
) + strlen (server_file
));
902 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
903 config
= fopen (path
, "rb");
906 if (!config
&& (home
= egetenv ("APPDATA")))
908 char *path
= alloca (32 + strlen (home
) + strlen (server_file
));
909 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
910 config
= fopen (path
, "rb");
918 if (fgets (dotted
, sizeof dotted
, config
)
919 && (port
= strchr (dotted
, ':'))
920 && (pid
= strchr (port
, ' ')))
927 message (TRUE
, "%s: invalid configuration info\n", progname
);
931 server
->sin_family
= AF_INET
;
932 server
->sin_addr
.s_addr
= inet_addr (dotted
);
933 server
->sin_port
= htons (atoi (port
));
935 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
937 message (TRUE
, "%s: cannot read authentication info\n", progname
);
943 emacs_pid
= atoi (pid
);
952 struct sockaddr_in server
;
953 struct linger l_arg
= {1, 1};
954 char auth_string
[AUTH_KEY_LENGTH
+ 1];
956 if (! get_server_config (&server
, auth_string
))
957 return INVALID_SOCKET
;
959 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
960 message (FALSE
, "%s: connected to remote socket at %s\n",
961 progname
, inet_ntoa (server
.sin_addr
));
964 * Open up an AF_INET socket
966 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
968 sock_err_message ("socket");
969 return INVALID_SOCKET
;
975 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
977 sock_err_message ("connect");
978 return INVALID_SOCKET
;
981 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
984 * Send the authentication
986 auth_string
[AUTH_KEY_LENGTH
] = '\0';
988 send_to_emacs (s
, "-auth ");
989 send_to_emacs (s
, auth_string
);
990 send_to_emacs (s
, " ");
996 /* Returns 1 if PREFIX is a prefix of STRING. */
998 strprefix (char *prefix
, char *string
)
1000 return !strncmp (prefix
, string
, strlen (prefix
));
1004 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1006 /* Three possibilities:
1007 2 - can't be `stat'ed (sets errno)
1008 1 - isn't owned by us
1009 0 - success: none of the above */
1012 socket_status (socket_name
)
1015 struct stat statbfr
;
1017 if (stat (socket_name
, &statbfr
) == -1)
1020 if (statbfr
.st_uid
!= geteuid ())
1027 /* A signal handler that passes the signal to the Emacs process.
1028 Useful for SIGWINCH. */
1031 pass_signal_to_emacs (int signalnum
)
1033 int old_errno
= errno
;
1036 kill (emacs_pid
, signalnum
);
1038 signal (signalnum
, pass_signal_to_emacs
);
1042 /* Signal handler for SIGCONT; notify the Emacs process that it can
1043 now resume our tty frame. */
1046 handle_sigcont (int signalnum
)
1048 int old_errno
= errno
;
1050 if (tcgetpgrp (1) == getpgrp ())
1052 /* We are in the foreground. */
1053 send_to_emacs (emacs_socket
, "-resume \n");
1057 /* We are in the background; cancel the continue. */
1058 kill (getpid (), SIGSTOP
);
1061 signal (signalnum
, handle_sigcont
);
1065 /* Signal handler for SIGTSTP; notify the Emacs process that we are
1066 going to sleep. Normally the suspend is initiated by Emacs via
1067 server-handle-suspend-tty, but if the server gets out of sync with
1068 reality, we may get a SIGTSTP on C-z. Handling this signal and
1069 notifying Emacs about it should get things under control again. */
1072 handle_sigtstp (int signalnum
)
1074 int old_errno
= errno
;
1078 send_to_emacs (emacs_socket
, "-suspend \n");
1080 /* Unblock this signal and call the default handler by temporarily
1081 changing the handler and resignalling. */
1082 sigprocmask (SIG_BLOCK
, NULL
, &set
);
1083 sigdelset (&set
, signalnum
);
1084 signal (signalnum
, SIG_DFL
);
1085 kill (getpid (), signalnum
);
1086 sigprocmask (SIG_SETMASK
, &set
, NULL
); /* Let's the above signal through. */
1087 signal (signalnum
, handle_sigtstp
);
1091 /* Set up signal handlers before opening a frame on the current tty. */
1096 /* Set up signal handlers. */
1097 signal (SIGWINCH
, pass_signal_to_emacs
);
1099 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1100 deciding which terminal the signal came from. C-g is now a
1101 normal input event on secondary terminals. */
1103 signal (SIGINT
, pass_signal_to_emacs
);
1104 signal (SIGQUIT
, pass_signal_to_emacs
);
1107 signal (SIGCONT
, handle_sigcont
);
1108 signal (SIGTSTP
, handle_sigtstp
);
1109 signal (SIGTTOU
, handle_sigtstp
);
1117 struct sockaddr_un server
;
1120 * Open up an AF_UNIX socket in this person's home directory
1123 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1125 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1126 return INVALID_SOCKET
;
1129 server
.sun_family
= AF_UNIX
;
1132 int sock_status
= 0;
1133 int default_sock
= !socket_name
;
1134 int saved_errno
= 0;
1135 char *server_name
= "server";
1137 if (socket_name
&& !index (socket_name
, '/') && !index (socket_name
, '\\'))
1138 { /* socket_name is a file name component. */
1139 server_name
= socket_name
;
1141 default_sock
= 1; /* Try both UIDs. */
1146 socket_name
= alloca (100 + strlen (server_name
));
1147 sprintf (socket_name
, "/tmp/emacs%d/%s",
1148 (int) geteuid (), server_name
);
1151 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1152 strcpy (server
.sun_path
, socket_name
);
1155 message (TRUE
, "%s: socket-name %s too long\n",
1156 progname
, socket_name
);
1160 /* See if the socket exists, and if it's owned by us. */
1161 sock_status
= socket_status (server
.sun_path
);
1162 saved_errno
= errno
;
1163 if (sock_status
&& default_sock
)
1165 /* Failing that, see if LOGNAME or USER exist and differ from
1166 our euid. If so, look for a socket based on the UID
1167 associated with the name. This is reminiscent of the logic
1168 that init_editfns uses to set the global Vuser_full_name. */
1170 char *user_name
= (char *) egetenv ("LOGNAME");
1173 user_name
= (char *) egetenv ("USER");
1177 struct passwd
*pw
= getpwnam (user_name
);
1179 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1181 /* We're running under su, apparently. */
1182 socket_name
= alloca (100 + strlen (server_name
));
1183 sprintf (socket_name
, "/tmp/emacs%d/%s",
1184 (int) pw
->pw_uid
, server_name
);
1186 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1187 strcpy (server
.sun_path
, socket_name
);
1190 message (TRUE
, "%s: socket-name %s too long\n",
1191 progname
, socket_name
);
1192 exit (EXIT_FAILURE
);
1195 sock_status
= socket_status (server
.sun_path
);
1196 saved_errno
= errno
;
1199 errno
= saved_errno
;
1203 switch (sock_status
)
1206 /* There's a socket, but it isn't owned by us. This is OK if
1208 if (0 != geteuid ())
1210 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1211 return INVALID_SOCKET
;
1217 if (saved_errno
== ENOENT
)
1219 "%s: can't find socket; have you started the server?\n\
1220 To start the server in Emacs, type \"M-x server-start\".\n",
1223 message (TRUE
, "%s: can't stat %s: %s\n",
1224 progname
, server
.sun_path
, strerror (saved_errno
));
1225 return INVALID_SOCKET
;
1229 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1232 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1233 return INVALID_SOCKET
;
1238 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1247 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1248 /* Explicit --socket-name argument. */
1251 s
= set_local_socket ();
1252 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1254 message (TRUE
, "%s: error accessing socket \"%s\"\n",
1255 progname
, socket_name
);
1256 exit (EXIT_FAILURE
);
1260 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1262 server_file
= egetenv ("EMACS_SERVER_FILE");
1266 s
= set_tcp_socket ();
1267 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1270 message (TRUE
, "%s: error accessing server file \"%s\"\n",
1271 progname
, server_file
);
1272 exit (EXIT_FAILURE
);
1275 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1276 /* Implicit local socket. */
1277 s
= set_local_socket ();
1278 if (s
!= INVALID_SOCKET
)
1282 /* Implicit server file. */
1283 server_file
= "server";
1284 s
= set_tcp_socket ();
1285 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1288 /* No implicit or explicit socket, and no alternate editor. */
1289 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1290 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1293 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1294 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1296 exit (EXIT_FAILURE
);
1300 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1301 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1304 w32_find_emacs_process (hWnd
, lParam
)
1311 /* Reject any window not of class "Emacs". */
1312 if (! get_wc (hWnd
, class, sizeof (class))
1313 || strcmp (class, "Emacs"))
1316 /* We only need the process id, not the thread id. */
1317 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1319 /* Not the one we're looking for. */
1320 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1322 /* OK, let's raise it. */
1325 /* Stop enumeration. */
1330 * Search for a window of class "Emacs" and owned by a process with
1331 * process id = emacs_pid. If found, allow it to grab the focus.
1338 /* It shouldn't happen when dealing with TCP sockets. */
1339 if (!emacs_pid
) return;
1341 if (!(hUser32
= LoadLibrary ("user32.dll"))) return;
1343 /* Modern Windows restrict which processes can set the foreground window.
1344 emacsclient can allow Emacs to grab the focus by calling the function
1345 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1346 NT) lack this function, so we have to check its availability. */
1347 if ((set_fg
= GetProcAddress (hUser32
, "AllowSetForegroundWindow"))
1348 && (get_wc
= GetProcAddress (hUser32
, "RealGetWindowClassA")))
1349 EnumWindows (w32_find_emacs_process
, (LPARAM
) 0);
1351 FreeLibrary (hUser32
);
1360 int i
, rl
, needlf
= 0;
1362 char string
[BUFSIZ
+1];
1367 /* Process options. */
1368 decode_options (argc
, argv
);
1370 if ((argc
- optind
< 1) && !eval
&& !tty
&& !window_system
)
1372 message (TRUE
, "%s: file name or argument required\n"
1373 "Try `%s --help' for more information\n",
1374 progname
, progname
);
1375 exit (EXIT_FAILURE
);
1378 if ((emacs_socket
= set_socket ()) == INVALID_SOCKET
)
1382 cwd
= get_current_dir_name ();
1385 /* getwd puts message in STRING if it fails. */
1386 message (TRUE
, "%s: %s\n", progname
,
1387 "Cannot get current working directory");
1395 /* Send over our environment. */
1398 extern char **environ
;
1400 for (i
= 0; environ
[i
]; i
++)
1402 char *name
= xstrdup (environ
[i
]);
1403 char *value
= strchr (name
, '=');
1404 send_to_emacs (emacs_socket
, "-env ");
1405 quote_argument (emacs_socket
, environ
[i
]);
1406 send_to_emacs (emacs_socket
, " ");
1410 /* Send over our current directory. */
1413 send_to_emacs (emacs_socket
, "-dir ");
1414 quote_argument (emacs_socket
, cwd
);
1415 send_to_emacs (emacs_socket
, "/");
1416 send_to_emacs (emacs_socket
, " ");
1421 send_to_emacs (emacs_socket
, "-nowait ");
1424 send_to_emacs (emacs_socket
, "-current-frame ");
1428 send_to_emacs (emacs_socket
, "-display ");
1429 quote_argument (emacs_socket
, display
);
1430 send_to_emacs (emacs_socket
, " ");
1435 char *type
= egetenv ("TERM");
1436 char *tty_name
= NULL
;
1438 tty_name
= ttyname (fileno (stdin
));
1443 message (TRUE
, "%s: could not get terminal name\n", progname
);
1449 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1454 if (! strcmp (type
, "eterm"))
1456 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1457 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1458 " is not supported\n", progname
);
1461 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1465 send_to_emacs (emacs_socket
, "-tty ");
1466 quote_argument (emacs_socket
, tty_name
);
1467 send_to_emacs (emacs_socket
, " ");
1468 quote_argument (emacs_socket
, type
);
1469 send_to_emacs (emacs_socket
, " ");
1473 send_to_emacs (emacs_socket
, "-window-system ");
1475 if ((argc
- optind
> 0))
1477 for (i
= optind
; i
< argc
; i
++)
1483 /* Don't prepend cwd or anything like that. */
1484 send_to_emacs (emacs_socket
, "-eval ");
1485 quote_argument (emacs_socket
, argv
[i
]);
1486 send_to_emacs (emacs_socket
, " ");
1490 if (*argv
[i
] == '+')
1492 char *p
= argv
[i
] + 1;
1493 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1496 send_to_emacs (emacs_socket
, "-position ");
1497 quote_argument (emacs_socket
, argv
[i
]);
1498 send_to_emacs (emacs_socket
, " ");
1504 else if (! file_name_absolute_p (argv
[i
]))
1508 /* Call GetFullPathName so filenames of the form X:Y, where X is
1509 a valid drive designator, are interpreted as drive:path, not
1510 file:stream, and treated as absolute.
1511 The user can still pass a file:stream if desired (for example,
1512 .\X:Y), but it is not very useful, as Emacs currently does a
1513 very bad job of dealing wih NTFS streams. */
1515 char *filename
= (char *) xmalloc (MAX_PATH
);
1518 size
= GetFullPathName (argv
[i
], MAX_PATH
, filename
, NULL
);
1519 if (size
> 0 && size
< MAX_PATH
)
1529 send_to_emacs (emacs_socket
, "-file ");
1532 quote_argument (emacs_socket
, cwd
);
1533 send_to_emacs (emacs_socket
, "/");
1535 quote_argument (emacs_socket
, argv
[i
]);
1536 send_to_emacs (emacs_socket
, " ");
1541 if (!tty
&& !window_system
)
1543 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1546 send_to_emacs (emacs_socket
, "-eval ");
1548 send_to_emacs (emacs_socket
, "-file ");
1549 quote_argument (emacs_socket
, str
);
1551 send_to_emacs (emacs_socket
, " ");
1555 send_to_emacs (emacs_socket
, "\n");
1557 /* Wait for an answer. */
1558 if (!eval
&& !tty
&& !nowait
)
1560 printf ("Waiting for Emacs...");
1566 /* Now, wait for an answer and print any messages. */
1567 while ((rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1572 p
= string
+ strlen (string
) - 1;
1573 while (p
> string
&& *p
== '\n')
1576 if (strprefix ("-emacs-pid ", string
))
1578 /* -emacs-pid PID: The process id of the Emacs process. */
1579 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1581 else if (strprefix ("-window-system-unsupported ", string
))
1583 /* -window-system-unsupported: Emacs was compiled without X
1584 support. Try again on the terminal. */
1590 else if (strprefix ("-print ", string
))
1592 /* -print STRING: Print STRING on the terminal. */
1593 str
= unquote_argument (string
+ strlen ("-print "));
1597 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1599 else if (strprefix ("-error ", string
))
1601 /* -error DESCRIPTION: Signal an error on the terminal. */
1602 str
= unquote_argument (string
+ strlen ("-error "));
1605 fprintf (stderr
, "*ERROR*: %s", str
);
1606 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1609 else if (strprefix ("-suspend ", string
))
1611 /* -suspend: Suspend this terminal, i.e., stop the process. */
1620 /* Unknown command. */
1623 printf ("*ERROR*: Unknown message: %s", string
);
1624 needlf
= string
[0] == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1633 CLOSE_SOCKET (emacs_socket
);
1634 return EXIT_SUCCESS
;
1637 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1640 #ifndef HAVE_STRERROR
1645 extern char *sys_errlist
[];
1646 extern int sys_nerr
;
1648 if (errnum
>= 0 && errnum
< sys_nerr
)
1649 return sys_errlist
[errnum
];
1650 return (char *) "Unknown error";
1653 #endif /* ! HAVE_STRERROR */
1655 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1656 (do not change this comment) */
1658 /* emacsclient.c ends here */