Reduce configure function checks

Hrvoje Niksic <[email protected]> Wed, 22 Jun 2005 03:00:47 +0200
Newsgroups gmane.comp.web.wget.patches
Message-ID <[email protected]>
This expands on previous changes that require C89 for compilation.  In
addition to expecting memmove, strerror, strstr, and signal, we now
also expect gettimeofday (on non-Windows platforms) and select.

ChangeLog:
2005-06-22  Hrvoje Niksic  <[email protected]>

	* configure.in: Assume existence of gettimeofday and select.
	gettimeofday exists on all platforms we care about (except for
	Windows where Windows-specific functions are used instead), and
	select exists virtually everywhere.

	* configure.in: Assume existence of strerror, signal, strstr, and
	memmove, which are all required by ANSI C.

src/ChangeLog:
2005-06-22  Hrvoje Niksic  <[email protected]>

	* connect.c (select_fd): Expect select() to exist.

	* utils.c (xsleep): Always use select() as sleep fallback on
	non-Windows platforms.

	* ptimer.c: Delete the implementation of PTIMER_TIME.

	* main.c: Assume existence of signal(), test for different signal
	names instead.

	* cmpt.c: Better document reasons why certain functions are
	included.

Index: configure.in
===================================================================
--- configure.in	(revision 1734)
+++ configure.in	(working copy)
@@ -208,10 +208,10 @@
 AC_FUNC_ALLOCA
 AC_FUNC_MMAP
 AC_FUNC_FSEEKO
-AC_CHECK_FUNCS(strdup strstr strcasecmp strncasecmp strpbrk memmove)
-AC_CHECK_FUNCS(gettimeofday mktime strptime strerror snprintf vsnprintf)
-AC_CHECK_FUNCS(usleep select ftello sigblock sigsetjmp signal)
-AC_CHECK_FUNCS(symlink access isatty)
+AC_CHECK_FUNCS(strdup strcasecmp strncasecmp strpbrk)
+AC_CHECK_FUNCS(mktime strptime snprintf vsnprintf)
+AC_CHECK_FUNCS(usleep ftello sigblock sigsetjmp)
+AC_CHECK_FUNCS(symlink isatty)
 
 dnl
 dnl Call Wget's local macros defined in aclocal.
Index: src/utils.c
===================================================================
--- src/utils.c	(revision 1734)
+++ src/utils.c	(working copy)
@@ -81,10 +81,8 @@
 #endif
 
 #undef USE_SIGNAL_TIMEOUT
-#ifdef HAVE_SIGNAL
-# if defined(HAVE_SIGSETJMP) || defined(HAVE_SIGBLOCK)
-#  define USE_SIGNAL_TIMEOUT
-# endif
+#if defined(HAVE_SIGSETJMP) || defined(HAVE_SIGBLOCK)
+# define USE_SIGNAL_TIMEOUT
 #endif
 
 #include "wget.h"
@@ -1800,12 +1798,11 @@
       seconds -= (long) seconds;
     }
   usleep (seconds * 1000000);
-#elif defined(HAVE_SELECT)
-  /* Note that, although Windows supports select, this sleeping
-     strategy doesn't work there because Winsock's select doesn't
-     implement timeout when it is passed NULL pointers for all fd
-     sets.  (But it does work under Cygwin, which implements its own
-     select.)  */
+#else /* fall back select */
+  /* Note that, although Windows supports select, it can't be used to
+     implement sleeping because Winsock's select doesn't implement
+     timeout when it is passed NULL pointers for all fd sets.  (But it
+     does under Cygwin, which implements Unix-compatible select.)  */
   struct timeval sleep;
   sleep.tv_sec = (long) seconds;
   sleep.tv_usec = 1000000 * (seconds - (long) seconds);
@@ -1814,8 +1811,6 @@
      interrupted by a signal.  But without knowing how long we've
      actually slept, we can't return to sleep.  Using gettimeofday to
      track sleeps is slow and unreliable due to clock skew.  */
