View | Details | Raw Unified | Return to bug 39380
Collapse All | Expand All

(-)../dist/modules/cache/mod_cache.c (+13 lines)
Lines 245-250 Link Here
245
{
245
{
246
    request_rec *r = f->r;
246
    request_rec *r = f->r;
247
    cache_request_rec *cache;
247
    cache_request_rec *cache;
248
    char *path;
248
249
249
    cache = (cache_request_rec *) ap_get_module_config(r->request_config,
250
    cache = (cache_request_rec *) ap_get_module_config(r->request_config,
250
                                                       &cache_module);
251
                                                       &cache_module);
Lines 266-271 Link Here
266
     * restore the status into it's handle. */
267
     * restore the status into it's handle. */
267
    r->status = cache->handle->cache_obj->info.status;
268
    r->status = cache->handle->cache_obj->info.status;
268
269
270
    if(!r->filename) {
271
        /* Restore filename, used by %f in LogFormat config */
272
        /* FIXME: This should really be saved with the headers when
273
           caching, now we just bodge together something that might be right */
274
        path = r->uri;
275
        while (*path == '/') {
276
            ++path;
277
        }
278
        apr_filepath_merge(&r->filename, ap_document_root(r), path,
279
                APR_FILEPATH_TRUENAME | APR_FILEPATH_SECUREROOT, r->pool);
280
    }
281
269
    /* recall_headers() was called in cache_select() */
282
    /* recall_headers() was called in cache_select() */
270
    cache->provider->recall_body(cache->handle, r->pool, bb);
283
    cache->provider->recall_body(cache->handle, r->pool, bb);
271
284
(-)../dist/modules/cache/mod_disk_cache.c (-34 / +235 lines)
Lines 431-437 Link Here
431
    }
431
    }
432
    else if (format != DISK_FORMAT_VERSION) {
432
    else if (format != DISK_FORMAT_VERSION) {
433
        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
433
        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
434
                     "cache_disk: File '%s' has a version mismatch. File had version: %d.",
434
                     "disk_cache: File '%s' has a version mismatch. File had version: %d.",
435
                     dobj->hdrsfile, format);
435
                     dobj->hdrsfile, format);
436
        return DECLINED;
436
        return DECLINED;
437
    }
437
    }
Lines 455-464 Link Here
455
#ifdef APR_SENDFILE_ENABLED
455
#ifdef APR_SENDFILE_ENABLED
456
    flags |= APR_SENDFILE_ENABLED;
456
    flags |= APR_SENDFILE_ENABLED;
457
#endif
457
#endif
458
    rc = apr_file_open(&dobj->fd, dobj->datafile, flags, 0, r->pool);
458
    while(1) {
459
    if (rc != APR_SUCCESS) {
459
        rc = apr_file_open(&dobj->fd, dobj->datafile, flags, 0, r->pool);
460
        /* XXX: Log message */
460
        if (rc == APR_SUCCESS) {
461
        return DECLINED;
461
            break;
462
        }
463
        /* This probably means that we have started caching the file,
464
           but we have only written the header yet. The header is touched
465
           while the body is being cached, so as long as the header is fresh
466
           we can sit here and wait */
467
468
        rc = apr_file_info_get(&finfo, APR_FINFO_MTIME, dobj->hfd);
469
        if(rc != APR_SUCCESS ||
470
                finfo.mtime < (apr_time_now() - CACHE_UPDATE_TIMEOUT) ) 
471
        {
472
            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
473
                         "disk_cache: Only header cached for URL %s",  
474
                         dobj->name);
475
            return DECLINED;
476
        }
477
        apr_sleep(200000);
462
    }
478
    }
463
479
464
    rc = apr_file_info_get(&finfo, APR_FINFO_SIZE, dobj->fd);
480
    rc = apr_file_info_get(&finfo, APR_FINFO_SIZE, dobj->fd);
Lines 508-514 Link Here
508
             * For reason see log_error_core for the case s == NULL.
524
             * For reason see log_error_core for the case s == NULL.
509
             */
