Mercurial > hg > octave-lojdl > gnulib-hg
changeset 12849:4f2addafd34f
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 <ebb9@byu.net>
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Sat, 30 Jan 2010 07:47:40 -0700 |
parents | 69c1f6834276 |
children | d2b4ec0adc39 |
files | ChangeLog doc/posix-functions/gettimeofday.texi m4/gettimeofday.m4 tests/test-gettimeofday.c |
diffstat | 4 files changed, 61 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-02-04 Eric Blake <ebb9@byu.net> + + 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 <meyering@redhat.com> regcomp.c: avoid the sole warning from gcc's -Wtype-limits
--- a/doc/posix-functions/gettimeofday.texi +++ b/doc/posix-functions/gettimeofday.texi @@ -15,6 +15,15 @@ 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 @@ 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
--- 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_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 <sys/time.h> - 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 <sys/time.h> + 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 <sys/time.h> +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.]) ])
--- a/tests/test-gettimeofday.c +++ b/tests/test-gettimeofday.c @@ -20,7 +20,8 @@ #include <sys/time.h> #include "signature.h" -SIGNATURE_CHECK (gettimeofday, int, (struct timeval *, void *)); +SIGNATURE_CHECK (gettimeofday, int, + (struct timeval *, GETTIMEOFDAY_TIMEZONE *)); #include <time.h> @@ -42,8 +43,5 @@ fprintf (stderr, "gettimeofday still clobbers the localtime buffer!\n"); return 1; } - else - { - return 0; - } + return 0; }