X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Finit.c;h=9ce9b1662a8414601425fa65b4fca94b758387bd;hp=4d82e0958e6323e4fff572ec7b1e8ded3f025756;hb=7c802e58d3e45e3a21d99c8d24dc5be806ecf174;hpb=ae3c268719b10f2dd20575a1ecc5c0355065daf3 diff --git a/src/init.c b/src/init.c index 4d82e095..9ce9b166 100644 --- a/src/init.c +++ b/src/init.c @@ -16,7 +16,17 @@ 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. */ +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +In addition, as a special exception, the Free Software Foundation +gives permission to link the code of its release of Wget with the +OpenSSL project's "OpenSSL" library (or with modified versions of it +that use the same license as the "OpenSSL" library), and distribute +the linked executables. You must obey the GNU General Public License +in all respects for all of the code used other than "OpenSSL". If you +modify this file, you may extend this exception to your version of the +file, but you are not obligated to do so. If you do not wish to do +so, delete this exception statement from your version. */ #include @@ -53,12 +63,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "host.h" #include "recur.h" #include "netrc.h" -#include "cookies.h" /* for cookies_cleanup */ +#include "cookies.h" /* for cookie_jar_delete */ +#include "progress.h" #ifndef errno extern int errno; #endif +extern struct cookie_jar *wget_cookie_jar; + /* 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. */ @@ -69,7 +82,6 @@ static int enable_tilde_expansion; #define CMD_DECLARE(func) static int func \ PARAMS ((const char *, const char *, void *)) -CMD_DECLARE (cmd_address); CMD_DECLARE (cmd_boolean); CMD_DECLARE (cmd_bytes); CMD_DECLARE (cmd_directory_vector); @@ -78,6 +90,7 @@ CMD_DECLARE (cmd_number); CMD_DECLARE (cmd_number_inf); CMD_DECLARE (cmd_string); CMD_DECLARE (cmd_file); +CMD_DECLARE (cmd_directory); CMD_DECLARE (cmd_time); CMD_DECLARE (cmd_vector); @@ -85,8 +98,9 @@ CMD_DECLARE (cmd_spec_dirstruct); CMD_DECLARE (cmd_spec_header); CMD_DECLARE (cmd_spec_htmlify); CMD_DECLARE (cmd_spec_mirror); -/*CMD_DECLARE (cmd_spec_progress);*/ +CMD_DECLARE (cmd_spec_progress); CMD_DECLARE (cmd_spec_recursive); +CMD_DECLARE (cmd_spec_restrict_file_names); CMD_DECLARE (cmd_spec_useragent); /* List of recognized commands, each consisting of name, closure and function. @@ -106,7 +120,7 @@ static struct { { "backupconverted", &opt.backup_converted, cmd_boolean }, { "backups", &opt.backups, cmd_number }, { "base", &opt.base_href, cmd_string }, - { "bindaddress", &opt.bind_address, cmd_address }, + { "bindaddress", &opt.bind_address, cmd_string }, { "cache", &opt.allow_cache, cmd_boolean }, { "continue", &opt.always_rest, cmd_boolean }, { "convertlinks", &opt.convert_links, cmd_boolean }, @@ -116,13 +130,17 @@ static struct { { "debug", &opt.debug, cmd_boolean }, #endif { "deleteafter", &opt.delete_after, cmd_boolean }, - { "dirprefix", &opt.dir_prefix, cmd_file }, + { "dirprefix", &opt.dir_prefix, cmd_directory }, { "dirstruct", NULL, cmd_spec_dirstruct }, + { "dnscache", &opt.dns_cache, cmd_boolean }, { "domains", &opt.domains, cmd_vector }, { "dotbytes", &opt.dot_bytes, cmd_bytes }, { "dotsinline", &opt.dots_in_line, cmd_number }, { "dotspacing", &opt.dot_spacing, cmd_number }, { "dotstyle", &opt.dot_style, cmd_string }, +#ifdef HAVE_SSL + { "egdfile", &opt.sslegdsock, cmd_file }, +#endif { "excludedirectories", &opt.excludes, cmd_directory_vector }, { "excludedomains", &opt.exclude_domains, cmd_vector }, { "followftp", &opt.follow_ftp, cmd_boolean }, @@ -157,7 +175,9 @@ static struct { { "pagerequisites", &opt.page_requisites, cmd_boolean }, { "passiveftp", &opt.ftp_pasv, cmd_lockable_boolean }, { "passwd", &opt.ftp_pass, cmd_string }, - { "progress", &opt.progress_type, cmd_string }, + { "postdata", &opt.post_data, cmd_string }, + { "postfile", &opt.post_file_name, cmd_file }, + { "progress", &opt.progress_type, cmd_spec_progress }, { "proxypasswd", &opt.proxy_passwd, cmd_string }, { "proxyuser", &opt.proxy_user, cmd_string }, { "quiet", &opt.quiet, cmd_boolean }, @@ -169,7 +189,9 @@ static struct { { "reject", &opt.rejects, cmd_vector }, { "relativeonly", &opt.relative_only, cmd_boolean }, { "removelisting", &opt.remove_listing, cmd_boolean }, + { "restrictfilenames", NULL, cmd_spec_restrict_file_names }, { "retrsymlinks", &opt.retr_symlinks, cmd_boolean }, + { "retryconnrefused", &opt.retry_connrefused, cmd_boolean }, { "robots", &opt.use_robots, cmd_boolean }, { "savecookies", &opt.cookies_output, cmd_file }, { "saveheaders", &opt.save_headers, cmd_boolean }, @@ -177,10 +199,15 @@ static struct { { "spanhosts", &opt.spanhost, cmd_boolean }, { "spider", &opt.spider, cmd_boolean }, #ifdef HAVE_SSL + { "sslcadir", &opt.sslcadir, cmd_directory }, + { "sslcafile", &opt.sslcafile, cmd_file }, { "sslcertfile", &opt.sslcertfile, cmd_file }, { "sslcertkey", &opt.sslcertkey, cmd_file }, - { "sslegdsock", &opt.sslegdsock, cmd_file }, + { "sslcerttype", &opt.sslcerttype, cmd_number }, + { "sslcheckcert", &opt.sslcheckcert, cmd_number }, + { "sslprotocol", &opt.sslprotocol, cmd_number }, #endif /* HAVE_SSL */ + { "strictcomments", &opt.strict_comments, cmd_boolean }, { "timeout", &opt.timeout, cmd_time }, { "timestamping", &opt.timestamping, cmd_boolean }, { "tries", &opt.ntry, cmd_number_inf }, @@ -191,25 +218,25 @@ static struct { { "waitretry", &opt.waitretry, cmd_time } }; -/* Return index of COM if it is a valid command, or -1 otherwise. COM - is looked up in `commands' using binary search algorithm. */ +/* Look up COM in the commands[] array and return its index. If COM + is not found, -1 is returned. This function uses binary search. */ + static int comind (const char *com) { - int min = 0, max = ARRAY_SIZE (commands) - 1; + int lo = 0, hi = ARRAY_SIZE (commands) - 1; - do + while (lo <= hi) { - int i = (min + max) / 2; - int cmp = strcasecmp (com, commands[i].name); - if (cmp == 0) - return i; - else if (cmp < 0) - max = i - 1; + int mid = (lo + hi) >> 1; + int cmp = strcasecmp (com, commands[mid].name); + if (cmp < 0) + hi = mid - 1; + else if (cmp > 0) + lo = mid + 1; else - min = i + 1; + return mid; } - while (min <= max); return -1; } @@ -255,6 +282,16 @@ defaults (void) opt.dot_bytes = 1024; opt.dot_spacing = 10; opt.dots_in_line = 50; + + opt.dns_cache = 1; + + /* The default for file name restriction defaults to the OS type. */ +#if !defined(WINDOWS) && !defined(__CYGWIN__) + opt.restrict_files_os = restrict_unix; +#else + opt.restrict_files_os = restrict_windows; +#endif + opt.restrict_files_ctrl = 1; } /* Return the user's home directory (strdup-ed), or NULL if none is @@ -300,7 +337,7 @@ wgetrc_file_name (void) { if (!file_exists_p (env)) { - fprintf (stderr, "%s: %s: %s.\n", exec_name, file, strerror (errno)); + fprintf (stderr, "%s: %s: %s.\n", exec_name, env, strerror (errno)); exit (1); } return xstrdup (env); @@ -511,58 +548,28 @@ setval (const char *com, const char *val) static int myatoi PARAMS ((const char *s)); -/* Interpret VAL as an Internet address (a hostname or a dotted-quad - IP address), and write it (in network order) to a malloc-allocated - address. That address gets stored to the memory pointed to by - CLOSURE. COM is ignored, except for error messages. - - #### IMHO it's a mistake to do this kind of work so early in the - process (before any download even started!) opt.bind_address - should simply remember the provided value as a string. Another - function should do the lookup, when needed, and cache the - result. --hniksic */ -static int -cmd_address (const char *com, const char *val, void *closure) -{ - struct address_list *al; - struct sockaddr_in sin; - struct sockaddr_in **target = (struct sockaddr_in **)closure; - - memset (&sin, '\0', sizeof (sin)); - - al = lookup_host (val, 1); - if (!al) - { - fprintf (stderr, _("%s: %s: Cannot convert `%s' to an IP address.\n"), - exec_name, com, val); - return 0; - } - address_list_copy_one (al, 0, (unsigned char *)&sin.sin_addr); - address_list_release (al); - - sin.sin_family = AF_INET; - sin.sin_port = 0; - - FREE_MAYBE (*target); - - *target = xmalloc (sizeof (sin)); - memcpy (*target, &sin, sizeof (sin)); - - return 1; -} - /* Store the boolean value from VAL to CLOSURE. COM is ignored, except for error messages. */ static int cmd_boolean (const char *com, const char *val, void *closure) { int bool_value; - - if (!strcasecmp (val, "on") - || (*val == '1' && !*(val + 1))) + const char *v = val; +#define LC(x) TOLOWER(x) + + if ((LC(v[0]) == 'o' && LC(v[1]) == 'n' && !v[2]) + || + (LC(v[0]) == 'y' && LC(v[1]) == 'e' && LC(v[2]) == 's' && !v[3]) + || + (v[0] == '1' && !v[1])) + /* "on", "yes" and "1" mean true. */ bool_value = 1; - else if (!strcasecmp (val, "off") - || (*val == '0' && !*(val + 1))) + else if ((LC(v[0]) == 'o' && LC(v[1]) == 'f' && LC(v[2]) == 'f' && !v[3]) + || + (LC(v[0]) == 'n' && LC(v[1]) == 'o' && !v[2]) + || + (v[0] == '0' && !v[1])) + /* "off", "no" and "0" mean false. */ bool_value = 0; else { @@ -596,17 +603,17 @@ cmd_lockable_boolean (const char *com, const char *val, void *closure) if (*(int *)closure == -1 || *(int *)closure == 2) return 1; - if (!strcasecmp (val, "always") - || (*val == '2' && !*(val + 1))) + if (!strcasecmp (val, "always") || !strcmp (val, "2")) lockable_boolean_value = 2; else if (!strcasecmp (val, "on") - || (*val == '1' && !*(val + 1))) + || !strcasecmp (val, "yes") + || !strcmp (val, "1")) lockable_boolean_value = 1; else if (!strcasecmp (val, "off") - || (*val == '0' && !*(val + 1))) + || !strcasecmp (val, "no") + || !strcmp (val, "0")) lockable_boolean_value = 0; - else if (!strcasecmp (val, "never") - || (*val == '-' && *(val + 1) == '1' && !*(val + 2))) + else if (!strcasecmp (val, "never") || !strcmp (val, "-1")) lockable_boolean_value = -1; else { @@ -670,7 +677,14 @@ cmd_file (const char *com, const char *val, void *closure) char **pstring = (char **)closure; FREE_MAYBE (*pstring); - if (!enable_tilde_expansion || !(*val == '~' && *(val + 1) == '/')) + + /* #### If VAL is empty, perhaps should set *CLOSURE to NULL. */ + + if (!enable_tilde_expansion || !(*val == '~' && (*(val + 1) == '/' +#ifdef WINDOWS + || *(val + 1) == '\\' +#endif + ))) { noexpand: *pstring = xstrdup (val); @@ -684,20 +698,58 @@ cmd_file (const char *com, const char *val, void *closure) goto noexpand; homelen = strlen (home); - while (homelen && home[homelen - 1] == '/') + while (homelen && (home[homelen - 1] == '/' +#ifdef WINDOWS + || home[homelen - 1] == '\\' +#endif + )) home[--homelen] = '\0'; /* Skip the leading "~/". */ +#ifdef WINDOWS + for (++val; *val == '/' || *val == '\\'; val++) + ; +#else for (++val; *val == '/'; val++) ; +#endif - result = xmalloc (homelen + 1 + strlen (val)); + result = xmalloc (homelen + 1 + strlen (val) + 1); memcpy (result, home, homelen); result[homelen] = '/'; strcpy (result + homelen + 1, val); *pstring = result; } +#ifdef WINDOWS + /* Convert "\" to "/". */ + { + char *s; + for (s = *pstring; *s; s++) + if (*s == '\\') + *s = '/'; + } +#endif + return 1; +} + +/* Like cmd_file, but strips trailing '/' characters. */ +static int +cmd_directory (const char *com, const char *val, void *closure) +{ + char *s, *t; + + /* Call cmd_file() for tilde expansion and separator + canonicalization (backslash -> slash under Windows). These + things should perhaps be in a separate function. */ + if (!cmd_file (com, val, closure)) + return 0; + + s = *(char **)closure; + t = s + strlen (s); + while (t > s && *--t == '/') + *t = '\0'; + return 1; } @@ -937,7 +989,6 @@ cmd_spec_mirror (const char *com, const char *val, void *closure) return 1; } -#if 0 static int cmd_spec_progress (const char *com, const char *val, void *closure) { @@ -947,10 +998,13 @@ cmd_spec_progress (const char *com, const char *val, void *closure) exec_name, com, val); return 0; } - set_progress_implementation (val); + FREE_MAYBE (opt.progress_type); + + /* Don't call set_progress_implementation here. It will be called + in main() when it becomes clear what the log output is. */ + opt.progress_type = xstrdup (val); return 1; } -#endif static int cmd_spec_recursive (const char *com, const char *val, void *closure) @@ -965,6 +1019,47 @@ cmd_spec_recursive (const char *com, const char *val, void *closure) return 1; } +static int +cmd_spec_restrict_file_names (const char *com, const char *val, void *closure) +{ + int restrict_os = opt.restrict_files_os; + int restrict_ctrl = opt.restrict_files_ctrl; + + const char *end = strchr (val, ','); + if (!end) + end = val + strlen (val); + +#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 + { + err: + fprintf (stderr, _("%s: %s: Invalid specification `%s'.\n"), + exec_name, com, val); + return 0; + } + +#undef VAL_IS + + if (*end) + { + if (!strcmp (end + 1, "nocontrol")) + restrict_ctrl = 0; + else + goto err; + } + + opt.restrict_files_os = restrict_os; + opt.restrict_files_ctrl = restrict_ctrl; + return 1; +} + static int cmd_spec_useragent (const char *com, const char *val, void *closure) { @@ -998,8 +1093,6 @@ myatoi (const char *s) return res; } -#define ISODIGIT(x) ((x) >= '0' && (x) <= '7') - static int check_user_specified_header (const char *s) { @@ -1045,8 +1138,8 @@ cleanup (void) http_cleanup (); cleanup_html_url (); downloaded_files_free (); - cookies_cleanup (); host_cleanup (); + cookie_jar_delete (wget_cookie_jar); { extern acc_t *netrc_list;