525
             */
510
            ap_log_error(APLOG_MARK, APLOG_DEBUG, rc, NULL,
526
            ap_log_error(APLOG_MARK, APLOG_DEBUG, rc, NULL,
511
                   "disk_cache: Failed to delete headers file %s from cache.",
527
                         "disk_cache: Failed to delete headers file %s from cache.",
512
                         dobj->hdrsfile);
528
                         dobj->hdrsfile);
513
            return DECLINED;
529
            return DECLINED;
514
        }
530
        }
Lines 525-532 Link Here
525
             * For reason see log_error_core for the case s == NULL.
541
             * For reason see log_error_core for the case s == NULL.
526
             */
542
             */
527
            ap_log_error(APLOG_MARK, APLOG_DEBUG, rc, NULL,
543
            ap_log_error(APLOG_MARK, APLOG_DEBUG, rc, NULL,
528
                      "disk_cache: Failed to delete data file %s from cache.",
544
                         "disk_cache: Failed to delete data file %s from "
529
                         dobj->datafile);
545
                         "cache.", dobj->datafile);
530
            return DECLINED;
546
            return DECLINED;
531
        }
547
        }
532
    }
548
    }
Lines 757-765 Link Here
757
    apr_bucket *e;
773
    apr_bucket *e;
758
    disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj;
774
    disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj;
759
775
760
    e = apr_bucket_file_create(dobj->fd, 0, (apr_size_t) dobj->file_size, p,
776
761
                               bb->bucket_alloc);
777
    /* For platforms where the size of the file may be larger than
762
    APR_BRIGADE_INSERT_HEAD(bb, e);
778
     * that which can be stored in a single bucket (where the
779
     * length field is an apr_size_t), split it into several
780
     * buckets: */
781
    if (sizeof(apr_off_t) > sizeof(apr_size_t)
782
            && dobj->file_size > AP_MAX_SENDFILE) {
783
        apr_off_t fsize = dobj->file_size;
784
        e = apr_bucket_file_create(dobj->fd, 0, AP_MAX_SENDFILE,
785
                p, bb->bucket_alloc);
786
        while (fsize > AP_MAX_SENDFILE) {
787
            APR_BRIGADE_INSERT_TAIL(bb, e);
788
            apr_bucket_copy(e, &e);
789
            e->start += AP_MAX_SENDFILE;
790
            fsize -= AP_MAX_SENDFILE;
791
        }
792
        e->length = (apr_size_t)fsize; /* Resize just the last bucket */
793
    }
794
    else {
795
        e = apr_bucket_file_create(dobj->fd, 0, (apr_size_t)dobj->file_size, p,
796
                bb->bucket_alloc);
797
    }
798
799
    APR_BRIGADE_INSERT_TAIL(bb, e);
763
    e = apr_bucket_eos_create(bb->bucket_alloc);
800
    e = apr_bucket_eos_create(bb->bucket_alloc);
764
    APR_BRIGADE_INSERT_TAIL(bb, e);
801
    APR_BRIGADE_INSERT_TAIL(bb, e);
765
802
Lines 852-859 Link Here
852
                                  r->pool);
889
                                  r->pool);
853
            if (rv != APR_SUCCESS) {
890
            if (rv != APR_SUCCESS) {
854
                ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, r->server,
891
                ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, r->server,
855
                    "disk_cache: rename tempfile to varyfile failed: %s -> %s",
892
                             "disk_cache: rename tempfile to varyfile failed: "
856
                    dobj->tempfile, dobj->hdrsfile);
893
                             "%s -> %s", dobj->tempfile, dobj->hdrsfile);
857
                return rv;
894
                return rv;
858
            }
895
            }
