Summary of the patch : 1. convert tabs to spaces 2. try to follow apache styleguide
[ Please note that there might be long lines because of the old style followed in mod_specweb99.c ] Thanks -Madhu <<mod_specweb99.patch.txt>>
Index: mod_specweb99.c =================================================================== RCS file: /home/cvspublic/httpd-test/specweb99/specweb99-2.0/mod_specweb99.c,v retrieving revision 1.18 diff -u -r1.18 mod_specweb99.c --- mod_specweb99.c 15 Jan 2003 16:15:02 -0000 1.18 +++ mod_specweb99.c 21 Jan 2003 21:39:14 -0000 @@ -132,7 +132,7 @@ static apr_int16_t getCADFile(struct server_rec *sv, struct request_rec *r, - struct specweb99_module_data * _my); +struct specweb99_module_data * _my); /* Use interal locking - the main reason for doing * so is error trapping and being able to warn/info @@ -146,8 +146,8 @@ * - when 's' is passed - do appropriate logging. * - when 'file' is passed - logging will be more meaningfull */ -static int _dolock(struct server_rec *s, struct request_rec *r, apr_file_t * f, - int type, char *file) +static int _dolock(struct server_rec *s, struct request_rec *r, + apr_file_t * f, int type, char *file) { int e; /* @@ -160,13 +160,13 @@ /* * XXX timeouts removed ! not sure how to do that in 2.0 */ - if (s) - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, e, s, - "Camping out %s%s for a %s lock", - file ? "on " : "", file ? file : "", - ((type == APR_FLOCK_SHARED) ? "read" : "write")); + if (s) + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, e, s, + "Camping out %s%s for a %s lock", + file ? "on " : "", file ? file : "", + ((type == APR_FLOCK_SHARED) ? "read" : "write")); - e = apr_file_lock(f, type); + e = apr_file_lock(f, type); /* * XXXX clear timeout removed not sure how to do that in 2.0 */ @@ -174,12 +174,12 @@ /* Trap both first/second flock() error. */ if (e) { - if (s) - ap_log_error(APLOG_MARK, APLOG_ERR, e, s, - "Failed to %s" "lock%s%s", - ((type == APR_FLOCK_SHARED) ? "read" : "write"), - ((file) ? ": " : ""), ((file) ? file : "")); - return -1; + if (s) + ap_log_error(APLOG_MARK, APLOG_ERR, e, s, + "Failed to %s" "lock%s%s", + ((type == APR_FLOCK_SHARED) ? "read" : "write"), + ((file) ? ": " : ""), ((file) ? file : "")); + return -1; } return 0; } @@ -190,10 +190,10 @@ /* Fill up the boilerplate with info */ bp_head = apr_psprintf(r->pool, boilerplate_start, - ap_get_server_version(), - ap_get_remote_host(r->connection, NULL, - REMOTE_NOLOOKUP, NULL), r->uri, - r->args ? r->args : ""); + ap_get_server_version(), + ap_get_remote_host(r->connection, NULL, + REMOTE_NOLOOKUP, NULL), r->uri, + r->args ? r->args : ""); r->content_type = "text/html"; @@ -201,7 +201,8 @@ } -static void returnHTMLPageWithBuffer(request_rec *r, char *buf, apr_size_t buflen) +static void returnHTMLPageWithBuffer(request_rec *r, char *buf, + apr_size_t buflen) { char *bp_head; conn_rec *c = r->connection; @@ -216,7 +217,7 @@ b1 = apr_bucket_transient_create(bp_head, strlen(bp_head), c->bucket_alloc); b2 = apr_bucket_transient_create(buf, buflen, c->bucket_alloc); b3 = apr_bucket_immortal_create(boilerplate_end, - boilerplate_end_len, c->bucket_alloc); + boilerplate_end_len, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb, b1); APR_BRIGADE_INSERT_TAIL(bb, b2); @@ -225,11 +226,11 @@ rv = ap_pass_brigade(r->output_filters, bb); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "mod_specweb: ap_pass_brigade failed for buffer '%s'", - buf); + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_specweb: ap_pass_brigade failed for buffer '%s'", + buf); } -} /* returnHTMLPageWithBuffer */ +} static void returnHTMLPageWithMessage(request_rec *r, char *fmt,...) { @@ -241,7 +242,7 @@ va_end(args); returnHTMLPageWithBuffer(r, m, strlen(m)); -} /* returnHTMLPageWithMessage */ +} static void returnHTMLPageWithFile(request_rec *r, char *fname) { @@ -255,23 +256,22 @@ conn_rec *c = r->connection; if ((rv = apr_stat(&s, fname, APR_FINFO_SIZE, r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "Could not stat file '%s' for reading", fname); - returnHTMLPageWithMessage(r, "Error: Failed to stat the file"); - return; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "Could not stat file '%s' for reading", fname); + returnHTMLPageWithMessage(r, "Error: Failed to stat the file"); + return; } bp_head = returnHTMLPageHead(r); b1 = apr_bucket_transient_create(bp_head, strlen(bp_head), c->bucket_alloc); - if ((rv = - apr_file_open(&f, fname, APR_READ, APR_OS_DEFAULT, - r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "Could not open file '%s' for reading", fname); - returnHTMLPageWithMessage(r, "Error: could not open file for reading."); - return; + rv = apr_file_open(&f, fname, APR_READ, APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "Could not open file '%s' for reading", fname); + returnHTMLPageWithMessage(r, "Error: could not open file for reading."); + return; } bb = apr_brigade_create(r->pool, c->bucket_alloc); @@ -282,44 +282,41 @@ * greater than MAX(apr_size_t), and more granular than that in case * the brigade code/filters attempt to read it directly. */ - apr_off_t fsize = s.size; - b = apr_bucket_file_create(f, zero, AP_MAX_SENDFILE, r->pool); - while (fsize > AP_MAX_SENDFILE) { - APR_BRIGADE_INSERT_TAIL(bb, b); - apr_bucket_copy(b, &b); - b->start += AP_MAX_SENDFILE; - fsize -= AP_MAX_SENDFILE; - } - b->length = (apr_size_t) fsize; /* Resize just the last bucket */ + apr_off_t fsize = s.size; + b = apr_bucket_file_create(f, zero, AP_MAX_SENDFILE, r->pool); + while (fsize > AP_MAX_SENDFILE) { + APR_BRIGADE_INSERT_TAIL(bb, b); + apr_bucket_copy(b, &b); + b->start += AP_MAX_SENDFILE; + fsize -= AP_MAX_SENDFILE; + } + b->length = (apr_size_t) fsize; /* Resize just the last bucket */ } else #endif - b2 = apr_bucket_file_create(f, zero, (apr_size_t) (s.size), - r->pool, c->bucket_alloc); - b3 = apr_bucket_immortal_create(boilerplate_end, - boilerplate_end_len, c->bucket_alloc); - - APR_BRIGADE_INSERT_TAIL(bb, b1); - APR_BRIGADE_INSERT_TAIL(bb, b2); - APR_BRIGADE_INSERT_TAIL(bb, b3); - APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_eos_create(c->bucket_alloc)); + b2 = apr_bucket_file_create(f, zero, (apr_size_t) (s.size), + r->pool, c->bucket_alloc); + b3 = apr_bucket_immortal_create(boilerplate_end, + boilerplate_end_len, c->bucket_alloc); + + APR_BRIGADE_INSERT_TAIL(bb, b1); + APR_BRIGADE_INSERT_TAIL(bb, b2); + APR_BRIGADE_INSERT_TAIL(bb, b3); + APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_eos_create(c->bucket_alloc)); - rv = ap_pass_brigade(r->output_filters, bb); - if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "mod_specweb: ap_pass_brigade failed for %s", fname); + rv = ap_pass_brigade(r->output_filters, bb); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_specweb: ap_pass_brigade failed for %s", fname); } -} /* returnHTMLPageWithFile */ - - +} /*********************************************************************** * checkUPFile * ***********************************************************************/ -static apr_int16_t - checkUPFile(struct server_rec *sv, struct request_rec *r, - struct specweb99_module_data * _my) +static apr_int16_t checkUPFile(struct server_rec *sv, struct request_rec *r, + struct specweb99_module_data * _my) { apr_finfo_t s; apr_status_t rv; @@ -330,23 +327,21 @@ apr_time_t now; now = time(NULL); - if (_my->check == now) { + if (_my->check == now) { return 0; } _my->check = now; /* stat it, compare to stored stat */ - if ((rv = apr_stat(&s, _my->up_path, - APR_FINFO_SIZE | APR_FINFO_MTIME, - r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Could not stat User.Personality file '%s'", - _my->up_path); - return 1; + rv = apr_stat(&s, _my->up_path, APR_FINFO_SIZE | APR_FINFO_MTIME, r->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Could not stat User.Personality file '%s'", _my->up_path); + return 1; }; if (s.mtime == _my->up_lastmod) { - return 0; + return 0; } numrecords = s.size / UPRLENGTH; @@ -354,72 +349,68 @@ * Check buffer array for nullness and bigness, make if necessary. */ if ((_my->up == NULL) || (numrecords > _my->up_count)) { - /* User personalities are only 32 bits (sad, really) */ - apr_pool_clear(_my->up_pool); - _my->up = apr_palloc(_my->up_pool, numrecords * sizeof(apr_uint32_t)); - _my->up_count = numrecords; + /* User personalities are only 32 bits (sad, really) */ + apr_pool_clear(_my->up_pool); + _my->up = apr_palloc(_my->up_pool, numrecords * sizeof(apr_uint32_t)); + _my->up_count = numrecords; } /* * open the file, with memory from the request pool because we will * not need it very long. */ - if ((rv = apr_file_open(&f, _my->up_path, - APR_READ, APR_OS_DEFAULT, - r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Could not open User.Personality file '%s'", - _my->up_path); - return 1; + rv = apr_file_open(&f, _my->up_path, APR_READ, APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Could not open User.Personality file '%s'", _my->up_path); + return 1; } if (_rlock(sv, r, f, _my->up_path)) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to lock User.Personality file '%s'", - _my->up_path); - apr_file_close(f); - return 1; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to lock User.Personality file '%s'", + _my->up_path); + apr_file_close(f); + return 1; } /* Read every record, parse, put user demographics in array */ up_uid = 0; while (1) { - int id, dem; - apr_size_t l; - - if ((rv = - apr_file_read_full(f, up_record, UPRLENGTH, &l)) != APR_SUCCESS) - break; - - up_record[UPRLENGTH] = '\0'; + int id, dem; + apr_size_t l; - if (sscanf(up_record, "%d %x", &id, &dem) != 2) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "corrupted entry in UP file"); - e = 1; - } + rv = apr_file_read_full(f, up_record, UPRLENGTH, &l); + if (rv != APR_SUCCESS) + break; + + up_record[UPRLENGTH] = '\0'; + + if (sscanf(up_record, "%d %x", &id, &dem) != 2) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "corrupted entry in UP file"); + e = 1; + } - if (up_uid != id) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "user id out of sync in UP file"); - e = 1; - } + if (up_uid != id) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "user id out of sync in UP file"); + e = 1; + } - _my->up[up_uid] = dem; - up_uid++; + _my->up[up_uid] = dem; + up_uid++; } if ((up_uid != numrecords) && (rv != APR_SUCCESS)) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed read from User.Personality file '%s'", - _my->up_path); - e++; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed read from User.Personality file '%s'",_my->up_path); + e++; } if (apr_file_unlock(f) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to unlock User.Personality file '%s'", - _my->up_path); - e = 1; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to unlock User.Personality file '%s'",_my->up_path); + e = 1; }; /* Close file */ @@ -427,7 +418,7 @@ /* Store last modified date assuming no errors. */ if (e) { - _my->up_lastmod = 0; + _my->up_lastmod = 0; return e; } _my->up_lastmod = s.mtime; @@ -445,9 +436,8 @@ * getCADFile * ***********************************************************************/ -static apr_int16_t -getCADFile(struct server_rec *sv, struct request_rec *r, - struct specweb99_module_data * _my) +static apr_int16_t getCADFile(struct server_rec *sv, struct request_rec *r, + struct specweb99_module_data * _my) { apr_finfo_t s; apr_status_t rv; @@ -457,12 +447,11 @@ apr_uint16_t cad_uid; int e = 0; - if ((rv = - apr_stat(&s, _my->cad_path, APR_FINFO_SIZE | APR_FINFO_MTIME, - r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to stat CAD file '%s'", _my->cad_path); - return 1; + rv = apr_stat(&s, _my->cad_path, APR_FINFO_SIZE | APR_FINFO_MTIME, r->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to stat CAD file '%s'", _my->cad_path); + return 1; }; /* @@ -471,73 +460,72 @@ */ numrecords = s.size / CADRLENGTH; if (numrecords > _my->cad_count) { - apr_pool_clear(_my->cad_pool); - _my->cad = - apr_palloc(_my->cad_pool, numrecords * sizeof(struct cadrec)); - _my->cad_count = numrecords; + apr_pool_clear(_my->cad_pool); + _my->cad = + apr_palloc(_my->cad_pool, numrecords * sizeof(struct cadrec)); + _my->cad_count = numrecords; } - if ((rv = apr_file_open(&f, _my->cad_path, - APR_READ, APR_OS_DEFAULT, - r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to open CAD file '%s'", _my->cad_path); - return 1; + rv = apr_file_open(&f, _my->cad_path, APR_READ, APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to open CAD file '%s'", _my->cad_path); + return 1; }; if (_rlock(sv, r, f, _my->cad_path)) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to lock CAD file '%s'", _my->cad_path); - return 1; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to lock CAD file '%s'", _my->cad_path); + return 1; } cad_uid = 0; while (cad_uid < numrecords) { - int id, dem, adw, adm, exp; - apr_size_t l; - if ((rv = - apr_file_read_full(f, cadline, CADRLENGTH, &l)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to read from CAD file '%s'", _my->cad_path); - e = 1; - break; - }; - /* - * Decode AD file (see specweb page ..) - * - * 0123456789.123456789.123456789.12345678 01234 01234567 01234567 - * 012 0123456789n "%5d %8X %8X %3d %10d\n", Ad_id, - * AdDemographics, Weightings, Minimum_Match_Value, - * Expiration_Time - * - */ - if (sscanf(cadline, "%d %x %x %d %d", &id, &dem, &adw, &adm, &exp) != - 5) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Entry CAD file corrupted"); - continue; - } + int id, dem, adw, adm, exp; + apr_size_t l; + rv = apr_file_read_full(f, cadline, CADRLENGTH, &l); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to read from CAD file '%s'", _my->cad_path); + e = 1; + break; + }; + /* + * Decode AD file (see specweb page ..) + * + * 0123456789.123456789.123456789.12345678 01234 01234567 01234567 + * 012 0123456789n "%5d %8X %8X %3d %10d\n", Ad_id, + * AdDemographics, Weightings, Minimum_Match_Value, + * Expiration_Time + * + */ + if (sscanf(cadline, "%d %x %x %d %d", &id, &dem, &adw, &adm, &exp) + != 5) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Entry CAD file corrupted"); + continue; + } - if (cad_uid != id) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Entry CAD file Id# out of sync"); - continue; - } - _my->cad[cad_uid].addemographics = dem; - _my->cad[cad_uid].gen_weightings = (adw & 0x00f0000) >> 16; - _my->cad[cad_uid].age_weightings = (adw & 0x000f000) >> 12; - _my->cad[cad_uid].reg_weightings = (adw & 0x0000f00) >> 8; - _my->cad[cad_uid].int1_weightings = (adw & 0x00000f0) >> 4; - _my->cad[cad_uid].int2_weightings = (adw & 0x000000f); - _my->cad[cad_uid].minimum_match_value = adm; - _my->cad[cad_uid].expiration_time = exp; - cad_uid++; + if (cad_uid != id) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Entry CAD file Id# out of sync"); + continue; + } + _my->cad[cad_uid].addemographics = dem; + _my->cad[cad_uid].gen_weightings = (adw & 0x00f0000) >> 16; + _my->cad[cad_uid].age_weightings = (adw & 0x000f000) >> 12; + _my->cad[cad_uid].reg_weightings = (adw & 0x0000f00) >> 8; + _my->cad[cad_uid].int1_weightings = (adw & 0x00000f0) >> 4; + _my->cad[cad_uid].int2_weightings = (adw & 0x000000f); + _my->cad[cad_uid].minimum_match_value = adm; + _my->cad[cad_uid].expiration_time = exp; + cad_uid++; } if (apr_file_unlock(f) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, - "Failed to unlock the CAD file '%s'", _my->cad_path); - e = 1; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, sv, + "Failed to unlock the CAD file '%s'", _my->cad_path); + e = 1; }; apr_file_close(f); @@ -549,7 +537,7 @@ { struct specweb99_module_data *_my; _my = (struct specweb99_module_data *) - apr_pcalloc(p, sizeof(struct specweb99_module_data)); + apr_pcalloc(p, sizeof(struct specweb99_module_data)); _my->up_lastmod = (apr_time_t) 0L; @@ -562,20 +550,20 @@ return (void *) _my; } -static int specweb99_module_init(apr_pool_t * p, - apr_pool_t * plog, apr_pool_t * ptemp, server_rec *s) +static int specweb99_module_init(apr_pool_t * p, apr_pool_t * plog, + apr_pool_t * ptemp, server_rec *s) { ap_add_version_component(p, NAME "/" VERSION); ap_log_error(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, 0, s, - NAME "/" VERSION " module: Compiled on %s at %s", __DATE__, - __TIME__); + NAME "/" VERSION " module: Compiled on %s at %s", __DATE__, + __TIME__); ap_log_error(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, 0, s, "%s", - "$Id: mod_specweb99.c,v 1.18 2003/01/15 16:15:02 gregames Exp $"); + "$Id: mod_specweb99.c,v 1.18 2003/01/15 16:15:02 gregames Exp $"); return 0; -} /* specweb99_module_init */ +} static void specweb99_child_init(apr_pool_t * p, server_rec *s) { @@ -595,33 +583,33 @@ _my->cadgen99 = ap_make_full_path(p, docroot, "cadgen99"); if (apr_pool_create(&(_my->up_pool), p) != APR_SUCCESS) - exit(APEXIT_CHILDFATAL); + exit(APEXIT_CHILDFATAL); if (apr_pool_create(&(_my->cad_pool), p) != APR_SUCCESS) - exit(APEXIT_CHILDFATAL); + exit(APEXIT_CHILDFATAL); if (s->next) { - fprintf(stderr, - "WARNING- this specweb module currently does not support vhosts/services\n" - "See %s:%d for what you need to change. The server will continue and assume\n" - "the config of the base server\n", __FILE__, __LINE__ + 2); + fprintf(stderr, + "WARNING- this specweb module currently does not support vhosts/services\n" + "See %s:%d for what you need to change. The server will continue and assume\n" + "the config of the base server\n", __FILE__, __LINE__ + 2); - /* - * Right now we assume you are specwebbing a whole server install - - * as opposed to a host:port:protocol instance tied to a virtual - * service. - * - * To support vhosts - the _my module config needs simply to be moved to - * the per server config block (or the per dir block) and the init - * and/or any access to it need to either go through the ->nxt list - * OR carefull overlay merging needs to be done to a sensible default - * for each of the cases. The current simplistic 'docroot' references - * are propably no longer going to work and will need explicit config - * (e.g. think ~user and other redirect cases with clobber the - * concept of a docroot). - */ + /* + * Right now we assume you are specwebbing a whole server install - + * as opposed to a host:port:protocol instance tied to a virtual + * service. + * + * To support vhosts - the _my module config needs simply to be moved to + * the per server config block (or the per dir block) and the init + * and/or any access to it need to either go through the ->nxt list + * OR carefull overlay merging needs to be done to a sensible default + * for each of the cases. The current simplistic 'docroot' references + * are propably no longer going to work and will need explicit config + * (e.g. think ~user and other redirect cases with clobber the + * concept of a docroot). + */ }; -} /* specweb99_module_init */ +} static int do_housekeeping(request_rec *r) @@ -637,150 +625,149 @@ char *cmd1, *cmd2, *c; int cmd1res, cmd2res; const char *docroot = ap_document_root(r); - apr_uri_t urlrootrec; /* To parse the urlroot string into */ + apr_uri_t urlrootrec; /* To parse the urlroot string into */ /* we already know args starts with "command/", so skip over that */ - - if (!strncmp(r->args + 8, "Fetch", 5)) { - returnHTMLPageWithFile(r, _my->log_path); - return OK; + + if (!strncmp(r->args + 8, "Fetch", 5)) { + returnHTMLPageWithFile(r, _my->log_path); + return OK; } else if ((data = strstr(r->args + 8, "Reset"))) { - /* - * We are sleeping at least one second - to make sure that any - * fstat() on mtime will actually yield different values - no matter - * how closely spaced the Reset's are issued. (in particular the - * spacing between the test reset from the manager and the reset at - * the commencing - which normally can be within a second - thus - * having identical mtime's on platforms with second granularity - * (Solaris,Linux). - */ - apr_sleep(2 * APR_USEC_PER_SEC); + /* + * We are sleeping at least one second - to make sure that any + * fstat() on mtime will actually yield different values - no matter + * how closely spaced the Reset's are issued. (in particular the + * spacing between the test reset from the manager and the reset at + * the commencing - which normally can be within a second - thus + * having identical mtime's on platforms with second granularity + * (Solaris,Linux). + */ + apr_sleep(2 * APR_USEC_PER_SEC); - /* + /* * 1 * 012345678901234 - * command/Reset&maxload=[MaxLoad]&pttime=[PointTime]&maxthreads=[ - * MaxThreads]&exp=[ExpiredList]&urlroot=[UrlRoot] - */ - data += 6; /* position at start of argument string */ - /* Tokenize argument string */ - tab = apr_table_make(r->pool, 0); - - while (*data && (val = ap_getword(r->pool, - (const char **) &data, '&'))) { - key = ap_getword(r->pool, (const char **) &val, '='); - ap_unescape_url(key); - ap_unescape_url(val); - apr_table_set(tab, key, val); - } - /* Put arguments in variables */ - maxload = apr_table_get(tab, "maxload"); - pointtime = apr_table_get(tab, "pttime"); - /* - * The Run Rules pseudocode is ambivalent about this token name: the - * pseudocode says 'maxthreads' but its test command a couple of - * lines down says 'maxthread'. Aside from the question whether we - * should at all pay attention to the token names, I'm going along - * with what the manager script sends which is 'maxthread'. - */ - maxthread = apr_table_get(tab, "maxthread"); - - /* - * OK, this vexes me. Every shred of documentation about SPECWeb - * speaks of a comma-separated list of expired ads, but the cadgen99 - * program segfaults if you pass anything but a whitespace- separated - * list. The Run Rules explicitly state that the pseudo code is the - * definitive Reference By Which This Module Shall Be Coded, yet I - * had to yank the following gem from the perl script: - */ - exp = apr_pstrdup(r->pool, apr_table_get(tab, "exp")); - for(c=exp;*c;c++) - if(*c == ',') *c = ' '; + * command/Reset&maxload=[MaxLoad]&pttime=[PointTime]&maxthreads=[ + * MaxThreads]&exp=[ExpiredList]&urlroot=[UrlRoot] + */ + data += 6; /* position at start of argument string */ - urlroot = apr_table_get(tab, "urlroot"); + /* Tokenize argument string */ + tab = apr_table_make(r->pool, 0); - /* - * Prep: we got a URI from the request. Need to parse that, extract - * the local part and tack that onto docroot. - */ - if ((rv = - apr_uri_parse(r->pool, urlroot, &urlrootrec)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_NOERRNO, rv, r->server, - "The URL Root '%s' was invalid", urlroot); - returnHTMLPageWithMessage(r, "The UrlRoot passed was invalid"); - return OK; - } - if (!urlrootrec.path) { - urlrootrec.path = ""; + while (*data && (val = ap_getword(r->pool, + (const char **) &data, '&'))) { + key = ap_getword(r->pool, (const char **) &val, '='); + ap_unescape_url(key); + ap_unescape_url(val); + apr_table_set(tab, key, val); } - rootdir = ap_os_escape_path(r->pool, - ap_make_full_path(r->pool, - docroot, - urlrootrec.path), 0); + /* Put arguments in variables */ + maxload = apr_table_get(tab, "maxload"); + pointtime = apr_table_get(tab, "pttime"); + /* + * The Run Rules pseudocode is ambivalent about this token name: the + * pseudocode says 'maxthreads' but its test command a couple of + * lines down says 'maxthread'. Aside from the question whether we + * should at all pay attention to the token names, I'm going along + * with what the manager script sends which is 'maxthread'. + */ + maxthread = apr_table_get(tab, "maxthread"); - /* Call upfgen and cadgen */ - /* - * Keep request arguments around, we need them for eventual response - */ - saveargs = apr_pstrdup(r->pool, r->args); + /* + * OK, this vexes me. Every shred of documentation about SPECWeb + * speaks of a comma-separated list of expired ads, but the cadgen99 + * program segfaults if you pass anything but a whitespace- separated + * list. The Run Rules explicitly state that the pseudo code is the + * definitive Reference By Which This Module Shall Be Coded, yet I + * had to yank the following gem from the perl script: + */ + exp = apr_pstrdup(r->pool, apr_table_get(tab, "exp")); + for(c=exp;*c;c++) + if(*c == ',') *c = ' '; - cmd1 = apr_psprintf(r->pool, "%s -C %s -n %s -t %s", - _my->upfgen99, docroot, maxload, maxthread); + urlroot = apr_table_get(tab, "urlroot"); - if((cmd1res = system(cmd1)) != 0) - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, - "Call failed %d=%s",cmd1res,cmd1); - else - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, 0, r->server, - "Called %s",cmd1); + /* + * Prep: we got a URI from the request. Need to parse that, extract + * the local part and tack that onto docroot. + */ + rv = apr_uri_parse(r->pool, urlroot, &urlrootrec); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_NOERRNO, rv, r->server, + "The URL Root '%s' was invalid", urlroot); + returnHTMLPageWithMessage(r, "The UrlRoot passed was invalid"); + return OK; + } + if (!urlrootrec.path) { + urlrootrec.path = ""; + } + rootdir = ap_os_escape_path(r->pool, ap_make_full_path(r->pool, + docroot, urlrootrec.path), 0); - cmd2 = apr_psprintf(r->pool, "%s -C %s -e %s -t %s %s", - _my->cadgen99, docroot, pointtime, maxthread, exp); + /* Call upfgen and cadgen */ + /* + * Keep request arguments around, we need them for eventual response + */ + saveargs = apr_pstrdup(r->pool, r->args); - cmd2res = system(cmd2); + cmd1 = apr_psprintf(r->pool, "%s -C %s -n %s -t %s", + _my->upfgen99, docroot, maxload, maxthread); - if((cmd1res = system(cmd2)) != 0) - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, - "Call failed %d=%s",cmd2res,cmd2); - else - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, 0, r->server, - "Called %s",cmd2); + if((cmd1res = system(cmd1)) != 0) + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, + "Call failed %d=%s",cmd1res,cmd1); + else + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, 0, r->server, + "Called %s",cmd1); + + cmd2 = apr_psprintf(r->pool, "%s -C %s -e %s -t %s %s", + _my->cadgen99, docroot, pointtime, + maxthread, exp); + + cmd2res = system(cmd2); + + if((cmd1res = system(cmd2)) != 0) + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, + r->server, "Call failed %d=%s",cmd2res,cmd2); + else + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, 0, + r->server, "Called %s",cmd2); - r->args = saveargs; - /* - * Reset post.log i.e. Truncate, open for writing - */ - if ((rv = - apr_file_open(&f, _my->log_path, - APR_WRITE | APR_CREATE | APR_TRUNCATE, - APR_OS_DEFAULT, r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "Could not open post.log '%s' for writing", - _my->log_path); - returnHTMLPageWithMessage(r, - "Error: couldn't open post.log for writing."); - return OK; - } + r->args = saveargs; + /* + * Reset post.log i.e. Truncate, open for writing + */ + rv = apr_file_open(&f, _my->log_path, + APR_WRITE | APR_CREATE | APR_TRUNCATE, + APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "Could not open post.log '%s' for writing", + _my->log_path); + returnHTMLPageWithMessage(r, + "Error: couldn't open post.log for writing."); + return OK; + } - line = apr_psprintf(r->pool, "%10d\n", 0); + line = apr_psprintf(r->pool, "%10d\n", 0); rv = apr_file_write_full(f, line, strlen(line), NULL); if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "Could not write to post.log '%s'", _my->log_path); - returnHTMLPageWithMessage(r, - "Error: could not write to post.log."); - } - else { - returnHTMLPageWithMessage(r, "%s\n%d\n%s\n%d\n", - cmd1,cmd1res,cmd2,cmd2res); - } + "Could not write to post.log '%s'", _my->log_path); + returnHTMLPageWithMessage(r, "Error: could not write to post.log."); + } + else { + returnHTMLPageWithMessage(r, "%s\n%d\n%s\n%d\n", + cmd1,cmd1res,cmd2,cmd2res); + } - apr_file_close(f); + apr_file_close(f); - return OK; - } /* Reset Command */ + return OK; + } /* Reset Command */ /* Fall through */ returnHTMLPageWithMessage(r, "Error: unrecognized command '%s'", r->args); @@ -806,7 +793,7 @@ returnHTMLPageWithFile(r, path); return OK; -} /* do_standard_get */ +} @@ -829,12 +816,11 @@ Y = apr_psprintf(r->pool, "%1d", adid % 9); if ((rv = apr_stat(&s, fname, APR_FINFO_SIZE, r->pool)) != APR_SUCCESS) - return NULL; + return NULL; - if ((rv = - apr_file_open(&f, fname, APR_READ, APR_OS_DEFAULT, - r->pool)) != APR_SUCCESS) - return NULL; + rv = apr_file_open(&f, fname, APR_READ, APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) + return NULL; len = s.size; buf = apr_palloc(r->pool, len + 1); @@ -844,8 +830,8 @@ * oprofile shows a lot of samples in file_read_actor in the Linux kernel. */ if (((rv = apr_file_read_full(f, buf, len, &l)) != APR_SUCCESS) - || (l != len)) - return NULL; /* Error on read */ + || (l != len)) + return NULL; /* Error on read */ buf[len] = '\0'; /* Null terminate it so the strstr will * halt @@ -857,21 +843,22 @@ * disease on todays web pages)? */ while ((index = strstr(index, MARKER)) != NULL) { - /* This lands us a new index */ -/* <!WEB99CAD><IMG SRC="/file_set/dirNNNNN/classX_Y"> - * 01234567890123456789012345678901234567890123456789 - * 1 2 3 4 */ - for (i = 0; i < 5; i++) { - *(index + 34 + i) = N[i]; - } - *(index + 45) = *X; - *(index + 47) = *Y; - index += 50; /* Put the index past this marker, continue - * scanning */ + /* This lands us a new index */ + /* <!WEB99CAD><IMG SRC="/file_set/dirNNNNN/classX_Y"> + * 01234567890123456789012345678901234567890123456789 + * 1 2 3 4 + */ + for (i = 0; i < 5; i++) { + *(index + 34 + i) = N[i]; + } + *(index + 45) = *X; + *(index + 47) = *Y; + index += 50; /* Put the index past this marker, continue + * scanning */ } returnHTMLPageWithBuffer(r, buf, len); -} /* customadscan */ +} /*********************************************************************** @@ -897,7 +884,7 @@ #ifdef DEBUG ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server, - "Full path is '%s'", filename); + "Full path is '%s'", filename); #endif /* * Calculate UserIndex into User.Personality file UserIndex = MyUser - @@ -910,98 +897,98 @@ */ if (checkUPFile(r->server, r, _my)) { - ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, - "User personality check failed."); - returnHTMLPageWithMessage(r, - "Error: User personality file check failed."); - return HTTP_INTERNAL_SERVER_ERROR; + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, + "User personality check failed."); + returnHTMLPageWithMessage(r, + "Error: User personality file check failed."); + return HTTP_INTERNAL_SERVER_ERROR; } if (userindex < 0 || userindex >= _my->up_count) { - /* Couldn't find it, so let's make our mark and leave */ + /* Couldn't find it, so let's make our mark and leave */ #ifdef DEBUG - specweb99_debug(r->server, "User record not found"); + specweb99_debug(r->server, "User record not found"); #endif - returnHTMLPageWithMessage(r, - "User Record %d not found (out of my current range %d .. %d)", - userindex + 10000, 10000, - _my->up_count + 10000 - 1); - ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, - "User Record %d not found (out of my current range %d .. %d)", - userindex + 10000, 10000, _my->up_count + 10000 - 1); - return OK; + returnHTMLPageWithMessage(r, + "User Record %d not found (out of my current range %d .. %d)", + userindex + 10000, 10000, + _my->up_count + 10000 - 1); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, + "User Record %d not found (out of my current range %d .. %d)", + userindex + 10000, 10000, _my->up_count + 10000 - 1); + return OK; } userdemographics = _my->up[userindex]; adindex = (last_ad + 1) % 360; -/* - Do For Each Ad in Custom.Ads starting where Ad_index == Ad_id -*/ + /* + * Do For Each Ad in Custom.Ads starting where Ad_index == Ad_id + */ while (1) { -/* CombinedDemographics = ( AdDemographics & UserDemographics ) */ - combineddemographics = - (_my->cad[adindex].addemographics) & userdemographics; -/* Ad_weight = 0 */ - ad_weight = 0; - if (combineddemographics & GENDER_MASK) { - ad_weight += _my->cad[adindex].gen_weightings; - } - if (combineddemographics & AGE_GROUP_MASK) { - ad_weight += _my->cad[adindex].age_weightings; - } - if (combineddemographics & REGION_MASK) { - ad_weight += _my->cad[adindex].reg_weightings; - } - if (combineddemographics & INTEREST1_MASK) { - ad_weight += _my->cad[adindex].int1_weightings; - } - if (combineddemographics & INTEREST2_MASK) { - ad_weight += _my->cad[adindex].int2_weightings; - } - if (ad_weight >= _my->cad[adindex].minimum_match_value) { - break; - } - adindex = (adindex + 1) % 360; - if (adindex == last_ad) { - ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, - "Ad to expire not found"); - break; - } - } - expired = - ((time((time_t *) NULL) > _my->cad[adindex].expiration_time)) ? 1 : 0; + /* CombinedDemographics = ( AdDemographics & UserDemographics ) */ + combineddemographics = + (_my->cad[adindex].addemographics) & userdemographics; + /* Ad_weight = 0 */ + ad_weight = 0; + if (combineddemographics & GENDER_MASK) { + ad_weight += _my->cad[adindex].gen_weightings; + } + if (combineddemographics & AGE_GROUP_MASK) { + ad_weight += _my->cad[adindex].age_weightings; + } + if (combineddemographics & REGION_MASK) { + ad_weight += _my->cad[adindex].reg_weightings; + } + if (combineddemographics & INTEREST1_MASK) { + ad_weight += _my->cad[adindex].int1_weightings; + } + if (combineddemographics & INTEREST2_MASK) { + ad_weight += _my->cad[adindex].int2_weightings; + } + if (ad_weight >= _my->cad[adindex].minimum_match_value) { + break; + } + adindex = (adindex + 1) % 360; + if (adindex == last_ad) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, + "Ad to expire not found"); + break; + } + } + expired = + ((time((time_t *) NULL) > _my->cad[adindex].expiration_time)) ? 1 : 0; - ap_log_error(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, 0, r->server, - "Found ad %d : expire %s (%d > %d)", - adindex, expired ? "yes" : "no", - (int) time((time_t *) NULL), - _my->cad[adindex].expiration_time); - - cookie_out = apr_psprintf(r->pool, - "found_cookie=Ad_id=%d&Ad_weight=%d&Expired=%d", - adindex, ad_weight, expired); - apr_table_setn(r->headers_out, "Set-Cookie", cookie_out); - - if ((strstr(filename, "class1") != NULL) || - (strstr(filename, "class2") != NULL)) { - customadscan(r, filename, adindex); - } - else { - returnHTMLPageWithFile(r, filename); - } - return OK; + ap_log_error(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, 0, r->server, + "Found ad %d : expire %s (%d > %d)", + adindex, expired ? "yes" : "no", + (int) time((time_t *) NULL), + _my->cad[adindex].expiration_time); + + cookie_out = apr_psprintf(r->pool, + "found_cookie=Ad_id=%d&Ad_weight=%d&Expired=%d", + adindex, ad_weight, expired); + apr_table_setn(r->headers_out, "Set-Cookie", cookie_out); + + if ((strstr(filename, "class1") != NULL) || + (strstr(filename, "class2") != NULL)) { + customadscan(r, filename, adindex); + } + else { + returnHTMLPageWithFile(r, filename); + } + return OK; } static char *_log_and_write(struct request_rec *r, apr_file_t * f, - char *filename, const char *urlroot, int dirnum, - int classnum, int filenum, int clientnum, int uid) + char *filename, const char *urlroot, int dirnum, + int classnum, int filenum, int clientnum, int uid) { pid_t pid; time_t stamp; apr_uint32_t recnum; - char recnumstr[12]; /* ten wide plus return plus \0 */ + char recnumstr[12]; /* ten wide plus return plus \0 */ apr_size_t l; apr_off_t zero = 0; apr_status_t rv; @@ -1010,25 +997,25 @@ pid = getpid(); if ((rv = apr_file_read_full(f, recnumstr, 11, &l)) != APR_SUCCESS) - return "Failed to read recordcount from post.log"; + return "Failed to read recordcount from post.log"; recnumstr[11] = '\0'; recnum = atol(recnumstr) + 1; if ((rv = apr_file_seek(f, APR_SET, &zero)) != APR_SUCCESS) - return "Failed to seek 0 to post.log"; + return "Failed to seek 0 to post.log"; - if ((rv=(apr_file_printf(f, "%10d", recnum))) < 0) - return "Failed to write num to post.log"; + if ((rv=(apr_file_printf(f, "%10d", recnum))) < 0) + return "Failed to write num to post.log"; if ((rv = apr_file_seek(f, APR_END, &zero)) != APR_SUCCESS) - return "Failed to seek end to post.log"; + return "Failed to seek end to post.log"; if ((apr_file_printf - (f, "%10d %10d %10d %5d %2d %2d %10d %-60.60s %10d %10d\n", recnum, - (int) stamp, (int) pid, dirnum, classnum, filenum, clientnum, - filename, (int) pid, uid)) < 0) - return "Failed to write record to post.log"; + (f, "%10d %10d %10d %5d %2d %2d %10d %-60.60s %10d %10d\n", recnum, + (int) stamp, (int) pid, dirnum, classnum, filenum, clientnum, + filename, (int) pid, uid)) < 0) + return "Failed to write record to post.log"; apr_file_flush(f); @@ -1053,17 +1040,17 @@ docroot = ap_document_root(r); -/*Begin:*/ -/* Make substitutions in HTML return page for the following:*/ -/* Server_Software*/ -/* Remote_Addr*/ -/* Script_Name*/ -/* QueryString*/ -/* The above is done in the returnHTMLPageWith... functions */ - -/* Parse PostInput - a sample format is as follows */ -/* (keys may be received in any order):*/ -/* urlroot=[urlroot]&dir=[Dir#]&class=[Class#]&num=[File#]&client=[Client#]*/ + /*Begin:*/ + /* Make substitutions in HTML return page for the following:*/ + /* Server_Software*/ + /* Remote_Addr*/ + /* Script_Name*/ + /* QueryString*/ + /* The above is done in the returnHTMLPageWith... functions */ + + /* Parse PostInput - a sample format is as follows */ + /* (keys may be received in any order):*/ + /* urlroot=[urlroot]&dir=[Dir#]&class=[Class#]&num=[File#]&client=[Client#]*/ type = apr_table_get(r->headers_in, "Content-Type"); /* @@ -1072,30 +1059,30 @@ * affects the pre-run tests: the regular client does send the header. */ if ((type == NULL) || (strcasecmp(type, DEFAULT_ENCTYPE) != 0)) { - ap_log_error(APLOG_MARK, - APLOG_WARNING | APLOG_NOERRNO, 0, - r->server, - "The client didn't send %s as Content-Type. Version " - "1.02 of the SPECWeb does not do this and thus violates " - "the HTTP specification. Please apply the following " - "patch to your manager script and bitch to SPEC that " - "they fix this:\n%s", DEFAULT_ENCTYPE, - SPEC_MANAGER_PATCH); - return HTTP_INTERNAL_SERVER_ERROR; + ap_log_error(APLOG_MARK, + APLOG_WARNING | APLOG_NOERRNO, 0, + r->server, + "The client didn't send %s as Content-Type. Version " + "1.02 of the SPECWeb does not do this and thus violates " + "the HTTP specification. Please apply the following " + "patch to your manager script and bitch to SPEC that " + "they fix this:\n%s", DEFAULT_ENCTYPE, + SPEC_MANAGER_PATCH); + return HTTP_INTERNAL_SERVER_ERROR; } if (ap_setup_client_block(r, REQUEST_CHUNKED_ERROR) != OK) { - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, - "Could not setup client block"); - returnHTMLPageWithMessage(r, "Couldn't set up client block"); - return HTTP_INTERNAL_SERVER_ERROR; + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, + "Could not setup client block"); + returnHTMLPageWithMessage(r, "Couldn't set up client block"); + return HTTP_INTERNAL_SERVER_ERROR; } if (!ap_should_client_block(r)) { - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, - "No POST data"); - returnHTMLPageWithMessage(r, "No POST data"); - return HTTP_INTERNAL_SERVER_ERROR; + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, r->server, + "No POST data"); + returnHTMLPageWithMessage(r, "No POST data"); + return HTTP_INTERNAL_SERVER_ERROR; } length = r->remaining; @@ -1104,105 +1091,104 @@ while ((len_read = ap_get_client_block(r, argsbuffer, sizeof(argsbuffer))) > 0) { - if ((rpos + len_read) > length) { - rsize = length - rpos; - } - else { - rsize = len_read; - } - memcpy((char *) data + rpos, argsbuffer, rsize); - rpos += rsize; + if ((rpos + len_read) > length) { + rsize = length - rpos; + } + else { + rsize = len_read; + } + memcpy((char *) data + rpos, argsbuffer, rsize); + rpos += rsize; } data[length] = '\0'; - posterr = 5; /* Counter to make sure we get all VARiables - * from the CGI post */ + posterr = 5; /* Counter to make sure we get all VARiables + * from the CGI post */ while (data) { - const char *p = data; + const char *p = data; - data = index(p, '&' /* 0x26 */ ); - if (data != NULL) - *data++ = '\0'; - - if (strncmp(p, "urlroot=", 8) == 0) { - urlroot = apr_pstrdup(r->pool, p + 8); - posterr--; - } - else if (strncmp(p, "dir=", 4) == 0) { - dirnum = atoi(p + 4); - posterr--; - } - else if (strncmp(p, "class=", 6) == 0) { - classnum = atoi(p + 6); - posterr--; - } - else if (strncmp(p, "num=", 4) == 0) { - filenum = atoi(p + 4); - posterr--; - } - else if (strncmp(p, "client=", 7) == 0) { - clientnum = atoi(p + 7); - posterr--; - } + data = index(p, '&' /* 0x26 */ ); + if (data != NULL) + *data++ = '\0'; + + if (strncmp(p, "urlroot=", 8) == 0) { + urlroot = apr_pstrdup(r->pool, p + 8); + posterr--; + } + else if (strncmp(p, "dir=", 4) == 0) { + dirnum = atoi(p + 4); + posterr--; + } + else if (strncmp(p, "class=", 6) == 0) { + classnum = atoi(p + 6); + posterr--; + } + else if (strncmp(p, "num=", 4) == 0) { + filenum = atoi(p + 4); + posterr--; + } + else if (strncmp(p, "client=", 7) == 0) { + clientnum = atoi(p + 7); + posterr--; + } } if (posterr != 0) { - ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, - r->server, "Did not get all POST arguments"); - returnHTMLPageWithMessage(r, "Did not get all POST arguments"); - return HTTP_INTERNAL_SERVER_ERROR; - } - -/* Filename = [urlroot]/dir[5-digit Dir#]/class[Class#]_[File#]*/ -/* (for example, the POST input of */ -/* urlroot=/specweb99/file_set&dir=00123&class=1&num=1&client=10003 */ -/* would make Filename = /specweb99/file_set/dir00123/class1_1)*/ - - filename = ap_make_full_path(r->pool, - docroot, apr_psprintf(r->pool, - "%s/dir%05d/class%1d_%1d", - urlroot, dirnum, - classnum, filenum)); + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, 0, + r->server, "Did not get all POST arguments"); + returnHTMLPageWithMessage(r, "Did not get all POST arguments"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Filename = [urlroot]/dir[5-digit Dir#]/class[Class#]_[File#]*/ + /* (for example, the POST input of */ + /* urlroot=/specweb99/file_set&dir=00123&class=1&num=1&client=10003 */ + /* would make Filename = /specweb99/file_set/dir00123/class1_1)*/ + + filename = ap_make_full_path(r->pool, docroot, apr_psprintf(r->pool, + "%s/dir%05d/class%1d_%1d", + urlroot, dirnum, classnum, filenum)); /* Do_atomically (for example, using a file lock or other mutex): */ if ((rv = apr_file_open(&f, _my->log_path, APR_READ | APR_WRITE, - APR_OS_DEFAULT, r->pool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "Failed to open post.log '%s' for updating", - _my->log_path); - returnHTMLPageWithMessage(r, - "Failed to open post.log file for updating"); - return HTTP_INTERNAL_SERVER_ERROR; + APR_OS_DEFAULT, r->pool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "Failed to open post.log '%s' for updating", + _my->log_path); + returnHTMLPageWithMessage(r, + "Failed to open post.log file for updating"); + return HTTP_INTERNAL_SERVER_ERROR; } - if ((rv = _wlock(r->server, r, f, _my->log_path)) != APR_SUCCESS) - returnHTMLPageWithMessage(r, "Failed to lock post.log file"); - else { - char *msg = - _log_and_write(r, f, filename, urlroot, dirnum, classnum, filenum, - clientnum, uid); - if (msg) { - rv = APR_OS_START_USEERR; - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, msg); - returnHTMLPageWithMessage(r, msg); + if ((rv = _wlock(r->server, r, f, _my->log_path)) != APR_SUCCESS) { + returnHTMLPageWithMessage(r, "Failed to lock post.log file"); } + else { + char *msg = + _log_and_write(r, f, filename, urlroot, dirnum, classnum, filenum, + clientnum, uid); + if (msg) { + rv = APR_OS_START_USEERR; + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, msg); + returnHTMLPageWithMessage(r, msg); + } } if ((rv2 = apr_file_unlock(f)) != APR_SUCCESS) { - if (rv == APR_SUCCESS) { - rv = rv2; - ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "Failed to unlock %s", filename ? filename : ""); - returnHTMLPageWithMessage(r, "Failed to lock unpost.log file"); - } + if (rv == APR_SUCCESS) { + rv = rv2; + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "Failed to unlock %s", filename ? filename : ""); + returnHTMLPageWithMessage(r, "Failed to lock unpost.log file"); + } } apr_file_close(f); if (rv != APR_SUCCESS) - return HTTP_INTERNAL_SERVER_ERROR; /* _log_and_write() will have - * displayed a page already */ + return HTTP_INTERNAL_SERVER_ERROR; /* _log_and_write() will have + * displayed a page already */ /* * CookieString = "my_cookie=<myCookie>" @@ -1212,7 +1198,7 @@ * number. */ apr_table_setn(r->headers_out, "Set-Cookie", - apr_psprintf(r->pool, "my_cookie=%d", uid)); + apr_psprintf(r->pool, "my_cookie=%d", uid)); /* * Return HTML Page with File='RootDir/FileName' and Cookie=CookieString @@ -1220,15 +1206,16 @@ returnHTMLPageWithFile(r, filename); return OK; -} /* do_post */ +} /* do_post */ static int specweb99_quick_handler(request_rec *r, int lookup) { const char *cookie_in; - + if (!((strlen(r->uri) == 1) && /* dynamic uri is "/" */ - (r->args || /* dynamic GET must have args */ - r->method_number == M_POST))) { /* but not POST */ + (r->args || /* dynamic GET must have args */ + r->method_number == M_POST))) { /* but not POST */ + return DECLINED; } cookie_in = apr_table_get(r->headers_in, "Cookie"); @@ -1237,8 +1224,7 @@ char *end; #ifdef DEBUG specweb99_debug(r->server, ap_psprintf(r->pool, - "Got a cookie: %s", - cookie_in)); + "Got a cookie: %s", cookie_in)); #endif /* * Parse Cookie string into MyUser and Last_Ad(cadget). The format of the @@ -1252,9 +1238,9 @@ last_ad = atoi(end + 9); /* We trust that there is something behind * the last_ad value to stop the conversion */ - return do_cadget(r, user_id, last_ad); + return do_cadget(r, user_id, last_ad); } - return do_post(r, user_id); + return do_post(r, user_id); } if (!strncmp(r->args, "command/", 8)) { return do_housekeeping(r); @@ -1266,17 +1252,17 @@ { ap_hook_post_config(specweb99_module_init, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_child_init(specweb99_child_init, NULL, NULL, APR_HOOK_MIDDLE); - + ap_hook_quick_handler(specweb99_quick_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA specweb99_module = { STANDARD20_MODULE_STUFF, - NULL, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - specweb99_server_create, /* server config */ - NULL, /* merge server config */ - NULL, /* command apr_table_t */ - register_hooks /* register hooks */ + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + specweb99_server_create,/* server config */ + NULL, /* merge server config */ + NULL, /* command apr_table_t */ + register_hooks /* register hooks */ };