X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Finit.c;h=5bed28f6804adb6b136cca7ef30f60e5a1c1976c;hb=766df9d4e9392045a4e5c730ed81e599b509557a;hp=e957e528c8cb4dbcde3b7aa5999a4d3f53b26edd;hpb=caae3b70f46bd519857b595f7f06ea0179551336;p=wget diff --git a/src/init.c b/src/init.c index e957e528..5bed28f6 100644 --- a/src/init.c +++ b/src/init.c @@ -1,6 +1,6 @@ /* Reading/parsing the initialization file. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -113,6 +113,7 @@ static const struct { { "accept", &opt.accepts, cmd_vector }, { "addhostdir", &opt.add_hostdir, cmd_boolean }, { "alwaysrest", &opt.always_rest, cmd_boolean }, /* deprecated */ + { "askpassword", &opt.ask_passwd, cmd_boolean }, { "authnochallenge", &opt.auth_without_challenge, cmd_boolean }, { "background", &opt.background, cmd_boolean }, @@ -139,6 +140,7 @@ static const struct { #ifdef ENABLE_DEBUG { "debug", &opt.debug, cmd_boolean }, #endif + { "defaultpage", &opt.default_page, cmd_string}, { "deleteafter", &opt.delete_after, cmd_boolean }, { "dirprefix", &opt.dir_prefix, cmd_directory }, { "dirstruct", NULL, cmd_spec_dirstruct }, @@ -300,6 +302,7 @@ defaults (void) tmp = getenv ("no_proxy"); if (tmp) opt.no_proxy = sepstring (tmp); + opt.prefer_family = prefer_none; opt.allow_cache = true; opt.read_timeout = 900; @@ -328,6 +331,8 @@ defaults (void) opt.restrict_files_case = restrict_no_case_restriction; opt.max_redirect = 20; + + opt.waitretry = 10; } /* Return the user's home directory (strdup-ed), or NULL if none is @@ -335,53 +340,54 @@ defaults (void) char * home_dir (void) { - char *home = getenv ("HOME"); + static char buf[PATH_MAX]; + static char *home; if (!home) { + home = getenv ("HOME"); + if (!home) + { #if defined(MSDOS) - /* Under MSDOS, if $HOME isn't defined, use the directory where - `wget.exe' resides. */ - const char *_w32_get_argv0 (void); /* in libwatt.a/pcconfig.c */ - char *p, buf[PATH_MAX]; - - strcpy (buf, _w32_get_argv0 ()); - p = strrchr (buf, '/'); /* djgpp */ - if (!p) - p = strrchr (buf, '\\'); /* others */ - assert (p); - *p = '\0'; - home = buf; + /* Under MSDOS, if $HOME isn't defined, use the directory where + `wget.exe' resides. */ + const char *_w32_get_argv0 (void); /* in libwatt.a/pcconfig.c */ + char *p; + + strcpy (buf, _w32_get_argv0 ()); + p = strrchr (buf, '/'); /* djgpp */ + if (!p) + p = strrchr (buf, '\\'); /* others */ + assert (p); + *p = '\0'; + home = buf; #elif !defined(WINDOWS) - /* If HOME is not defined, try getting it from the password - file. */ - struct passwd *pwd = getpwuid (getuid ()); - if (!pwd || !pwd->pw_dir) - return NULL; - home = pwd->pw_dir; + /* If HOME is not defined, try getting it from the password + file. */ + struct passwd *pwd = getpwuid (getuid ()); + if (!pwd || !pwd->pw_dir) + return NULL; + strcpy (buf, pwd->pw_dir); + home = buf; #else /* !WINDOWS */ - /* Under Windows, if $HOME isn't defined, use the directory where - `wget.exe' resides. */ - home = ws_mypath (); + /* Under Windows, if $HOME isn't defined, use the directory where + `wget.exe' resides. */ + home = ws_mypath (); #endif /* WINDOWS */ + } } return home ? xstrdup (home) : NULL; } -/* Return the path to the user's .wgetrc. This is either the value of - `WGETRC' environment variable, or `$HOME/.wgetrc'. - +/* Check the 'WGETRC' environment variable and return the file name + if 'WGETRC' is set and is a valid file. If the `WGETRC' variable exists but the file does not exist, the function will exit(). */ -static char * -wgetrc_file_name (void) +char * +wgetrc_env_file_name (void) { - char *env, *home; - char *file = NULL; - - /* Try the environment. */ - env = getenv ("WGETRC"); + char *env = getenv ("WGETRC"); if (env && *env) { if (!file_exists_p (env)) @@ -392,18 +398,50 @@ wgetrc_file_name (void) } return xstrdup (env); } + return NULL; +} - /* If that failed, try $HOME/.wgetrc. */ - home = home_dir (); +/* Check for the existance of '$HOME/.wgetrc' and return it's path + if it exists and is set. */ +char * +wgetrc_user_file_name (void) +{ + char *home = home_dir (); + char *file = NULL; if (home) file = aprintf ("%s/.wgetrc", home); xfree_null (home); + if (!file) + return NULL; + if (!file_exists_p (file)) + { + xfree (file); + return NULL; + } + return file; +} + +/* Return the path to the user's .wgetrc. This is either the value of + `WGETRC' environment variable, or `$HOME/.wgetrc'. + + Additionally, for windows, look in the directory where wget.exe + resides. */ +char * +wgetrc_file_name (void) +{ + char *home = NULL; + char *file = wgetrc_env_file_name (); + if (file && *file) + return file; + + file = wgetrc_user_file_name (); #ifdef WINDOWS /* Under Windows, if we still haven't found .wgetrc, look for the file `wget.ini' in the directory where `wget.exe' resides; we do this for backward compatibility with previous versions of Wget. SYSTEM_WGETRC should not be defined under WINDOWS. */ + home = home_dir (); if (!file || !file_exists_p (file)) { xfree_null (file); @@ -412,6 +450,7 @@ wgetrc_file_name (void) if (home) file = aprintf ("%s/wget.ini", home); } + xfree_null (home); #endif /* WINDOWS */ if (!file) @@ -478,8 +517,8 @@ run_wgetrc (const char *file) ++errcnt; break; case line_unknown_command: - fprintf (stderr, _("%s: Unknown command `%s' in %s at line %d.\n"), - exec_name, com, file, ln); + fprintf (stderr, _("%s: Unknown command %s in %s at line %d.\n"), + exec_name, quote (com), file, ln); ++errcnt; break; case line_empty: @@ -503,15 +542,20 @@ run_wgetrc (const char *file) void initialize (void) { - char *file; + char *file, *env_sysrc; int ok = true; /* Load the hard-coded defaults. */ defaults (); - - /* If SYSTEM_WGETRC is defined, use it. */ + + /* Run a non-standard system rc file when the according environment + variable has been set. For internal testing purposes only! */ + env_sysrc = getenv ("SYSTEM_WGETRC"); + if (env_sysrc && file_exists_p (env_sysrc)) + ok &= run_wgetrc (env_sysrc); + /* Otherwise, if SYSTEM_WGETRC is defined, use it. */ #ifdef SYSTEM_WGETRC - if (file_exists_p (SYSTEM_WGETRC)) + else if (file_exists_p (SYSTEM_WGETRC)) ok &= run_wgetrc (SYSTEM_WGETRC); #endif /* Override it with your own, if one exists. */ @@ -524,8 +568,8 @@ initialize (void) if (!strcmp (file, SYSTEM_WGETRC)) { fprintf (stderr, _("\ -%s: Warning: Both system and user wgetrc point to `%s'.\n"), - exec_name, file); +%s: Warning: Both system and user wgetrc point to %s.\n"), + exec_name, quote (file)); } else #endif @@ -538,7 +582,7 @@ initialize (void) xfree (file); return; } - + /* Remove dashes and underscores from S, modifying S in the process. */ @@ -629,7 +673,7 @@ parse_line (const char *line, char **com, char **val, int *comind) static bool setval_internal (int comind, const char *com, const char *val) { - assert (0 <= comind && comind < countof (commands)); + assert (0 <= comind && ((size_t) comind) < countof (commands)); DEBUGP (("Setting %s (%s) to %s\n", com, commands[comind].name, val)); return commands[comind].action (com, val, commands[comind].place); } @@ -676,8 +720,8 @@ run_command (const char *opt) xfree (val); break; default: - fprintf (stderr, _("%s: Invalid --execute command `%s'\n"), - exec_name, opt); + fprintf (stderr, _("%s: Invalid --execute command %s\n"), + exec_name, quote (opt)); exit (2); } } @@ -721,8 +765,8 @@ cmd_boolean (const char *com, const char *val, void *place) else { fprintf (stderr, - _("%s: %s: Invalid boolean `%s'; use `on' or `off'.\n"), - exec_name, com, val); + _("%s: %s: Invalid boolean %s; use `on' or `off'.\n"), + exec_name, com, quote (val)); return false; } @@ -738,8 +782,8 @@ cmd_number (const char *com, const char *val, void *place) if (!simple_atoi (val, val + strlen (val), place) || *(int *) place < 0) { - fprintf (stderr, _("%s: %s: Invalid number `%s'.\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid number %s.\n"), + exec_name, com, quote (val)); return false; } return true; @@ -969,8 +1013,8 @@ cmd_bytes (const char *com, const char *val, void *place) double byte_value; if (!parse_bytes_helper (val, &byte_value)) { - fprintf (stderr, _("%s: %s: Invalid byte value `%s'\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid byte value %s\n"), + exec_name, com, quote (val)); return false; } *(wgint *)place = (wgint)byte_value; @@ -988,8 +1032,8 @@ cmd_bytes_sum (const char *com, const char *val, void *place) double byte_value; if (!parse_bytes_helper (val, &byte_value)) { - fprintf (stderr, _("%s: %s: Invalid byte value `%s'\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid byte value %s\n"), + exec_name, com, quote (val)); return false; } *(SUM_SIZE_INT *) place = (SUM_SIZE_INT) byte_value; @@ -1013,8 +1057,8 @@ cmd_time (const char *com, const char *val, void *place) if (val == end) { err: - fprintf (stderr, _("%s: %s: Invalid time period `%s'\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid time period %s\n"), + exec_name, com, quote (val)); return false; } @@ -1067,7 +1111,7 @@ cmd_cert_type (const char *com, const char *val, void *place) }; int ok = decode_string (val, choices, countof (choices), place); if (!ok) - fprintf (stderr, _("%s: %s: Invalid value `%s'.\n"), exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val)); return ok; } #endif @@ -1104,8 +1148,8 @@ cmd_spec_header (const char *com, const char *val, void *place_ignored) if (!check_user_specified_header (val)) { - fprintf (stderr, _("%s: %s: Invalid header `%s'.\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid header %s.\n"), + exec_name, com, quote (val)); return false; } opt.user_headers = vec_append (opt.user_headers, val); @@ -1154,10 +1198,10 @@ cmd_spec_prefer_family (const char *com, const char *val, void *place_ignored) { "IPv6", prefer_ipv6 }, { "none", prefer_none }, }; - int prefer_family = prefer_ipv4; + int prefer_family = prefer_none; int ok = decode_string (val, choices, countof (choices), &prefer_family); if (!ok) - fprintf (stderr, _("%s: %s: Invalid value `%s'.\n"), exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val)); opt.prefer_family = prefer_family; return ok; } @@ -1170,8 +1214,8 @@ cmd_spec_progress (const char *com, const char *val, void *place_ignored) { if (!valid_progress_implementation_p (val)) { - fprintf (stderr, _("%s: %s: Invalid progress type `%s'.\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid progress type %s.\n"), + exec_name, com, quote (val)); return false; } xfree_null (opt.progress_type); @@ -1229,8 +1273,8 @@ cmd_spec_restrict_file_names (const char *com, const char *val, void *place_igno else { fprintf (stderr, - _("%s: %s: Invalid restriction `%s', use [unix|windows],[lowercase|uppercase],[nocontrol].\n"), - exec_name, com, val); + _("%s: %s: Invalid restriction %s, use [unix|windows],[lowercase|uppercase],[nocontrol].\n"), + exec_name, com, quote (val)); return false; } @@ -1260,7 +1304,7 @@ cmd_spec_secure_protocol (const char *com, const char *val, void *place) }; int ok = decode_string (val, choices, countof (choices), place); if (!ok) - fprintf (stderr, _("%s: %s: Invalid value `%s'.\n"), exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val)); return ok; } #endif @@ -1285,8 +1329,8 @@ cmd_spec_useragent (const char *com, const char *val, void *place_ignored) /* Disallow embedded newlines. */ if (strchr (val, '\n')) { - fprintf (stderr, _("%s: %s: Invalid value `%s'.\n"), - exec_name, com, val); + fprintf (stderr, _("%s: %s: Invalid value %s.\n"), + exec_name, com, quote (val)); return false; } xfree_null (opt.useragent); @@ -1523,6 +1567,8 @@ cleanup (void) xfree_null (opt.cookies_output); xfree_null (opt.user); xfree_null (opt.passwd); + xfree_null (opt.base_href); + #endif /* DEBUG_MALLOC */ } @@ -1530,6 +1576,29 @@ cleanup (void) #ifdef TESTING +const char * +test_commands_sorted() +{ + int prev_idx = 0, next_idx = 1; + int command_count = countof (commands) - 1; + int cmp = 0; + while (next_idx <= command_count) + { + cmp = strcasecmp (commands[prev_idx].name, commands[next_idx].name); + if (cmp > 0) + { + mu_assert ("FAILED", false); + break; + } + else + { + prev_idx ++; + next_idx ++; + } + } + return NULL; +} + const char * test_cmd_spec_restrict_file_names() {