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 /* Additional space when allocating buffers for filenames, etc. */
114 #define EXTRA_SPACE 100
117 /* Name used to invoke this program. */
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 char *display
= NULL
;
135 /* Nonzero means open a new Emacs frame on the current terminal. */
138 /* If non-NULL, the name of an editor to fallback to if the server
139 is not running. --alternate-editor. */
140 const char *alternate_editor
= NULL
;
142 /* If non-NULL, the filename of the UNIX socket. */
143 char *socket_name
= NULL
;
145 /* If non-NULL, the filename of the authentication file. */
146 char *server_file
= NULL
;
148 /* PID of the Emacs server process. */
151 void print_help_and_exit () NO_RETURN
;
153 struct option longopts
[] =
155 { "no-wait", no_argument
, NULL
, 'n' },
156 { "eval", no_argument
, NULL
, 'e' },
157 { "help", no_argument
, NULL
, 'H' },
158 { "version", no_argument
, NULL
, 'V' },
159 { "tty", no_argument
, NULL
, 't' },
160 { "nw", no_argument
, NULL
, 't' },
161 { "create-frame", no_argument
, NULL
, 'c' },
162 { "alternate-editor", required_argument
, NULL
, 'a' },
163 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
164 { "socket-name", required_argument
, NULL
, 's' },
166 { "server-file", required_argument
, NULL
, 'f' },
168 { "display", required_argument
, NULL
, 'd' },
174 /* Like malloc but get fatal error if memory is exhausted. */
180 long *result
= (long *) malloc (size
);
189 /* Like strdup but get a fatal error if memory is exhausted. */
192 xstrdup (const char *s
)
194 char *result
= strdup (s
);
204 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
207 #ifndef DIRECTORY_SEP
208 #define DIRECTORY_SEP '/'
210 #ifndef IS_DIRECTORY_SEP
211 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
213 #ifndef IS_DEVICE_SEP
215 #define IS_DEVICE_SEP(_c_) 0
217 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
221 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
225 /* Return the current working directory. Returns NULL on errors.
226 Any other returned value must be freed with free. This is used
227 only when get_current_dir_name is not defined on the system. */
229 get_current_dir_name ()
233 struct stat dotstat
, pwdstat
;
234 /* If PWD is accurate, use it instead of calling getwd. PWD is
235 sometimes a nicer name, and using it may avoid a fatal error if a
236 parent directory is searchable but not readable. */
237 if ((pwd
= egetenv ("PWD")) != 0
238 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
239 && stat (pwd
, &pwdstat
) == 0
240 && stat (".", &dotstat
) == 0
241 && dotstat
.st_ino
== pwdstat
.st_ino
242 && dotstat
.st_dev
== pwdstat
.st_dev
244 && strlen (pwd
) < MAXPATHLEN
248 buf
= (char *) xmalloc (strlen (pwd
) + 1);
256 size_t buf_size
= 1024;
257 buf
= (char *) xmalloc (buf_size
);
262 if (getcwd (buf
, buf_size
) == buf
)
266 int tmp_errno
= errno
;
272 buf
= (char *) realloc (buf
, buf_size
);
280 /* We need MAXPATHLEN here. */
281 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
284 if (getwd (buf
) == NULL
)
286 int tmp_errno
= errno
;
299 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
301 /* Retrieve an environment variable from the Emacs subkeys of the registry.
302 Return NULL if the variable was not found, or it was empty.
303 This code is based on w32_get_resource (w32.c). */
305 w32_get_resource (predefined
, key
, type
)
310 HKEY hrootkey
= NULL
;
314 if (RegOpenKeyEx (predefined
, REG_ROOT
, 0, KEY_READ
, &hrootkey
) == ERROR_SUCCESS
)
316 if (RegQueryValueEx (hrootkey
, key
, NULL
, NULL
, NULL
, &cbData
) == ERROR_SUCCESS
)
318 result
= (char *) xmalloc (cbData
);
320 if ((RegQueryValueEx (hrootkey
, key
, NULL
, type
, result
, &cbData
) != ERROR_SUCCESS
)
328 RegCloseKey (hrootkey
);
335 getenv wrapper for Windows
337 This is needed to duplicate Emacs's behavior, which is to look for enviroment
338 variables in the registry if they don't appear in the environment.
347 if (value
= getenv (envvar
))
348 /* Found in the environment. */
351 if (! (value
= w32_get_resource (HKEY_CURRENT_USER
, envvar
, &dwType
)) &&
352 ! (value
= w32_get_resource (HKEY_LOCAL_MACHINE
, envvar
, &dwType
)))
354 /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */
355 if (strcmp (envvar
, "TERM") == 0)
356 return xstrdup ("w32console");
357 /* Found neither in the environment nor in the registry. */
361 if (dwType
== REG_SZ
)
362 /* Registry; no need to expand. */
365 if (dwType
== REG_EXPAND_SZ
)
369 if (size
= ExpandEnvironmentStrings (value
, NULL
, 0))
371 char *buffer
= (char *) xmalloc (size
);
372 if (ExpandEnvironmentStrings (value
, buffer
, size
))
374 /* Found and expanded. */
379 /* Error expanding. */
384 /* Not the right type, or not correctly expanded. */
392 static int window_app
= -1;
393 char szTitle
[MAX_PATH
];
397 /* Checking for STDOUT does not work; it's a valid handle also in
398 nonconsole apps. Testing for the console title seems to work. */
399 window_app
= (GetConsoleTitleA (szTitle
, MAX_PATH
) == 0);
401 InitCommonControls();
408 execvp wrapper for Windows. Quotes arguments with embedded spaces.
410 This is necessary due to the broken implementation of exec* routines in
411 the Microsoft libraries: they concatenate the arguments together without
412 quoting special characters, and pass the result to CreateProcess, with
413 predictably bad results. By contrast, Posix execvp passes the arguments
414 directly into the argv array of the child process.
417 w32_execvp (path
, argv
)
423 /* Required to allow a .BAT script as alternate editor. */
424 argv
[0] = (char *) alternate_editor
;
426 for (i
= 0; argv
[i
]; i
++)
427 if (strchr (argv
[i
], ' '))
429 char *quoted
= alloca (strlen (argv
[i
]) + 3);
430 sprintf (quoted
, "\"%s\"", argv
[i
]);
434 return execvp (path
, argv
);
438 #define execvp w32_execvp
440 /* Emulation of ttyname for Windows. */
447 #endif /* WINDOWSNT */
449 /* Display a normal or error message.
450 On Windows, use a message box if compiled as a Windows app. */
452 message (int is_error
, char *message
, ...)
457 va_start (args
, message
);
458 vsprintf (msg
, message
, args
);
462 if (w32_window_app ())
465 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
467 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
472 FILE *f
= is_error
? stderr
: stdout
;
479 /* Decode the options from argv and argc.
480 The global variable `optind' will say how many arguments we used up. */
483 decode_options (argc
, argv
)
487 alternate_editor
= egetenv ("ALTERNATE_EDITOR");
491 int opt
= getopt_long_only (argc
, argv
,
492 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
505 /* If getopt returns 0, then it has already processed a
506 long-named option. We should do nothing. */
510 alternate_editor
= optarg
;
513 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
515 socket_name
= optarg
;
520 server_file
= optarg
;
523 /* We used to disallow this argument in w32, but it seems better
524 to allow it, for the occasional case where the user is
525 connecting with a w32 client to a server compiled with X11
540 message (FALSE
, "emacsclient %s\n", VERSION
);
554 print_help_and_exit ();
558 message (TRUE
, "Try `%s --help' for more information\n", progname
);
564 /* If the -c option is used (without -t) and no --display argument
565 is provided, try $DISPLAY.
566 Without the -c option, we used to set `display' to $DISPLAY by
567 default, but this changed the default behavior and is sometimes
568 inconvenient. So we force users to use "--display $DISPLAY" if
569 they want Emacs to connect to their current display. */
570 if (!current_frame
&& !tty
&& !display
)
571 display
= egetenv ("DISPLAY");
573 /* A null-string display is invalid. */
574 if (display
&& strlen (display
) == 0)
577 /* If no display is available, new frames are tty frames. */
578 if (!current_frame
&& !display
)
581 /* --no-wait implies --current-frame on ttys when there are file
582 arguments or expressions given. */
583 if (nowait
&& tty
&& argc
- optind
> 0)
589 print_help_and_exit ()
591 /* Spaces and tabs are significant in this message; they're chosen so the
592 message aligns properly both in a tty and in a Windows message box.
593 Please try to preserve them; otherwise the output is very hard to read
594 when using emacsclientw. */
596 "Usage: %s [OPTIONS] FILE...\n\
597 Tell the Emacs server to visit the specified files.\n\
598 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
600 The following OPTIONS are accepted:\n\
601 -V, --version Just print version info and return\n\
602 -H, --help Print this usage information message\n\
603 -nw, -t, --tty Open a new Emacs frame on the current terminal\n\
604 -c, --create-frame Create a new frame instead of trying to\n\
605 use the current Emacs frame\n\
606 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
607 -n, --no-wait Don't wait for the server to return\n\
608 -d, --display=DISPLAY Visit the file in the given display\n"
609 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
610 "-s, --socket-name=FILENAME\n\
611 Set filename of the UNIX socket for communication\n"
613 "-f, --server-file=FILENAME\n\
614 Set filename of the TCP authentication file\n\
615 -a, --alternate-editor=EDITOR\n\
616 Editor to fallback to if the server is not running\n\
618 Report bugs to bug-gnu-emacs@gnu.org.\n", progname
);
623 Try to run a different command, or --if no alternate editor is
624 defined-- exit with an errorcode.
625 Uses argv, but gets it from the global variable main_argv.
630 if (alternate_editor
)
634 execvp (alternate_editor
, main_argv
+ i
);
635 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
636 progname
, alternate_editor
);
642 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
651 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
652 "on systems with Berkeley sockets.\n",
657 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
660 # include <winsock2.h>
662 # include <sys/types.h>
663 # include <sys/socket.h>
667 #define AUTH_KEY_LENGTH 64
668 #define SEND_BUFFER_SIZE 4096
670 extern char *strerror ();
673 /* Buffer to accumulate data to send in TCP connections. */
674 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
675 int sblen
= 0; /* Fill pointer for the send buffer. */
676 /* Socket used to communicate with the Emacs server process. */
677 HSOCKET emacs_socket
= 0;
679 /* On Windows, the socket library was historically separate from the standard
680 C library, so errors are handled differently. */
682 sock_err_message (function_name
)
688 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
689 | FORMAT_MESSAGE_ALLOCATE_BUFFER
690 | FORMAT_MESSAGE_ARGUMENT_ARRAY
,
691 NULL
, WSAGetLastError (), 0, (LPTSTR
)&msg
, 0, NULL
);
693 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, msg
);
697 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, strerror (errno
));
702 /* Let's send the data to Emacs when either
703 - the data ends in "\n", or
704 - the buffer is full (but this shouldn't happen)
705 Otherwise, we just accumulate it. */
707 send_to_emacs (s
, data
)
713 int dlen
= strlen (data
);
714 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
716 int part
= SEND_BUFFER_SIZE
- sblen
;
717 strncpy (&send_buffer
[sblen
], data
, part
);
719 sblen
= SEND_BUFFER_SIZE
;
723 strcpy (&send_buffer
[sblen
], data
);
730 if (sblen
== SEND_BUFFER_SIZE
731 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
733 int sent
= send (s
, send_buffer
, sblen
, 0);
735 strcpy (send_buffer
, &send_buffer
[sent
]);
742 /* In STR, insert a & before each &, each space, each newline, and
743 any initial -. Change spaces to underscores, too, so that the
744 return value never contains a space.
746 Does not change the string. Outputs the result to STREAM. */
748 quote_argument (s
, str
)
752 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
773 if (*p
== '&' || (*p
== '-' && p
== str
))
780 send_to_emacs (s
, copy
);
786 /* The inverse of quote_argument. Removes quoting in string STR by
787 modifying the string in place. Returns STR. */
790 unquote_argument (str
)
822 file_name_absolute_p (filename
)
823 const unsigned char *filename
;
825 /* Sanity check, it shouldn't happen. */
826 if (! filename
) return FALSE
;
828 /* /xxx is always an absolute path. */
829 if (filename
[0] == '/') return TRUE
;
831 /* Empty filenames (which shouldn't happen) are relative. */
832 if (filename
[0] == '\0') return FALSE
;
835 /* X:\xxx is always absolute. */
836 if (isalpha (filename
[0])
837 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
840 /* Both \xxx and \\xxx\yyy are absolute. */
841 if (filename
[0] == '\\') return TRUE
;
848 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
850 __cdecl
close_winsock ()
855 /* Initialize the WinSock2 library. */
857 initialize_sockets ()
861 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
863 message (TRUE
, "%s: error initializing WinSock2\n", progname
);
867 atexit (close_winsock
);
869 #endif /* WINDOWSNT */
873 * Read the information needed to set up a TCP comm channel with
874 * the Emacs server: host, port, pid and authentication string.
877 get_server_config (server
, authentication
)
878 struct sockaddr_in
*server
;
879 char *authentication
;
886 if (file_name_absolute_p (server_file
))
887 config
= fopen (server_file
, "rb");
890 char *home
= egetenv ("HOME");
894 char *path
= alloca (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 (strlen (home
) + strlen (server_file
)
904 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
905 config
= fopen (path
, "rb");
913 if (fgets (dotted
, sizeof dotted
, config
)
914 && (port
= strchr (dotted
, ':'))
915 && (pid
= strchr (port
, ' ')))
922 message (TRUE
, "%s: invalid configuration info\n", progname
);
926 server
->sin_family
= AF_INET
;
927 server
->sin_addr
.s_addr
= inet_addr (dotted
);
928 server
->sin_port
= htons (atoi (port
));
930 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
932 message (TRUE
, "%s: cannot read authentication info\n", progname
);
938 emacs_pid
= atoi (pid
);
947 struct sockaddr_in server
;
948 struct linger l_arg
= {1, 1};
949 char auth_string
[AUTH_KEY_LENGTH
+ 1];
951 if (! get_server_config (&server
, auth_string
))
952 return INVALID_SOCKET
;
954 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
955 message (FALSE
, "%s: connected to remote socket at %s\n",
956 progname
, inet_ntoa (server
.sin_addr
));
959 * Open up an AF_INET socket
961 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
963 sock_err_message ("socket");
964 return INVALID_SOCKET
;
970 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
972 sock_err_message ("connect");
973 return INVALID_SOCKET
;
976 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
979 * Send the authentication
981 auth_string
[AUTH_KEY_LENGTH
] = '\0';
983 send_to_emacs (s
, "-auth ");
984 send_to_emacs (s
, auth_string
);
985 send_to_emacs (s
, " ");
991 /* Returns 1 if PREFIX is a prefix of STRING. */
993 strprefix (char *prefix
, char *string
)
995 return !strncmp (prefix
, string
, strlen (prefix
));
998 /* Get tty name and type. If successful, return the type in TTY_TYPE
999 and the name in TTY_NAME, and return 1. Otherwise, fail if NOABORT
1000 is zero, or return 0 if NOABORT is non-zero. */
1003 find_tty (char **tty_type
, char **tty_name
, int noabort
)
1005 char *type
= egetenv ("TERM");
1006 char *name
= ttyname (fileno (stdout
));
1014 message (TRUE
, "%s: could not get terminal name\n", progname
);
1025 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1031 if (strcmp (type
, "eterm") == 0)
1037 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1038 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1039 " is not supported\n", progname
);
1050 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1052 /* Three possibilities:
1053 2 - can't be `stat'ed (sets errno)
1054 1 - isn't owned by us
1055 0 - success: none of the above */
1058 socket_status (socket_name
)
1061 struct stat statbfr
;
1063 if (stat (socket_name
, &statbfr
) == -1)
1066 if (statbfr
.st_uid
!= geteuid ())
1073 /* A signal handler that passes the signal to the Emacs process.
1074 Useful for SIGWINCH. */
1077 pass_signal_to_emacs (int signalnum
)
1079 int old_errno
= errno
;
1082 kill (emacs_pid
, signalnum
);
1084 signal (signalnum
, pass_signal_to_emacs
);
1088 /* Signal handler for SIGCONT; notify the Emacs process that it can
1089 now resume our tty frame. */
1092 handle_sigcont (int signalnum
)
1094 int old_errno
= errno
;
1096 if (tcgetpgrp (1) == getpgrp ())
1098 /* We are in the foreground. */
1099 send_to_emacs (emacs_socket
, "-resume \n");
1103 /* We are in the background; cancel the continue. */
1104 kill (getpid (), SIGSTOP
);
1107 signal (signalnum
, handle_sigcont
);
1111 /* Signal handler for SIGTSTP; notify the Emacs process that we are
1112 going to sleep. Normally the suspend is initiated by Emacs via
1113 server-handle-suspend-tty, but if the server gets out of sync with
1114 reality, we may get a SIGTSTP on C-z. Handling this signal and
1115 notifying Emacs about it should get things under control again. */
1118 handle_sigtstp (int signalnum
)
1120 int old_errno
= errno
;
1124 send_to_emacs (emacs_socket
, "-suspend \n");
1126 /* Unblock this signal and call the default handler by temporarily
1127 changing the handler and resignalling. */
1128 sigprocmask (SIG_BLOCK
, NULL
, &set
);
1129 sigdelset (&set
, signalnum
);
1130 signal (signalnum
, SIG_DFL
);
1131 kill (getpid (), signalnum
);
1132 sigprocmask (SIG_SETMASK
, &set
, NULL
); /* Let's the above signal through. */
1133 signal (signalnum
, handle_sigtstp
);
1139 /* Set up signal handlers before opening a frame on the current tty. */
1144 /* Set up signal handlers. */
1145 signal (SIGWINCH
, pass_signal_to_emacs
);
1147 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1148 deciding which terminal the signal came from. C-g is now a
1149 normal input event on secondary terminals. */
1151 signal (SIGINT
, pass_signal_to_emacs
);
1152 signal (SIGQUIT
, pass_signal_to_emacs
);
1155 signal (SIGCONT
, handle_sigcont
);
1156 signal (SIGTSTP
, handle_sigtstp
);
1157 signal (SIGTTOU
, handle_sigtstp
);
1165 struct sockaddr_un server
;
1168 * Open up an AF_UNIX socket in this person's home directory
1171 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1173 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1174 return INVALID_SOCKET
;
1177 server
.sun_family
= AF_UNIX
;
1180 int sock_status
= 0;
1181 int default_sock
= !socket_name
;
1182 int saved_errno
= 0;
1183 char *server_name
= "server";
1186 if (socket_name
&& !index (socket_name
, '/') && !index (socket_name
, '\\'))
1187 { /* socket_name is a file name component. */
1188 server_name
= socket_name
;
1190 default_sock
= 1; /* Try both UIDs. */
1195 tmpdir
= egetenv ("TMPDIR");
1198 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1200 sprintf (socket_name
, "%s/emacs%d/%s",
1201 tmpdir
, (int) geteuid (), server_name
);
1204 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1205 strcpy (server
.sun_path
, socket_name
);
1208 message (TRUE
, "%s: socket-name %s too long\n",
1209 progname
, socket_name
);
1213 /* See if the socket exists, and if it's owned by us. */
1214 sock_status
= socket_status (server
.sun_path
);
1215 saved_errno
= errno
;
1216 if (sock_status
&& default_sock
)
1218 /* Failing that, see if LOGNAME or USER exist and differ from
1219 our euid. If so, look for a socket based on the UID
1220 associated with the name. This is reminiscent of the logic
1221 that init_editfns uses to set the global Vuser_full_name. */
1223 char *user_name
= (char *) egetenv ("LOGNAME");
1226 user_name
= (char *) egetenv ("USER");
1230 struct passwd
*pw
= getpwnam (user_name
);
1232 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1234 /* We're running under su, apparently. */
1235 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1237 sprintf (socket_name
, "%s/emacs%d/%s",
1238 tmpdir
, (int) pw
->pw_uid
, server_name
);
1240 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1241 strcpy (server
.sun_path
, socket_name
);
1244 message (TRUE
, "%s: socket-name %s too long\n",
1245 progname
, socket_name
);
1246 exit (EXIT_FAILURE
);
1249 sock_status
= socket_status (server
.sun_path
);
1250 saved_errno
= errno
;
1253 errno
= saved_errno
;
1257 switch (sock_status
)
1260 /* There's a socket, but it isn't owned by us. This is OK if
1262 if (0 != geteuid ())
1264 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1265 return INVALID_SOCKET
;
1271 if (saved_errno
== ENOENT
)
1273 "%s: can't find socket; have you started the server?\n\
1274 To start the server in Emacs, type \"M-x server-start\".\n",
1277 message (TRUE
, "%s: can't stat %s: %s\n",
1278 progname
, server
.sun_path
, strerror (saved_errno
));
1279 return INVALID_SOCKET
;
1283 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1286 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1287 return INVALID_SOCKET
;
1292 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1301 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1302 /* Explicit --socket-name argument. */
1305 s
= set_local_socket ();
1306 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1308 message (TRUE
, "%s: error accessing socket \"%s\"\n",
1309 progname
, socket_name
);
1310 exit (EXIT_FAILURE
);
1314 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1316 server_file
= egetenv ("EMACS_SERVER_FILE");
1320 s
= set_tcp_socket ();
1321 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1324 message (TRUE
, "%s: error accessing server file \"%s\"\n",
1325 progname
, server_file
);
1326 exit (EXIT_FAILURE
);
1329 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1330 /* Implicit local socket. */
1331 s
= set_local_socket ();
1332 if (s
!= INVALID_SOCKET
)
1336 /* Implicit server file. */
1337 server_file
= "server";
1338 s
= set_tcp_socket ();
1339 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1342 /* No implicit or explicit socket, and no alternate editor. */
1343 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1344 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1347 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1348 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1350 exit (EXIT_FAILURE
);
1354 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1355 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1358 w32_find_emacs_process (hWnd
, lParam
)
1365 /* Reject any window not of class "Emacs". */
1366 if (! get_wc (hWnd
, class, sizeof (class))
1367 || strcmp (class, "Emacs"))
1370 /* We only need the process id, not the thread id. */
1371 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1373 /* Not the one we're looking for. */
1374 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1376 /* OK, let's raise it. */
1379 /* Stop enumeration. */
1384 * Search for a window of class "Emacs" and owned by a process with
1385 * process id = emacs_pid. If found, allow it to grab the focus.
1392 /* It shouldn't happen when dealing with TCP sockets. */
1393 if (!emacs_pid
) return;
1395 if (!(hUser32
= LoadLibrary ("user32.dll"))) return;
1397 /* Modern Windows restrict which processes can set the foreground window.
1398 emacsclient can allow Emacs to grab the focus by calling the function
1399 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1400 NT) lack this function, so we have to check its availability. */
1401 if ((set_fg
= GetProcAddress (hUser32
, "AllowSetForegroundWindow"))
1402 && (get_wc
= GetProcAddress (hUser32
, "RealGetWindowClassA")))
1403 EnumWindows (w32_find_emacs_process
, (LPARAM
) 0);
1405 FreeLibrary (hUser32
);
1414 int i
, rl
, needlf
= 0;
1416 char string
[BUFSIZ
+1];
1421 /* Process options. */
1422 decode_options (argc
, argv
);
1424 if ((argc
- optind
< 1) && !eval
&& current_frame
)
1426 message (TRUE
, "%s: file name or argument required\n"
1427 "Try `%s --help' for more information\n",
1428 progname
, progname
);
1429 exit (EXIT_FAILURE
);
1432 if ((emacs_socket
= set_socket ()) == INVALID_SOCKET
)
1436 cwd
= get_current_dir_name ();
1439 /* getwd puts message in STRING if it fails. */
1440 message (TRUE
, "%s: %s\n", progname
,
1441 "Cannot get current working directory");
1449 /* Send over our environment and current directory. */
1452 extern char **environ
;
1454 for (i
= 0; environ
[i
]; i
++)
1456 char *name
= xstrdup (environ
[i
]);
1457 char *value
= strchr (name
, '=');
1458 send_to_emacs (emacs_socket
, "-env ");
1459 quote_argument (emacs_socket
, environ
[i
]);
1460 send_to_emacs (emacs_socket
, " ");
1462 send_to_emacs (emacs_socket
, "-dir ");
1463 quote_argument (emacs_socket
, cwd
);
1464 send_to_emacs (emacs_socket
, "/");
1465 send_to_emacs (emacs_socket
, " ");
1470 send_to_emacs (emacs_socket
, "-nowait ");
1473 send_to_emacs (emacs_socket
, "-current-frame ");
1477 send_to_emacs (emacs_socket
, "-display ");
1478 quote_argument (emacs_socket
, display
);
1479 send_to_emacs (emacs_socket
, " ");
1482 /* If using the current frame, send tty information to Emacs anyway.
1483 In daemon mode, Emacs may need to occupy this tty if no other
1484 frame is available. */
1485 if (tty
|| (current_frame
&& !eval
))
1487 char *tty_type
, *tty_name
;
1489 if (find_tty (&tty_type
, &tty_name
, !tty
))
1491 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1494 send_to_emacs (emacs_socket
, "-tty ");
1495 quote_argument (emacs_socket
, tty_name
);
1496 send_to_emacs (emacs_socket
, " ");
1497 quote_argument (emacs_socket
, tty_type
);
1498 send_to_emacs (emacs_socket
, " ");
1502 if (!current_frame
&& !tty
)
1503 send_to_emacs (emacs_socket
, "-window-system ");
1505 if ((argc
- optind
> 0))
1507 for (i
= optind
; i
< argc
; i
++)
1513 /* Don't prepend cwd or anything like that. */
1514 send_to_emacs (emacs_socket
, "-eval ");
1515 quote_argument (emacs_socket
, argv
[i
]);
1516 send_to_emacs (emacs_socket
, " ");
1520 if (*argv
[i
] == '+')
1522 char *p
= argv
[i
] + 1;
1523 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1526 send_to_emacs (emacs_socket
, "-position ");
1527 quote_argument (emacs_socket
, argv
[i
]);
1528 send_to_emacs (emacs_socket
, " ");
1534 else if (! file_name_absolute_p (argv
[i
]))
1538 /* Call GetFullPathName so filenames of the form X:Y, where X is
1539 a valid drive designator, are interpreted as drive:path, not
1540 file:stream, and treated as absolute.
1541 The user can still pass a file:stream if desired (for example,
1542 .\X:Y), but it is not very useful, as Emacs currently does a
1543 very bad job of dealing with NTFS streams. */
1545 char *filename
= (char *) xmalloc (MAX_PATH
);
1548 size
= GetFullPathName (argv
[i
], MAX_PATH
, filename
, NULL
);
1549 if (size
> 0 && size
< MAX_PATH
)
1559 send_to_emacs (emacs_socket
, "-file ");
1562 quote_argument (emacs_socket
, cwd
);
1563 send_to_emacs (emacs_socket
, "/");
1565 quote_argument (emacs_socket
, argv
[i
]);
1566 send_to_emacs (emacs_socket
, " ");
1571 /* Read expressions interactively. */
1572 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1574 send_to_emacs (emacs_socket
, "-eval ");
1575 quote_argument (emacs_socket
, str
);
1577 send_to_emacs (emacs_socket
, " ");
1580 send_to_emacs (emacs_socket
, "\n");
1582 /* Wait for an answer. */
1583 if (!eval
&& !tty
&& !nowait
)
1585 printf ("Waiting for Emacs...");
1591 /* Now, wait for an answer and print any messages. */
1592 while ((rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1597 p
= string
+ strlen (string
) - 1;
1598 while (p
> string
&& *p
== '\n')
1601 if (strprefix ("-emacs-pid ", string
))
1603 /* -emacs-pid PID: The process id of the Emacs process. */
1604 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1606 else if (strprefix ("-window-system-unsupported ", string
))
1608 /* -window-system-unsupported: Emacs was compiled without X
1609 support. Try again on the terminal. */
1614 else if (strprefix ("-print ", string
))
1616 /* -print STRING: Print STRING on the terminal. */
1617 str
= unquote_argument (string
+ strlen ("-print "));
1621 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1623 else if (strprefix ("-error ", string
))
1625 /* -error DESCRIPTION: Signal an error on the terminal. */
1626 str
= unquote_argument (string
+ strlen ("-error "));
1629 fprintf (stderr
, "*ERROR*: %s", str
);
1630 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1633 else if (strprefix ("-suspend ", string
))
1635 /* -suspend: Suspend this terminal, i.e., stop the process. */
1644 /* Unknown command. */
1647 printf ("*ERROR*: Unknown message: %s", string
);
1648 needlf
= string
[0] == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1657 CLOSE_SOCKET (emacs_socket
);
1658 return EXIT_SUCCESS
;
1661 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1664 #ifndef HAVE_STRERROR
1669 extern char *sys_errlist
[];
1670 extern int sys_nerr
;
1672 if (errnum
>= 0 && errnum
< sys_nerr
)
1673 return sys_errlist
[errnum
];
1674 return (char *) "Unknown error";
1677 #endif /* ! HAVE_STRERROR */
1679 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1680 (do not change this comment) */
1682 /* emacsclient.c ends here */