859
896
Lines 961-970 Link Here
961
{
998
{
962
    apr_bucket *e;
999
    apr_bucket *e;
963
    apr_status_t rv;
1000
    apr_status_t rv;
1001
    apr_off_t len;
1002
    char buf[CACHE_BUF_SIZE];
1003
    apr_size_t togo = 0;
1004
    int seen_other = 0;
1005
    apr_time_t touched = apr_time_now();
964
    disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
1006
    disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
965
    disk_cache_conf *conf = ap_get_module_config(r->server->module_config,
1007
    disk_cache_conf *conf = ap_get_module_config(r->server->module_config,
966
                                                 &disk_cache_module);
1008
                                                 &disk_cache_module);
967
1009
1010
    if(r->no_cache) {
1011
        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1012
                     "disk_cache: store_body called for URL %s even though"
1013
                     "no_cache is set", h->cache_obj->key);
1014
        return APR_EGENERAL;
1015
    }
1016
1017
    /* Note, can return -1 if len unknown so don't trust it too hard */
1018
    apr_brigade_length(bb, 0, &len);
1019
1020
    if (len > conf->maxfs) {
1021
        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1022
                     "disk_cache: URL %s failed the size check "
1023
                     "(%" APR_OFF_T_FMT ">%" APR_OFF_T_FMT ")",
1024
                     h->cache_obj->key, len, conf->maxfs);
1025
        /* Remove the intermediate cache file and return non-APR_SUCCESS */
1026
        file_cache_errorcleanup(dobj, r);
1027
        return APR_EGENERAL;
1028
    }
1029
    if (len >= 0 && len < conf->minfs) {
1030
        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1031
                     "disk_cache: URL %s failed the size check "
1032
                     "(%" APR_OFF_T_FMT "<%" APR_OFF_T_FMT ")",
1033
                     h->cache_obj->key, len, conf->minfs);
1034
        /* Remove the intermediate cache file and return non-APR_SUCCESS */
1035
        file_cache_errorcleanup(dobj, r);
1036
        return APR_EGENERAL;
1037
    }
1038
1039
    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1040
                 "disk_cache: Start caching URL %s, len %" APR_OFF_T_FMT,
1041
                 h->cache_obj->key, len);
1042
968
    /* We write to a temp file and then atomically rename the file over
1043
    /* We write to a temp file and then atomically rename the file over
969
     * in file_cache_el_final().
1044
     * in file_cache_el_final().
970
     */
1045
     */
Lines 973-1024 Link Here
973
                             APR_CREATE | APR_WRITE | APR_BINARY |
1048
                             APR_CREATE | APR_WRITE | APR_BINARY |
974
                             APR_BUFFERED | APR_EXCL, r->pool);
1049
                             APR_BUFFERED | APR_EXCL, r->pool);
975
        if (rv != APR_SUCCESS) {
1050
        if (rv != APR_SUCCESS) {
1051
            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1052
                         "disk_cache: Failed to create tempfile %s "
1053
                         " to cache body for URL %s",
1054
                         dobj->tempfile, h->cache_obj->key);
976
            return rv;
1055
            return rv;
977
        }
1056
        }
978
        dobj->file_size = 0;
1057
        dobj->file_size = 0;
979
    }
1058
    }
980
1059
981
    for (e = APR_BRIGADE_FIRST(bb);
1060
    for (e = APR_BRIGADE_FIRST(bb);
982
         e != APR_BRIGADE_SENTINEL(bb);
1061
         e != APR_BRIGADE_SENTINEL(bb); )
983
         e = APR_BUCKET_NEXT(e))
