lib/timelocal.t fails test 1 for VMS 7.1
Dan Sugalski [Fri, 5 Sep 1997 00:00:00 +0000 (00:00 +0000)]
The VMS Perl port has local routines to handle time(), localtime(), and
gmtime(), because the implementations of these on VMS are broken for VMS
v6.2 and below. This implemetation gets strange for most of Jan 1, 1970
(From midnight to 4 PM), and behaves oddly for daylight savings time, but
only on OpenVMS 7.0 and 7.1.

The following patch disables the local versions of time(), localtime(), and
gmtime(), and uses the system provided versions, for OpenVMS 7.0 and up.
5.004_03 passes all tests with this patch. Tested on OpenVMS Alpha 7.1 and
6.2, and OpenVMS Vax 7.1, 6.2, and 5.5-2.

p5p-msgid: 3.0.3.32.19970908112449.0087bc90@stargate.lbcc.cc.or.us

vms/vms.c
vms/vmsish.h

index 32f734b..f225790 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -3177,7 +3177,7 @@ void my_endpwent()
 }
 /*}}}*/
 
-
+#if __VMS_VER < 70000000 || __DECC_VER < 50200000
 /* Used for UTC calculation in my_gmtime(), my_localtime(), my_time(),
  * my_utime(), and flex_stat(), all of which operate on UTC unless
  * VMSISH_TIMES is true.
@@ -3303,6 +3303,7 @@ my_localtime(const time_t *timep)
 #define localtime(t) my_localtime(t)
 #define time(t)      my_time(t)
 
+#endif /* VMS VER < 7.0 || Dec C < 5.2
 
 /* my_utime - update modification time of a file
  * calling sequence is identical to POSIX utime(), but under
@@ -3366,7 +3367,7 @@ int my_utime(char *file, struct utimbuf *utimes)
      */
     lowbit = (utimes->modtime & 1) ? secscale : 0;
     unixtime = (long int) utimes->modtime;
-#   ifdef VMSISH_TIME
+#if defined(VMSISH_TIME) && (__VMS_VER < 70000000 || __DECC_VER < 50200000)
     if (!VMSISH_TIME) {  /* Input was UTC; convert to local for sys svc */
       if (!gmtime_emulation_type) (void) time(NULL);  /* Initialize UTC */
       unixtime += utc_offset_secs;
@@ -3716,10 +3717,12 @@ flex_fstat(int fd, struct mystat *statbufp)
 #   else
     if (1) {
 #   endif
+#if __VMS_VER < 70000000 || __DECC_VER < 50200000
       if (!gmtime_emulation_type) (void)time(NULL);
       statbufp->st_mtime -= utc_offset_secs;
       statbufp->st_atime -= utc_offset_secs;
       statbufp->st_ctime -= utc_offset_secs;
+#endif
     }
     return 0;
   }
@@ -3769,10 +3772,12 @@ flex_stat(char *fspec, struct mystat *statbufp)
 #     else
       if (1) {
 #     endif
+#if __VMS_VER < 70000000 || __DECC_VER < 50200000
         if (!gmtime_emulation_type) (void)time(NULL);
         statbufp->st_mtime -= utc_offset_secs;
         statbufp->st_atime -= utc_offset_secs;
         statbufp->st_ctime -= utc_offset_secs;
+#endif
       }
     }
     return retval;
index 81e3764..2da1639 100644 (file)
 #  define seekdir              Perl_seekdir
 #  define closedir             Perl_closedir
 #  define vmsreaddirversions   Perl_vmsreaddirversions
+#if __VMS_VER < 70000000 || __DECC_VER < 50200000
 #  define my_gmtime            Perl_my_gmtime
 #  define my_localtime         Perl_my_localtime
 #  define my_time              Perl_my_time
+#endif
 #  define cando_by_name                Perl_cando_by_name
 #  define flex_fstat           Perl_flex_fstat
 #  define flex_stat            Perl_flex_stat
@@ -330,9 +332,11 @@ struct utimbuf {
  * in VMS 6.0 or later use.  We also add shims for time() and localtime()
  * so we can run on UTC by default.
  */
+#if __VMS_VER < 70000000 || __DECC_VER < 50200000
 #define gmtime(t) my_gmtime(t)
 #define localtime(t) my_localtime(t)
 #define time(t) my_time(t)
+#endif
 
 /* VMS doesn't use a real sys_nerr, but we need this when scanning for error
  * messages in text strings . . .
@@ -532,9 +536,11 @@ long       telldir _((DIR *));
 void   seekdir _((DIR *, long));
 void   closedir _((DIR *));
 void   vmsreaddirversions _((DIR *, int));
+#ifdef my_gmtime
 struct tm *    my_gmtime _((const time_t *));
 struct tm *    my_localtime _((const time_t *));
 time_t my_time _((time_t *));
+#endif /* We're assuming these three come as a package */
 I32    cando_by_name _((I32, I32, char *));
 int    flex_fstat _((int, struct mystat *));
 int    flex_stat _((char *, struct mystat *));