#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
-#include <sys/types.h>
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif /* HAVE_STRING_H */
-#ifdef HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-#ifdef HAVE_NLS
-#ifdef HAVE_LOCALE_H
+#include <string.h>
+#include <signal.h>
+#if defined(HAVE_NLS) && defined(HAVE_LOCALE_H)
# include <locale.h>
-#endif /* HAVE_LOCALE_H */
-#endif /* HAVE_NLS */
+#endif
#include <assert.h>
-
#include <errno.h>
-#ifndef errno
-extern int errno;
-#endif
#include "wget.h"
#include "utils.h"
struct options opt;
-extern LARGE_INT total_downloaded_bytes;
extern char *version_string;
extern struct cookie_jar *wget_cookie_jar;
-static RETSIGTYPE redirect_output_signal PARAMS ((int));
+static void redirect_output_signal (int);
const char *exec_name;
\f
\f
/* Definition of command-line options. */
-static void print_help PARAMS ((void));
-static void print_version PARAMS ((void));
+static void print_help (void);
+static void print_version (void);
#ifdef HAVE_SSL
# define IF_SSL(x) x
#endif
#ifdef ENABLE_DEBUG
-# define IF_DEBUG(x) x
+# define WHEN_DEBUG(x) x
#else
-# define IF_DEBUG(x) NULL
+# define WHEN_DEBUG(x) NULL
#endif
struct cmdline_option {
{ "convert-links", 'k', OPT_BOOLEAN, "convertlinks", -1 },
{ "cookies", 0, OPT_BOOLEAN, "cookies", -1 },
{ "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 },
- { IF_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 },
+ { WHEN_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 },
{ "delete-after", 0, OPT_BOOLEAN, "deleteafter", -1 },
{ "directories", 0, OPT_BOOLEAN, "dirstruct", -1 },
{ "directory-prefix", 'P', OPT_VALUE, "dirprefix", -1 },
{ "waitretry", 0, OPT_VALUE, "waitretry", -1 },
};
-#undef IF_DEBUG
+#undef WHEN_DEBUG
#undef IF_SSL
/* Return a string that contains S with "no-" prepended. The string
exit (0);
}
+static char *
+secs_to_human_time (double secs_decimal)
+{
+ static char buf[32];
+ int secs = (int) (secs_decimal + 0.5);
+ int hours, mins, days;
+
+ days = secs / 86400, secs %= 86400;
+ hours = secs / 3600, secs %= 3600;
+ mins = secs / 60, secs %= 60;
+
+ if (days)
+ sprintf (buf, _("%dd %dh %dm %ds"), days, hours, mins, secs);
+ else if (hours)
+ sprintf (buf, _("%dh %dm %ds"), hours, mins, secs);
+ else if (mins)
+ sprintf (buf, _("%dm %ds"), mins, secs);
+ else if (secs_decimal >= 1)
+ sprintf (buf, _("%ds"), secs);
+ else
+ sprintf (buf, _("%.2fs"), secs_decimal);
+
+ return buf;
+}
+
static void
print_version (void)
{
char **url, **t;
int i, ret, longindex;
int nurl, status;
- int append_to_log = 0;
+ bool append_to_log = false;
i18n_initialize ();
else
{
/* NEG is true for `--no-FOO' style boolean options. */
- int neg = val & BOOLEAN_NEG_MARKER;
+ bool neg = !!(val & BOOLEAN_NEG_MARKER);
setoptval (opt->data, neg ? "0" : "1", opt->long_name);
}
break;
case OPT_FUNCALL:
{
- void (*func) PARAMS ((void)) = (void (*) PARAMS ((void))) opt->data;
+ void (*func) (void) = (void (*) (void)) opt->data;
func ();
}
break;
case OPT__APPEND_OUTPUT:
setoptval ("logfile", optarg, opt->long_name);
- append_to_log = 1;
+ append_to_log = true;
break;
case OPT__EXECUTE:
run_command (optarg);
/* The wgetrc commands are named noparent and noclobber,
so we must revert the meaning of the cmdline options
before passing the value to setoptval. */
- int flag = 1;
+ bool flag = true;
if (optarg)
flag = (*optarg == '1' || TOLOWER (*optarg) == 'y'
|| (TOLOWER (optarg[0]) == 'o'
if (opt.output_document)
{
extern FILE *output_stream;
- extern int output_stream_regular;
+ extern bool output_stream_regular;
if (HYPHENP (opt.output_document))
output_stream = stdout;
else
{
- struct_stat st;
+ struct_fstat st;
output_stream = fopen (opt.output_document,
opt.always_rest ? "ab" : "wb");
if (output_stream == NULL)
exit (1);
}
if (fstat (fileno (output_stream), &st) == 0 && S_ISREG (st.st_mode))
- output_stream_regular = 1;
+ output_stream_regular = true;
}
}
ws_startup ();
#endif
+#ifdef SIGHUP
/* Setup the signal handler to redirect output when hangup is
received. */
-#ifdef HAVE_SIGNAL
if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
signal(SIGHUP, redirect_output_signal);
+#endif
/* ...and do the same for SIGUSR1. */
+#ifdef SIGUSR1
signal (SIGUSR1, redirect_output_signal);
+#endif
+#ifdef SIGPIPE
/* Writing to a closed socket normally signals SIGPIPE, and the
process exits. What we want is to ignore SIGPIPE and just check
for the return value of write(). */
signal (SIGPIPE, SIG_IGN);
+#endif
#ifdef SIGWINCH
signal (SIGWINCH, progress_handle_sigwinch);
#endif
-#endif /* HAVE_SIGNAL */
status = RETROK; /* initialize it, just-in-case */
/* Retrieve the URLs from argument list. */
|| (opt.input_filename && total_downloaded_bytes != 0))
{
logprintf (LOG_NOTQUIET,
- _("\nFINISHED --%s--\nDownloaded: %s bytes in %d files\n"),
- time_str (NULL), with_thousand_seps_large (total_downloaded_bytes),
- opt.numurls);
+ _("FINISHED --%s--\nDownloaded: %d files, %s in %s (%s)\n"),
+ time_str (NULL),
+ opt.numurls,
+ human_readable (total_downloaded_bytes),
+ secs_to_human_time (total_download_time / 1000),
+ retr_rate (total_downloaded_bytes, total_download_time));
/* Print quota warning, if exceeded. */
if (opt.quota && total_downloaded_bytes > opt.quota)
logprintf (LOG_NOTQUIET,
- _("Download quota (%s bytes) EXCEEDED!\n"),
- with_thousand_seps_large (opt.quota));
+ _("Download quota of %s EXCEEDED!\n"),
+ human_readable (opt.quota));
}
if (opt.cookies_output)
return 1;
}
\f
-#ifdef HAVE_SIGNAL
+#if defined(SIGHUP) || defined(SIGUSR1)
/* Hangup signal handler. When wget receives SIGHUP or SIGUSR1, it
will proceed operation as usual, trying to write into a log file.
- If that is impossible, the output will be turned off.
-
- #### It is unsafe to do call libc functions from a signal handler.
- What we should do is, set a global variable, and have the code in
- log.c pick it up. */
+ If that is impossible, the output will be turned off. */
-static RETSIGTYPE
+static void
redirect_output_signal (int sig)
{
const char *signal_name = (sig == SIGHUP ? "SIGHUP" :
progress_schedule_redirect ();
signal (sig, redirect_output_signal);
}
-#endif /* HAVE_SIGNAL */
+#endif