984
    {
1062
    {
985
        const char *str;
1063
        const char *str;
986
        apr_size_t length, written;
1064
        apr_size_t rlen, written;
987
        rv = apr_bucket_read(e, &str, &length, APR_BLOCK_READ);
1065
988
        if (rv != APR_SUCCESS) {
1066
        /* Ignore the non-data-buckets */
989
            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1067
        if(APR_BUCKET_IS_METADATA(e)) {
990
                         "cache_disk: Error when reading bucket for URL %s",
1068
            e = APR_BUCKET_NEXT(e);
991
                         h->cache_obj->key);
1069
            continue;
992
            /* Remove the intermediate cache file and return non-APR_SUCCESS */
1070
        }
993
            file_cache_errorcleanup(dobj, r);
1071
994
            return rv;
1072
        /* Touch the header file each second so others know we're working
1073
           on caching the body for it */
1074
        if(touched < (apr_time_now() - apr_time_from_sec(1)) ) {
1075
            touched = apr_time_now();
1076
            apr_file_mtime_set(dobj->hdrsfile, touched, r->pool);
1077
        }
1078
1079
        if(APR_BUCKET_IS_FILE(e)) { /* Read source file directly */
1080
            apr_bucket_file *a = e->data;
1081
            apr_off_t off = e->start;
1082
1083
            if(togo == 0) {
1084
                togo = e->length;
1085
                rv = apr_file_seek(a->fd, APR_SET, &off);
1086
                if (rv != APR_SUCCESS) {
1087
                    ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1088
                                 "disk_cache: Error reading source file for "
1089
                                 "URL %s", h->cache_obj->key);
1090
                    file_cache_errorcleanup(dobj, r);
1091
                    return rv;
1092
                }
1093
            }
1094
1095
            rlen = MIN(togo, sizeof(buf));
1096
1097
            rv = apr_file_read_full(a->fd, buf, rlen, &rlen);
1098
            if (rv != APR_SUCCESS) {
1099
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1100
                             "disk_cache: Error reading source file for URL %s",
1101
                             h->cache_obj->key);
1102
                file_cache_errorcleanup(dobj, r);
1103
                return rv;
1104
            }
1105
1106
            str=buf;
995
        }
1107
        }
996
        rv = apr_file_write_full(dobj->tfd, str, length, &written);
1108
        else { /* Not a file, need to read the bucket */
1109
            seen_other = 1;
1110
1111
            rv = apr_bucket_read(e, &str, &rlen, APR_BLOCK_READ);
1112
            if (rv != APR_SUCCESS) {
1113
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1114
                             "disk_cache: Error when reading bucket for URL %s",
1115
                             h->cache_obj->key);
1116
                file_cache_errorcleanup(dobj, r);
1117
                return rv;
1118
            }
1119
        }
1120
        rv = apr_file_write_full(dobj->tfd, str, rlen, &written);
997
        if (rv != APR_SUCCESS) {
1121
        if (rv != APR_SUCCESS) {
998
            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1122
            ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
999
                         "cache_disk: Error when writing cache file for URL %s",
1123
                         "disk_cache: Error when writing cache file for URL %s",
1000
                         h->cache_obj->key);
1124
                         h->cache_obj->key);
1001
            /* Remove the intermediate cache file and return non-APR_SUCCESS */
1002
            file_cache_errorcleanup(dobj, r);
1125
            file_cache_errorcleanup(dobj, r);
1003
            return rv;
1126
            return rv;
1004
        }
1127
        }
1128
        if(togo > 0) {
1129
            togo -= written;
1130
            if(togo < 0) {
1131
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1132
                             "disk_cache: Wrote more than expected when "
1133
                             "writing cache file for URL %s",
1134
                             h->cache_obj->key);
1135
                file_cache_errorcleanup(dobj, r);
1136
                return APR_EGENERAL;
1137
            }
1138
        }
1005
        dobj->file_size += written;
1139
        dobj->file_size += written;
1006
        if (dobj->file_size > conf->maxfs) {
1140
        if (dobj->file_size > conf->maxfs) {
1007
            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1141
            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1008
                         "cache_disk: URL %s failed the size check "
1142
                         "disk_cache: URL %s failed the size check "
1009
                         "(%" APR_OFF_T_FMT ">%" APR_SIZE_T_FMT ")",
1143
                         "(%" APR_OFF_T_FMT ">%" APR_OFF_T_FMT ")",
1010
                         h->cache_obj->key, dobj->file_size, conf->maxfs);
1144
                         h->cache_obj->key, dobj->file_size, conf->maxfs);
1011
            /* Remove the intermediate cache file and return non-APR_SUCCESS */
1145
            /* Remove the intermediate cache file and return non-APR_SUCCESS */
1012
            file_cache_errorcleanup(dobj, r);
1146
            file_cache_errorcleanup(dobj, r);
