1 /* Client process that communicates with GNU Emacs acting as server.
2 Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003
3 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 2, 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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
45 /****************************************/
50 #ifndef INCLUDED_FCNTL
51 #define INCLUDED_FCNTL
60 #endif /* not HAVE_TERMIOS */
62 #ifdef __GNU_LIBRARY__
63 #include <sys/ioctl.h>
67 #if (defined (POSIX) || defined (NEED_UNISTD_H)) && defined (HAVE_UNISTD_H)
73 /* Try to establish the correct character to disable terminal functions
74 in a system-independent manner. Note that USG (at least) define
75 _POSIX_VDISABLE as 0! */
77 #ifdef _POSIX_VDISABLE
78 #define CDISABLE _POSIX_VDISABLE
79 #else /* not _POSIX_VDISABLE */
86 #endif /* not _POSIX_VDISABLE */
90 /****************************************/
92 char *getenv (), *getwd ();
95 /* This is defined with -D from the compilation command,
96 which extracts it from ../lisp/version.el. */
99 #define VERSION "unspecified"
102 /* Name used to invoke this program. */
105 /* The first argument to main. */
108 /* The second argument to main. */
111 /* Nonzero means don't wait for a response from Emacs. --no-wait. */
114 /* Nonzero means args are expressions to be evaluated. --eval. */
117 /* The display on which Emacs should work. --display. */
118 char *display
= NULL
;
120 /* Nonzero means open a new Emacs frame on the current terminal. */
123 /* If non-NULL, the name of an editor to fallback to if the server
124 is not running. --alternate-editor. */
125 const char * alternate_editor
= NULL
;
127 /* If non-NULL, the filename of the UNIX socket. */
128 char *socket_name
= NULL
;
130 void print_help_and_exit ();
132 struct option longopts
[] =
134 { "no-wait", no_argument
, NULL
, 'n' },
135 { "eval", no_argument
, NULL
, 'e' },
136 { "help", no_argument
, NULL
, 'H' },
137 { "version", no_argument
, NULL
, 'V' },
138 { "here", no_argument
, NULL
, 'h' },
139 { "alternate-editor", required_argument
, NULL
, 'a' },
140 { "socket-name", required_argument
, NULL
, 's' },
141 { "display", required_argument
, NULL
, 'd' },
145 /* Decode the options from argv and argc.
146 The global variable `optind' will say how many arguments we used up. */
149 decode_options (argc
, argv
)
155 int opt
= getopt_long (argc
, argv
,
156 "VHnea:s:d:h", longopts
, 0);
161 alternate_editor
= getenv ("ALTERNATE_EDITOR");
166 /* If getopt returns 0, then it has already processed a
167 long-named option. We should do nothing. */
171 alternate_editor
= optarg
;
175 socket_name
= optarg
;
191 printf ("emacsclient %s\n", VERSION
);
200 print_help_and_exit ();
204 fprintf (stderr
, "Try `%s --help' for more information\n", progname
);
218 print_help_and_exit ()
221 "Usage: %s [OPTIONS] FILE...\n\
222 Tell the Emacs server to visit the specified files.\n\
223 Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\
225 The following OPTIONS are accepted:\n\
226 -V, --version Just print a version info and return\n\
227 -H, --help Print this usage information message\n\
228 -h, --here Open a new Emacs frame on the current terminal\n\
229 -n, --no-wait Don't wait for the server to return\n\
230 -e, --eval Evaluate the FILE arguments as ELisp expressions\n\
231 -d, --display=DISPLAY Visit the file in the given display\n\
232 -s, --socket-name=FILENAME\n\
233 Set the filename of the UNIX socket for communication\n\
234 -a, --alternate-editor=EDITOR\n\
235 Editor to fallback to if the server is not running\n\
237 Report bugs to bug-gnu-emacs@gnu.org.\n", progname
);
241 /* In NAME, insert a & before each &, each space, each newline, and
242 any initial -. Change spaces to underscores, too, so that the
243 return value never contains a space. */
246 quote_file_name (name
, stream
)
250 char *copy
= (char *) malloc (strlen (name
) * 2 + 1);
271 if (*p
== '&' || (*p
== '-' && p
== name
))
278 fprintf (stream
, copy
);
283 /* Like malloc but get fatal error if memory is exhausted. */
289 long *result
= (long *) malloc (size
);
299 Try to run a different command, or --if no alternate editor is
300 defined-- exit with an errorcode.
305 if (alternate_editor
)
308 execvp (alternate_editor
, main_argv
+ i
);
320 /* Adapted from emacs_get_tty() in sysdep.c. */
322 ec_get_tty (int fd
, struct termios
*settings
)
324 bzero (settings
, sizeof (struct termios
));
325 if (tcgetattr (fd
, settings
) < 0)
330 /* Adapted from emacs_set_tty() in sysdep.c. */
332 ec_set_tty (int fd
, struct termios
*settings
, int flushp
)
334 /* Set the primary parameters - baud rate, character size, etcetera. */
337 /* We have those nifty POSIX tcmumbleattr functions.
338 William J. Smith <wjs@wiis.wang.com> writes:
339 "POSIX 1003.1 defines tcsetattr to return success if it was
340 able to perform any of the requested actions, even if some
341 of the requested actions could not be performed.
342 We must read settings back to ensure tty setup properly.
343 AIX requires this to keep tty from hanging occasionally." */
344 /* This make sure that we don't loop indefinitely in here. */
345 for (i
= 0 ; i
< 10 ; i
++)
346 if (tcsetattr (fd
, flushp
? TCSAFLUSH
: TCSADRAIN
, settings
) < 0)
357 bzero (&new, sizeof (new));
358 /* Get the current settings, and see if they're what we asked for. */
359 tcgetattr (fd
, &new);
360 /* We cannot use memcmp on the whole structure here because under
361 * aix386 the termios structure has some reserved field that may
364 if ( new.c_iflag
== settings
->c_iflag
365 && new.c_oflag
== settings
->c_oflag
366 && new.c_cflag
== settings
->c_cflag
367 && new.c_lflag
== settings
->c_lflag
368 && memcmp (new.c_cc
, settings
->c_cc
, NCCS
) == 0)
379 struct termios old_tty
;
384 int flow_control
= 0;
389 /* Adapted from init_sys_modes() in sysdep.c. */
395 fprintf (stderr
, "%s: Input is not a terminal", "init_tty");
399 ec_get_tty (0, &old_tty
);
403 tty_erase_char
= old_tty
.c_cc
[VERASE
];
405 tty
.c_iflag
|= (IGNBRK
); /* Ignore break condition */
406 tty
.c_iflag
&= ~ICRNL
; /* Disable map of CR to NL on input */
408 tty
.c_iflag
&= ~INLCR
; /* Disable map of NL to CR on input */
411 tty
.c_iflag
&= ~ISTRIP
; /* don't strip 8th bit on input */
413 tty
.c_lflag
&= ~ECHO
; /* Disable echo */
414 tty
.c_lflag
&= ~ICANON
; /* Disable erase/kill processing */
416 tty
.c_lflag
&= ~IEXTEN
; /* Disable other editing characters. */
418 tty
.c_lflag
|= ISIG
; /* Enable signals */
421 tty
.c_iflag
|= IXON
; /* Enable start/stop output control */
423 tty
.c_iflag
&= ~IXANY
;
427 tty
.c_iflag
&= ~IXON
; /* Disable start/stop output control */
428 tty
.c_oflag
&= ~ONLCR
; /* Disable map of NL to CR-NL
430 tty
.c_oflag
&= ~TAB3
; /* Disable tab expansion */
434 tty
.c_cflag
|= CS8
; /* allow 8th bit on input */
435 tty
.c_cflag
&= ~PARENB
; /* Don't check parity */
438 tty
.c_cc
[VINTR
] = CDISABLE
;
439 tty
.c_cc
[VQUIT
] = CDISABLE
;
440 tty
.c_cc
[VMIN
] = 1; /* Input should wait for at least 1 char */
441 tty
.c_cc
[VTIME
] = 0; /* no matter how long that takes. */
443 tty
.c_cc
[VSWTCH
] = CDISABLE
; /* Turn off shell layering use of C-z */
447 tty
.c_cc
[VSUSP
] = CDISABLE
; /* Turn off mips handling of C-z. */
450 tty
.c_cc
[V_DSUSP
] = CDISABLE
; /* Turn off mips handling of C-y. */
452 #ifdef VDSUSP /* Some systems have VDSUSP, some have V_DSUSP. */
453 tty
.c_cc
[VDSUSP
] = CDISABLE
;
456 tty
.c_cc
[VLNEXT
] = CDISABLE
;
459 tty
.c_cc
[VREPRINT
] = CDISABLE
;
460 #endif /* VREPRINT */
462 tty
.c_cc
[VWERASE
] = CDISABLE
;
465 tty
.c_cc
[VDISCARD
] = CDISABLE
;
466 #endif /* VDISCARD */
471 tty
.c_cc
[VSTART
] = '\021';
474 tty
.c_cc
[VSTOP
] = '\023';
480 tty
.c_cc
[VSTART
] = CDISABLE
;
483 tty
.c_cc
[VSTOP
] = CDISABLE
;
487 #ifdef SET_LINE_DISCIPLINE
488 /* Need to explicitly request TERMIODISC line discipline or
489 Ultrix's termios does not work correctly. */
490 tty
.c_line
= SET_LINE_DISCIPLINE
;
495 /* AIX enhanced edit loses NULs, so disable it. */
497 tty
.c_iflag
&= ~ASCEDIT
;
499 tty
.c_cc
[VSTRT
] = 255;
500 tty
.c_cc
[VSTOP
] = 255;
501 tty
.c_cc
[VSUSP
] = 255;
502 tty
.c_cc
[VDSUSP
] = 255;
503 #endif /* IBMR2AIX */
507 tty
.c_cc
[VSTART
] = '\021';
510 tty
.c_cc
[VSTOP
] = '\023';
513 /* Also, PTY overloads NUL and BREAK.
514 don't ignore break, but don't signal either, so it looks like NUL.
515 This really serves a purpose only if running in an XTERM window
516 or via TELNET or the like, but does no harm elsewhere. */
517 tty
.c_iflag
&= ~IGNBRK
;
518 tty
.c_iflag
&= ~BRKINT
;
521 ec_set_tty (0, &tty
, 0);
523 /* This code added to insure that, if flow-control is not to be used,
524 we have an unlocked terminal at the start. */
527 if (!flow_control
) ioctl (0, TCXONC
, 1);
531 if (!flow_control
) ioctl (0, TIOCSTART
, 0);
535 #if defined (HAVE_TERMIOS) || defined (HPUX9)
537 if (!flow_control
) tcflow (0, TCOON
);
542 /* This symbol is defined on recent USG systems.
543 Someone says without this call USG won't really buffer the file
544 even with a call to setbuf. */
545 setvbuf (stdout
, (char *) _sobuf
, _IOFBF
, sizeof _sobuf
);
547 setbuf (stdout
, (char *) _sobuf
);
556 int width
= 0, height
= 0;
563 if (ioctl (0, TIOCGWINSZ
, &size
) == -1)
568 height
= size
.ws_row
;
577 if (ioctl (0, TIOCGSIZE
, &size
) == -1)
581 width
= size
.ts_cols
;
582 height
= size
.ts_lines
;
585 #endif /* not SunOS-style */
586 #endif /* not BSD-style */
592 size
.ws_row
= height
;
595 ioctl (master
, TIOCSWINSZ
, &size
);
602 size
.ts_lines
= height
;
603 size
.ts_cols
= width
;
605 ioctl (master
, TIOCGSIZE
, &size
);
607 #endif /* not SunOS-style */
608 #endif /* not BSD-style */
610 if (emacs_pid
&& width
&& height
)
611 kill (emacs_pid
, SIGWINCH
);
614 int in_conversation
= 0;
615 int quit_conversation
= 0;
618 hang_up_signal (int signalnum
)
620 int old_errno
= errno
;
622 if (! in_conversation
)
625 quit_conversation
= 1;
631 window_change_signal (int signalnum
)
633 int old_errno
= errno
;
635 if (! in_conversation
)
641 signal (SIGWINCH
, window_change_signal
);
648 /* Set up signal handlers. */
649 signal (SIGWINCH
, window_change_signal
);
650 signal (SIGHUP
, hang_up_signal
);
657 /* Adapted from reset_sys_modes in sysdep.c. */
664 /* Avoid possible loss of output when changing terminal modes. */
665 fsync (fileno (stdout
));
671 fcntl (0, F_SETFL
, fcntl (0, F_GETFL
, 0) & ~O_NDELAY
);
676 while (ec_set_tty (0, &old_tty
, 0) < 0 && errno
== EINTR
)
690 if (grantpt (master
) < 0 || unlockpt (master
) < 0)
692 pty_name
= strdup (ptsname (master
));
696 /* Propagate window size. */
707 copy_from_to (int in
, int out
, int sigio
)
709 static char buf
[BUFSIZ
];
710 int nread
= read (in
, &buf
, BUFSIZ
);
713 else if (nread
< 0 && errno
!= EAGAIN
)
714 return 0; /* Error */
721 r
= write (out
, &buf
, nread
);
722 } while ((r
< 0 && errno
== EAGAIN
)
723 || (r
> 0 && (written
+= r
) && written
!= nread
));
726 return 0; /* Error */
728 if (emacs_pid
&& sigio
)
730 kill (emacs_pid
, SIGIO
);
737 pty_conversation (FILE *in
)
745 while (! quit_conversation
) {
749 FD_SET (master
, &set
);
751 FD_SET (fileno (in
), &set
);
752 res
= select (FD_SETSIZE
, &set
, NULL
, NULL
, NULL
);
760 if (FD_ISSET (master
, &set
))
762 /* Copy Emacs output to stdout. */
763 if (! copy_from_to (master
, 0, 0))
766 if (FD_ISSET (1, &set
))
768 /* Forward user input to Emacs. */
769 if (! copy_from_to (1, master
, 1))
772 if (FD_ISSET (fileno (in
), &set
))
776 /* Get the pid of the Emacs process.
777 XXX Is there is some nifty libc/kernel feature for doing this?
779 str
= fgets (string
, BUFSIZ
, in
);
783 fprintf (stderr
, "%s: %s\n", progname
, str
);
787 emacs_pid
= atoi (str
);
795 #endif /* HAVE_TERMIOS */
798 #if !defined (HAVE_SOCKETS) || defined (NO_SOCKETS_IN_FILE_SYSTEM)
805 fprintf (stderr
, "%s: Sorry, the Emacs server is supported only\n",
807 fprintf (stderr
, "on systems with Berkeley sockets.\n");
812 #else /* HAVE_SOCKETS */
814 #include <sys/types.h>
815 #include <sys/socket.h>
817 #include <sys/stat.h>
820 extern char *strerror ();
823 /* Three possibilities:
824 2 - can't be `stat'ed (sets errno)
825 1 - isn't owned by us
826 0 - success: none of the above */
829 socket_status (socket_name
)
834 if (stat (socket_name
, &statbfr
) == -1)
837 if (statbfr
.st_uid
!= geteuid ())
849 int system_name_length
;
850 int s
, i
, needlf
= 0;
852 struct sockaddr_un server
;
860 /* Process options. */
861 decode_options (argc
, argv
);
863 if ((argc
- optind
< 1) && !eval
&& !here
)
865 fprintf (stderr
, "%s: file name or argument required\n", progname
);
866 fprintf (stderr
, "Try `%s --help' for more information\n", progname
);
871 * Open up an AF_UNIX socket in this person's home directory
874 if ((s
= socket (AF_UNIX
, SOCK_STREAM
, 0)) < 0)
876 fprintf (stderr
, "%s: ", argv
[0]);
881 server
.sun_family
= AF_UNIX
;
885 system_name_length
= 32;
889 system_name
= (char *) xmalloc (system_name_length
+ 1);
891 /* system_name must be null-terminated string. */
892 system_name
[system_name_length
] = '\0';
894 if (gethostname (system_name
, system_name_length
) == 0)
898 system_name_length
*= 2;
901 /* We always use the non-dotted host name, for simplicity. */
902 dot
= index (system_name
, '.');
912 socket_name
= alloca (system_name_length
+ 100);
913 sprintf (socket_name
, "/tmp/emacs%d-%s/server",
914 (int) geteuid (), system_name
);
917 if (strlen (socket_name
) < sizeof (server
.sun_path
))
918 strcpy (server
.sun_path
, socket_name
);
920 fprintf (stderr
, "%s: socket-name %s too long",
921 argv
[0], socket_name
);
923 /* See if the socket exists, and if it's owned by us. */
924 sock_status
= socket_status (server
.sun_path
);
927 /* Failing that, see if LOGNAME or USER exist and differ from
928 our euid. If so, look for a socket based on the UID
929 associated with the name. This is reminiscent of the logic
930 that init_editfns uses to set the global Vuser_full_name. */
932 char *user_name
= (char *) getenv ("LOGNAME");
934 user_name
= (char *) getenv ("USER");
938 struct passwd
*pw
= getpwnam (user_name
);
939 if (pw
&& (pw
->pw_uid
!= geteuid ()))
941 /* We're running under su, apparently. */
942 sprintf (server
.sun_path
, "/tmp/esrv%d-%s",
943 (int) pw
->pw_uid
, system_name
);
944 sock_status
= socket_status (server
.sun_path
);
952 /* There's a socket, but it isn't owned by us. This is OK if
956 fprintf (stderr
, "%s: Invalid socket owner\n", argv
[0]);
965 "%s: can't find socket; have you started the server?\n\
966 To start the server in Emacs, type \"M-x server-start\".\n",
969 fprintf (stderr
, "%s: can't stat %s: %s\n",
970 argv
[0], server
.sun_path
, strerror (errno
));
976 if (connect (s
, (struct sockaddr
*) &server
, strlen (server
.sun_path
) + 2)
979 fprintf (stderr
, "%s: ", argv
[0]);
984 /* We use the stream OUT to send our command to the server. */
985 if ((out
= fdopen (s
, "r+")) == NULL
)
987 fprintf (stderr
, "%s: ", argv
[0]);
992 /* We use the stream IN to read the response.
993 We used to use just one stream for both output and input
994 on the socket, but reversing direction works nonportably:
995 on some systems, the output appears as the first input;
996 on other systems it does not. */
997 if ((in
= fdopen (s
, "r+")) == NULL
)
999 fprintf (stderr
, "%s: ", argv
[0]);
1005 cwd
= getcwd (string
, sizeof string
);
1007 cwd
= getwd (string
);
1011 /* getwd puts message in STRING if it fails. */
1014 fprintf (stderr
, "%s: %s (%s)\n", argv
[0],
1015 "Cannot get current working directory", strerror (errno
));
1017 fprintf (stderr
, "%s: %s (%s)\n", argv
[0], string
, strerror (errno
));
1023 fprintf (out
, "-nowait ");
1026 fprintf (out
, "-eval ");
1030 fprintf (out
, "-display ");
1031 quote_file_name (display
, out
);
1037 if (! init_signals ())
1039 fprintf (stderr
, "%s: ", argv
[0]);
1047 fprintf (stderr
, "%s: ", argv
[0]);
1055 fprintf (stderr
, "%s: ", argv
[0]);
1060 fprintf (out
, "-pty ");
1061 quote_file_name (pty_name
, out
);
1063 quote_file_name (getenv("TERM"), out
);
1067 if ((argc
- optind
> 0))
1069 for (i
= optind
; i
< argc
; i
++)
1072 ; /* Don't prepend any cwd or anything like that. */
1073 else if (*argv
[i
] == '+')
1075 char *p
= argv
[i
] + 1;
1076 while (isdigit ((unsigned char) *p
) || *p
== ':') p
++;
1079 quote_file_name (cwd
, out
);
1083 else if (*argv
[i
] != '/')
1085 quote_file_name (cwd
, out
);
1089 quote_file_name (argv
[i
], out
);
1097 while ((str
= fgets (string
, BUFSIZ
, stdin
)))
1099 quote_file_name (str
, out
);
1105 fprintf (out
, "\n");
1108 /* Maybe wait for an answer. */
1117 if (! pty_conversation (out
))
1120 fprintf (stderr
, "%s: ", argv
[0]);
1131 printf ("Waiting for Emacs...");
1136 /* Now, wait for an answer and print any messages. */
1137 while ((str
= fgets (string
, BUFSIZ
, in
)))
1142 needlf
= str
[0] == '\0' ? needlf
: str
[strlen (str
) - 1] != '\n';
1153 #endif /* HAVE_SOCKETS */
1155 #ifndef HAVE_STRERROR
1160 extern char *sys_errlist
[];
1161 extern int sys_nerr
;
1163 if (errnum
>= 0 && errnum
< sys_nerr
)
1164 return sys_errlist
[errnum
];
1165 return (char *) "Unknown error";
1168 #endif /* ! HAVE_STRERROR */
1170 /* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
1171 (do not change this comment) */