-#else  /* none of the above */
-  sleep (seconds);
 #endif
 }
 
Index: src/connect.c
===================================================================
--- src/connect.c	(revision 1734)
+++ src/connect.c	(working copy)
@@ -611,7 +611,6 @@
 int
 select_fd (int fd, double maxtime, int wait_for)
 {
-#ifdef HAVE_SELECT
   fd_set fdset;
   fd_set *rd = NULL, *wr = NULL;
   struct timeval tmout;
@@ -632,23 +631,11 @@
   while (result < 0 && errno == EINTR);
 
   return result;
-
-#else  /* not HAVE_SELECT */
-
-  /* If select() unavailable, just return 1.  In most usages in Wget,
-     this is the appropriate response -- "if we can't poll, go ahead
-     with the blocking operation".  If a specific part of code needs
-     different behavior, it can use #ifdef HAVE_SELECT to test whether
-     polling really occurs.  */
-  return 1;
-
-#endif /* not HAVE_SELECT */
 }
 
 int
 test_socket_open (int sock)
 {
-#ifdef HAVE_SELECT
   fd_set check_set;
   struct timeval to;
 
@@ -670,10 +657,6 @@
     }
   else
     return 0;
-#else
-  /* Without select, it's hard to know for sure. */
-  return 1;
-#endif
 }
 
 /* Basic socket operations, mostly EINTR wrappers.  */
Index: src/ptimer.c
===================================================================
--- src/ptimer.c	(revision 1734)
+++ src/ptimer.c	(working copy)
@@ -72,23 +72,19 @@
 #include "wget.h"
 #include "ptimer.h"
 
-/* Depending on the OS and availability of gettimeofday(), one and
-   only one of PTIMER_POSIX, PTIMER_GETTIMEOFDAY, PTIMER_WINDOWS, or
-   PTIMER_TIME will be defined.  */
+/* Depending on the OS, one and only one of PTIMER_POSIX,
+   PTIMER_GETTIMEOFDAY, or PTIMER_WINDOWS will be defined.  */
 
 #undef PTIMER_POSIX
 #undef PTIMER_GETTIMEOFDAY
-#undef PTIMER_TIME
 #undef PTIMER_WINDOWS
 
 #if defined(WINDOWS) || defined(__CYGWIN__)
 # define PTIMER_WINDOWS		/* use Windows timers */
 #elif _POSIX_TIMERS - 0 > 0
 # define PTIMER_POSIX		/* use POSIX timers (clock_gettime) */
-#elif defined(HAVE_GETTIMEOFDAY)
-# define PTIMER_GETTIMEOFDAY	/* use gettimeofday */
 #else
-# define PTIMER_TIME
+# define PTIMER_GETTIMEOFDAY	/* use gettimeofday */
 #endif
 
 #ifdef PTIMER_POSIX
@@ -225,39 +221,6 @@
 }
 #endif	/* PTIMER_GETTIMEOFDAY */
 