1013
            return APR_EGENERAL;
1147
            return APR_EGENERAL;
1014
        }
1148
        }
1149
1150
        if(togo == 0) { /* Only jump to next bucket if we're done with this */
1151
            e = APR_BUCKET_NEXT(e);
1152
        }
1015
    }
1153
    }
1016
1154
1155
1017
    /* Was this the final bucket? If yes, close the temp file and perform
1156
    /* Was this the final bucket? If yes, close the temp file and perform
1018
     * sanity checks.
1157
     * sanity checks.
1019
     */
1158
     */
1020
    if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) {
1159
    if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) {
1021
        if (r->connection->aborted || r->no_cache) {
1160
1161
        /* Keep cached body if we cached a file even if connection 
1162
           was aborted */
1163
        if (r->no_cache || (r->connection->aborted && seen_other) ) {
1022
            ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
1164
            ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
1023
                         "disk_cache: Discarding body for URL %s "
1165
                         "disk_cache: Discarding body for URL %s "
1024
                         "because connection has been aborted.",
1166
                         "because connection has been aborted.",
Lines 1027-1036 Link Here
1027
            file_cache_errorcleanup(dobj, r);
1169
            file_cache_errorcleanup(dobj, r);
1028
            return APR_EGENERAL;
1170
            return APR_EGENERAL;
1029
        }
1171
        }
1172
1030
        if (dobj->file_size < conf->minfs) {
1173
        if (dobj->file_size < conf->minfs) {
1031
            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1174
            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1032
                         "cache_disk: URL %s failed the size check "
1175
                         "disk_cache: URL %s failed the size check "
1033
                         "(%" APR_OFF_T_FMT "<%" APR_SIZE_T_FMT ")",
1176
                         "(%" APR_OFF_T_FMT "<%" APR_OFF_T_FMT ")",
1034
                         h->cache_obj->key, dobj->file_size, conf->minfs);
1177
                         h->cache_obj->key, dobj->file_size, conf->minfs);
1035
            /* Remove the intermediate cache file and return non-APR_SUCCESS */
1178
            /* Remove the intermediate cache file and return non-APR_SUCCESS */
1036
            file_cache_errorcleanup(dobj, r);
1179
            file_cache_errorcleanup(dobj, r);
Lines 1042-1047 Link Here
1042
        file_cache_el_final(dobj, r);
1185
        file_cache_el_final(dobj, r);
1043
        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1186
        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1044
                     "disk_cache: Body for URL %s cached.",  dobj->name);
1187
                     "disk_cache: Body for URL %s cached.",  dobj->name);
1188
1189
        if(!seen_other) {
1190
            /* Only redirect to cache if pure file */ 
1191
1192
            int flags;
1193
            apr_finfo_t finfo;
1194
1195
            /* Open the data file */
1196
            flags = APR_READ|APR_BINARY;
1197
#ifdef APR_SENDFILE_ENABLED
1198
            flags |= APR_SENDFILE_ENABLED;
1199
#endif
1200
            rv = apr_file_open(&dobj->fd, dobj->datafile, flags, 0, r->pool);
1201
            if (rv != APR_SUCCESS) {
1202
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1203
                             "disk_cache: Error opening cache for URL %s",
1204
                             h->cache_obj->key);
1205
                return rv;
1206
            }
1207
            rv = apr_file_info_get(&finfo, APR_FINFO_SIZE, dobj->fd);
1208
            if (rv == APR_SUCCESS && dobj->file_size != finfo.size) {
1209
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1210
                             "disk_cache: Weird cachefile for URL %s:"
1211
                             "size %" APR_OFF_T_FMT " != %" APR_OFF_T_FMT,
1212
                             h->cache_obj->key, dobj->file_size, finfo.size);
1213
                file_cache_errorcleanup(dobj, r);
1214
                return APR_EGENERAL;
1215
            }
1216
1217
            /* First, empty the brigade */
1218
            e  = APR_BRIGADE_FIRST(bb);
