You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Brian Behlendorf <br...@hyperreal.com> on 1996/11/14 08:24:49 UTC

cvs commit: apache/src conf.h httpd.h mod_log_config.c mod_rewrite.c util.c

brian       96/11/13 23:24:49

  Modified:    src       conf.h httpd.h mod_log_config.c mod_rewrite.c
                        util.c
  Log:
  Reviewed by:	Brian Behlendorf
  Submitted by:	Paul Eggert <eg...@twinsun.com>
  
  Fixes time zone problems.
  
  Old behavior:
  
  * When the time zone is not an integral multiple of 1 hour,
  the logs report bogus UTC offsets.  E.g. if the time zone
  is +0530 the reported UTC offset is +051800.
  
  * If !defined(HAS_GMTOFF) && !defined(NO_TIMEZONE), when the
  daylight-saving offset is not exactly 1 hour, the logs compute the UTC
  offset incorrectly when daylight saving is in effect.
  
  * If !defined(HAS_GMTOFF) && defined(NO_TIMEZONE), the code invokes
  mktime twice, once on the output of localtime and once on the output
  of gmtime, and subtracts the results.  This method is incorrect when
  the time is near a daylight-saving shift boundary.  For example,
  suppose we are in US Pacific time and the current time is 1996-10-27
  00:00:00 local time, just before a daylight saving time shift.  The
  correct UTC offset is -0700, but in this case get_gmtoff incorrectly
  computes an offset of -0800, because mktime(gmtime(...)) applies
  mktime to `1996-10-27 07:00:00' (actually a UTC time, not a local
  time) and the UTC offset as of 1996-10-27 07:00:00 local time is -0800.
  
  Here is a patch.  The key idea of the patch, which you'll find at the
  end, is an idea stolen from INN 1.5b1: assume that we are no more than
  24 hours away from UTC, which is a reasonable assumption (among other
  things, Posix requires support only for -2400 through +2400 time
  zones)
  
  Revision  Changes    Path
  1.43      +0 -2      apache/src/conf.h
  
  Index: conf.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/conf.h,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -C3 -r1.42 -r1.43
  *** conf.h	1996/11/03 21:25:05	1.42
  --- conf.h	1996/11/14 07:24:41	1.43
  ***************
  *** 300,306 ****
    #undef HAVE_GMTOFF
    #undef NO_KILLPG
    #undef NO_SETSID
  - #define timezone	_bky_timezone
    
    #elif defined(__FreeBSD__) || defined(__bsdi__)
    #define HAVE_SYS_RESOURCE_H
  --- 300,305 ----
  ***************
  *** 323,329 ****
    #elif defined(LYNXOS)
    #undef NO_KILLPG
    #undef NO_SETSID
  - #define NO_TIMEZONE
    #define NEED_STRCASECMP
    #define NEED_STRNCASECMP
    #define NEED_INITGROUPS
  --- 322,327 ----
  
  
  
  1.61      +1 -1      apache/src/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/httpd.h,v
  retrieving revision 1.60
  retrieving revision 1.61
  diff -C3 -r1.60 -r1.61
  *** httpd.h	1996/11/04 18:10:02	1.60
  --- httpd.h	1996/11/14 07:24:42	1.61
  ***************
  *** 596,602 ****
    /* Time */
    extern const char month_snames[12][4];
    
  ! struct tm *get_gmtoff(long *tz);
    char *get_time();
    char *ht_time (pool *p, time_t t, const char *fmt, int gmt);     
    char *gm_timestr_822(pool *p, time_t t);
  --- 596,602 ----
    /* Time */
    extern const char month_snames[12][4];
    
  ! struct tm *get_gmtoff(int *tz);
    char *get_time();
    char *ht_time (pool *p, time_t t, const char *fmt, int gmt);     
    char *gm_timestr_822(pool *p, time_t t);
  
  
  
  1.16      +3 -3      apache/src/mod_log_config.c
  
  Index: mod_log_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_log_config.c,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -C3 -r1.15 -r1.16
  *** mod_log_config.c	1996/11/04 01:06:10	1.15
  --- mod_log_config.c	1996/11/14 07:24:42	1.16
  ***************
  *** 287,293 ****
    
    char *log_request_time (request_rec *r, char *a)
    {
  !     long timz;
        struct tm *t;
        char tstr[MAX_STRING_LEN];
        
  --- 287,293 ----
    
    char *log_request_time (request_rec *r, char *a)
    {
  !     int timz;
        struct tm *t;
        char tstr[MAX_STRING_LEN];
        
  ***************
  *** 301,308 ****
    	if(timz < 0) timz = -timz;
    
    	strftime(tstr,MAX_STRING_LEN,"[%d/%b/%Y:%H:%M:%S ",t);
  ! 	sprintf (tstr + strlen(tstr), "%c%02ld%02ld]",
  ! 		 sign, timz/3600, timz%3600);
        }
    
        return pstrdup (r->pool, tstr);
  --- 301,308 ----
    	if(timz < 0) timz = -timz;
    
    	strftime(tstr,MAX_STRING_LEN,"[%d/%b/%Y:%H:%M:%S ",t);
  ! 	sprintf (tstr + strlen(tstr), "%c%.2d%.2d]",
  ! 		 sign, timz/60, timz%60);
        }
    
        return pstrdup (r->pool, tstr);
  
  
  
  1.8       +2 -2      apache/src/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_rewrite.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -C3 -r1.7 -r1.8
  *** mod_rewrite.c	1996/10/31 17:19:36	1.7
  --- mod_rewrite.c	1996/11/14 07:24:43	1.8
  ***************
  *** 2134,2140 ****
    
    static char *current_logtime(request_rec *r)
    {
  !     long timz;
        struct tm *t;
        static char tstr[MAX_STRING_LEN];
        char sign;
  --- 2134,2140 ----
    
    static char *current_logtime(request_rec *r)
    {
  !     int timz;
        struct tm *t;
        static char tstr[MAX_STRING_LEN];
        char sign;
  ***************
  *** 2146,2152 ****
    
        strftime(tstr, MAX_STRING_LEN,"[%d/%b/%Y:%H:%M:%S ",t);
    
  !     sprintf(tstr + strlen(tstr), "%c%02ld%02ld]", sign, timz/3600, timz%3600);
    
        return pstrdup(r->pool, tstr);
    }
  --- 2146,2152 ----
    
        strftime(tstr, MAX_STRING_LEN,"[%d/%b/%Y:%H:%M:%S ",t);
    
  !     sprintf(tstr + strlen(tstr), "%c%.2d%.2d]", sign, timz/60, timz%60);
    
        return pstrdup(r->pool, tstr);
    }
  
  
  
  1.31      +14 -19    apache/src/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/util.c,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -C3 -r1.30 -r1.31
  *** util.c	1996/11/12 18:24:35	1.30
  --- util.c	1996/11/14 07:24:44	1.31
  ***************
  *** 103,129 ****
    }
    
    /* What a pain in the ass. */
  ! struct tm *get_gmtoff(long *tz) {
  !     time_t tt;
  !     struct tm *t;
    
  !     tt = time(NULL);
  !     t = localtime(&tt);
  ! #if defined(HAVE_GMTOFF)
  !     *tz = t->tm_gmtoff;
  ! #elif !defined(NO_TIMEZONE)
  !     *tz = - timezone;
  !     if(t->tm_isdst)
  !         *tz += 3600;
    #else
  !   {
  !     static struct tm loc_t;
  ! 
  !     loc_t = *t;   /* save it */
  !     t = gmtime(&tt);
  !     *tz = mktime(&loc_t) - mktime(t);
  !     t = &loc_t; /* return pointer to saved time */
  !   }
    #endif
        return t;
    }
  --- 103,124 ----
    }
    
    /* What a pain in the ass. */
  ! struct tm *get_gmtoff(int *tz) {
  !     time_t tt = time(NULL);
  ! #if !defined(HAS_GMTOFF)
  !     struct tm gmt = *gmtime(&tt);
  ! #endif
  !     struct tm *t = localtime(&tt);
    
  ! #if defined(HAS_GMTOFF)
  !     *tz = (int) (t->tm_gmtoff / 60);
    #else
  !     /* Assume we are never more than 24 hours away. */
  !     int days = t->tm_yday - gmt.tm_yday;
  !     int hours = ((days < -1 ? 24 : 1 < days ? -24 : days * 24)
  ! 		 + t->tm_hour - gmt.tm_hour);
  !     int minutes = hours * 60 + t->tm_min - gmt.tm_min;
  !     *tz = minutes;
    #endif
        return t;
    }