X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Finit.c;h=6ad97f3645100b745090c6e21ac5789cd4b519e9;hb=4d7c5e087b2bc82c9f503dff003916d1047903ce;hp=db2d274233d9bb639c83ece523ecdc38091ab2c2;hpb=2447fb9a9b85083c1e6fa54d0a18bdf3962fab1f;p=wget diff --git a/src/init.c b/src/init.c index db2d2742..6ad97f36 100644 --- a/src/init.c +++ b/src/init.c @@ -1,11 +1,11 @@ /* Reading/parsing the initialization file. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 1996-2006 Free Software Foundation, Inc. This file is part of GNU Wget. GNU Wget is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +the Free Software Foundation; either version 3 of the License, or (at your option) any later version. GNU Wget is distributed in the hope that it will be useful, @@ -14,8 +14,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Wget; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +along with Wget. If not, see . In addition, as a special exception, the Free Software Foundation gives permission to link the code of its release of Wget with the @@ -54,6 +53,10 @@ so, delete this exception statement from your version. */ #include "http.h" /* for http_cleanup */ #include "retr.h" /* for output_stream */ +#ifdef TESTING +#include "test.h" +#endif + /* We want tilde expansion enabled only when reading `.wgetrc' lines; otherwise, it will be performed by the shell. This variable will be set by the wgetrc-reading function. */ @@ -96,15 +99,16 @@ CMD_DECLARE (cmd_spec_verbose); /* List of recognized commands, each consisting of name, place and function. When adding a new command, simply add it to the list, but be sure to keep the list sorted alphabetically, as - command_by_name depends on it. Also, be sure to add any entries - that allocate memory (e.g. cmd_string and cmd_vector) to the - cleanup() function below. */ + command_by_name's binary search depends on it. Also, be sure to + add any entries that allocate memory (e.g. cmd_string and + cmd_vector) to the cleanup() function below. */ static struct { const char *name; void *place; bool (*action) (const char *, const char *, void *); } commands[] = { + /* KEEP THIS LIST ALPHABETICALLY SORTED */ { "accept", &opt.accepts, cmd_vector }, { "addhostdir", &opt.add_hostdir, cmd_boolean }, { "alwaysrest", &opt.always_rest, cmd_boolean }, /* deprecated */ @@ -124,6 +128,7 @@ static struct { { "checkcertificate", &opt.check_cert, cmd_boolean }, #endif { "connecttimeout", &opt.connect_timeout, cmd_time }, + { "contentdisposition", &opt.content_disposition, cmd_boolean }, { "continue", &opt.always_rest, cmd_boolean }, { "convertlinks", &opt.convert_links, cmd_boolean }, { "cookies", &opt.cookies, cmd_boolean }, @@ -163,6 +168,7 @@ static struct { { "httpproxy", &opt.http_proxy, cmd_string }, { "httpsproxy", &opt.https_proxy, cmd_string }, { "httpuser", &opt.http_user, cmd_string }, + { "ignorecase", &opt.ignore_case, cmd_boolean }, { "ignorelength", &opt.ignore_length, cmd_boolean }, { "ignoretags", &opt.ignore_tags, cmd_vector }, { "includedirectories", &opt.includes, cmd_directory_vector }, @@ -172,7 +178,6 @@ static struct { #endif { "input", &opt.input_filename, cmd_file }, { "keepsessioncookies", &opt.keep_session_cookies, cmd_boolean }, - { "killlonger", &opt.kill_longer, cmd_boolean }, { "limitrate", &opt.limit_rate, cmd_bytes }, { "loadcookies", &opt.cookies_input, cmd_file }, { "logfile", &opt.lfilename, cmd_file }, @@ -313,6 +318,9 @@ defaults (void) opt.restrict_files_os = restrict_windows; #endif opt.restrict_files_ctrl = true; + opt.restrict_files_case = restrict_no_case_restriction; + + opt.content_disposition = true; } /* Return the user's home directory (strdup-ed), or NULL if none is @@ -562,7 +570,7 @@ parse_line (const char *line, char **com, char **val, int *comind) p = line; cmdstart = p; - while (p < end && (ISALPHA (*p) || *p == '_' || *p == '-')) + while (p < end && (ISALNUM (*p) || *p == '_' || *p == '-')) ++p; cmdend = p; @@ -1126,10 +1134,11 @@ cmd_spec_prefer_family (const char *com, const char *val, void *place_ignored) { "IPv6", prefer_ipv6 }, { "none", prefer_none }, }; - int ok = decode_string (val, choices, countof (choices), - (int *) &opt.prefer_family); + int prefer_family = prefer_ipv4; + int ok = decode_string (val, choices, countof (choices), &prefer_family); if (!ok) fprintf (stderr, _("%s: %s: Invalid value `%s'.\n"), exec_name, com, val); + opt.prefer_family = prefer_family; return ok; } @@ -1175,40 +1184,47 @@ cmd_spec_restrict_file_names (const char *com, const char *val, void *place_igno { int restrict_os = opt.restrict_files_os; int restrict_ctrl = opt.restrict_files_ctrl; + int restrict_case = opt.restrict_files_case; - const char *end = strchr (val, ','); - if (!end) - end = val + strlen (val); + const char *end; #define VAL_IS(string_literal) BOUNDED_EQUAL (val, end, string_literal) - if (VAL_IS ("unix")) - restrict_os = restrict_unix; - else if (VAL_IS ("windows")) - restrict_os = restrict_windows; - else if (VAL_IS ("nocontrol")) - restrict_ctrl = 0; - else + do { - err: - fprintf (stderr, - _("%s: %s: Invalid restriction `%s', use `unix' or `windows'.\n"), - exec_name, com, val); - return false; + end = strchr (val, ','); + if (!end) + end = val + strlen (val); + + if (VAL_IS ("unix")) + restrict_os = restrict_unix; + else if (VAL_IS ("windows")) + restrict_os = restrict_windows; + else if (VAL_IS ("lowercase")) + restrict_case = restrict_lowercase; + else if (VAL_IS ("uppercase")) + restrict_case = restrict_uppercase; + else if (VAL_IS ("nocontrol")) + restrict_ctrl = false; + else + { + fprintf (stderr, + _("%s: %s: Invalid restriction `%s', use [unix|windows],[lowercase|uppercase],[nocontrol].\n"), + exec_name, com, val); + return false; + } + + if (*end) + val = end + 1; } + while (*val && *end); #undef VAL_IS - if (*end) - { - if (!strcmp (end + 1, "nocontrol")) - restrict_ctrl = false; - else - goto err; - } - opt.restrict_files_os = restrict_os; opt.restrict_files_ctrl = restrict_ctrl; + opt.restrict_files_case = restrict_case; + return true; } @@ -1388,7 +1404,8 @@ check_user_specified_header (const char *s) { const char *p; - for (p = s; *p && *p != ':' && !ISSPACE (*p); p++); + for (p = s; *p && *p != ':' && !ISSPACE (*p); p++) + ; /* The header MUST contain `:' preceded by at least one non-whitespace character. */ if (*p != ':' || p == s) @@ -1488,3 +1505,50 @@ cleanup (void) xfree_null (opt.passwd); #endif /* DEBUG_MALLOC */ } + +/* Unit testing routines. */ + +#ifdef TESTING + +const char * +test_cmd_spec_restrict_file_names() +{ + int i; + struct { + char *val; + int expected_restrict_files_os; + int expected_restrict_files_ctrl; + int expected_restrict_files_case; + bool result; + } test_array[] = { + { "windows", restrict_windows, true, restrict_no_case_restriction, true }, + { "windows,", restrict_windows, true, restrict_no_case_restriction, true }, + { "windows,lowercase", restrict_windows, true, restrict_lowercase, true }, + { "unix,nocontrol,lowercase,", restrict_unix, false, restrict_lowercase, true }, + }; + + for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) + { + bool res; + + defaults(); + res = cmd_spec_restrict_file_names ("dummy", test_array[i].val, NULL); + + /* + fprintf (stderr, "test_cmd_spec_restrict_file_names: TEST %d\n", i); fflush (stderr); + fprintf (stderr, "opt.restrict_files_os: %d\n", opt.restrict_files_os); fflush (stderr); + fprintf (stderr, "opt.restrict_files_ctrl: %d\n", opt.restrict_files_ctrl); fflush (stderr); + fprintf (stderr, "opt.restrict_files_case: %d\n", opt.restrict_files_case); fflush (stderr); + */ + mu_assert ("test_cmd_spec_restrict_file_names: wrong result", + res == test_array[i].result + && opt.restrict_files_os == test_array[i].expected_restrict_files_os + && opt.restrict_files_ctrl == test_array[i].expected_restrict_files_ctrl + && opt.restrict_files_case == test_array[i].expected_restrict_files_case); + } + + return NULL; +} + +#endif /* TESTING */ +