1219
            while (e != APR_BRIGADE_SENTINEL(bb)) {
1220
                apr_bucket *d;
1221
                d = e;
1222
                e = APR_BUCKET_NEXT(e);
1223
                apr_bucket_delete(d);
1224
            }
1225
1226
            /* Then, populate it with our cached instance */
1227
            rv = recall_body(h, r->pool, bb);
1228
            if (rv != APR_SUCCESS) {
1229
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
1230
                             "disk_cache: Error serving URL %s from cache",
1231
                             h->cache_obj->key);
1232
                return rv;
1233
            }
1234
            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1235
                         "disk_cache: Serving cached body for URL %s",
1236
                         dobj->name);
1237
1238
        }
1045
    }
1239
    }
1046
1240
1047
    return APR_SUCCESS;
1241
    return APR_SUCCESS;
Lines 1117-1123 Link Here
1117
{
1311
{
1118
    disk_cache_conf *conf = ap_get_module_config(parms->server->module_config,
1312
    disk_cache_conf *conf = ap_get_module_config(parms->server->module_config,
1119
                                                 &disk_cache_module);
1313
                                                 &disk_cache_module);
1120
    conf->minfs = atoi(arg);
1314
1315
    if (sscanf(arg, "%" APR_OFF_T_FMT, &conf->minfs) != 1) {
1316
        return "CacheMinFileSize argument must be an integer representing the min size of a file to cache in bytes.";
1317
    }
1121
    return NULL;
1318
    return NULL;
1122
}
1319
}
1123
static const char
1320
static const char
Lines 1125-1131 Link Here
1125
{
1322
{
1126
    disk_cache_conf *conf = ap_get_module_config(parms->server->module_config,
1323
    disk_cache_conf *conf = ap_get_module_config(parms->server->module_config,
1127
                                                 &disk_cache_module);
1324
                                                 &disk_cache_module);
1128
    conf->maxfs = atoi(arg);
1325
1326
    if (sscanf(arg, "%" APR_OFF_T_FMT, &conf->maxfs) != 1) {
1327
        return "CacheMaxFileSize argument must be an integer representing the max size of a file to cache in bytes.";
1328
    }
1329
1129
    return NULL;
1330
    return NULL;
1130
}
1331
}
1131
1332
(-)../dist/modules/cache/mod_disk_cache.h (-2 / +5 lines)
Lines 28-33 Link Here
28
#define CACHE_DATA_SUFFIX   ".data"
28
#define CACHE_DATA_SUFFIX   ".data"
29
#define CACHE_VDIR_SUFFIX   ".vary"
29
#define CACHE_VDIR_SUFFIX   ".vary"
30
30
31
#define CACHE_BUF_SIZE 262144
32
#define CACHE_UPDATE_TIMEOUT apr_time_from_sec(5)
33
31
#define AP_TEMPFILE_PREFIX "/"
34
#define AP_TEMPFILE_PREFIX "/"
32
#define AP_TEMPFILE_BASE   "aptmp"
35
#define AP_TEMPFILE_BASE   "aptmp"
33
#define AP_TEMPFILE_SUFFIX "XXXXXX"
36
#define AP_TEMPFILE_SUFFIX "XXXXXX"
Lines 88-95 Link Here
88
    apr_size_t cache_root_len;
91
    apr_size_t cache_root_len;
89
    int dirlevels;               /* Number of levels of subdirectories */
92
    int dirlevels;               /* Number of levels of subdirectories */
90
    int dirlength;               /* Length of subdirectory names */
93
    int dirlength;               /* Length of subdirectory names */
91
    apr_size_t minfs;            /* minumum file size for cached files */
94
    apr_off_t minfs;             /* minumum file size for cached files */
92
    apr_size_t maxfs;            /* maximum file size for cached files */
95
    apr_off_t maxfs;             /* maximum file size for cached files */
93
} disk_cache_conf;
96
} disk_cache_conf;
94
97
95
#endif /*MOD_DISK_CACHE_H*/
98
#endif /*MOD_DISK_CACHE_H*/

Return to bug 39380