about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CHANGES35
-rw-r--r--INSTALLATION20
-rw-r--r--WWW/Library/Implementation/HTTCP.c45
-rw-r--r--lynx.cfg26
-rw-r--r--lynx_help/keystrokes/keystroke_help.html3
-rw-r--r--lynx_help/lynx-dev.html94
-rw-r--r--src/GridText.c5
-rw-r--r--src/HTAlert.c2
-rw-r--r--src/LYCurses.c1
-rw-r--r--src/LYDownload.c5
-rw-r--r--src/LYGlobalDefs.h1
-rw-r--r--src/LYMain.c1
-rw-r--r--src/LYMainLoop.c35
-rw-r--r--src/LYOptions.c71
-rw-r--r--src/LYOptions.h63
-rw-r--r--src/LYReadCFG.c1
-rw-r--r--src/LYShowInfo.c2
-rw-r--r--src/LYUtils.c35
-rw-r--r--userdefs.h20
19 files changed, 301 insertions, 164 deletions
diff --git a/CHANGES b/CHANGES
index 7b1701c9..aad6ffcd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,37 @@
 Changes since Lynx 2.8 release
 ================================================================================
 
+1998-10-10 (2.8.1pre.9)
+* add verbose_links variable to lynx.cfg and userdefs.h to control whether Lynx
+  should show "(LINK)" before links (request/patch by Moshe Zadka
+  <moshez@math.huji.ac.il>) - TD
+* change defaults in lynx.cfg and userdefs.h, add comments - PW
+  (a) defaults are stated for `verbose' & `KB';
+  (b) GOTOBUFFER & JUMPBUFFER defaults to TRUE; 
+  (c) QUIT_DEFAULT_YES defaults to FALSE 
+* restore suggested file name in download menu:  it is really useful for other
+  download methods which should be available in menu when `save to disk' is
+  disabled.  Remove local_path/ prefix (LYNX_SAVE_SPACE if any) from visible
+  suggested file name string near the top instead - LP
+* restore newline position when toggling comments parsing (at least we could
+  return to previous screen to try comments toggling twice) - LP
+* add a link from keystrokes help for edit_help.html (input line keys) - LP 
+* corrected to make -nostatus command-line option override HTReadProgress - TD
+* updates to lynx-dev.html (Al Gilman).
+* modify NSL-fork support in HTTCP.c to use waitpid call to reap child processes
+  which may otherwise become orphaned.  The new variable "dns_patience"
+  represents how many seconds we're willing to wait for DNS to respond (should
+  later make it configurable) - BL
+* modify PutTextInput and PutDefs macros in LYOptions.c and LYShowInfo.c to
+  avoid pre-ANSI compilers attempting to substitute macro parameters in
+  coincidental matches within quoted strings - BL
+  gcc -Wtraditional reports the first, but not the second, which is "n"
+  substituted into "\n" - TD
+* add an error-check for fg/bg values to lynx_chg_color function in case lynx.cfg
+  specifies color names not in Lynx's table - BL
+* modify IsOurFile function to accommodate links-to-links, so that users whose
+  home directory is reached by that type of path can save .lynxrc file
+  (reported by PW) - TD
 1998-10-04 (2.8.1pre.8)
 * modify HTTCP.c to copy soc_in from phost in HTParseInet, making Lynx/32 do
   lookups again - WB
@@ -9,8 +40,8 @@ Changes since Lynx 2.8 release
 1998-10-04 (2.8.1pre.7)
 * add special-case CF_TERMIOS_AND_CURSES configure macro (fixes problem reported
   by Philippe De Muyter) - TD
-* update/reorganize option_help.html (Philip Webb).
-* Restore newline position when return from the Print menu or follow a link
+* update/reorganize option_help.html - PW
+* restore newline position when return from the Print menu or follow a link
   from History page (was broken for partial display mode only):  LYPop() and
   LYPop_num now reinitialize Newline_partial if it happens on getfile stage. 
   Also remove changes from 1998-06-11 (case LYK_DOWNLOAD) since this is now
diff --git a/INSTALLATION b/INSTALLATION
index 9e7f9418..103b61fc 100644
--- a/INSTALLATION
+++ b/INSTALLATION
@@ -134,13 +134,22 @@ II. Compile instructions -- UNIX
 	IRIX 5.2 and 6.2 (cc & gcc w/ curses, ncurses & slang)
 	Linux 2.0.0 (gcc 2.7.2 w/ curses, ncurses & slang)
 	MkLinux 2.1.5 (gcc 2.7.2.1)	NetBSD
-	OS/2 EMX 0.9b			SCO (cc w/ curses)
+	OS/2 EMX 0.9b (ncurses) 	SCO (cc w/ curses)
 	Solaris 2.5 & 2.6 (cc & gcc w/ curses, ncurses & slang)
 	SunOS 4.1 (cc w/ curses, gcc w/ ncurses & slang)
 
-    NOTE:  SunOS and HP-UX come with a bundled K&R compiler, which is only
-    useful for compiling with the bundled curses.  Both ncurses and slang
-    require a compiler that recognizes prototypes.
+    NOTES:
+
+      + SunOS and HP-UX come with a bundled K&R compiler, which is only useful
+	for compiling with the bundled curses.  Both ncurses and slang require
+	a compiler that recognizes prototypes.
+
+      + ncurses 4.2 builds/works on OS/2; however you should get at least the
+	post-4.2 patches from October 1998, since that supports mouse and
+	screen sizes other than 25x80.
+
+	    http://www.clark.net/pub/dickey/ncurses/ncurses.faq.html
+	    ftp://ftp.clark.net/pub/dickey/ncurses/
 
 1c. Options
     To get a list of the configure script's options, type "./configure --help".
@@ -259,8 +268,7 @@ II. Compile instructions -- UNIX
 	Use forms-based options screen only.
 	Please note that a few users with broken curses may have problems
 	with popup forms fields.  (The default behaviour is to compile
-	both styles options menu code with FORMS_OPTIONS switch in lynx.cfg
-	as well as -forms_options command line toggle).
+	both styles options menu code with FORMS_OPTIONS switch in lynx.cfg).
 
   --enable-internal-links		(define DONT_TRACK_INTERNAL_LINKS)
 	Disabled by default, this option allows tracking of internal links,
diff --git a/WWW/Library/Implementation/HTTCP.c b/WWW/Library/Implementation/HTTCP.c
index 41592324..05cce142 100644
--- a/WWW/Library/Implementation/HTTCP.c
+++ b/WWW/Library/Implementation/HTTCP.c
@@ -306,6 +306,19 @@ PUBLIC CONST char * HTInetString ARGS1(
 }
 #endif /* !DECNET */
 
+#ifdef NSL_FORK
+/*
+**  Function to allow us to be killed with a normal signal (not
+**  SIGKILL), but don't go through normal libc exit() processing, which
+**  would screw up parent's stdio.  -BL
+*/
+PRIVATE void quench ARGS1(
+	int,	sig GCC_UNUSED)
+{
+    _exit(2);
+}
+#endif /* NSL_FORK */
+
 /*	Parse a network node address and port
 **	-------------------------------------
 **
@@ -432,10 +445,25 @@ PUBLIC int HTParseInet ARGS2(
 	    **	Pipe, child pid, status buffers, cycle count, select()
 	    **	control variables.
 	    */
-	    pid_t fpid, waitret = (pid_t)0;
+	    pid_t fpid, waitret;
 	    int pfd[2], cstat, cst1 = 0, cycle = 0;
 	    fd_set readfds;
 	    struct timeval timeout;
+	    int dns_patience = 30; /* how many seconds will we wait for DNS? */
+
+	    /*
+	    **  Reap any children that have terminated since last time
+	    **  through.  This might include children that we killed,
+	    **  then waited with WNOHANG before they were actually ready
+	    **  to be reaped.  (Should be max of 1 in this state, but
+	    **  the loop is safe if waitpid() is implemented correctly:
+	    **  returns 0 when children exist but none have exited; -1
+	    **  with errno == ECHILD when no children.)  -BL
+	    */
+	    do {
+		waitret = waitpid(-1, 0, WNOHANG);
+	    } while (waitret > 0 || (waitret == -1 && errno == EINTR));
+	    waitret = 0;
 
 	    pipe(pfd);
 
@@ -443,6 +471,12 @@ PUBLIC int HTParseInet ARGS2(
 		struct hostent  *phost;	/* Pointer to host - See netdb.h */
 		/*
 		**  Child - for the long call.
+		**
+		**  Make sure parent can kill us at will.  -BL
+		*/
+		(void) signal(SIGTERM, quench);
+
+		/*
 		**  Child won't use read side.  -BL
 		*/
 		close(pfd[0]);
@@ -482,7 +516,7 @@ PUBLIC int HTParseInet ARGS2(
 
 	    close(pfd[1]);      /* parent won't use write side -BL */
 
-	    while (cycle < 50) {
+	    while (cycle < dns_patience) {
 		/*
 		**  Avoid infinite loop in the face of the unexpected.  -BL
 		*/
@@ -531,7 +565,7 @@ PUBLIC int HTParseInet ARGS2(
 		    */
 		    waitret = waitpid(fpid, &cst1, WNOHANG);
 		    if (!WIFEXITED(cst1) && !WIFSIGNALED(cst1)) {
-			kill(fpid, SIGKILL);
+			kill(fpid, SIGTERM);
 			waitret = waitpid(fpid, &cst1, WNOHANG);
 		    }
 		    break;
@@ -548,8 +582,8 @@ PUBLIC int HTParseInet ARGS2(
 		*/
 		if (HTCheckForInterrupt()) {
 		    CTRACE(tfp, "HTParseInet: INTERRUPTED gethostbyname.\n");
-		    kill(fpid , SIGKILL);
-		    waitpid(fpid, NULL, 0);
+		    kill(fpid, SIGTERM);
+		    waitpid(fpid, NULL, WNOHANG);
 		    FREE(host);
 		    close(pfd[0]);
 		    return HT_INTERRUPTED;
@@ -557,6 +591,7 @@ PUBLIC int HTParseInet ARGS2(
 	    }
 	    close(pfd[0]);
 	    if (waitret <= 0) {
+		kill(fpid, SIGTERM);
 		waitret = waitpid(fpid, &cst1, WNOHANG);
 	    }
 	    if (waitret > 0) {
diff --git a/lynx.cfg b/lynx.cfg
index 44dca364..6e5816e8 100644
--- a/lynx.cfg
+++ b/lynx.cfg
@@ -69,7 +69,7 @@ DEFAULT_INDEX_FILE:http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/MetaIndex.html
 # buffer of previously entered goto URLs can still be invoked via the
 # Up-Arrow or Down-Arrow keys after entering the 'g'oto command.
 #
-#GOTOBUFFER:FALSE
+#GOTOBUFFER:TRUE
 
 # JUMP_PROMPT is the default statusline prompt for jumps files (see below).
 # You can change the prompt here from that defined in userdefs.h.  Any
@@ -118,7 +118,7 @@ DEFAULT_INDEX_FILE:http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/MetaIndex.html
 # ':' can be used as a target to invoke the goto URL buffer (as if 'g'oto
 # followed by Up-Arrow had been entered).
 #
-#JUMPBUFFER:FALSE
+#JUMPBUFFER:TRUE
 
 # If SAVE_SPACE is defined, it will be used as a path prefix for the
 # suggested filename in "Save to Disk" operations from the 'p'rint or
@@ -394,14 +394,14 @@ DEFAULT_INDEX_FILE:http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/MetaIndex.html
 # Display partial pages while downloading
 #PARTIAL:TRUE
 
-# Set the threshold # of lines Lynx must render before it 
+# Set the threshold # of lines Lynx must render before it
 # redraws the screen in PARTIAL mode.  Anything < 0 implies
-# use the screen size. 
-#PARTIAL_THRES:-1 
+# use the screen size.
+#PARTIAL_THRES:-1
 
-# While getting large files, Lynx shows the approximate rate of
-# transfer.  Set this to change the units shown (true for KB/sec,
-# and false for bytes/sec). 
+# While getting large files, Lynx shows the approximate rate of transfer.
+# Set this to change the units shown:
+# TRUE for KB/sec or FALSE for bytes/sec: default is TRUE.
 #SHOW_KB_RATE:TRUE
 
 # The following three definitions set the number of seconds for
@@ -451,7 +451,13 @@ DEFAULT_INDEX_FILE:http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/MetaIndex.html
 # are just decorations (button.gif, line.gif) and what images are important.
 #
 # If this option is set here, it will override the setting in userdefs.h.
-#VERBOSE_IMAGES:FALSE
+#VERBOSE_IMAGES:TRUE
+
+# VERBOSE_LINKS controls whether Lynx precedes links with the string "(LINK)",
+# which is done to accommodate blind users.
+#
+# If this option is set here, it will override the setting in userdefs.h.
+#VERBOSE_LINKS:FALSE
 
 # If BOLD_HEADERS is set to TRUE the HT_BOLD default style will be acted
 # upon for <H1> through <H6> headers.  The compilation default is FALSE
@@ -1206,7 +1212,7 @@ DEFAULT_INDEX_FILE:http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/MetaIndex.html
 # prefer the more conservative action of requiring an explicit Y or y to
 # confirm.  The default defined here will override that in userdefs.h.
 #
-#QUIT_DEFAULT_YES:TRUE
+#QUIT_DEFAULT_YES:FALSE
 
 # If HISTORICAL_COMMENTS is TRUE, Lynx will revert to the "Historical"
 # behavior of treating any '>' as a terminator for comments, instead of
diff --git a/lynx_help/keystrokes/keystroke_help.html b/lynx_help/keystrokes/keystroke_help.html
index f3a57bc3..3a2724ae 100644
--- a/lynx_help/keystrokes/keystroke_help.html
+++ b/lynx_help/keystrokes/keystroke_help.html
@@ -85,7 +85,8 @@
                CTRL-R         - Reload current file and refresh the screen
                CTRL-V         - Switch to alternative parsing of HTML documents
                CTRL-W         - Refresh the screen
-               CTRL-U         - Erase input line
+               CTRL-U         - Erase input line (<a href="edit_help.html"
+				>more input line commands</a>)
                CTRL-G         - Cancel input or transfer
                CTRL-T         - Toggle trace mode on and off
                ;              - View the Lynx Trace Log for the current
diff --git a/lynx_help/lynx-dev.html b/lynx_help/lynx-dev.html
index f062f674..c9076cfb 100644
--- a/lynx_help/lynx-dev.html
+++ b/lynx_help/lynx-dev.html
@@ -13,48 +13,100 @@
 
 <h1><em>Lynx-Dev Discussion List</em></h1>
 
-Lynx-dev is a majordomo mailing list used by developers and interested
-users as a forum to discuss the further development of the Lynx World
-Wide Web browser.  Topic issues include fixing known bugs, porting Lynx
-to various systems, and increasing the usability of Lynx.
+Lynx-dev is a majordomo mailing list used by developers and
+interested users as a forum to discuss the further development of
+the Lynx World Wide Web browser.  Topic issues include fixing
+known bugs, porting Lynx to various systems, and increasing the
+usability of Lynx.
+
+<h2><em>Open access</em></h2>
+<P>
+Anyone may read what has been said on Lynx-dev by visiting the
+<a href="http://www.flora.org/lynx-dev/html/">&nbsp;archives</a>.
+
+<P>
+
+Anyone may ask a question or offer a comment on Lynx-dev by
+sending mail to lynx-dev@sig.net, the posting address for this
+list.  Because of the public archive, requests for a personal
+reply may not be honored, and you should check the archive to
+find all follow-up responses.  Messages from non-subscribers are
+not immediately distributed to the list to avoid distributing
+spam.  Usually, if your message is on topic, it will be retrieved
+from the pile of spam headed for the wastebasket within a day or
+so and distributed to the list.  So, for best results subscribe
+as described below.
 
 <h2><em>Subscribing to Lynx-Dev</em></h2>
 
-If you are interested in <em>joining</em> this mailing list,
-send email to <a href="mailto:majordomo@sig.net"
->majordomo@sig.net</a> with only the following request
-in the body of your message: <em>SUBSCRIBE LYNX-DEV address</em><br>
-where inclusion of your email address is optional if it can be obtained,
-correctly, from the mail headers of your subscription request.
+If you are interested in <em>joining</em> this mailing list, send
+email to <a
+href="mailto:majordomo@sig.net">&nbsp;majordomo@sig.net</a> with
+only the following request in the body of your message:
+<em>SUBSCRIBE LYNX-DEV address</em><br> where inclusion of your
+email address is optional if it can be obtained, correctly, from
+the mail headers of your subscription request.  You will be asked
+to answer one follow-up question to confirm that you want the
+subscription, and Majordomo will enroll you as a subscriber.
+<P>
+Majordomo will thereafter
+send all messages which you address to the posting address to all
+subscribers of the list, and you will receive all messages set to
+that address by other subscribers.
+
 
 <p><em>NOTE:</em> Subject headers are ignored by the majordomo.
 
 <h2><em>Unsubscribing from Lynx-Dev</em></h2>
 
 To <em>unsubscribe</em>, send an email message to
-<a href="mailto:majordomo@sig.net"
->majordomo@sig.net</a> with only the following request
+<a href="mailto:majordomo@sig.net">&nbsp;majordomo@sig.net</a>
+with only the following request
 in the body: <em>UNSUBSCRIBE LYNX-DEV address</em><br>
 where inclusion of your email address is optional if it can be obtained,
 correctly, from the mail headers of your request.
 
+<h2><em>Subscribing to Lynx-Dev-Contrib</em></h2>
+<p>
+If you subscribe an email address to lynx-dev-contrib, mail from
+that address posted to lynx-dev will be recognized as from a
+subscriber and automatically distributed to the list.
+To make such a subscription, send
+email to <a
+href="mailto:majordomo@sig.net">&nbsp;majordomo@sig.net</a> with
+only the following request in the body of your message:
+<em>SUBSCRIBE LYNX-DEV-CONTRIB address</em>.
+<p>
+If you prefer to read the lynx-dev discussion using Lynx and
+the archive, and not receive all the posts as email, subscribe
+to lynx-dev-contrib and not to lynx-dev.  If you have multiple
+accounts from which you would like to post to lynx-dev, subscribe
+one of them to lynx-dev (where you will receive the list mail) and
+the others to lynx-dev-contrib.
+
 <h2><em>Majordomo Commands</em></h2>
 
-To receive a brief description of majordomo <em>commands</em>, place
-the following request in a message to <a href="mailto:majordomo@sig.net"
->majordomo@sig.net</a>: <em>HELP</em>
+To receive a brief description of majordomo <em>commands</em>,
+place the following request in a message to <a
+href="mailto:majordomo@sig.net">&nbsp;majordomo@sig.net</a>:
+<em>HELP</em>
+
+<p>
+Read the HELP that you receive by return mail to learn the
+details of the <em>which</em> command you can use to check on
+your subscriptions, etc.  Further information is available from the
+<a href="http://www.greatcircle.com/majordomo/">&nbsp;majordomo website</a>.
 
 <h2><em>Contacting Lynx-Dev</em></h2>
 
 If you have questions, problems, or comments about using Lynx or
-installing it on your system, send email to 
-<a href="mailto:lynx-dev@sig.net"
->lynx-dev@sig.net</a> (<em>after you've subscribed</em>).
+installing it on your system, send email to
+<a href="mailto:lynx-dev@sig.net">&nbsp;lynx-dev@sig.net</a>.
 
 <p>If you have problems with majordomo not responding to your requests,
-send email to the <em>list owner</em>: <a
-href="mailto:majordomo-owner@sig.net"
->majordomo-owner@sig.net</a>. Please,
+send email to the <em>list owner</em>:
+<a href="mailto:majordomo-owner@sig.net">&nbsp;majordomo-owner@sig.net</a>.
+Please,
 <em>DO NOT</em> send them to <em>lynx-dev@sig.net</em> as they
 will be distributed to everyone on the list and will clutter
 up their mailboxes.
diff --git a/src/GridText.c b/src/GridText.c
index 02986757..c9d5b5a9 100644
--- a/src/GridText.c
+++ b/src/GridText.c
@@ -2680,7 +2680,7 @@ PUBLIC int HText_beginAnchor ARGS3(
 	BOOL,			underline,
 	HTChildAnchor *,	anc)
 {
-    char marker[16];
+    char marker[32]; 
 
     TextAnchor * a = (TextAnchor *) calloc(1, sizeof(*a));
 
@@ -2719,6 +2719,9 @@ PUBLIC int HText_beginAnchor ARGS3(
     /*
      *  If we are doing link_numbering add the link number.
      */
+    if (verbose_links) { 
+	HText_appendText(text, "(LINK)"); 
+    } 
     if ((a->number > 0) &&
 	(keypad_mode == LINKS_ARE_NUMBERED ||
 	 keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED)) {
diff --git a/src/HTAlert.c b/src/HTAlert.c
index 42aa340f..c709361a 100644
--- a/src/HTAlert.c
+++ b/src/HTAlert.c
@@ -140,7 +140,7 @@ PUBLIC void HTReadProgress ARGS2(
 		if (total < -1)
 		    strcat(line, " (Press 'z' to abort)");
 	    }
-	    _HTProgress(line);
+	    HTProgress(line);
 	}
     }
 }
diff --git a/src/LYCurses.c b/src/LYCurses.c
index 57d8c753..0e3e0ea9 100644
--- a/src/LYCurses.c
+++ b/src/LYCurses.c
@@ -535,6 +535,7 @@ PUBLIC int lynx_chg_color ARGS3(
 	int, bg
 	)
 {
+    if (fg == ERR_COLOR || bg == ERR_COLOR) return -1;
     if (color >= 0 && color < 8) {
 	lynx_color_cfg[color].fg = (fg > 7) ? (fg & 7) : fg;
 	lynx_color_cfg[color].bg = (bg > 7) ? (bg & 7) : bg;
diff --git a/src/LYDownload.c b/src/LYDownload.c
index acf6d882..114adb16 100644
--- a/src/LYDownload.c
+++ b/src/LYDownload.c
@@ -619,10 +619,9 @@ PUBLIC int LYdownload_options ARGS2(
   <em>Downloaded link:</em> %s\n",
 	downloaded_url);
 
-    if (!no_disk_save && !child_lynx)
     fprintf(fp0, "\
-  <em>Suggested file name:</em> %s%s\n",
-	(lynx_save_space ? lynx_save_space : ""), sug_filename);
+  <em>Suggested file name:</em> %s\n",
+	sug_filename);
 
     fprintf(fp0, "\n%s options:\n",
 	(user_mode == NOVICE_MODE) ? "Standard download" : "Download");
diff --git a/src/LYGlobalDefs.h b/src/LYGlobalDefs.h
index 263ca075..92db467a 100644
--- a/src/LYGlobalDefs.h
+++ b/src/LYGlobalDefs.h
@@ -177,6 +177,7 @@ extern BOOLEAN vi_keys;           /* TRUE to turn on vi-like key movement */
 extern BOOLEAN emacs_keys;        /* TRUE to turn on emacs-like key movement */
 extern int keypad_mode;           /* is set to either NUMBERS_AS_ARROWS *
 				   * or LINKS_ARE_NUMBERED 		*/
+extern BOOLEAN verbose_links;     /* TRUE if links are preceded by (LINK) */ 
 extern BOOLEAN case_sensitive;    /* TRUE to turn on case sensitive search */
 extern BOOLEAN no_inside_telnet;  /* this and following are restrictions */
 extern BOOLEAN no_outside_telnet;
diff --git a/src/LYMain.c b/src/LYMain.c
index e749f638..25ba5b70 100644
--- a/src/LYMain.c
+++ b/src/LYMain.c
@@ -187,6 +187,7 @@ PUBLIC BOOLEAN check_mail = CHECKMAIL;
 PUBLIC BOOLEAN vi_keys = VI_KEYS_ALWAYS_ON;
 PUBLIC BOOLEAN emacs_keys = EMACS_KEYS_ALWAYS_ON;
 PUBLIC int keypad_mode = DEFAULT_KEYPAD_MODE;
+PUBLIC BOOLEAN verbose_links = VERBOSE_LINKS; 
 PUBLIC BOOLEAN case_sensitive = CASE_SENSITIVE_ALWAYS_ON;
 PUBLIC BOOLEAN telnet_ok = TRUE;
 PUBLIC BOOLEAN news_ok = TRUE;
diff --git a/src/LYMainLoop.c b/src/LYMainLoop.c
index 5d062f73..46ec32e3 100644
--- a/src/LYMainLoop.c
+++ b/src/LYMainLoop.c
@@ -209,7 +209,6 @@ int mainloop NOARGS
     BOOLEAN show_dotfiles_flag = show_dotfiles;
     BOOLEAN user_mode_flag = user_mode;
     int CurrentAssumeCharSet_flag = UCLYhndl_for_unspec;
-    int CurrentAssumeLocalCharSet_flag = UCLYhndl_HTFile_for_unspec;
     int CurrentCharSet_flag = current_char_set;
     int HTfileSortMethod_flag = HTfileSortMethod;
 #endif
@@ -2024,10 +2023,8 @@ new_cmd:  /*
 		 */
 		HTAlert(RELOADING_FORM);
 	    }
-	    newdoc.line = ((curdoc.line > 0) ?
-				 curdoc.line : 1);
-	    newdoc.link = ((curdoc.link > -1) ?
-				  curdoc.link : 0);
+	    newdoc.line = curdoc.line;
+	    newdoc.link = curdoc.link;
 #endif /* NO_ASSUME_SAME_DOC */
 	    FREE(curdoc.address); /* so it doesn't get pushed */
 #ifdef VMS
@@ -2060,6 +2057,8 @@ new_cmd:  /*
 		HTuncache_current_document();
 		StrAllocCopy(newdoc.address, curdoc.address);
 		FREE(curdoc.address);
+		newdoc.line = curdoc.line;
+		newdoc.link = curdoc.link;
 	    }
 	    if (historical_comments)
 		historical_comments = FALSE;
@@ -2090,6 +2089,8 @@ new_cmd:  /*
 		    HTuncache_current_document();
 		    StrAllocCopy(newdoc.address, curdoc.address);
 		    FREE(curdoc.address);
+		    newdoc.line = curdoc.line;
+		    newdoc.link = curdoc.link;
 		}
 	    }
 	    if (minimal_comments)
@@ -2120,6 +2121,8 @@ new_cmd:  /*
 		HTuncache_current_document();
 		StrAllocCopy(newdoc.address, curdoc.address);
 		FREE(curdoc.address);
+		newdoc.line = curdoc.line;
+		newdoc.link = curdoc.link;
 	    }
 	    if (soft_dquotes)
 		soft_dquotes = FALSE;
@@ -2154,11 +2157,11 @@ new_cmd:  /*
 		FREE(curdoc.address);
 	    }
 #ifdef NO_ASSUME_SAME_DOC
-	    newdoc.line=1;
-	    newdoc.link=0;
+	    newdoc.line = 1;
+	    newdoc.link = 0;
 #else
-	    newdoc.line = ((curdoc.line > 0) ? curdoc.line : 1);
-	    newdoc.link = ((curdoc.link > -1) ? curdoc.link : 0);
+	    newdoc.line = curdoc.line;
+	    newdoc.link = curdoc.link;
 #endif /* NO_ASSUME_SAME_DOC */
 	    if (New_DTD)
 		New_DTD = NO;
@@ -3736,7 +3739,6 @@ if (!LYUseFormsOptions) {
 		  !strncmp(curdoc.address, "ftp:", 4))) ||
 		CurrentCharSet_flag != current_char_set ||
 		CurrentAssumeCharSet_flag != UCLYhndl_for_unspec ||
-		CurrentAssumeLocalCharSet_flag != UCLYhndl_HTFile_for_unspec ||
 		verbose_img_flag != verbose_img ||
 		LYRawMode_flag != LYRawMode ||
 		LYSelectPopups_flag != LYSelectPopups ||
@@ -3793,10 +3795,8 @@ if (!LYUseFormsOptions) {
 		    newdoc.line = 1;
 		    newdoc.link = 0;
 #else
-		    newdoc.line = ((curdoc.line > 0) ?
-					 curdoc.line : 1);
-		    newdoc.link = ((curdoc.link > -1) ?
-					  curdoc.link : 0);
+		    newdoc.line = curdoc.line;
+		    newdoc.link = curdoc.link;
 #endif /* NO_ASSUME_SAME_DOC */
 		    LYforce_no_cache = TRUE;
 		    FREE(curdoc.address); /* So it doesn't get pushed. */
@@ -3807,7 +3807,6 @@ if (!LYUseFormsOptions) {
 	    HTfileSortMethod_flag = HTfileSortMethod;
 	    CurrentCharSet_flag = current_char_set;
 	    CurrentAssumeCharSet_flag = UCLYhndl_for_unspec;
-	    CurrentAssumeLocalCharSet_flag = UCLYhndl_HTFile_for_unspec;
 	    show_dotfiles_flag = show_dotfiles;
 	    verbose_img_flag = verbose_img;
 	    LYRawMode_flag = LYRawMode;
@@ -4220,10 +4219,8 @@ if (!LYUseFormsOptions) {
 				     *	Seek old position,
 				     *	which probably changed.
 				     */
-				    newdoc.line =
-					((curdoc.line > 0) ? curdoc.line : 1);
-				    newdoc.link =
-					((curdoc.link > -1) ? curdoc.link : 0);
+				    newdoc.line = curdoc.line;
+				    newdoc.link = curdoc.link;
 #endif /* NO_SEEK_OLD_POSITION */
 				    clear();  /* clear the screen */
 				}
diff --git a/src/LYOptions.c b/src/LYOptions.c
index 58202a82..fa59d8fb 100644
--- a/src/LYOptions.c
+++ b/src/LYOptions.c
@@ -43,8 +43,70 @@ PRIVATE int popup_choice PARAMS((
 
 #define MAXCHOICES 10
 
+/*
+ *  Values for the options menu. - FM
+ *
+ *  L_foo values are the Y coordinates for the menu item.
+ *  B_foo values are the X coordinates for the item's prompt string.
+ *  C_foo values are the X coordinates for the item's value string.
+ */
+#define L_EDITOR	 2
+#define L_DISPLAY	 3
+
+#define L_HOME		 4
+#define C_MULTI		24
+#define B_BOOK		34
+#define C_DEFAULT	50
+
+#define L_FTPSTYPE	 5
+#define L_MAIL_ADDRESS	 6
+#define L_SSEARCH	 7
+#define L_LANGUAGE	 8
+#define L_PREF_CHARSET	 9
+#define L_ASSUME_CHARSET (L_PREF_CHARSET + 1)
+#define L_CHARSET	10
+#define L_RAWMODE	11
+
+#define L_COLOR		L_RAWMODE
+#define B_COLOR		44
+#define C_COLOR		62
+
+#define L_BOOL_A	12
+#define B_VIKEYS	5
+#define C_VIKEYS	15
+#define B_EMACSKEYS	22
+#define C_EMACSKEYS	36
+#define B_SHOW_DOTFILES	44
+#define C_SHOW_DOTFILES	62
+
+#define L_BOOL_B	13
+#define B_SELECT_POPUPS	5
+#define C_SELECT_POPUPS	36
+#define B_SHOW_CURSOR	44
+#define C_SHOW_CURSOR	62
+
+#define L_KEYPAD	14
+#define L_LINEED	15
+
+#ifdef DIRED_SUPPORT
+#define L_DIRED		16
+#define L_USER_MODE	17
+#define L_USER_AGENT	18
+#define L_EXEC		19
+#else
+#define L_USER_MODE	16
+#define L_USER_AGENT	17
+#define L_EXEC		18
+#endif /* DIRED_SUPPORT */
+
+#define L_VERBOSE_IMAGES L_USER_MODE
+#define B_VERBOSE_IMAGES 50
+#define C_VERBOSE_IMAGES (B_VERBOSE_IMAGES + 21)
+
+
 #define COL_OPTION_VALUES 36  /* display column where option values start */
 
+/* a kludge to add assume_charset only in ADVANCED mode... */
 #define L_Bool_A (use_assume_charset ? L_BOOL_A + 1 : L_BOOL_A)
 #define L_Bool_B (use_assume_charset ? L_BOOL_B + 1 : L_BOOL_B)
 #define L_Exec (use_assume_charset ? L_EXEC + 1 : L_EXEC)
@@ -56,9 +118,8 @@ PRIVATE int popup_choice PARAMS((
 #define L_Dired (use_assume_charset ? L_DIRED + 1 : L_DIRED)
 #define L_User_Mode (use_assume_charset ? L_USER_MODE + 1 : L_USER_MODE)
 #define L_User_Agent (use_assume_charset ? L_USER_AGENT + 1 : L_USER_AGENT)
-#endif /* !EXP_FORMS_OPTIONS */
 
-#ifndef EXP_FORMS_OPTIONS
+
 PUBLIC void LYoptions NOARGS
 {
 #ifdef ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS
@@ -72,7 +133,6 @@ PUBLIC void LYoptions NOARGS
     char *choices[MAXCHOICES];
     int CurrentCharSet = current_char_set;
     int CurrentAssumeCharSet = UCLYhndl_for_unspec;
-    int CurrentAssumeLocalCharSet = UCLYhndl_HTFile_for_unspec;
     int CurrentShowColor = LYShowColor;
     BOOLEAN CurrentRawMode = LYRawMode;
     BOOLEAN AddValueAccepted = FALSE;
@@ -785,7 +845,6 @@ draw_options:
 			HTMLSetUseDefaultRawMode(current_char_set, LYRawMode);
 			HTMLSetCharacterHandling(current_char_set);
 			CurrentAssumeCharSet = UCLYhndl_for_unspec;
-			CurrentAssumeLocalCharSet = UCLYhndl_HTFile_for_unspec;
 			CurrentRawMode = LYRawMode;
 #if !defined(VMS) && !defined(USE_SLANG)
 			if (!LYSelectPopups)
@@ -3210,10 +3269,10 @@ static char * user_agent_string		= "user_agent";
 #define PutLabel(fp, text) \
 	fprintf(fp,"  %-33s: ", text)
 
-#define PutTextInput(fp, name, value, size, disable) \
+#define PutTextInput(fp, Name, Value, Size, disable) \
 	fprintf(fp,\
 	"<input size=%d type=\"text\" name=\"%s\" value=\"%s\" %s>\n",\
-		(int) size, name, value, disable)
+		(int) Size, Name, Value, disable)
 
 #define PutOption(fp, flag, html, name) \
 	fprintf(fp,"<option value=\"%s\" %s>%s\n", html, SELECTED(flag), name)
diff --git a/src/LYOptions.h b/src/LYOptions.h
index ccbc5b1d..2752bde8 100644
--- a/src/LYOptions.h
+++ b/src/LYOptions.h
@@ -3,7 +3,7 @@
 
 #include <LYStructs.h>
 
-extern BOOLEAN term_options;
+extern BOOLEAN term_options; /* for LYgetstr() */
 
 extern void edit_bookmarks NOPARAMS;
 
@@ -12,67 +12,6 @@ extern int gen_options PARAMS((char **newfile));
 
 #ifndef EXP_FORMS_OPTIONS
 extern void LYoptions NOPARAMS;
-
-/*
- *  Values for the options menu. - FM
- *
- *  L_foo values are the Y coordinates for the menu item.
- *  B_foo values are the X coordinates for the item's prompt string.
- *  C_foo values are the X coordinates for the item's value string.
- */
-#define L_EDITOR	 2
-#define L_DISPLAY	 3
-
-#define L_HOME		 4
-#define C_MULTI		24
-#define B_BOOK		34
-#define C_DEFAULT	50
-
-#define L_FTPSTYPE	 5
-#define L_MAIL_ADDRESS	 6
-#define L_SSEARCH	 7
-#define L_LANGUAGE	 8
-#define L_PREF_CHARSET	 9
-#define L_ASSUME_CHARSET (L_PREF_CHARSET + 1)
-#define L_CHARSET	10
-#define L_RAWMODE	11
-
-#define L_COLOR		L_RAWMODE
-#define B_COLOR		44
-#define C_COLOR		62
-
-#define L_BOOL_A	12
-#define B_VIKEYS	5
-#define C_VIKEYS	15
-#define B_EMACSKEYS	22
-#define C_EMACSKEYS	36
-#define B_SHOW_DOTFILES	44
-#define C_SHOW_DOTFILES	62
-
-#define L_BOOL_B	13
-#define B_SELECT_POPUPS	5
-#define C_SELECT_POPUPS	36
-#define B_SHOW_CURSOR	44
-#define C_SHOW_CURSOR	62
-
-#define L_KEYPAD	14
-#define L_LINEED	15
-
-#ifdef DIRED_SUPPORT
-#define L_DIRED		16
-#define L_USER_MODE	17
-#define L_USER_AGENT	18
-#define L_EXEC		19
-#else
-#define L_USER_MODE	16
-#define L_USER_AGENT	17
-#define L_EXEC		18
-#endif /* DIRED_SUPPORT */
-
-#define L_VERBOSE_IMAGES L_USER_MODE
-#define B_VERBOSE_IMAGES 50
-#define C_VERBOSE_IMAGES (B_VERBOSE_IMAGES + 21)
-
 #endif /* !EXP_FORMS_OPTIONS */
 
 #endif /* LYOPTIONS_H */
diff --git a/src/LYReadCFG.c b/src/LYReadCFG.c
index d1a48146..551f6219 100644
--- a/src/LYReadCFG.c
+++ b/src/LYReadCFG.c
@@ -950,6 +950,7 @@ static Config_Type Config_Table [] =
 #endif
      PARSE_SET("use_select_popups", CONF_BOOL, LYSelectPopups),
      PARSE_SET("verbose_images", CONF_BOOL, verbose_img),
+     PARSE_SET("verbose_links", CONF_BOOL, verbose_links), 
      PARSE_SET("vi_keys_always_on", CONF_BOOL, vi_keys),
      PARSE_FUN("viewer", CONF_FUN, viewer_fun),
      PARSE_ENV("wais_proxy", CONF_ENV, 0 ),
diff --git a/src/LYShowInfo.c b/src/LYShowInfo.c
index 32d31a6c..ca01bf9e 100644
--- a/src/LYShowInfo.c
+++ b/src/LYShowInfo.c
@@ -26,7 +26,7 @@
 #ifdef HAVE_CONFIG_H
 #define HAVE_CFG_DEFS_H
 
-#define PutDefs(table, n) fprintf(fp0, "%-35s %s\n", table[n].name, table[n].value)
+#define PutDefs(table, N) fprintf(fp0, "%-35s %s\n", table[N].name, table[N].value)
 
 /*
  *  Compile-time definitions info, returns local url
diff --git a/src/LYUtils.c b/src/LYUtils.c
index 7808d659..ff01e020 100644
--- a/src/LYUtils.c
+++ b/src/LYUtils.c
@@ -5434,7 +5434,7 @@ PRIVATE BOOL IsOurFile ARGS1(char *, name)
     && S_ISREG(data.st_mode)
     && data.st_nlink == 1
     && data.st_uid == getuid()) {
-	int linked = 0;
+	int linked = FALSE;
 #if HAVE_LSTAT
 	char *path = 0;
 	char *leaf;
@@ -5452,27 +5452,22 @@ PRIVATE BOOL IsOurFile ARGS1(char *, name)
 	     * to one of the real user's files.
 	     */
 	    if (S_ISLNK(data.st_mode)) {
-		if (!linked) {
-		    linked++;
-		} else {	/* a link-to-link is a little hard to digest */
-		    break;
-		}
+		linked = TRUE;	/* could be link-to-link; doesn't matter */
 	    } else if (S_ISDIR(data.st_mode)) {
 		if (linked) {
-		    if (--linked == 0) {
-			/*
-			 * We assume that a properly-configured system has the
-			 * unwritable directories owned by root.  This is not
-			 * necessarily so (bin, news, etc., may), but the only
-			 * uid we can count on is 0.  It would be nice to add a
-			 * check for the gid also, but that wouldn't be
-			 * portable.
-			 */
-			if (data.st_uid != 0
-			 || data.st_mode & S_IWOTH) {
-			    linked = 1;
-			    break;
-			}
+		    linked = FALSE;
+		    /*
+		     * We assume that a properly-configured system has the
+		     * unwritable directories owned by root.  This is not
+		     * necessarily so (bin, news, etc., may), but the only
+		     * uid we can count on is 0.  It would be nice to add a
+		     * check for the gid also, but that wouldn't be
+		     * portable.
+		     */
+		    if (data.st_uid != 0
+		     || data.st_mode & S_IWOTH) {
+			linked = TRUE;	/* force an error-return */
+			break;
 		    }
 		}
 	    } else if (linked) {
diff --git a/userdefs.h b/userdefs.h
index bb298ab5..921bea7b 100644
--- a/userdefs.h
+++ b/userdefs.h
@@ -476,7 +476,7 @@
  * with the Up-Arrow or Down-Arrow keys after entering the 'g'oto
  * command, whether or not a default is offered.
  */
-#define GOTOBUFFER	  FALSE
+#define GOTOBUFFER	  TRUE
 
 /*****************************
  * JUMPFILE is the default local file checked for shortcut URLs when
@@ -514,7 +514,7 @@
  * jumps files and corresponding key mappings, each will have its own
  * circular buffer.
  */
-#define JUMPBUFFER	  FALSE
+#define JUMPBUFFER	  TRUE
 
 /********************************
  * If PERMIT_GOTO_FROM_JUMP is defined, then a : or / in a jump target
@@ -888,7 +888,15 @@
 *
 * The default defined here can be changed in lynx.cfg.
 */
-#define VERBOSE_IMAGES FALSE
+#define VERBOSE_IMAGES TRUE
+
+/******************************
+* VERBOSE_LINKS controls whether Lynx precedes links with the string "(LINK)",
+* which is done to accommodate blind users.
+*
+* If this option is set here, it will override the setting in userdefs.h.
+*/
+#define VERBOSE_LINKS FALSE
 
 /******************************
  * BOXVERT and BOXHORI control the layout of popup menus.  Set to 0 if your
@@ -1184,7 +1192,7 @@
  * explicit Y or y to confirm.  The default defined here can be changed
  * in lynx.cfg.
  */
-#define QUIT_DEFAULT_YES	TRUE
+#define QUIT_DEFAULT_YES	FALSE
 
 /********************************
  * These definitions specify files created or used in conjunction
@@ -1216,12 +1224,12 @@
  * the version definition with the Project Version on checkout. Just
  * ignore it. - kw */
 /* $Format: "#define LYNX_VERSION \"$ProjectVersion$\""$ */
-#define LYNX_VERSION "2.8.1pre.8"
+#define LYNX_VERSION "2.8.1pre.9"
 #define LYNX_WWW_HOME "http://lynx.browser.org/"
 #define LYNX_WWW_DIST "http://www.slcc.edu/lynx/current/"
 #define LYNX_RELEASE FALSE
 /* $Format: "#define LYNX_DATE \"$ProjectDate$\""$ */
-#define LYNX_DATE "Sun, 04 Oct 1998 19:27:15 -0600"
+#define LYNX_DATE "Sat, 10 Oct 1998 14:53:16 -0600"
 #define LYNX_DATE_OFF 5		/* truncate the automatically-generated date */
 #define LYNX_DATE_LEN 11	/* truncate the automatically-generated date */
 #define LYNX_RELEASE_DATE "1998"