You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 2000/01/09 06:18:35 UTC
cvs commit: apache-2.0/src/modules/standard mod_autoindex.c mod_cgi.c mod_cgid.c mod_expires.c mod_include.c mod_log_config.c mod_rewrite.c mod_status.c mod_usertrack.c
dgaudet 00/01/08 21:18:34
Modified: src modules.c
src/include http_protocol.h http_request.h httpd.h
util_date.h
src/lib/apr/file_io/unix filestat.c
src/lib/apr/include apr_file_io.h apr_time.h
src/lib/apr/test ab_apr.c testtime.c
src/lib/apr/time/unix Makefile.in time.c timestr.c
src/main http_core.c http_log.c http_protocol.c
http_request.c util.c util_date.c util_script.c
src/modules/experimental Makefile.tmpl
src/modules/standard mod_autoindex.c mod_cgi.c mod_cgid.c
mod_expires.c mod_include.c mod_log_config.c
mod_rewrite.c mod_status.c mod_usertrack.c
Removed: src/lib/apr/time/unix access.c
Log:
time overhaul:
- ap_time_t is a 64-bit scalar, microseconds since epoch
- ap_exploded_time_t corresponds to struct tm with a few extras
probably broken on anything except linux.
Revision Changes Path
1.4 +12 -3 apache-2.0/src/Attic/modules.c
Index: modules.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/Attic/modules.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- modules.c 1999/12/05 19:33:27 1.3
+++ modules.c 2000/01/09 05:18:15 1.4
@@ -7,7 +7,6 @@
#include "http_config.h"
extern module core_module;
-extern module mpm_mpmt_pthread_module;
extern module env_module;
extern module config_log_module;
extern module mime_module;
@@ -21,10 +20,14 @@
extern module action_module;
extern module userdir_module;
extern module alias_module;
+extern module rewrite_module;
extern module access_module;
extern module auth_module;
+extern module expires_module;
+extern module usertrack_module;
extern module setenvif_module;
extern module echo_module;
+extern module mpm_mpmt_pthread_module;
/*
* Modules which implicitly form the
@@ -35,7 +38,6 @@
*/
module *ap_prelinked_modules[] = {
&core_module,
- &mpm_mpmt_pthread_module,
&env_module,
&config_log_module,
&mime_module,
@@ -49,10 +51,14 @@
&action_module,
&userdir_module,
&alias_module,
+ &rewrite_module,
&access_module,
&auth_module,
+ &expires_module,
+ &usertrack_module,
&setenvif_module,
&echo_module,
+ &mpm_mpmt_pthread_module,
NULL
};
@@ -65,7 +71,6 @@
*/
module *ap_preloaded_modules[] = {
&core_module,
- &mpm_mpmt_pthread_module,
&env_module,
&config_log_module,
&mime_module,
@@ -79,10 +84,14 @@
&action_module,
&userdir_module,
&alias_module,
+ &rewrite_module,
&access_module,
&auth_module,
+ &expires_module,
+ &usertrack_module,
&setenvif_module,
&echo_module,
+ &mpm_mpmt_pthread_module,
NULL
};
1.10 +1 -1 apache-2.0/src/include/http_protocol.h
Index: http_protocol.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/include/http_protocol.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- http_protocol.h 1999/12/20 16:38:31 1.9
+++ http_protocol.h 2000/01/09 05:18:16 1.10
@@ -118,7 +118,7 @@
API_EXPORT(int) ap_set_content_length(request_rec *r, long length);
API_EXPORT(int) ap_set_keepalive(request_rec *r);
-API_EXPORT(ap_time_t *) ap_rationalize_mtime(request_rec *r, ap_time_t *mtime);
+API_EXPORT(ap_time_t) ap_rationalize_mtime(request_rec *r, ap_time_t mtime);
API_EXPORT(char *) ap_make_etag(request_rec *r, int force_weak);
API_EXPORT(void) ap_set_etag(request_rec *r);
API_EXPORT(void) ap_set_last_modified(request_rec *r);
1.5 +1 -1 apache-2.0/src/include/http_request.h
Index: http_request.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/include/http_request.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- http_request.h 1999/12/20 16:38:31 1.4
+++ http_request.h 2000/01/09 05:18:16 1.5
@@ -104,7 +104,7 @@
API_EXPORT(void) ap_internal_redirect_handler(const char *new_uri, request_rec *);
API_EXPORT(int) ap_some_auth_required(request_rec *r);
API_EXPORT(int) ap_is_initial_req(request_rec *r);
-API_EXPORT(ap_time_t *) ap_update_mtime(request_rec *r, ap_time_t *dependency_mtime);
+API_EXPORT(void) ap_update_mtime(request_rec *r, ap_time_t dependency_mtime);
#ifdef CORE_PRIVATE
/* Function called by main.c to handle first-level request */
1.18 +4 -4 apache-2.0/src/include/httpd.h
Index: httpd.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/include/httpd.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- httpd.h 2000/01/06 14:43:00 1.17
+++ httpd.h 2000/01/09 05:18:16 1.18
@@ -668,7 +668,7 @@
int proto_num; /* Number version of protocol; 1.1 = 1001 */
const char *hostname; /* Host, as set by full URI or Host: */
- ap_time_t *request_time; /* When the request started */
+ ap_time_t request_time; /* When the request started */
const char *status_line; /* Status line, if set by script */
int status; /* In any case */
@@ -704,7 +704,7 @@
int sent_bodyct; /* byte count in stream is for body */
long bytes_sent; /* body byte count, for easy access */
- ap_time_t *mtime; /* Time the resource was last modified */
+ ap_time_t mtime; /* Time the resource was last modified */
/* HTTP/1.1 connection-level features */
@@ -914,9 +914,9 @@
*/
/* Time */
-API_EXPORT(char *) ap_get_time(void);
+
API_EXPORT(char *) ap_field_noparam(ap_context_t *p, const char *intype);
-API_EXPORT(char *) ap_ht_time(ap_context_t *p, ap_time_t *t, const char *fmt, int gmt);
+API_EXPORT(char *) ap_ht_time(ap_context_t *p, ap_time_t t, const char *fmt, int gmt);
/* String handling. The *_nc variants allow you to use non-const char **s as
arguments (unfortunately C won't automatically convert a char ** to a const
1.6 +1 -1 apache-2.0/src/include/util_date.h
Index: util_date.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/include/util_date.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- util_date.h 1999/12/21 21:41:43 1.5
+++ util_date.h 2000/01/09 05:18:17 1.6
@@ -76,7 +76,7 @@
#define BAD_DATE (time_t)0
API_EXPORT(int) ap_checkmask(const char *data, const char *mask);
-API_EXPORT(ap_time_t *) ap_parseHTTPdate(const char *date, ap_context_t *cont);
+API_EXPORT(ap_time_t) ap_parseHTTPdate(const char *date);
#ifdef __cplusplus
}
1.9 +7 -13 apache-2.0/src/lib/apr/file_io/unix/filestat.c
Index: filestat.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/unix/filestat.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- filestat.c 2000/01/06 19:19:25 1.8
+++ filestat.c 2000/01/09 05:18:18 1.9
@@ -66,6 +66,7 @@
ap_status_t ap_getfileinfo(ap_finfo_t *finfo, struct file_t *thefile)
{
struct stat info;
+/* XXX: this should be the equivalent of fstat() in unix, using stat() here is wrong */
int rv = stat(thefile->fname, &info);
if (rv == 0) {
@@ -74,13 +75,9 @@
finfo->group = info.st_gid;
finfo->size = info.st_size;
finfo->inode = info.st_ino;
- ap_make_time(&finfo->atime, thefile->cntxt);
- ap_set_ansitime(finfo->atime, info.st_atime);
- ap_make_time(&finfo->mtime, thefile->cntxt);
- ap_set_ansitime(finfo->mtime, info.st_mtime);
- ap_make_time(&finfo->ctime, thefile->cntxt);
- ap_set_ansitime(finfo->ctime, info.st_ctime);
-
+ ap_ansi_time_to_ap_time(&finfo->atime, info.st_atime);
+ ap_ansi_time_to_ap_time(&finfo->mtime, info.st_mtime);
+ ap_ansi_time_to_ap_time(&finfo->ctime, info.st_ctime);
return APR_SUCCESS;
}
else {
@@ -107,12 +104,9 @@
finfo->group = info.st_gid;
finfo->size = info.st_size;
finfo->inode = info.st_ino;
- ap_make_time(&finfo->atime, cont);
- ap_set_ansitime(finfo->atime, info.st_atime);
- ap_make_time(&finfo->mtime, cont);
- ap_set_ansitime(finfo->mtime, info.st_mtime);
- ap_make_time(&finfo->ctime, cont);
- ap_set_ansitime(finfo->ctime, info.st_ctime);
+ ap_ansi_time_to_ap_time(&finfo->atime, info.st_atime);
+ ap_ansi_time_to_ap_time(&finfo->mtime, info.st_mtime);
+ ap_ansi_time_to_ap_time(&finfo->ctime, info.st_ctime);
return APR_SUCCESS;
}
else {
1.27 +3 -3 apache-2.0/src/lib/apr/include/apr_file_io.h
Index: apr_file_io.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_file_io.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- apr_file_io.h 2000/01/06 14:43:19 1.26
+++ apr_file_io.h 2000/01/09 05:18:18 1.27
@@ -120,9 +120,9 @@
ap_gid_t group;
ap_ino_t inode;
ap_off_t size;
- ap_time_t *atime;
- ap_time_t *mtime;
- ap_time_t *ctime;
+ ap_time_t atime;
+ ap_time_t mtime;
+ ap_time_t ctime;
};
/* Function definitions */
1.11 +49 -46 apache-2.0/src/lib/apr/include/apr_time.h
Index: apr_time.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_time.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- apr_time.h 2000/01/06 20:20:21 1.10
+++ apr_time.h 2000/01/09 05:18:19 1.11
@@ -63,55 +63,58 @@
extern "C" {
#endif /* __cplusplus */
-typedef enum {APR_LOCALTIME, APR_UTCTIME} ap_timetype_e;
-
-/* ap_ansi_time_t is defined as the number of seconds since
- * 0:00:00 01/01/70.
- */
-typedef ap_int64_t ap_ansi_time_t;
-typedef struct atime_t ap_time_t;
-
API_VAR_IMPORT const char ap_month_snames[12][4];
API_VAR_IMPORT const char ap_day_snames[7][4];
+
+/* number of microseconds since 00:00:00 january 1, 1970 UTC */
+typedef ap_int64_t ap_time_t;
+
+#define AP_USEC_PER_SEC (1000000LL)
+
+/* the time right now */
+ap_time_t ap_now(void);
+
+/* a structure similar to ANSI struct tm with the following differences:
+ - tm_usec isn't an ANSI field
+ - tm_gmtoff isn't an ANSI field (it's a bsdism)
+*/
+typedef struct {
+ ap_int32_t tm_usec; /* microseconds past tm_sec */
+ ap_int32_t tm_sec; /* (0-61) seconds past tm_min */
+ ap_int32_t tm_min; /* (0-59) minutes past tm_hour */
+ ap_int32_t tm_hour; /* (0-23) hours past midnight */
+ ap_int32_t tm_mday; /* (1-31) day of the month */
+ ap_int32_t tm_mon; /* (0-11) month of the year */
+ ap_int32_t tm_year; /* year since 1900 */
+ ap_int32_t tm_wday; /* (0-6) days since sunday */
+ ap_int32_t tm_yday; /* (0-365) days since jan 1 */
+ ap_int32_t tm_isdst; /* daylight saving time */
+ ap_int32_t tm_gmtoff; /* seconds east of UTC */
+} ap_exploded_time_t;
+
+/* convert an ANSI time_t to ap_time_t */
+ap_status_t ap_ansi_time_to_ap_time(ap_time_t *result, time_t input);
+
+ap_status_t ap_explode_gmt(ap_exploded_time_t *result, ap_time_t input);
+ap_status_t ap_explode_localtime(ap_exploded_time_t *result, ap_time_t input);
+ap_status_t ap_implode_time(ap_time_t *result, ap_exploded_time_t *input);
+
+/* ap_rfc822_date formats dates in the RFC822
+ format in an efficient manner. it is a fixed length
+ format and requires the indicated amount of storage
+ including trailing \0 */
+#define AP_RFC822_DATE_LEN (30)
+ap_status_t ap_rfc822_date(char *date_str, ap_time_t t);
+
+/* ap_ctime formats dates in the ctime() format
+ in an efficient manner. it is a fixed length format
+ and requires the indicated amount of storage
+ including trailing \0 */
+#define AP_CTIME_LEN (25)
+ap_status_t ap_ctime(char *date_str, ap_time_t t);
+
+ap_status_t ap_strftime(char *s, ap_size_t *retsize, ap_size_t max, const char *format, ap_exploded_time_t *tm);
-/* Function Definitions */
-ap_status_t ap_make_time(ap_time_t **, ap_context_t *);
-ap_status_t ap_make_init_time(ap_time_t **, ap_context_t *);
-ap_status_t ap_current_time(ap_time_t *);
-ap_status_t ap_explode_time(ap_time_t *, ap_timetype_e);
-ap_status_t ap_implode_time(ap_time_t *);
-
-ap_status_t ap_timestr(char **date_str, struct atime_t *t, ap_timetype_e type, ap_context_t *p);
-ap_status_t ap_strftime(char *s, ap_size_t *retsize, ap_size_t max, const char *format, ap_time_t *tm);
-
-/* accessor functions */
-ap_status_t ap_get_ansitime(ap_time_t *, ap_ansi_time_t *);
-ap_status_t ap_timediff(ap_time_t *, ap_time_t *, ap_int32_t *);
-
-ap_status_t ap_get_sec(ap_time_t *, ap_int32_t *);
-ap_status_t ap_get_min(ap_time_t *, ap_int32_t *);
-ap_status_t ap_get_hour(ap_time_t *, ap_int32_t *);
-ap_status_t ap_get_mday(ap_time_t *, ap_int32_t *);
-ap_status_t ap_get_mon(ap_time_t *, ap_int32_t *);
-ap_status_t ap_get_year(ap_time_t *, ap_int32_t *);
-ap_status_t ap_get_wday(ap_time_t *, ap_int32_t *);
-
-ap_status_t ap_set_ansitime(ap_time_t *, ap_ansi_time_t);
-ap_status_t ap_set_sec(ap_time_t *, ap_int32_t);
-ap_status_t ap_set_min(ap_time_t *, ap_int32_t);
-ap_status_t ap_set_hour(ap_time_t *, ap_int32_t);
-ap_status_t ap_set_mday(ap_time_t *, ap_int32_t);
-ap_status_t ap_set_mon(ap_time_t *, ap_int32_t);
-ap_status_t ap_set_year(ap_time_t *, ap_int32_t);
-ap_status_t ap_set_wday(ap_time_t *, ap_int32_t);
-ap_status_t ap_timecmp(ap_time_t *a, ap_time_t *b);
-
-ap_status_t ap_get_gmtoff(int *tz, ap_time_t *tt, ap_context_t *cont);
-
-ap_status_t ap_get_timedata(ap_time_t *, char *, void *);
-ap_status_t ap_set_timedata(ap_time_t *, void *, char *,
- ap_status_t (*cleanup) (void *));
-
#ifdef __cplusplus
}
#endif
1.15 +19 -28 apache-2.0/src/lib/apr/test/ab_apr.c
Index: ab_apr.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/test/ab_apr.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- ab_apr.c 2000/01/06 14:43:21 1.14
+++ ab_apr.c 2000/01/09 05:18:19 1.15
@@ -132,7 +132,7 @@
int cbx; /* offset in cbuffer */
int keepalive; /* non-zero if a keep-alive request */
int gotheader; /* non-zero if we have the entire header in cbuff */
- ap_time_t *start, *connect, *done;
+ ap_time_t start, connect, done;
int socknum;
};
@@ -182,7 +182,7 @@
int err_length = 0, err_conn = 0, err_except = 0;
int err_response = 0;
-ap_time_t *start, *endtime;
+ap_time_t start, endtime;
/* global request (and its length) */
char request[512];
@@ -220,7 +220,7 @@
static void write_request(struct connection *c)
{
ap_ssize_t len = reqlen;
- ap_current_time(c->connect);
+ c->connect = ap_now();
ap_setsocketopt(c->aprsock, APR_SO_TIMEOUT, 30);
if (ap_send(c->aprsock, request, &reqlen) != APR_SUCCESS &&
reqlen != len) {
@@ -244,8 +244,8 @@
{
int timetaken;
- ap_current_time(endtime);
- ap_timediff(endtime, start, &timetaken);
+ endtime = ap_now();
+ timetaken = (endtime - start) / AP_USEC_PER_SEC;
printf("\r \r");
printf("Server Software: %s\n", servername);
@@ -319,8 +319,8 @@
{
int timetaken;
- ap_current_time(endtime);
- ap_timediff(endtime, start, &timetaken);
+ endtime = ap_now();
+ timetaken = (endtime - start) / AP_USEC_PER_SEC;
printf("\n\n<table %s>\n", tablestring);
printf("<tr %s><th colspan=2 %s>Server Software:</th>"
@@ -451,7 +451,7 @@
if (ap_set_remote_port(c->aprsock, port) != APR_SUCCESS) {
err("Port:");
}
- ap_current_time(c->start);
+ c->start = ap_now();
if (ap_connect(c->aprsock, hostname) != APR_SUCCESS) {
if (errno == APR_EINPROGRESS) {
c->state = STATE_CONNECTING;
@@ -494,10 +494,10 @@
/* save out time */
if (done < requests) {
struct data s;
- ap_current_time(c->done);
+ c->done = ap_now();
s.read = c->read;
- ap_timediff(c->connect, c->start, &s.ctime);
- ap_timediff(c->done, c->start, &s.time);
+ s.ctime = (c->connect - c->start) / 1000;
+ s.time = (c->done - c->start) / 1000;
stats[done++] = s;
}
}
@@ -647,10 +647,10 @@
}
if (done < requests) {
struct data s;
- ap_current_time(c->done);
+ c->done = ap_now();
s.read = c->read;
- ap_timediff(c->connect, c->start, &s.ctime);
- ap_timediff(c->done, c->start, &s.time);
+ s.ctime = (c->connect - c->start) / 1000;
+ s.time = (c->done - c->start) / 1000;
stats[done++] = s;
}
c->keepalive = 0;
@@ -669,7 +669,7 @@
static void test(void)
{
- ap_time_t *now;
+ ap_time_t now;
time_t timeout;
ap_int16_t rv;
int i;
@@ -679,7 +679,7 @@
fflush(stdout);
}
- ap_make_time(&now, cntxt);
+ now = ap_now();
con = (struct connection *)malloc(concurrency * sizeof(struct connection));
memset(con, 0, concurrency * sizeof(struct connection));
@@ -687,12 +687,6 @@
stats = (struct data *)malloc(requests * sizeof(struct data));
ap_setup_poll(&readbits, concurrency, cntxt);
- for (i = 0; i < concurrency; i++) {
- ap_make_time(&con[i].start, cntxt);
- ap_make_time(&con[i].connect, cntxt);
- ap_make_time(&con[i].done, cntxt);
- }
-
/* setup request */
if (!posting) {
sprintf(request, "GET %s HTTP/1.0\r\n"
@@ -732,7 +726,7 @@
#endif /*CHARSET_EBCDIC */
/* ok - lets start */
- ap_current_time(start);
+ start = ap_now();
/* initialise lots of requests */
for (i = 0; i < concurrency; i++) {
@@ -745,8 +739,8 @@
ap_int32_t timed;
/* check for time limit expiry */
- ap_current_time(now);
- ap_timediff(now, start, &timed);
+ now = ap_now();
+ timed = (now - start) / AP_USEC_PER_SEC;
if (tlimit && timed > (tlimit * 1000)) {
requests = done; /* so stats are correct */
}
@@ -896,9 +890,6 @@
tdstring = "bgcolor=white";
ap_create_context(&cntxt, NULL);
-
- ap_make_time(&start, cntxt);
- ap_make_time(&endtime, cntxt);
ap_optind = 1;
while (ap_getopt(cntxt, argc, argv, "n:c:t:T:p:v:kVhwx:y:z:", &c) == APR_SUCCESS) {
1.5 +17 -92 apache-2.0/src/lib/apr/test/testtime.c
Index: testtime.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/test/testtime.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- testtime.c 2000/01/06 19:19:28 1.4
+++ testtime.c 2000/01/09 05:18:20 1.5
@@ -63,113 +63,38 @@
int main()
{
- ap_context_t *context;
- ap_time_t *time;
- ap_time_t *time2;
- ap_int32_t rv = 0;
- ap_int64_t t1, t2;
+ ap_time_t now;
+ ap_exploded_time_t xt;
+ ap_time_t imp;
- fprintf(stdout, "Creating context.......");
- if (ap_create_context(&context, NULL) != APR_SUCCESS) {
- fprintf(stderr, "could not create context\n");
- exit(-1);
- }
- fprintf(stdout, "OK\n");
-
fprintf(stdout, "Testing Time functions.\n");
- fprintf(stdout, "\tMaking new time variable.......");
- if (ap_make_time(&time, context) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't allocate memory\n");
- exit(-1);
- }
+ fprintf(stdout, "\tap_now.......");
+ now = ap_now();
fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting current time.......");
- if (ap_current_time(time) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the time\n");
+
+ fprintf(stdout, "\tap_explode_localtime.......");
+ if (ap_explode_localtime(&xt, now) != APR_SUCCESS) {
+ fprintf(stderr, "Couldn't explode the time\n");
exit(-1);
}
fprintf(stdout, "OK\n");
- fprintf(stdout, "\tExploding Current time.......");
- if (ap_explode_time(time, APR_UTCTIME) != APR_SUCCESS) {
+ fprintf(stdout, "\tap_explode_gmt.......");
+ if (ap_explode_gmt(&xt, now) != APR_SUCCESS) {
fprintf(stderr, "Couldn't explode the time\n");
exit(-1);
}
fprintf(stdout, "OK\n");
- ap_make_time(&time2, context);
- fprintf(stdout, "\tGetting the number of seconds.......");
- if (ap_get_sec(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the seconds\n");
+ fprintf(stdout, "\tap_implode_time........");
+ if (ap_implode_time(&imp, &xt) != APR_SUCCESS) {
+ fprintf(stderr, "Couldn't implode the time\n");
exit(-1);
}
- ap_set_sec(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting the number of minutes.......");
- if (ap_get_min(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the minutes\n");
- exit(-1);
- }
- ap_set_min(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting the number of hours.......");
- if (ap_get_hour(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the hours\n");
- exit(-1);
- }
- ap_set_hour(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting the number of days.......");
- if (ap_get_mday(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the days\n");
- exit(-1);
- }
- ap_set_mday(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting the month .......");
- if (ap_get_mon(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the month\n");
- exit(-1);
- }
- ap_set_mon(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting the year.......");
- if (ap_get_year(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the year\n");
- exit(-1);
- }
- ap_set_year(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tGetting the weekday.......");
- if (ap_get_wday(time, &rv) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't get the week day\n");
- exit(-1);
- }
- ap_set_wday(time2, rv);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tImploding the time.......");
- if (ap_implode_time(time2) != APR_SUCCESS ||
- ap_implode_time(time) != APR_SUCCESS) {
- fprintf(stderr, "Couldn't implode time\n");
- exit(-1);
- }
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "\tComparing two time values.......");
- ap_get_ansitime(time, &t1);
- ap_get_ansitime(time2, &t2);
- if ((t1 == -1) || (t2 == -1) || (t1 != t2)) {
- fprintf(stderr, "Values don't match\n");
- exit(-1);
+ if (imp != now) {
+ fprintf(stderr, "implode/explode mismatch\n");
+ exit(-1);
}
fprintf(stdout, "OK\n");
1.10 +0 -5 apache-2.0/src/lib/apr/time/unix/Makefile.in
Index: Makefile.in
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/time/unix/Makefile.in,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Makefile.in 1999/12/20 20:03:17 1.9
+++ Makefile.in 2000/01/09 05:18:21 1.10
@@ -15,7 +15,6 @@
#LIB=libtime.a
OBJS=time.o \
- access.o \
timestr.o
.c.o:
@@ -51,10 +50,6 @@
&& rm Makefile.new
# DO NOT REMOVE
-access.o: access.c atime.h ../../include/apr_config.h \
- ../../include/apr_time.h ../../include/apr_general.h \
- ../../include/apr.h ../../include/apr_errno.h ../../include/apr_lib.h \
- ../../include/apr_file_io.h ../../include/apr_thread_proc.h
time.o: time.c atime.h ../../include/apr_config.h \
../../include/apr_time.h ../../include/apr_general.h \
../../include/apr.h ../../include/apr_errno.h ../../include/apr_lib.h \
1.16 +109 -168 apache-2.0/src/lib/apr/time/unix/time.c
Index: time.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/time/unix/time.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- time.c 2000/01/06 20:20:25 1.15
+++ time.c 2000/01/09 05:18:21 1.16
@@ -57,107 +57,147 @@
#include "apr_portable.h"
/* ***APRDOC********************************************************
- * ap_status_t ap_make_time(ap_context_t *, ap_time_t *)
- * Create an empty time entity.
- * arg 1) The context to operate on.
- * arg 2) The new time entity to create.
+ * ap_status_t ap_ansi_time_to_ap_time(ap_time_t *result, time_t input)
+ * convert an ansi time_t to an ap_time_t
+ * arg 1) the resulting ap_time_t
+ * arg 2) the time_t to convert
*/
-ap_status_t ap_make_time(struct atime_t **new, ap_context_t *cont)
+ap_status_t ap_ansi_time_to_ap_time(ap_time_t *result, time_t input)
{
- (*new) = (struct atime_t *)ap_palloc(cont, sizeof(struct atime_t));
-
- if ((*new) == NULL) {
- return APR_ENOMEM;
- }
-
- (*new)->cntxt = cont;
- (*new)->explodedtime = ap_palloc(cont, sizeof(struct tm));
- (*new)->time_ex = 0;
- (*new)->currtime = NULL;
+ *result = (ap_time_t)input * AP_USEC_PER_SEC;
return APR_SUCCESS;
}
+
/* ***APRDOC********************************************************
- * ap_status_t ap_make_init_time(ap_context_t *, ap_time_t *)
- * Create a time entity and fill it out with the current time.
- * arg 1) The context to operate on.
- * arg 2) The new time entity to create.
+ * ap_time_t ap_now(void)
+ * return the current time
*/
-ap_status_t ap_make_init_time(struct atime_t **new, ap_context_t *cont)
+ap_time_t ap_now(void)
{
- (*new) = (struct atime_t *)ap_palloc(cont, sizeof(struct atime_t));
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ return tv.tv_sec * AP_USEC_PER_SEC + tv.tv_usec;
+}
- if ((*new) == NULL) {
- return APR_ENOMEM;
- }
- (*new)->cntxt = cont;
- (*new)->explodedtime = ap_palloc(cont, sizeof(struct tm));
- (*new)->time_ex = 0;
- gettimeofday((*new)->currtime, NULL);
- return APR_SUCCESS;
+static void tm_to_exp(ap_exploded_time_t *xt, struct tm *tm)
+{
+ xt->tm_sec = tm->tm_sec;
+ xt->tm_min = tm->tm_min;
+ xt->tm_hour = tm->tm_hour;
+ xt->tm_mday = tm->tm_mday;
+ xt->tm_mon = tm->tm_mon;
+ xt->tm_year = tm->tm_year;
+ xt->tm_wday = tm->tm_wday;
+ xt->tm_yday = tm->tm_yday;
+ xt->tm_isdst = tm->tm_isdst;
}
+
/* ***APRDOC********************************************************
- * ap_status_t ap_current_time(ap_time_t *)
- * Return the number of seconds since January 1, 1970.
- * arg 1) The time entity to reference.
+ * ap_status_t ap_explode_gmt(ap_exploded_time_t *, ap_time_t)
+ * convert a time to its human readable components in GMT timezone
+ * arg 1) the exploded time
+ * arg 2) the time to explode
*/
-ap_status_t ap_current_time(struct atime_t *new)
+ap_status_t ap_explode_gmt(ap_exploded_time_t *result, ap_time_t input)
{
- new->currtime = ap_palloc(new->cntxt, sizeof(struct timeval));
- gettimeofday(new->currtime, NULL);
- new->time_ex = 0;
- return APR_SUCCESS;
-}
+ time_t t = input / AP_USEC_PER_SEC;
+#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ struct tm banana;
+#endif
+
+ result->tm_usec = input % AP_USEC_PER_SEC;
+
+#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ gmtime_r(&t, &banana);
+ tm_to_exp(result, &banana);
+#else
+ tm_to_exp(result, gmtime(&t));
+#endif
+ result->tm_gmtoff = 0;
+ return APR_SUCCESS;
+}
/* ***APRDOC********************************************************
- * ap_status_t ap_explode_time(ap_time_t *, ap_timetype_e)
- * Convert time value from number of seconds since epoch to a set
- * of integers representing the time in a human readable form.
- * arg 1) The time entity to reference.
- * arg 2) How to explode the time. One of:
- * APR_LOCALTIME -- Use local time
- * APR_UTCTIME -- Use UTC time
+ * ap_status_t ap_explode_localtime(ap_exploded_time_t *, ap_time_t)
+ * convert a time to its human readable components in local timezone
+ * arg 1) the exploded time
+ * arg 2) the time to explode
*/
-ap_status_t ap_explode_time(struct atime_t *atime, ap_timetype_e type)
+ap_status_t ap_explode_localtime(ap_exploded_time_t *result, ap_time_t input)
{
- switch (type) {
- case APR_LOCALTIME: {
#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
- localtime_r(&atime->currtime->tv_sec, atime->explodedtime);
+ time_t t = input / AP_USEC_PER_SEC;
+ struct tm apricot;
+
+ result->tm_usec = input % AP_USEC_PER_SEC;
+
+ localtime_r(&t, &apricot);
+ tm_to_exp(result, &apricot);
+#if defined(HAVE_GMTOFF)
+ result->tm_gmtoff = apricot.tm_gmtoff;
+#elif defined(HAVE___GMTOFF)
+ result->tm_gmtoff = apricot.__tm_gmtoff;
#else
- atime->explodedtime = localtime(&atime->currtime->tv_sec);
-#endif
- break;
+ /* solaris is backwards enough to have pthreads but no tm_gmtoff, feh */
+ {
+ int days, hours, minutes;
+
+ gmtime_r(&t, &apricot);
+ days = result->tm_yday - apricot.tm_yday;
+ hours = ((days < -1 ? 24 : 1 < days ? -24 : days * 24)
+ + result->tm_hour - apricot.tm_hour);
+ minutes = hours * 60 + result->tm_min - apricot.tm_min;
+ result->tm_gmtoff = minutes * 60;
}
- case APR_UTCTIME: {
-#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
- gmtime_r(&atime->currtime->tv_sec, atime->explodedtime);
-#else
- atime->explodedtime = gmtime(&atime->currtime->tv_sec);
#endif
- break;
- }
+#else
+ time_t t = input / AP_USEC_PER_SEC;
+ struct tm *tmx;
+
+ result->tm_usec = input % AP_USEC_PER_SEC;
+
+ tmx = localtime(&t);
+ tm_to_exp(result, tmx);
+#if defined(HAVE_GMTOFF)
+ result->tm_gmtoff = tmx->tm_gmtoff;
+#elif defined(HAVE___GMTOFF)
+ result->tm_gmtoff = tmx->__tm_gmtoff;
+#else
+ /* need to create tm_gmtoff... assume we are never more than 24 hours away */
+ {
+ int days, hours, minutes;
+
+ tmx = gmtime(&t);
+ days = result->tm_yday - tmx->tm_yday;
+ hours = ((days < -1 ? 24 : 1 < days ? -24 : days * 24)
+ + result->tm_hour - tmx->tm_hour);
+ minutes = hours * 60 + result->tm_min - tmx->tm_min;
+ result->tm_gmtoff = minutes * 60;
}
- atime->time_ex = 1;
+#endif
+#endif
return APR_SUCCESS;
}
+
/* ***APRDOC********************************************************
- * ap_status_t ap_implode_time(ap_time_t *)
+ * ap_status_t ap_implode_time(ap_time_t *, ap_exploded_time_t *)
* Convert time value from human readable format to number of seconds
* since epoch
- * arg 1) The time entity to reference.
+ * arg 1) the resulting imploded time
+ * arg 2) the input exploded time
*/
-ap_status_t ap_implode_time(struct atime_t *atime)
+ap_status_t ap_implode_time(ap_time_t *t, ap_exploded_time_t *xt)
{
int year;
time_t days;
static const int dayoffset[12] =
{306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275};
- year = atime->explodedtime->tm_year;
+ year = xt->tm_year;
if (year < 70 || ((sizeof(time_t) <= 4) && (year >= 138))) {
return APR_EBADDATE;
@@ -165,120 +205,21 @@
/* shift new year to 1st March in order to make leap year calc easy */
- if (atime->explodedtime->tm_mon < 2)
+ if (xt->tm_mon < 2)
year--;
/* Find number of days since 1st March 1900 (in the Gregorian calendar). */
days = year * 365 + year / 4 - year / 100 + (year / 100 + 3) / 4;
- days += dayoffset[atime->explodedtime->tm_mon] +
- atime->explodedtime->tm_mday - 1;
+ days += dayoffset[xt->tm_mon] + xt->tm_mday - 1;
days -= 25508; /* 1 jan 1970 is 25508 days since 1 mar 1900 */
- days = ((days * 24 + atime->explodedtime->tm_hour) * 60 +
- atime->explodedtime->tm_min) * 60 + atime->explodedtime->tm_sec;
+ days = ((days * 24 + xt->tm_hour) * 60 + xt->tm_min) * 60 + xt->tm_sec;
if (days < 0) {
return APR_EBADDATE;
}
- atime->currtime = ap_palloc(atime->cntxt, sizeof(struct timeval));
- atime->currtime->tv_sec = days; /* must be a valid time */
- atime->currtime->tv_usec = 0;
- atime->time_ex = 1;
+ days -= xt->tm_gmtoff;
+ *t = days * AP_USEC_PER_SEC + xt->tm_usec;
return APR_SUCCESS;
}
-
-/* ***APRDOC********************************************************
- * ap_status_t ap_get_os_time(ap_os_time_t **, ap_time_t *)
- * Convert from apr time type to OS specific time value
- * arg 1) The time value to convert.
- * arg 2) The OS specific value to convert to.
- */
-ap_status_t ap_get_os_time(ap_os_time_t **atime, struct atime_t *thetime)
-{
- if (thetime == NULL) {
- return APR_ENOTIME;
- }
- if (thetime->currtime == NULL) {
- ap_implode_time(thetime);
- }
- atime = &(thetime->currtime);
- return APR_SUCCESS;
-}
-
-/* ***APRDOC********************************************************
- * ap_status_t ap_put_os_time(ap_time_t **, ap_os_time_t *, ap_context_t *)
- * Convert to apr time type from OS specific time value
- * arg 1) The context to use.
- * arg 2) The time value to convert to.
- * arg 3) The OS specific value to convert.
- */
-ap_status_t ap_put_os_time(struct atime_t **thetime, ap_os_time_t *atime,
- ap_context_t *cont)
-{
- if (cont == NULL) {
- return APR_ENOCONT;
- }
- if (thetime == NULL) {
- (*thetime) = (struct atime_t *)ap_palloc(cont, sizeof(struct atime_t));
- (*thetime)->cntxt = cont;
- }
- (*thetime)->currtime = atime;
- (*thetime)->time_ex = 0;
- return APR_SUCCESS;
-}
-
-/* ***APRDOC********************************************************
- * ap_status_t ap_timediff(ap_time_t *, ap_time_t *, ap_int32_t *)
- * Retrieve the difference between two time structures in milliseconds.
- * arg 1) The first time value
- * arg 2) The second timevalue
- * arg 3) The difference to return.
- */
-ap_status_t ap_timediff(struct atime_t *a, struct atime_t *b, ap_int32_t *rv)
-{
- register int us, s;
-
- us = a->currtime->tv_usec - b->currtime->tv_usec;
- us /= 1000;
- s = a->currtime->tv_sec - b->currtime->tv_sec;
- s *= 1000;
- *rv = s + us;
- return APR_SUCCESS;
-}
-
-/* ***APRDOC********************************************************
- * ap_status_t ap_timecmp(ap_time_t **, ap_time_t *, ap_time_t *)
- * Compare two time values.
- * arg 1) The first time value
- * arg 2) The second time value.
- * return) APR_LESS -- arg 1 < arg 2
- * APR_MORE -- arg 1 > arg 2
- * APR_EQUAL -- arg 1 = arg 2
- */
-ap_status_t ap_timecmp(struct atime_t *a, struct atime_t *b)
-{
- if (a == NULL || a->currtime == NULL) {
- return APR_LESS;
- }
- else if (b == NULL || b->currtime == NULL) {
- return APR_MORE;
- }
-
- if (a->currtime->tv_sec > b->currtime->tv_sec) {
- return APR_MORE;
- }
- else if (a->currtime->tv_sec < b->currtime->tv_sec) {
- return APR_LESS;
- }
- else {
- if (a->currtime->tv_usec > b->currtime->tv_sec) {
- return APR_MORE;
- }
- else {
- return APR_LESS;
- }
- }
- return APR_EQUAL;
-}
-
1.5 +95 -56 apache-2.0/src/lib/apr/time/unix/timestr.c
Index: timestr.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/time/unix/timestr.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- timestr.c 1999/12/31 05:09:21 1.4
+++ timestr.c 2000/01/09 05:18:21 1.5
@@ -65,71 +65,110 @@
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
-ap_status_t ap_timestr(char **date_str, struct atime_t *t, ap_timetype_e type, ap_context_t *p)
+ap_status_t ap_rfc822_date(char *date_str, ap_time_t t)
{
- struct tm *tms;
- char *date_str_ptr;
+ ap_exploded_time_t xt;
+ const char *s;
int real_year;
- (*date_str) = ap_palloc(p, 48 * sizeof(char));
- date_str_ptr = (*date_str);
+ ap_explode_gmt(&xt, t);
- ap_explode_time(t, type);
+ /* example: "Sat, 08 Jan 2000 18:31:41 GMT" */
+ /* 12345678901234567890123456789 */
- /* Assumption: this is always 3 */
- /* i = strlen(ap_day_snames[tms->tm_wday]); */
- memcpy(date_str_ptr, ap_day_snames[t->explodedtime->tm_wday], 3);
- date_str_ptr += 3;
- *date_str_ptr++ = ',';
- *date_str_ptr++ = ' ';
- *date_str_ptr++ = t->explodedtime->tm_mday / 10 + '0';
- *date_str_ptr++ = t->explodedtime->tm_mday % 10 + '0';
- *date_str_ptr++ = ' ';
- /* Assumption: this is also always 3 */
- /* i = strlen(ap_month_snames[tms->tm_mon]); */
- memcpy(date_str_ptr, ap_month_snames[t->explodedtime->tm_mon], 3);
- date_str_ptr += 3;
- *date_str_ptr++ = ' ';
- real_year = 1900 + t->explodedtime->tm_year;
+ s = &ap_day_snames[xt.tm_wday][0];
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = ',';
+ *date_str++ = ' ';
+ *date_str++ = xt.tm_mday / 10 + '0';
+ *date_str++ = xt.tm_mday % 10 + '0';
+ *date_str++ = ' ';
+ s = &ap_month_snames[xt.tm_mon][0];
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = ' ';
+ real_year = 1900 + xt.tm_year;
/* This routine isn't y10k ready. */
- *date_str_ptr++ = real_year / 1000 + '0';
- *date_str_ptr++ = real_year % 1000 / 100 + '0';
- *date_str_ptr++ = real_year % 100 / 10 + '0';
- *date_str_ptr++ = real_year % 10 + '0';
- *date_str_ptr++ = ' ';
- *date_str_ptr++ = t->explodedtime->tm_hour / 10 + '0';
- *date_str_ptr++ = t->explodedtime->tm_hour % 10 + '0';
- *date_str_ptr++ = ':';
- *date_str_ptr++ = t->explodedtime->tm_min / 10 + '0';
- *date_str_ptr++ = t->explodedtime->tm_min % 10 + '0';
- *date_str_ptr++ = ':';
- *date_str_ptr++ = t->explodedtime->tm_sec / 10 + '0';
- *date_str_ptr++ = t->explodedtime->tm_sec % 10 + '0';
- if (type == APR_UTCTIME) {
- *date_str_ptr++ = ' ';
- *date_str_ptr++ = 'G';
- *date_str_ptr++ = 'M';
- *date_str_ptr++ = 'T';
- }
- *date_str_ptr = '\0';
- return APR_SUCCESS;
- /* RFC date format; as strftime '%a, %d %b %Y %T GMT' */
-
- /* The equivalent using sprintf. Use this for more legible but slower code
- return ap_psprintf(p,
- "%s, %.2d %s %d %.2d:%.2d:%.2d GMT",
- ap_day_snames[t->explodedtime->tm_wday],
- t->explodedtime->tm_mday,
- ap_month_snames[t->explodedtime->tm_mon],
- t->explodedtime->tm_year + 1900, t->explodedtime->tm_hour,
- t->explodedtime->tm_min, t->explodedtime->tm_sec);
- */
+ *date_str++ = real_year / 1000 + '0';
+ *date_str++ = real_year % 1000 / 100 + '0';
+ *date_str++ = real_year % 100 / 10 + '0';
+ *date_str++ = real_year % 10 + '0';
+ *date_str++ = ' ';
+ *date_str++ = xt.tm_hour / 10 + '0';
+ *date_str++ = xt.tm_hour % 10 + '0';
+ *date_str++ = ':';
+ *date_str++ = xt.tm_min / 10 + '0';
+ *date_str++ = xt.tm_min % 10 + '0';
+ *date_str++ = ':';
+ *date_str++ = xt.tm_sec / 10 + '0';
+ *date_str++ = xt.tm_sec % 10 + '0';
+ *date_str++ = ' ';
+ *date_str++ = 'G';
+ *date_str++ = 'M';
+ *date_str++ = 'T';
+ *date_str++ = 0;
+ return APR_SUCCESS;
}
-ap_status_t ap_strftime(char *s, ap_size_t *retsize, ap_size_t max,
- const char *format, struct atime_t *tm)
+ap_status_t ap_ctime(char *date_str, ap_time_t t)
{
- (*retsize) = strftime(s, max, format, tm->explodedtime);
+ ap_exploded_time_t xt;
+ const char *s;
+ int real_year;
+
+ /* example: "Wed Jun 30 21:49:08 1993" */
+ /* 123456789012345678901234 */
+
+ ap_explode_localtime(&xt, t);
+ s = &ap_day_snames[xt.tm_wday][0];
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = ' ';
+ s = &ap_month_snames[xt.tm_mon][0];
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = *s++;
+ *date_str++ = ' ';
+ *date_str++ = xt.tm_mday / 10 + '0';
+ *date_str++ = xt.tm_mday % 10 + '0';
+ *date_str++ = ' ';
+ *date_str++ = xt.tm_hour / 10 + '0';
+ *date_str++ = xt.tm_hour % 10 + '0';
+ *date_str++ = ':';
+ *date_str++ = xt.tm_min / 10 + '0';
+ *date_str++ = xt.tm_min % 10 + '0';
+ *date_str++ = ':';
+ *date_str++ = xt.tm_sec / 10 + '0';
+ *date_str++ = xt.tm_sec % 10 + '0';
+ *date_str++ = ' ';
+ real_year = 1900 + xt.tm_year;
+ *date_str++ = real_year / 1000 + '0';
+ *date_str++ = real_year % 1000 / 100 + '0';
+ *date_str++ = real_year % 100 / 10 + '0';
+ *date_str++ = real_year % 10 + '0';
+ *date_str++ = 0;
+
return APR_SUCCESS;
}
+ap_status_t ap_strftime(char *s, ap_size_t *retsize, ap_size_t max,
+ const char *format, ap_exploded_time_t *xt)
+{
+ struct tm tm;
+
+ tm.tm_sec = xt->tm_sec;
+ tm.tm_min = xt->tm_min;
+ tm.tm_hour = xt->tm_hour;
+ tm.tm_mday = xt->tm_mday;
+ tm.tm_mon = xt->tm_mon;
+ tm.tm_year = xt->tm_year;
+ tm.tm_wday = xt->tm_wday;
+ tm.tm_yday = xt->tm_yday;
+ tm.tm_isdst = xt->tm_isdst;
+ (*retsize) = strftime(s, max, format, &tm);
+ return APR_SUCCESS;
+}
1.31 +0 -1 apache-2.0/src/main/http_core.c
Index: http_core.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_core.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- http_core.c 2000/01/06 14:43:26 1.30
+++ http_core.c 2000/01/09 05:18:22 1.31
@@ -2453,7 +2453,6 @@
{
core_dir_config *d =
(core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
- ap_time_t *temp;
int rangestatus, errstatus;
ap_file_t *fd = NULL;
ap_status_t status;
1.25 +9 -2 apache-2.0/src/main/http_log.c
Index: http_log.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_log.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- http_log.c 2000/01/06 14:43:26 1.24
+++ http_log.c 2000/01/09 05:18:23 1.25
@@ -359,7 +359,11 @@
}
if (logf && ((level & APLOG_STARTUP) != APLOG_STARTUP)) {
- len = ap_snprintf(errstr, MAX_STRING_LEN, "[%s] ", ap_get_time());
+ errstr[0] = '[';
+ ap_ctime(errstr + 1, ap_now());
+ errstr[1 + AP_CTIME_LEN - 1] = ']';
+ errstr[1 + AP_CTIME_LEN ] = ' ';
+ len = 1 + AP_CTIME_LEN + 1;
} else {
len = 0;
}
@@ -581,9 +585,12 @@
API_EXPORT(void) ap_log_assert(const char *szExp, const char *szFile, int nLine)
{
+ char time_str[AP_CTIME_LEN];
+
+ ap_ctime(time_str, ap_now());
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
"[%s] file %s, line %d, assertion \"%s\" failed",
- ap_get_time(), szFile, nLine, szExp);
+ time_str, szFile, nLine, szExp);
#ifndef WIN32
/* unix assert does an abort leading to a core dump */
abort();
1.46 +21 -40 apache-2.0/src/main/http_protocol.c
Index: http_protocol.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_protocol.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- http_protocol.c 2000/01/06 14:43:27 1.45
+++ http_protocol.c 2000/01/09 05:18:23 1.46
@@ -368,9 +368,9 @@
* to limit the number of calls to time(). We don't check for futurosity
* unless the mtime is at least as new as the reference.
*/
-API_EXPORT(ap_time_t *) ap_rationalize_mtime(request_rec *r, ap_time_t *mtime)
+API_EXPORT(ap_time_t) ap_rationalize_mtime(request_rec *r, ap_time_t mtime)
{
- ap_time_t *now;
+ ap_time_t now;
/* For all static responses, it's almost certain that the file was
* last modified before the beginning of the request. So there's
@@ -381,26 +381,15 @@
* were given a time in the future, we return the current time - the
* Last-Modified can't be in the future.
*/
- if (ap_timecmp(mtime, r->request_time) == APR_LESS) {
- now = r->request_time;
- }
- else {
- ap_make_time(&now, r->pool);
- ap_current_time(now);
- }
- if (ap_timecmp(mtime, now) == APR_MORE) {
- return now;
- }
- else {
- return mtime;
- }
+ now = (mtime < r->request_time) ? r->request_time : ap_now();
+ return (mtime > now) ? now : mtime;
}
API_EXPORT(int) ap_meets_conditions(request_rec *r)
{
const char *etag = ap_table_get(r->headers_out, "ETag");
const char *if_match, *if_modified_since, *if_unmodified, *if_nonematch;
- ap_time_t *mtime;
+ ap_time_t mtime;
/* Check for conditional requests --- note that we only want to do
* this if we are successful so far and we are not processing a
@@ -417,13 +406,8 @@
return OK;
}
- if (r->mtime == NULL) {
- ap_make_time(&mtime, r->pool);
- ap_current_time(mtime);
- }
- else {
- mtime = r->mtime;
- }
+ /* XXX: we should define a "time unset" constant */
+ mtime = (r->mtime != 0) ? r->mtime : ap_now();
/* If an If-Match request-header field was given
* AND the field value is not "*" (meaning match anything)
@@ -445,9 +429,9 @@
*/
if_unmodified = ap_table_get(r->headers_in, "If-Unmodified-Since");
if (if_unmodified != NULL) {
- ap_time_t *ius = ap_parseHTTPdate(if_unmodified, r->pool);
+ ap_time_t ius = ap_parseHTTPdate(if_unmodified);
- if ((ius != NULL) && (ap_timecmp(mtime, ius) == APR_MORE)) {
+ if ((ius != BAD_DATE) && (mtime > ius)) {
return HTTP_PRECONDITION_FAILED;
}
}
@@ -498,10 +482,9 @@
else if ((r->method_number == M_GET)
&& ((if_modified_since =
ap_table_get(r->headers_in, "If-Modified-Since")) != NULL)) {
- ap_time_t *ims = ap_parseHTTPdate(if_modified_since, r->pool);
+ ap_time_t ims = ap_parseHTTPdate(if_modified_since);
- if (!ap_timecmp(ims, mtime) < APR_LESS &&
- !ap_timecmp(ims, r->request_time) > APR_MORE) {
+ if ((ims >= mtime) && (ims <= r->request_time)) {
return HTTP_NOT_MODIFIED;
}
}
@@ -519,7 +502,6 @@
{
char *etag;
char *weak;
- int diff;
/*
* Make an ETag header out of various pieces of information. We use
@@ -534,8 +516,7 @@
* would be incorrect.
*/
- ap_timediff(r->request_time, r->mtime, &diff);
- weak = ((diff > 1) && !force_weak) ? "" : "W/";
+ weak = ((r->request_time - r->mtime > AP_USEC_PER_SEC) && !force_weak) ? "" : "W/";
if (r->finfo.protection != 0) {
etag = ap_psprintf(r->pool,
@@ -603,9 +584,9 @@
*/
API_EXPORT(void) ap_set_last_modified(request_rec *r)
{
- ap_time_t *mod_time = ap_rationalize_mtime(r, r->mtime);
- char *datestr;
- ap_timestr(&datestr, mod_time, APR_UTCTIME, r->pool);
+ ap_time_t mod_time = ap_rationalize_mtime(r, r->mtime);
+ char *datestr = ap_palloc(r->pool, AP_RFC822_DATE_LEN);
+ ap_rfc822_date(datestr, mod_time);
ap_table_setn(r->headers_out, "Last-Modified", datestr);
}
@@ -822,7 +803,7 @@
/* this is a hack to make sure that request time is set,
* it's not perfect, but it's better than nothing
*/
- ap_current_time(r->request_time);
+ r->request_time = ap_now();
return 0;
}
}
@@ -841,7 +822,7 @@
/* //ap_bsetflag(conn->client, B_SAFEREAD, 0); */
- ap_current_time(r->request_time);
+ r->request_time = ap_now();
r->the_request = ap_pstrdup(r->pool, l);
r->method = ap_getword_white(r->pool, &ll);
ap_update_connection_status(conn->id, "Method", r->method);
@@ -975,8 +956,6 @@
r->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */
r->the_request = NULL;
- ap_make_time(&r->request_time, r->pool);
- ap_make_time(&r->mtime, r->pool);
#ifdef CHARSET_EBCDIC
ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1);
@@ -1362,7 +1341,8 @@
ap_rvputs(r, protocol, " ", r->status_line, "\015\012", NULL);
- ap_timestr(&date, r->request_time, APR_UTCTIME, r->pool);
+ date = ap_palloc(r->pool, AP_RFC822_DATE_LEN);
+ ap_rfc822_date(date, r->request_time);
ap_send_header_field(r, "Date", date);
ap_send_header_field(r, "Server", ap_get_server_version());
@@ -1645,7 +1625,8 @@
* some other part of the server configuration.
*/
if (r->no_cache && !ap_table_get(r->headers_out, "Expires")) {
- ap_timestr(&date, r->request_time, APR_UTCTIME, r->pool);
+ date = ap_palloc(r->pool, AP_RFC822_DATE_LEN);
+ ap_rfc822_date(date, r->request_time);
ap_table_addn(r->headers_out, "Expires", date);
}
1.14 +3 -4 apache-2.0/src/main/http_request.c
Index: http_request.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_request.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- http_request.c 2000/01/06 19:16:07 1.13
+++ http_request.c 2000/01/09 05:18:23 1.14
@@ -1374,10 +1374,9 @@
* Function to set the r->mtime field to the specified value if it's later
* than what's already there.
*/
-API_EXPORT(ap_time_t *) ap_update_mtime(request_rec *r, ap_time_t *dependency_mtime)
+API_EXPORT(void) ap_update_mtime(request_rec *r, ap_time_t dependency_mtime)
{
- if (ap_timecmp(r->mtime, dependency_mtime) == APR_LESS) {
- r->mtime = dependency_mtime;
+ if (r->mtime < dependency_mtime) {
+ r->mtime = dependency_mtime;
}
- return r->mtime;
}
1.25 +10 -22 apache-2.0/src/main/util.c
Index: util.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/util.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- util.c 2000/01/06 14:43:28 1.24
+++ util.c 2000/01/09 05:18:24 1.25
@@ -92,18 +92,6 @@
*/
#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f))
-API_EXPORT(char *) ap_get_time()
-{
- ap_time_t *t = NULL;
- char *time_string = NULL;
-
- ap_make_time(&t, NULL);
- ap_current_time(t);
-
- ap_timestr(&time_string, t, APR_LOCALTIME, NULL);
- return (time_string);
-}
-
/*
* Examine a field value (such as a media-/content-type) string and return
* it sans any parameters; e.g., strip off any ';charset=foo' and the like.
@@ -124,25 +112,22 @@
}
}
-API_EXPORT(char *) ap_ht_time(ap_context_t *p, ap_time_t *t, const char *fmt, int gmt)
+API_EXPORT(char *) ap_ht_time(ap_context_t *p, ap_time_t t, const char *fmt, int gmt)
{
ap_int32_t retcode;
char ts[MAX_STRING_LEN];
char tf[MAX_STRING_LEN];
+ ap_exploded_time_t xt;
if (gmt) {
- ap_explode_time(t, APR_UTCTIME);
- }
- else {
- ap_explode_time(t, APR_LOCALTIME);
- }
- if(gmt) {
+ const char *f;
+ char *strp;
+
+ ap_explode_gmt(&xt, t);
/* Convert %Z to "GMT" and %z to "+0000";
* on hosts that do not have a time zone string in struct tm,
* strftime must assume its argument is local time.
*/
- const char *f;
- char *strp;
for(strp = tf, f = fmt; strp < tf + sizeof(tf) - 6 && (*strp = *f)
; f++, strp++) {
if (*f != '%') continue;
@@ -169,9 +154,12 @@
*strp = '\0';
fmt = tf;
}
+ else {
+ ap_explode_localtime(&xt, t);
+ }
/* check return code? */
- ap_strftime(ts, &retcode, MAX_STRING_LEN, fmt, t);
+ ap_strftime(ts, &retcode, MAX_STRING_LEN, fmt, &xt);
ts[MAX_STRING_LEN - 1] = '\0';
return ap_pstrdup(p, ts);
}
1.8 +46 -52 apache-2.0/src/main/util_date.c
Index: util_date.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/util_date.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- util_date.c 1999/12/21 21:41:48 1.7
+++ util_date.c 2000/01/09 05:18:24 1.8
@@ -125,6 +125,7 @@
return 0; /* We only get here if mask is corrupted (exceeds 256) */
}
+
/*
* Parses an HTTP date in one of three standard forms:
*
@@ -172,16 +173,12 @@
* but many changes since then.
*
*/
-API_EXPORT(ap_time_t *) ap_parseHTTPdate(const char *date, ap_context_t *cont)
+API_EXPORT(ap_time_t) ap_parseHTTPdate(const char *date)
{
- ap_int32_t year;
- ap_int32_t mday;
- ap_int32_t hour;
- ap_int32_t min;
- ap_int32_t sec;
+ ap_exploded_time_t ds;
+ ap_time_t result;
int mint, mon;
const char *monstr, *timstr;
- ap_time_t *temp;
static const int months[12] =
{
('J' << 16) | ('a' << 8) | 'n', ('F' << 16) | ('e' << 8) | 'b',
@@ -192,99 +189,96 @@
('N' << 16) | ('o' << 8) | 'v', ('D' << 16) | ('e' << 8) | 'c'};
if (!date)
- return NULL;
+ return BAD_DATE;
while (*date && ap_isspace(*date)) /* Find first non-whitespace char */
++date;
if (*date == '\0')
- return NULL;
+ return BAD_DATE;
if ((date = strchr(date, ' ')) == NULL) /* Find space after weekday */
- return NULL;
+ return BAD_DATE;
++date; /* Now pointing to first char after space, which should be */
/* start of the actual date information for all 3 formats. */
if (ap_checkmask(date, "## @$$ #### ##:##:## *")) { /* RFC 1123 format */
- year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100;
- if (year < 0)
- return NULL;
+ ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return BAD_DATE;
- year += ((date[9] - '0') * 10) + (date[10] - '0');
+ ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0');
- mday = ((date[0] - '0') * 10) + (date[1] - '0');
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
monstr = date + 3;
timstr = date + 12;
}
else if (ap_checkmask(date, "##-@$$-## ##:##:## *")) { /* RFC 850 format */
- year = ((date[7] - '0') * 10) + (date[8] - '0');
- if (year < 70)
- year += 100;
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
- mday = ((date[0] - '0') * 10) + (date[1] - '0');
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
monstr = date + 3;
timstr = date + 10;
}
else if (ap_checkmask(date, "@$$ ~# ##:##:## ####*")) { /* asctime format */
- year = ((date[16] - '0') * 10 + (date[17] - '0') - 19) * 100;
- if (year < 0)
- return NULL;
+ ds.tm_year = ((date[16] - '0') * 10 + (date[17] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return BAD_DATE;
- year += ((date[18] - '0') * 10) + (date[19] - '0');
+ ds.tm_year += ((date[18] - '0') * 10) + (date[19] - '0');
if (date[4] == ' ')
- mday = 0;
+ ds.tm_mday = 0;
else
- mday = (date[4] - '0') * 10;
+ ds.tm_mday = (date[4] - '0') * 10;
- mday += (date[5] - '0');
+ ds.tm_mday += (date[5] - '0');
monstr = date;
timstr = date + 7;
}
else
- return NULL;
+ return BAD_DATE;
- if (mday <= 0 || mday > 31)
- return NULL;
+ if (ds.tm_mday <= 0 || ds.tm_mday > 31)
+ return BAD_DATE;
- hour = ((timstr[0] - '0') * 10) + (timstr[1] - '0');
- min = ((timstr[3] - '0') * 10) + (timstr[4] - '0');
- sec = ((timstr[6] - '0') * 10) + (timstr[7] - '0');
+ ds.tm_hour = ((timstr[0] - '0') * 10) + (timstr[1] - '0');
+ ds.tm_min = ((timstr[3] - '0') * 10) + (timstr[4] - '0');
+ ds.tm_sec = ((timstr[6] - '0') * 10) + (timstr[7] - '0');
- if ((hour > 23) || (min > 59) || (sec > 61))
- return NULL;
+ if ((ds.tm_hour > 23) || (ds.tm_min > 59) || (ds.tm_sec > 61))
+ return BAD_DATE;
mint = (monstr[0] << 16) | (monstr[1] << 8) | monstr[2];
for (mon = 0; mon < 12; mon++)
if (mint == months[mon])
break;
if (mon == 12)
- return NULL;
+ return BAD_DATE;
- if ((mday == 31) && (mon == 3 || mon == 5 || mon == 8 || mon == 10))
- return NULL;
+ if ((ds.tm_mday == 31) && (mon == 3 || mon == 5 || mon == 8 || mon == 10))
+ return BAD_DATE;
/* February gets special check for leapyear */
if ((mon == 1) &&
- ((mday > 29)
- || ((mday == 29)
- && ((year & 3)
- || (((year % 100) == 0)
- && (((year % 400) != 100)))))))
- return NULL;
-
- ap_make_time(&temp, cont);
- ap_set_year(temp, year);
- ap_set_mday(temp, mday);
- ap_set_hour(temp, hour);
- ap_set_min(temp, min);
- ap_set_sec(temp, sec);
- ap_set_mon(temp, mon);
+ ((ds.tm_mday > 29)
+ || ((ds.tm_mday == 29)
+ && ((ds.tm_year & 3)
+ || (((ds.tm_year % 100) == 0)
+ && (((ds.tm_year % 400) != 100)))))))
+ return BAD_DATE;
+
+ ds.tm_mon = mon;
- return temp;
+ if (ap_implode_time(&result, &ds) != APR_SUCCESS) {
+ return BAD_DATE;
+ }
+ return result;
}
1.22 +1 -3 apache-2.0/src/main/util_script.c
Index: util_script.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/util_script.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- util_script.c 1999/12/31 01:27:43 1.21
+++ util_script.c 2000/01/09 05:18:24 1.22
@@ -589,9 +589,7 @@
* pass it on blindly because of restrictions on future values.
*/
else if (!strcasecmp(w, "Last-Modified")) {
- ap_time_t *mtime = ap_parseHTTPdate(l, r->pool);
-
- ap_update_mtime(r, mtime);
+ ap_update_mtime(r, ap_parseHTTPdate(l));
ap_set_last_modified(r);
}
else if (!strcasecmp(w, "Set-Cookie")) {
1.6 +8 -10 apache-2.0/src/modules/experimental/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/experimental/Makefile.tmpl,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Makefile.tmpl 1999/11/20 12:55:26 1.5
+++ Makefile.tmpl 2000/01/09 05:18:29 1.6
@@ -7,18 +7,16 @@
mod_mmap_static.o: mod_mmap_static.c $(INCDIR)/httpd.h \
$(INCDIR)/ap_config.h $(INCDIR)/ap_mmn.h \
$(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
- $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h \
- ../../lib/apr/include/apr_general.h \
- ../../lib/apr/include/apr_config.h ../../lib/apr/include/apr_errno.h \
+ $(OSDIR)/os-inline.c $(INCDIR)/ap_ctype.h \
+ $(INCDIR)/hsregex.h ../../lib/apr/include/apr_general.h \
+ ../../lib/apr/include/apr.h ../../lib/apr/include/apr_errno.h \
../../lib/apr/include/apr_lib.h ../../lib/apr/include/apr_file_io.h \
- $(INCDIR)/buff.h $(INCDIR)/ap_iol.h $(INCDIR)/ap.h \
- $(INCDIR)/apr.h $(INCDIR)/util_uri.h \
+ ../../lib/apr/include/apr_time.h \
+ ../../lib/apr/include/apr_thread_proc.h $(INCDIR)/buff.h \
+ $(INCDIR)/ap_iol.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
$(INCDIR)/http_config.h $(INCDIR)/ap_hooks.h \
$(INCDIR)/http_log.h $(INCDIR)/http_protocol.h \
../../lib/apr/include/apr_portable.h \
- ../../lib/apr/include/apr_thread_proc.h \
- ../../lib/apr/include/apr_win.h \
../../lib/apr/include/apr_network_io.h \
- ../../lib/apr/include/apr_lock.h ../../lib/apr/include/apr_time.h \
- ../../lib/apr/include/apr_mmap.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h
+ ../../lib/apr/include/apr_lock.h ../../lib/apr/include/apr_mmap.h \
+ $(INCDIR)/http_request.h $(INCDIR)/http_core.h
1.19 +5 -6 apache-2.0/src/modules/standard/mod_autoindex.c
Index: mod_autoindex.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_autoindex.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- mod_autoindex.c 2000/01/07 20:38:05 1.18
+++ mod_autoindex.c 2000/01/09 05:18:29 1.19
@@ -678,7 +678,7 @@
char *alt;
char *desc;
off_t size;
- time_t lm;
+ ap_time_t lm;
struct ent *next;
int ascending;
char key;
@@ -1162,7 +1162,7 @@
request_rec *rr = ap_sub_req_lookup_file(name, r);
if (rr->finfo.protection != 0) {
- ap_get_ansitime(rr->finfo.mtime, (ap_int64_t *)&p->lm);
+ p->lm = rr->finfo.mtime;
if (S_ISDIR(rr->finfo.protection)) {
if (!(p->icon = find_icon(d, rr, 1))) {
p->icon = find_default_icon(d, "^^DIRECTORY^^");
@@ -1404,11 +1404,10 @@
if (!(autoindex_opts & SUPPRESS_LAST_MOD)) {
if (ar[x]->lm != -1) {
char time_str[MAX_STRING_LEN];
- ap_time_t *ts = NULL;
- ap_make_time(&ts, r->pool);
- ap_set_ansitime(ts, ar[x]->lm);
+ ap_exploded_time_t ts;
+ ap_explode_localtime(&ts, ar[x]->lm);
ap_strftime(time_str, &rv, MAX_STRING_LEN,
- "%d-%b-%Y %H:%M ", ts);
+ "%d-%b-%Y %H:%M ", &ts);
ap_rputs(time_str, r);
}
else {
1.24 +6 -2 apache-2.0/src/modules/standard/mod_cgi.c
Index: mod_cgi.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_cgi.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- mod_cgi.c 2000/01/06 14:43:38 1.23
+++ mod_cgi.c 2000/01/09 05:18:30 1.24
@@ -168,6 +168,7 @@
{
ap_file_t *f = NULL;
struct stat finfo;
+ char time_str[AP_CTIME_LEN];
ap_log_rerror(APLOG_MARK, show_errno|APLOG_ERR, errno, r,
"%s: %s", error, r->filename);
@@ -181,7 +182,8 @@
}
/* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */
- ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", ap_get_time(), r->method, r->uri,
+ ap_ctime(time_str, ap_now());
+ ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri,
r->args ? "?" : "", r->args ? r->args : "", r->protocol);
/* "%% 500 /usr/local/apache/cgi-bin */
ap_fprintf(f, "%%%% %d %s\n", ret, r->filename);
@@ -201,6 +203,7 @@
ap_file_t *f = NULL;
int i;
struct stat finfo;
+ char time_str[AP_CTIME_LEN];
if (!conf->logname ||
((stat(ap_server_root_relative(r->pool, conf->logname), &finfo) == 0)
@@ -227,7 +230,8 @@
}
/* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */
- ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", ap_get_time(), r->method, r->uri,
+ ap_ctime(time_str, ap_now());
+ ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri,
r->args ? "?" : "", r->args ? r->args : "", r->protocol);
/* "%% 500 /usr/local/apache/cgi-bin" */
ap_fprintf(f, "%%%% %d %s\n", ret, r->filename);
1.3 +6 -2 apache-2.0/src/modules/standard/mod_cgid.c
Index: mod_cgid.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_cgid.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_cgid.c 2000/01/04 19:01:01 1.2
+++ mod_cgid.c 2000/01/09 05:18:30 1.3
@@ -668,6 +668,7 @@
{
ap_file_t *f = NULL;
struct stat finfo;
+ char time_str[AP_CTIME_LEN];
ap_log_rerror(APLOG_MARK, show_errno|APLOG_ERR, errno, r,
"%s: %s", error, r->filename);
@@ -681,7 +682,8 @@
}
/* "%% [Wed Jun 19 10:53:21 1996] GET /cgid-bin/printenv HTTP/1.0" */
- ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", ap_get_time(), r->method, r->uri,
+ ap_ctime(time_str, ap_now());
+ ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri,
r->args ? "?" : "", r->args ? r->args : "", r->protocol);
/* "%% 500 /usr/local/apache/cgid-bin */
ap_fprintf(f, "%%%% %d %s\n", ret, r->filename);
@@ -701,6 +703,7 @@
ap_file_t *f = NULL;
int i;
struct stat finfo;
+ char time_str[AP_CTIME_LEN];
if (!conf->logname ||
((stat(ap_server_root_relative(r->pool, conf->logname), &finfo) == 0)
@@ -716,7 +719,8 @@
}
/* "%% [Wed Jun 19 10:53:21 1996] GET /cgid-bin/printenv HTTP/1.0" */
- ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", ap_get_time(), r->method, r->uri,
+ ap_ctime(time_str, ap_now());
+ ap_fprintf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri,
r->args ? "?" : "", r->args ? r->args : "", r->protocol);
/* "%% 500 /usr/local/apache/cgid-bin" */
ap_fprintf(f, "%%%% %d %s\n", ret, r->filename);
1.8 +12 -16 apache-2.0/src/modules/standard/mod_expires.c
Index: mod_expires.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_expires.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- mod_expires.c 2000/01/07 15:52:18 1.7
+++ mod_expires.c 2000/01/09 05:18:30 1.8
@@ -196,6 +196,7 @@
#include "httpd.h"
#include "http_config.h"
#include "http_log.h"
+#include "http_request.h"
typedef struct {
int active;
@@ -402,12 +403,10 @@
{
expires_dir_config *conf;
char *code;
- char *timestr = NULL;
- ap_ansi_time_t base;
- time_t additional;
- time_t expires;
- ap_time_t *finaltime = NULL;
- char age[20];
+ ap_time_t base;
+ ap_time_t additional;
+ ap_time_t expires;
+ char *timestr;
if (ap_is_HTTP_ERROR(r->status)) /* Don't add Expires headers to errors */
return DECLINED;
@@ -459,14 +458,14 @@
*/
return DECLINED;
}
- ap_get_ansitime(r->finfo.mtime, &base);
+ base = r->finfo.mtime;
additional = atoi(&code[1]);
break;
case 'A':
/* there's been some discussion and it's possible that
* 'access time' will be stored in request structure
*/
- ap_get_ansitime(r->request_time, &base);
+ base = r->request_time;
additional = atoi(&code[1]);
break;
default:
@@ -479,14 +478,11 @@
};
expires = base + additional;
- ap_snprintf(age, sizeof(age), "max-age=%d", (int) expires - (int) r->request_time);
- ap_table_setn(r->headers_out, "Cache-Control", ap_pstrdup(r->pool, age));
- tzset(); /* redundant? called implicitly by localtime, at least
- * under FreeBSD
- */
- ap_make_time(&finaltime, r->pool);
- ap_set_ansitime(finaltime, expires);
- ap_timestr(×tr, finaltime, APR_UTCTIME, r->pool);
+ ap_table_setn(r->headers_out, "Cache-Control",
+ ap_psprintf(r->pool, "max-age=%qd",
+ (expires - r->request_time) / AP_USEC_PER_SEC));
+ timestr = ap_palloc(r->pool, AP_RFC822_DATE_LEN);
+ ap_rfc822_date(timestr, expires);
ap_table_setn(r->headers_out, "Expires", timestr);
return OK;
}
1.17 +5 -8 apache-2.0/src/modules/standard/mod_include.c
Index: mod_include.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_include.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- mod_include.c 2000/01/06 19:19:38 1.16
+++ mod_include.c 2000/01/09 05:18:30 1.17
@@ -124,10 +124,8 @@
#endif /* ndef WIN32 */
ap_table_t *e = r->subprocess_env;
char *t;
- ap_time_t *date = r->request_time;
- ap_time_t *mtime = NULL;
+ ap_time_t date = r->request_time;
-
ap_table_setn(e, "DATE_LOCAL", ap_ht_time(r->pool, date, timefmt, 0));
ap_table_setn(e, "DATE_GMT", ap_ht_time(r->pool, date, timefmt, 1));
ap_table_setn(e, "LAST_MODIFIED",
@@ -1023,7 +1021,7 @@
parse_string(r, tag_val, error, MAX_STRING_LEN, 0);
}
else if (!strcmp(tag, "timefmt")) {
- ap_time_t *date = r->request_time;
+ ap_time_t date = r->request_time;
parse_string(r, tag_val, tf, MAX_STRING_LEN, 0);
ap_table_setn(env, "DATE_LOCAL", ap_ht_time(r->pool, date, tf, 0));
@@ -1170,7 +1168,6 @@
char *tag_val;
struct stat finfo;
char parsed_string[MAX_STRING_LEN];
- ap_time_t *mtime = NULL;
while (1) {
if (!(tag_val = get_tag(r->pool, in, tag, sizeof(tag), 1))) {
@@ -1182,8 +1179,9 @@
else {
parse_string(r, tag_val, parsed_string, sizeof(parsed_string), 0);
if (!find_file(r, "flastmod", tag, parsed_string, &finfo, error)) {
- ap_make_time(&mtime, r->pool);
- ap_set_ansitime(mtime, finfo.st_mtime);
+ ap_time_t mtime;
+
+ ap_ansi_time_to_ap_time(&mtime, finfo.st_mtime);
ap_rputs(ap_ht_time(r->pool, mtime, tf, 0), r);
}
}
@@ -2346,7 +2344,6 @@
(enum xbithack *) ap_get_module_config(r->per_dir_config, &includes_module);
int errstatus;
request_rec *parent;
- ap_time_t *mtime = NULL;
if (!(ap_allow_options(r) & OPT_INCLUDES)) {
return DECLINED;
1.13 +34 -28 apache-2.0/src/modules/standard/mod_log_config.c
Index: mod_log_config.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_log_config.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- mod_log_config.c 1999/12/30 18:31:29 1.12
+++ mod_log_config.c 2000/01/09 05:18:31 1.13
@@ -380,34 +380,46 @@
static const char *log_request_time(request_rec *r, char *a)
{
- int timz;
- ap_int32_t mday, year, hour, min, sec, month;
- ap_time_t *t;
+ ap_exploded_time_t xt;
+ ap_status_t retcode;
char tstr[MAX_STRING_LEN];
- ap_int32_t retcode;
- ap_make_time(&t, r->pool);
- ap_get_gmtoff(&timz, t, r->pool);
-
+ /*
+ hi. i think getting the time again at the end of the request
+ just for logging is dumb. i know it's "required" for CLF.
+ folks writing log parsing tools don't realise that out of order
+ times have always been possible (consider what happens if one
+ process calculates the time to log, but then there's a context
+ switch before it writes and before that process is run again the
+ log rotation occurs) and they should just fix their tools rather
+ than force the server to pay extra cpu cycles. if you've got
+ a problem with this, you can set the define. -djg
+ */
+#ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE
+ ap_explode_localtime(&xt, ap_now());
+#else
+ ap_explode_localtime(&xt, r->request_time);
+#endif
if (a && *a) { /* Custom format */
- ap_strftime(tstr, &retcode, MAX_STRING_LEN, a, t);
+ ap_strftime(tstr, &retcode, MAX_STRING_LEN, a, &xt);
}
else { /* CLF format */
- char sign = (timz < 0 ? '-' : '+');
+ char sign;
+ int timz;
+
+ timz = xt.tm_gmtoff;
+ if (timz < 0) {
+ timz = -timz;
+ sign = '-';
+ }
+ else {
+ sign = '+';
+ }
- if (timz < 0) {
- timz = -timz;
- }
- ap_get_mday(t, &mday);
- ap_get_year(t, &year);
- ap_get_hour(t, &month);
- ap_get_hour(t, &hour);
- ap_get_min(t, &min);
- ap_get_sec(t, &sec);
ap_snprintf(tstr, sizeof(tstr), "[%02d/%s/%d:%02d:%02d:%02d %c%.2d%.2d]",
- mday, ap_month_snames[month], year+1900,
- hour, min, sec,
- sign, timz / 60, timz % 60);
+ xt.tm_mday, ap_month_snames[xt.tm_mon], xt.tm_year+1900,
+ xt.tm_hour, xt.tm_min, xt.tm_sec,
+ sign, timz / (60*60), timz % (60*60));
}
return ap_pstrdup(r->pool, tstr);
@@ -415,13 +427,7 @@
static const char *log_request_duration(request_rec *r, char *a)
{
- ap_time_t *currtime = NULL;
- ap_int32_t diff;
- ap_make_time(&currtime, r->pool);
- ap_current_time(currtime);
-
- ap_timediff(currtime, r->request_time, &diff);
- return ap_psprintf(r->pool, "%ld", diff);
+ return ap_psprintf(r->pool, "%ld", (ap_now() - r->request_time) / AP_USEC_PER_SEC);
}
/* These next two routines use the canonical name:port so that log
1.11 +22 -45 apache-2.0/src/modules/standard/mod_rewrite.c
Index: mod_rewrite.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_rewrite.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- mod_rewrite.c 2000/01/07 20:38:06 1.10
+++ mod_rewrite.c 2000/01/09 05:18:31 1.11
@@ -3264,22 +3264,16 @@
static char *current_logtime(request_rec *r)
{
- int timz;
- ap_time_t *t;
+ ap_exploded_time_t t;
char tstr[80];
- char sign;
- ap_int32_t len;
+ ap_size_t len;
- ap_make_time(&t, r->pool);
- ap_get_gmtoff(&timz, t, r->pool);
- sign = (timz < 0 ? '-' : '+');
- if (timz < 0) {
- timz = -timz;
- }
+ ap_explode_localtime(&t, ap_now());
- ap_strftime(tstr, &len, 80, "[%d/%b/%Y:%H:%M:%S ", t);
+ ap_strftime(tstr, &len, 80, "[%d/%b/%Y:%H:%M:%S ", &t);
ap_snprintf(tstr + strlen(tstr), 80-strlen(tstr), "%c%.2d%.2d]",
- sign, timz/60, timz%60);
+ t.tm_gmtoff < 0 ? '-' : '+',
+ t.tm_gmtoff / (60*60), t.tm_gmtoff % (60*60));
return ap_pstrdup(r->pool, tstr);
}
@@ -3556,14 +3550,7 @@
{
const char *result;
char resultbuf[LONG_STRING_LEN];
- ap_time_t *tm = NULL;
- ap_int32_t tmvalue = 0;
- ap_int32_t year;
- ap_int32_t mon;
- ap_int32_t mday;
- ap_int32_t hour;
- ap_int32_t min;
- ap_int32_t sec;
+ ap_exploded_time_t tm;
request_rec *rsub;
#ifndef WIN32
struct passwd *pw;
@@ -3671,51 +3658,41 @@
result = resultbuf;
}
+/* XXX: wow this has gotta be slow if you actually use it for a lot, recalculates exploded time for each variable */
/* underlaying Unix system stuff */
else if (strcasecmp(var, "TIME_YEAR") == 0) {
- ap_make_init_time(&tm, r->pool);
- ap_explode_time(tm, APR_LOCALTIME);
- ap_get_year(tm, &year);
- ap_snprintf(resultbuf, sizeof(resultbuf), "%02d%02d",
- (year / 100) + 19, year % 100);
+ ap_explode_localtime(&tm, ap_now());
+ ap_snprintf(resultbuf, sizeof(resultbuf), "%04d", tm.tm_year + 1900);
result = resultbuf;
}
#define MKTIMESTR(format, tmfield) \
- ap_make_init_time(&tm, r->pool); \
- ap_explode_time(tm, APR_LOCALTIME); \
- ap_get_tmfield(tm, &tmvalue); \
- ap_snprintf(resultbuf, sizeof(resultbuf), format, tmvalue); \
+ ap_explode_localtime(&tm, ap_now()); \
+ ap_snprintf(resultbuf, sizeof(resultbuf), format, tm.tmfield); \
result = resultbuf;
else if (strcasecmp(var, "TIME_MON") == 0) {
- MKTIMESTR("%02d", mon+1)
+ MKTIMESTR("%02d", tm_mon+1)
}
else if (strcasecmp(var, "TIME_DAY") == 0) {
- MKTIMESTR("%02d", mday)
+ MKTIMESTR("%02d", tm_mday)
}
else if (strcasecmp(var, "TIME_HOUR") == 0) {
- MKTIMESTR("%02d", hour)
+ MKTIMESTR("%02d", tm_hour)
}
else if (strcasecmp(var, "TIME_MIN") == 0) {
- MKTIMESTR("%02d", min)
+ MKTIMESTR("%02d", tm_min)
}
else if (strcasecmp(var, "TIME_SEC") == 0) {
- MKTIMESTR("%02d", sec)
+ MKTIMESTR("%02d", tm_sec)
}
else if (strcasecmp(var, "TIME_WDAY") == 0) {
- MKTIMESTR("%d", wday)
+ MKTIMESTR("%d", tm_wday)
}
else if (strcasecmp(var, "TIME") == 0) {
- ap_make_init_time(&tm, r->pool);
- ap_explode_time(tm, APR_LOCALTIME);
- ap_get_year(tm, &year);
- ap_get_mon(tm, &mon);
- ap_get_mday(tm, &mday);
- ap_get_hour(tm, &hour);
- ap_get_min(tm, &min);
- ap_get_sec(tm, &sec);
+ ap_explode_localtime(&tm, ap_now());
ap_snprintf(resultbuf, sizeof(resultbuf),
- "%02d%02d%02d%02d%02d%02d%02d", (year / 100) + 19,
- (year % 100), mon+1, mday, hour, min, sec);
+ "%04d%02d%02d%02d%02d%02d", tm.tm_year + 1900,
+ tm.tm_mon+1, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec);
result = resultbuf;
rewritelog(r, 1, "RESULT='%s'", result);
}
1.7 +1 -5 apache-2.0/src/modules/standard/mod_status.c
Index: mod_status.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_status.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- mod_status.c 1999/12/31 20:32:35 1.6
+++ mod_status.c 2000/01/09 05:18:31 1.7
@@ -82,11 +82,7 @@
int i;
ap_array_header_t *server_status;
ap_status_table_row_t *status_rows;
- ap_time_t *nowtime = NULL;
- ap_make_time(&nowtime, r->pool);
- ap_current_time(nowtime);
-
r->allowed = (1 << M_GET);
if (r->method_number != M_GET)
return DECLINED;
@@ -110,7 +106,7 @@
ap_rvputs(r, "Server Built: ",
ap_get_server_built(), "<br>\n<hr>\n", NULL);
ap_rvputs(r, "Current Time: ",
- ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0), "<br>\n", NULL);
+ ap_ht_time(r->pool, ap_now(), DEFAULT_TIME_FORMAT, 0), "<br>\n", NULL);
ap_rprintf(r, "\n%d connections currently being processed\n",
server_status->nelts);
1.10 +13 -70 apache-2.0/src/modules/standard/mod_usertrack.c
Index: mod_usertrack.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_usertrack.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- mod_usertrack.c 2000/01/07 20:38:06 1.9
+++ mod_usertrack.c 2000/01/09 05:18:31 1.10
@@ -102,18 +102,13 @@
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
-#if !defined(WIN32) && !defined(MPE)
-#include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_TIMES_H
-#include <sys/times.h>
-#endif
+#include "http_request.h"
module MODULE_VAR_EXPORT usertrack_module;
typedef struct {
int always;
- time_t expires;
+ int expires;
} cookie_log_state;
typedef struct {
@@ -121,11 +116,6 @@
char *cookie_name;
} cookie_dir_rec;
-/* Define this to allow post-2000 cookies. Cookies use two-digit dates,
- * so it might be dicey. (Netscape does it correctly, but others may not)
- */
-#define MILLENIAL_COOKIES
-
/* Make Cookie: Now we have to generate something that is going to be
* pretty unique. We can base it on the pid, time, hostip */
@@ -135,13 +125,6 @@
{
cookie_log_state *cls = ap_get_module_config(r->server->module_config,
&usertrack_module);
-#if !defined(HAVE_GETTIMEOFDAY) && defined(HAVE_TIMES)
- clock_t mpe_times;
- struct tms mpe_tms;
-#elif !defined(WIN32)
- struct timeval tv;
- struct timezone tz = {0, 0};
-#endif
/* 1024 == hardcoded constant */
char cookiebuf[1024];
char *new_cookie;
@@ -151,61 +134,21 @@
dcfg = ap_get_module_config(r->per_dir_config, &usertrack_module);
-#if !defined(HAVE_GETTIMEOFDAY) && defined(HAVE_TIMES)
-/* We lack gettimeofday(), so we must use time() to obtain the epoch
- seconds, and then times() to obtain CPU clock ticks (milliseconds).
- Combine this together to obtain a hopefully unique cookie ID. */
-
- mpe_times = times(&mpe_tms);
-
- ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname,
- (int) getpid(),
- (long) r->request_time, (long) mpe_tms.tms_utime);
-#elif defined(WIN32)
- /*
- * We lack gettimeofday() and we lack times(). So we'll use a combination
- * of time() and GetTickCount(), which returns milliseconds since Windows
- * was started. It should be relatively unique.
- */
-
- ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%ld", rname,
- (int) getpid(),
- (long) r->request_time, (long) GetTickCount());
-
-#else
- gettimeofday(&tv, &tz);
-
- ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%d%ld%d", rname,
- (int) getpid(),
- (long) tv.tv_sec, (int) tv.tv_usec / 1000);
-#endif
+ /* XXX: hmm, this should really tie in with mod_unique_id */
+ ap_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%qd", rname, ap_now());
if (cls->expires) {
- ap_time_t *when = NULL;
- ap_int64_t req_time;
- char *temp_cookie = NULL;
- ap_size_t retsize;
-
- ap_make_time(&when, r->pool);
- ap_get_ansitime(when, &req_time);
-#ifndef MILLENIAL_COOKIES
- /*
- * Only two-digit date string, so we can't trust "00" or more.
- * Therefore, we knock it all back to just before midnight on
- * 1/1/2000 (which is 946684799)
- */
-
- if (req_time + cls->expires > 946684799) {
- ap_set_ansitime(when, 946684799);
- }
- else
-#endif
- ap_set_ansitime(when, req_time + cls->expires);
+ ap_exploded_time_t tms;
+
+ ap_explode_gmt(&tms, r->request_time + cls->expires * AP_USEC_PER_SEC);
/* Cookie with date; as strftime '%a, %d-%h-%y %H:%M:%S GMT' */
- ap_strftime(temp_cookie, &retsize, MAX_STRING_LEN, "%a, %d-%h-%y %H:%M:%S GMT", when);
- new_cookie = ap_psprintf(r->pool, "%s=%s; path=/; expires=%s",
- dcfg->cookie_name, cookiebuf, temp_cookie);
+ new_cookie = ap_psprintf(r->pool,
+ "%s=%s; path=/; expires=%s, %.2d-%s-%.2d %.2d:%.2d:%.2d GMT",
+ dcfg->cookie_name, cookiebuf, ap_day_snames[tms.tm_wday],
+ tms.tm_mday, ap_month_snames[tms.tm_mon],
+ tms.tm_year % 100,
+ tms.tm_hour, tms.tm_min, tms.tm_sec);
}
else {
new_cookie = ap_psprintf(r->pool, "%s=%s; path=/",
Re: cvs commit: apache-2.0/src/modules/standard mod_autoindex.c
mod_cgi.c mod_cgid.c mod_expires.c mod_include.c mod_log_config.c mod_rewrite.c
mod_status.c mod_usertrack.c
Posted by Greg Stein <gs...@lyra.org>.
Excellent work! And ya gotta love the banana... :-)
One comment:
On 9 Jan 2000 dgaudet@hyperreal.org wrote:
>...
> --- apr_time.h 2000/01/06 20:20:21 1.10
> +++ apr_time.h 2000/01/09 05:18:19 1.11
>...
> +#define AP_USEC_PER_SEC (1000000LL)
Shouldn't we drop one or both 'L' characters here? I doubt that all
compilers understand the "long long" constant.
Cheers,
-g
--
Greg Stein, http://www.lyra.org/