Subject: Minor buglet in file causes cygwin build failure
To: None <tech-toolchain@netbsd.org>
From: Ian Lance Taylor <ian@wasabisystems.com>
List: tech-toolchain
Date: 05/21/2004 00:55:03
The file src/dist/file/src/magic.c can use either utime or utimes.
The choice is made in one function, close_and_restore().  If
HAVE_UTIMES is defined, that function uses utimes.  Otherwise, if
HAVE_UTIME_H or HAVE_SYS_UTIME_H is defined, that function uses
utime.

That is fine.  However, at the top of the file, when including header
files, it checks for HAVE_UTIME before checking for HAVE_UTIMES.  In
particular, <sys/time.h> is only included if HAVE_UTIME is not
defined.

When cross-building the tools on cygwin (please don't ask), both
HAVE_UTIME and HAVE_UTIMES are defined, so <sys/time.h> is not
included.  The compilation then gets an error because struct timeval
is not defined:

/home/ian/wasabisrc/src/dist/file/src/magic.c: In function `close_and_restore':
/home/ian/wasabisrc/src/dist/file/src/magic.c:198: error: storage size of `utsb\uf' isn't known

I have appended what seems to me to be the obvious patch: to check for
HAVE_UTIMES before HAVE_UTIME when including header files, so that the
header file inclusion matches the usage.

(By the way, in the HAVE_UTIMES case, the tv_usec fields of the struct
timeval arguments to utimes are uninitialized.  I suppose this doesn't
matter because current file systems will ignore the microsecond values
anyhow.  But it seems like a lurking bug.  I haven't included the
obvious fix.)

Thanks.

Ian

Index: magic.c
===================================================================
RCS file: /cvsroot/wasabisrc/src/dist/file/src/magic.c,v
retrieving revision 1.1.1.5
diff -p -u -r1.1.1.5 magic.c
--- magic.c	10 May 2004 04:18:24 -0000	1.1.1.5
+++ magic.c	21 May 2004 04:36:05 -0000
@@ -44,14 +44,14 @@
 #include <sys/mman.h>
 #endif
 
-#if defined(HAVE_UTIME)
+#if defined(HAVE_UTIMES)
+# include <sys/time.h>
+#elif defined(HAVE_UTIME)
 # if defined(HAVE_SYS_UTIME_H)
 #  include <sys/utime.h>
 # elif defined(HAVE_UTIME_H)
 #  include <utime.h>
 # endif
-#elif defined(HAVE_UTIMES)
-# include <sys/time.h>
 #endif
 
 #ifdef HAVE_UNISTD_H