From: Eric Blake Date: Sat, 30 Jan 2010 14:47:40 +0000 (-0700) Subject: gettimeofday: expose type of second argument X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de4d0a383be20eb6cbeb09ecbd66a5514779b914;p=pspp gettimeofday: expose type of second argument Needed to silence compiler warnings such as: test-gettimeofday.c:23: warning: initialization from incompatible pointer type based on whether gettimeofday complies with POSIX or provides the extension of struct timezone. * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Do better detection of glibc extension signature, and define GETTIMEOFDAY_TIMEZONE. * tests/test-gettimeofday.c: Use it to silence warning. * doc/posix-functions/gettimeofday.texi (gettimeofday): Document the issue. Signed-off-by: Eric Blake --- diff --git a/ChangeLog b/ChangeLog index 093bdcfa8b..65ee5b5709 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-02-04 Eric Blake + + gettimeofday: expose type of second argument + * m4/gettimeofday.m4 (gl_FUNC_GETTIMEOFDAY): Do better detection + of glibc extension signature, and define GETTIMEOFDAY_TIMEZONE. + * tests/test-gettimeofday.c: Use it to silence warning. + * doc/posix-functions/gettimeofday.texi (gettimeofday): Document + the issue. + 2010-02-03 Jim Meyering regcomp.c: avoid the sole warning from gcc's -Wtype-limits diff --git a/doc/posix-functions/gettimeofday.texi b/doc/posix-functions/gettimeofday.texi index 3f9d423b7e..fda59a3e98 100644 --- a/doc/posix-functions/gettimeofday.texi +++ b/doc/posix-functions/gettimeofday.texi @@ -15,6 +15,15 @@ mingw. This function is declared with a nonstandard function prototype (only one argument, or ``...'' after the first argument) on some platforms. @item +On some platforms, the second argument has type @code{struct +timezone*} rather than @code{void *}, making it an error to redeclare +the function with the POSIX signature: +glibc. +However, rather than penalize these systems with a replacement +function, gnulib defines @code{GETTIMEOFDAY_TIMEZONE} to the +appropriate type for use in avoiding a compiler warning if assigning +@code{gettimeofday} to a function pointer. +@item On some platforms, @code{gettimeofday} clobbers the buffer in which @code{localtime} returns its result: MacOS X 10.0. @@ -22,4 +31,7 @@ MacOS X 10.0. Portability problems not fixed by Gnulib: @itemize +@item +Behavior is non-portable if the second argument to @code{gettimeofday} +is not @code{NULL}. @end itemize diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4 index 21556272ad..32e4f29a9f 100644 --- a/m4/gettimeofday.m4 +++ b/m4/gettimeofday.m4 @@ -1,4 +1,4 @@ -# serial 13 +# serial 14 # Copyright (C) 2001-2003, 2005, 2007, 2009-2010 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation @@ -14,30 +14,46 @@ AC_DEFUN([gl_FUNC_GETTIMEOFDAY], AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([gettimeofday]) - AC_CACHE_CHECK([for gettimeofday with POSIX signature], - [gl_cv_func_gettimeofday_posix_signature], - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[#include - struct timeval c; - ]], - [[ - int (*f) (struct timeval *restrict, void *restrict) = gettimeofday; - int x = f (&c, 0); - return !(x | c.tv_sec | c.tv_usec); - ]])], - [gl_cv_func_gettimeofday_posix_signature=yes], - [gl_cv_func_gettimeofday_posix_signature=no])]) - - gl_FUNC_GETTIMEOFDAY_CLOBBER - - if test $gl_cv_func_gettimeofday_posix_signature != yes; then - REPLACE_GETTIMEOFDAY=1 - if test $gl_cv_func_gettimeofday_clobber != yes; then + gl_gettimeofday_timezone=void + if test $ac_cv_func_gettimeofday = yes; then + gl_FUNC_GETTIMEOFDAY_CLOBBER + AC_CACHE_CHECK([for gettimeofday with POSIX signature], + [gl_cv_func_gettimeofday_posix_signature], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + struct timeval c; + int gettimeofday (struct timeval *restrict, void *restrict); + ]], + [[/* glibc uses struct timezone * rather than the POSIX void * + if _GNU_SOURCE is defined. However, since the only portable + use of gettimeofday uses NULL as the second parameter, and + since the glibc definition is actually more typesafe, it is + not worth wrapping this to get a compliant signature. */ + int (*f) (struct timeval *restrict, void *restrict) + = gettimeofday; + int x = f (&c, 0); + return !(x | c.tv_sec | c.tv_usec); + ]])], + [gl_cv_func_gettimeofday_posix_signature=yes], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include +int gettimeofday (struct timeval *restrict, struct timezone *restrict); + ]])], + [gl_cv_func_gettimeofday_posix_signature=almost], + [gl_cv_func_gettimeofday_posix_signature=no])])]) + if test $gl_cv_func_gettimeofday_posix_signature = almost; then + gl_gettimeofday_timezone='struct timezone' + elif test $gl_cv_func_gettimeofday_posix_signature != yes; then + REPLACE_GETTIMEOFDAY=1 AC_LIBOBJ([gettimeofday]) gl_PREREQ_GETTIMEOFDAY fi fi + AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone], + [Define this to 'void' or 'struct timezone' to match the system's + declaration of the second argument to gettimeofday.]) ]) diff --git a/tests/test-gettimeofday.c b/tests/test-gettimeofday.c index 2a07814bb9..ff2bc72b54 100644 --- a/tests/test-gettimeofday.c +++ b/tests/test-gettimeofday.c @@ -20,7 +20,8 @@ #include #include "signature.h" -SIGNATURE_CHECK (gettimeofday, int, (struct timeval *, void *)); +SIGNATURE_CHECK (gettimeofday, int, + (struct timeval *, GETTIMEOFDAY_TIMEZONE *)); #include @@ -42,8 +43,5 @@ main (void) fprintf (stderr, "gettimeofday still clobbers the localtime buffer!\n"); return 1; } - else - { - return 0; - } + return 0; }