Sorry about this, but the last patch had a mistake in the writev
--
Brian Akins
Senior Systems Engineer
CNN Internet Technologies
--- httpd-2.0.50.old/modules/experimental/mod_disk_cache.c 2004-02-09
15:53:16.000000000 -0500
+++ httpd-2.0.50/modules/experimental/mod_disk_cache.c 2004-08-04 08:54:21.000000000
-0400
@@ -43,6 +43,14 @@
apr_off_t file_size; /* File size of the cached data file */
} disk_cache_object_t;
+typedef struct {
+ apr_time_t date;
+ apr_time_t expire;
+ apr_time_t version;
+ apr_time_t request_time;
+ apr_time_t response_time;
+} disk_cache_info_t;
+
/*
* mod_disk_cache configuration
*/
@@ -177,36 +185,22 @@
apr_status_t rv;
char urlbuff[1034]; /* XXX FIXME... THIS IS A POTENTIAL SECURITY HOLE */
int urllen = sizeof(urlbuff);
- int offset=0;
char * temp;
+ disk_cache_info_t disk_info;
+ apr_size_t len;
- /* read the data from the cache file */
- /* format
- * date SP expire SP count CRLF
- * dates are stored as a hex representation of apr_time_t (number of
- * microseconds since 00:00:00 january 1, 1970 UTC)
- */
- rv = apr_file_gets(&urlbuff[0], urllen, fd);
+ /* read the data from the cache file */
+ len = sizeof(disk_cache_info_t);
+ rv = apr_file_read(fd, &disk_info, &len);
if (rv != APR_SUCCESS) {
return rv;
}
- if ((temp = strchr(&urlbuff[0], '\n')) != NULL) /* trim off new line character */
- *temp = '\0'; /* overlay it with the null terminator */
-
- if (!apr_date_checkmask(urlbuff, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&")) {
- return APR_EGENERAL;
- }
-
- info->date = ap_cache_hex2usec(urlbuff + offset);
- offset += (sizeof(info->date)*2) + 1;
- info->expire = ap_cache_hex2usec(urlbuff + offset);
- offset += (sizeof(info->expire)*2) + 1;
- dobj->version = ap_cache_hex2usec(urlbuff + offset);
- offset += (sizeof(info->expire)*2) + 1;
- info->request_time = ap_cache_hex2usec(urlbuff + offset);
- offset += (sizeof(info->expire)*2) + 1;
- info->response_time = ap_cache_hex2usec(urlbuff + offset);
+ info->date = disk_info.date;
+ info->expire = disk_info.expire;
+ dobj->version = disk_info.version;
+ info->request_time = disk_info.request_time;
+ info->response_time = disk_info.response_time;
/* check that we have the same URL */
rv = apr_file_gets(&urlbuff[0], urllen, fd);
@@ -217,11 +211,8 @@
if ((temp = strchr(&urlbuff[0], '\n')) != NULL) { /* trim off new line character
*/
*temp = '\0'; /* overlay it with the null terminator */
}
-
- if (strncmp(urlbuff, "X-NAME: ", 7) != 0) {
- return APR_EGENERAL;
- }
- if (strcmp(urlbuff + 8, dobj->name) != 0) {
+
+ if (strcmp(urlbuff, dobj->name) != 0) {
return APR_EGENERAL;
}
@@ -232,41 +223,37 @@
{
apr_status_t rc;
char *buf;
- apr_size_t amt;
-
- char dateHexS[sizeof(apr_time_t) * 2 + 1];
- char expireHexS[sizeof(apr_time_t) * 2 + 1];
- char verHexS[sizeof(apr_time_t) * 2 + 1];
- char requestHexS[sizeof(apr_time_t) * 2 + 1];
- char responseHexS[sizeof(apr_time_t) * 2 + 1];
- cache_info *info = &(h->cache_obj->info);
disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
-
+ disk_cache_info_t disk_info;
+ const char *newline = "\n";
+ struct iovec iov[3];
+
if (!r->headers_out) {
/* XXX log message */
return 0;
}
- ap_cache_usec2hex(info->date, dateHexS);
- ap_cache_usec2hex(info->expire, expireHexS);
- ap_cache_usec2hex(dobj->version++, verHexS);
- ap_cache_usec2hex(info->request_time, requestHexS);
- ap_cache_usec2hex(info->response_time, responseHexS);
- buf = apr_pstrcat(r->pool, dateHexS, " ", expireHexS, " ", verHexS, " ",
requestHexS, " ", responseHexS, "\n", NULL);
- amt = strlen(buf);
- rc = apr_file_write(fd, buf, &amt);
- if (rc != APR_SUCCESS) {
- /* XXX log message */
+ disk_info.date = info->date;
+ disk_info.expire = info->expire;
+ disk_info.version = dobj->version++;
+ disk_info.request_time = info->request_time;
+ disk_info.response_time = info->response_time;
+
+
+ iov[0].iov_base = &disk_info;
+ iov[0].iov_len = sizeof(disk_cache_info_t);
+ iov[1].iov_base = dobj->name;
+ iov[1].iov_len = strlen(dobj->name);
+ iov[2].iov_base = newline;
+ iov[2].iov_len = sizeof(char); /*you never know*/
+
+ if ((rc =
+ apr_file_writev(fd, (const struct iovec *) &iov, 3,
+ &len)) != APR_SUCCESS) {
return 0;
+
}
- buf = apr_pstrcat(r->pool, "X-NAME: ", dobj->name, "\n", NULL);
- amt = strlen(buf);
- rc = apr_file_write(fd, buf, &amt);
- if (rc != APR_SUCCESS) {
- /* XXX log message */
- return 0;
- }
return 1;
}