diff options
Diffstat (limited to 'src/LYReadCFG.c')
-rw-r--r-- | src/LYReadCFG.c | 2622 |
1 files changed, 0 insertions, 2622 deletions
diff --git a/src/LYReadCFG.c b/src/LYReadCFG.c deleted file mode 100644 index cc4df87b..00000000 --- a/src/LYReadCFG.c +++ /dev/null @@ -1,2622 +0,0 @@ -/* - * $LynxId: LYReadCFG.c,v 1.164 2011/06/06 00:01:36 tom Exp $ - */ -#ifndef NO_RULES -#include <HTRules.h> -#else -#include <HTUtils.h> -#endif -#include <HTTP.h> /* 'reloading' flag */ -#include <HTFile.h> -#include <HTInit.h> -#include <UCMap.h> - -#include <LYUtils.h> -#include <GridText.h> -#include <LYStrings.h> -#include <LYStructs.h> -#include <LYGlobalDefs.h> -#include <LYCharSets.h> -#include <LYCharUtils.h> -#include <LYKeymap.h> -#include <LYJump.h> -#include <LYGetFile.h> -#include <LYCgi.h> -#include <LYCurses.h> -#include <LYBookmark.h> -#include <LYCookie.h> -#include <LYReadCFG.h> -#include <HTAlert.h> -#include <LYHistory.h> -#include <LYPrettySrc.h> -#include <LYrcFile.h> - -#ifdef DIRED_SUPPORT -#include <LYLocal.h> -#endif /* DIRED_SUPPORT */ - -#include <LYexit.h> -#include <LYLeaks.h> - -#ifndef DISABLE_NEWS -#include <HTNews.h> -#endif - -BOOLEAN have_read_cfg = FALSE; -BOOLEAN LYUseNoviceLineTwo = TRUE; - -/* - * Translate a TRUE/FALSE field in a string buffer. - */ -static BOOL is_true(const char *string) -{ - if (!strcasecomp(string, "TRUE") || !strcasecomp(string, "ON")) - return (TRUE); - else - return (FALSE); -} - -/* - * Find an unescaped colon in a string buffer. - */ -static const char *find_colon(const char *buffer) -{ - char ch; - const char *buf = buffer; - - if (buf == NULL) - return NULL; - - while ((ch = *buf) != 0) { - if (ch == ':') - return buf; - if (ch == '\\') { - buf++; - if (*buf == 0) - break; - } - buf++; - } - return NULL; -} - -static void free_item_list_item(lynx_list_item_type **list, - lynx_list_item_type *ptr) -{ - lynx_list_item_type *prev; - lynx_list_item_type *cur; - - for (cur = *list, prev = 0; cur != 0; prev = cur, cur = cur->next) { - if (cur == ptr) { - - if (prev != 0) - prev->next = cur->next; - else - *list = cur->next; - - FREE(cur->name); - FREE(cur->menu_name); - FREE(cur->command); - FREE(cur); - break; - } - } -} - -static void free_item_list(lynx_list_item_type **ptr) -{ - while (*ptr != 0) { - free_item_list_item(ptr, *ptr); - } -} - -/* - * Function for freeing the DOWNLOADER and UPLOADER menus list. - FM - */ -static void free_all_item_lists(void) -{ - free_item_list(&printers); - free_item_list(&downloaders); -#ifdef DIRED_SUPPORT - free_item_list(&uploaders); -#endif /* DIRED_SUPPORT */ - -#ifdef USE_EXTERNALS - free_item_list(&externals); -#endif /* USE_EXTERNALS */ - - return; -} - -static const char *parse_list_bool(BOOL *target, const char *source) -{ - const char *result; - - source = LYSkipCBlanks(source); - result = find_colon(source); - - if (*source != '\0') { - char temp[20]; - size_t len = ((result != 0) - ? (size_t) (result - source) - : strlen(source)); - - if (len > sizeof(temp)) - len = (sizeof(temp) - 1); - LYStrNCpy(temp, source, len); - *target = is_true(temp); - CTRACE2(TRACE_CFG, (tfp, "parse_list_bool(%s) '%d'\n", source, *target)); - } - return result; -} - -static const char *parse_list_int(int *target, const char *source) -{ - const char *result; - - source = LYSkipCBlanks(source); - result = find_colon(source); - - if (*source != '\0') { - *target = atoi(source); - CTRACE2(TRACE_CFG, (tfp, "parse_list_int(%s) '%d'\n", source, *target)); - } - return result; -} - -static const char *parse_list_string(char **target, const char *source) -{ - const char *result; - - source = LYSkipCBlanks(source); - result = find_colon(source); - - if (*source != '\0') { - const char *next = ((result == 0) - ? (source + strlen(source)) - : result); - - *target = typecallocn(char, (size_t) (next - source + 1)); - - if (*target == NULL) - outofmem(__FILE__, "read_cfg"); - LYStrNCpy(*target, source, (next - source)); - remove_backslashes(*target); - - CTRACE2(TRACE_CFG, (tfp, "parse_list_string(%s) '%s'\n", source, *target)); - } - return result; -} - -/* - * Process string buffer fields for DOWNLOADER or UPLOADER - * or PRINTERS or EXTERNALS menus - */ -static void add_item_to_list(char *buffer, - lynx_list_item_type **list_ptr, - int special, - int menu_name) -{ - const char *colon, *last_colon; - lynx_list_item_type *cur_item, *prev_item; - - /* - * Check if the XWINDOWS or NON_XWINDOWS keyword is present in the last - * field, and act properly when found depending if external environment - * $DISPLAY variable is set. - */ - if ((colon = find_colon(buffer)) == 0) { - return; - } - for (last_colon = colon; - (colon = find_colon(last_colon + 1)) != 0; - last_colon = colon) { - ; - } - - /* - * If colon equals XWINDOWS then only continue - * if there is a $DISPLAY variable - */ - if (!strcasecomp(last_colon + 1, "XWINDOWS")) { - if (LYgetXDisplay() == NULL) - return; - } - /* - * If colon equals NON_XWINDOWS then only continue - * if there is no $DISPLAY variable - */ - else if (!strcasecomp(last_colon + 1, "NON_XWINDOWS")) { - if (LYgetXDisplay() != NULL) - return; - } - - /* - * Make a linked list - */ - if (*list_ptr == NULL) { - /* - * First item. - */ - cur_item = typecalloc(lynx_list_item_type); - - if (cur_item == NULL) - outofmem(__FILE__, "read_cfg"); - - assert(cur_item != NULL); - - *list_ptr = cur_item; -#ifdef LY_FIND_LEAKS - atexit(free_all_item_lists); -#endif - } else { - /* - * Find the last item. - */ - for (prev_item = *list_ptr; - prev_item->next != NULL; - prev_item = prev_item->next) ; /* null body */ - cur_item = typecalloc(lynx_list_item_type); - - if (cur_item == NULL) - outofmem(__FILE__, "read_cfg"); - else - prev_item->next = cur_item; - - assert(cur_item != NULL); - } - /* fill-in nonzero default values */ - cur_item->pagelen = 66; - - /* - * Find first unescaped colon and process fields - */ - if (find_colon(buffer) != NULL) { - colon = parse_list_string(&(cur_item->name), buffer); - - if (colon && menu_name) { - colon = parse_list_string(&(cur_item->menu_name), colon + 1); - } - if (colon) { - colon = parse_list_string(&(cur_item->command), colon + 1); - } - if (colon) { - colon = parse_list_bool(&(cur_item->always_enabled), colon + 1); - } - if (colon) { - if (special) { - (void) parse_list_int(&(cur_item->pagelen), colon + 1); - } else { - (void) parse_list_bool(&(cur_item->override_action), colon + 1); - } - } - } - - /* ignore empty data */ - if (cur_item->name == NULL - || cur_item->command == NULL) { - CTRACE2(TRACE_CFG, (tfp, "ignoring incomplete list_item '%s'\n", buffer)); - free_item_list_item(list_ptr, cur_item); - } else if (cur_item->menu_name == NULL) { - StrAllocCopy(cur_item->menu_name, cur_item->command); - } -} - -lynx_list_item_type *find_item_by_number(lynx_list_item_type *list_ptr, - char *number) -{ - int value = atoi(number); - - while (value-- >= 0 && list_ptr != 0) { - list_ptr = list_ptr->next; - } - return list_ptr; -} - -int match_item_by_name(lynx_list_item_type *ptr, - const char *name, - int only_overriders) -{ - return - (ptr->command != 0 - && !strncasecomp(ptr->name, name, (int) strlen(ptr->name)) - && (only_overriders ? ptr->override_action : 1)); -} - -#if defined(USE_COLOR_STYLE) || defined(USE_COLOR_TABLE) - -#ifndef COLOR_WHITE -#define COLOR_WHITE 7 -#endif - -#ifndef COLOR_BLACK -#define COLOR_BLACK 0 -#endif - -#ifdef USE_DEFAULT_COLORS -int default_fg = DEFAULT_COLOR; -int default_bg = DEFAULT_COLOR; - -#else -int default_fg = COLOR_WHITE; -int default_bg = COLOR_BLACK; -#endif - -static const char *Color_Strings[16] = -{ - "black", - "red", - "green", - "brown", - "blue", - "magenta", - "cyan", - "lightgray", - "gray", - "brightred", - "brightgreen", - "yellow", - "brightblue", - "brightmagenta", - "brightcyan", - "white" -}; - -#if defined(PDCURSES) && !defined(XCURSES) -/* - * PDCurses (and possibly some other implementations) use a non-ANSI set of - * codes for colors. - */ -static int ColorCode(int color) -{ - /* *INDENT-OFF* */ - static int map[] = - { - 0, 4, 2, 6, 1, 5, 3, 7, - 8, 12, 10, 14, 9, 13, 11, 15 - }; - /* *INDENT-ON* */ - - return map[color]; -} -#else -#define ColorCode(color) (color) -#endif - -BOOL default_color_reset = FALSE; - -/* - * Validator for COLOR fields. - */ -int check_color(const char *color, - int the_default) -{ - int i; - - CTRACE2(TRACE_STYLE, (tfp, "check_color(%s,%d)\n", color, the_default)); - if (!strcasecomp(color, "default")) { -#ifdef USE_DEFAULT_COLORS - if (LYuse_default_colors && !default_color_reset) - the_default = DEFAULT_COLOR; -#endif /* USE_DEFAULT_COLORS */ - CTRACE2(TRACE_STYLE, (tfp, "=> default %d\n", the_default)); - return the_default; - } - if (!strcasecomp(color, "nocolor")) - return NO_COLOR; - - for (i = 0; i < 16; i++) { - if (!strcasecomp(color, Color_Strings[i])) { - int c = ColorCode(i); - - CTRACE2(TRACE_STYLE, (tfp, "=> %d\n", c)); - return c; - } - } - CTRACE2(TRACE_STYLE, (tfp, "=> ERR_COLOR\n")); - return ERR_COLOR; -} - -const char *lookup_color(int code) -{ - unsigned n; - - for (n = 0; n < 16; n++) { - if ((int) ColorCode(n) == code) - return Color_Strings[n]; - } - return "default"; -} -#endif /* USE_COLOR_STYLE || USE_COLOR_TABLE */ - -#if defined(USE_COLOR_TABLE) || defined(EXP_ASSUMED_COLOR) - -/* - * Exit routine for failed COLOR parsing. - */ -static void exit_with_color_syntax(char *error_line) -{ - unsigned int i; - - fprintf(stderr, gettext("\ -Syntax Error parsing COLOR in configuration file:\n\ -The line must be of the form:\n\ -COLOR:INTEGER:FOREGROUND:BACKGROUND\n\ -\n\ -Here FOREGROUND and BACKGROUND must be one of:\n\ -The special strings 'nocolor' or 'default', or\n") - ); - for (i = 0; i < 16; i += 4) { - fprintf(stderr, "%16s %16s %16s %16s\n", - Color_Strings[i], Color_Strings[i + 1], - Color_Strings[i + 2], Color_Strings[i + 3]); - } - fprintf(stderr, "%s\nCOLOR:%s\n", gettext("Offending line:"), error_line); - exit_immediately(EXIT_FAILURE); -} -#endif /* defined(USE_COLOR_TABLE) || defined(EXP_ASSUMED_COLOR) */ - -#if defined(USE_COLOR_TABLE) -/* - * Process string buffer fields for COLOR setting. - */ -static void parse_color(char *buffer) -{ - int color; - const char *fg, *bg; - char *temp_fg = 0; - - /* - * We are expecting a line of the form: - * INTEGER:FOREGROUND:BACKGROUND - */ - color = atoi(buffer); - if (NULL == (fg = find_colon(buffer))) - exit_with_color_syntax(buffer); - - assert(fg != NULL); - - if (NULL == (bg = find_colon(++fg))) - exit_with_color_syntax(buffer); - - assert(bg != NULL); - - StrAllocCopy(temp_fg, fg); - temp_fg[bg++ - fg] = '\0'; - -#if defined(USE_SLANG) - if ((check_color(temp_fg, default_fg) == ERR_COLOR) || - (check_color(bg, default_bg) == ERR_COLOR)) - exit_with_color_syntax(buffer); - - SLtt_set_color(color, NULL, temp_fg, bg); -#else - if (lynx_chg_color(color, - check_color(temp_fg, default_fg), - check_color(bg, default_bg)) < 0) - exit_with_color_syntax(buffer); -#endif - FREE(temp_fg); -} -#endif /* USE_COLOR_TABLE */ -/* *INDENT-OFF* */ -#ifdef USE_SOURCE_CACHE -static Config_Enum tbl_source_cache[] = { - { "FILE", SOURCE_CACHE_FILE }, - { "MEMORY", SOURCE_CACHE_MEMORY }, - { "NONE", SOURCE_CACHE_NONE }, - { NULL, -1 }, -}; - -static Config_Enum tbl_abort_source_cache[] = { - { "KEEP", SOURCE_CACHE_FOR_ABORTED_KEEP }, - { "DROP", SOURCE_CACHE_FOR_ABORTED_DROP }, - { NULL, -1 }, -}; -#endif -/* *INDENT-ON* */ - -#define PARSE_ADD(n,v) {n, CONF_ADD_ITEM, UNION_ADD(v), 0} -#define PARSE_SET(n,v) {n, CONF_BOOL, UNION_SET(v), 0} -#define PARSE_ENU(n,v,t) {n, CONF_ENUM, UNION_INT(v), t} -#define PARSE_INT(n,v) {n, CONF_INT, UNION_INT(v), 0} -#define PARSE_TIM(n,v) {n, CONF_TIME, UNION_INT(v), 0} -#define PARSE_STR(n,v) {n, CONF_STR, UNION_STR(v), 0} -#define PARSE_PRG(n,v) {n, CONF_PRG, UNION_DEF(v), 0} -#define PARSE_Env(n,v) {n, CONF_ENV, UNION_ENV(v), 0} -#define PARSE_ENV(n,v) {n, CONF_ENV2, UNION_ENV(v), 0} -#define PARSE_FUN(n,v) {n, CONF_FUN, UNION_FUN(v), 0} -#define PARSE_REQ(n,v) {n, CONF_INCLUDE, UNION_FUN(v), 0} -#define PARSE_LST(n,v) {n, CONF_ADD_STRING, UNION_LST(v), 0} -#define PARSE_DEF(n,v) {n, CONF_ADD_TRUSTED, UNION_DEF(v), 0} -#define PARSE_NIL {NULL, CONF_NIL, UNION_DEF(0), 0} - -typedef enum { - CONF_NIL = 0 - ,CONF_BOOL /* BOOLEAN type */ - ,CONF_FUN - ,CONF_TIME - ,CONF_ENUM - ,CONF_INT - ,CONF_STR - ,CONF_PRG - ,CONF_ENV /* from environment variable */ - ,CONF_ENV2 /* from environment VARIABLE */ - ,CONF_INCLUDE /* include file-- handle special */ - ,CONF_ADD_ITEM - ,CONF_ADD_STRING - ,CONF_ADD_TRUSTED -} Conf_Types; - -typedef struct { - const char *name; - Conf_Types type; - ParseData; - Config_Enum *table; -} Config_Type; - -static int assume_charset_fun(char *value) -{ - UCLYhndl_for_unspec = safeUCGetLYhndl_byMIME(value); - StrAllocCopy(UCAssume_MIMEcharset, - LYCharSet_UC[UCLYhndl_for_unspec].MIMEname); -/* this may be a memory for bogus typo - - StrAllocCopy(UCAssume_MIMEcharset, value); - LYLowerCase(UCAssume_MIMEcharset); */ - - return 0; -} - -static int assume_local_charset_fun(char *value) -{ - UCLYhndl_HTFile_for_unspec = safeUCGetLYhndl_byMIME(value); - return 0; -} - -static int assume_unrec_charset_fun(char *value) -{ - UCLYhndl_for_unrec = safeUCGetLYhndl_byMIME(value); - return 0; -} - -static int character_set_fun(char *value) -{ - int i = UCGetLYhndl_byAnyName(value); /* by MIME or full name */ - - if (i < 0) { -#ifdef CAN_AUTODETECT_DISPLAY_CHARSET - if (auto_display_charset >= 0 - && (!strnicmp(value, "AutoDetect ", 11) - || !strnicmp(value, "AutoDetect-2 ", 13))) - current_char_set = auto_display_charset; -#endif - /* do nothing here: so fallback to userdefs.h */ - } else - current_char_set = i; - - return 0; -} - -static int outgoing_mail_charset_fun(char *value) -{ - outgoing_mail_charset = UCGetLYhndl_byMIME(value); - /* -1 if NULL or not recognized value: no translation (compatibility) */ - - return 0; -} - -#ifdef EXP_ASSUMED_COLOR -/* - * Process string buffer fields for ASSUMED_COLOR setting. - */ -static int assumed_color_fun(char *buffer) -{ - const char *fg = buffer, *bg; - char *temp_fg = 0; - - if (LYuse_default_colors) { - - /* - * We are expecting a line of the form: - * FOREGROUND:BACKGROUND - */ - if (NULL == (bg = find_colon(fg))) - exit_with_color_syntax(buffer); - - assert(bg != NULL); - - StrAllocCopy(temp_fg, fg); - temp_fg[bg++ - fg] = '\0'; - - default_fg = check_color(temp_fg, default_fg); - default_bg = check_color(bg, default_bg); - - if (default_fg == ERR_COLOR - || default_bg == ERR_COLOR) - exit_with_color_syntax(buffer); -#ifdef USE_SLANG - /* - * Sorry - the order of initialization of slang precludes setting the - * default colors from the lynx.cfg file, since slang is already - * initialized before the file is read, and there is no interface - * defined for setting it from the application (that's one of the - * problems with using environment variables rather than a programmable - * interface) -TD - */ -#endif - FREE(temp_fg); - } else { - CTRACE((tfp, "...ignored since DEFAULT_COLORS:off\n")); - } - return 0; -} -#endif /* EXP_ASSUMED_COLOR */ - -#ifdef USE_COLOR_TABLE -static int color_fun(char *value) -{ - parse_color(value); - return 0; -} -#endif - -#ifdef USE_DEFAULT_COLORS -static int default_colors_fun(char *value) -{ - LYuse_default_colors = is_true(value); - if (LYuse_default_colors) { - default_fg = DEFAULT_COLOR; - default_bg = DEFAULT_COLOR; - } else { - default_color_reset = TRUE; - if (default_fg == DEFAULT_COLOR || - default_bg == DEFAULT_COLOR) { - default_fg = COLOR_WHITE; - default_bg = COLOR_BLACK; - lynx_setup_colors(); - } - } - return 0; -} -#endif - -static int default_bookmark_file_fun(char *value) -{ - set_default_bookmark_page(value); - return 0; -} - -static int default_cache_size_fun(char *value) -{ - HTCacheSize = atoi(value); - if (HTCacheSize < 2) - HTCacheSize = 2; - return 0; -} - -static int default_editor_fun(char *value) -{ - if (!system_editor) - StrAllocCopy(editor, value); - return 0; -} - -static int numbers_as_arrows_fun(char *value) -{ - if (is_true(value)) - keypad_mode = NUMBERS_AS_ARROWS; - else - keypad_mode = LINKS_ARE_NUMBERED; - - return 0; -} - -#ifdef DIRED_SUPPORT -static int dired_menu_fun(char *value) -{ - add_menu_item(value); - return 0; -} -#endif - -static int jumpfile_fun(char *value) -{ - char *buffer = NULL; - - HTSprintf0(&buffer, "JUMPFILE:%s", value); - if (!LYJumpInit(buffer)) - CTRACE((tfp, "Failed to register %s\n", buffer)); - FREE(buffer); - - return 0; -} - -#ifdef EXP_KEYBOARD_LAYOUT -static int keyboard_layout_fun(char *key) -{ - if (!LYSetKbLayout(key)) - CTRACE((tfp, "Failed to set keyboard layout %s\n", key)); - return 0; -} -#endif /* EXP_KEYBOARD_LAYOUT */ - -static int keymap_fun(char *key) -{ - char *func, *efunc; - - if ((func = strchr(key, ':')) != NULL) { - *func++ = '\0'; - efunc = strchr(func, ':'); - /* Allow comments on the ends of key remapping lines. - DT */ - /* Allow third field for line-editor action. - kw */ - if (efunc == func) { /* have 3rd field, but 2nd field empty */ - func = NULL; - } else if (efunc && strncasecomp(efunc + 1, "DIRED", 5) == 0) { - if (!remap(key, strtok(func, " \t\n:#"), TRUE)) { - fprintf(stderr, - gettext("key remapping of %s to %s for %s failed\n"), - key, func, efunc + 1); - } else if (func && !strcmp("TOGGLE_HELP", func)) { - LYUseNoviceLineTwo = FALSE; - } - return 0; - } else if (!remap(key, strtok(func, " \t\n:#"), FALSE)) { - fprintf(stderr, gettext("key remapping of %s to %s failed\n"), - key, func); - } else { - if (func && !strcmp("TOGGLE_HELP", func)) - LYUseNoviceLineTwo = FALSE; - } - if (efunc) { - efunc++; - if (efunc == strtok((func ? NULL : efunc), " \t\n:#") && *efunc) { - BOOLEAN success = FALSE; - int lkc = lkcstring_to_lkc(key); - int lec = -1; - int select_edi = 0; - char *sselect_edi = strtok(NULL, " \t\n:#"); - char **endp = &sselect_edi; - - if (sselect_edi) { - if (*sselect_edi) - select_edi = (int) strtol(sselect_edi, endp, 10); - if (**endp != '\0') { - fprintf(stderr, - gettext("invalid line-editor selection %s for key %s, selecting all\n"), - sselect_edi, key); - select_edi = 0; - } - } - /* - * PASS! tries to enter the key into the LYLineEditors - * bindings in a different way from PASS, namely as binding - * that maps to the specific lynx actioncode (rather than to - * LYE_FORM_PASS). That only works for lynx keycodes with - * modifier bit set, and we have no documented/official way to - * specify this in the KEYMAP directive, although it can be - * made to work e.g. by specifying a hex value that has the - * modifier bit set. But knowledge about the bit pattern of - * modifiers should remain in internal matter subject to - * change... At any rate, if PASS! fails try it the same way - * as for PASS. - kw - */ - if (!success && strcasecomp(efunc, "PASS!") == 0) { - if (func) { - lec = LYE_FORM_LAC | lacname_to_lac(func); - success = (BOOL) LYRemapEditBinding(lkc, lec, select_edi); - } - if (!success) - fprintf(stderr, - gettext("setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"), - key, lkc, lec, efunc); - else - return 0; - } - if (!success) { - lec = lecname_to_lec(efunc); - success = (BOOL) LYRemapEditBinding(lkc, lec, select_edi); - } - if (!success) { - if (lec != -1) { - fprintf(stderr, - gettext("setting of line-editor binding for key %s (0x%x) to 0x%x for %s failed\n"), - key, lkc, lec, efunc); - } else { - fprintf(stderr, - gettext("setting of line-editor binding for key %s (0x%x) for %s failed\n"), - key, lkc, efunc); - } - } - } - } - } - return 0; -} - -static int localhost_alias_fun(char *value) -{ - LYAddLocalhostAlias(value); - return 0; -} - -#ifdef LYNXCGI_LINKS -static int lynxcgi_environment_fun(char *value) -{ - add_lynxcgi_environment(value); - return 0; -} -#endif - -static int lynx_sig_file_fun(char *value) -{ - char temp[LY_MAXPATH]; - - LYStrNCpy(temp, value, sizeof(temp) - 1); - if (LYPathOffHomeOK(temp, sizeof(temp))) { - StrAllocCopy(LynxSigFile, temp); - LYAddPathToHome(temp, sizeof(temp), LynxSigFile); - StrAllocCopy(LynxSigFile, temp); - CTRACE((tfp, "LYNX_SIG_FILE set to '%s'\n", LynxSigFile)); - } else { - CTRACE((tfp, "LYNX_SIG_FILE '%s' is bad. Ignoring.\n", LYNX_SIG_FILE)); - } - return 0; -} - -#ifndef DISABLE_NEWS -static int news_chunk_size_fun(char *value) -{ - HTNewsChunkSize = atoi(value); - /* - * If the new HTNewsChunkSize exceeds the maximum, - * increase HTNewsMaxChunk to this size. - FM - */ - if (HTNewsChunkSize > HTNewsMaxChunk) - HTNewsMaxChunk = HTNewsChunkSize; - return 0; -} - -static int news_max_chunk_fun(char *value) -{ - HTNewsMaxChunk = atoi(value); - /* - * If HTNewsChunkSize exceeds the new maximum, - * reduce HTNewsChunkSize to this maximum. - FM - */ - if (HTNewsChunkSize > HTNewsMaxChunk) - HTNewsChunkSize = HTNewsMaxChunk; - return 0; -} - -static int news_posting_fun(char *value) -{ - LYNewsPosting = is_true(value); - no_newspost = (BOOL) (LYNewsPosting == FALSE); - return 0; -} -#endif /* DISABLE_NEWS */ - -#ifndef NO_RULES -static int cern_rulesfile_fun(char *value) -{ - char *rulesfile1 = NULL; - char *rulesfile2 = NULL; - - if (HTLoadRules(value) >= 0) { - return 0; - } - StrAllocCopy(rulesfile1, value); - LYTrimLeading(value); - LYTrimTrailing(value); - - StrAllocCopy(rulesfile2, value); - LYTildeExpand(&rulesfile2, FALSE); - - if (strcmp(rulesfile1, rulesfile2) && - HTLoadRules(rulesfile2) >= 0) { - FREE(rulesfile1); - FREE(rulesfile2); - return 0; - } - fprintf(stderr, - gettext("Lynx: cannot start, CERN rules file %s is not available\n"), - non_empty(rulesfile2) ? rulesfile2 : gettext("(no name)")); - exit_immediately(EXIT_FAILURE); - return 0; /* though redundant, for compiler-warnings */ -} -#endif /* NO_RULES */ - -static int referer_with_query_fun(char *value) -{ - if (!strncasecomp(value, "SEND", 4)) - LYRefererWithQuery = 'S'; - else if (!strncasecomp(value, "PARTIAL", 7)) - LYRefererWithQuery = 'P'; - else - LYRefererWithQuery = 'D'; - return 0; -} - -static int status_buffer_size_fun(char *value) -{ - status_buf_size = atoi(value); - if (status_buf_size < 2) - status_buf_size = 2; - return 0; -} - -static int startfile_fun(char *value) -{ - StrAllocCopy(startfile, value); - -#ifdef USE_PROGRAM_DIR - if (is_url(startfile) == 0) { - char *tmp = NULL; - - HTSprintf0(&tmp, "%s\\%s", program_dir, startfile); - FREE(startfile); - LYLocalFileToURL(&startfile, tmp); - FREE(tmp); - } -#endif - return 0; -} - -static int suffix_fun(char *value) -{ - char *mime_type, *p, *parsed; - const char *encoding = NULL; - char *sq = NULL; - char *description = NULL; - double q = 1.0; - - if ((strlen(value) < 3) - || (NULL == (mime_type = strchr(value, ':')))) { - CTRACE((tfp, "Invalid SUFFIX:%s ignored.\n", value)); - return 0; - } - - *mime_type++ = '\0'; - if (*mime_type) { - if ((parsed = strchr(mime_type, ':')) != NULL) { - *parsed++ = '\0'; - if ((sq = strchr(parsed, ':')) != NULL) { - *sq++ = '\0'; - if ((description = strchr(sq, ':')) != NULL) { - *description++ = '\0'; - if ((p = strchr(sq, ':')) != NULL) - *p = '\0'; - LYTrimTail(description); - } - LYRemoveBlanks(sq); - if (!*sq) - sq = NULL; - } - LYRemoveBlanks(parsed); - LYLowerCase(parsed); - if (!*parsed) - parsed = NULL; - } - encoding = parsed; - } - - LYRemoveBlanks(mime_type); - /* - * mime-type is not converted to lowercase on input, to make it possible to - * reproduce the equivalent of some of the HTInit.c defaults that use mixed - * case, although that is not recomended. - kw - */ - if (!*mime_type) { /* that's ok now, with an encoding! */ - CTRACE((tfp, "SUFFIX:%s without MIME type for %s\n", value, - encoding ? encoding : "what?")); - mime_type = NULL; /* that's ok now, with an encoding! */ - if (!encoding) - return 0; - } - - if (!encoding) { - if (strstr(mime_type, "tex") != NULL || - strstr(mime_type, "postscript") != NULL || - strstr(mime_type, "sh") != NULL || - strstr(mime_type, "troff") != NULL || - strstr(mime_type, "rtf") != NULL) - encoding = "8bit"; - else - encoding = "binary"; - } - if (!sq) { - q = 1.0; - } else { - double df = strtod(sq, &p); - - if (p == sq && df <= 0.0) { - CTRACE((tfp, "Invalid q=%s for SUFFIX:%s, using -1.0\n", - sq, value)); - q = -1.0; - } else { - q = df; - } - } - HTSetSuffix5(value, mime_type, encoding, description, q); - - return 0; -} - -static int suffix_order_fun(char *value) -{ - char *p = value; - char *optn; - BOOLEAN want_file_init_now = FALSE; - - LYUseBuiltinSuffixes = TRUE; - while ((optn = HTNextTok(&p, ", ", "", NULL)) != NULL) { - if (!strcasecomp(optn, "NO_BUILTIN")) { - LYUseBuiltinSuffixes = FALSE; - } else if (!strcasecomp(optn, "PRECEDENCE_HERE")) { - want_file_init_now = TRUE; - } else if (!strcasecomp(optn, "PRECEDENCE_OTHER")) { - want_file_init_now = FALSE; - } else { - CTRACE((tfp, "Invalid SUFFIX_ORDER:%s\n", optn)); - break; - } - } - - if (want_file_init_now && !FileInitAlreadyDone) { - HTFileInit(); - FileInitAlreadyDone = TRUE; - } - return 0; -} - -static int system_editor_fun(char *value) -{ - StrAllocCopy(editor, value); - system_editor = TRUE; - return 0; -} - -#define SetViewer(mime_type, viewer) \ - HTSetPresentation(mime_type, viewer, 0, 1.0, 3.0, 0.0, 0L, mediaCFG) - -static int viewer_fun(char *value) -{ - char *mime_type; - char *viewer; - char *environment; - - mime_type = value; - - if ((strlen(value) < 3) - || (NULL == (viewer = strchr(mime_type, ':')))) - return 0; - - *viewer++ = '\0'; - - LYRemoveBlanks(mime_type); - LYLowerCase(mime_type); - - environment = strrchr(viewer, ':'); - if ((environment != NULL) && - (strlen(viewer) > 1) && *(environment - 1) != '\\') { - *environment++ = '\0'; - remove_backslashes(viewer); - /* - * If environment equals xwindows then only assign the presentation if - * there is a $DISPLAY variable. - */ - if (!strcasecomp(environment, "XWINDOWS")) { - if (LYgetXDisplay() != NULL) - SetViewer(mime_type, viewer); - } else if (!strcasecomp(environment, "NON_XWINDOWS")) { - if (LYgetXDisplay() == NULL) - SetViewer(mime_type, viewer); - } else { - SetViewer(mime_type, viewer); - } - } else { - remove_backslashes(viewer); - SetViewer(mime_type, viewer); - } - - return 0; -} - -static int nonrest_sigwinch_fun(char *value) -{ - if (!strncasecomp(value, "XWINDOWS", 8)) { - LYNonRestartingSIGWINCH = (BOOL) (LYgetXDisplay() != NULL); - } else { - LYNonRestartingSIGWINCH = is_true(value); - } - return 0; -} - -#ifdef USE_CHARSET_CHOICE -static void matched_charset_choice(int display_charset, - int i) -{ - int j; - - if (display_charset && !custom_display_charset) { - for (custom_display_charset = TRUE, j = 0; j < LYNumCharsets; ++j) - charset_subsets[j].hide_display = TRUE; - } else if (!display_charset && !custom_assumed_doc_charset) { - for (custom_assumed_doc_charset = TRUE, j = 0; j < LYNumCharsets; ++j) - charset_subsets[j].hide_assumed = TRUE; - } - if (display_charset) - charset_subsets[i].hide_display = FALSE; - else - charset_subsets[i].hide_assumed = FALSE; -} - -static int parse_charset_choice(char *p, - int display_charset) /*if FALSE, then assumed doc charset */ -{ - int len, i; - int matches = 0; - - /*only one charset choice is allowed per line! */ - LYTrimHead(p); - LYTrimTail(p); - CTRACE((tfp, "parsing charset choice for %s:\"%s\"", - (display_charset ? "display charset" : "assumed doc charset"), p)); - len = (int) strlen(p); - if (!len) { - CTRACE((tfp, " - EMPTY STRING\n")); - return 1; - } - if (*p == '*' && len == 1) { - if (display_charset) - for (custom_display_charset = TRUE, i = 0; i < LYNumCharsets; ++i) - charset_subsets[i].hide_display = FALSE; - else - for (custom_assumed_doc_charset = TRUE, i = 0; i < LYNumCharsets; ++i) - charset_subsets[i].hide_assumed = FALSE; - CTRACE((tfp, " - all unhidden\n")); - return 0; - } - if (p[len - 1] == '*') { - --len; - for (i = 0; i < LYNumCharsets; ++i) { - if ((!strncasecomp(p, LYchar_set_names[i], len)) || - (!strncasecomp(p, LYCharSet_UC[i].MIMEname, len))) { - ++matches; - matched_charset_choice(display_charset, i); - } - } - CTRACE((tfp, " - %d matches\n", matches)); - return 0; - } else { - for (i = 0; i < LYNumCharsets; ++i) { - if ((!strcasecomp(p, LYchar_set_names[i])) || - (!strcasecomp(p, LYCharSet_UC[i].MIMEname))) { - matched_charset_choice(display_charset, i); - ++matches; - CTRACE((tfp, " - OK, %d matches\n", matches)); - return 0; - } - } - CTRACE((tfp, " - NOT recognised\n")); - return 1; - } -} - -static int parse_display_charset_choice(char *p) -{ - return parse_charset_choice(p, 1); -} - -static int parse_assumed_doc_charset_choice(char *p) -{ - return parse_charset_choice(p, 0); -} - -#endif /* USE_CHARSET_CHOICE */ - -#ifdef USE_EXTERNALS -/* - * EXTERNAL and EXTERNAL_MENU share the same list. EXTERNAL_MENU allows - * setting a different name than the command string. - */ -static int external_fun(char *str) -{ - add_item_to_list(str, &externals, FALSE, TRUE); - return 0; -} -#endif - -#ifdef USE_PRETTYSRC -static void html_src_bad_syntax(char *value, - char *option_name) -{ - char *buf = 0; - - HTSprintf0(&buf, "HTMLSRC_%s", option_name); - LYUpperCase(buf); - fprintf(stderr, "Bad syntax in TAGSPEC %s:%s\n", buf, value); - exit_immediately(EXIT_FAILURE); -} - -static int parse_html_src_spec(HTlexeme lexeme_code, char *value, - char *option_name) -{ - /* Now checking the value for being correct. Since HTML_dtd is not - * initialized completely (member tags points to non-initiailized data), we - * use tags_old. If the syntax is incorrect, then lynx will exit with error - * message. - */ - char *ts2; - - if (isEmpty(value)) - return 0; /* silently ignoring */ - -#define BS() html_src_bad_syntax(value,option_name) - - ts2 = strchr(value, ':'); - if (!ts2) - BS(); - - assert(ts2 != NULL); - - *ts2 = '\0'; - - CTRACE2(TRACE_CFG, (tfp, - "LYReadCFG - parsing tagspec '%s:%s' for option '%s'\n", - value, ts2, option_name)); - html_src_clean_item(lexeme_code); - if (!html_src_parse_tagspec(value, lexeme_code, TRUE, TRUE) - || !html_src_parse_tagspec(ts2, lexeme_code, TRUE, TRUE)) { - *ts2 = ':'; - BS(); - } - - *ts2 = ':'; - StrAllocCopy(HTL_tagspecs[lexeme_code], value); -#undef BS - return 0; -} - -static int psrcspec_fun(char *s) -{ - char *e; - /* *INDENT-OFF* */ - static Config_Enum lexemnames[] = - { - { "comm", HTL_comm }, - { "tag", HTL_tag }, - { "attrib", HTL_attrib }, - { "attrval", HTL_attrval }, - { "abracket", HTL_abracket }, - { "entity", HTL_entity }, - { "href", HTL_href }, - { "entire", HTL_entire }, - { "badseq", HTL_badseq }, - { "badtag", HTL_badtag }, - { "badattr", HTL_badattr }, - { "sgmlspecial", HTL_sgmlspecial }, - { NULL, -1 } - }; - /* *INDENT-ON* */ - - int found; - - e = strchr(s, ':'); - if (!e) { - CTRACE((tfp, - "bad format of PRETTYSRC_SPEC setting value, ignored %s\n", - s)); - return 0; - } - *e = '\0'; - if (!LYgetEnum(lexemnames, s, &found)) { - CTRACE((tfp, - "bad format of PRETTYSRC_SPEC setting value, ignored %s:%s\n", - s, e + 1)); - return 0; - } - parse_html_src_spec((HTlexeme) found, e + 1, s); - return 0; -} - -static int read_htmlsrc_attrname_xform(char *str) -{ - int val; - - if (1 == sscanf(str, "%d", &val)) { - if (val < 0 || val > 2) { - CTRACE((tfp, - "bad value for htmlsrc_attrname_xform (ignored - must be one of 0,1,2): %d\n", - val)); - } else - attrname_transform = val; - } else { - CTRACE((tfp, "bad value for htmlsrc_attrname_xform (ignored): %s\n", - str)); - } - return 0; -} - -static int read_htmlsrc_tagname_xform(char *str) -{ - int val; - - if (1 == sscanf(str, "%d", &val)) { - if (val < 0 || val > 2) { - CTRACE((tfp, - "bad value for htmlsrc_tagname_xform (ignored - must be one of 0,1,2): %d\n", - val)); - } else - tagname_transform = val; - } else { - CTRACE((tfp, "bad value for htmlsrc_tagname_xform (ignored): %s\n", - str)); - } - return 0; -} -#endif - -#ifdef USE_SESSIONS -static int session_limit_fun(char *value) -{ - session_limit = (short) atoi(value); - if (session_limit < 1) - session_limit = 1; - else if (session_limit > MAX_SESSIONS) - session_limit = MAX_SESSIONS; - return 0; -} -#endif /* USE_SESSIONS */ - -#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401 -static int screen_size_fun(char *value) -{ - char *cp; - - if ((cp = strchr(value, ',')) != 0) { - *cp++ = '\0'; /* Terminate ID */ - scrsize_x = atoi(value); - scrsize_y = atoi(cp); - if ((scrsize_x <= 1) || (scrsize_y <= 1)) { - scrsize_x = scrsize_y = 0; - } - if ((scrsize_x > 0) && (scrsize_x < 80)) { - scrsize_x = 80; - } - if ((scrsize_y > 0) && (scrsize_y < 4)) { - scrsize_y = 4; - } - CTRACE((tfp, "scrsize: x=%d, y=%d\n", scrsize_x, scrsize_y)); - } - return 0; -} -#endif - -#if defined(HAVE_LIBINTL_H) || defined(HAVE_LIBGETTEXT_H) -static int message_language_fun(char *value) -{ - char *tmp = NULL; - - HTSprintf0(&tmp, "LANG=%s", value); - putenv(tmp); - - LYSetTextDomain(); - - return 0; -} -#endif - -/* This table is searched ignoring case */ -/* *INDENT-OFF* */ -static Config_Type Config_Table [] = -{ - PARSE_SET(RC_ACCEPT_ALL_COOKIES, LYAcceptAllCookies), - PARSE_TIM(RC_ALERTSECS, AlertSecs), - PARSE_SET(RC_ALWAYS_RESUBMIT_POSTS, LYresubmit_posts), -#ifdef EXEC_LINKS - PARSE_DEF(RC_ALWAYS_TRUSTED_EXEC, ALWAYS_EXEC_PATH), -#endif - PARSE_FUN(RC_ASSUME_CHARSET, assume_charset_fun), - PARSE_FUN(RC_ASSUME_LOCAL_CHARSET, assume_local_charset_fun), - PARSE_FUN(RC_ASSUME_UNREC_CHARSET, assume_unrec_charset_fun), -#ifdef EXP_ASSUMED_COLOR - PARSE_FUN(RC_ASSUMED_COLOR, assumed_color_fun), -#endif -#ifdef USE_CHARSET_CHOICE - PARSE_FUN(RC_ASSUMED_DOC_CHARSET_CHOICE, parse_assumed_doc_charset_choice), -#endif -#ifdef DIRED_SUPPORT - PARSE_INT(RC_AUTO_UNCACHE_DIRLISTS, LYAutoUncacheDirLists), -#endif -#ifndef DISABLE_BIBP - PARSE_STR(RC_BIBP_BIBHOST, BibP_bibhost), - PARSE_STR(RC_BIBP_GLOBALSERVER, BibP_globalserver), -#endif - PARSE_SET(RC_BLOCK_MULTI_BOOKMARKS, LYMBMBlocked), - PARSE_SET(RC_BOLD_H1, bold_H1), - PARSE_SET(RC_BOLD_HEADERS, bold_headers), - PARSE_SET(RC_BOLD_NAME_ANCHORS, bold_name_anchors), -#ifndef DISABLE_FTP - PARSE_LST(RC_BROKEN_FTP_EPSV, broken_ftp_epsv), - PARSE_LST(RC_BROKEN_FTP_RETR, broken_ftp_retr), -#endif - PARSE_PRG(RC_BZIP2_PATH, ppBZIP2), - PARSE_SET(RC_CASE_SENSITIVE_ALWAYS_ON, LYcase_sensitive), - PARSE_FUN(RC_CHARACTER_SET, character_set_fun), -#ifdef CAN_SWITCH_DISPLAY_CHARSET - PARSE_STR(RC_CHARSET_SWITCH_RULES, charset_switch_rules), - PARSE_STR(RC_CHARSETS_DIRECTORY, charsets_directory), -#endif - PARSE_SET(RC_CHECKMAIL, check_mail), - PARSE_PRG(RC_CHMOD_PATH, ppCHMOD), - PARSE_SET(RC_COLLAPSE_BR_TAGS, LYCollapseBRs), -#ifdef USE_COLOR_TABLE - PARSE_FUN(RC_COLOR, color_fun), -#endif -#ifdef USE_COLOR_STYLE - PARSE_STR(RC_COLOR_STYLE, lynx_lss_file), -#endif - PARSE_PRG(RC_COMPRESS_PATH, ppCOMPRESS), - PARSE_PRG(RC_COPY_PATH, ppCOPY), - PARSE_INT(RC_CONNECT_TIMEOUT, connect_timeout), - PARSE_SET(RC_CONV_JISX0201KANA, conv_jisx0201kana), - PARSE_STR(RC_COOKIE_ACCEPT_DOMAINS, LYCookieSAcceptDomains), -#ifdef USE_PERSISTENT_COOKIES - PARSE_STR(RC_COOKIE_FILE, LYCookieFile), -#endif /* USE_PERSISTENT_COOKIES */ - PARSE_STR(RC_COOKIE_LOOSE_INVALID_DOMAINS, LYCookieSLooseCheckDomains), - PARSE_STR(RC_COOKIE_QUERY_INVALID_DOMAINS, LYCookieSQueryCheckDomains), - PARSE_STR(RC_COOKIE_REJECT_DOMAINS, LYCookieSRejectDomains), -#ifdef USE_PERSISTENT_COOKIES - PARSE_STR(RC_COOKIE_SAVE_FILE, LYCookieSaveFile), -#endif /* USE_PERSISTENT_COOKIES */ - PARSE_STR(RC_COOKIE_STRICT_INVALID_DOMAIN, LYCookieSStrictCheckDomains), - PARSE_Env(RC_CSO_PROXY, 0), -#ifdef VMS - PARSE_PRG(RC_CSWING_PATH, ppCSWING), -#endif - PARSE_TIM(RC_DELAYSECS, DelaySecs), - PARSE_FUN(RC_DEFAULT_BOOKMARK_FILE, default_bookmark_file_fun), - PARSE_FUN(RC_DEFAULT_CACHE_SIZE, default_cache_size_fun), -#ifdef USE_DEFAULT_COLORS - PARSE_FUN(RC_DEFAULT_COLORS, default_colors_fun), -#endif - PARSE_FUN(RC_DEFAULT_EDITOR, default_editor_fun), - PARSE_STR(RC_DEFAULT_INDEX_FILE, indexfile), - PARSE_ENU(RC_DEFAULT_KEYPAD_MODE, keypad_mode, tbl_keypad_mode), - PARSE_FUN(RC_DEFAULT_KEYPAD_MODE_NUMARO, numbers_as_arrows_fun), - PARSE_ENU(RC_DEFAULT_USER_MODE, user_mode, tbl_user_mode), -#if defined(VMS) && defined(VAXC) && !defined(__DECC) - PARSE_INT(RC_DEFAULT_VIRTUAL_MEMORY_SIZE, HTVirtualMemorySize), -#endif -#ifdef DIRED_SUPPORT - PARSE_FUN(RC_DIRED_MENU, dired_menu_fun), -#endif -#ifdef USE_CHARSET_CHOICE - PARSE_FUN(RC_DISPLAY_CHARSET_CHOICE, parse_display_charset_choice), -#endif - PARSE_ADD(RC_DOWNLOADER, downloaders), - PARSE_SET(RC_EMACS_KEYS_ALWAYS_ON, emacs_keys), - PARSE_FUN(RC_ENABLE_LYNXRC, enable_lynxrc), - PARSE_SET(RC_ENABLE_SCROLLBACK, enable_scrollback), -#ifdef USE_EXTERNALS - PARSE_ADD(RC_EXTERNAL, externals), - PARSE_FUN(RC_EXTERNAL_MENU, external_fun), -#endif - PARSE_Env(RC_FINGER_PROXY, 0), -#if defined(_WINDOWS) /* 1998/10/05 (Mon) 17:34:15 */ - PARSE_SET(RC_FOCUS_WINDOW, focus_window), -#endif - PARSE_SET(RC_FORCE_8BIT_TOUPPER, UCForce8bitTOUPPER), - PARSE_ENU(RC_FORCE_COOKIE_PROMPT, cookie_noprompt, tbl_force_prompt), - PARSE_SET(RC_FORCE_EMPTY_HREFLESS_A, force_empty_hrefless_a), - PARSE_SET(RC_FORCE_SSL_COOKIES_SECURE, LYForceSSLCookiesSecure), -#ifdef USE_SSL - PARSE_ENU(RC_FORCE_SSL_PROMPT, ssl_noprompt, tbl_force_prompt), -#endif -#if !defined(NO_OPTION_FORMS) && !defined(NO_OPTION_MENU) - PARSE_SET(RC_FORMS_OPTIONS, LYUseFormsOptions), -#endif - PARSE_STR(RC_FTP_FORMAT, ftp_format), -#ifndef DISABLE_FTP - PARSE_SET(RC_FTP_PASSIVE, ftp_passive), -#endif - PARSE_Env(RC_FTP_PROXY, 0), - PARSE_STR(RC_GLOBAL_EXTENSION_MAP, global_extension_map), - PARSE_STR(RC_GLOBAL_MAILCAP, global_type_map), - PARSE_Env(RC_GOPHER_PROXY, 0), - PARSE_SET(RC_GOTOBUFFER, goto_buffer), - PARSE_PRG(RC_GZIP_PATH, ppGZIP), - PARSE_STR(RC_HELPFILE, helpfile), -#ifdef MARK_HIDDEN_LINKS - PARSE_STR(RC_HIDDEN_LINK_MARKER, hidden_link_marker), -#endif - PARSE_SET(RC_HISTORICAL_COMMENTS, historical_comments), - PARSE_SET(RC_HTML5_CHARSETS, html5_charsets), -#ifdef USE_PRETTYSRC - PARSE_FUN(RC_HTMLSRC_ATTRNAME_XFORM, read_htmlsrc_attrname_xform), - PARSE_FUN(RC_HTMLSRC_TAGNAME_XFORM, read_htmlsrc_tagname_xform), -#endif - PARSE_Env(RC_HTTP_PROXY, 0), - PARSE_Env(RC_HTTPS_PROXY, 0), - PARSE_REQ(RC_INCLUDE, 0), - PARSE_PRG(RC_INFLATE_PATH, ppINFLATE), - PARSE_TIM(RC_INFOSECS, InfoSecs), - PARSE_PRG(RC_INSTALL_PATH, ppINSTALL), - PARSE_STR(RC_JUMP_PROMPT, jumpprompt), - PARSE_SET(RC_JUMPBUFFER, jump_buffer), - PARSE_FUN(RC_JUMPFILE, jumpfile_fun), -#ifdef USE_JUSTIFY_ELTS - PARSE_SET(RC_JUSTIFY, ok_justify), - PARSE_INT(RC_JUSTIFY_MAX_VOID_PERCENT, justify_max_void_percent), -#endif -#ifdef EXP_KEYBOARD_LAYOUT - PARSE_FUN(RC_KEYBOARD_LAYOUT, keyboard_layout_fun), -#endif - PARSE_FUN(RC_KEYMAP, keymap_fun), - PARSE_SET(RC_LEFTARROW_IN_TEXTFLD_PROMPT, textfield_prompt_at_left_edge), -#ifndef VMS - PARSE_STR(RC_LIST_FORMAT, list_format), -#endif -#ifndef DISABLE_NEWS - PARSE_SET(RC_LIST_NEWS_DATES, LYListNewsDates), - PARSE_SET(RC_LIST_NEWS_NUMBERS, LYListNewsNumbers), -#endif -#ifdef USE_LOCALE_CHARSET - PARSE_SET(RC_LOCALE_CHARSET, LYLocaleCharset), -#endif - PARSE_STR(RC_LOCAL_DOMAIN, LYLocalDomain), - PARSE_FUN(RC_LOCALHOST_ALIAS, localhost_alias_fun), -#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS) - PARSE_SET(RC_LOCAL_EXECUTION_LINKS_ALWAYS, local_exec), - PARSE_SET(RC_LOCAL_EXECUTION_LINKS_LOCAL, local_exec_on_local_files), -#endif - PARSE_STR(RC_LYNX_HOST_NAME, LYHostName), - PARSE_FUN(RC_LYNX_SIG_FILE, lynx_sig_file_fun), -#ifdef LYNXCGI_LINKS -#ifndef VMS - PARSE_STR(RC_LYNXCGI_DOCUMENT_ROOT, LYCgiDocumentRoot), -#endif - PARSE_FUN(RC_LYNXCGI_ENVIRONMENT, lynxcgi_environment_fun), -#endif -#if USE_VMS_MAILER - PARSE_STR(RC_MAIL_ADRS, mail_adrs), -#endif - PARSE_SET(RC_MAIL_SYSTEM_ERROR_LOGGING, error_logging), - PARSE_SET(RC_MAKE_LINKS_FOR_ALL_IMAGES, clickable_images), - PARSE_SET(RC_MAKE_PSEUDO_ALTS_FOR_INLINES, pseudo_inline_alts), - PARSE_INT(RC_MAX_COOKIES_BUFFER, max_cookies_buffer), - PARSE_INT(RC_MAX_COOKIES_DOMAIN, max_cookies_domain), - PARSE_INT(RC_MAX_COOKIES_GLOBAL, max_cookies_global), - PARSE_INT(RC_MAX_URI_SIZE, max_uri_size), - PARSE_TIM(RC_MESSAGESECS, MessageSecs), -#if defined(HAVE_LIBINTL_H) || defined(HAVE_LIBGETTEXT_H) - PARSE_FUN(RC_MESSAGE_LANGUAGE, message_language_fun), -#endif - PARSE_SET(RC_MINIMAL_COMMENTS, minimal_comments), - PARSE_PRG(RC_MKDIR_PATH, ppMKDIR), - PARSE_ENU(RC_MULTI_BOOKMARK_SUPPORT, LYMultiBookmarks, tbl_multi_bookmarks), - PARSE_PRG(RC_MV_PATH, ppMV), - PARSE_SET(RC_NCR_IN_BOOKMARKS, UCSaveBookmarksInUnicode), -#ifdef EXP_NESTED_TABLES - PARSE_SET(RC_NESTED_TABLES, nested_tables), -#endif -#ifndef DISABLE_NEWS - PARSE_FUN(RC_NEWS_CHUNK_SIZE, news_chunk_size_fun), - PARSE_FUN(RC_NEWS_MAX_CHUNK, news_max_chunk_fun), - PARSE_FUN(RC_NEWS_POSTING, news_posting_fun), - PARSE_Env(RC_NEWS_PROXY, 0), - PARSE_Env(RC_NEWSPOST_PROXY, 0), - PARSE_Env(RC_NEWSREPLY_PROXY, 0), - PARSE_Env(RC_NNTP_PROXY, 0), - PARSE_ENV(RC_NNTPSERVER, 0), /* actually NNTPSERVER */ -#endif - PARSE_SET(RC_NUMBER_FIELDS_ON_LEFT,number_fields_on_left), - PARSE_SET(RC_NUMBER_LINKS_ON_LEFT, number_links_on_left), - PARSE_SET(RC_NO_DOT_FILES, no_dotfiles), - PARSE_SET(RC_NO_FILE_REFERER, no_filereferer), -#ifndef VMS - PARSE_SET(RC_NO_FORCED_CORE_DUMP, LYNoCore), -#endif - PARSE_SET(RC_NO_FROM_HEADER, LYNoFromHeader), - PARSE_SET(RC_NO_ISMAP_IF_USEMAP, LYNoISMAPifUSEMAP), - PARSE_SET(RC_NO_MARGINS, no_margins), - PARSE_SET(RC_NO_PAUSE, no_pause), - PARSE_Env(RC_NO_PROXY, 0), - PARSE_SET(RC_NO_REFERER_HEADER, LYNoRefererHeader), - PARSE_SET(RC_NO_TABLE_CENTER, no_table_center), - PARSE_SET(RC_NO_TITLE, no_title), - PARSE_FUN(RC_NONRESTARTING_SIGWINCH, nonrest_sigwinch_fun), - PARSE_FUN(RC_OUTGOING_MAIL_CHARSET, outgoing_mail_charset_fun), -#ifdef DISP_PARTIAL - PARSE_SET(RC_PARTIAL, display_partial_flag), - PARSE_INT(RC_PARTIAL_THRES, partial_threshold), -#endif -#ifdef USE_PERSISTENT_COOKIES - PARSE_SET(RC_PERSISTENT_COOKIES, persistent_cookies), -#endif /* USE_PERSISTENT_COOKIES */ - PARSE_STR(RC_PERSONAL_EXTENSION_MAP, personal_extension_map), - PARSE_STR(RC_PERSONAL_MAILCAP, personal_type_map), - PARSE_LST(RC_POSITIONABLE_EDITOR, positionable_editor), - PARSE_STR(RC_PREFERRED_CHARSET, pref_charset), - PARSE_ENU(RC_PREFERRED_ENCODING, LYAcceptEncoding, tbl_preferred_encoding), - PARSE_STR(RC_PREFERRED_LANGUAGE, language), - PARSE_ENU(RC_PREFERRED_MEDIA_TYPES, LYAcceptMedia, tbl_preferred_media), - PARSE_SET(RC_PREPEND_BASE_TO_SOURCE, LYPrependBaseToSource), - PARSE_SET(RC_PREPEND_CHARSET_TO_SOURCE, LYPrependCharsetToSource), -#ifdef USE_PRETTYSRC - PARSE_SET(RC_PRETTYSRC, LYpsrc), - PARSE_FUN(RC_PRETTYSRC_SPEC, psrcspec_fun), - PARSE_SET(RC_PRETTYSRC_VIEW_NO_ANCHOR_NUM, psrcview_no_anchor_numbering), -#endif - PARSE_ADD(RC_PRINTER, printers), - PARSE_SET(RC_QUIT_DEFAULT_YES, LYQuitDefaultYes), - PARSE_INT(RC_READ_TIMEOUT, reading_timeout), - PARSE_FUN(RC_REFERER_WITH_QUERY, referer_with_query_fun), -#ifdef USE_CMD_LOGGING - PARSE_TIM(RC_REPLAYSECS, ReplaySecs), -#endif - PARSE_SET(RC_REUSE_TEMPFILES, LYReuseTempfiles), - PARSE_PRG(RC_RLOGIN_PATH, ppRLOGIN), - PARSE_PRG(RC_RMDIR_PATH, ppRMDIR), - PARSE_PRG(RC_RM_PATH, ppRM), -#ifndef NO_RULES - PARSE_FUN(RC_RULE, HTSetConfiguration), - PARSE_FUN(RC_RULESFILE, cern_rulesfile_fun), -#endif /* NO_RULES */ - PARSE_STR(RC_SAVE_SPACE, lynx_save_space), - PARSE_SET(RC_SCAN_FOR_BURIED_NEWS_REFS, scan_for_buried_news_references), -#if defined(PDCURSES) && defined(PDC_BUILD) && PDC_BUILD >= 2401 - PARSE_FUN(RC_SCREEN_SIZE, screen_size_fun), -#endif -#ifdef USE_SCROLLBAR - PARSE_SET(RC_SCROLLBAR, LYShowScrollbar), - PARSE_SET(RC_SCROLLBAR_ARROW, LYsb_arrow), -#endif - PARSE_SET(RC_SEEK_FRAG_AREA_IN_CUR, LYSeekFragAREAinCur), - PARSE_SET(RC_SEEK_FRAG_MAP_IN_CUR, LYSeekFragMAPinCur), -#ifdef USE_SESSIONS - PARSE_SET(RC_AUTO_SESSION, LYAutoSession), - PARSE_STR(RC_SESSION_FILE, LYSessionFile), - PARSE_FUN(RC_SESSION_LIMIT, session_limit_fun), -#endif - PARSE_SET(RC_SET_COOKIES, LYSetCookies), - PARSE_SET(RC_SHOW_CURSOR, LYShowCursor), - PARSE_STR(RC_SHOW_KB_NAME, LYTransferName), - PARSE_ENU(RC_SHOW_KB_RATE, LYTransferRate, tbl_transfer_rate), - PARSE_Env(RC_SNEWS_PROXY, 0), - PARSE_Env(RC_SNEWSPOST_PROXY, 0), - PARSE_Env(RC_SNEWSREPLY_PROXY, 0), - PARSE_SET(RC_SOFT_DQUOTES, soft_dquotes), -#ifdef USE_SOURCE_CACHE - PARSE_ENU(RC_SOURCE_CACHE, LYCacheSource, tbl_source_cache), - PARSE_ENU(RC_SOURCE_CACHE_FOR_ABORTED, LYCacheSourceForAborted, tbl_abort_source_cache), -#endif - PARSE_STR(RC_SSL_CERT_FILE, SSL_cert_file), - PARSE_FUN(RC_STARTFILE, startfile_fun), - PARSE_FUN(RC_STATUS_BUFFER_SIZE, status_buffer_size_fun), - PARSE_SET(RC_STRIP_DOTDOT_URLS, LYStripDotDotURLs), - PARSE_SET(RC_SUBSTITUTE_UNDERSCORES, use_underscore), - PARSE_FUN(RC_SUFFIX, suffix_fun), - PARSE_FUN(RC_SUFFIX_ORDER, suffix_order_fun), -#ifdef SYSLOG_REQUESTED_URLS - PARSE_SET(RC_SYSLOG_REQUESTED_URLS, syslog_requested_urls), - PARSE_STR(RC_SYSLOG_TEXT, syslog_txt), -#endif - PARSE_FUN(RC_SYSTEM_EDITOR, system_editor_fun), - PARSE_STR(RC_SYSTEM_MAIL, system_mail), - PARSE_STR(RC_SYSTEM_MAIL_FLAGS, system_mail_flags), - PARSE_FUN(RC_TAGSOUP, get_tagsoup), - PARSE_PRG(RC_TAR_PATH, ppTAR), - PARSE_PRG(RC_TELNET_PATH, ppTELNET), -#ifdef TEXTFIELDS_MAY_NEED_ACTIVATION - PARSE_SET(RC_TEXTFIELDS_NEED_ACTIVATION, textfields_activation_option), -#endif - PARSE_PRG(RC_TN3270_PATH, ppTN3270), -#if defined(_WINDOWS) - PARSE_INT(RC_TIMEOUT, lynx_timeout), -#endif - PARSE_PRG(RC_TOUCH_PATH, ppTOUCH), - PARSE_SET(RC_TRIM_INPUT_FIELDS, LYtrimInputFields), -#ifdef EXEC_LINKS - PARSE_DEF(RC_TRUSTED_EXEC, EXEC_PATH), -#endif -#ifdef LYNXCGI_LINKS - PARSE_DEF(RC_TRUSTED_LYNXCGI, CGI_PATH), -#endif - PARSE_PRG(RC_UNCOMPRESS_PATH, ppUNCOMPRESS), - PARSE_SET(RC_UNDERLINE_LINKS, LYUnderlineLinks), - PARSE_SET(RC_UNIQUE_URLS, unique_urls), - PARSE_PRG(RC_UNZIP_PATH, ppUNZIP), -#ifdef DIRED_SUPPORT - PARSE_ADD(RC_UPLOADER, uploaders), -#endif - PARSE_STR(RC_URL_DOMAIN_PREFIXES, URLDomainPrefixes), - PARSE_STR(RC_URL_DOMAIN_SUFFIXES, URLDomainSuffixes), -#ifdef VMS - PARSE_SET(RC_USE_FIXED_RECORDS, UseFixedRecords), -#endif -#if defined(USE_MOUSE) - PARSE_SET(RC_USE_MOUSE, LYUseMouse), -#endif - PARSE_SET(RC_USE_SELECT_POPUPS, LYSelectPopups), - PARSE_PRG(RC_UUDECODE_PATH, ppUUDECODE), - PARSE_SET(RC_VERBOSE_IMAGES, verbose_img), - PARSE_SET(RC_VI_KEYS_ALWAYS_ON, vi_keys), - PARSE_FUN(RC_VIEWER, viewer_fun), - PARSE_Env(RC_WAIS_PROXY, 0), - PARSE_SET(RC_WAIT_VIEWER_TERMINATION, wait_viewer_termination), - PARSE_STR(RC_XLOADIMAGE_COMMAND, XLoadImageCommand), - PARSE_SET(RC_XHTML_PARSING, LYxhtml_parsing), - PARSE_PRG(RC_ZCAT_PATH, ppZCAT), - PARSE_PRG(RC_ZIP_PATH, ppZIP), - - PARSE_NIL -}; -/* *INDENT-ON* */ - -static char *lynxcfginfo_url = NULL; /* static */ - -#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO) -static char *configinfo_url = NULL; /* static */ -#endif - -/* - * Free memory allocated in 'read_cfg()' - */ -void free_lynx_cfg(void) -{ - Config_Type *tbl; - - for (tbl = Config_Table; tbl->name != 0; tbl++) { - ParseUnionPtr q = ParseUnionOf(tbl); - - switch (tbl->type) { - case CONF_ENV: - if (q->str_value != 0) { - char *name = *(q->str_value); - char *eqls = strchr(name, '='); - - if (eqls != 0) { - *eqls = 0; -#ifdef VMS - Define_VMSLogical(name, NULL); -#else -# ifdef HAVE_PUTENV - if (putenv(name)) - break; -# else - unsetenv(name); -# endif -#endif - } - FREE(*(q->str_value)); - FREE(q->str_value); - /* is it enough for reload_read_cfg() to clean up - * the result of putenv()? No for certain platforms. - */ - } - break; - default: - break; - } - } - free_all_item_lists(); -#ifdef DIRED_SUPPORT - reset_dired_menu(); /* frees and resets dired menu items - kw */ -#endif - FREE(lynxcfginfo_url); -#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO) - FREE(configinfo_url); -#endif -} - -static Config_Type *lookup_config(const char *name) -{ - Config_Type *tbl = Config_Table; - char ch = (char) TOUPPER(*name); - - while (tbl->name != 0) { - char ch1 = tbl->name[0]; - - if ((ch == TOUPPER(ch1)) - && (0 == strcasecomp(name, tbl->name))) - break; - - tbl++; - } - return tbl; -} - -/* - * If the given value is an absolute path (by syntax), or we can read it, use - * the value as given. Otherwise, assume it must be in the same place we read - * the parent configuration file from. - * - * Note: only read files from the current directory if there's no parent - * filename, otherwise it leads to user surprise. - */ -static char *actual_filename(const char *cfg_filename, - const char *parent_filename, - const char *dft_filename) -{ - char *my_filename = NULL; - - if (!LYisAbsPath(cfg_filename) - && !(parent_filename == 0 && LYCanReadFile(cfg_filename))) { - if (LYIsTilde(cfg_filename[0]) && LYIsPathSep(cfg_filename[1])) { - HTSprintf0(&my_filename, "%s%s", Home_Dir(), cfg_filename + 1); - } else { - if (parent_filename != 0) { - StrAllocCopy(my_filename, parent_filename); - *LYPathLeaf(my_filename) = '\0'; - StrAllocCat(my_filename, cfg_filename); - } - if (my_filename == 0 || !LYCanReadFile(my_filename)) { - StrAllocCopy(my_filename, dft_filename); - *LYPathLeaf(my_filename) = '\0'; - StrAllocCat(my_filename, cfg_filename); - if (!LYCanReadFile(my_filename)) { - StrAllocCopy(my_filename, cfg_filename); - } - } - } - } else { - StrAllocCopy(my_filename, cfg_filename); - } - return my_filename; -} - -FILE *LYOpenCFG(const char *cfg_filename, - const char *parent_filename, - const char *dft_filename) -{ - char *my_file = actual_filename(cfg_filename, parent_filename, dft_filename); - FILE *result; - - CTRACE((tfp, "opening config file %s\n", my_file)); - result = fopen(my_file, TXT_R); - FREE(my_file); - - return result; -} - -#define NOPTS_ ( TABLESIZE(Config_Table) - 1 ) -typedef BOOL (optidx_set_t)[NOPTS_]; - - /* if element is FALSE, then it's allowed in the current file */ - -#define optidx_set_AND(r,a,b) \ - {\ - unsigned i1;\ - for (i1 = 0; i1 < NOPTS_; ++i1) \ - (r)[i1]= (BOOLEAN) ((a)[i1] || (b)[i1]); \ - } - -/* - * For simple (boolean, string, integer, time) values, set the corresponding - * configuration variable. - */ -void LYSetConfigValue(const char *name, - const char *param) -{ - char *value = NULL; - Config_Type *tbl = lookup_config(name); - ParseUnionPtr q = ParseUnionOf(tbl); - char *temp_name = 0; - char *temp_value = 0; - - StrAllocCopy(value, param); - switch (tbl->type) { - case CONF_BOOL: - if (q->set_value != 0) - *(q->set_value) = is_true(value); - break; - - case CONF_FUN: - if (q->fun_value != 0) - (*(q->fun_value)) (value); - break; - - case CONF_TIME: - if (q->int_value != 0) { - float ival; - - if (1 == LYscanFloat(value, &ival)) { - *(q->int_value) = (int) SECS2Secs(ival); - } - } - break; - - case CONF_ENUM: - if (tbl->table != 0) - LYgetEnum(tbl->table, value, q->int_value); - break; - - case CONF_INT: - if (q->int_value != 0) { - int ival; - - if (1 == sscanf(value, "%d", &ival)) - *(q->int_value) = ival; - } - break; - - case CONF_STR: - if (q->str_value != 0) - StrAllocCopy(*(q->str_value), value); - break; - - case CONF_ENV: - case CONF_ENV2: - - if (StrAllocCopy(temp_name, name)) { - if (tbl->type == CONF_ENV) - LYLowerCase(temp_name); - else - LYUpperCase(temp_name); - - if (LYGetEnv(temp_name) == 0) { -#ifdef VMS - Define_VMSLogical(temp_name, value); -#else - if (q->str_value == 0) - q->str_value = typecalloc(char *); - - HTSprintf0(q->str_value, "%s=%s", temp_name, value); - putenv(*(q->str_value)); -#endif - } - FREE(temp_name); - } - break; - case CONF_ADD_ITEM: - if (q->add_value != 0) - add_item_to_list(value, - q->add_value, - (q->add_value == &printers), - FALSE); - break; - - case CONF_ADD_STRING: - if (*(q->lst_value) == NULL) { - *(q->lst_value) = HTList_new(); - } - if (q->lst_value != 0) { - char *my_value = NULL; - - StrAllocCopy(my_value, value); - HTList_appendObject(*(q->lst_value), my_value); - } - break; - -#if defined(EXEC_LINKS) || defined(LYNXCGI_LINKS) - case CONF_ADD_TRUSTED: - add_trusted(value, (int) q->def_value); - break; -#endif - - case CONF_PRG: - if (StrAllocCopy(temp_value, value)) - HTSetProgramPath((ProgramPaths) (q->def_value), temp_value); - break; - - default: - break; - } - FREE(value); -} - -/* - * Process the configuration file (lynx.cfg). - * - * 'allowed' is a pointer to HTList of allowed options. Since the included - * file can also include other files with a list of acceptable options, these - * lists are ANDed. - */ -static void do_read_cfg(const char *cfg_filename, - const char *parent_filename, - int nesting_level, - FILE *fp0, - optidx_set_t *allowed) -{ - FILE *fp; - char *buffer = 0; - - CTRACE((tfp, "Loading cfg file '%s'.\n", cfg_filename)); - - /* - * Don't get hung up by an include file loop. Arbitrary max depth - * of 10. - BL - */ - if (nesting_level > 10) { - fprintf(stderr, - gettext("More than %d nested lynx.cfg includes -- perhaps there is a loop?!?\n"), - nesting_level - 1); - fprintf(stderr, gettext("Last attempted include was '%s',\n"), cfg_filename); - fprintf(stderr, gettext("included from '%s'.\n"), parent_filename); - exit_immediately(EXIT_FAILURE); - } - /* - * Locate and open the file. - */ - if (!cfg_filename || strlen(cfg_filename) == 0) { - CTRACE((tfp, "No filename following -cfg switch!\n")); - return; - } - if ((fp = LYOpenCFG(cfg_filename, parent_filename, LYNX_CFG_FILE)) == 0) { - CTRACE((tfp, "lynx.cfg file not found as '%s'\n", cfg_filename)); - return; - } - have_read_cfg = TRUE; - - /* - * Process each line in the file. - */ - if (show_cfg) { - time_t t; - - time(&t); - printf("### %s %s, at %s", LYNX_NAME, LYNX_VERSION, ctime(&t)); - } - while (LYSafeGets(&buffer, fp) != 0) { - char *name, *value; - char *cp; - Config_Type *tbl; - - /* Most lines in the config file are comment lines. Weed them out - * now. Also, leading whitespace is ok, so trim it. - */ - name = LYSkipBlanks(buffer); - - if (ispunct(UCH(*name))) - continue; - - LYTrimTrailing(name); - - if (*name == 0) - continue; - - /* Significant lines are of the form KEYWORD:WHATEVER */ - if ((value = strchr(name, ':')) == 0) { - /* fprintf (stderr, "Bad line-- no :\n"); */ - CTRACE((tfp, "LYReadCFG: missing ':' %s\n", name)); - continue; - } - - /* skip past colon, but replace ':' with 0 to make name meaningful */ - *value++ = 0; - - /* - * Trim off any trailing comments. - * - * (Apparently, the original code considers a trailing comment valid - * only if preceded by a space character but is not followed by a - * colon. -- JED) - */ - if ((cp = strrchr(value, ':')) == 0) - cp = value; - if ((cp = strchr(cp, '#')) != 0) { - cp--; - if (isspace(UCH(*cp))) - *cp = 0; - } - - CTRACE2(TRACE_CFG, (tfp, "LYReadCFG %s:%s\n", name, value)); - tbl = lookup_config(name); - if (tbl->name == 0) { - /* lynx ignores unknown keywords */ - CTRACE((tfp, "LYReadCFG: ignored %s:%s\n", name, value)); - continue; - } - if (show_cfg) - printf("%s:%s\n", name, value); - - if (allowed && (*allowed)[tbl - Config_Table]) { - if (fp0 == NULL) - fprintf(stderr, "%s is not allowed in the %s\n", - name, cfg_filename); - /*FIXME: we can do something wiser if we are generating - the html representation of lynx.cfg - say include this line - in bold, or something... */ - - continue; - } - - (void) ParseUnionOf(tbl); - switch ((fp0 != 0 && tbl->type != CONF_INCLUDE) - ? CONF_NIL - : tbl->type) { - case CONF_BOOL: - case CONF_FUN: - case CONF_TIME: - case CONF_ENUM: - case CONF_INT: - case CONF_STR: - case CONF_ENV: - case CONF_ENV2: - case CONF_PRG: - case CONF_ADD_ITEM: - case CONF_ADD_STRING: - case CONF_ADD_TRUSTED: - LYSetConfigValue(name, value); - break; - - case CONF_INCLUDE:{ - /* include another file */ - optidx_set_t cur_set, anded_set; - optidx_set_t *resultant_set = NULL; - char *p1, *p2, savechar; - BOOL any_optname_found = FALSE; - - char *url = NULL; - char *cp1 = NULL; - const char *sep = NULL; - - if ((p1 = strstr(value, sep = " for ")) != 0 -#if defined(UNIX) && !defined(USE_DOS_DRIVES) - || (p1 = strstr(value, sep = ":")) != 0 -#endif - ) { - *p1 = '\0'; - p1 += strlen(sep); - } -#ifndef NO_CONFIG_INFO - if (fp0 != 0 && !no_lynxcfg_xinfo) { - char *my_file = actual_filename(value, cfg_filename, LYNX_CFG_FILE); - - LYLocalFileToURL(&url, my_file); - FREE(my_file); - StrAllocCopy(cp1, value); - if (strchr(value, '&') || strchr(value, '<')) { - LYEntify(&cp1, TRUE); - } - - fprintf(fp0, "%s:<a href=\"%s\">%s</a>\n\n", name, url, cp1); - fprintf(fp0, " #<begin %s>\n", cp1); - } -#endif - - if (p1) { - while (*(p1 = LYSkipBlanks(p1)) != 0) { - Config_Type *tbl2; - - p2 = LYSkipNonBlanks(p1); - savechar = *p2; - *p2 = 0; - - tbl2 = lookup_config(p1); - if (tbl2->name == 0) { - if (fp0 == NULL) - fprintf(stderr, - "unknown option name %s in %s\n", - p1, cfg_filename); - } else { - unsigned i; - - if (!any_optname_found) { - any_optname_found = TRUE; - for (i = 0; i < NOPTS_; ++i) - cur_set[i] = TRUE; - } - cur_set[tbl2 - Config_Table] = FALSE; - } - if (savechar && p2[1]) - p1 = p2 + 1; - else - break; - } - } - if (!allowed) { - if (!any_optname_found) - resultant_set = NULL; - else - resultant_set = &cur_set; - } else { - if (!any_optname_found) - resultant_set = allowed; - else { - optidx_set_AND(anded_set, *allowed, cur_set); - resultant_set = &anded_set; - } - } - -#ifndef NO_CONFIG_INFO - /* - * Now list the opts that are allowed in included file. If all - * opts are allowed, then emit nothing, else emit an effective set - * of allowed options in <ul>. Option names will be uppercased. - * FIXME: uppercasing option names can be considered redundant. - */ - if (fp0 != 0 && !no_lynxcfg_xinfo && resultant_set) { - char *buf = NULL; - unsigned i; - - fprintf(fp0, " Options allowed in this file:\n"); - for (i = 0; i < NOPTS_; ++i) { - if ((*resultant_set)[i]) - continue; - StrAllocCopy(buf, Config_Table[i].name); - LYUpperCase(buf); - fprintf(fp0, " * %s\n", buf); - } - FREE(buf); - } -#endif - do_read_cfg(value, cfg_filename, nesting_level + 1, fp0, resultant_set); - -#ifndef NO_CONFIG_INFO - if (fp0 != 0 && !no_lynxcfg_xinfo) { - fprintf(fp0, " #<end of %s>\n\n", cp1); - FREE(url); - FREE(cp1); - } -#endif - } - break; - - default: - if (fp0 != 0) { - if (strchr(value, '&') || strchr(value, '<')) { - char *cp1 = NULL; - - StrAllocCopy(cp1, value); - LYEntify(&cp1, TRUE); - fprintf(fp0, "%s:%s\n", name, cp1); - FREE(cp1); - } else { - fprintf(fp0, "%s:%s\n", name, value); - } - } - break; - } - } - - LYCloseInput(fp); - - /* - * If any DOWNLOADER: commands have always_enabled set (:TRUE), make - * override_no_download TRUE, so that other restriction settings will not - * block presentation of a download menu with those always_enabled options - * still available. - FM - */ - if (downloaders != 0) { - lynx_list_item_type *cur_download; - - cur_download = downloaders; - while (cur_download != 0) { - if (cur_download->always_enabled) { - override_no_download = TRUE; - break; - } - cur_download = cur_download->next; - } - } - - /* - * If any COOKIE_{ACCEPT,REJECT}_DOMAINS have been defined, - * process them. These are comma delimited lists of - * domains. - BJP - * - * And for query/strict/loose invalid cookie checking. - BJP - */ - LYConfigCookies(); -} - -/* this is a public interface to do_read_cfg */ -void read_cfg(const char *cfg_filename, - const char *parent_filename, - int nesting_level, - FILE *fp0) -{ - HTInitProgramPaths(); - do_read_cfg(cfg_filename, parent_filename, nesting_level, fp0, NULL); -} - -#ifndef NO_CONFIG_INFO -static void extra_cfg_link(FILE *fp, const char *href, - const char *name) -{ - fprintf(fp, "<a href=\"%s\">%s</a>", - href, name); -} -#endif /* NO_CONFIG_INFO */ - -/* - * Show rendered lynx.cfg data without comments, LYNXCFG:/ internal page. - * Called from getfile() cycle: we create and load the page just in place and - * return to mainloop(). - */ -int lynx_cfg_infopage(DocInfo *newdoc) -{ - static char tempfile[LY_MAXPATH] = "\0"; - DocAddress WWWDoc; /* need on exit */ - char *temp = 0; - char *cp1 = NULL; - FILE *fp0; - -#ifndef NO_CONFIG_INFO - /*------------------------------------------------- - * kludge a link from LYNXCFG:/, the URL was: - * " <a href=\"LYNXCFG://reload\">RELOAD THE CHANGES</a>\n" - *--------------------------------------------------*/ - - if (!no_lynxcfg_xinfo && (strstr(newdoc->address, "LYNXCFG://reload"))) { - /* - * Some stuff to reload read_cfg(), but also load options menu items - * and command-line options to make things consistent. Implemented in - * LYMain.c - */ - reload_read_cfg(); - - /* - * now pop-up and return to updated LYNXCFG:/ page, remind - * postoptions() but much simpler: - */ - /* - * But check whether the top history document is really the expected - * LYNXCFG: page. - kw - */ - if (HTMainText && nhist > 0 && - !strcmp(HTLoadedDocumentTitle(), LYNXCFG_TITLE) && - !strcmp(HTLoadedDocumentURL(), HDOC(nhist - 1).address) && - LYIsUIPage(HDOC(nhist - 1).address, UIP_LYNXCFG) && - (!lynxcfginfo_url || - strcmp(HTLoadedDocumentURL(), lynxcfginfo_url))) { - /* the page was pushed, so pop-up. */ - LYpop(newdoc); - WWWDoc.address = newdoc->address; - WWWDoc.post_data = newdoc->post_data; - WWWDoc.post_content_type = newdoc->post_content_type; - WWWDoc.bookmark = newdoc->bookmark; - WWWDoc.isHEAD = newdoc->isHEAD; - WWWDoc.safe = newdoc->safe; - LYforce_no_cache = FALSE; /* ! */ - LYoverride_no_cache = TRUE; /* ! */ - - /* - * Working out of getfile() cycle we reset *no_cache manually here - * so HTLoadAbsolute() will return "Document already in memory": - * it was forced reloading obsolete file again without this - * (overhead). - * - * Probably *no_cache was set in a wrong position because of the - * internal page... - */ - if (!HTLoadAbsolute(&WWWDoc)) - return (NOT_FOUND); - - HTuncache_current_document(); /* will never use again */ - LYUnRegisterUIPage(UIP_LYNXCFG); - } - - /* now set up the flag and fall down to create a new LYNXCFG:/ page */ - FREE(lynxcfginfo_url); /* see below */ - } -#endif /* !NO_CONFIG_INFO */ - - /* - * We regenerate the file if reloading has been requested (with LYK_NOCACHE - * key). If we did not regenerate, there would be no way to recover in a - * session from a situation where the file is corrupted (for example - * truncated because the file system was full when it was first created - - * lynx doesn't check for write errors below), short of manual complete - * removal or perhaps forcing regeneration with LYNXCFG://reload. - * Similarly, there would be no simple way to get a different page if - * user_mode has changed to Advanced after the file was first generated in - * a non-Advanced mode (the difference being in whether the page includes - * the link to LYNXCFG://reload or not). - * - * We also try to regenerate the file if lynxcfginfo_url is set, indicating - * that tempfile is valid, but the file has disappeared anyway. This can - * happen to a long-lived lynx process if for example some system script - * periodically cleans up old files in the temp file space. - kw - */ - - if (LYforce_no_cache && reloading) { - FREE(lynxcfginfo_url); /* flag to code below to regenerate - kw */ - } else if (lynxcfginfo_url != NULL) { - if (!LYCanReadFile(tempfile)) { /* check existence */ - FREE(lynxcfginfo_url); /* flag to code below to try again - kw */ - } - } - if (lynxcfginfo_url == 0) { - - if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0) - return (NOT_FOUND); - - LYLocalFileToURL(&lynxcfginfo_url, tempfile); - - LYforce_no_cache = TRUE; /* don't cache this doc */ - - BeginInternalPage(fp0, LYNXCFG_TITLE, NULL); - fprintf(fp0, "<pre>\n"); - -#ifndef NO_CONFIG_INFO - if (!no_lynxcfg_xinfo) { -#if defined(HAVE_CONFIG_H) || defined(VMS) - if (strcmp(lynx_cfg_file, LYNX_CFG_FILE)) { - fprintf(fp0, "<em>%s\n%s", - gettext("The following is read from your lynx.cfg file."), - gettext("Please read the distribution")); - LYLocalFileToURL(&temp, LYNX_CFG_FILE); - fprintf(fp0, " <a href=\"%s\">lynx.cfg</a> ", - temp); - FREE(temp); - fprintf(fp0, "%s</em>\n\n", - gettext("for more comments.")); - } else -#endif /* HAVE_CONFIG_H */ - { - /* no absolute path... for lynx.cfg on DOS/Win32 */ - fprintf(fp0, "<em>%s\n%s", - gettext("The following is read from your lynx.cfg file."), - gettext("Please read the distribution")); - fprintf(fp0, " </em>lynx.cfg<em> "); - fprintf(fp0, "%s</em>\n", - gettext("for more comments.")); - } - -#ifndef NO_CONFIG_INFO -#if defined(HAVE_CONFIG_H) && defined(USE_COLOR_STYLE) - if (!no_compileopts_info && !no_lynxcfg_xinfo) { - fprintf(fp0, "%s</pre><ul><li>", SEE_ALSO); - extra_cfg_link(fp0, STR_LYNXCFLAGS, COMPILE_OPT_SEGMENT); - - fprintf(fp0, "<li>"); - LYLocalFileToURL(&temp, lynx_lss_file); - extra_cfg_link(fp0, temp, COLOR_STYLE_SEGMENT); - fprintf(fp0, "</ul><pre>\n"); - } else -#endif - { - fprintf(fp0, "%s ", SEE_ALSO); -#if defined(HAVE_CONFIG_H) - if (!no_compileopts_info) { - extra_cfg_link(fp0, STR_LYNXCFLAGS, COMPILE_OPT_SEGMENT); - } -#endif -#if defined(USE_COLOR_STYLE) - if (!no_lynxcfg_xinfo) { - LYLocalFileToURL(&temp, lynx_lss_file); - extra_cfg_link(fp0, temp, COLOR_STYLE_SEGMENT); - } -#endif - fprintf(fp0, "\n\n"); - } -#endif /* NO_CONFIG_INFO */ - - /** a new experimental link ... **/ - if (user_mode == ADVANCED_MODE) - fprintf(fp0, " <a href=\"%s//reload\">%s</a>\n", - STR_LYNXCFG, - gettext("RELOAD THE CHANGES")); - - LYLocalFileToURL(&temp, lynx_cfg_file); - StrAllocCopy(cp1, lynx_cfg_file); - if (strchr(lynx_cfg_file, '&') || strchr(lynx_cfg_file, '<')) { - LYEntify(&cp1, TRUE); - } - fprintf(fp0, "\n #<em>%s <a href=\"%s\">%s</a></em>\n", - gettext("Your primary configuration"), - temp, - cp1); - FREE(temp); - FREE(cp1); - - } else -#endif /* !NO_CONFIG_INFO */ - - fprintf(fp0, "<em>%s</em>\n\n", - gettext("The following is read from your lynx.cfg file.")); - - /* - * Process the configuration file. - */ - read_cfg(lynx_cfg_file, "main program", 1, fp0); - - fprintf(fp0, "</pre>\n"); - EndInternalPage(fp0); - LYCloseTempFP(fp0); - LYRegisterUIPage(lynxcfginfo_url, UIP_LYNXCFG); - } - - /* return to getfile() cycle */ - StrAllocCopy(newdoc->address, lynxcfginfo_url); - WWWDoc.address = newdoc->address; - WWWDoc.post_data = newdoc->post_data; - WWWDoc.post_content_type = newdoc->post_content_type; - WWWDoc.bookmark = newdoc->bookmark; - WWWDoc.isHEAD = newdoc->isHEAD; - WWWDoc.safe = newdoc->safe; - - if (!HTLoadAbsolute(&WWWDoc)) - return (NOT_FOUND); -#ifdef DIRED_SUPPORT - lynx_edit_mode = FALSE; -#endif /* DIRED_SUPPORT */ - return (NORMAL); -} - -#if defined(HAVE_CONFIG_H) && !defined(NO_CONFIG_INFO) -/* - * Compile-time definitions info, LYNXCOMPILEOPTS:/ internal page, from - * getfile() cycle. - */ -int lynx_compile_opts(DocInfo *newdoc) -{ - static char tempfile[LY_MAXPATH] = "\0"; - -#define PutDefs(table, N) fprintf(fp0, "%-35s %s\n", table[N].name, table[N].value) -#include <cfg_defs.h> - unsigned n; - DocAddress WWWDoc; /* need on exit */ - FILE *fp0; - - /* In general, create the page only once - compile-time data will not - * change... But we will regenerate the file anyway, in a few situations: - * - * (a) configinfo_url has been FREEd - this can happen if free_lynx_cfg() - * was called as part of a LYNXCFG://reload action. - * - * (b) reloading has been requested (with LYK_NOCACHE key). If we did not - * regenerate, there would be no way to recover in a session from a - * situation where the file is corrupted (for example truncated because the - * file system was full when it was first created - lynx doesn't check for - * write errors below), short of manual complete removal or forcing - * regeneration with LYNXCFG://reload. - * - * (c) configinfo_url is set, indicating that tempfile is valid, but the - * file has disappeared anyway. This can happen to a long-lived lynx - * process if for example some system script periodically cleans up old - * files in the temp file space. - kw - */ - - if (LYforce_no_cache && reloading) { - FREE(configinfo_url); /* flag to code below to regenerate - kw */ - } else if (configinfo_url != NULL) { - if (!LYCanReadFile(tempfile)) { /* check existence */ - FREE(configinfo_url); /* flag to code below to try again - kw */ - } - } - if (configinfo_url == NULL) { - if ((fp0 = InternalPageFP(tempfile, TRUE)) == 0) - return (NOT_FOUND); - - LYLocalFileToURL(&configinfo_url, tempfile); - - BeginInternalPage(fp0, CONFIG_DEF_TITLE, NULL); - fprintf(fp0, "<pre>\n"); - - fprintf(fp0, "\n%s<br>\n<em>config.cache</em>\n", AUTOCONF_CONFIG_CACHE); - for (n = 0; n < TABLESIZE(config_cache); n++) { - PutDefs(config_cache, n); - } - fprintf(fp0, "\n%s<br>\n<em>lynx_cfg.h</em>\n", AUTOCONF_LYNXCFG_H); - for (n = 0; n < TABLESIZE(config_defines); n++) { - PutDefs(config_defines, n); - } - fprintf(fp0, "</pre>\n"); - EndInternalPage(fp0); - LYCloseTempFP(fp0); - LYRegisterUIPage(configinfo_url, UIP_CONFIG_DEF); - } - - /* exit to getfile() cycle */ - StrAllocCopy(newdoc->address, configinfo_url); - WWWDoc.address = newdoc->address; - WWWDoc.post_data = newdoc->post_data; - WWWDoc.post_content_type = newdoc->post_content_type; - WWWDoc.bookmark = newdoc->bookmark; - WWWDoc.isHEAD = newdoc->isHEAD; - WWWDoc.safe = newdoc->safe; - - if (!HTLoadAbsolute(&WWWDoc)) - return (NOT_FOUND); -#ifdef DIRED_SUPPORT - lynx_edit_mode = FALSE; -#endif /* DIRED_SUPPORT */ - return (NORMAL); -} -#endif /* !NO_CONFIG_INFO */ |