X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Finit.c;h=321f50d4bf7d63ada9e695b2f6f898c6e989acda;hb=07f60f19a4ee99ddc343bb51568b0c474e9b853d;hp=9be64e9a3d35508b9bd6dc855361ef853677cbc1;hpb=31d6616c483359af431f4c33c3c5b237cd8d4426;p=wget diff --git a/src/init.c b/src/init.c index 9be64e9a..321f50d4 100644 --- a/src/init.c +++ b/src/init.c @@ -1,5 +1,5 @@ /* Reading/parsing the initialization file. - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc. This file is part of Wget. @@ -33,6 +33,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include +#ifdef WINDOWS +# include +#else +# include +# include +# include +#endif + #ifdef HAVE_PWD_H #include #endif @@ -52,29 +60,30 @@ extern int errno; #define CMD_DECLARE(func) static int func \ PARAMS ((const char *, const char *, void *)) +CMD_DECLARE (cmd_address); CMD_DECLARE (cmd_boolean); -CMD_DECLARE (cmd_boolean); +CMD_DECLARE (cmd_bytes); +CMD_DECLARE (cmd_directory_vector); +CMD_DECLARE (cmd_lockable_boolean); CMD_DECLARE (cmd_number); CMD_DECLARE (cmd_number_inf); CMD_DECLARE (cmd_string); -CMD_DECLARE (cmd_vector); -CMD_DECLARE (cmd_directory_vector); -CMD_DECLARE (cmd_bytes); CMD_DECLARE (cmd_time); +CMD_DECLARE (cmd_vector); CMD_DECLARE (cmd_spec_dirstruct); CMD_DECLARE (cmd_spec_dotstyle); CMD_DECLARE (cmd_spec_header); CMD_DECLARE (cmd_spec_htmlify); CMD_DECLARE (cmd_spec_mirror); -CMD_DECLARE (cmd_spec_outputdocument); CMD_DECLARE (cmd_spec_recursive); CMD_DECLARE (cmd_spec_useragent); -/* List of recognized commands, each consisting of name, closure and - function. When adding a new command, simply add it to the list, - but be sure to keep the list sorted alphabetically, as comind() - depends on it. */ +/* List of recognized commands, each consisting of name, closure and function. + When adding a new command, simply add it to the list, but be sure to keep the + list sorted alphabetically, as comind() depends on it. Also, be sure to add + any entries that allocate memory (e.g. cmd_string and cmd_vector guys) to the + cleanup() function below. */ static struct { char *name; void *closure; @@ -84,8 +93,10 @@ static struct { { "addhostdir", &opt.add_hostdir, cmd_boolean }, { "alwaysrest", &opt.always_rest, cmd_boolean }, /* deprecated */ { "background", &opt.background, cmd_boolean }, + { "backupconverted", &opt.backup_converted, cmd_boolean }, { "backups", &opt.backups, cmd_number }, { "base", &opt.base_href, cmd_string }, + { "bindaddress", &opt.bind_address, cmd_address }, { "cache", &opt.proxy_cache, cmd_boolean }, { "continue", &opt.always_rest, cmd_boolean }, { "convertlinks", &opt.convert_links, cmd_boolean }, @@ -104,15 +115,20 @@ static struct { { "excludedirectories", &opt.excludes, cmd_directory_vector }, { "excludedomains", &opt.exclude_domains, cmd_vector }, { "followftp", &opt.follow_ftp, cmd_boolean }, + { "followtags", &opt.follow_tags, cmd_vector }, { "forcehtml", &opt.force_html, cmd_boolean }, { "ftpproxy", &opt.ftp_proxy, cmd_string }, { "glob", &opt.ftp_glob, cmd_boolean }, { "header", NULL, cmd_spec_header }, + { "htmlextension", &opt.html_extension, cmd_boolean }, { "htmlify", NULL, cmd_spec_htmlify }, + { "httpkeepalive", &opt.http_keep_alive, cmd_boolean }, { "httppasswd", &opt.http_passwd, cmd_string }, { "httpproxy", &opt.http_proxy, cmd_string }, { "httpuser", &opt.http_user, cmd_string }, + { "httpsproxy", &opt.https_proxy, cmd_string }, { "ignorelength", &opt.ignore_length, cmd_boolean }, + { "ignoretags", &opt.ignore_tags, cmd_vector }, { "includedirectories", &opt.includes, cmd_directory_vector }, { "input", &opt.input_filename, cmd_string }, { "killlonger", &opt.kill_longer, cmd_boolean }, @@ -123,9 +139,10 @@ static struct { { "noclobber", &opt.noclobber, cmd_boolean }, { "noparent", &opt.no_parent, cmd_boolean }, { "noproxy", &opt.no_proxy, cmd_vector }, - { "numtries", &opt.ntry, cmd_number_inf }, /* deprecated */ - { "outputdocument", NULL, cmd_spec_outputdocument }, - { "passiveftp", &opt.ftp_pasv, cmd_boolean }, + { "numtries", &opt.ntry, cmd_number_inf },/* deprecated*/ + { "outputdocument", &opt.output_document, cmd_string }, + { "pagerequisites", &opt.page_requisites, cmd_boolean }, + { "passiveftp", &opt.ftp_pasv, cmd_lockable_boolean }, { "passwd", &opt.ftp_pass, cmd_string }, { "proxypasswd", &opt.proxy_passwd, cmd_string }, { "proxyuser", &opt.proxy_user, cmd_string }, @@ -133,6 +150,7 @@ static struct { { "quota", &opt.quota, cmd_bytes }, { "reclevel", &opt.reclevel, cmd_number_inf }, { "recursive", NULL, cmd_spec_recursive }, + { "referer", &opt.referer, cmd_string }, { "reject", &opt.rejects, cmd_vector }, { "relativeonly", &opt.relative_only, cmd_boolean }, { "removelisting", &opt.remove_listing, cmd_boolean }, @@ -143,13 +161,18 @@ static struct { { "simplehostcheck", &opt.simple_check, cmd_boolean }, { "spanhosts", &opt.spanhost, cmd_boolean }, { "spider", &opt.spider, cmd_boolean }, +#ifdef HAVE_SSL + { "sslcertfile", &opt.sslcertfile, cmd_string }, + { "sslcertkey", &opt.sslcertkey, cmd_string }, +#endif /* HAVE_SSL */ { "timeout", &opt.timeout, cmd_time }, { "timestamping", &opt.timestamping, cmd_boolean }, { "tries", &opt.ntry, cmd_number_inf }, { "useproxy", &opt.use_proxy, cmd_boolean }, { "useragent", NULL, cmd_spec_useragent }, { "verbose", &opt.verbose, cmd_boolean }, - { "wait", &opt.wait, cmd_time } + { "wait", &opt.wait, cmd_time }, + { "waitretry", &opt.waitretry, cmd_time } }; /* Return index of COM if it is a valid command, or -1 otherwise. COM @@ -157,7 +180,7 @@ static struct { static int comind (const char *com) { - int min = 0, max = ARRAY_SIZE (commands); + int min = 0, max = ARRAY_SIZE (commands) - 1; do { @@ -197,6 +220,7 @@ defaults (void) opt.netrc = 1; opt.ftp_glob = 1; opt.htmlify = 1; + opt.http_keep_alive = 1; opt.use_proxy = 1; tmp = getenv ("no_proxy"); if (tmp) @@ -272,6 +296,7 @@ wgetrc_file_name (void) file = (char *)xmalloc (strlen (home) + 1 + strlen (".wgetrc") + 1); sprintf (file, "%s/.wgetrc", home); } + FREE_MAYBE (home); #else /* WINDOWS */ /* Under Windows, "home" is (for the purposes of this function) the directory where `wget.exe' resides, and `wget.ini' will be used @@ -287,12 +312,11 @@ wgetrc_file_name (void) } #endif /* WINDOWS */ - FREE_MAYBE (home); if (!file) return NULL; if (!file_exists_p (file)) { - free (file); + xfree (file); return NULL; } return file; @@ -319,21 +343,18 @@ run_wgetrc (const char *file) { char *com, *val; int status; - int length = strlen (line); - if (length && line[length - 1] == '\r') - line[length - 1] = '\0'; /* Parse the line. */ status = parse_line (line, &com, &val); - free (line); + xfree (line); /* If everything is OK, set the value. */ if (status == 1) { if (!setval (com, val)) fprintf (stderr, _("%s: Error in %s at line %d.\n"), exec_name, file, ln); - free (com); - free (val); + xfree (com); + xfree (val); } else if (status == 0) fprintf (stderr, _("%s: Error in %s at line %d.\n"), exec_name, @@ -374,7 +395,7 @@ initialize (void) else #endif run_wgetrc (file); - free (file); + xfree (file); return; } @@ -394,12 +415,12 @@ parse_line (const char *line, char **com, char **val) const char *orig_comptr, *end; char *new_comptr; - /* Skip spaces. */ - while (*p == ' ' || *p == '\t') + /* Skip whitespace. */ + while (*p && ISSPACE (*p)) ++p; /* Don't process empty lines. */ - if (!*p || *p == '\n' || *p == '#') + if (!*p || *p == '#') return -1; for (orig_comptr = p; ISALPHA (*p) || *p == '_' || *p == '-'; p++) @@ -407,6 +428,8 @@ parse_line (const char *line, char **com, char **val) /* The next char should be space or '='. */ if (!ISSPACE (*p) && (*p != '=')) return 0; + /* Here we cannot use strdupdelim() as we normally would because we + want to skip the `-' and `_' characters in the input string. */ *com = (char *)xmalloc (p - orig_comptr + 1); for (new_comptr = *com; orig_comptr < p; orig_comptr++) { @@ -418,7 +441,7 @@ parse_line (const char *line, char **com, char **val) /* If the command is invalid, exit now. */ if (comind (*com) == -1) { - free (*com); + xfree (*com); return 0; } @@ -427,15 +450,17 @@ parse_line (const char *line, char **com, char **val) /* If '=' not found, bail out. */ if (*p != '=') { - free (*com); + xfree (*com); return 0; } /* Skip spaces after '='. */ for (++p; ISSPACE (*p); p++); - /* Get the ending position. */ - for (end = p; *end && *end != '\n'; end++); - /* Allocate *val, and copy from line. */ - *val = strdupdelim (p, end); + /* Get the ending position for VAL by starting with the end of the + line and skipping whitespace. */ + end = line + strlen (line) - 1; + while (end > p && ISSPACE (*end)) + --end; + *val = strdupdelim (p, end + 1); return 1; } @@ -467,6 +492,28 @@ setval (const char *com, const char *val) static int myatoi PARAMS ((const char *s)); +/* Store the address (specified as hostname or dotted-quad IP address) from VAL + to CLOSURE. COM is ignored, except for error messages. */ +static int +cmd_address (const char *com, const char *val, void *closure) +{ + struct sockaddr_in sin; + + if (!store_hostaddress ((unsigned char *)&sin.sin_addr, val)) + { + fprintf (stderr, _("%s: %s: Cannot convert `%s' to an IP address.\n"), + exec_name, com, val); + return 0; + } + + sin.sin_family = AF_INET; + sin.sin_port = 0; + + memcpy (closure, &sin, sizeof (sin)); + + return 1; +} + /* Store the boolean value from VAL to CLOSURE. COM is ignored, except for error messages. */ static int @@ -491,6 +538,51 @@ cmd_boolean (const char *com, const char *val, void *closure) return 1; } +/* Store the lockable_boolean {2, 1, 0, -1} value from VAL to CLOSURE. COM is + ignored, except for error messages. Values 2 and -1 indicate that once + defined, the value may not be changed by successive wgetrc files or + command-line arguments. + + Values: 2 - Enable a particular option for good ("always") + 1 - Enable an option ("on") + 0 - Disable an option ("off") + -1 - Disable an option for good ("never") */ +static int +cmd_lockable_boolean (const char *com, const char *val, void *closure) +{ + int lockable_boolean_value; + + /* + * If a config file said "always" or "never", don't allow command line + * arguments to override the config file. + */ + if (*(int *)closure == -1 || *(int *)closure == 2) + return 1; + + if (!strcasecmp (val, "always") + || (*val == '2' && !*(val + 1))) + lockable_boolean_value = 2; + else if (!strcasecmp (val, "on") + || (*val == '1' && !*(val + 1))) + lockable_boolean_value = 1; + else if (!strcasecmp (val, "off") + || (*val == '0' && !*(val + 1))) + lockable_boolean_value = 0; + else if (!strcasecmp (val, "never") + || (*val == '-' && *(val + 1) == '1' && !*(val + 2))) + lockable_boolean_value = -1; + else + { + fprintf (stderr, _("%s: %s: Please specify always, on, off, " + "or never.\n"), + exec_name, com); + return 0; + } + + *(int *)closure = lockable_boolean_value; + return 1; +} + /* Set the non-negative integer value from VAL to CLOSURE. With incorrect specification, the number remains unchanged. */ static int @@ -617,7 +709,7 @@ cmd_bytes (const char *com, const char *val, void *closure) return 0; } /* Search for a designator. */ - switch (tolower (*p)) + switch (TOLOWER (*p)) { case '\0': /* None */ @@ -661,7 +753,7 @@ cmd_time (const char *com, const char *val, void *closure) return 0; } /* Search for a suffix. */ - switch (tolower (*p)) + switch (TOLOWER (*p)) { case '\0': /* None */ @@ -817,21 +909,12 @@ cmd_spec_mirror (const char *com, const char *val, void *closure) if (!opt.no_dirstruct) opt.dirstruct = 1; opt.timestamping = 1; - opt.reclevel = 0; + opt.reclevel = INFINITE_RECURSION; opt.remove_listing = 0; } return 1; } -static int -cmd_spec_outputdocument (const char *com, const char *val, void *closure) -{ - FREE_MAYBE (opt.output_document); - opt.output_document = xstrdup (val); - opt.ntry = 1; - return 1; -} - static int cmd_spec_recursive (const char *com, const char *val, void *closure) { @@ -896,6 +979,10 @@ check_user_specified_header (const char *s) return 1; } +void cleanup_html_url PARAMS ((void)); +void downloaded_files_free PARAMS ((void)); + + /* Free the memory allocated by global variables. */ void cleanup (void) @@ -907,8 +994,10 @@ cleanup (void) free_netrc (netrc_list); if (opt.dfp) fclose (opt.dfp); + cleanup_html_url (); + downloaded_files_free (); FREE_MAYBE (opt.lfilename); - free (opt.dir_prefix); + xfree (opt.dir_prefix); FREE_MAYBE (opt.input_filename); FREE_MAYBE (opt.output_document); free_vec (opt.accepts); @@ -916,13 +1005,21 @@ cleanup (void) free_vec (opt.excludes); free_vec (opt.includes); free_vec (opt.domains); - free (opt.ftp_acc); - free (opt.ftp_pass); + free_vec (opt.follow_tags); + free_vec (opt.ignore_tags); + xfree (opt.ftp_acc); + FREE_MAYBE (opt.ftp_pass); FREE_MAYBE (opt.ftp_proxy); + FREE_MAYBE (opt.https_proxy); FREE_MAYBE (opt.http_proxy); free_vec (opt.no_proxy); FREE_MAYBE (opt.useragent); + FREE_MAYBE (opt.referer); FREE_MAYBE (opt.http_user); FREE_MAYBE (opt.http_passwd); FREE_MAYBE (opt.user_header); +#ifdef HAVE_SSL + FREE_MAYBE (opt.sslcertkey); + FREE_MAYBE (opt.sslcertfile); +#endif /* HAVE_SSL */ }