-#ifdef PTIMER_TIME
-/* Elapsed time measurement using the time(2) call: system time is
-   held in time_t, retrieved using time, and resolution is 1 second.
-
-   This method is a catch-all for non-Windows systems without
-   gettimeofday -- e.g. DOS or really old or non-standard Unix
-   systems.  */
-
-typedef time_t ptimer_system_time;
-
-#define IMPL_measure time_measure
-#define IMPL_diff time_diff
-#define IMPL_resolution time_resolution
-
-static inline void
-time_measure (ptimer_system_time *pst)
-{
-  time (pst);
-}
-
-static inline double
-time_diff (ptimer_system_time *pst1, ptimer_system_time *pst2)
-{
-  return 1000.0 * (*pst1 - *pst2);
-}
-
-static inline double
-time_resolution (void)
-{
-  return 1;
-}
-#endif	/* PTIMER_TIME */
-
 #ifdef PTIMER_WINDOWS
 /* Elapsed time measurement on Windows: where high-resolution timers
    are available, time is stored in a LARGE_INTEGER and retrieved
Index: src/cmpt.c
===================================================================
--- src/cmpt.c	(revision 1734)
+++ src/cmpt.c	(working copy)
@@ -41,8 +41,19 @@
 
 #include "wget.h"
 
-/* Some systems don't have some str* functions in libc.  Here we
-   define them.  The same goes for strptime.  */
+/* Some systems lack certain functions normally taken for granted.
+   For example, Windows doesn't have strptime, and some systems lack
+   strcasecmp and strncasecmp.  This file should contain fallback
+   implementations of the missing functions.  It should *not* define
+   new Wget-specific functions -- those should placed in utils.c or
+   elsewhere.  */
+
+/* strcasecmp and strncasecmp apparently originated with BSD 4.4.
+   SUSv3 seems to be the only standard out there (that I can find)
+   that requires their existence, so there are systems that lack them
+   still in use.  Note that these don't get defined under Windows
+   because mswindows.h defines them to the equivalent Windows
+   functions stricmp and strnicmp.  */
 
 #ifndef HAVE_STRCASECMP
 /* From GNU libc.  */
@@ -99,6 +110,9 @@
   return c1 - c2;
 }
 #endif /* not HAVE_STRNCASECMP */
+
+/* strpbrk is required by POSIX and C99, but it is missing from some
+   older systems and from Windows.  */
 
 #ifndef HAVE_STRPBRK
 /* Find the first ocurrence in S of any character in ACCEPT.  */
@@ -117,6 +131,10 @@
   return 0;
 }
 #endif /* HAVE_STRPBRK */
+
+/* mktime is a BSD 4.3 function also required by POSIX and C99.  I
+   don't know if there is a widely used system that lacks it, so it
+   might be a candidate for removal.  */
 
 #ifndef HAVE_MKTIME
 /* From GNU libc 2.0.  */
@@ -390,8 +408,11 @@
 weak_alias (mktime, timelocal)
 #endif
 #endif /* not HAVE_MKTIME */
+
+/* strptime is required by POSIX, but it is missing from Windows,
+   which means we must keep a fallback implementation.  It is
+   reportedly missing or broken on many older systems as well.  */
 
-
 #ifndef HAVE_STRPTIME
 /* From GNU libc 2.1.3.  */
 /* Ulrich, thanks for helping me out with this!  --hniksic  */
@@ -1314,14 +1335,17 @@
     { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
   };
 #endif
+
+/* fnmatch is required by POSIX, but we include an implementation for
+   the sake of systems that don't have it, most notably Windows.  Some
+   systems do have fnmatch, but Apache's installation process installs
+   its own fnmatch.h (incompatible with the system one!) in a system
+   include directory, effectively rendering fnmatch unusable.  This
+   has been fixed with Apache 2, where fnmatch has been moved to apr
+   and given a prefix, but many systems out there are still (as of
+   this writing in 2005) broken and we must cater to them.
 
-/* fnmatch is defined by POSIX, but we include an implementation for
-   the sake of systems that don't have it.  Some systems do have
-   fnmatch, but Apache installs its own fnmatch.h (incompatible with
-   the system one) in a system include directory, effectively
-   rendering fnmatch unusable.
-
-   Additionally according to anecdotal evidence and conventional
+   Additionally, according to anecdotal evidence and conventional
    wisdom I lack courage to challenge, many implementations of fnmatch
    are notoriously buggy and unreliable.  So we use our version by
    default, except when compiling under systems where fnmatch is known
Index: src/main.c
===================================================================
--- src/main.c	(revision 1734)
+++ src/main.c	(working copy)
@@ -900,21 +900,25 @@
   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.  */
@@ -986,7 +990,7 @@
     return 1;
 }
 
-#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.  */
@@ -1001,4 +1005,4 @@
   progress_schedule_redirect ();
   signal (sig, redirect_output_signal);
 }
-#endif /* HAVE_SIGNAL */
+#endif