diff options
Diffstat (limited to 'lib-src')
-rw-r--r-- | lib-src/b2m.pl | 2 | ||||
-rw-r--r-- | lib-src/emacsclient.c | 171 | ||||
-rwxr-xr-x | lib-src/rcs2log | 2 | ||||
-rwxr-xr-x | lib-src/vcdiff | 2 |
4 files changed, 142 insertions, 35 deletions
diff --git a/lib-src/b2m.pl b/lib-src/b2m.pl index 38eb96e076f..ce547e0dd81 100644 --- a/lib-src/b2m.pl +++ b/lib-src/b2m.pl @@ -30,7 +30,7 @@ use Mail::Address; use Date::Parse; my($whoami) = basename $0; -my($version) = '$Revision: 1.5 $'; +my($version) = '$Revision: 1.6 $'; my($usage) = "Usage: $whoami [--help] [--version] [--[no]full-headers] [Babyl-file] \tBy default, full headers are printed.\n"; diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index 9f8eb04011a..356784ae45c 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -41,6 +41,10 @@ Boston, MA 02111-1307, USA. */ # include <pwd.h> #endif /* not VMS */ +#include <signal.h> +#include <errno.h> + + char *getenv (), *getwd (); char *getcwd (); @@ -54,6 +58,12 @@ char *getcwd (); /* Name used to invoke this program. */ char *progname; +/* The first argument to main. */ +int main_argc; + +/* The second argument to main. */ +char **main_argv; + /* Nonzero means don't wait for a response from Emacs. --no-wait. */ int nowait = 0; @@ -63,6 +73,9 @@ int eval = 0; /* The display on which Emacs should work. --display. */ char *display = NULL; +/* Nonzero means open a new Emacs frame on the current terminal. */ +int frame = 0; + /* If non-NULL, the name of an editor to fallback to if the server is not running. --alternate-editor. */ const char * alternate_editor = NULL; @@ -78,6 +91,7 @@ struct option longopts[] = { "eval", no_argument, NULL, 'e' }, { "help", no_argument, NULL, 'H' }, { "version", no_argument, NULL, 'V' }, + { "tty", no_argument, NULL, 't' }, { "alternate-editor", required_argument, NULL, 'a' }, { "socket-name", required_argument, NULL, 's' }, { "display", required_argument, NULL, 'd' }, @@ -95,7 +109,7 @@ decode_options (argc, argv) while (1) { int opt = getopt_long (argc, argv, - "VHnea:s:d:", longopts, 0); + "VHnea:s:d:t", longopts, 0); if (opt == EOF) break; @@ -134,6 +148,10 @@ decode_options (argc, argv) exit (0); break; + case 't': + frame = 1; + break; + case 'H': print_help_and_exit (); break; @@ -144,6 +162,12 @@ decode_options (argc, argv) break; } } + + if (frame) { + nowait = 0; + display = 0; + } + } void @@ -157,6 +181,7 @@ Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\ The following OPTIONS are accepted:\n\ -V, --version Just print a version info and return\n\ -H, --help Print this usage information message\n\ +-t, --tty Open a new Emacs frame on the current terminal\n\ -n, --no-wait Don't wait for the server to return\n\ -e, --eval Evaluate the FILE arguments as ELisp expressions\n\ -d, --display=DISPLAY Visit the file in the given display\n\ @@ -231,14 +256,12 @@ xmalloc (size) defined-- exit with an errorcode. */ void -fail (argc, argv) - int argc; - char **argv; +fail (void) { if (alternate_editor) { int i = optind - 1; - execvp (alternate_editor, argv + i); + execvp (alternate_editor, main_argv + i); return; } else @@ -247,6 +270,38 @@ fail (argc, argv) } } +int emacs_pid; + +#ifdef nec_ews_svr4 +extern char *_sobuf ; +#else +#if defined (USG) || defined (DGUX) +unsigned char _sobuf[BUFSIZ+8]; +#else +char _sobuf[BUFSIZ]; +#endif +#endif + +SIGTYPE +pass_signal_to_emacs (int signalnum) +{ + int old_errno = errno; + + if (emacs_pid) + kill (emacs_pid, signalnum); + + signal (signalnum, pass_signal_to_emacs); + errno = old_errno; +} + +void +init_signals (void) +{ + /* Set up signal handlers. */ + signal (SIGWINCH, pass_signal_to_emacs); + signal (SIGINT, pass_signal_to_emacs); + signal (SIGQUIT, pass_signal_to_emacs); +} #if !defined (HAVE_SOCKETS) || defined (NO_SOCKETS_IN_FILE_SYSTEM) @@ -260,7 +315,7 @@ main (argc, argv) argv[0]); fprintf (stderr, "on systems with Berkeley sockets.\n"); - fail (argc, argv); + fail (); } #else /* HAVE_SOCKETS */ @@ -294,6 +349,23 @@ socket_status (socket_name) return 0; } +/* Returns 1 if PREFIX is a prefix of STRING. */ +static int +strprefix (char *prefix, char *string) +{ + int i; + if (! prefix) + return 1; + + if (!string) + return 0; + + for (i = 0; prefix[i]; i++) + if (!string[i] || string[i] != prefix[i]) + return 0; + return 1; +} + int main (argc, argv) int argc; @@ -307,12 +379,14 @@ main (argc, argv) char *cwd, *str; char string[BUFSIZ]; + main_argc = argc; + main_argv = argv; progname = argv[0]; /* Process options. */ decode_options (argc, argv); - if ((argc - optind < 1) && !eval) + if ((argc - optind < 1) && !eval && !frame) { fprintf (stderr, "%s: file name or argument required\n", progname); fprintf (stderr, "Try `%s --help' for more information\n", progname); @@ -327,7 +401,7 @@ main (argc, argv) { fprintf (stderr, "%s: ", argv[0]); perror ("socket"); - fail (argc, argv); + fail (); } server.sun_family = AF_UNIX; @@ -358,8 +432,8 @@ main (argc, argv) { int sock_status = 0; - int saved_errno; - + int saved_errno = 0; + if (! socket_name) { socket_name = alloca (system_name_length + 100); @@ -370,8 +444,11 @@ main (argc, argv) if (strlen (socket_name) < sizeof (server.sun_path)) strcpy (server.sun_path, socket_name); else - fprintf (stderr, "%s: socket-name %s too long", - argv[0], socket_name); + { + fprintf (stderr, "%s: socket-name %s too long", + argv[0], socket_name); + fail (); + } /* See if the socket exists, and if it's owned by us. */ sock_status = socket_status (server.sun_path); @@ -396,7 +473,7 @@ main (argc, argv) sprintf (server.sun_path, "/tmp/emacs%d-%s/server", (int) pw->pw_uid, system_name); sock_status = socket_status (server.sun_path); - saved_errno = errno; + saved_errno = errno; } } } @@ -409,7 +486,7 @@ main (argc, argv) if (0 != geteuid ()) { fprintf (stderr, "%s: Invalid socket owner\n", argv[0]); - fail (argc, argv); + fail (); } break; @@ -417,13 +494,13 @@ main (argc, argv) /* `stat' failed */ if (saved_errno == ENOENT) fprintf (stderr, - "%s: can't find socket; have you started the server?\n\ + "%s: Can't find socket; have you started the server?\n\ To start the server in Emacs, type \"M-x server-start\".\n", argv[0]); else - fprintf (stderr, "%s: can't stat %s: %s\n", + fprintf (stderr, "%s: Can't stat %s: %s\n", argv[0], server.sun_path, strerror (saved_errno)); - fail (argc, argv); + fail (); break; } } @@ -433,7 +510,7 @@ To start the server in Emacs, type \"M-x server-start\".\n", { fprintf (stderr, "%s: ", argv[0]); perror ("connect"); - fail (argc, argv); + fail (); } /* We use the stream OUT to send our command to the server. */ @@ -441,7 +518,7 @@ To start the server in Emacs, type \"M-x server-start\".\n", { fprintf (stderr, "%s: ", argv[0]); perror ("fdopen"); - fail (argc, argv); + fail (); } /* We use the stream IN to read the response. @@ -453,7 +530,7 @@ To start the server in Emacs, type \"M-x server-start\".\n", { fprintf (stderr, "%s: ", argv[0]); perror ("fdopen"); - fail (argc, argv); + fail (); } #ifdef HAVE_GETCWD @@ -471,7 +548,7 @@ To start the server in Emacs, type \"M-x server-start\".\n", #else fprintf (stderr, "%s: %s (%s)\n", argv[0], string, strerror (errno)); #endif - fail (argc, argv); + fail (); } if (nowait) @@ -487,6 +564,21 @@ To start the server in Emacs, type \"M-x server-start\".\n", fprintf (out, " "); } + if (frame) + { + char *tty_name = ttyname (fileno (stdin)); + if (! tty_name) + fail (); + + init_signals (); + + fprintf (out, "-tty "); + quote_file_name (tty_name, out); + fprintf (out, " "); + quote_file_name (getenv("TERM"), out); + fprintf (out, " "); + } + if ((argc - optind > 0)) { for (i = optind; i < argc; i++) @@ -515,11 +607,14 @@ To start the server in Emacs, type \"M-x server-start\".\n", } else { - while ((str = fgets (string, BUFSIZ, stdin))) - { - quote_file_name (str, out); - } - fprintf (out, " "); + if (!frame) + { + while ((str = fgets (string, BUFSIZ, stdin))) + { + quote_file_name (str, out); + } + fprintf (out, " "); + } } fprintf (out, "\n"); @@ -527,9 +622,11 @@ To start the server in Emacs, type \"M-x server-start\".\n", /* Maybe wait for an answer. */ if (nowait) - return 0; + { + return 0; + } - if (!eval) + if (!eval && !frame) { printf ("Waiting for Emacs..."); needlf = 2; @@ -539,10 +636,20 @@ To start the server in Emacs, type \"M-x server-start\".\n", /* Now, wait for an answer and print any messages. */ while ((str = fgets (string, BUFSIZ, in))) { - if (needlf == 2) - printf ("\n"); - printf ("%s", str); - needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n'; + if (frame) + { + if (strprefix ("emacs-pid ", str)) + { + emacs_pid = strtol (string + strlen ("emacs-pid"), NULL, 10); + } + } + else + { + if (needlf == 2) + printf ("\n"); + printf ("%s", str); + needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n'; + } } if (needlf) diff --git a/lib-src/rcs2log b/lib-src/rcs2log index 9528e6b1d9c..4400fb72578 100755 --- a/lib-src/rcs2log +++ b/lib-src/rcs2log @@ -29,7 +29,7 @@ Options: Report bugs to <bug-gnu-emacs@gnu.org>.' -Id='$Id: rcs2log,v 1.51 2003/09/01 15:45:03 miles Exp $' +Id='$Id: rcs2log,v 1.52 2003/12/27 08:18:08 uid65632 Exp $' # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2002, 2003 # Free Software Foundation, Inc. diff --git a/lib-src/vcdiff b/lib-src/vcdiff index 32c4e5ba89e..9e52a7f4c30 100755 --- a/lib-src/vcdiff +++ b/lib-src/vcdiff @@ -23,7 +23,7 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # -# $Id: vcdiff,v 1.7 2001/02/20 12:36:28 gerd Exp $ +# $Id: vcdiff,v 1.8 2003/09/01 15:45:03 miles Exp $ # DIFF="diff" |