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 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. */
31 /* config.h defines these, which disables sockets altogether! */
39 # define NO_SOCKETS_IN_FILE_SYSTEM
41 # define HSOCKET SOCKET
42 # define CLOSE_SOCKET closesocket
43 # define INITIALIZE() (initialize_sockets ())
45 #else /* !WINDOWSNT */
47 # include <sys/types.h>
49 # ifdef HAVE_INET_SOCKETS
50 # include <netinet/in.h>
53 # define INVALID_SOCKET -1
55 # define CLOSE_SOCKET close
58 #endif /* !WINDOWSNT */
75 #else /* not WINDOWSNT */
77 #endif /* not WINDOWSNT */
86 #define DIRECTORY_SEP '/'
88 #ifndef IS_DIRECTORY_SEP
89 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
93 #define IS_DEVICE_SEP(_c_) 0
95 #define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
99 #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
104 char *getenv (), *getwd ();
108 #define VERSION "unspecified"
113 #define EXIT_SUCCESS 0
117 #define EXIT_FAILURE 1
132 /* Name used to invoke this program. */
135 /* The first argument to main. */
138 /* The second argument to main. */
141 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
144 /* Nonzero means args are expressions to be evaluated. --eval. */
147 /* Nonzero means don't open a new frame. --current-frame. */
148 int current_frame
= 0;
150 /* Nonzero means open a new graphical frame. */
151 int window_system
= 0;
153 /* The display on which Emacs should work. --display. */
154 char *display
= NULL
;
156 /* Nonzero means open a new Emacs frame on the current terminal. */
159 /* If non-NULL, the name of an editor to fallback to if the server
160 is not running. --alternate-editor. */
161 const char *alternate_editor
= NULL
;
163 /* If non-NULL, the filename of the UNIX socket. */
164 char *socket_name
= NULL
;
166 /* If non-NULL, the filename of the authentication file. */
167 char *server_file
= NULL
;
169 /* PID of the Emacs server process. */
172 void print_help_and_exit () NO_RETURN
;
174 struct option longopts
[] =
176 { "no-wait", no_argument
, NULL
, 'n' },
177 { "eval", no_argument
, NULL
, 'e' },
178 { "help", no_argument
, NULL
, 'H' },
179 { "version", no_argument
, NULL
, 'V' },
180 { "tty", no_argument
, NULL
, 't' },
181 { "current-frame", no_argument
, NULL
, 'c' },
182 { "alternate-editor", required_argument
, NULL
, 'a' },
183 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
184 { "socket-name", required_argument
, NULL
, 's' },
186 { "server-file", required_argument
, NULL
, 'f' },
187 { "display", required_argument
, NULL
, 'd' },
192 /* Like malloc but get fatal error if memory is exhausted. */
198 long *result
= (long *) malloc (size
);
207 /* Like strdup but get a fatal error if memory is exhausted. */
210 xstrdup (const char *s
)
212 char *result
= strdup (s
);
222 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
224 /* Return the current working directory. Returns NULL on errors.
225 Any other returned value must be freed with free. This is used
226 only when get_current_dir_name is not defined on the system. */
228 get_current_dir_name ()
232 struct stat dotstat
, pwdstat
;
233 /* If PWD is accurate, use it instead of calling getwd. PWD is
234 sometimes a nicer name, and using it may avoid a fatal error if a
235 parent directory is searchable but not readable. */
236 if ((pwd
= getenv ("PWD")) != 0
237 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
238 && stat (pwd
, &pwdstat
) == 0
239 && stat (".", &dotstat
) == 0
240 && dotstat
.st_ino
== pwdstat
.st_ino
241 && dotstat
.st_dev
== pwdstat
.st_dev
243 && strlen (pwd
) < MAXPATHLEN
247 buf
= (char *) xmalloc (strlen (pwd
) + 1);
255 size_t buf_size
= 1024;
256 buf
= (char *) xmalloc (buf_size
);
261 if (getcwd (buf
, buf_size
) == buf
)
265 int tmp_errno
= errno
;
271 buf
= (char *) realloc (buf
, buf_size
);
279 /* We need MAXPATHLEN here. */
280 buf
= (char *) xmalloc (MAXPATHLEN
+ 1);
283 if (getwd (buf
) == NULL
)
285 int tmp_errno
= errno
;
296 /* Message functions. */
302 static int window_app
= -1;
303 char szTitle
[MAX_PATH
];
306 /* Checking for STDOUT does not work; it's a valid handle also in
307 nonconsole apps. Testing for the console title seems to work. */
308 window_app
= (GetConsoleTitleA (szTitle
, MAX_PATH
) == 0);
314 execvp wrapper for Windows. Quotes arguments with embedded spaces.
316 This is necessary due to the broken implementation of exec* routines in
317 the Microsoft libraries: they concatenate the arguments together without
318 quoting special characters, and pass the result to CreateProcess, with
319 predictably bad results. By contrast, Posix execvp passes the arguments
320 directly into the argv array of the child process.
323 w32_execvp (path
, argv
)
329 /* Required to allow a .BAT script as alternate editor. */
330 argv
[0] = (char *) alternate_editor
;
332 for (i
= 0; argv
[i
]; i
++)
333 if (strchr (argv
[i
], ' '))
335 char *quoted
= alloca (strlen (argv
[i
]) + 3);
336 sprintf (quoted
, "\"%s\"", argv
[i
]);
340 return execvp (path
, argv
);
344 #define execvp w32_execvp
346 #endif /* WINDOWSNT */
349 message (int is_error
, char *message
, ...)
354 va_start (args
, message
);
355 vsprintf (msg
, message
, args
);
359 if (w32_window_app ())
362 MessageBox (NULL
, msg
, "Emacsclient ERROR", MB_ICONERROR
);
364 MessageBox (NULL
, msg
, "Emacsclient", MB_ICONINFORMATION
);
369 FILE *f
= is_error
? stderr
: stdout
;
376 /* Decode the options from argv and argc.
377 The global variable `optind' will say how many arguments we used up. */
380 decode_options (argc
, argv
)
384 alternate_editor
= getenv ("ALTERNATE_EDITOR");
385 display
= getenv ("DISPLAY");
386 if (display
&& strlen (display
) == 0)
391 int opt
= getopt_long (argc
, argv
,
392 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
405 /* If getopt returns 0, then it has already processed a
406 long-named option. We should do nothing. */
410 alternate_editor
= optarg
;
413 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
415 socket_name
= optarg
;
420 server_file
= optarg
;
436 message (FALSE
, "emacsclient %s\n", VERSION
);
449 print_help_and_exit ();
453 message (TRUE
, "Try `%s --help' for more information\n", progname
);
461 #if !defined (WINDOWSNT) && !defined (HAVE_CARBON)
466 /* --no-wait implies --current-frame on ttys when there are file
467 arguments or expressions given. */
468 if (nowait
&& tty
&& argc
- optind
> 0)
483 print_help_and_exit ()
485 /* Spaces and tabs are significant in this message; they're chosen so the
486 message aligns properly both in a tty and in a Windows message box.
487 Please try to preserve them; otherwise the output is very hard to read
488 when using emacsclientw. */
490 "Usage: %s [OPTIONS] FILE...\n\
491 Tell the Emacs server to visit the specified files.\n\
492 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
494 The following OPTIONS are accepted:\n\
495 -V, --version Just print version info and return\n\
496 -H, --help Print this usage information message\n\
497 -t, --tty Open a new Emacs frame on the current terminal\n\
498 -c, --current-frame Do not create a new frame;\n\
499 use the current Emacs frame\n\
500 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
501 -n, --no-wait Don't wait for the server to return\n\
502 -d, --display=DISPLAY Visit the file in the given display\n"
503 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
504 "-s, --socket-name=FILENAME\n\
505 Set filename of the UNIX socket for communication\n"
507 "-f, --server-file=FILENAME\n\
508 Set filename of the TCP authentication file\n\
509 -a, --alternate-editor=EDITOR\n\
510 Editor to fallback to if the server is not running\n\
512 Report bugs to bug-gnu-emacs@gnu.org.\n", progname
);
517 Try to run a different command, or --if no alternate editor is
518 defined-- exit with an errorcode.
523 if (alternate_editor
)
527 execvp (alternate_editor
, main_argv
+ i
);
528 message (TRUE
, "%s: error executing alternate editor \"%s\"\n",
529 progname
, alternate_editor
);
535 #if !defined (HAVE_SOCKETS) || !defined (HAVE_INET_SOCKETS)
545 message (TRUE
, "%s: Sorry, the Emacs server is supported only\n"
546 "on systems with Berkeley sockets.\n",
551 #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
554 # include <winsock2.h>
556 # include <sys/types.h>
557 # include <sys/socket.h>
561 #define AUTH_KEY_LENGTH 64
562 #define SEND_BUFFER_SIZE 4096
564 extern char *strerror ();
567 /* Buffer to accumulate data to send in TCP connections. */
568 char send_buffer
[SEND_BUFFER_SIZE
+ 1];
569 int sblen
= 0; /* Fill pointer for the send buffer. */
570 /* Socket used to communicate with the Emacs server process. */
571 HSOCKET emacs_socket
= 0;
573 /* Let's send the data to Emacs when either
574 - the data ends in "\n", or
575 - the buffer is full (but this shouldn't happen)
576 Otherwise, we just accumulate it. */
578 send_to_emacs (s
, data
)
584 int dlen
= strlen (data
);
585 if (dlen
+ sblen
>= SEND_BUFFER_SIZE
)
587 int part
= SEND_BUFFER_SIZE
- sblen
;
588 strncpy (&send_buffer
[sblen
], data
, part
);
590 sblen
= SEND_BUFFER_SIZE
;
594 strcpy (&send_buffer
[sblen
], data
);
601 if (sblen
== SEND_BUFFER_SIZE
602 || (sblen
> 0 && send_buffer
[sblen
-1] == '\n'))
604 int sent
= send (s
, send_buffer
, sblen
, 0);
606 strcpy (send_buffer
, &send_buffer
[sent
]);
613 /* In STR, insert a & before each &, each space, each newline, and
614 any initial -. Change spaces to underscores, too, so that the
615 return value never contains a space.
617 Does not change the string. Outputs the result to STREAM. */
619 quote_argument (s
, str
)
623 char *copy
= (char *) xmalloc (strlen (str
) * 2 + 1);
644 if (*p
== '&' || (*p
== '-' && p
== str
))
651 send_to_emacs (s
, copy
);
657 /* The inverse of quote_argument. Removes quoting in string STR by
658 modifying the string in place. Returns STR. */
661 unquote_argument (str
)
693 file_name_absolute_p (filename
)
694 const unsigned char *filename
;
696 /* Sanity check, it shouldn't happen. */
697 if (! filename
) return FALSE
;
699 /* /xxx is always an absolute path. */
700 if (filename
[0] == '/') return TRUE
;
702 /* Empty filenames (which shouldn't happen) are relative. */
703 if (filename
[0] == '\0') return FALSE
;
706 /* X:\xxx is always absolute. */
707 if (isalpha (filename
[0])
708 && filename
[1] == ':' && (filename
[2] == '\\' || filename
[2] == '/'))
711 /* Both \xxx and \\xxx\yyy are absolute. */
712 if (filename
[0] == '\\') return TRUE
;
715 FIXME: There's a corner case not dealt with, "x:y", where:
717 1) x is a valid drive designation (usually a letter in the A-Z range)
718 and y is a path, relative to the current directory on drive x. This
719 is absolute, *after* fixing the y part to include the current
722 2) x is a relative file name, and y is an NTFS stream name. This is a
723 correct relative path, but it is very unusual.
725 The trouble is that first case items are also valid examples of the
726 second case, i.e., "c:test" can be understood as drive:path or as
729 The "right" fix would involve checking whether
730 - the current drive/partition is NTFS,
731 - x is a valid (and accesible) drive designator,
732 - x:y already exists as a file:stream in the current directory,
733 - y already exists on the current directory of drive x,
734 - the auspices are favorable,
735 and then taking an "informed decision" based on the above.
737 Whatever the result, Emacs currently does a very bad job of dealing
738 with NTFS file:streams: it cannot visit them, and the only way to
739 create one is by setting `buffer-file-name' to point to it (either
740 manually or with emacsclient). So perhaps resorting to 1) and ignoring
741 2) for now is the right thing to do.
743 Anyway, something to decide After the Release.
751 /* Wrapper to make WSACleanup a cdecl, as required by atexit. */
753 __cdecl
close_winsock ()
758 /* Initialize the WinSock2 library. */
760 initialize_sockets ()
764 if (WSAStartup (MAKEWORD (2, 0), &wsaData
))
766 message (TRUE
, "%s: error initializing WinSock2", progname
);
770 atexit (close_winsock
);
772 #endif /* WINDOWSNT */
776 * Read the information needed to set up a TCP comm channel with
777 * the Emacs server: host, port, pid and authentication string.
780 get_server_config (server
, authentication
)
781 struct sockaddr_in
*server
;
782 char *authentication
;
789 if (file_name_absolute_p (server_file
))
790 config
= fopen (server_file
, "rb");
793 char *home
= getenv ("HOME");
797 char *path
= alloca (32 + strlen (home
) + strlen (server_file
));
798 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
799 config
= fopen (path
, "rb");
802 if (!config
&& (home
= getenv ("APPDATA")))
804 char *path
= alloca (32 + strlen (home
) + strlen (server_file
));
805 sprintf (path
, "%s/.emacs.d/server/%s", home
, server_file
);
806 config
= fopen (path
, "rb");
814 if (fgets (dotted
, sizeof dotted
, config
)
815 && (port
= strchr (dotted
, ':'))
816 && (pid
= strchr (port
, ' ')))
823 message (TRUE
, "%s: invalid configuration info", progname
);
827 server
->sin_family
= AF_INET
;
828 server
->sin_addr
.s_addr
= inet_addr (dotted
);
829 server
->sin_port
= htons (atoi (port
));
831 if (! fread (authentication
, AUTH_KEY_LENGTH
, 1, config
))
833 message (TRUE
, "%s: cannot read authentication info", progname
);
839 emacs_pid
= atoi (pid
);
848 struct sockaddr_in server
;
849 struct linger l_arg
= {1, 1};
850 char auth_string
[AUTH_KEY_LENGTH
+ 1];
852 if (! get_server_config (&server
, auth_string
))
853 return INVALID_SOCKET
;
855 if (server
.sin_addr
.s_addr
!= inet_addr ("127.0.0.1"))
856 message (FALSE
, "%s: connected to remote socket at %s\n",
857 progname
, inet_ntoa (server
.sin_addr
));
860 * Open up an AF_INET socket
862 if ((s
= socket (AF_INET
, SOCK_STREAM
, IPPROTO_TCP
)) < 0)
864 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
865 return INVALID_SOCKET
;
871 if (connect (s
, (struct sockaddr
*) &server
, sizeof server
) < 0)
873 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
874 return INVALID_SOCKET
;
877 setsockopt (s
, SOL_SOCKET
, SO_LINGER
, (char *) &l_arg
, sizeof l_arg
);
880 * Send the authentication
882 auth_string
[AUTH_KEY_LENGTH
] = '\0';
884 send_to_emacs (s
, "-auth ");
885 send_to_emacs (s
, auth_string
);
886 send_to_emacs (s
, "\n");
892 /* Returns 1 if PREFIX is a prefix of STRING. */
894 strprefix (char *prefix
, char *string
)
903 for (i
= 0; prefix
[i
]; i
++)
904 if (!string
[i
] || string
[i
] != prefix
[i
])
910 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
912 /* Three possibilities:
913 2 - can't be `stat'ed (sets errno)
914 1 - isn't owned by us
915 0 - success: none of the above */
918 socket_status (socket_name
)
923 if (stat (socket_name
, &statbfr
) == -1)
926 if (statbfr
.st_uid
!= geteuid ())
933 /* A signal handler that passes the signal to the Emacs process.
934 Useful for SIGWINCH. */
937 pass_signal_to_emacs (int signalnum
)
939 int old_errno
= errno
;
942 kill (emacs_pid
, signalnum
);
944 signal (signalnum
, pass_signal_to_emacs
);
948 /* Signal handler for SIGCONT; notify the Emacs process that it can
949 now resume our tty frame. */
952 handle_sigcont (int signalnum
)
954 int old_errno
= errno
;
956 if (tcgetpgrp (1) == getpgrp ())
958 /* We are in the foreground. */
959 send_to_emacs (emacs_socket
, "-resume \n");
963 /* We are in the background; cancel the continue. */
964 kill (getpid (), SIGSTOP
);
967 signal (signalnum
, handle_sigcont
);
971 /* Signal handler for SIGTSTP; notify the Emacs process that we are
972 going to sleep. Normally the suspend is initiated by Emacs via
973 server-handle-suspend-tty, but if the server gets out of sync with
974 reality, we may get a SIGTSTP on C-z. Handling this signal and
975 notifying Emacs about it should get things under control again. */
978 handle_sigtstp (int signalnum
)
980 int old_errno
= errno
;
984 send_to_emacs (emacs_socket
, "-suspend \n");
986 /* Unblock this signal and call the default handler by temprarily
987 changing the handler and resignalling. */
988 sigprocmask (SIG_BLOCK
, NULL
, &set
);
989 sigdelset (&set
, signalnum
);
990 signal (signalnum
, SIG_DFL
);
991 kill (getpid (), signalnum
);
992 sigprocmask (SIG_SETMASK
, &set
, NULL
); /* Let's the above signal through. */
993 signal (signalnum
, handle_sigtstp
);
997 /* Set up signal handlers before opening a frame on the current tty. */
1002 /* Set up signal handlers. */
1003 signal (SIGWINCH
, pass_signal_to_emacs
);
1005 /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of
1006 deciding which terminal the signal came from. C-g is now a
1007 normal input event on secondary terminals. */
1009 signal (SIGINT
, pass_signal_to_emacs
);
1010 signal (SIGQUIT
, pass_signal_to_emacs
);
1013 signal (SIGCONT
, handle_sigcont
);
1014 signal (SIGTSTP
, handle_sigtstp
);
1015 signal (SIGTTOU
, handle_sigtstp
);
1023 struct sockaddr_un server
;
1026 * Open up an AF_UNIX socket in this person's home directory
1029 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
1031 message (TRUE
, "%s: socket: %s\n", progname
, strerror (errno
));
1032 return INVALID_SOCKET
;
1035 server
.sun_family
= AF_UNIX
;
1038 int sock_status
= 0;
1039 int default_sock
= !socket_name
;
1040 int saved_errno
= 0;
1042 char *server_name
= "server";
1044 if (socket_name
&& !index (socket_name
, '/') && !index (socket_name
, '\\'))
1045 { /* socket_name is a file name component. */
1046 server_name
= socket_name
;
1048 default_sock
= 1; /* Try both UIDs. */
1053 socket_name
= alloca (100 + strlen (server_name
));
1054 sprintf (socket_name
, "/tmp/emacs%d/%s",
1055 (int) geteuid (), server_name
);
1058 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1059 strcpy (server
.sun_path
, socket_name
);
1062 message (TRUE
, "%s: socket-name %s too long",
1063 progname
, socket_name
);
1067 /* See if the socket exists, and if it's owned by us. */
1068 sock_status
= socket_status (server
.sun_path
);
1069 saved_errno
= errno
;
1070 if (sock_status
&& default_sock
)
1072 /* Failing that, see if LOGNAME or USER exist and differ from
1073 our euid. If so, look for a socket based on the UID
1074 associated with the name. This is reminiscent of the logic
1075 that init_editfns uses to set the global Vuser_full_name. */
1077 char *user_name
= (char *) getenv ("LOGNAME");
1080 user_name
= (char *) getenv ("USER");
1084 struct passwd
*pw
= getpwnam (user_name
);
1086 if (pw
&& (pw
->pw_uid
!= geteuid ()))
1088 /* We're running under su, apparently. */
1089 socket_name
= alloca (100 + strlen (server_name
));
1090 sprintf (socket_name
, "/tmp/emacs%d/%s",
1091 (int) pw
->pw_uid
, server_name
);
1093 if (strlen (socket_name
) < sizeof (server
.sun_path
))
1094 strcpy (server
.sun_path
, socket_name
);
1097 message (TRUE
, "%s: socket-name %s too long",
1098 progname
, socket_name
);
1099 exit (EXIT_FAILURE
);
1102 sock_status
= socket_status (server
.sun_path
);
1103 saved_errno
= errno
;
1106 errno
= saved_errno
;
1110 switch (sock_status
)
1113 /* There's a socket, but it isn't owned by us. This is OK if
1115 if (0 != geteuid ())
1117 message (TRUE
, "%s: Invalid socket owner\n", progname
);
1118 return INVALID_SOCKET
;
1124 if (saved_errno
== ENOENT
)
1126 "%s: can't find socket; have you started the server?\n\
1127 To start the server in Emacs, type \"M-x server-start\".\n",
1130 message (TRUE
, "%s: can't stat %s: %s\n",
1131 progname
, server
.sun_path
, strerror (saved_errno
));
1132 return INVALID_SOCKET
;
1136 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
1139 message (TRUE
, "%s: connect: %s\n", progname
, strerror (errno
));
1140 return INVALID_SOCKET
;
1145 #endif /* ! NO_SOCKETS_IN_FILE_SYSTEM */
1154 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1155 /* Explicit --socket-name argument. */
1158 s
= set_local_socket ();
1159 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1161 message (TRUE
, "%s: error accessing socket \"%s\"",
1162 progname
, socket_name
);
1163 exit (EXIT_FAILURE
);
1167 /* Explicit --server-file arg or EMACS_SERVER_FILE variable. */
1169 server_file
= getenv ("EMACS_SERVER_FILE");
1173 s
= set_tcp_socket ();
1174 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1177 message (TRUE
, "%s: error accessing server file \"%s\"",
1178 progname
, server_file
);
1179 exit (EXIT_FAILURE
);
1182 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1183 /* Implicit local socket. */
1184 s
= set_local_socket ();
1185 if (s
!= INVALID_SOCKET
)
1189 /* Implicit server file. */
1190 server_file
= "server";
1191 s
= set_tcp_socket ();
1192 if ((s
!= INVALID_SOCKET
) || alternate_editor
)
1195 /* No implicit or explicit socket, and no alternate editor. */
1196 message (TRUE
, "%s: No socket or alternate editor. Please use:\n\n"
1197 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
1200 "\t--server-file (or environment variable EMACS_SERVER_FILE)\n\
1201 \t--alternate-editor (or environment variable ALTERNATE_EDITOR)\n",
1203 exit (EXIT_FAILURE
);
1207 FARPROC set_fg
; /* Pointer to AllowSetForegroundWindow. */
1208 FARPROC get_wc
; /* Pointer to RealGetWindowClassA. */
1211 w32_find_emacs_process (hWnd
, lParam
)
1218 /* Reject any window not of class "Emacs". */
1219 if (! get_wc (hWnd
, class, sizeof (class))
1220 || strcmp (class, "Emacs"))
1223 /* We only need the process id, not the thread id. */
1224 (void) GetWindowThreadProcessId (hWnd
, &pid
);
1226 /* Not the one we're looking for. */
1227 if (pid
!= (DWORD
) emacs_pid
) return TRUE
;
1229 /* OK, let's raise it. */
1232 /* Stop enumeration. */
1237 * Search for a window of class "Emacs" and owned by a process with
1238 * process id = emacs_pid. If found, allow it to grab the focus.
1245 /* It shouldn't happen when dealing with TCP sockets. */
1246 if (!emacs_pid
) return;
1248 if (!(hUser32
= LoadLibrary ("user32.dll"))) return;
1250 /* Modern Windows restrict which processes can set the foreground window.
1251 emacsclient can allow Emacs to grab the focus by calling the function
1252 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1253 NT) lack this function, so we have to check its availability. */
1254 if ((set_fg
= GetProcAddress (hUser32
, "AllowSetForegroundWindow"))
1255 && (get_wc
= GetProcAddress (hUser32
, "RealGetWindowClassA")))
1256 EnumWindows (w32_find_emacs_process
, (LPARAM
) 0);
1258 FreeLibrary (hUser32
);
1267 int i
, rl
, needlf
= 0;
1269 char string
[BUFSIZ
+1];
1275 /* Process options. */
1276 decode_options (argc
, argv
);
1278 if ((argc
- optind
< 1) && !eval
&& !tty
&& !window_system
)
1280 message (TRUE
, "%s: file name or argument required\n"
1281 "Try `%s --help' for more information\n",
1282 progname
, progname
);
1283 exit (EXIT_FAILURE
);
1286 if ((emacs_socket
= set_socket ()) == INVALID_SOCKET
)
1290 cwd
= get_current_dir_name ();
1293 /* getwd puts message in STRING if it fails. */
1294 message (TRUE
, "%s: %s\n", progname
,
1295 "Cannot get current working directory");
1303 /* First of all, send our version number for verification. */
1304 send_to_emacs (emacs_socket
, "-version ");
1305 send_to_emacs (emacs_socket
, VERSION
);
1306 send_to_emacs (emacs_socket
, " ");
1308 /* Send over our environment. */
1311 extern char **environ
;
1313 for (i
= 0; environ
[i
]; i
++)
1315 char *name
= xstrdup (environ
[i
]);
1316 char *value
= strchr (name
, '=');
1317 send_to_emacs (emacs_socket
, "-env ");
1318 quote_argument (emacs_socket
, environ
[i
]);
1319 send_to_emacs (emacs_socket
, " ");
1323 /* Send over our current directory. */
1326 send_to_emacs (emacs_socket
, "-dir ");
1327 quote_argument (emacs_socket
, cwd
);
1328 send_to_emacs (emacs_socket
, "/");
1329 send_to_emacs (emacs_socket
, " ");
1334 send_to_emacs (emacs_socket
, "-nowait ");
1337 send_to_emacs (emacs_socket
, "-current-frame ");
1341 send_to_emacs (emacs_socket
, "-display ");
1342 quote_argument (emacs_socket
, display
);
1343 send_to_emacs (emacs_socket
, " ");
1348 char *type
= getenv ("TERM");
1349 char *tty_name
= NULL
;
1351 tty_name
= ttyname (fileno (stdin
));
1356 message (TRUE
, "%s: could not get terminal name\n", progname
);
1362 message (TRUE
, "%s: please set the TERM variable to your terminal type\n",
1367 if (! strcmp (type
, "eterm"))
1369 /* This causes nasty, MULTI_KBOARD-related input lockouts. */
1370 message (TRUE
, "%s: opening a frame in an Emacs term buffer"
1371 " is not supported\n", progname
);
1374 #if !defined (NO_SOCKETS_IN_FILE_SYSTEM)
1378 send_to_emacs (emacs_socket
, "-tty ");
1379 quote_argument (emacs_socket
, tty_name
);
1380 send_to_emacs (emacs_socket
, " ");
1381 quote_argument (emacs_socket
, type
);
1382 send_to_emacs (emacs_socket
, " ");
1386 send_to_emacs (emacs_socket
, "-window-system ");
1388 if ((argc
- optind
> 0))
1390 for (i
= optind
; i
< argc
; i
++)
1396 /* Don't prepend cwd or anything like that. */
1397 send_to_emacs (emacs_socket
, "-eval ");
1398 quote_argument (emacs_socket
, argv
[i
]);
1399 send_to_emacs (emacs_socket
, " ");
1403 if (*argv
[i
] == '+')
1405 char *p
= argv
[i
] + 1;
1406 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1409 send_to_emacs (emacs_socket
, "-position ");
1410 quote_argument (emacs_socket
, argv
[i
]);
1411 send_to_emacs (emacs_socket
, " ");
1417 else if (! file_name_absolute_p (argv
[i
]))
1420 send_to_emacs (emacs_socket
, "-file ");
1423 quote_argument (emacs_socket
, cwd
);
1424 send_to_emacs (emacs_socket
, "/");
1426 quote_argument (emacs_socket
, argv
[i
]);
1427 send_to_emacs (emacs_socket
, " ");
1432 if (!tty
&& !window_system
)
1434 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1437 send_to_emacs (emacs_socket
, "-eval ");
1439 send_to_emacs (emacs_socket
, "-file ");
1440 quote_argument (emacs_socket
, str
);
1442 send_to_emacs (emacs_socket
, " ");
1446 send_to_emacs (emacs_socket
, "\n");
1448 /* Wait for an answer. */
1449 if (!eval
&& !tty
&& !nowait
)
1451 printf ("Waiting for Emacs...");
1457 /* Now, wait for an answer and print any messages. */
1458 while ((rl
= recv (emacs_socket
, string
, BUFSIZ
, 0)) > 0)
1463 p
= string
+ strlen (string
) - 1;
1464 while (p
> string
&& *p
== '\n')
1467 if (strprefix ("-good-version ", string
))
1469 /* -good-version: The versions match. */
1471 else if (strprefix ("-emacs-pid ", string
))
1473 /* -emacs-pid PID: The process id of the Emacs process. */
1474 emacs_pid
= strtol (string
+ strlen ("-emacs-pid"), NULL
, 10);
1476 else if (strprefix ("-window-system-unsupported ", string
))
1478 /* -window-system-unsupported: Emacs was compiled without X
1479 support. Try again on the terminal. */
1485 else if (strprefix ("-print ", string
))
1487 /* -print STRING: Print STRING on the terminal. */
1488 str
= unquote_argument (string
+ strlen ("-print "));
1492 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1494 else if (strprefix ("-error ", string
))
1496 /* -error DESCRIPTION: Signal an error on the terminal. */
1497 str
= unquote_argument (string
+ strlen ("-error "));
1500 fprintf (stderr
, "*ERROR*: %s", str
);
1501 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1504 else if (strprefix ("-suspend ", string
))
1506 /* -suspend: Suspend this terminal, i.e., stop the process. */
1515 /* Unknown command. */
1518 printf ("*ERROR*: Unknown message: %s", string
);
1519 needlf
= string
[0] == '\0' ? needlf
: string
[strlen (string
) - 1] != '\n';
1528 CLOSE_SOCKET (emacs_socket
);
1529 return EXIT_SUCCESS
;
1532 #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */
1535 #ifndef HAVE_STRERROR
1540 extern char *sys_errlist
[];
1541 extern int sys_nerr
;
1543 if (errnum
>= 0 && errnum
< sys_nerr
)
1544 return sys_errlist
[errnum
];
1545 return (char *) "Unknown error";
1548 #endif /* ! HAVE_STRERROR */
1550 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1551 (do not change this comment) */
1553 /* emacsclient.c ends here */