Re: time_t timezone - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: time_t timezone
Date
Msg-id 200409081940.i88JeS514536@candle.pha.pa.us
Whole thread Raw
In response to Re: time_t timezone  (Reini Urban <rurban@x-ray.at>)
Responses Re: time_t timezone
List pgsql-patches
OK, I have applied the following patch to fix the Cygwin _timezone
issue.  I moved the TIMEZONE_GLOBAL up into port.h and change pgtz.c to
use that instead.  I also changed the configure test for INT_TIMEZONE to
test for _timezone on Cygwin.  This should fix all those problems.

You found a few problems in dirmod.c but have run out of time and will
deal with them in a few days.

---------------------------------------------------------------------------

Reini Urban wrote:
> Bruce Momjian schrieb:
>
> > Reini Urban wrote:
> >
> >>>    # PGAC_VAR_INT_TIMEZONE
> >>>    # ---------------------
> >>>    # Check if the global variable `timezone' exists. If so, define
> >>>    # HAVE_INT_TIMEZONE.
> >>>    AC_DEFUN([PGAC_VAR_INT_TIMEZONE],
> >>>    [AC_CACHE_CHECK(for int timezone, pgac_cv_var_int_timezone,
> >>>    [AC_TRY_LINK([#include <time.h>
> >>>    int res;],
> >>>      [res = timezone / 60;],
> >>>      [pgac_cv_var_int_timezone=yes],
> >>>      [pgac_cv_var_int_timezone=no])])
> >>>    if test x"$pgac_cv_var_int_timezone" = xyes ; then
> >>>      AC_DEFINE(HAVE_INT_TIMEZONE,, [Define to 1 if you have the global
> >>>    variable 'int timezone'.])
> >>>    fi])# PGAC_VAR_INT_TIMEZONE
> >>>
> >>>You can look in include/pg_config.h to see how it is defined.
> >>
> >>This test fails, because you cannot do arithmetic with time_t.
> >>cygwin has/had a special workaround in pg_config_manual.h
> >>See Tom above.
>
> sorry, my mistake. you can do arithmetic with time_t.
>
> >>All other platforms with time_t timezone should manually enable their
> >>HAVE_INT_TIMEZONE and manually add the (int) timezone in
> >>src/timezone/pgtz.c.
> >
> > OK, let's get some facts.  How is your timezone variable defined in your
> > headers?  Is it _timezone?  How is time_t defined?  If you take the
> > program above and compile it alone, how does it fail?
>
> yes, it's only _timezone.
>
> already sent to this list. here it is:
>
> /usr/include/time.h from newlib.
> ...
> /* defines for the opengroup specifications Derived from Issue 1 of the
> SVID.  */
> extern __IMPORT time_t _timezone;
> extern __IMPORT int _daylight;
> extern __IMPORT char *_tzname[2];
>
> which resolves to (gcc -E):
> # 98 "/usr/include/time.h" 3 4
> extern __attribute__((dllimport)) time_t _timezone;
> extern __attribute__((dllimport)) int _daylight;
> extern __attribute__((dllimport)) char *_tzname[2];
>
> time_t is a typedef from sys/types.h:
> #ifndef __time_t_defined
> typedef _TIME_T_ time_t;
> #define __time_t_defined
>
> _TIME_T_ is a macro from machine/types.h:
> define _TIME_T_        long
>
> > Also, look at your config.log output to see why it fails or email it to
> > my privately.
> ...
> configure:12843: checking for int timezone
> configure:12865: gcc -o conftest.exe -O2 -fno-strict-aliasing -Wall
> -Wmissing-prototypes -Wmissing-declarations -fno-strict-aliasing
> -L/usr/local/lib conftest.c -lssl -lcrypto -lz -lreadline -lcrypt
> -lresolv -lm  >&5
> conftest.c: In function `main':
> conftest.c:67: error: invalid operands to binary /
> configure:12871: $? = 1
> configure: failed program was:
> ...
>
> #include <time.h>
> int res;
> int
> main ()
> {
> res = timezone / 60;
>    ;
>    return 0;
> }
>
> so my patch and my whole point is wrong.
> just the underscore is needed for cygwin in pg_config_manual.h
> --
> Reini Urban
> http://xarch.tu-graz.ac.at/home/rurban/
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: configure
===================================================================
RCS file: /cvsroot/pgsql-server/configure,v
retrieving revision 1.389
diff -c -c -r1.389 configure
*** configure    2 Sep 2004 20:39:57 -0000    1.389
--- configure    8 Sep 2004 19:36:18 -0000
***************
*** 10725,10731 ****
--- 10725,10735 ----
  int
  main ()
  {
+ #ifndef __CYGWIN__
  res = timezone / 60;
+ #else
+ res = _timezone / 60;
+ #endif
    ;
    return 0;
  }
Index: config/c-library.m4
===================================================================
RCS file: /cvsroot/pgsql-server/config/c-library.m4,v
retrieving revision 1.26
diff -c -c -r1.26 c-library.m4
*** config/c-library.m4    7 Jun 2004 22:39:44 -0000    1.26
--- config/c-library.m4    8 Sep 2004 19:36:19 -0000
***************
*** 10,16 ****
  [AC_CACHE_CHECK(for int timezone, pgac_cv_var_int_timezone,
  [AC_TRY_LINK([#include <time.h>
  int res;],
!   [res = timezone / 60;],
    [pgac_cv_var_int_timezone=yes],
    [pgac_cv_var_int_timezone=no])])
  if test x"$pgac_cv_var_int_timezone" = xyes ; then
--- 10,20 ----
  [AC_CACHE_CHECK(for int timezone, pgac_cv_var_int_timezone,
  [AC_TRY_LINK([#include <time.h>
  int res;],
!   [#ifndef __CYGWIN__
! res = timezone / 60;
! #else
! res = _timezone / 60;
! #endif],
    [pgac_cv_var_int_timezone=yes],
    [pgac_cv_var_int_timezone=no])])
  if test x"$pgac_cv_var_int_timezone" = xyes ; then
Index: src/include/port.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port.h,v
retrieving revision 1.57
diff -c -c -r1.57 port.h
*** src/include/port.h    29 Aug 2004 21:08:48 -0000    1.57
--- src/include/port.h    8 Sep 2004 19:36:26 -0000
***************
*** 180,185 ****
--- 180,193 ----
  #define pclose(a) _pclose(a)
  #endif

+ /* Global variable holding time zone information. */
+ #if !defined(__CYGWIN__)
+ #define TIMEZONE_GLOBAL timezone
+ #else
+ #define TIMEZONE_GLOBAL _timezone
+ #define tzname _tzname            /* should be in time.h? */
+ #endif
+
  extern int    copydir(char *fromdir, char *todir);

  /* Missing rand functions */
Index: src/interfaces/ecpg/pgtypeslib/dt.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/ecpg/pgtypeslib/dt.h,v
retrieving revision 1.19
diff -c -c -r1.19 dt.h
*** src/interfaces/ecpg/pgtypeslib/dt.h    1 Sep 2004 18:59:35 -0000    1.19
--- src/interfaces/ecpg/pgtypeslib/dt.h    8 Sep 2004 19:36:28 -0000
***************
*** 216,229 ****
  } while(0)
  #endif

- /* Global variable holding time zone information. */
- #if !defined(__CYGWIN__) && !defined(WIN32)
- #define TIMEZONE_GLOBAL timezone
- #else
- #define TIMEZONE_GLOBAL _timezone
- #define tzname _tzname            /* should be in time.h? */
- #endif
-
  /*
   * Date/time validation
   * Include check for leap year.
--- 216,221 ----
Index: src/timezone/pgtz.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/timezone/pgtz.c,v
retrieving revision 1.27
diff -c -c -r1.27 pgtz.c
*** src/timezone/pgtz.c    2 Sep 2004 01:15:06 -0000    1.27
--- src/timezone/pgtz.c    8 Sep 2004 19:36:33 -0000
***************
*** 96,106 ****
  #if defined(HAVE_STRUCT_TM_TM_ZONE)
      return tm->tm_gmtoff;
  #elif defined(HAVE_INT_TIMEZONE)
! #ifdef HAVE_UNDERSCORE_TIMEZONE
!     return -_timezone;
! #else
!     return -timezone;
! #endif
  #else
  #error No way to determine TZ? Can this happen?
  #endif
--- 96,102 ----
  #if defined(HAVE_STRUCT_TM_TM_ZONE)
      return tm->tm_gmtoff;
  #elif defined(HAVE_INT_TIMEZONE)
!     return -TIMEZONE_GLOBAL;
  #else
  #error No way to determine TZ? Can this happen?
  #endif

pgsql-patches by date:

Previous
From: "Dave Page"
Date:
Subject: Re: [pgsql-hackers-win32] Contrib modules on Win32
Next
From: Alvaro Herrera
Date:
Subject: heap_modifytuple