X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmswindows.c;h=3aeafa33b9d62bed495d352238e571e43cfaf0a1;hp=18a4e07fe06a7171e45b7dddabac90ad59bbe9e9;hb=4d7c5e087b2bc82c9f503dff003916d1047903ce;hpb=277e840a0f8e3ec8800cfe7407fe3c16000bc622 diff --git a/src/mswindows.c b/src/mswindows.c index 18a4e07f..3aeafa33 100644 --- a/src/mswindows.c +++ b/src/mswindows.c @@ -1,12 +1,11 @@ /* mswindows.c -- Windows-specific support - Copyright (C) 1995, 1996, 1997, 1998, 2004 - 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, @@ -15,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 @@ -37,17 +35,6 @@ so, delete this exception statement from your version. */ #include #include -#ifdef HACK_BCC_UTIME_BUG -# include -# include -# ifdef HAVE_UTIME_H -# include -# endif -# ifdef HAVE_SYS_UTIME_H -# include -# endif -#endif - #define INHIBIT_WRAP /* avoid wrapping of socket, bind, ... */ #include "wget.h" @@ -78,135 +65,12 @@ xsleep (double seconds) sleep (seconds); seconds -= (long) seconds; } - usleep (seconds * 1000000L); + usleep (seconds * 1000000); #else /* not HAVE_USLEEP */ SleepEx ((DWORD) (seconds * 1000 + .5), FALSE); #endif /* not HAVE_USLEEP */ } -#if defined(__BORLANDC__) || (defined(_MSC_VER) && _MSC_VER < 1300) - -static inline int -char_value (char c, int base) -{ - int value; - if (c < '0') - return -1; - if ('0' <= c && c <= '9') - value = c - '0'; - else if ('a' <= c && c <= 'z') - value = c - 'a' + 10; - else if ('A' <= c && c <= 'Z') - value = c - 'A' + 10; - else - return -1; - if (value >= base) - return -1; - return value; -} - -/* A fairly simple strtoll replacement for MS VC versions that don't - supply _strtoi64. */ - -__int64 -str_to_int64 (const char *nptr, char **endptr, int base) -{ -#define INT64_OVERFLOW 9223372036854775807I64 -#define INT64_UNDERFLOW (-INT64_OVERFLOW - 1) - - __int64 result = 0; - int negative; - - if (base != 0 && (base < 2 || base > 36)) - { - errno = EINVAL; - return 0; - } - - while (*nptr == ' ' || *nptr == '\t') - ++nptr; - if (*nptr == '-') - { - negative = 1; - ++nptr; - } - else if (*nptr == '+') - { - negative = 0; - ++nptr; - } - else - negative = 0; - - /* If base is 0, determine the real base based on the beginning on - the number; octal numbers begin with "0", hexadecimal with "0x", - and the others are considered octal. */ - if (*nptr == '0') - { - if ((base == 0 || base == 16) - && - (*(nptr + 1) == 'x' || *(nptr + 1) == 'X')) - { - base = 16; - nptr += 2; - } - else if (base == 0) - base = 8; - } - else if (base == 0) - base = 10; - - if (!negative) - { - /* Parse positive number, checking for overflow. */ - int val; - for (; (val = char_value (*nptr, base)) != -1; ++nptr) - { - __int64 newresult = base * result + val; - if (newresult < result) - { - result = INT64_OVERFLOW; - errno = ERANGE; - break; - } - result = newresult; - } - } - else - { - /* Parse negative number, checking for underflow. */ - int val; - for (; (val = char_value (*nptr, base)) != -1; ++nptr) - { - __int64 newresult = base * result - val; - if (newresult > result) - { - result = INT64_UNDERFLOW; - errno = ERANGE; - break; - } - result = newresult; - } - } - if (endptr) - *endptr = (char *) nptr; - return result; -} - -#else /* !defined(__BORLANDC__) && (!defined(_MSC_VER) || _MSC_VER >= 1300) */ - -__int64 -str_to_int64 (const char *nptr, char **endptr, int base) -{ -#ifdef _MSC_VER - return _strtoi64 (nptr, endptr, base); -#else - return strtoll (nptr, endptr, base); -#endif -} - -#endif /* !defined(__BORLANDC__) && (!defined(_MSC_VER) || _MSC_VER >= 1300) */ - void windows_main (int *argc, char **argv, char **exec_name) { @@ -225,6 +89,7 @@ ws_cleanup (void) WSACleanup (); } +#if defined(CTRLBREAK_BACKGND) || defined(CTRLC_BACKGND) static void ws_hangup (const char *reason) { @@ -238,6 +103,7 @@ ws_hangup (const char *reason) gesture as the parent will wait for us to terminate before resuming. */ FreeConsole (); } +#endif /* Construct the name for a named section (a.k.a. `file mapping') object. The returned string is dynamically allocated and needs to be xfree()'d. */ @@ -252,7 +118,7 @@ make_section_name (DWORD pid) struct fake_fork_info { HANDLE event; - int logfile_changed; + bool logfile_changed; char lfilename[MAX_PATH + 1]; }; @@ -287,14 +153,14 @@ fake_fork_child (void) event = info->event; - info->logfile_changed = 0; + info->logfile_changed = false; if (!opt.lfilename) { /* See utils:fork_to_background for explanation. */ - FILE *new_log_fp = unique_create (DEFAULT_LOGFILE, 0, &opt.lfilename); + FILE *new_log_fp = unique_create (DEFAULT_LOGFILE, false, &opt.lfilename); if (new_log_fp) { - info->logfile_changed = 1; + info->logfile_changed = true; strncpy (info->lfilename, opt.lfilename, sizeof (info->lfilename)); info->lfilename[sizeof (info->lfilename) - 1] = '\0'; fclose (new_log_fp); @@ -499,7 +365,7 @@ ws_changetitle (const char *url) { xfree_null (title_buf); xfree_null (curr_url); - title_buf = (char *)xmalloc (strlen (url) + 20); + title_buf = xmalloc (strlen (url) + 20); curr_url = xstrdup (url); old_percentage = -1; sprintf (title_buf, "Wget %s", curr_url); @@ -607,34 +473,6 @@ ws_startup (void) set_sleep_mode (); SetConsoleCtrlHandler (ws_handler, TRUE); } - -/* Replacement utime function for buggy Borland C++Builder 5.5 compiler. - (The Borland utime function only works on Windows NT.) */ - -#ifdef HACK_BCC_UTIME_BUG -int -borland_utime (const char *path, const struct utimbuf *times) -{ - int fd; - int res; - struct ftime ft; - struct tm *ptr_tm; - - if ((fd = open (path, O_RDWR)) < 0) - return -1; - - ptr_tm = localtime (×->modtime); - ft.ft_tsec = ptr_tm->tm_sec >> 1; - ft.ft_min = ptr_tm->tm_min; - ft.ft_hour = ptr_tm->tm_hour; - ft.ft_day = ptr_tm->tm_mday; - ft.ft_month = ptr_tm->tm_mon + 1; - ft.ft_year = ptr_tm->tm_year - 80; - res = setftime (fd, &ft); - close (fd); - return res; -} -#endif /* run_with_timeout Windows implementation. */ @@ -677,19 +515,19 @@ thread_helper (void *arg) } /* Call FUN(ARG), but don't allow it to run for more than TIMEOUT - seconds. Returns non-zero if the function was interrupted with a - timeout, zero otherwise. + seconds. Returns true if the function was interrupted with a + timeout, false otherwise. This works by running FUN in a separate thread and terminating the thread if it doesn't finish in the specified time. */ -int +bool run_with_timeout (double seconds, void (*fun) (void *), void *arg) { - static HANDLE thread_hnd = NULL; + HANDLE thread_hnd; struct thread_data thread_arg; DWORD thread_id; - int rc; + bool rc; DEBUGP (("seconds %.2f, ", seconds)); @@ -697,12 +535,9 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg) { blocking_fallback: fun (arg); - return 0; + return false; } - /* Should never happen, but test for recursivety anyway. */ - assert (thread_hnd == NULL); - thread_arg.fun = fun; thread_arg.arg = arg; thread_arg.ws_error = WSAGetLastError (); @@ -710,7 +545,7 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg) &thread_arg, 0, &thread_id); if (!thread_hnd) { - DEBUGP (("CreateThread() failed; %s\n", strerror (GetLastError ()))); + DEBUGP (("CreateThread() failed; [0x%x]\n", GetLastError ())); goto blocking_fallback; } @@ -721,12 +556,12 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg) so the caller can inspect it. */ WSASetLastError (thread_arg.ws_error); DEBUGP (("Winsock error: %d\n", WSAGetLastError ())); - rc = 0; + rc = false; } else { TerminateThread (thread_hnd, 1); - rc = 1; + rc = true; } CloseHandle (thread_hnd); /* Clear-up after TerminateThread(). */ @@ -753,6 +588,8 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg) WRAP (socket, (int domain, int type, int protocol), (domain, type, protocol)) WRAP (bind, (int s, struct sockaddr *a, int alen), (s, a, alen)) WRAP (connect, (int s, const struct sockaddr *a, int alen), (s, a, alen)) +WRAP (listen, (int s, int backlog), (s, backlog)) +WRAP (accept, (int s, struct sockaddr *a, int *alen), (s, a, alen)) WRAP (recv, (int s, void *buf, int len, int flags), (s, buf, len, flags)) WRAP (send, (int s, const void *buf, int len, int flags), (s, buf, len, flags)) WRAP (select, (int n, fd_set *r, fd_set *w, fd_set *e, const struct timeval *tm), @@ -848,3 +685,45 @@ windows_strerror (int err) return buf; } } + +#ifdef ENABLE_IPV6 +/* An inet_ntop implementation that uses WSAAddressToString. + Prototype complies with POSIX 1003.1-2004. This is only used under + IPv6 because Wget prints IPv4 addresses using inet_ntoa. */ + +const char * +inet_ntop (int af, const void *src, char *dst, socklen_t cnt) +{ + /* struct sockaddr can't accomodate struct sockaddr_in6. */ + union { + struct sockaddr_in6 sin6; + struct sockaddr_in sin; + } sa; + DWORD dstlen = cnt; + size_t srcsize; + + xzero (sa); + switch (af) + { + case AF_INET: + sa.sin.sin_family = AF_INET; + sa.sin.sin_addr = *(struct in_addr *) src; + srcsize = sizeof (sa.sin); + break; + case AF_INET6: + sa.sin6.sin6_family = AF_INET6; + sa.sin6.sin6_addr = *(struct in6_addr *) src; + srcsize = sizeof (sa.sin6); + break; + default: + abort (); + } + + if (WSAAddressToString ((struct sockaddr *) &sa, srcsize, NULL, dst, &dstlen) != 0) + { + errno = WSAGetLastError(); + return NULL; + } + return (const char *) dst; +} +#endif