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 # include <arpa/inet.h>
52 # define INVALID_SOCKET -1
54 # define CLOSE_SOCKET close
57 #endif /* !WINDOWSNT */
71 #else /* not WINDOWSNT */
73 #endif /* not WINDOWSNT */
80 char *getenv (), *getwd ();
85 #define egetenv(VAR) w32_getenv(VAR)
87 #define egetenv(VAR) getenv(VAR)
91 #define VERSION "unspecified"
96 #define EXIT_SUCCESS 0
100 #define EXIT_FAILURE 1
115 /* Additional space when allocating buffers for filenames, etc. */
116 #define EXTRA_SPACE 100
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 /* The display on which Emacs should work. --display. */
135 char *display
= NULL
;
137 /* Nonzero means open a new Emacs frame on the current terminal. */
140 /* If non-NULL, the name of an editor to fallback to if the server
141 is not running. --alternate-editor. */
142 const char *alternate_editor
= NULL
;
144 /* If non-NULL, the filename of the UNIX socket. */
145 char *socket_name
= NULL
;
147 /* If non-NULL, the filename of the authentication file. */
148 char *server_file
= NULL
;
150 /* PID of the Emacs server process. */
153 void print_help_and_exit () NO_RETURN
;
155 struct option longopts
[] =
157 { "no-wait", no_argument
, NULL
, 'n' },
158 { "eval", no_argument
, NULL
, 'e' },
159 { "help", no_argument
, NULL
, 'H' },
160 { "version", no_argument
, NULL
, 'V' },
161 { "tty", no_argument
, NULL
, 't' },
162 { "nw", no_argument
, NULL
, 't' },
163 { "create-frame", no_argument
, NULL
, 'c' },
164 { "alternate-editor", required_argument
, NULL
, 'a' },
165 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
166 { "socket-name", required_argument
, NULL
, 's' },
168 { "server-file", required_argument
, NULL
, 'f' },
170 { "display", required_argument
, NULL
, 'd' },
176 /* Like malloc but get fatal error if memory is exhausted. */
182 long *result
= (long *) malloc (size
);
191 /* Like strdup but get a fatal error if memory is exhausted. */
194 xstrdup (const char *s
)
196 char *result
= strdup (s
);
206 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
209 #ifndef DIRECTORY_SEP
210 #define DIRECTORY_SEP '/'
212 #ifndef IS_DIRECTORY_SEP
213 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
215 #ifndef IS_DEVICE_SEP
217 #define IS_DEVICE_SEP(_c_) 0
219 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
223 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
227 /* Return the current working directory. Returns NULL on errors.
228 Any other returned value must be freed with free. This is used
229 only when get_current_dir_name is not defined on the system. */
231 get_current_dir_name ()
235 struct stat dotstat
, pwdstat
;
236 /* If PWD is accurate, use it instead of calling getwd. PWD is
237 sometimes a nicer name, and using it may avoid a fatal error if a
238 parent directory is searchable but not readable. */
239 if ((pwd
= egetenv ("PWD")) != 0
240 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
241 && stat (pwd
, &pwdstat
) == 0
242 && stat (".", &dotstat
) == 0
243 && dotstat
.st_ino
== pwdstat
.st_ino
244 && dotstat
.st_dev
== pwdstat
.st_dev
246 && strlen (pwd
) < MAXPATHLEN
250 buf
= (char *) xmalloc (strlen (pwd
) + 1);
258 size_t buf_size
= 1024;
259 buf
= (char *) xmalloc (buf_size
);
264 if (getcwd (buf
, buf_size
) == buf
)
268 int tmp_errno
= errno
;
274 buf
= (char *) realloc (buf
, buf_size
);
282 /* We need MAXPATHLEN here. */
283 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
286 if (getwd (buf
) == NULL
)
288 int tmp_errno
= errno
;
301 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
303 /* Retrieve an environment variable from the Emacs subkeys of the registry.
304 Return NULL if the variable was not found, or it was empty.
305 This code is based on w32_get_resource (w32.c). */
307 w32_get_resource (predefined
, key
, type
)
312 HKEY hrootkey
= NULL
;
316 if (RegOpenKeyEx (predefined
, REG_ROOT
, 0, KEY_READ
, &hrootkey
) == ERROR_SUCCESS
)
318 if (RegQueryValueEx (hrootkey
, key
, NULL
, NULL
, NULL
, &cbData
) == ERROR_SUCCESS
)
320 result
= (char *) xmalloc (cbData
);
322 if ((RegQueryValueEx (hrootkey
, key
, NULL
, type
, result
, &cbData
) != ERROR_SUCCESS
)
330 RegCloseKey (hrootkey
);
337 getenv wrapper for Windows
339 This is needed to duplicate Emacs's behavior, which is to look for enviroment
340 variables in the registry if they don't appear in the environment.
349 if (value
= getenv (envvar
))
350 /* Found in the environment. */
353 if (! (value
= w32_get_resource (HKEY_CURRENT_USER
, envvar
, &dwType
)) &&
354 ! (value
= w32_get_resource (HKEY_LOCAL_MACHINE
, envvar
, &dwType
)))
356 /* "w32console" is what Emacs on Windows uses for tty-type under -nw. */
357 if (strcmp (envvar
, "TERM") == 0)
358 return xstrdup ("w32console");
359 /* Found neither in the environment nor in the registry. */
363 if (dwType
== REG_SZ
)
364 /* Registry; no need to expand. */
367 if (dwType
== REG_EXPAND_SZ
)
371 if (size
= ExpandEnvironmentStrings (value
, NULL
, 0))
373 char *buffer
= (char *) xmalloc (size
);
374 if (ExpandEnvironmentStrings (value
, buffer
, size
))
376 /* Found and expanded. */
381 /* Error expanding. */
386 /* Not the right type, or not correctly expanded. */
394 static int window_app
= -1;
395 char szTitle
[MAX_PATH
];
399 /* Checking for STDOUT does not work; it's a valid handle also in
400 nonconsole apps. Testing for the console title seems to work. */
401 window_app
= (GetConsoleTitleA (szTitle
, MAX_PATH
) == 0);
403 InitCommonControls();
410 execvp wrapper for Windows. Quotes arguments with embedded spaces.
412 This is necessary due to the broken implementation of exec* routines in
413 the Microsoft libraries: they concatenate the arguments together without
414 quoting special characters, and pass the result to CreateProcess, with
415 predictably bad results. By contrast, Posix execvp passes the arguments
416 directly into the argv array of the child process.
419 w32_execvp (path
, argv
)
425 /* Required to allow a .BAT script as alternate editor. */
426 argv
[0] = (char *) alternate_editor
;
428 for (i
= 0; argv
[i
]; i
++)
429 if (strchr (argv
[i
], ' '))
431 char *quoted
= alloca (strlen (argv
[i
]) + 3);
432 sprintf (quoted
, "\"%s\"", argv
[i
]);
436 return execvp (path
, argv
);
440 #define execvp w32_execvp
442 /* Emulation of ttyname for Windows. */
449 #endif /* WINDOWSNT */
451 /* Display a normal or error message.
452 On Windows, use a message box if compiled as a Windows app. */
454 message (int is_error
, char *message
, ...)
459 va_start (args
, message
);
460 vsprintf (msg
, message
, args
);
464 if (w32_window_app ())
467 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
469 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
474 FILE *f
= is_error
? stderr
: stdout
;
481 /* Decode the options from argv and argc.
482 The global variable `optind' will say how many arguments we used up. */
485 decode_options (argc
, argv
)
489 alternate_editor
= egetenv ("ALTERNATE_EDITOR");
493 int opt
= getopt_long_only (argc
, argv
,
494 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
507 /* If getopt returns 0, then it has already processed a
508 long-named option. We should do nothing. */
512 alternate_editor
= optarg
;
515 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
517 socket_name
= optarg
;
522 server_file
= optarg
;
525 /* We used to disallow this argument in w32, but it seems better
526 to allow it, for the occasional case where the user is
527 connecting with a w32 client to a server compiled with X11
542 message (FALSE
, "emacsclient %s\n", VERSION
);
556 print_help_and_exit ();
560 message (TRUE
, "Try `%s --help' for more information\n", progname
);
566 /* If the -c option is used (without -t) and no --display argument
567 is provided, try $DISPLAY.
568 Without the -c option, we used to set `display' to $DISPLAY by
569 default, but this changed the default behavior and is sometimes
570 inconvenient. So we force users to use "--display $DISPLAY" if
571 they want Emacs to connect to their current display. */
572 if (!current_frame
&& !tty
&& !display
)
573 display
= egetenv ("DISPLAY");
575 /* A null-string display is invalid. */
576 if (display
&& strlen (display
) == 0)
579 /* If no display is available, new frames are tty frames. */
580 if (!current_frame
&& !display
)
583 /* --no-wait implies --current-frame on ttys when there are file
584 arguments or expressions given. */
585 if (nowait
&& tty
&& argc
- optind
> 0)
589 if (alternate_editor
&& alternate_editor
[0] == '\0')
591 message (TRUE
, "--alternate-editor argument or ALTERNATE_EDITOR variable cannot be\n\
595 #endif /* WINDOWSNT */
600 print_help_and_exit ()
602 /* Spaces and tabs are significant in this message; they're chosen so the
603 message aligns properly both in a tty and in a Windows message box.
604 Please try to preserve them; otherwise the output is very hard to read
605 when using emacsclientw. */
607 "Usage: %s [OPTIONS] FILE...\n\
608 Tell the Emacs server to visit the specified files.\n\
609 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
611 The following OPTIONS are accepted:\n\
612 -V, --version Just print version info and return\n\
613 -H, --help Print this usage information message\n\
614 -nw, -t, --tty Open a new Emacs frame on the current terminal\n\
615 -c, --create-frame Create a new frame instead of trying to\n\
616 use the current Emacs frame\n\
617 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
618 -n, --no-wait Don't wait for the server to return\n\
619 -d, --display=DISPLAY Visit the file in the given display\n"
620 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
621 "-s, --socket-name=FILENAME\n\
622 Set filename of the UNIX socket for communication\n"
624 "-f, --server-file=FILENAME\n\
625 Set filename of the TCP authentication file\n\
626 -a, --alternate-editor=EDITOR\n\
627 Editor to fallback to if the server is not running\n"
629 " If EDITOR is the empty string, start Emacs in daemon\n\
630 mode and try connecting again\n"
631 #endif /* WINDOWSNT */
633 Report bugs to bug-gnu-emacs@gnu.org.\n", progname
);
638 Try to run a different command, or --if no alternate editor is
639 defined-- exit with an errorcode.
640 Uses argv, but gets it from the global variable main_argv.
645 if (alternate_editor
)
649 execvp (alternate_editor
, main_argv
+ i
);
650 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
651 progname
, alternate_editor
);
657 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
666 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
667 "on systems with Berkeley sockets.\n",
672 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
675 # include <winsock2.h>
677 # include <sys/types.h>
678 # include <sys/socket.h>
682 #define AUTH_KEY_LENGTH 64
683 #define SEND_BUFFER_SIZE 4096
685 extern char *strerror ();
688 /* Buffer to accumulate data to send in TCP connections. */
689 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
690 int sblen
= 0; /* Fill pointer for the send buffer. */
691 /* Socket used to communicate with the Emacs server process. */
692 HSOCKET emacs_socket
= 0;
694 /* On Windows, the socket library was historically separate from the standard
695 C library, so errors are handled differently. */
697 sock_err_message (function_name
)
703 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
704 | FORMAT_MESSAGE_ALLOCATE_BUFFER
705 | FORMAT_MESSAGE_ARGUMENT_ARRAY
,
706 NULL
, WSAGetLastError (), 0, (LPTSTR
)&msg
, 0, NULL
);
708 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, msg
);
712 message (TRUE
, "%s: %s: %s\n", progname
, function_name
, strerror (errno
));
717 /* Let's send the data to Emacs when either
718 - the data ends in "\n", or
719 - the buffer is full (but this shouldn't happen)
720 Otherwise, we just accumulate it. */
722 send_to_emacs (s
, data
)
728 int dlen
= strlen (data
);
729 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
731 int part
= SEND_BUFFER_SIZE
- sblen
;
732 strncpy (&send_buffer
[sblen
], data
, part
);
734 sblen
= SEND_BUFFER_SIZE
;
738 strcpy (&send_buffer
[sblen
], data
);
745 if (sblen
== SEND_BUFFER_SIZE
746 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
748 int sent
= send (s
, send_buffer
, sblen
, 0);
750 strcpy (send_buffer
, &send_buffer
[sent
]);
757 /* In STR, insert a & before each &, each space, each newline, and
758 any initial -. Change spaces to underscores, too, so that the
759 return value never contains a space.
761 Does not change the string. Outputs the result to STREAM. */
763 quote_argument (s
, str
)
767 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
788 if (*p
== '&' || (*p
== '-' && p
== str
))
795 send_to_emacs (s
, copy
);
801 /* The inverse of quote_argument. Removes quoting in string STR by
802 modifying the string in place. Returns STR. */
805 unquote_argument (str
)
837 file_name_absolute_p (filename
)
838 const unsigned char *filename
;
840 /* Sanity check, it shouldn't happen. */
841 if (! filename
) return FALSE
;
843 /* /xxx is always an absolute path. */
844 if (filename
[0] == '/') return TRUE
;
846 /* Empty filenames (which shouldn't happen) are relative. */
847 if (filename
[0] == '\0') return FALSE
;
850 /* X:\xxx is always absolute. */
851 if (isalpha (filename
[0])
852 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
855 /* Both \xxx and \\xxx\yyy are absolute. */
856 if (filename
[0] == '\\') return TRUE
;
863 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
865 __cdecl
close_winsock ()
870 /* Initialize the WinSock2 library. */
872 initialize_sockets ()
876 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
878 message (TRUE
, "%s: error initializing WinSock2\n", progname
);
882 atexit (close_winsock
);
884 #endif /* WINDOWSNT */
888 * Read the information needed to set up a TCP comm channel with
889 * the Emacs server: host, port, pid and authentication string.
892 get_server_config (server
, authentication
)
893 struct sockaddr_in
*server
;
894 char *authentication
;
901 if (file_name_absolute_p (server_file
))
902 config
= fopen (server_file
, "rb");
905 char *home
= egetenv ("HOME");
909 char *path
= alloca (strlen (home
) + strlen (server_file
)
911 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
912 config
= fopen (path
, "rb");
915 if (!config
&& (home
= egetenv ("APPDATA")))
917 char *path
= alloca (strlen (home
) + strlen (server_file
)
919 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
920 config
= fopen (path
, "rb");
928 if (fgets (dotted
, sizeof dotted
, config
)
929 && (port
= strchr (dotted
, ':'))
930 && (pid
= strchr (port
, ' ')))
937 message (TRUE
, "%s: invalid configuration info\n", progname
);
941 server
->sin_family
= AF_INET
;
942 server
->sin_addr
.s_addr
= inet_addr (dotted
);
943 server
->sin_port
= htons (atoi (port
));
945 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
947 message (TRUE
, "%s: cannot read authentication info\n", progname
);
953 emacs_pid
= atoi (pid
);
962 struct sockaddr_in server
;
963 struct linger l_arg
= {1, 1};
964 char auth_string
[AUTH_KEY_LENGTH
+ 1];
966 if (! get_server_config (&server
, auth_string
))
967 return INVALID_SOCKET
;
969 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
970 message (FALSE
, "%s: connected to remote socket at %s\n",
971 progname
, inet_ntoa (server
.sin_addr
));
974 * Open up an AF_INET socket
976 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
978 sock_err_message ("socket");
979 return INVALID_SOCKET
;
985 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
987 sock_err_message ("connect");
988 return INVALID_SOCKET
;
991 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
994 * Send the authentication
996 auth_string
[AUTH_KEY_LENGTH
] = '\0';
998 send_to_emacs (s
, "-auth ");
999 send_to_emacs (s
, auth_string
);
1000 send_to_emacs (s
, " ");
1006 /* Returns 1 if PREFIX is a prefix of STRING. */
1008 strprefix (char *prefix
, char *string
)
1010 return !strncmp (prefix
, string
, strlen (prefix
));
1013 /* Get tty name and type. If successful, return the type in TTY_TYPE
1014 and the name in TTY_NAME, and return 1. Otherwise, fail if NOABORT
1015 is zero, or return 0 if NOABORT is non-zero. */
1018 find_tty (char **tty_type
, char **tty_name
, int noabort
)
1020 char *type
= egetenv ("TERM");
1021 char *name
= ttyname (fileno (stdout
));
1029 message (TRUE
, "%s: could not get terminal name\n", progname
);
1040 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1046 if (strcmp (type
, "eterm") == 0)
1052 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1053 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1054 " is not supported\n", progname
);
1065 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1067 /* Three possibilities:
1068 2 - can't be `stat'ed (sets errno)
1069 1 - isn't owned by us
1070 0 - success: none of the above */
1073 socket_status (socket_name
)
1076 struct stat statbfr
;
1078 if (stat (socket_name
, &statbfr
) == -1)
1081 if (statbfr
.st_uid
!= geteuid ())
1088 /* A signal handler that passes the signal to the Emacs process.
1089 Useful for SIGWINCH. */
1092 pass_signal_to_emacs (int signalnum
)
1094 int old_errno
= errno
;
1097 kill (emacs_pid
, signalnum
);
1099 signal (signalnum
, pass_signal_to_emacs
);
1103 /* Signal handler for SIGCONT; notify the Emacs process that it can
1104 now resume our tty frame. */
1107 handle_sigcont (int signalnum
)
1109 int old_errno
= errno
;
1111 if (tcgetpgrp (1) == getpgrp ())
1113 /* We are in the foreground. */
1114 send_to_emacs (emacs_socket
, "-resume \n");
1118 /* We are in the background; cancel the continue. */
1119 kill (getpid (), SIGSTOP
);
1122 signal (signalnum
, handle_sigcont
);
1126 /* Signal handler for SIGTSTP; notify the Emacs process that we are
1127 going to sleep. Normally the suspend is initiated by Emacs via
1128 server-handle-suspend-tty, but if the server gets out of sync with
1129 reality, we may get a SIGTSTP on C-z. Handling this signal and
1130 notifying Emacs about it should get things under control again. */
1133 handle_sigtstp (int signalnum
)
1135 int old_errno
= errno
;
1139 send_to_emacs (emacs_socket
, "-suspend \n");
1141 /* Unblock this signal and call the default handler by temporarily
1142 changing the handler and resignalling. */
1143 sigprocmask (SIG_BLOCK
, NULL
, &set
);
1144 sigdelset (&set
, signalnum
);
1145 signal (signalnum
, SIG_DFL
);
1146 kill (getpid (), signalnum
);
1147 sigprocmask (SIG_SETMASK
, &set
, NULL
); /* Let's the above signal through. */
1148 signal (signalnum
, handle_sigtstp
);
1154 /* Set up signal handlers before opening a frame on the current tty. */
1159 /* Set up signal handlers. */
1160 signal (SIGWINCH
, pass_signal_to_emacs
);
1162 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1163 deciding which terminal the signal came from. C-g is now a
1164 normal input event on secondary terminals. */
1166 signal (SIGINT
, pass_signal_to_emacs
);
1167 signal (SIGQUIT
, pass_signal_to_emacs
);
1170 signal (SIGCONT
, handle_sigcont
);
1171 signal (SIGTSTP
, handle_sigtstp
);
1172 signal (SIGTTOU
, handle_sigtstp
);
1180 struct sockaddr_un server
;
1183 * Open up an AF_UNIX socket in this person's home directory
1186 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1188 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1189 return INVALID_SOCKET
;
1192 server
.sun_family
= AF_UNIX
;
1195 int sock_status
= 0;
1196 int default_sock
= !socket_name
;
1197 int saved_errno
= 0;
1198 char *server_name
= "server";
1201 if (socket_name
&& !index (socket_name
, '/') && !index (socket_name
, '\\'))
1202 { /* socket_name is a file name component. */
1203 server_name
= socket_name
;
1205 default_sock
= 1; /* Try both UIDs. */
1210 tmpdir
= egetenv ("TMPDIR");
1213 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1215 sprintf (socket_name
, "%s/emacs%d/%s",
1216 tmpdir
, (int) geteuid (), server_name
);
1219 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1220 strcpy (server
.sun_path
, socket_name
);
1223 message (TRUE
, "%s: socket-name %s too long\n",
1224 progname
, socket_name
);
1228 /* See if the socket exists, and if it's owned by us. */
1229 sock_status
= socket_status (server
.sun_path
);
1230 saved_errno
= errno
;
1231 if (sock_status
&& default_sock
)
1233 /* Failing that, see if LOGNAME or USER exist and differ from
1234 our euid. If so, look for a socket based on the UID
1235 associated with the name. This is reminiscent of the logic
1236 that init_editfns uses to set the global Vuser_full_name. */
1238 char *user_name
= (char *) egetenv ("LOGNAME");
1241 user_name
= (char *) egetenv ("USER");
1245 struct passwd
*pw
= getpwnam (user_name
);
1247 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1249 /* We're running under su, apparently. */
1250 socket_name
= alloca (strlen (tmpdir
) + strlen (server_name
)
1252 sprintf (socket_name
, "%s/emacs%d/%s",
1253 tmpdir
, (int) pw
->pw_uid
, server_name
);
1255 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1256 strcpy (server
.sun_path
, socket_name
);
1259 message (TRUE
, "%s: socket-name %s too long\n",
1260 progname
, socket_name
);
1261 exit (EXIT_FAILURE
);
1264 sock_status
= socket_status (server
.sun_path
);
1265 saved_errno
= errno
;
1268 errno
= saved_errno
;
1272 switch (sock_status
)
1275 /* There's a socket, but it isn't owned by us. This is OK if
1277 if (0 != geteuid ())
1279 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1280 return INVALID_SOCKET
;
1286 if (saved_errno
== ENOENT
)
1288 "%s: can't find socket; have you started the server?\n\
1289 To start the server in Emacs, type \"M-x server-start\".\n",
1292 message (TRUE
, "%s: can't stat %s: %s\n",
1293 progname
, server
.sun_path
, strerror (saved_errno
));
1294 return INVALID_SOCKET
;
1298 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1301 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1302 return INVALID_SOCKET
;
1307 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1310 set_socket (int no_exit_if_error
)
1316 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1317 /* Explicit --socket-name argument. */
1320 s
= set_local_socket ();
1321 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1323 message (TRUE
, "%s: error accessing socket \"%s\"\n",
1324 progname
, socket_name
);
1325 exit (EXIT_FAILURE
);
1329 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1331 server_file
= egetenv ("EMACS_SERVER_FILE");
1335 s
= set_tcp_socket ();
1336 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1339 message (TRUE
, "%s: error accessing server file \"%s\"\n",
1340 progname
, server_file
);
1341 exit (EXIT_FAILURE
);
1344 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1345 /* Implicit local socket. */
1346 s
= set_local_socket ();
1347 if (s
!= INVALID_SOCKET
)
1351 /* Implicit server file. */
1352 server_file
= "server";
1353 s
= set_tcp_socket ();
1354 if ((s
!= INVALID_SOCKET
) || no_exit_if_error
)
1357 /* No implicit or explicit socket, and no alternate editor. */
1358 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1359 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1362 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1363 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1365 exit (EXIT_FAILURE
);
1369 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1370 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1373 w32_find_emacs_process (hWnd
, lParam
)
1380 /* Reject any window not of class "Emacs". */
1381 if (! get_wc (hWnd
, class, sizeof (class))
1382 || strcmp (class, "Emacs"))
1385 /* We only need the process id, not the thread id. */
1386 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1388 /* Not the one we're looking for. */
1389 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1391 /* OK, let's raise it. */
1394 /* Stop enumeration. */
1399 * Search for a window of class "Emacs" and owned by a process with
1400 * process id = emacs_pid. If found, allow it to grab the focus.
1407 /* It shouldn't happen when dealing with TCP sockets. */
1408 if (!emacs_pid
) return;
1410 if (!(hUser32
= LoadLibrary ("user32.dll"))) return;
1412 /* Modern Windows restrict which processes can set the foreground window.
1413 emacsclient can allow Emacs to grab the focus by calling the function
1414 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1415 NT) lack this function, so we have to check its availability. */
1416 if ((set_fg
= GetProcAddress (hUser32
, "AllowSetForegroundWindow"))
1417 && (get_wc
= GetProcAddress (hUser32
, "RealGetWindowClassA")))
1418 EnumWindows (w32_find_emacs_process
, (LPARAM
) 0);
1420 FreeLibrary (hUser32
);
1424 /* Start the emacs daemon and try to connect to it. */
1427 start_daemon_and_retry_set_socket (void)
1438 p
= waitpid (dpid
, &status
, WUNTRACED
| WCONTINUED
);
1440 /* Try connecting again, the daemon should have started by
1442 message (TRUE
, "daemon should have started, trying to connect again\n", dpid
);
1443 if ((emacs_socket
= set_socket (1)) == INVALID_SOCKET
)
1444 message (TRUE
, "Cannot connect even after starting the daemon\n");
1448 fprintf (stderr
, "Cannot fork!\n");
1453 char *d_argv
[] = {"emacs", "--daemon", 0 };
1454 if (socket_name
!= NULL
)
1456 /* Pass --daemon=socket_name as argument. */
1457 char *deq
= "--daemon=";
1458 char *daemon_arg
= alloca (strlen (deq
)
1459 + strlen (socket_name
) + 1);
1460 strcpy (daemon_arg
, deq
);
1461 strcat (daemon_arg
, socket_name
);
1462 d_argv
[1] = daemon_arg
;
1464 execvp ("emacs", d_argv
);
1465 message (TRUE
, "%s: error starting emacs daemon\n", progname
);
1467 #endif /* WINDOWSNT */
1475 int i
, rl
, needlf
= 0;
1477 char string
[BUFSIZ
+1];
1478 int null_socket_name
, null_server_file
, start_daemon_if_needed
;
1483 /* Process options. */
1484 decode_options (argc
, argv
);
1486 if ((argc
- optind
< 1) && !eval
&& current_frame
)
1488 message (TRUE
, "%s: file name or argument required\n"
1489 "Try `%s --help' for more information\n",
1490 progname
, progname
);
1491 exit (EXIT_FAILURE
);
1494 /* If alternate_editor is the empty string, start the emacs daemon
1495 in case of failure to connect. */
1496 start_daemon_if_needed
= (alternate_editor
1497 && (alternate_editor
[0] == '\0'));
1498 if (start_daemon_if_needed
)
1500 /* set_socket changes the values for socket_name and
1501 server_file, we need to reset them, if they were NULL before
1502 for the second call to set_socket. */
1503 null_socket_name
= (socket_name
== NULL
);
1504 null_server_file
= (server_file
== NULL
);
1507 if ((emacs_socket
= set_socket (alternate_editor
1508 || start_daemon_if_needed
)) == INVALID_SOCKET
)
1509 if (start_daemon_if_needed
)
1511 /* Reset socket_name and server_file if they were NULL
1512 before the set_socket call. */
1513 if (null_socket_name
)
1515 if (null_server_file
)
1518 start_daemon_and_retry_set_socket ();
1523 cwd
= get_current_dir_name ();
1526 /* getwd puts message in STRING if it fails. */
1527 message (TRUE
, "%s: %s\n", progname
,
1528 "Cannot get current working directory");
1536 /* Send over our environment and current directory. */
1539 extern char **environ
;
1541 for (i
= 0; environ
[i
]; i
++)
1543 char *name
= xstrdup (environ
[i
]);
1544 char *value
= strchr (name
, '=');
1545 send_to_emacs (emacs_socket
, "-env ");
1546 quote_argument (emacs_socket
, environ
[i
]);
1547 send_to_emacs (emacs_socket
, " ");
1549 send_to_emacs (emacs_socket
, "-dir ");
1550 quote_argument (emacs_socket
, cwd
);
1551 send_to_emacs (emacs_socket
, "/");
1552 send_to_emacs (emacs_socket
, " ");
1557 send_to_emacs (emacs_socket
, "-nowait ");
1560 send_to_emacs (emacs_socket
, "-current-frame ");
1564 send_to_emacs (emacs_socket
, "-display ");
1565 quote_argument (emacs_socket
, display
);
1566 send_to_emacs (emacs_socket
, " ");
1569 /* If using the current frame, send tty information to Emacs anyway.
1570 In daemon mode, Emacs may need to occupy this tty if no other
1571 frame is available. */
1572 if (tty
|| (current_frame
&& !eval
))
1574 char *tty_type
, *tty_name
;
1576 if (find_tty (&tty_type
, &tty_name
, !tty
))
1578 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1581 send_to_emacs (emacs_socket
, "-tty ");
1582 quote_argument (emacs_socket
, tty_name
);
1583 send_to_emacs (emacs_socket
, " ");
1584 quote_argument (emacs_socket
, tty_type
);
1585 send_to_emacs (emacs_socket
, " ");
1589 if (!current_frame
&& !tty
)
1590 send_to_emacs (emacs_socket
, "-window-system ");
1592 if ((argc
- optind
> 0))
1594 for (i
= optind
; i
< argc
; i
++)
1600 /* Don't prepend cwd or anything like that. */
1601 send_to_emacs (emacs_socket
, "-eval ");
1602 quote_argument (emacs_socket
, argv
[i
]);
1603 send_to_emacs (emacs_socket
, " ");
1607 if (*argv
[i
] == '+')
1609 char *p
= argv
[i
] + 1;
1610 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1613 send_to_emacs (emacs_socket
, "-position ");
1614 quote_argument (emacs_socket
, argv
[i
]);
1615 send_to_emacs (emacs_socket
, " ");
1621 else if (! file_name_absolute_p (argv
[i
]))
1625 /* Call GetFullPathName so filenames of the form X:Y, where X is
1626 a valid drive designator, are interpreted as drive:path, not
1627 file:stream, and treated as absolute.
1628 The user can still pass a file:stream if desired (for example,
1629 .\X:Y), but it is not very useful, as Emacs currently does a
1630 very bad job of dealing with NTFS streams. */
1632 char *filename
= (char *) xmalloc (MAX_PATH
);
1635 size
= GetFullPathName (argv
[i
], MAX_PATH
, filename
, NULL
);
1636 if (size
> 0 && size
< MAX_PATH
)
1646 send_to_emacs (emacs_socket
, "-file ");
1649 quote_argument (emacs_socket
, cwd
);
1650 send_to_emacs (emacs_socket
, "/");
1652 quote_argument (emacs_socket
, argv
[i
]);
1653 send_to_emacs (emacs_socket
, " ");
1658 /* Read expressions interactively. */
1659 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1661 send_to_emacs (emacs_socket
, "-eval ");
1662 quote_argument (emacs_socket
, str
);
1664 send_to_emacs (emacs_socket
, " ");
1667 send_to_emacs (emacs_socket
, "\n");
1669 /* Wait for an answer. */
1670 if (!eval
&& !tty
&& !nowait
)
1672 printf ("Waiting for Emacs...");
1678 /* Now, wait for an answer and print any messages. */
1679 while ((rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1684 p
= string
+ strlen (string
) - 1;
1685 while (p
> string
&& *p
== '\n')
1688 if (strprefix ("-emacs-pid ", string
))
1690 /* -emacs-pid PID: The process id of the Emacs process. */
1691 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1693 else if (strprefix ("-window-system-unsupported ", string
))
1695 /* -window-system-unsupported: Emacs was compiled without X
1696 support. Try again on the terminal. */
1701 else if (strprefix ("-print ", string
))
1703 /* -print STRING: Print STRING on the terminal. */
1704 str
= unquote_argument (string
+ strlen ("-print "));
1708 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1710 else if (strprefix ("-error ", string
))
1712 /* -error DESCRIPTION: Signal an error on the terminal. */
1713 str
= unquote_argument (string
+ strlen ("-error "));
1716 fprintf (stderr
, "*ERROR*: %s", str
);
1717 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1720 else if (strprefix ("-suspend ", string
))
1722 /* -suspend: Suspend this terminal, i.e., stop the process. */
1731 /* Unknown command. */
1734 printf ("*ERROR*: Unknown message: %s", string
);
1735 needlf
= string
[0] == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1744 CLOSE_SOCKET (emacs_socket
);
1745 return EXIT_SUCCESS
;
1748 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1751 #ifndef HAVE_STRERROR
1756 extern char *sys_errlist
[];
1757 extern int sys_nerr
;
1759 if (errnum
>= 0 && errnum
< sys_nerr
)
1760 return sys_errlist
[errnum
];
1761 return (char *) "Unknown error";
1764 #endif /* ! HAVE_STRERROR */
1766 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1767 (do not change this comment) */
1769 /* emacsclient.c ends here */