diff options
Diffstat (limited to 'lib-src')
-rw-r--r-- | lib-src/.gitignore | 1 | ||||
-rw-r--r-- | lib-src/ChangeLog | 543 | ||||
-rw-r--r-- | lib-src/Makefile.in | 38 | ||||
-rw-r--r-- | lib-src/ebrowse.c | 5 | ||||
-rw-r--r-- | lib-src/emacsclient.c | 849 | ||||
-rw-r--r-- | lib-src/emacstool.c | 504 | ||||
-rw-r--r-- | lib-src/etags.c | 110 | ||||
-rw-r--r-- | lib-src/fakemail.c | 1 | ||||
-rw-r--r-- | lib-src/make-docfile.c | 5 | ||||
-rw-r--r-- | lib-src/makefile.w32-in | 102 | ||||
-rw-r--r-- | lib-src/movemail.c | 17 | ||||
-rw-r--r-- | lib-src/pop.c | 67 |
12 files changed, 1240 insertions, 1002 deletions
diff --git a/lib-src/.gitignore b/lib-src/.gitignore index 157ce12c972..67ce7f736b5 100644 --- a/lib-src/.gitignore +++ b/lib-src/.gitignore @@ -14,6 +14,7 @@ hexl make-docfile movemail obj +oo profile sorted-doc test-distrib diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 089d979381b..1f8cd9ac696 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,54 +1,186 @@ +2008-03-04 Juanma Barranquero <lekktu@gmail.com> + + * .cvsignore: Add oo. + 2008-02-27 Yuri Shtil <yuris@juniper.net> (tiny change) * etags.c (Perl_functions): Fix call to skip_spaces. +2008-02-24 Dan Nicolaescu <dann@ics.uci.edu> + + * Makefile.in (NO_SHORTNAMES): + * emacsclient.c (NO_SHORTNAMES): + * fakemail.c (NO_SHORTNAMES): + * make-docfile.c (NO_SHORTNAMES): + * movemail.c (NO_SHORTNAMES): + * pop.c (NO_SHORTNAMES): Remove references to obsolete variable. + +2008-02-23 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in (MOUSE_SUPPORT): Remove duplicate tooltip.elc. + (MSDOS_SUPPORT, VMS_SUPPORT): Remove. + (OTHER_PLATFORM_SUPPORT): Replace above. Add X specific files too. + (lisp2): Add new languages. + ($(DOC)): Use OTHER_PLATFORM_SUPPORT. + +2008-02-22 Juanma Barranquero <lekktu@gmail.com> + + * makefile.w32-in (lisp2): Remove devanagari.el, kannada.el, + malayalam.el, and tamil.el. Add sinhala.el. + +2008-02-20 Juanma Barranquero <lekktu@gmail.com> + + * emacsclient.c (main) [WINDOWSNT]: Understand DRIVE:NAME, + where NAME is relative to DRIVE'S current directory. + +2008-02-15 Juanma Barranquero <lekktu@gmail.com> + + * emacsclient.c (print_help_and_exit): Show -d option on Windows. + +2008-02-10 Dan Nicolaescu <dann@ics.uci.edu> + + * fakemail.c: Undo previous change. + +2008-02-09 Dan Nicolaescu <dann@ics.uci.edu> + + * fakemail.c (MAIL_PROGRAM_NAME): Remove unused conditional. + (main): Replace MAIL_PROGRAM_NAME with its value. + + * Makefile.in (REGEXP_IN_LIBC): Remove reference to obsolete variable. + +2008-02-08 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacsclient.c (decode_options): Pass --display implicitly if -c + is specified. Only set tty if -t or -c is specified. + +2008-02-04 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in (lisp1): Use (), not {}. + +2008-02-04 Tom Tromey <tromey@redhat.com> + + * etags.c: Add "GTY" as synonym for __attribute__. + Update gperf output. + +2008-02-01 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in (obj): Sync with src/Makefile.in + (TOOLTIP_SUPPORT, WINDOW_SUPPORT): New definitions. + (WINNT_SUPPORT): Add term/w32-win.elc. + (lisp1, lisp2): Sync with lisp in src/Makefile.in. + +2008-02-01 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in (obj): Add font.o and w32font.o. + +2008-02-01 Zhang Wei <id.brep@gmail.com> (tiny change) + + * makefile.w32-in (lisp1): Delete ucs-tables.elc, + utf-8.elc, and latin-*.el. + +2008-01-26 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacsclient.c (decode_options): Default to NULL display, as Emacs-22. + Allow the -d option under w32 again, for those rare cases where it + actually does make sense. + +2008-01-25 Juanma Barranquero <lekktu@gmail.com> + + * emacsclient.c (set_tcp_socket): Don't send "\n" after + the authentication string; there's no need to haste. + 2008-01-22 Chong Yidong <cyd@stupidchicken.com> * pop.c (pop_stat, pop_last): Fix last fix. +2008-01-18 Dan Nicolaescu <dann@ics.uci.edu> + + * movemail.c: Remove references to XENIX. + +2008-01-13 Dan Nicolaescu <dann@ics.uci.edu> + + * movemail.c: + * make-docfile.c: Remove reference to symbols defined by systems + not supported anymore: MAC_OS8, XENIX and STRIDE. + +2008-01-12 Eli Zaretskii <eliz@gnu.org> + + * emacsclient.c (decode_options) [WINDOWSNT]: Don't use the value + of DISPLAY in the environment. Don't support -d. + (print_help_and_exit) [WINDOWSNT]: Don't show the --display option. + (longopts) [WINDOWSNT]: Remove --display. + 2008-01-10 Chong Yidong <cyd@stupidchicken.com> * pop.c (pop_stat, pop_last): Check validity of string-to-integer conversion. Mistakes spotted by Nico Golde. +2008-01-09 Glenn Morris <rgm@gnu.org> + + * emacsclient.c: Add missing final newlines to message calls. + +2008-01-09 Daniel Hackney <dan@haxney.org> (tiny change) + + * emacsclient.c (set_socket): Add final newline to socket error message. + 2008-01-04 Glenn Morris <rgm@gnu.org> - * ebrowse.c (version): Just use current year for short copyright; - update to 2008. + * ebrowse.c (version) <emacs_copyright>: New variable. + Just use current year for copyright. * etags.c (print_version): - * rcs2log (Copyright): Update copyright to 2008. + * rcs2log (Copyright): Update to 2008. + +2007-11-28 Jason Rumney <jasonr@gnu.org> + + * makefile.w32-in (VMS_SUPPORT): No longer byte-compiled. + +2007-11-27 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * pop.c (socket_connection): Remove AI_ADDRCONFIG. + +2007-11-19 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * pop.c (socket_connection): Move realhost out of #ifdefs. + Set realhost both for HAVE_GETADDRINFO and !HAVE_GETADDRINFO. + +2007-11-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * pop.c (socket_connection): Use getaddrinfo if available. 2007-11-22 Francesco Potort,Al(B <pot@gnu.org> - * etags.c (default_C_help) [CTAGS]: differentiate the help string, + * etags.c (default_C_help) [CTAGS]: Differentiate the help string, as the defaults in ctags are different from etags. - (default_C_help, Cplusplus_help, PHP_help, print_help): - Remove text saying --members is the default: not true in Emacs 22. 2007-11-15 Francesco Potort,Al(B <pot@gnu.org> - * etags.c: (C_entries): In case '}' decrement bracelev before - testing it. + * etags.c: Make prototypes for extern definitions, and add all + that are needed to quench warnings on 64-bit. + (main): Use the same defaults for ctags as for etags: find + typedefs, structure tags, macro constants, enum constants, struct + members and global variables. + (make_C_tag) [DEBUG]: Add debugging printout. + (C_entries): In case '}' decrement bracelev before testing it. 2007-11-15 Masatake YAMATO <jet@gyve.org> * etags.c (C_entries): In case '}', set fvdef to fvnone unconditioned to (!ignoreindent && lp == newlb.buffer + 1). -2007-11-15 Francesco Potort,Al(B <pot@gnu.org> +2007-11-01 Dan Nicolaescu <dann@ics.uci.edu> - * etags.c: (C_entries): Reset the fvdef machine when out of function. - (C_entries): Parse start of C comment as a space == end of token. - This is not necessary for C++ comment, already parsed as newline. + * makefile.w32-in (obj): Remove sunfns.o. + +2007-10-28 Juanma Barranquero <lekktu@gmail.com> + + * makefile.w32-in (obj): Remove abbrev.o. 2007-10-26 Juanma Barranquero <lekktu@gmail.com> * emacsclient.c: Add a wrapper for getenv so it also checks the registry on Windows. Suggestion and algorithm by Eli Zaretskii. Code partially based on w32_get_resource and init_environment (w32.c). - (xmalloc): New function by K,Aa(Broly L$,1 q(Brentey (backported from the trunk). - (quote_file_name): Use it. (egetenv): New wrapper for getenv. (get_current_dir_name, decode_options, get_server_config) (set_local_socket, set_socket, main): Use egetenv, not getenv. @@ -59,12 +191,106 @@ * emacsclient.c (sock_err_message): New function. (set_tcp_socket): Use it. +2007-10-09 Juanma Barranquero <lekktu@gmail.com> + + * emacsclient.c (print_help_and_exit): Fix space to improve + alignment in output messages. + 2007-09-27 Jason Rumney <jasonr@gnu.org> * makefile.w32-in (emacsclient, emacsclientw): Link to COMCTL32. * emacsclient.c (w32_window_app): Init common controls when windowed. +2007-09-21 Glenn Morris <rgm@gnu.org> + + * emacstool.c: Remove file. + * Makefile.in (emacstool, nemacstool, xvetool, xveterm): + Delete targets built from emacstool. + +2007-09-21 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacsclient.c (decode_options): -t implies -c. + +2007-09-20 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacsclient.c (DIRECTORY_SEP, IS_DIRECTORY_SEP, IS_DEVICE_SEP) + (IS_ANY_SEP): Only define if !defined(HAVE_GET_CURRENT_DIR_NAME). + (main_argc): Remove. + (strprefix): Use strncmp. + +2007-09-20 Jason Rumney <jasonr@gnu.org> + + * emacsclient.c (main) [SIGSTOP]: Change conditional from WINDOWSNT. + +2007-09-20 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacsclient.c (current_frame): Change the default. + (longopts): Replace --current-frame by --create-frame. + (decode_options): Reverse the meaning of -c. + (print_help_and_exit): Update help text accordingly. + (main): Remove the -version and -good-version messages. + +2007-09-12 Glenn Morris <rgm@gnu.org> + + * Makefile.in (SOURCES, unlock, relock): Delete. + +2007-08-29 Glenn Morris <rgm@gnu.org> + + * makefile.w32-in (VERSION): Increase to 23.0.50. + +2007-08-29 Dan Nicolaescu <dann@ics.uci.edu> + + * emacsclient.c (w32_execvp): Move definition before use. + (decode_options): Don't use a tty on mac carbon or windows. + +2007-08-29 Jason Rumney <jasonr@gnu.org> + + * emacsclient.c (SEND_STRING, SEND_QUOTED): Remove obfuscation macros. + (quote_argument, set_tcp_socket, handle_sigcont, handle_sigtstp): + (main): Expand removed macros inline. + (main) [WINDOWSNT]: Don't call ttyname. Don't recognize -suspend + option. + (main) [NO_SOCKETS_IN_FILE_SYSTEM]: Don't call init_signals. + +2007-08-29 K,Aa(Broly L$,1 q(Brentey <lorentey@elte.hu> + + * emacsclient.c (signal.h): New include. + (sys/stat.h, errno.h): Always include, even on WINDOWSNT. + (DIRECTORY_SEP, IS_DIRECTORY_SEP, IS_DEVICE_SEP, IS_ANY_SEP): + Copy definitions here from src/lisp.h. + (main_argc, main_argv, current_frame, window_system, tty): New vars. + (longopts): Add tty, current-frame. + (xmalloc, xstrdup): New functions. + (get_current_dir_name): New function, copied from src/sysdep.c. + (decode_options): Set display from environment. Add tty and + current_frame options. Make --no-wait imply --current-frame, + except when it is the only option given. Make sure no frame is + opened when --current-frame is set. + (print_help_and_exit): Document tty and current-frame options. + (fail): Change arguments to void. + (main): When sockets are not defined, set main_argc, main_argv, + and call fail() with no arguments. + (emacs_socket): New variable (moved out from main `s'). + (quote_file_name): Rename to quote_argument. + (quote_argument): New name for old quote_file_name. + (unquote_argument, strprefix, pass_signal_to_emacs) + (handle_sigcont, handle_sigtstp, init_signals): New functions. + (set_local_socket): Initialize saved_errno to 0. If socket-name + is too long, call `fail' rather than `exit'. + (main): Doc update. Set main_argc, main_argv. New var `str'. + Don't need a filename or argument if tty or window_system set. + Call fail with no arguments. Use get_current_dir_name to send + over the current directory. Send version number to Emacs for + verification. If tty is set, check TERM, and pass name and type + to Emacs. Pass window_system to Emacs. Move sending of eval to + optind loop. Send -position, -file to Emacs. Call fsync after + fflush. Check for a client/server version match. + Handle -emacs-pid, -window-system-unsupported, -print, -error, and + -suspend commands. Don't exit prematurely on --no-wait, let Emacs + close the connection for us. When creating a new frame, send + environment and pwd to Emacs. Send current-frame to Emacs. + 2007-08-25 Eli Zaretskii <eliz@gnu.org> * Makefile.in (rcs2log, rcs-checkin, grep-changelog, vcdiff): @@ -77,10 +303,34 @@ * COPYING: Switch to GPLv3. -2007-07-20 Eli Zaretskii <eliz@gnu.org> +2007-07-17 Francesco Potort,Al(B <pot@gnu.org> + + * etags.c (C_entries): Reset the fvdef machine when out of function. + (PRINT_UNDOCUMENTED_OPTIONS_HELP): #define as FALSE if undefined. + (print_help): Use it in if() rather than #if. + (print_help): Conditionally print help about --no-line-directive. + +2007-07-16 Eli Zaretskii <eliz@gnu.org> * makefile.w32-in (clean): Don't delete *~. +2007-06-07 Glenn Morris <rgm@gnu.org> + + * etags.c (print_version): Add `emacs_copyright' string, for + easier automatic updating. + +2007-05-18 Francesco Potort,Al(B <pot@gnu.org> + + * etags.c: Extern definitions of some more pointer functions for + standalone compilation, especially important for 64bit platforms. + (main, print_help): --members is now the default for etags. + (C_entries): Parse start of C comment as a space == end of token. + This is not necessary for C++ comment, already parsed as newline. + +2007-04-26 Glenn Morris <rgm@gnu.org> + + * makefile.w32-in (VERSION): Increase to 22.1.50. + 2007-06-02 Chong Yidong <cyd@stupidchicken.com> * Version 22.1 released. @@ -359,8 +609,7 @@ suggest using options to make them explicit. (AUTH_KEY_LENGTH, SEND_BUFFER_SIZE): New constants. (send_buffer, sblen): New variables. - (send_to_emacs): New function to buffer output and send it with - send(). + (send_to_emacs): New function to buffer output and send it with `send'. (quote_file_name): Use SEND_STRING. (close_winsock, initialize_sockets): New functions to load and unload Winsock. @@ -466,8 +715,8 @@ 2006-05-23 Francesco Potort,Al(B <pot@gnu.org> - * pop.c (pop_open, socket_connection, KPOP_SERVICE): Added - comments explaining why the "kpop" service is never used. + * pop.c (pop_open, socket_connection, KPOP_SERVICE): + Add comments explaining why the "kpop" service is never used. 2006-05-13 Eli Zaretskii <eliz@gnu.org> @@ -575,7 +824,7 @@ * makefile.w32-in (../src/config.h): Don't overwrite. Print a message instead. - (../src/paths.h): Removed. + (../src/paths.h): Remove. 2005-07-27 Juanma Barranquero <lekktu@gmail.com> @@ -856,7 +1105,7 @@ 2003-09-10 Richard M. Stallman <rms@gnu.org> - * emacsclient.c (main): Use socket_name. + * emacsclient.c (main): Use socket_name. 2003-09-10 Andreas B,A|(Bsching <crunchy@tzi.de> (tiny change) @@ -953,7 +1202,7 @@ 2003-01-06 Kim F. Storm <storm@cua.dk> - * pop.c (__P): Renamed from _P to avoid problems on Cygwin. + * pop.c (__P): Rename from _P to avoid problems on Cygwin. All uses changed. 2002-12-18 Andrew Innes <andrewi@gnu.org> @@ -1424,7 +1673,7 @@ (main): Use username field. (read_score): Read it. (push_score): Handle it. - (write_scores) Write it. + (write_scores): Write it. (read_score): Handle arbitrary length data. 2002-03-30 Eli Zaretskii <eliz@is.elta.co.il> @@ -1724,9 +1973,9 @@ 2001-10-10 Jason Rumney <jasonr@gnu.org> - * makefile.w32-in (ALL) Do not include fakemail. + * makefile.w32-in (ALL): Do not include fakemail. - * makefile.nt (install) Ditto. + * makefile.nt (install): Ditto. 2001-10-09 Gerd Moellmann <gerd@gnu.org> @@ -1932,7 +2181,7 @@ [WINDOWSNT]: #undef DOS_NT and #define it even if built with HAVE_CONFIG_H. This change does nothing in Emacs, as DOS_NT is always defined when HAVE_CONFIG_H and WINDOWS are both defined. - [!HAVE_UNISTD_H]: use defined(WINDOWSNT) instead of the bare + [!HAVE_UNISTD_H]: Use defined(WINDOWSNT) instead of the bare WINDOWSNT, as this is the correct way to use it. 2001-01-28 Francesco Potort,Al(B <pot@gnu.org> @@ -1953,7 +2202,7 @@ (consider_token): Automatic set C++ mode. (C_entries): New security check for yacc. (print_language_names, print_help): Mention the autodetect - feature, do not show help for the -C option, now mostly useless. + feature, do not show help for the -C option, now mostly useless. (C_entries): Tag C++ forward declarations if --declarations. (C_entries): Don't be fooled by things like XDEFUN. (consider_token): Discard asm pseudo function. @@ -2028,7 +2277,7 @@ 2001-01-03 Paul Eggert <eggert@twinsun.com> - * lib-src/rcs2log: Avoid security hole allowing attacker to + * rcs2log: Avoid security hole allowing attacker to cause user of rcs2log to overwrite arbitrary files, fixing a bug reported by Morten Welinder. @@ -2479,12 +2728,12 @@ * etags.c (suggest_asking_for_help): Provide a meaningful help message with and without LONG_OPTIONS. - * etags.c: <io.h> [MSDOS]: Include it, don't include string.h. + * etags.c (<io.h>) [MSDOS]: Include it, don't include string.h. <stdlib.h, string.h>: Don't test MSDOS when including them. (white, nonam, endtk): Like elsewhere, use \r instead of \013. (put_entries): Correctly use %ld instead of %d in printf. - * etags.c: <unistd.h> [HAVE_UNISTD_H]: Include conditionally, else + * etags.c (<unistd.h>) [HAVE_UNISTD_H]: Include conditionally, else declare getcwd if HAVE_GETCWD. (consider_token): Dead break instruction removed. @@ -2493,14 +2742,14 @@ Add support for large files. Merge glibc 2.1.2. * b2m.c, emacsclient.c, emacsserver.c, fakemail.c, make-docfile.c, - movemail.c, pop.c: + * movemail.c, pop.c: Do not include <stdlib.h>, as <config.h> does this now. * b2m.c, emacsserver.c, etags.c, profile.c: Include <config.h> before any system include files. * emacsclient.c, emacsserver.c, fakemail.c, movemail.c, pop.c, - test-distrib.c: + * test-distrib.c: (read, write, open, close): Do not undef. * getopt.c, getopt1.c: Adopt glibc 2.1.2, with the following fix: @@ -2681,7 +2930,7 @@ 1998-07-30 Paul Eggert <eggert@twinsun.com> - * lib-src/Makefile.in (REGEXPDEPS, regex.o): + * Makefile.in (REGEXPDEPS, regex.o): Prepend $(srcdir)/ to rule dependencies outside this dir. 1998-06-09 Andrew Innes <andrewi@harlequin.co.uk> @@ -3083,7 +3332,7 @@ 1997-03-14 Francesco Potort,Al(B <F.Potorti@cnuce.cnr.it> - * etags.c (add_regex): reset *putbuf before using it. + * etags.c (add_regex): Reset *putbuf before using it. 1997-02-23 Jonathan I. Kamens <jik@kamens.brookline.ma.us> @@ -3647,7 +3896,7 @@ 1995-12-04 Francesco Potort,Al(B <pot@cnuce.cnr.it> - * Makefile.in (ctags): depend on etags only for simplicity; + * Makefile.in (ctags): Depend on etags only for simplicity; compile with regexp support enabled. 1995-11-24 Richard Stallman <rms@mole.gnu.ai.mit.edu> @@ -3772,13 +4021,13 @@ 1995-06-27 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (plain_C_entries): new function. - (lowcase): new macro. - (tail, Fortran_functions, Pascal_functions): use new macro lowcase. - (lang_suffixes): new suffix ".pc" for Pro*C files. - (consider_token): don't tag all tokens beginning with DEFUN & Co.. - (tail): look for the end of the token when comparing. - (takeprec): since now tail behaves differently, use strneq. + * etags.c (plain_C_entries): New function. + (lowcase): New macro. + (tail, Fortran_functions, Pascal_functions): Use new macro lowcase. + (lang_suffixes): New suffix ".pc" for Pro*C files. + (consider_token): Don't tag all tokens beginning with DEFUN & Co.. + (tail): Look for the end of the token when comparing. + (takeprec): Since now tail behaves differently, use strneq. 1995-07-08 Paul Eggert <eggert@twinsun.com> @@ -3810,13 +4059,13 @@ 1995-06-27 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (plain_C_entries): new function. - (lowcase): new macro. - (tail, Fortran_functions, Pascal_functions): use new macro lowcase. - (lang_suffixes): new suffix ".pc" for Pro*C files. - (consider_token): don't tag all tokens beginning with DEFUN & Co.. - (tail): look for the end of the token when comparing. - (takeprec): since now tail behaves differently, use strneq. + * etags.c (plain_C_entries): New function. + (lowcase): New macro. + (tail, Fortran_functions, Pascal_functions): Use new macro lowcase. + (lang_suffixes): New suffix ".pc" for Pro*C files. + (consider_token): Don't tag all tokens beginning with DEFUN & Co.. + (tail): Look for the end of the token when comparing. + (takeprec): Since now tail behaves differently, use strneq. 1995-06-26 Richard Stallman <rms@mole.gnu.ai.mit.edu> @@ -3980,7 +4229,7 @@ * rcs2log: Add -u "login<tab>fullname<tab>mailaddr" option, which replaces the (now obsolescent) -n login fullname mailaddr option. Add -R option for recursive rlog. - (AWK): New environment variable (default `awk') for awk program name. + (AWK): New environment variable (default `awk') for awk program name. (output_authors, tab, loginFullnameMailaddrs, recursive): New vars. Quote authors and fullnames correctly. Don't omit path from repository root when logging CVS files. @@ -3993,7 +4242,7 @@ 1995-03-13 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (process_file): free (filename) after using it. + * etags.c (process_file): Free (filename) after using it. (readline_internal): Do not access the char before start of line. 1995-02-22 Francesco Potort,Al(B (pot@cnuce.cnr.it) @@ -4126,8 +4375,8 @@ 1994-11-22 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (print_help): print --regex usage for ctags also. - (main): use -h in addition to -H as abbreviation for --help. + * etags.c (print_help): Print --regex usage for ctags also. + (main): Use -h in addition to -H as abbreviation for --help. 1994-11-16 Francesco Potort,Al(B (pot@cnuce.cnr.it) @@ -4192,9 +4441,9 @@ 1994-10-21 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (prestr, substr): return a logical type. + * etags.c (prestr, substr): Return a logical type. (consider_token): Comment out "EXFUN". Use "DEFUN" instead of "DEF". - (consider_token): set funcdef to fignore when a DEFUN is met. + (consider_token): Set funcdef to fignore when a DEFUN is met. (C_entries): Now we can use Tom Hageman patch for extern "C". 1994-10-20 Richard Stallman <rms@mole.gnu.ai.mit.edu> @@ -4277,8 +4526,8 @@ 1994-10-17 Francesco Potort,Al(B (pot@fly.cnuce.cnr.it) - * Makefile.in.in (etags): add dependency on regex.o, link with it. - (REGEXPOBJ, REGEXPDEPS, regex.o): target and macros added. + * Makefile.in.in (etags): Add dependency on regex.o, link with it. + (REGEXPOBJ, REGEXPDEPS, regex.o): Target and macros added. 1994-10-12 David J. MacKenzie (djm@duality.gnu.ai.mit.edu) @@ -4428,7 +4677,7 @@ 1994-07-08 Dave Love (d.love@dl.ac.uk) - * etags.c (takeprec): recognise `character*(*) function' + * etags.c (takeprec): Recognise `character*(*) function'. 1994-07-08 Francesco Potort,Al(B (pot@cnuce.cnr.it) @@ -4576,11 +4825,11 @@ 1994-04-18 Francesco Potort,Al(B (pot@fly.cnuce.cnr.it) - * etags.c (main, print_help): eliminate the -F option. + * etags.c (main, print_help): Eliminate the -F option. 1994-04-18 Francesco Potort,Al(B (pot@fly.cnuce.cnr.it) - * etags.c (absolute_filename): compare against '\0' instead of NULL. + * etags.c (absolute_filename): Compare against '\0' instead of NULL. 1994-04-16 Richard Stallman (rms@mole.gnu.ai.mit.edu) @@ -4614,21 +4863,21 @@ 1994-04-08 Francesco Potort,Al(B (pot@fly.cnuce.cnr.it) - * etags.c (outf, outfiledir): renamed to tagf, tagfiledir. - (PF_funcs, Asm_funcs, L_funcs, PAS_funcs, TEX_funcs, - Scheme_funcs, prolog_funcs): renamed to Fortran_functions, + * etags.c (outf, outfiledir): Renamed to tagf, tagfiledir. + (PF_funcs, Asm_funcs, L_funcs, PAS_funcs, TEX_funcs) + (Scheme_funcs, prolog_funcs): Renamed to Fortran_functions, Asm_labels, Lisp_functions, Pascal_functions, Scheme_functions, TeX_functions, Prolog_functions. - (inf): no more a global variable. - (C_entries): take 2nd parameter `inf' instead of using the global one. - (find_entries): added the cp1 var for optimisation. - (find_entries): added more suffixes for assembler files. + (inf): No more a global variable. + (C_entries): Take 2nd parameter `inf' instead of using the global one. + (find_entries): Added the cp1 var for optimisation. + (find_entries): Added more suffixes for assembler files. (Asm_funcs): Now finds labels even without an ending colon. 1994-03-30 Francesco Potort,Al(B (pot@fly.cnuce.cnr.it) - * etags.c (main): use etags_getcwd for compatibility. - (etags_getcwd): new function. + * etags.c (main): Use etags_getcwd for compatibility. + (etags_getcwd): New function. 1994-03-25 Richard Stallman (rms@mole.gnu.ai.mit.edu) @@ -4636,22 +4885,22 @@ 1994-03-25 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (emacs_tags_format, ETAGS): removed. Use CTAGS instead. - (main): don't allow the use of -t and -T in etags mode. - (print_help): don't show options enabled by default. - (print_version): show the emacs version number if VERSION is #defined. - (find_entries): add "ss" as suffix for Chez Scheme. + * etags.c (emacs_tags_format, ETAGS): Removed. Use CTAGS instead. + (main): Don't allow the use of -t and -T in etags mode. + (print_help): Don't show options enabled by default. + (print_version): Show the emacs version number if VERSION is #defined. + (find_entries): Add "ss" as suffix for Chez Scheme. 1994-03-23 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (cwd, outfiledir): vars added. + * etags.c (cwd, outfiledir): Vars added. (relative_filename, absolute_filename, absolute_dirname): functions added to compute filenames in tags files. - (process_file): filenames in tags file are relative to the + (process_file): Filenames in tags file are relative to the directory where the tags file is (useful with the -o option). - (main): initialise the outfiledir var. - (TYPEDST): added the `tignore' value. - (C_entries): corrected various small bugs. + (main): Initialise the outfiledir var. + (TYPEDST): Added the `tignore' value. + (C_entries): Corrected various small bugs. 1994-03-19 Richard Stallman (rms@mole.gnu.ai.mit.edu) @@ -4666,8 +4915,8 @@ 1994-03-14 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (TYPEDST): added the `tignore' value. - (C_entries): corrected various bugs, now correctly parses the + * etags.c (TYPEDST): Added the `tignore' value. + (C_entries): Corrected various bugs, now correctly parses the `extern "C" {' construction (patch by Tom R.Hageman). 1994-03-05 Richard Stallman (rms@mole.gnu.ai.mit.edu) @@ -4708,7 +4957,7 @@ 1994-02-22 Karl Heuer (kwzh@gnu.ai.mit.edu) * profile.c (get_time): Simplify; avoid calling index. - (main): exit on EOF. + (main): Exit on EOF. 1994-02-17 Francesco Potort,Al(B (pot@cnuce.cnr.it) @@ -4720,11 +4969,11 @@ 1994-02-14 Francesco Potort,Al(B (pot@fly) - * etags.c (absolute_pathnames, cwd): added global vars. - (longopts, print_help, main, process_file): put absolute filenames + * etags.c (absolute_pathnames, cwd): Added global vars. + (longopts, print_help, main, process_file): Put absolute filenames in the tag file if the -A --absolute-pathnames option is used. - (print_help): alfabetically order the options. - (malloc, realloc, strcpy, strncpy, strcmp): remove extern declar. + (print_help): Alfabetically order the options. + (malloc, realloc, strcpy, strncpy, strcmp): Remove extern declar. 1994-02-09 Richard Stallman (rms@mole.gnu.ai.mit.edu) @@ -4753,15 +5002,15 @@ 1994-01-14 Francesco Potort,Al(B (pot@cnuce.cnr.it) * etags.c (stab_entry, stab_create, stab_find, stab_search, - stab_type, add_keyword, C_reate_stab, C_create_stabs): deleted. + stab_type, add_keyword, C_reate_stab, C_create_stabs): Deleted. Use gperf generated hash table instead of linked list. - (C_stab_entry, hash, in_word_set, get_C_stab, C_symtype): added. + (C_stab_entry, hash, in_word_set, get_C_stab, C_symtype): Added. Mostly code generated by gperf. - (consider_token): removed unused parameter `lp'. - (PF_funcs, getit): allow subroutine and similar declarations + (consider_token): Removed unused parameter `lp'. + (PF_funcs, getit): Allow subroutine and similar declarations to span multiple lines. - (C_entries): check for newline if inchar to avoid bus errors. - (process_file, find_entries): distinguish among nonexistent + (C_entries): Check for newline if inchar to avoid bus errors. + (process_file, find_entries): Distinguish among nonexistent and not regular file. 1994-01-14 Richard Stallman (rms@mole.gnu.ai.mit.edu) @@ -4898,14 +5147,14 @@ functions returning a pointer to a function, a la `signal', can be parsed. This also required new state `fstartlist' to `FUNCST'. (SAVE_TOKEN, RESTORE_TOKEN, TOKEN_SAVED_P): 1-deep token save stack. - (C_entries, CNL): use it to isolate preprocessor directive processing + (C_entries, CNL): Use it to isolate preprocessor directive processing from the other state engines. - (begtk): add '~', for C++ class destructors. + (begtk): Add '~', for C++ class destructors. 1993-11-02 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (consider_token): removed unused variable firsttok. - (prolog_getit): call pfnote with the right number of arguments. + * etags.c (consider_token): Removed unused variable firsttok. + (prolog_getit): Call pfnote with the right number of arguments. 1993-10-19 Paul Eggert (eggert@twinsun.com) @@ -4924,9 +5173,9 @@ 1993-10-01 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (process_file): dead code removed. + * etags.c (process_file): Dead code removed. (S_ISREG): #define it using S_IFREG if not defined. - (process_file): regular files have nothing to do with symlinks. + (process_file): Regular files have nothing to do with symlinks. 1993-09-28 Brian Fox (bfox@ai.mit.edu) @@ -5009,10 +5258,10 @@ 1993-08-04 Francesco Potort,Al(B (pot@spiff.gnu.ai.mit.edu) - * etags.c (L_isdef, L_isquote, L_getit): small optimisations. - (L_funcs): the (foo::defmumble stuff now should work. - (consider_token): function returned random value--corrected. - (C_entries): corrected == versus = typo. + * etags.c (L_isdef, L_isquote, L_getit): Small optimisations. + (L_funcs): The (foo::defmumble stuff now should work. + (consider_token): Function returned random value--corrected. + (C_entries): Corrected == versus = typo. 1993-08-01 Roland McGrath (roland@churchy.gnu.ai.mit.edu) @@ -5028,11 +5277,11 @@ * etags.c (FINCST): Added the fignore status. Means we are after the parameter list and before the open curly brace. Allows correct parsing of C++ constructors. - (C_entries, consider_token): make use of fignore. - (consider_token): reset funcdef when next_token_is_func: when in + (C_entries, consider_token): Make use of fignore. + (consider_token): Reset funcdef when next_token_is_func: when in ctags mode makes DEFVAR and others work better. - (L_isquote): function that recognises the "(quote" string. - (L_getit): ignore quoting via "'" or "(quote". Useful for defalias. + (L_isquote): Function that recognises the "(quote" string. + (L_getit): Ignore quoting via "'" or "(quote". Useful for defalias. 1993-07-29 Paul Eggert (eggert@twinsun.com) @@ -5064,20 +5313,20 @@ 1993-07-08 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (alloca): removed all references to it. - (main): now calls xnew instead of alloca for portability. - (../src/config.h): included only if HAVE_CONFIG_H. - (const): void definition removed--config.h takes care of it. + * etags.c (alloca): Removed all references to it. + (main): Now calls xnew instead of alloca for portability. + (../src/config.h): Included only if HAVE_CONFIG_H. + (const): Void definition removed--config.h takes care of it. 1993-07-08 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (consider_token): was `==', now is `='. + * etags.c (consider_token): Was `==', now is `='. (consider_token): DEFUNs now treated like funcs in ctags mode. - * etags.c (LEVEL_OK_FOR_FUNCDEF): removed. - (C_entries): optimized the test that used LEVEL_OK_FOR_FUNCDEF. - (C_entries): removed a piece of useless code. - (C_entries): making typedef tags is delayed until a semicolon + * etags.c (LEVEL_OK_FOR_FUNCDEF): Removed. + (C_entries): Optimized the test that used LEVEL_OK_FOR_FUNCDEF. + (C_entries): Removed a piece of useless code. + (C_entries): Making typedef tags is delayed until a semicolon is met. This handles "typedef int X, Y, Z;" correctly. 1993-07-06 Jim Blandy (jimb@geech.gnu.ai.mit.edu) @@ -5353,38 +5602,38 @@ 1993-03-22 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (YACC): flag added to c_ext. - (c_ext): no more a synonim for c_ext&C_PLPL because of YACC. - (find_entries): consistently use streq when reasonable. - (find_entries): a .y file is a yacc file. + * etags.c (YACC): Flag added to c_ext. + (c_ext): No more a synonim for c_ext&C_PLPL because of YACC. + (find_entries): Consistently use streq when reasonable. + (find_entries): A .y file is a yacc file. (get_C_stab): c_ext becomes c_ext&C_PLPL. - (C_entries): logical cplpl means c_ext&C_PLPL. - (C_entries): logical yacc_rules means we are after the first %%. - (C_entries): added logic for yacc files. + (C_entries): Logical cplpl means c_ext&C_PLPL. + (C_entries): Logical yacc_rules means we are after the first %%. + (C_entries): Added logic for yacc files. 1993-03-16 Francesco Potort,Al(B (pot@cnuce.cnr.it) * etags.c (C_entries): ':' case moved to the second switch. - (C_entries): do not examine token if structdef==scolonseen. + (C_entries): Do not examine token if structdef==scolonseen. (consider_token): structtag set to null string for enum. 1993-03-12 Francesco Potort,Al(B (pot@cnuce.cnr.it) - * etags.c (GET_COOKIE): and related macros removed. - (logical): is now int, no more a char. - (reg): define deleted. - (isgood, _gd, notgd): deleted. - (gotone): deleted. - (TOKEN): member linestart removed. - (linepos, prev_linepos, lb1): deleted. - (main): call initbuffer on lbs array instead of lb1. - (init): removed the initialisation of the logical _gd array; - (find_entries): a .sa suffix means assembler file. + * etags.c (GET_COOKIE): And related macros removed. + (logical): Is now int, no more a char. + (reg): Define deleted. + (isgood, _gd, notgd): Deleted. + (gotone): Deleted. + (TOKEN): Member linestart removed. + (linepos, prev_linepos, lb1): Deleted. + (main): Call initbuffer on lbs array instead of lb1. + (init): Removed the initialisation of the logical _gd array; + (find_entries): A .sa suffix means assembler file. (C_create_stab): "auto", "void", "extern", "static" are st_C_typespec. All C state machines rewritten. - (C_entries): complete rewrite. - (condider_token): complete rewrite. - (getline): deleted. + (C_entries): Complete rewrite. + (condider_token): Complete rewrite. + (getline): Deleted. 1993-03-01 Francesco Potort,Al(B (pot@fly.CNUCE.CNR.IT) @@ -5398,7 +5647,7 @@ 1993-03-19 Eric S. Raymond (eric@geech.gnu.ai.mit.edu) - * Makefile.in (EXECUTABLES): added rcs-checkin. + * Makefile.in (EXECUTABLES): Added rcs-checkin. * Makefile.in (unlock, relock): New productions. @@ -5681,7 +5930,7 @@ 1992-05-04 Jim Blandy (jimb@pogo.cs.oberlin.edu) - * Makefile.in: flags in CC invocations rearranged for no reason. + * Makefile.in: Flags in CC invocations rearranged for no reason. 1992-04-20 Jim Blandy (jimb@pogo.cs.oberlin.edu) @@ -5709,10 +5958,10 @@ 1992-04-08 Jim Blandy (jimb@pogo.cs.oberlin.edu) - * lib-src/etags.c: "--no-warning" option renamed to "--no-warn", + * etags.c: "--no-warning" option renamed to "--no-warn", to be consistent with other GNU programs, like makeinfo. - * lib-src/Makefile: Renamed to Makefile.in; the configure script + * Makefile: Renamed to Makefile.in; the configure script will edit this to produce Makefile. 1992-04-07 Jim Blandy (jimb@pogo.cs.oberlin.edu) @@ -6094,13 +6343,13 @@ 1989-04-18 Richard Stallman (rms@sugar-bombs.ai.mit.edu) - * loadst.c: on bsd4.3, use gettimeofday instead of CPUSTATES. + * loadst.c: On bsd4.3, use gettimeofday instead of CPUSTATES. 1989-03-15 Jeff Peck (rms@sugar-bombs.ai.mit.edu) * emacstool.c: setenv IN_EMACSTOOL=t, TERM=sun, TERMCAP=. - * emacsstool.1: update to document environment variables. + * emacsstool.1: Update to document environment variables. 1989-02-21 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -6201,7 +6450,7 @@ 1988-09-24 Richard Stallman (rms@gluteus.ai.mit.edu) - * etags.c (main): default setting of eflag was backwards. + * etags.c (main): Default setting of eflag was backwards. 1988-09-23 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -6234,7 +6483,7 @@ 1988-06-23 Richard Stallman (rms@sugar-bombs.ai.mit.edu) * etags.c: Handle `typedef struct foo {' (price@mcc.com). - (istoken) New string-comparison macro. + (istoken): New string-comparison macro. (consider_token): New arg `level'. New state `tag_ok' in `tydef'. 1988-06-14 Richard Stallman (rms@sugar-bombs.ai.mit.edu) @@ -6284,7 +6533,7 @@ 1988-04-28 Richard Stallman (rms@frosted-flakes.ai.mit.edu) * movemail.c: #undef close, since config can #define it on V.3. - * emacsclient.c, fakemail.c, loadst.c, server.c: likewise. + * emacsclient.c, fakemail.c, loadst.c, server.c: Likewise. 1988-04-26 Richard Stallman (rms@lucky-charms.ai.mit.edu) @@ -6295,9 +6544,9 @@ 1988-03-20 Richard M. Stallman (rms@wilson) - * server.c [not BSD and not HAVE_SYSVIPC]: fix error message. + * server.c [not BSD and not HAVE_SYSVIPC]: Fix error message. - * loadst.c (main) [XENIX]: use /usr/spool/mail, not /usr/mail. + * loadst.c (main) [XENIX]: Use /usr/spool/mail, not /usr/mail. ;; Local Variables: ;; coding: iso-2022-7bit diff --git a/lib-src/Makefile.in b/lib-src/Makefile.in index cb862625249..759b554177c 100644 --- a/lib-src/Makefile.in +++ b/lib-src/Makefile.in @@ -122,9 +122,6 @@ SCRIPTS= rcs2log vcdiff EXECUTABLES= ${UTILITIES} ${INSTALLABLES} ${SCRIPTS} ${INSTALLABLE_SCRIPTS} -SOURCES = COPYING ChangeLog Makefile.in README emacs.csh \ - makedoc.com *.[chy] rcs2log vcdiff - # Additional -D flags for movemail (add to MOVE_FLAGS if desired): # MAIL_USE_POP Support mail retrieval from a POP mailbox. # MAIL_USE_MMDF Support MMDF mailboxes. @@ -144,7 +141,6 @@ MOVE_FLAGS= # ========================== start of cpp stuff ======================= /* From here on, comments must be done in C syntax. */ -#define NO_SHORTNAMES #define THIS_IS_MAKEFILE #define NOT_C_CODE #include "../src/config.h" @@ -368,12 +364,6 @@ maintainer-clean: distclean extraclean: maintainer-clean -rm -f *~ \#* -unlock: - chmod u+w $(SOURCES) - -relock: - chmod u-w $(SOURCES) - /* Test the contents of the directory. */ check: @echo "We don't have any tests for GNU Emacs yet." @@ -391,7 +381,7 @@ test-distrib${EXEEXT}: ${srcdir}/test-distrib.c ./test-distrib ${srcdir}/testfile /* We need the following in order to create a <getopt.h> when the system - doesn't have one that works with the given compiler. */ + does not have one that works with the given compiler. */ GETOPT_H = @GETOPT_H@ getopt.h: getopt_.h cp $(srcdir)/getopt_.h $@-t @@ -404,13 +394,8 @@ getopt.o: ${srcdir}/getopt.c $(GETOPT_H) ${srcdir}/gettext.h getopt1.o: ${srcdir}/getopt1.c $(GETOPT_H) ${CC} -c ${CPP_CFLAGS} ${srcdir}/getopt1.c -#ifdef REGEXP_IN_LIBC -REGEXPOBJ = -REGEXPDEPS = -#else REGEXPOBJ = regex.o REGEXPDEPS = $(REGEXPOBJ) $(srcdir)/../src/regex.h -#endif regex.o: $(srcdir)/../src/regex.c $(srcdir)/../src/regex.h ../src/config.h ${CC} -c ${BASE_CFLAGS} -DCONFIG_BROKETS -DINHIBIT_STRING_HEADER ${srcdir}/../src/regex.c @@ -471,24 +456,3 @@ update-game-score${EXEEXT}: update-game-score.o $(GETOPTDEPS) update-game-score.o: ${srcdir}/update-game-score.c ../src/config.h $(GETOPT_H) $(CC) -c ${CPP_CFLAGS} ${srcdir}/update-game-score.c \ -DHAVE_SHARED_GAME_DIR="\"$(gamedir)\"" - -/* These are NOT included in INSTALLABLES or UTILITIES. - See ../src/Makefile.in. */ -emacstool${EXEEXT}: ${srcdir}/emacstool.c - $(CC) ${srcdir}/emacstool.c -o emacstool ${ALL_CFLAGS} \ - -lsuntool -lsunwindow -lpixrect $(LOADLIBES) - -/* For SUN Japanese Language Environment. */ -nemacstool${EXEEXT}: ${srcdir}/emacstool.c - $(CC) -o nemacstool -DJLE ${ALL_CFLAGS} ${srcdir}/emacstool.c \ - -lsuntool -lmle -lsunwindow -lpixrect $(LOADLIBES) - -xvetool${EXEEXT}: ${srcdir}/emacstool.c - $(CC) -o xvetool -DXVIEW ${ALL_CFLAGS} ${srcdir}/emacstool.c \ - -lxview -lX -I$(OPENWINHOME)/include -L$(OPENWINHOME)/lib \ - $(LOADLIBES) - -xveterm${EXEEXT}: ${srcdir}/emacstool.c - $(CC) -o xveterm -DXVIEW -DTTERM ${ALL_CFLAGS} ${srcdir}/emacstool.c \ - -lxview -lolgx -lX -I$(OPENWINHOME)/include -L$(OPENWINHOME)/lib \ - $(LOADLIBES) diff --git a/lib-src/ebrowse.c b/lib-src/ebrowse.c index 14a0aa9473d..2946dd3feba 100644 --- a/lib-src/ebrowse.c +++ b/lib-src/ebrowse.c @@ -3691,8 +3691,11 @@ usage (error) void version () { + /* Makes it easier to update automatically. */ + char emacs_copyright[] = "Copyright (C) 2008 Free Software Foundation, Inc."; + printf ("ebrowse %s\n", VERSION); - puts ("Copyright (C) 2008 Free Software Foundation, Inc."); + puts (emacs_copyright); puts ("This program is distributed under the same terms as Emacs."); exit (EXIT_SUCCESS); } diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index e2db67a4a84..f505fe58f18 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -20,8 +20,6 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#define NO_SHORTNAMES - #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -77,7 +75,12 @@ Boston, MA 02110-1301, USA. */ # include <pwd.h> #endif /* not WINDOWSNT */ #endif /* not VMS */ +#include <sys/stat.h> + +#include <signal.h> +#include <errno.h> + char *getenv (), *getwd (); char *(getcwd) (); @@ -92,8 +95,6 @@ char *w32_getenv (); #define VERSION "unspecified" #endif -#define SEND_STRING(data) (send_to_emacs (s, (data))) -#define SEND_QUOTED(data) (quote_file_name (s, (data))) #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 @@ -118,15 +119,27 @@ char *w32_getenv (); /* Name used to invoke this program. */ char *progname; +/* The second argument to main. */ +char **main_argv; + /* Nonzero means don't wait for a response from Emacs. --no-wait. */ int nowait = 0; /* Nonzero means args are expressions to be evaluated. --eval. */ int eval = 0; +/* Nonzero means don't open a new frame. Inverse of --create-frame. */ +int current_frame = 1; + +/* Nonzero means open a new graphical frame. */ +int window_system = 0; + /* The display on which Emacs should work. --display. */ char *display = NULL; +/* Nonzero means open a new Emacs frame on the current terminal. */ +int tty = 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; @@ -148,12 +161,16 @@ struct option longopts[] = { "eval", no_argument, NULL, 'e' }, { "help", no_argument, NULL, 'H' }, { "version", no_argument, NULL, 'V' }, + { "tty", no_argument, NULL, 't' }, + { "create-frame", no_argument, NULL, 'c' }, { "alternate-editor", required_argument, NULL, 'a' }, #ifndef NO_SOCKETS_IN_FILE_SYSTEM { "socket-name", required_argument, NULL, 's' }, #endif { "server-file", required_argument, NULL, 'f' }, +#ifndef WINDOWSNT { "display", required_argument, NULL, 'd' }, +#endif { 0, 0, 0, 0 } }; @@ -173,7 +190,113 @@ xmalloc (size) return result; } -/* Message functions. */ +/* Like strdup but get a fatal error if memory is exhausted. */ + +char * +xstrdup (const char *s) +{ + char *result = strdup (s); + if (result == NULL) + { + perror ("strdup"); + exit (EXIT_FAILURE); + } + return result; +} + +/* From sysdep.c */ +#if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME) + +/* From lisp.h */ +#ifndef DIRECTORY_SEP +#define DIRECTORY_SEP '/' +#endif +#ifndef IS_DIRECTORY_SEP +#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP) +#endif +#ifndef IS_DEVICE_SEP +#ifndef DEVICE_SEP +#define IS_DEVICE_SEP(_c_) 0 +#else +#define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP) +#endif +#endif +#ifndef IS_ANY_SEP +#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_)) +#endif + + +/* Return the current working directory. Returns NULL on errors. + Any other returned value must be freed with free. This is used + only when get_current_dir_name is not defined on the system. */ +char* +get_current_dir_name () +{ + char *buf; + char *pwd; + struct stat dotstat, pwdstat; + /* If PWD is accurate, use it instead of calling getwd. PWD is + sometimes a nicer name, and using it may avoid a fatal error if a + parent directory is searchable but not readable. */ + if ((pwd = egetenv ("PWD")) != 0 + && (IS_DIRECTORY_SEP (*pwd) || (*pwd && IS_DEVICE_SEP (pwd[1]))) + && stat (pwd, &pwdstat) == 0 + && stat (".", &dotstat) == 0 + && dotstat.st_ino == pwdstat.st_ino + && dotstat.st_dev == pwdstat.st_dev +#ifdef MAXPATHLEN + && strlen (pwd) < MAXPATHLEN +#endif + ) + { + buf = (char *) xmalloc (strlen (pwd) + 1); + if (!buf) + return NULL; + strcpy (buf, pwd); + } +#ifdef HAVE_GETCWD + else + { + size_t buf_size = 1024; + buf = (char *) xmalloc (buf_size); + if (!buf) + return NULL; + for (;;) + { + if (getcwd (buf, buf_size) == buf) + break; + if (errno != ERANGE) + { + int tmp_errno = errno; + free (buf); + errno = tmp_errno; + return NULL; + } + buf_size *= 2; + buf = (char *) realloc (buf, buf_size); + if (!buf) + return NULL; + } + } +#else + else + { + /* We need MAXPATHLEN here. */ + buf = (char *) xmalloc (MAXPATHLEN + 1); + if (!buf) + return NULL; + if (getwd (buf) == NULL) + { + int tmp_errno = errno; + free (buf); + errno = tmp_errno; + return NULL; + } + } +#endif + return buf; +} +#endif #ifdef WINDOWSNT @@ -279,8 +402,44 @@ w32_window_app () return window_app; } -#endif +/* + execvp wrapper for Windows. Quotes arguments with embedded spaces. + + This is necessary due to the broken implementation of exec* routines in + the Microsoft libraries: they concatenate the arguments together without + quoting special characters, and pass the result to CreateProcess, with + predictably bad results. By contrast, Posix execvp passes the arguments + directly into the argv array of the child process. +*/ +int +w32_execvp (path, argv) + char *path; + char **argv; +{ + int i; + + /* Required to allow a .BAT script as alternate editor. */ + argv[0] = (char *) alternate_editor; + + for (i = 0; argv[i]; i++) + if (strchr (argv[i], ' ')) + { + char *quoted = alloca (strlen (argv[i]) + 3); + sprintf (quoted, "\"%s\"", argv[i]); + argv[i] = quoted; + } + + return execvp (path, argv); +} + +#undef execvp +#define execvp w32_execvp + +#endif /* WINDOWSNT */ + +/* Display a normal or error message. + On Windows, use a message box if compiled as a Windows app. */ void message (int is_error, char *message, ...) { @@ -323,11 +482,11 @@ decode_options (argc, argv) { int opt = getopt_long (argc, argv, #ifndef NO_SOCKETS_IN_FILE_SYSTEM - "VHnea:s:f:d:", + "VHnea:s:f:d:tc", #else - "VHnea:f:d:", + "VHnea:f:d:tc", #endif - longopts, 0); + longopts, 0); if (opt == EOF) break; @@ -353,9 +512,15 @@ decode_options (argc, argv) server_file = optarg; break; + /* We used to disallow this argument in w32, but it seems better + to allow it, for the occasional case where the user is + connecting with a w32 client to a server compiled with X11 + support. */ +#if 1 /* !defined WINDOWS */ case 'd': display = optarg; break; +#endif case 'n': nowait = 1; @@ -370,6 +535,15 @@ decode_options (argc, argv) exit (EXIT_SUCCESS); break; + case 't': + tty = 1; + current_frame = 0; + break; + + case 'c': + current_frame = 0; + break; + case 'H': print_help_and_exit (); break; @@ -380,21 +554,63 @@ decode_options (argc, argv) break; } } + + /* We used to set `display' to $DISPLAY by default, but this changed the + default behavior and is sometimes inconvenient. So instead of forcing + users to say "--display ''" when they want to use Emacs's existing tty + or display connection, we force them to use "--display $DISPLAY" if + they want Emacs to connect to their current display. + -c still implicitly passes --display $DISPLAY unless -t was specified + so as to try and mimick the behavior of `emacs' which either uses + the current tty or the current $DISPLAY. */ + if (!current_frame && !tty && !display) + display = egetenv ("DISPLAY"); + + if (display && strlen (display) == 0) + display = NULL; + + if (!tty && display) + window_system = 1; +#if !defined (WINDOWSNT) && !defined (HAVE_CARBON) + else if (!current_frame) + tty = 1; +#endif + + /* --no-wait implies --current-frame on ttys when there are file + arguments or expressions given. */ + if (nowait && tty && argc - optind > 0) + current_frame = 1; + + if (current_frame) + { + tty = 0; + window_system = 0; + } + + if (tty) + window_system = 0; } + void print_help_and_exit () { + /* Spaces and tabs are significant in this message; they're chosen so the + message aligns properly both in a tty and in a Windows message box. + Please try to preserve them; otherwise the output is very hard to read + when using emacsclientw. */ message (FALSE, - "Usage: %s [OPTIONS] FILE...\n\ + "Usage: %s [OPTIONS] FILE...\n\ Tell the Emacs server to visit the specified files.\n\ Every FILE can be either just a FILENAME or [+LINE[:COLUMN]] FILENAME.\n\ \n\ The following OPTIONS are accepted:\n\ -\n\ -V, --version Just print version info and return\n\ --H, --help Print this usage information message\n\ --e, --eval Evaluate FILE arguments as Lisp expressions\n\ +-H, --help Print this usage information message\n\ +-t, --tty Open a new Emacs frame on the current terminal\n\ +-c, --create-frame Create a new frame instead of trying to\n\ + use the current Emacs frame\n\ +-e, --eval Evaluate the FILE arguments as ELisp expressions\n\ -n, --no-wait Don't wait for the server to return\n\ -d, --display=DISPLAY Visit the file in the given display\n" #ifndef NO_SOCKETS_IN_FILE_SYSTEM @@ -404,66 +620,27 @@ The following OPTIONS are accepted:\n\ "-f, --server-file=FILENAME\n\ Set filename of the TCP authentication file\n\ -a, --alternate-editor=EDITOR\n\ - Editor to fallback to if server is not running\n\ + Editor to fallback to if the server is not running\n\ \n\ Report bugs to bug-gnu-emacs@gnu.org.\n", progname); exit (EXIT_SUCCESS); } - -#ifdef WINDOWSNT - -/* - execvp wrapper for Windows. Quotes arguments with embedded spaces. - - This is necessary due to the broken implementation of exec* routines in - the Microsoft libraries: they concatenate the arguments together without - quoting special characters, and pass the result to CreateProcess, with - predictably bad results. By contrast, Posix execvp passes the arguments - directly into the argv array of the child process. -*/ -int -w32_execvp (path, argv) - char *path; - char **argv; -{ - int i; - - /* Required to allow a .BAT script as alternate editor. */ - argv[0] = (char *) alternate_editor; - - for (i = 0; argv[i]; i++) - if (strchr (argv[i], ' ')) - { - char *quoted = alloca (strlen (argv[i]) + 3); - sprintf (quoted, "\"%s\"", argv[i]); - argv[i] = quoted; - } - - return execvp (path, argv); -} - -#undef execvp -#define execvp w32_execvp - -#endif /* WINDOWSNT */ - /* Try to run a different command, or --if no alternate editor is defined-- exit with an errorcode. + Uses argv, but gets it from the global variable main_argv. */ 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); message (TRUE, "%s: error executing alternate editor \"%s\"\n", - progname, alternate_editor); + progname, alternate_editor); } exit (EXIT_FAILURE); } @@ -476,10 +653,12 @@ main (argc, argv) int argc; char **argv; { - message (TRUE, "%s: Sorry, the Emacs server is supported only\non systems with Berkely sockets.\n", + main_argv = argv; + progname = argv[0]; + message (TRUE, "%s: Sorry, the Emacs server is supported only\n" + "on systems with Berkeley sockets.\n", argv[0]); - - fail (argc, argv); + fail (); } #else /* HAVE_SOCKETS && HAVE_INET_SOCKETS */ @@ -490,8 +669,6 @@ main (argc, argv) # include <sys/types.h> # include <sys/socket.h> # include <sys/un.h> -# include <sys/stat.h> -# include <errno.h> #endif #define AUTH_KEY_LENGTH 64 @@ -503,6 +680,8 @@ extern int errno; /* Buffer to accumulate data to send in TCP connections. */ char send_buffer[SEND_BUFFER_SIZE + 1]; int sblen = 0; /* Fill pointer for the send buffer. */ +/* Socket used to communicate with the Emacs server process. */ +HSOCKET emacs_socket = 0; /* On Windows, the socket library was historically separate from the standard C library, so errors are handled differently. */ @@ -566,18 +745,21 @@ send_to_emacs (s, data) } } -/* In NAME, insert a & before each &, each space, each newline, and + +/* In STR, insert a & before each &, each space, each newline, and any initial -. Change spaces to underscores, too, so that the - return value never contains a space. */ + return value never contains a space. + + Does not change the string. Outputs the result to STREAM. */ void -quote_file_name (s, name) +quote_argument (s, str) HSOCKET s; - char *name; + char *str; { - char *copy = (char *) xmalloc (strlen (name) * 2 + 1); + char *copy = (char *) xmalloc (strlen (str) * 2 + 1); char *p, *q; - p = name; + p = str; q = copy; while (*p) { @@ -595,18 +777,54 @@ quote_file_name (s, name) } else { - if (*p == '&' || (*p == '-' && p == name)) + if (*p == '&' || (*p == '-' && p == str)) *q++ = '&'; *q++ = *p++; } } *q++ = 0; - SEND_STRING (copy); + send_to_emacs (s, copy); free (copy); } + +/* The inverse of quote_argument. Removes quoting in string STR by + modifying the string in place. Returns STR. */ + +char * +unquote_argument (str) + char *str; +{ + char *p, *q; + + if (! str) + return str; + + p = str; + q = str; + while (*p) + { + if (*p == '&') + { + p++; + if (*p == '&') + *p = '&'; + else if (*p == '_') + *p = ' '; + else if (*p == 'n') + *p = '\n'; + else if (*p == '-') + *p = '-'; + } + *q++ = *p++; + } + *q = 0; + return str; +} + + int file_name_absolute_p (filename) const unsigned char *filename; @@ -628,38 +846,6 @@ file_name_absolute_p (filename) /* Both \xxx and \\xxx\yyy are absolute. */ if (filename[0] == '\\') return TRUE; - - /* - FIXME: There's a corner case not dealt with, "x:y", where: - - 1) x is a valid drive designation (usually a letter in the A-Z range) - and y is a path, relative to the current directory on drive x. This - is absolute, *after* fixing the y part to include the current - directory in x. - - 2) x is a relative file name, and y is an NTFS stream name. This is a - correct relative path, but it is very unusual. - - The trouble is that first case items are also valid examples of the - second case, i.e., "c:test" can be understood as drive:path or as - file:stream. - - The "right" fix would involve checking whether - - the current drive/partition is NTFS, - - x is a valid (and accesible) drive designator, - - x:y already exists as a file:stream in the current directory, - - y already exists on the current directory of drive x, - - the auspices are favorable, - and then taking an "informed decision" based on the above. - - Whatever the result, Emacs currently does a very bad job of dealing - with NTFS file:streams: it cannot visit them, and the only way to - create one is by setting `buffer-file-name' to point to it (either - manually or with emacsclient). So perhaps resorting to 1) and ignoring - 2) for now is the right thing to do. - - Anyway, something to decide After the Release. - */ #endif return FALSE; @@ -681,13 +867,14 @@ initialize_sockets () if (WSAStartup (MAKEWORD (2, 0), &wsaData)) { - message (TRUE, "%s: error initializing WinSock2", progname); + message (TRUE, "%s: error initializing WinSock2\n", progname); exit (EXIT_FAILURE); } atexit (close_winsock); } #endif /* WINDOWSNT */ + /* * Read the information needed to set up a TCP comm channel with @@ -737,7 +924,7 @@ get_server_config (server, authentication) } else { - message (TRUE, "%s: invalid configuration info", progname); + message (TRUE, "%s: invalid configuration info\n", progname); exit (EXIT_FAILURE); } @@ -747,7 +934,7 @@ get_server_config (server, authentication) if (! fread (authentication, AUTH_KEY_LENGTH, 1, config)) { - message (TRUE, "%s: cannot read authentication info", progname); + message (TRUE, "%s: cannot read authentication info\n", progname); exit (EXIT_FAILURE); } @@ -798,13 +985,22 @@ set_tcp_socket () */ auth_string[AUTH_KEY_LENGTH] = '\0'; - SEND_STRING ("-auth "); - SEND_STRING (auth_string); - SEND_STRING ("\n"); + send_to_emacs (s, "-auth "); + send_to_emacs (s, auth_string); + send_to_emacs (s, " "); return s; } + +/* Returns 1 if PREFIX is a prefix of STRING. */ +static int +strprefix (char *prefix, char *string) +{ + return !strncmp (prefix, string, strlen (prefix)); +} + + #if !defined (NO_SOCKETS_IN_FILE_SYSTEM) /* Three possibilities: @@ -827,6 +1023,93 @@ socket_status (socket_name) return 0; } + +/* A signal handler that passes the signal to the Emacs process. + Useful for SIGWINCH. */ + +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; +} + +/* Signal handler for SIGCONT; notify the Emacs process that it can + now resume our tty frame. */ + +SIGTYPE +handle_sigcont (int signalnum) +{ + int old_errno = errno; + + if (tcgetpgrp (1) == getpgrp ()) + { + /* We are in the foreground. */ + send_to_emacs (emacs_socket, "-resume \n"); + } + else + { + /* We are in the background; cancel the continue. */ + kill (getpid (), SIGSTOP); + } + + signal (signalnum, handle_sigcont); + errno = old_errno; +} + +/* Signal handler for SIGTSTP; notify the Emacs process that we are + going to sleep. Normally the suspend is initiated by Emacs via + server-handle-suspend-tty, but if the server gets out of sync with + reality, we may get a SIGTSTP on C-z. Handling this signal and + notifying Emacs about it should get things under control again. */ + +SIGTYPE +handle_sigtstp (int signalnum) +{ + int old_errno = errno; + sigset_t set; + + if (emacs_socket) + send_to_emacs (emacs_socket, "-suspend \n"); + + /* Unblock this signal and call the default handler by temporarily + changing the handler and resignalling. */ + sigprocmask (SIG_BLOCK, NULL, &set); + sigdelset (&set, signalnum); + signal (signalnum, SIG_DFL); + kill (getpid (), signalnum); + sigprocmask (SIG_SETMASK, &set, NULL); /* Let's the above signal through. */ + signal (signalnum, handle_sigtstp); + + errno = old_errno; +} +/* Set up signal handlers before opening a frame on the current tty. */ + +void +init_signals (void) +{ + /* Set up signal handlers. */ + signal (SIGWINCH, pass_signal_to_emacs); + + /* Don't pass SIGINT and SIGQUIT to Emacs, because it has no way of + deciding which terminal the signal came from. C-g is now a + normal input event on secondary terminals. */ +#if 0 + signal (SIGINT, pass_signal_to_emacs); + signal (SIGQUIT, pass_signal_to_emacs); +#endif + + signal (SIGCONT, handle_sigcont); + signal (SIGTSTP, handle_sigtstp); + signal (SIGTTOU, handle_sigtstp); +} + + HSOCKET set_local_socket () { @@ -848,30 +1131,30 @@ set_local_socket () { int sock_status = 0; int default_sock = !socket_name; - int saved_errno; + int saved_errno = 0; char *server_name = "server"; if (socket_name && !index (socket_name, '/') && !index (socket_name, '\\')) { /* socket_name is a file name component. */ - server_name = socket_name; - socket_name = NULL; - default_sock = 1; /* Try both UIDs. */ + server_name = socket_name; + socket_name = NULL; + default_sock = 1; /* Try both UIDs. */ } if (default_sock) { - socket_name = alloca (100 + strlen (server_name)); - sprintf (socket_name, "/tmp/emacs%d/%s", - (int) geteuid (), server_name); + socket_name = alloca (100 + strlen (server_name)); + sprintf (socket_name, "/tmp/emacs%d/%s", + (int) geteuid (), server_name); } if (strlen (socket_name) < sizeof (server.sun_path)) strcpy (server.sun_path, socket_name); else { - message (TRUE, "%s: socket-name %s too long", - progname, socket_name); - exit (EXIT_FAILURE); + message (TRUE, "%s: socket-name %s too long\n", + progname, socket_name); + fail (); } /* See if the socket exists, and if it's owned by us. */ @@ -904,13 +1187,13 @@ set_local_socket () strcpy (server.sun_path, socket_name); else { - message (TRUE, "%s: socket-name %s too long", + message (TRUE, "%s: socket-name %s too long\n", progname, socket_name); exit (EXIT_FAILURE); } sock_status = socket_status (server.sun_path); - saved_errno = errno; + saved_errno = errno; } else errno = saved_errno; @@ -920,26 +1203,26 @@ set_local_socket () switch (sock_status) { case 1: - /* There's a socket, but it isn't owned by us. This is OK if - we are root. */ - if (0 != geteuid ()) - { - message (TRUE, "%s: Invalid socket owner\n", progname); + /* There's a socket, but it isn't owned by us. This is OK if + we are root. */ + if (0 != geteuid ()) + { + message (TRUE, "%s: Invalid socket owner\n", progname); return INVALID_SOCKET; - } - break; + } + break; case 2: - /* `stat' failed */ - if (saved_errno == ENOENT) - message (TRUE, - "%s: can't find socket; have you started the server?\n\ + /* `stat' failed */ + if (saved_errno == ENOENT) + message (TRUE, + "%s: can't find socket; have you started the server?\n\ To start the server in Emacs, type \"M-x server-start\".\n", progname); - else - message (TRUE, "%s: can't stat %s: %s\n", + else + message (TRUE, "%s: can't stat %s: %s\n", progname, server.sun_path, strerror (saved_errno)); - return INVALID_SOCKET; + return INVALID_SOCKET; } } @@ -967,10 +1250,9 @@ set_socket () { s = set_local_socket (); if ((s != INVALID_SOCKET) || alternate_editor) - return s; - - message (TRUE, "%s: error accessing socket \"%s\"", - progname, socket_name); + return s; + message (TRUE, "%s: error accessing socket \"%s\"\n", + progname, socket_name); exit (EXIT_FAILURE); } #endif @@ -983,10 +1265,10 @@ set_socket () { s = set_tcp_socket (); if ((s != INVALID_SOCKET) || alternate_editor) - return s; + return s; - message (TRUE, "%s: error accessing server file \"%s\"", - progname, server_file); + message (TRUE, "%s: error accessing server file \"%s\"\n", + progname, server_file); exit (EXIT_FAILURE); } @@ -1075,129 +1357,286 @@ main (argc, argv) int argc; char **argv; { - HSOCKET s; int i, rl, needlf = 0; - char *cwd; + char *cwd, *str; char string[BUFSIZ+1]; + main_argv = argv; progname = argv[0]; /* Process options. */ decode_options (argc, argv); - if ((argc - optind < 1) && !eval) + if ((argc - optind < 1) && !eval && !tty && !window_system) { - message (TRUE, "%s: file name or argument required\nTry `%s --help' for more information\n", - progname, progname); + message (TRUE, "%s: file name or argument required\n" + "Try `%s --help' for more information\n", + progname, progname); exit (EXIT_FAILURE); } - if ((s = set_socket ()) == INVALID_SOCKET) - fail (argc, argv); + if ((emacs_socket = set_socket ()) == INVALID_SOCKET) + fail (); -#ifdef HAVE_GETCWD - cwd = getcwd (string, sizeof string); -#else - cwd = getwd (string); -#endif + + cwd = get_current_dir_name (); if (cwd == 0) { /* getwd puts message in STRING if it fails. */ - message (TRUE, "%s: %s (%s)\n", progname, -#ifdef HAVE_GETCWD - "Cannot get current working directory", -#else - string, -#endif - strerror (errno)); - fail (argc, argv); + message (TRUE, "%s: %s\n", progname, + "Cannot get current working directory"); + fail (); } #ifdef WINDOWSNT w32_give_focus (); #endif + /* Send over our environment. */ + if (!current_frame) + { + extern char **environ; + int i; + for (i = 0; environ[i]; i++) + { + char *name = xstrdup (environ[i]); + char *value = strchr (name, '='); + send_to_emacs (emacs_socket, "-env "); + quote_argument (emacs_socket, environ[i]); + send_to_emacs (emacs_socket, " "); + } + } + + /* Send over our current directory. */ + if (!current_frame) + { + send_to_emacs (emacs_socket, "-dir "); + quote_argument (emacs_socket, cwd); + send_to_emacs (emacs_socket, "/"); + send_to_emacs (emacs_socket, " "); + } + + retry: if (nowait) - SEND_STRING ("-nowait "); + send_to_emacs (emacs_socket, "-nowait "); - if (eval) - SEND_STRING ("-eval "); + if (current_frame) + send_to_emacs (emacs_socket, "-current-frame "); if (display) { - SEND_STRING ("-display "); - SEND_QUOTED (display); - SEND_STRING (" "); + send_to_emacs (emacs_socket, "-display "); + quote_argument (emacs_socket, display); + send_to_emacs (emacs_socket, " "); } + if (tty) + { + char *type = egetenv ("TERM"); + char *tty_name = NULL; +#ifndef WINDOWSNT + tty_name = ttyname (fileno (stdin)); +#endif + + if (! tty_name) + { + message (TRUE, "%s: could not get terminal name\n", progname); + fail (); + } + + if (! type) + { + message (TRUE, "%s: please set the TERM variable to your terminal type\n", + progname); + fail (); + } + + if (! strcmp (type, "eterm")) + { + /* This causes nasty, MULTI_KBOARD-related input lockouts. */ + message (TRUE, "%s: opening a frame in an Emacs term buffer" + " is not supported\n", progname); + fail (); + } +#if !defined (NO_SOCKETS_IN_FILE_SYSTEM) + init_signals (); +#endif + + send_to_emacs (emacs_socket, "-tty "); + quote_argument (emacs_socket, tty_name); + send_to_emacs (emacs_socket, " "); + quote_argument (emacs_socket, type); + send_to_emacs (emacs_socket, " "); + } + + if (window_system) + send_to_emacs (emacs_socket, "-window-system "); + if ((argc - optind > 0)) { for (i = optind; i < argc; i++) { + int relative = 0; + if (eval) - ; /* Don't prepend any cwd or anything like that. */ - else if (*argv[i] == '+') - { + { + /* Don't prepend cwd or anything like that. */ + send_to_emacs (emacs_socket, "-eval "); + quote_argument (emacs_socket, argv[i]); + send_to_emacs (emacs_socket, " "); + continue; + } + + if (*argv[i] == '+') + { char *p = argv[i] + 1; while (isdigit ((unsigned char) *p) || *p == ':') p++; - if (*p != 0) + if (*p == 0) + { + send_to_emacs (emacs_socket, "-position "); + quote_argument (emacs_socket, argv[i]); + send_to_emacs (emacs_socket, " "); + continue; + } + else + relative = 1; + } + else if (! file_name_absolute_p (argv[i])) +#ifndef WINDOWSNT + relative = 1; +#else + /* Call GetFullPathName so filenames of the form X:Y, where X is + a valid drive designator, are interpreted as drive:path, not + file:stream, and treated as absolute. + The user can still pass a file:stream if desired (for example, + .\X:Y), but it is not very useful, as Emacs currently does a + very bad job of dealing wih NTFS streams. */ + { + char *filename = (char *) xmalloc (MAX_PATH); + DWORD size; + + size = GetFullPathName (argv[i], MAX_PATH, filename, NULL); + if (size > 0 && size < MAX_PATH) + argv[i] = filename; + else { - SEND_QUOTED (cwd); - SEND_STRING ("/"); + relative = 1; + free (filename); } } - else if (! file_name_absolute_p (argv[i])) - { - SEND_QUOTED (cwd); - SEND_STRING ("/"); - } +#endif - SEND_QUOTED (argv[i]); - SEND_STRING (" "); - } + send_to_emacs (emacs_socket, "-file "); + if (relative) + { + quote_argument (emacs_socket, cwd); + send_to_emacs (emacs_socket, "/"); + } + quote_argument (emacs_socket, argv[i]); + send_to_emacs (emacs_socket, " "); + } } else { - while (fgets (string, BUFSIZ, stdin)) - { - SEND_QUOTED (string); - } - SEND_STRING (" "); + if (!tty && !window_system) + { + while ((str = fgets (string, BUFSIZ, stdin))) + { + if (eval) + send_to_emacs (emacs_socket, "-eval "); + else + send_to_emacs (emacs_socket, "-file "); + quote_argument (emacs_socket, str); + } + send_to_emacs (emacs_socket, " "); + } } - SEND_STRING ("\n"); + send_to_emacs (emacs_socket, "\n"); + + /* Wait for an answer. */ + if (!eval && !tty && !nowait) + { + printf ("Waiting for Emacs..."); + needlf = 2; + } + fflush (stdout); + fsync (1); - /* Maybe wait for an answer. */ - if (!nowait) + /* Now, wait for an answer and print any messages. */ + while ((rl = recv (emacs_socket, string, BUFSIZ, 0)) > 0) { - if (!eval) + char *p; + string[rl] = '\0'; + + p = string + strlen (string) - 1; + while (p > string && *p == '\n') + *p-- = 0; + + if (strprefix ("-emacs-pid ", string)) { - printf ("Waiting for Emacs..."); - needlf = 2; + /* -emacs-pid PID: The process id of the Emacs process. */ + emacs_pid = strtol (string + strlen ("-emacs-pid"), NULL, 10); } - fflush (stdout); - - /* Now, wait for an answer and print any messages. */ - while ((rl = recv (s, string, BUFSIZ, 0)) > 0) + else if (strprefix ("-window-system-unsupported ", string)) { - string[rl] = '\0'; - if (needlf == 2) + /* -window-system-unsupported: Emacs was compiled without X + support. Try again on the terminal. */ + window_system = 0; + nowait = 0; + tty = 1; + goto retry; + } + else if (strprefix ("-print ", string)) + { + /* -print STRING: Print STRING on the terminal. */ + str = unquote_argument (string + strlen ("-print ")); + if (needlf) printf ("\n"); - printf ("%s", string); - needlf = string[0] == '\0' ? needlf : string[strlen (string) - 1] != '\n'; + printf ("%s", str); + needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n'; + } + else if (strprefix ("-error ", string)) + { + /* -error DESCRIPTION: Signal an error on the terminal. */ + str = unquote_argument (string + strlen ("-error ")); + if (needlf) + printf ("\n"); + fprintf (stderr, "*ERROR*: %s", str); + needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n'; + } +#ifdef SIGSTOP + else if (strprefix ("-suspend ", string)) + { + /* -suspend: Suspend this terminal, i.e., stop the process. */ + if (needlf) + printf ("\n"); + needlf = 0; + kill (0, SIGSTOP); + } +#endif + else + { + /* Unknown command. */ + if (needlf) + printf ("\n"); + printf ("*ERROR*: Unknown message: %s", string); + needlf = string[0] == '\0' ? needlf : string[strlen (string) - 1] != '\n'; } - - if (needlf) - printf ("\n"); - fflush (stdout); } - CLOSE_SOCKET (s); + if (needlf) + printf ("\n"); + fflush (stdout); + fsync (1); + + CLOSE_SOCKET (emacs_socket); return EXIT_SUCCESS; } #endif /* HAVE_SOCKETS && HAVE_INET_SOCKETS */ + #ifndef HAVE_STRERROR char * strerror (errnum) diff --git a/lib-src/emacstool.c b/lib-src/emacstool.c deleted file mode 100644 index 40247c28a2a..00000000000 --- a/lib-src/emacstool.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - Copyright (C) 1986, 1988, 1990, 1991, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - -This file is part of GNU Emacs. - -GNU Emacs is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GNU Emacs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ - -/* - * For Emacs in SunView/Sun-Windows: (supported by Sun Unix v3.2 or greater) - * Insert a notifier filter-function to convert all useful input - * to "key" sequences that emacs can understand. See: Emacstool(1). - * - * Author: Jeff Peck, Sun Microsystems, Inc. <peck@eng.sun.com> - * - * Original Idea: Ian Batten - * Updated 15-Mar-88, Jeff Peck: set IN_EMACSTOOL, TERM, TERMCAP - * Updated 10-Sep-88, Jeff Peck: add XVIEW and JLE support - * Updated 8-Oct-90, Jeff Peck: add Meta-bit for Xview - * Updated 6-Mar-91, Jeff Peck: Hack to detect -Wt invocation - * [note, TTYSW limitation means you must Click-To-Type in Openwin] - * [fixed in OW3 or use local/tty.o] - * for better results, this should move to using TERMSW. - * Updated 10-Mar-91, Jeff Peck, et al: support for TERMSW (TTERM) - * allows point-to-type even in OW2 - * - * [note: xvetool should be started with the "-nw" flag for emacs!] - */ - -#ifdef XVIEW -#include <xview/xview.h> -#include <xview/panel.h> -#include <xview/attr.h> -#include <xview/tty.h> -#include <xview/ttysw.h> /* private defines */ -#include <xview/termsw.h> /* -DTTERM */ -#include <xview/font.h> /* for testing */ -#else -#include <suntool/sunview.h> -#include <suntool/tty.h> -#include <suntool/ttysw.h> -#endif XVIEW - -#ifdef JLE -# include <locale.h> -#endif JLE - -#include <stdio.h> -#include <sys/file.h> - -#define BUFFER_SIZE 128 /* Size of all the buffers */ - -/* define WANT_CAPS_LOCK to make f-key T1 (aka F1) behave as CapsLock */ -#define WANT_CAPS_LOCK -#ifdef WANT_CAPS_LOCK -int caps_lock; /* toggle indicator for f-key T1 caps lock */ -static char *Caps = "[CAPS] "; /* Caps Lock prefix string */ -#define CAPS_LEN 7 /* strlen (Caps) */ -#endif - -static char *mouse_prefix = "\030\000"; /* C-x C-@ */ -static int m_prefix_length = 2; /* mouse_prefix length */ - -static char *key_prefix = "\030*"; /* C-x * */ -static int k_prefix_length = 2; /* key_prefix length */ - -#ifdef JLE -static char *emacs_name = "nemacs"; /* default run command */ -static char *title = "NEmacstool - "; /* initial title */ -#else -static char *emacs_name = "emacs"; /* default run command */ -static char *title = "Emacstool - "; /* initial title */ -#endif JLE - -static char buffer[BUFFER_SIZE]; /* send to ttysw_input */ -static char *bold_name = 0; /* for -bold option */ - -Frame frame; /* Base frame for system */ - -#ifndef TTERM -#define SWTYPE TTY -Tty tty_win; /* Where emacs is reading */ -#else -#define SWTYPE TERMSW -Termsw tty_win; /* Termsw does follow-mouse */ -#endif TTERM - -#ifdef XVIEW -Xv_Window tty_view; /* Where the events are in Xview*/ -#else -Tty tty_view; /* SunView place filler */ -#endif XVIEW - -int font_width, font_height; /* For translating pixels to chars */ -int left_margin = 0; /* default window -- frame offset */ - -int console_fd = 0; /* for debugging: setenv DEBUGEMACSTOOL */ -FILE *console; /* for debugging: setenv DEBUGEMACSTOOL */ - -Icon frame_icon; -/* make an icon_image for the default frame_icon */ -static short default_image[258] = -{ -#include <images/terminal.icon> -}; -mpr_static(icon_image, 64, 64, 1, default_image); - -/* - * Assign a value to a set of keys - */ -int -button_value (event) - Event *event; -{ - int retval = 0; - /* - * Code up the current situation: - * - * 1 = MS_LEFT; - * 2 = MS_MIDDLE; - * 4 = MS_RIGHT; - * 8 = SHIFT; - * 16 = CONTROL; - * 32 = META; - * 64 = DOUBLE; - * 128 = UP; - */ - - if (MS_LEFT == (event_id (event))) retval = 1; - if (MS_MIDDLE == (event_id (event))) retval = 2; - if (MS_RIGHT == (event_id (event))) retval = 4; - - if (event_shift_is_down (event)) retval += 8; - if (event_ctrl_is_down (event)) retval += 16; - if (event_meta_is_down (event)) retval += 32; - if (event_is_up (event)) retval += 128; - return retval; -} - -/* - * Variables to store the time of the previous mouse event that was - * sent to emacs. - * - * The theory is that to time double clicks while ignoring UP buttons, - * we must keep track of the accumulated time. - * - * If someone writes a SUN-SET-INPUT-MASK for emacstool, - * That could be used to selectively disable UP events, - * and then this cruft wouldn't be necessary. - */ -static long prev_event_sec = 0; -static long prev_event_usec = 0; - -/* - * Give the time difference in milliseconds, where one second - * is considered infinite. - */ -int -time_delta (now_sec, now_usec, prev_sec, prev_usec) - long now_sec, now_usec, prev_sec, prev_usec; -{ - long sec_delta = now_sec - prev_sec; - long usec_delta = now_usec - prev_usec; - - if (usec_delta < 0) { /* "borrow" a second */ - usec_delta += 1000000; - --sec_delta; - } - - if (sec_delta >= 10) - return (9999); /* Infinity */ - else - return ((sec_delta * 1000) + (usec_delta / 1000)); -} - - -/* - * Filter function to translate selected input events for emacs - * Mouse button events become ^X^@(button x-col y-line time-delta) . - * Function keys: ESC-*{c}{lrt} l,r,t for Left, Right, Top; - * {c} encodes the keynumber as a character [a-o] - */ -static Notify_value -input_event_filter_function (window, event, arg, type) -#ifdef XVIEW - Xv_Window window; -#else - Window window; -#endif XVIEW - Event *event; - Notify_arg arg; - Notify_event_type type; -{ - struct timeval time_stamp; - - if (console_fd) fprintf(console, "Event: %d\n", event_id(event)); - - /* UP L1 is the STOP key */ - if (event_id(event) == WIN_STOP) { - ttysw_input(tty_win, "\007\007\007\007\007\007\007", 7); - return NOTIFY_IGNORED; - } - - /* UP L5 & L7 is Expose & Open, let them pass to sunview */ - if (event_id(event) == KEY_LEFT(5) || event_id(event) == KEY_LEFT(7)) - if(event_is_up (event)) - return notify_next_event_func (window, event, arg, type); - else return NOTIFY_IGNORED; - - if (event_is_button (event)) { /* do Mouse Button events */ -/* Commented out so that we send mouse up events too. - if (event_is_up (event)) - return notify_next_event_func (window, event, arg, type); -*/ - time_stamp = event_time (event); - ttysw_input (tty_win, mouse_prefix, m_prefix_length); - sprintf (buffer, "(%d %d %d %d)\015", - button_value (event), - (event_x (event) - left_margin) / font_width, - event_y (event) / font_height, - time_delta (time_stamp.tv_sec, time_stamp.tv_usec, - prev_event_sec, prev_event_usec) - ); - ttysw_input (tty_win, buffer, strlen(buffer)); - prev_event_sec = time_stamp.tv_sec; - prev_event_usec = time_stamp.tv_usec; - return NOTIFY_IGNORED; - } - - { /* Do the function key events */ - int d; - char c = (char) 0; - if ((event_is_key_left (event)) ? - ((d = event_id(event) - KEY_LEFT(1) + 'a'), c='l') : - ((event_is_key_right (event)) ? - ((d = event_id(event) - KEY_RIGHT(1) + 'a'), c='r') : - ((event_is_key_top (event)) ? - ((d = event_id(event) - KEY_TOP(1) + 'a'), c='t') : 0))) - { - if (event_is_up(event)) return NOTIFY_IGNORED; - if (event_shift_is_down (event)) c = c - 32; - /* this will give a non-{lrt} for unshifted keys */ - if (event_ctrl_is_down (event)) c = c - 64; - if (event_meta_is_down (event)) c = c + 128; -#ifdef WANT_CAPS_LOCK -/* set a toggle and relabel window so T1 can act like caps-lock */ - if (event_id(event) == KEY_TOP(1)) - { - /* make a frame label with and without CAPS */ - strcpy (buffer, Caps); - title = &buffer[CAPS_LEN]; - strncpy (title, (char *)window_get (frame, FRAME_LABEL), - BUFFER_SIZE - CAPS_LEN); - buffer[BUFFER_SIZE] = (char) 0; - if (strncmp (title, Caps, CAPS_LEN) == 0) - title += CAPS_LEN; /* already Caps */ - caps_lock = (caps_lock ? 0 : CAPS_LEN); - window_set(frame, FRAME_LABEL, (title -= caps_lock), 0); - return NOTIFY_IGNORED; - } -#endif - ttysw_input (tty_win, key_prefix, k_prefix_length); - sprintf (buffer, "%c%c", d, c); - ttysw_input(tty_win, buffer, strlen(buffer)); - - return NOTIFY_IGNORED; - } - } - if ((event_is_ascii(event) || event_is_meta(event)) - && event_is_up(event)) return NOTIFY_IGNORED; -#ifdef WANT_CAPS_LOCK -/* shift alpha chars to upper case if toggle is set */ - if ((caps_lock) && event_is_ascii(event) - && (event_id(event) >= 'a') && (event_id(event) <= 'z')) - event_set_id(event, (event_id(event) - 32)); -/* crufty, but it works for now. is there an UPCASE(event)? */ -#endif -#ifndef NO_META_BIT -/* under Openwindows/X, the meta bit is not set in the key event, - * emacs expects this so we add it in here: - */ - if (event_is_ascii(event) && event_meta_is_down(event)) - event_set_id(event, 128 | event_id(event)); -#endif - return notify_next_event_func (window, event, arg, type); -} - -main (argc, argv) - int argc; - char **argv; -{ - int error_code; /* Error codes */ - -#ifdef JLE - setlocale(LC_ALL, ""); -#endif JLE - - if(getenv("DEBUGEMACSTOOL")) - console = fdopen (console_fd = open("/dev/console",O_WRONLY), "w"); - - putenv("IN_EMACSTOOL=t"); /* notify subprocess that it is in emacstool */ - - if (putenv("TERM=sun") != 0) /* TTY_WIN will be a TERM=sun window */ - {fprintf (stderr, "%s: Could not set TERM=sun, using `%s'\n", - argv[0], (char *)getenv("TERM")) ;}; - /* - * If TERMCAP starts with a slash, it is the pathname of the - * termcap file, not an entry extracted from it, so KEEP it! - * Otherwise, it may not relate to the new TERM, so Nuke-It. - * If there is no TERMCAP environment variable, don't make one. - */ - { - char *termcap ; /* Current TERMCAP value */ - termcap = (char *)getenv("TERMCAP") ; - if (termcap && (*termcap != '/')) - { - if (putenv("TERMCAP=") != 0) - {fprintf (stderr, "%s: Could not clear TERMCAP\n", argv[0]) ;} ; - } ; - } ; - - /* find command to run as subprocess in window */ - if (!(argv[0] = (char *)getenv("EMACSTOOL"))) /* Set emacs command name */ - argv[0] = emacs_name; - /* Emacstool recognizes two special args: -rc <file> and -bold <bold-name> */ - for (argc = 1; argv[argc]; argc++) /* Use last one on line */ - { - if(!(strcmp ("-rc", argv[argc]))) /* Override if -rc given */ - {int i = argc; - argv[argc--]=0; /* kill the -rc argument */ - if (argv[i+1]) { /* move to argv[0] and squeeze the rest */ - argv[0]=argv[i+1]; - for (; argv[i+2]; (argv[i]=argv[i+2],argv[++i]=0)); - } - } - - if (!(strcmp ("-bold", argv[argc]))) - {int i = argc; - argv[argc--]=0; /* kill the -bold argument */ - if (argv[i+1]) { /* move to bold_name and squeeze the rest */ - bold_name = argv[i+1]; - for (; argv[i+2]; (argv[i]=argv[i+2],argv[++i]=0)); - } - } - }; - - strcpy (buffer, title); - strncat (buffer, argv[0], /* append run command name */ - (BUFFER_SIZE - (strlen (buffer)) - (strlen (argv[0]))) - 1); - - error_code = interpose_on_window(argc,argv); - if (error_code != 0) { /* Barf */ - fprintf (stderr, "notify_interpose_event_func returns %d.\n", error_code); - exit (1); - } - -#ifdef XVIEW - xv_main_loop (frame); /* And away we go */ -#else - window_main_loop (frame); -#endif XVIEW -} - -#ifdef XVIEW -int interpose_on_window(argc,argv) - int argc; - char **argv; -{ -#ifndef TTERM - int i, font_width_adjust = 1; /* hackery, and heuristics */ - /* if -Wt is not supplied, then font comes out as lucida-14 (width=8) - * rather than the screen.r.12 (width=7) typically used - * this hack attempts to workaround it. - * could use a env var EMACSTOOL_DEFAULT_FONT_WIDTH instead */ - for (i = 1; argv[i]; i++) { - if (!(strcmp ("-Wt", argv[i]))) - {font_width_adjust = 0; - if (console_fd) fprintf(console, "-Wt = %d\n", font_width_adjust); - break;} - } -#endif TTERM - /* initialize Xview, and strip window args */ - xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, 0); - - /* do this first, so arglist can override it */ - frame_icon = icon_create (ICON_LABEL, "Emacstool", - ICON_IMAGE, &icon_image, - 0); - - /* Build a frame to run in */ - frame = xv_create ((Xv_Window)NULL, FRAME, - FRAME_LABEL, buffer, - FRAME_ICON, frame_icon, - 0); - - /* Create a tty with emacs in it */ - tty_win = xv_create (frame, SWTYPE, WIN_IS_CLIENT_PANE, - TTY_QUIT_ON_CHILD_DEATH, TRUE, - TTY_BOLDSTYLE, TTYSW_BOLD_INVERT, - TTY_ARGV, argv, - 0); - - if (bold_name) { - (void)xv_set(tty_win, TTY_BOLDSTYLE_NAME, bold_name, 0); - } - - { - Xv_font font; /* declare temp font variable */ - font = (Xv_font)xv_get (tty_win, XV_FONT); - font_height = (int)xv_get (font, FONT_DEFAULT_CHAR_HEIGHT); - font_width = (int)xv_get (font, FONT_DEFAULT_CHAR_WIDTH); - } - if (console_fd) fprintf(console, "Width = %d\n", font_width); - -#ifndef TTERM - font_width -= font_width_adjust; /* A guess! font bug in ttysw*/ -#else - /* make the termsw act as a tty */ - xv_set(tty_win, TERMSW_MODE, TTYSW_MODE_TYPE, 0); - /* termsw has variable offset depending on scrollbar size/location */ - left_margin = (int)xv_get (tty_win, TEXTSW_LEFT_MARGIN); -#endif TTERM - - tty_view = (Xv_Window) xv_get (tty_win, OPENWIN_NTH_VIEW, 0); - xv_set(tty_view, - WIN_CONSUME_EVENTS, - WIN_MOUSE_BUTTONS, WIN_UP_EVENTS, - ACTION_ADJUST, ACTION_MENU, - WIN_ASCII_EVENTS, - WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, - 0, - 0); - /* Interpose my event function */ - return (int) notify_interpose_event_func - (tty_view, input_event_filter_function, NOTIFY_SAFE); -} -#else -int interpose_on_window (argc, argv) - int argc; - char **argv; -{ - /* do this first, so arglist can override it */ - frame_icon = icon_create (ICON_LABEL, "Emacstool", - ICON_IMAGE, &icon_image, - 0); - - /* Build a frame to run in */ - frame = window_create ((Window)NULL, FRAME, - FRAME_LABEL, buffer, - FRAME_ICON, frame_icon, - FRAME_ARGC_PTR_ARGV, &argc, argv, - 0); - - /* Create a tty with emacs in it */ - tty_win = window_create (frame, TTY, - TTY_QUIT_ON_CHILD_DEATH, TRUE, - TTY_BOLDSTYLE, TTYSW_BOLD_INVERT, - TTY_ARGV, argv, - 0); - - if (bold_name) { - (void)window_set(tty_win, TTY_BOLDSTYLE_NAME, bold_name, 0); - } - - /* ttysw uses pf_default, one must set WIN_FONT explicitly */ - window_set (tty_win, WIN_FONT, pf_default(), 0); - font_height = (int)window_get (tty_win, WIN_ROW_HEIGHT); - font_width = (int)window_get (tty_win, WIN_COLUMN_WIDTH); - - tty_view = tty_win; - window_set(tty_view, - WIN_CONSUME_PICK_EVENTS, - WIN_STOP, - WIN_MOUSE_BUTTONS, WIN_UP_EVENTS, - /* LOC_WINENTER, LOC_WINEXIT, LOC_MOVE, */ - 0, - WIN_CONSUME_KBD_EVENTS, - WIN_STOP, - WIN_ASCII_EVENTS, - WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, - /* WIN_UP_ASCII_EVENTS, */ - 0, - 0); - /* Interpose my event function */ - return (int) notify_interpose_event_func - (tty_view, input_event_filter_function, NOTIFY_SAFE); -} -#endif XVIEW - -/* arch-tag: 7a2e7105-c059-418a-b3d9-5b5de96abb4e - (do not change this comment) */ diff --git a/lib-src/etags.c b/lib-src/etags.c index 951d408ec3c..2fe0c6314fd 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -81,7 +81,7 @@ University of California, as described above. */ * configuration file containing regexp definitions for etags. */ -char pot_etags_version[] = "@(#) pot revision number is 17.26"; +char pot_etags_version[] = "@(#) pot revision number is 17.38"; #define TRUE 1 #define FALSE 0 @@ -160,7 +160,20 @@ char pot_etags_version[] = "@(#) pot revision number is 17.26"; # include <stdlib.h> # include <string.h> # else /* no standard C headers */ - extern char *getenv (); + extern char *getenv __P((const char *)); + extern char *strcpy __P((char *, const char *)); + extern char *strncpy __P((char *, const char *, unsigned long)); + extern char *strcat __P((char *, const char *)); + extern char *strncat __P((char *, const char *, unsigned long)); + extern int strcmp __P((const char *, const char *)); + extern int strncmp __P((const char *, const char *, unsigned long)); + extern int system __P((const char *)); + extern unsigned long strlen __P((const char *)); + extern void *malloc __P((unsigned long)); + extern void *realloc __P((void *, unsigned long)); + extern void exit __P((int)); + extern void free __P((void *)); + extern void *memmove __P((void *, const void *, unsigned long)); # ifdef VMS # define EXIT_SUCCESS 1 # define EXIT_FAILURE 0 @@ -484,7 +497,7 @@ static char *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789"; static bool append_to_tagfile; /* -a: append to tags */ -/* The next four default to TRUE for etags, but to FALSE for ctags. */ +/* The next five default to TRUE in C and derived languages. */ static bool typedefs; /* -t: create tags for C and Ada typedefs */ static bool typedefs_or_cplusplus; /* -T: create tags for C typedefs, level */ /* 0 struct/enum/union decls, and C++ */ @@ -626,10 +639,11 @@ static char default_C_help [] = definitions of `struct', `union' and `enum'. `#define' macro\n\ definitions and `enum' constants are tags unless you specify\n\ `--no-defines'. Global variables are tags unless you specify\n\ -`--no-globals'. Use of `--no-globals' and `--no-defines'\n\ -can make the tags table file much smaller.\n\ +`--no-globals' and so are struct members unless you specify\n\ +`--no-members'. Use of `--no-globals', `--no-defines' and\n\ +`--no-members' can make the tags table file much smaller.\n\ You can tag function declarations and external variables by\n\ -using `--declarations', and struct members by using `--members'."; +using `--declarations'."; #endif /* C help for Ctags and Etags */ static char *Cplusplus_suffixes [] = @@ -641,7 +655,7 @@ static char Cplusplus_help [] = "In C++ code, all the tag constructs of C code are tagged. (Use\n\ --help --lang=c --lang=c++ for full help.)\n\ In addition to C tags, member functions are also recognized. Member\n\ -variables are also recognized if you use the `--members' option.\n\ +variables are recognized unless you use the `--no-members' option.\n\ Tags for variables and functions in classes are named `CLASS::VARIABLE'\n\ and `CLASS::FUNCTION'. `operator' definitions have tag names like\n\ `operator+'."; @@ -736,8 +750,8 @@ defined in the default package is `main::SUB'."; static char *PHP_suffixes [] = { "php", "php3", "php4", NULL }; static char PHP_help [] = -"In PHP code, tags are functions, classes and defines. When using\n\ -the `--members' option, vars are tags too."; +"In PHP code, tags are functions, classes and defines. Unless you use\n\ +the `--no-members' option, vars are tags too."; static char *plain_C_suffixes [] = { "pc", /* Pro*C file */ @@ -885,18 +899,25 @@ etags --help --lang=ada."); # define EMACS_NAME "standalone" #endif #ifndef VERSION -# define VERSION "17.26" +# define VERSION "17.38" #endif static void print_version () { + /* Makes it easier to update automatically. */ + char emacs_copyright[] = "Copyright (C) 2008 Free Software Foundation, Inc."; + printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION); - puts ("Copyright (C) 2008 Free Software Foundation, Inc."); + puts (emacs_copyright); puts ("This program is distributed under the terms in ETAGS.README"); exit (EXIT_SUCCESS); } +#ifndef PRINT_UNDOCUMENTED_OPTIONS_HELP +# define PRINT_UNDOCUMENTED_OPTIONS_HELP FALSE +#endif + static void print_help (argbuffer) argument *argbuffer; @@ -979,8 +1000,18 @@ Relative ones are stored relative to the output file's directory.\n"); puts ("--no-globals\n\ Do not create tag entries for global variables in some\n\ languages. This makes the tags file smaller."); - puts ("--members\n\ + + if (PRINT_UNDOCUMENTED_OPTIONS_HELP) + puts ("--no-line-directive\n\ + Ignore #line preprocessor directives in C and derived languages."); + + if (CTAGS) + puts ("--members\n\ Create tag entries for members of structures in some languages."); + else + puts ("--no-members\n\ + Do not create tag entries for members of structures\n\ + in some languages."); puts ("-r REGEXP, --regex=REGEXP or --regex=@regexfile\n\ Make a tag for each line matching a regular expression pattern\n\ @@ -994,13 +1025,17 @@ Relative ones are stored relative to the output file's directory.\n"); MODS are optional one-letter modifiers: `i' means to ignore case,\n\ `m' means to allow multi-line matches, `s' implies `m' and\n\ causes dot to match any character, including newline."); + puts ("-R, --no-regex\n\ Don't create tags from regexps for the following files."); + puts ("-I, --ignore-indentation\n\ In C and C++ do not assume that a closing brace in the first\n\ column is the final brace of a function or structure definition."); + puts ("-o FILE, --output=FILE\n\ Write the tags to FILE."); + puts ("--parse-stdin=NAME\n\ Read from standard input and record tags as belonging to file NAME."); @@ -1028,13 +1063,16 @@ Relative ones are stored relative to the output file's directory.\n"); Print on the standard output an index of items intended for\n\ human consumption, similar to the output of vgrind. The index\n\ is sorted, and gives the page number of each item."); -# if PRINT_UNDOCUMENTED_OPTIONS_HELP - puts ("-w, --no-duplicates\n\ + + if (PRINT_UNDOCUMENTED_OPTIONS_HELP) + puts ("-w, --no-duplicates\n\ Do not create duplicate tag entries, for compatibility with\n\ traditional ctags."); - puts ("-w, --no-warn\n\ + + if (PRINT_UNDOCUMENTED_OPTIONS_HELP) + puts ("-w, --no-warn\n\ Suppress warning messages about duplicate tag entries."); -# endif /* PRINT_UNDOCUMENTED_OPTIONS_HELP */ + puts ("-x, --cxref\n\ Like --vgrind, but in the style of cxref, rather than vgrind.\n\ The output uses line numbers instead of page numbers, but\n\ @@ -1217,15 +1255,12 @@ main (argc, argv) argbuffer = xnew (argc, argument); /* - * If etags, always find typedefs and structure tags. Why not? - * Also default to find macro constants, enum constants and - * global variables. + * Always find typedefs and structure tags. + * Also default to find macro constants, enum constants, struct + * members and global variables. Do it for both etags and ctags. */ - if (!CTAGS) - { - typedefs = typedefs_or_cplusplus = constantypedefs = TRUE; - globals = TRUE; - } + typedefs = typedefs_or_cplusplus = constantypedefs = TRUE; + globals = members = TRUE; /* When the optstring begins with a '-' getopt_long does not rearrange the non-options arguments to be at the end, but leaves them alone. */ @@ -2465,6 +2500,7 @@ while, 0, st_C_ignore switch, 0, st_C_ignore return, 0, st_C_ignore __attribute__, 0, st_C_attribute +GTY, 0, st_C_attribute @interface, 0, st_C_objprot @protocol, 0, st_C_objprot @implementation,0, st_C_objimpl @@ -2528,9 +2564,9 @@ hash (str, len) 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 15, - 14, 35, 35, 35, 35, 35, 35, 35, 14, 35, - 35, 35, 35, 12, 13, 35, 35, 35, 35, 12, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 3, + 26, 35, 35, 35, 35, 35, 35, 35, 27, 35, + 35, 35, 35, 24, 0, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 1, 35, 16, 35, 6, 23, 0, 0, 35, 22, 0, 35, 35, 5, 0, 0, 15, 1, 35, 6, 35, 8, 19, 35, 16, @@ -2570,7 +2606,7 @@ in_word_set (str, len) { enum { - TOTAL_KEYWORDS = 32, + TOTAL_KEYWORDS = 33, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 15, MIN_HASH_VALUE = 2, @@ -2581,7 +2617,7 @@ in_word_set (str, len) { {""}, {""}, {"if", 0, st_C_ignore}, - {""}, + {"GTY", 0, st_C_attribute}, {"@end", 0, st_C_objend}, {"union", 0, st_C_struct}, {"define", 0, st_C_define}, @@ -3220,16 +3256,16 @@ make_C_tag (isfun) { /* This function is never called when token.valid is FALSE, but we must protect against invalid input or internal errors. */ - if (!DEBUG && !token.valid) - return; - if (token.valid) make_tag (token_name.buffer, token_name.len, isfun, token.line, token.offset+token.length+1, token.lineno, token.linepos); - else /* this case is optimised away if !DEBUG */ - make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""), - token_name.len + 17, isfun, token.line, - token.offset+token.length+1, token.lineno, token.linepos); + else if (DEBUG) + { /* this branch is optimised away if !DEBUG */ + make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""), + token_name.len + 17, isfun, token.line, + token.offset+token.length+1, token.lineno, token.linepos); + error ("INVALID TOKEN", NULL); + } token.valid = FALSE; } @@ -3976,7 +4012,7 @@ C_entries (c_ext, inf) } else if (bracelev < 0) { - token.valid = FALSE; /* something gone amiss, token unreliable */ + token.valid = FALSE; /* something gone amiss, token unreliable */ bracelev = 0; } if (bracelev == 0 && fvdef == vignore) diff --git a/lib-src/fakemail.c b/lib-src/fakemail.c index 10a9cdb20ea..993f90f3e86 100644 --- a/lib-src/fakemail.c +++ b/lib-src/fakemail.c @@ -19,7 +19,6 @@ along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#define NO_SHORTNAMES #define _XOPEN_SOURCE 500 /* for cuserid */ #ifdef HAVE_CONFIG_H diff --git a/lib-src/make-docfile.c b/lib-src/make-docfile.c index 1564aca5bbe..1f5dff29fb4 100644 --- a/lib-src/make-docfile.c +++ b/lib-src/make-docfile.c @@ -35,7 +35,6 @@ Boston, MA 02110-1301, USA. */ Then comes the documentation for that function or variable. */ -#define NO_SHORTNAMES /* Tell config not to load remap.h */ #include <config.h> /* defined to be emacs_main, sys_fopen, etc. in config.h */ @@ -62,11 +61,7 @@ Boston, MA 02110-1301, USA. */ #endif /* not DOS_NT */ #ifndef DIRECTORY_SEP -#ifdef MAC_OS8 -#define DIRECTORY_SEP ':' -#else /* not MAC_OS8 */ #define DIRECTORY_SEP '/' -#endif /* not MAC_OS8 */ #endif #ifndef IS_DIRECTORY_SEP diff --git a/lib-src/makefile.w32-in b/lib-src/makefile.w32-in index 32f3fcc58ad..7bd23ee9edd 100644 --- a/lib-src/makefile.w32-in +++ b/lib-src/makefile.w32-in @@ -24,7 +24,7 @@ ALL = make-docfile hexl ctags etags movemail ebrowse sorted-doc digest-doc emacs .PHONY: $(ALL) -VERSION = 22.1.92 +VERSION = 23.0.50 LOCAL_FLAGS = -DWINDOWSNT -DDOS_NT -DSTDC_HEADERS=1 -DNO_LDAV=1 \ -DNO_ARCHIVES=1 -DHAVE_CONFIG_H=1 -I../nt/inc \ @@ -142,21 +142,22 @@ $(BLD)/ctags.$(O): ctags.c # make-docfile blindly replaces .o with .c anyway. Keep .o in this list # as it is required by code in doc.c. # -obj= sunfns.o dosfns.o msdos.o \ - xterm.o xfns.o xmenu.o xselect.o xrdb.o fringe.o image.o \ - mac.o macterm.o macfns.o macmenu.o fontset.o \ +obj = dosfns.o msdos.o \ + xterm.o xfns.o xmenu.o xselect.o xrdb.o xsmfns.o fringe.o image.o \ + mac.o macterm.o macfns.o macmenu.o macselect.o fontset.o \ w32.o w32bdf.o w32console.o w32fns.o w32heap.o w32inevt.o \ w32menu.o w32proc.o w32reg.o w32select.o w32term.o w32xfns.o \ + font.o w32font.o \ dispnew.o frame.o scroll.o xdisp.o window.o \ - charset.o coding.o category.o ccl.o \ - cm.o term.o xfaces.o \ + charset.o coding.o category.o ccl.o character.o chartab.o \ + cm.o term.o terminal.o xfaces.o \ emacs.o keyboard.o macros.o keymap.o sysdep.o \ buffer.o filelock.o insdel.o marker.o \ minibuf.o fileio.o dired.o filemode.o \ cmds.o casetab.o casefiddle.o indent.o search.o regex.o undo.o \ alloc.o data.o doc.o editfns.o callint.o \ eval.o floatfns.o fns.o print.o lread.o \ - abbrev.o syntax.o bytecode.o \ + syntax.o bytecode.o \ process.o callproc.o \ region-cache.o sound.o atimer.o \ doprnt.o strftime.o intervals.o textprop.o composite.o md5.o @@ -166,30 +167,57 @@ obj= sunfns.o dosfns.o msdos.o \ # lispsource = ../lisp/ -MOUSE_SUPPORT = $(lispsource)select.elc $(lispsource)scroll-bar.elc $(lispsource)mouse.elc $(lispsource)tooltip.elc -WINNT_SUPPORT = $(lispsource)ls-lisp.elc $(lispsource)disp-table.elc $(lispsource)w32-fns.elc $(lispsource)dos-w32.elc $(lispsource)w32-vars.elc +MOUSE_SUPPORT = \ + $(lispsource)select.elc \ + $(lispsource)scroll-bar.elc \ + $(lispsource)mouse.elc +WINNT_SUPPORT = \ + $(lispsource)ls-lisp.elc \ + $(lispsource)disp-table.elc \ + $(lispsource)w32-fns.elc \ + $(lispsource)dos-w32.elc \ + $(lispsource)w32-vars.elc \ + $(lispsource)term/w32-win.elc +TOOLTIP_SUPPORT = $(lispsource)tooltip.elc +WINDOW_SUPPORT = \ + $(lispsource)fringe.elc \ + $(lispsource)image.elc \ + $(lispsource)international/fontset.elc \ + $(lispsource)dnd.elc \ + $(lispsource)tool-bar.elc \ + $(lispsource)mwheel.elc # lisp files that are loaded up on other platforms -MSDOS_SUPPORT = $(lispsource)dos-fns.elc $(lispsource)dos-vars.elc $(lispsource)international/ccl.elc $(lispsource)international/codepage.elc -VMS_SUPPORT = $(lispsource)vmsproc.elc $(lispsource)vms-patch.elc +OTHER_PLATFORM_SUPPORT = \ + $(lispsource)dos-fns.elc \ + $(lispsource)dos-vars.elc \ + $(lispsource)international/ccl.elc \ + $(lispsource)international/codepage.elc \ + $(lispsource)vmsproc.el \ + $(lispsource)vms-patch.el \ + $(lispsource)x-dnd.elc \ + $(lispsource)term/x-win.elc + lisp1= \ $(lispsource)abbrev.elc \ $(lispsource)buff-menu.elc \ $(lispsource)button.elc \ $(lispsource)emacs-lisp/byte-run.elc \ + $(lispsource)composite.elc \ $(lispsource)cus-face.elc \ $(lispsource)cus-start.elc \ $(lispsource)custom.elc \ $(lispsource)emacs-lisp/backquote.elc \ $(lispsource)emacs-lisp/lisp-mode.elc \ $(lispsource)emacs-lisp/lisp.elc \ - $(lispsource)facemenu.elc \ - $(MOUSE_SUPPORT) \ + $(lispsource)env.elc \ $(lispsource)faces.elc \ $(lispsource)files.elc \ - $(lispsource)emacs-lisp/float-sup.elc \ $(lispsource)format.elc \ + $(lispsource)facemenu.elc \ + $(MOUSE_SUPPORT) \ + $(lispsource)emacs-lisp/float-sup.elc \ $(lispsource)frame.elc \ $(lispsource)help.elc \ $(lispsource)indent.elc \ @@ -199,37 +227,19 @@ lisp1= \ $(lispsource)loaddefs.el \ $(lispsource)bindings.elc \ $(lispsource)emacs-lisp/map-ynp.elc \ - $(lispsource)env.elc \ + $(lispsource)menu-bar.elc \ $(lispsource)international/mule.elc \ $(lispsource)international/mule-conf.el \ $(lispsource)international/mule-cmds.elc \ $(lispsource)international/characters.elc \ - $(lispsource)international/ucs-tables.elc \ - $(lispsource)international/utf-8.elc \ - $(lispsource)international/utf-16.elc \ - $(lispsource)international/latin-1.el \ - $(lispsource)international/latin-2.el \ - $(lispsource)international/latin-3.el \ - $(lispsource)international/latin-4.el \ - $(lispsource)international/latin-5.el \ - $(lispsource)international/latin-8.el \ - $(lispsource)international/latin-9.el \ - $(lispsource)fringe.elc \ - $(lispsource)image.elc \ - $(lispsource)international/fontset.elc \ - $(lispsource)dnd.elc \ - $(lispsource)mwheel.elc \ - $(lispsource)tool-bar.elc \ + $(lispsource)international/charprop.el \ $(lispsource)case-table.elc lisp2 = \ - $(lispsource)language/chinese.elc \ - $(lispsource)language/cyrillic.elc \ - $(lispsource)language/indian.elc \ - $(lispsource)language/devanagari.el \ - $(lispsource)language/kannada.el \ - $(lispsource)language/malayalam.el \ - $(lispsource)language/tamil.el \ + $(lispsource)language/chinese.el \ + $(lispsource)language/cyrillic.el \ + $(lispsource)language/indian.el \ + $(lispsource)language/sinhala.el \ $(lispsource)language/english.el \ $(lispsource)language/ethiopic.elc \ $(lispsource)language/european.elc \ @@ -241,13 +251,16 @@ lisp2 = \ $(lispsource)language/japanese.el \ $(lispsource)language/korean.el \ $(lispsource)language/lao.el \ + $(lispsource)language/cham.el \ + $(lispsource)language/tai-viet.el \ $(lispsource)language/thai.el \ $(lispsource)language/tibetan.elc \ - $(lispsource)language/vietnamese.elc \ + $(lispsource)language/vietnamese.el \ $(lispsource)language/misc-lang.el \ $(lispsource)language/utf-8-lang.el \ $(lispsource)language/georgian.el \ - $(lispsource)menu-bar.elc \ + $(lispsource)language/khmer.el \ + $(lispsource)language/burmese.el \ $(lispsource)paths.el \ $(lispsource)register.elc \ $(lispsource)replace.elc \ @@ -264,12 +277,12 @@ lisp2 = \ $(lispsource)textmodes/paragraphs.elc \ $(lispsource)textmodes/text-mode.elc \ $(lispsource)emacs-lisp/timer.elc \ - $(lispsource)vc-hooks.elc \ $(lispsource)jka-cmpr-hook.elc \ + $(lispsource)vc-hooks.elc \ $(lispsource)ediff-hook.elc \ - $(VMS_SUPPORT) \ - $(MSDOS_SUPPORT) \ + $(TOOLTIP_SUPPORT) \ $(WINNT_SUPPORT) \ + $(WINDOW_SUPPORT) \ $(lispsource)widget.elc \ $(lispsource)window.elc \ $(lispsource)version.el @@ -285,11 +298,12 @@ lisp2 = \ - $(DEL) temacs.exe DOC = DOC -$(DOC): stamp_BLD $(BLD)/make-docfile.exe ../src/$(BLD)/temacs.exe $(lisp1) $(lisp2) +$(DOC): stamp_BLD $(BLD)/make-docfile.exe ../src/$(BLD)/temacs.exe $(lisp1) $(lisp2) $(OTHER_PLATFORM_SUPPORT) - $(DEL) $(DOC) "$(THISDIR)/$(BLD)/make-docfile" -o $(DOC) -d ../src $(obj) "$(THISDIR)/$(BLD)/make-docfile" -a $(DOC) -d ../src $(lisp1) "$(THISDIR)/$(BLD)/make-docfile" -a $(DOC) -d ../src $(lisp2) + "$(THISDIR)/$(BLD)/make-docfile" -a $(DOC) -d ../src $(OTHER_PLATFORM_SUPPORT) $(CP) $(DOC) ../etc/DOC-X - mkdir "../src/$(OBJDIR)" - mkdir "../src/$(OBJDIR)/etc" diff --git a/lib-src/movemail.c b/lib-src/movemail.c index 8ccf6ce554a..cc4d0dbf6c7 100644 --- a/lib-src/movemail.c +++ b/lib-src/movemail.c @@ -55,7 +55,6 @@ Boston, MA 02110-1301, USA. */ * */ -#define NO_SHORTNAMES /* Tell config not to load remap.h */ #include <config.h> #include <sys/types.h> #include <sys/stat.h> @@ -113,7 +112,7 @@ Boston, MA 02110-1301, USA. */ #define R_OK 4 #endif -#if defined (XENIX) || defined (WINDOWSNT) +#ifdef WINDOWSNT #include <sys/locking.h> #endif @@ -388,13 +387,13 @@ main (argc, argv) if (indesc < 0) pfatal_with_name (inname); -#if defined (BSD_SYSTEM) || defined (XENIX) +#ifdef BSD_SYSTEM /* In case movemail is setuid to root, make sure the user can read the output file. */ /* This is desirable for all systems but I don't want to assume all have the umask system call */ umask (umask (0) & 0333); -#endif /* BSD_SYSTEM || XENIX */ +#endif /* BSD_SYSTEM */ outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666); if (outdesc < 0) pfatal_with_name (outname); @@ -422,15 +421,11 @@ main (argc, argv) #ifdef MAIL_USE_LOCKF status = lockf (indesc, F_LOCK, 0); #else /* not MAIL_USE_LOCKF */ -#ifdef XENIX - status = locking (indesc, LK_RLCK, 0L); -#else #ifdef WINDOWSNT status = locking (indesc, LK_RLCK, -1L); #else status = flock (indesc, LOCK_EX); #endif -#endif #endif /* not MAIL_USE_LOCKF */ #endif /* MAIL_USE_SYSTEM_LOCK */ } @@ -503,13 +498,7 @@ main (argc, argv) #ifdef MAIL_USE_SYSTEM_LOCK if (! preserve_mail) { -#if defined (STRIDE) || defined (XENIX) - /* Stride, xenix have file locking, but no ftruncate. - This mess will do. */ - close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666)); -#else ftruncate (indesc, 0L); -#endif /* STRIDE or XENIX */ } #endif /* MAIL_USE_SYSTEM_LOCK */ diff --git a/lib-src/pop.c b/lib-src/pop.c index 7de5e17e20d..140eeea056e 100644 --- a/lib-src/pop.c +++ b/lib-src/pop.c @@ -21,7 +21,6 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H -#define NO_SHORTNAMES /* Tell config not to load remap.h */ #include <config.h> #else #define MAIL_USE_POP @@ -1029,12 +1028,19 @@ socket_connection (host, flags) char *host; int flags; { +#ifdef HAVE_GETADDRINFO + struct addrinfo *res, *it; + struct addrinfo hints; + int ret; +#else /* !HAVE_GETADDRINFO */ struct hostent *hostent; +#endif struct servent *servent; struct sockaddr_in addr; char found_port = 0; char *service; int sock; + char *realhost; #ifdef KERBEROS #ifdef KERBEROS5 krb5_error_code rem; @@ -1050,11 +1056,11 @@ socket_connection (host, flags) CREDENTIALS cred; Key_schedule schedule; int rem; - char *realhost; #endif /* KERBEROS5 */ #endif /* KERBEROS */ int try_count = 0; + int connect_ok; #ifdef WINDOWSNT { @@ -1116,6 +1122,46 @@ socket_connection (host, flags) } +#ifdef HAVE_GETADDRINFO + memset (&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_CANONNAME; + hints.ai_family = AF_INET; + do + { + ret = getaddrinfo (host, service, &hints, &res); + try_count++; + if (ret != 0 && (ret != EAI_AGAIN || try_count == 5)) + { + strcpy (pop_error, "Could not determine POP server's address"); + return (-1); + } + } while (ret != 0); + + if (ret == 0) + { + it = res; + while (it) + { + if (it->ai_addrlen == sizeof (addr)) + { + struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr; + bcopy (&in_a->sin_addr, (char *) &addr.sin_addr, + sizeof (addr.sin_addr)); + if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr))) + break; + } + it = it->ai_next; + } + connect_ok = it != NULL; + if (connect_ok) + { + realhost = alloca (strlen (it->ai_canonname) + 1); + strcpy (realhost, it->ai_canonname); + } + freeaddrinfo (res); + } +#else /* !HAVE_GETADDRINFO */ do { hostent = gethostbyname (host); @@ -1135,10 +1181,18 @@ socket_connection (host, flags) break; hostent->h_addr_list++; } + connect_ok = *hostent->h_addr_list != NULL; + if (! connect_ok) + { + realhost = alloca (strlen (hostent->h_name) + 1); + strcpy (realhost, hostent->h_name); + } + +#endif /* !HAVE_GETADDRINFO */ #define CONNECT_ERROR "Could not connect to POP server: " - if (! *hostent->h_addr_list) + if (! connect_ok) { CLOSESOCKET (sock); strcpy (pop_error, CONNECT_ERROR); @@ -1149,6 +1203,7 @@ socket_connection (host, flags) } #ifdef KERBEROS + #define KRB_ERROR "Kerberos error connecting to POP server: " if (! (flags & POP_NO_KERBEROS)) { @@ -1176,7 +1231,7 @@ socket_connection (host, flags) if (rem = krb5_cc_get_principal (kcontext, ccdef, &client)) goto krb5error; - for (cp = hostent->h_name; *cp; cp++) + for (cp = realhost; *cp; cp++) { if (isupper (*cp)) { @@ -1184,7 +1239,7 @@ socket_connection (host, flags) } } - if (rem = krb5_sname_to_principal (kcontext, hostent->h_name, + if (rem = krb5_sname_to_principal (kcontext, realhost, POP_SERVICE, FALSE, &server)) goto krb5error; @@ -1229,7 +1284,6 @@ socket_connection (host, flags) } #else /* ! KERBEROS5 */ ticket = (KTEXT) malloc (sizeof (KTEXT_ST)); - realhost = strdup (hostent->h_name); rem = krb_sendauth (0L, sock, ticket, "pop", realhost, (char *) krb_realmofhost (realhost), (unsigned long) 0, &msg_data, &cred, schedule, @@ -1237,7 +1291,6 @@ socket_connection (host, flags) (struct sockaddr_in *) 0, "KPOPV0.1"); free ((char *) ticket); - free (realhost); if (rem != KSUCCESS) { strcpy (pop_error, KRB_ERROR); |