You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Paul J. Reder" <re...@raleigh.ibm.com> on 1999/12/03 21:17:33 UTC
[Patch]: Port of mod_rewrite to Apache 2.0 with APR.
Attached is a patch which ports mod_rewrite to Apache 2.0 using
APR. It effects mod_rewrite.c and mod_rewrite.h.
There are also a few cleanups of new-> variables to names that
avoid confusion or future problems.
--
Paul J. Reder
------------------------------------------------------------
"Remember, Information is not knowledge; Knowledge is not Wisdom;
Wisdom is not truth; Truth is not beauty; Beauty is not love;
Love is not music; Music is the best." -- Frank Zappa
-----------------------------------------------------------------------------
Index: mod_rewrite.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_rewrite.c,v
retrieving revision 1.5
diff -u -r1.5 mod_rewrite.c
--- mod_rewrite.c 1999/10/22 16:01:27 1.5
+++ mod_rewrite.c 1999/12/03 19:55:27
@@ -89,8 +89,18 @@
*/
+#include "httpd.h"
+#include "http_config.h"
+#include "http_request.h"
+#include "http_core.h"
+#include "http_log.h"
+#include "http_protocol.h"
#include "mod_rewrite.h"
+#if !defined(OS2) && !defined(WIN32)
+#include "unixd.h"
+#endif
+
#ifndef NO_WRITEV
#include <sys/types.h>
#include <sys/uio.h>
@@ -183,27 +193,26 @@
{ NULL }
};
+static void register_hooks(void)
+{
+ ap_hook_post_config(init_module,NULL,NULL,HOOK_MIDDLE);
+ ap_hook_child_init(init_child,NULL,NULL,HOOK_MIDDLE);
+
+ ap_hook_fixups(hook_fixup,NULL,NULL,HOOK_FIRST);
+ ap_hook_translate_name(hook_uri2file,NULL,NULL,HOOK_FIRST);
+ ap_hook_type_checker(hook_mimetype,NULL,NULL,HOOK_MIDDLE);
+}
+
/* the main config structure */
module MODULE_VAR_EXPORT rewrite_module = {
- STANDARD_MODULE_STUFF,
- init_module, /* module initializer */
+ STANDARD20_MODULE_STUFF,
config_perdir_create, /* create per-dir config structures */
config_perdir_merge, /* merge per-dir config structures */
config_server_create, /* create per-server config structures */
config_server_merge, /* merge per-server config structures */
- command_table, /* ap_table_t of config file commands */
+ command_table, /* ap_table_t of config file commands */
handler_table, /* [#8] MIME-typed-dispatched handlers */
- hook_uri2file, /* [#1] URI to filename translation */
- NULL, /* [#4] validate user id from request */
- NULL, /* [#5] check if the user is ok _here_ */
- NULL, /* [#3] check access by host address */
- hook_mimetype, /* [#6] determine MIME type */
- hook_fixup, /* [#7] pre-run fixups */
- NULL, /* [#9] log a transaction */
- NULL, /* [#2] header parser */
- init_child, /* child_init */
- NULL, /* child_exit */
- NULL /* [#0] post read-request */
+ register_hooks /* register hooks */
};
/* the cache */
@@ -211,9 +220,10 @@
/* whether proxy module is available or not */
static int proxy_available;
+static int once_through = 0;
-static char *lockname;
-static int lockfd = -1;
+static const char *lockname;
+static ap_file_t *lockfd = NULL;
/*
** +-------------------------------------------------------+
@@ -238,7 +248,7 @@
a->state = ENGINE_DISABLED;
a->options = OPTION_NONE;
a->rewritelogfile = NULL;
- a->rewritelogfp = -1;
+ a->rewritelogfp = NULL;
a->rewriteloglevel = 0;
a->rewritemaps = ap_make_array(p, 2, sizeof(rewritemap_entry));
a->rewriteconds = ap_make_array(p, 2, sizeof(rewritecond_entry));
@@ -271,7 +281,7 @@
a->rewritelogfile = overrides->rewritelogfile != NULL
? overrides->rewritelogfile
: base->rewritelogfile;
- a->rewritelogfp = overrides->rewritelogfp != -1
+ a->rewritelogfp = overrides->rewritelogfp != NULL
? overrides->rewritelogfp
: base->rewritelogfp;
a->rewritemaps = ap_append_arrays(p, overrides->rewritemaps,
@@ -448,56 +458,56 @@
char *a2)
{
rewrite_server_conf *sconf;
- rewritemap_entry *new;
+ rewritemap_entry *newmap;
struct stat st;
sconf = (rewrite_server_conf *)
ap_get_module_config(cmd->server->module_config, &rewrite_module);
- new = ap_push_array(sconf->rewritemaps);
+ newmap = ap_push_array(sconf->rewritemaps);
- new->name = a1;
- new->func = NULL;
+ newmap->name = a1;
+ newmap->func = NULL;
if (strncmp(a2, "txt:", 4) == 0) {
- new->type = MAPTYPE_TXT;
- new->datafile = a2+4;
- new->checkfile = a2+4;
+ newmap->type = MAPTYPE_TXT;
+ newmap->datafile = a2+4;
+ newmap->checkfile = a2+4;
}
else if (strncmp(a2, "rnd:", 4) == 0) {
- new->type = MAPTYPE_RND;
- new->datafile = a2+4;
- new->checkfile = a2+4;
+ newmap->type = MAPTYPE_RND;
+ newmap->datafile = a2+4;
+ newmap->checkfile = a2+4;
}
else if (strncmp(a2, "dbm:", 4) == 0) {
#ifndef NO_DBM_REWRITEMAP
- new->type = MAPTYPE_DBM;
- new->datafile = a2+4;
- new->checkfile = ap_pstrcat(cmd->pool, a2+4, NDBM_FILE_SUFFIX, NULL);
+ newmap->type = MAPTYPE_DBM;
+ newmap->datafile = a2+4;
+ newmap->checkfile = ap_pstrcat(cmd->pool, a2+4, NDBM_FILE_SUFFIX, NULL);
#else
return ap_pstrdup(cmd->pool, "RewriteMap: cannot use NDBM mapfile, "
"because no NDBM support is compiled in");
#endif
}
else if (strncmp(a2, "prg:", 4) == 0) {
- new->type = MAPTYPE_PRG;
- new->datafile = a2+4;
- new->checkfile = a2+4;
+ newmap->type = MAPTYPE_PRG;
+ newmap->datafile = a2+4;
+ newmap->checkfile = a2+4;
}
else if (strncmp(a2, "int:", 4) == 0) {
- new->type = MAPTYPE_INT;
- new->datafile = NULL;
- new->checkfile = NULL;
+ newmap->type = MAPTYPE_INT;
+ newmap->datafile = NULL;
+ newmap->checkfile = NULL;
if (strcmp(a2+4, "tolower") == 0) {
- new->func = rewrite_mapfunc_tolower;
+ newmap->func = rewrite_mapfunc_tolower;
}
else if (strcmp(a2+4, "toupper") == 0) {
- new->func = rewrite_mapfunc_toupper;
+ newmap->func = rewrite_mapfunc_toupper;
}
else if (strcmp(a2+4, "escape") == 0) {
- new->func = rewrite_mapfunc_escape;
+ newmap->func = rewrite_mapfunc_escape;
}
else if (strcmp(a2+4, "unescape") == 0) {
- new->func = rewrite_mapfunc_unescape;
+ newmap->func = rewrite_mapfunc_unescape;
}
else if (sconf->state == ENGINE_ENABLED) {
return ap_pstrcat(cmd->pool, "RewriteMap: internal map not found:",
@@ -505,18 +515,18 @@
}
}
else {
- new->type = MAPTYPE_TXT;
- new->datafile = a2;
- new->checkfile = a2;
+ newmap->type = MAPTYPE_TXT;
+ newmap->datafile = a2;
+ newmap->checkfile = a2;
}
- new->fpin = -1;
- new->fpout = -1;
+ newmap->fpin = NULL;
+ newmap->fpout = NULL;
- if (new->checkfile && (sconf->state == ENGINE_ENABLED)
- && (stat(new->checkfile, &st) == -1)) {
+ if (newmap->checkfile && (sconf->state == ENGINE_ENABLED)
+ && (stat(newmap->checkfile, &st) == -1)) {
return ap_pstrcat(cmd->pool,
"RewriteMap: map file or program not found:",
- new->checkfile, NULL);
+ newmap->checkfile, NULL);
}
return NULL;
@@ -556,7 +566,7 @@
char *str)
{
rewrite_server_conf *sconf;
- rewritecond_entry *new;
+ rewritecond_entry *newcond;
regex_t *regexp;
char *a1;
char *a2;
@@ -570,10 +580,10 @@
/* make a new entry in the internal temporary rewrite rule list */
if (cmd->path == NULL) { /* is server command */
- new = ap_push_array(sconf->rewriteconds);
+ newcond = ap_push_array(sconf->rewriteconds);
}
else { /* is per-directory command */
- new = ap_push_array(dconf->rewriteconds);
+ newcond = ap_push_array(dconf->rewriteconds);
}
/* parse the argument line ourself */
@@ -583,14 +593,14 @@
}
/* arg1: the input string */
- new->input = ap_pstrdup(cmd->pool, a1);
+ newcond->input = ap_pstrdup(cmd->pool, a1);
/* arg3: optional flags field
(this have to be first parsed, because we need to
know if the regex should be compiled with ICASE!) */
- new->flags = CONDFLAG_NONE;
+ newcond->flags = CONDFLAG_NONE;
if (a3 != NULL) {
- if ((err = cmd_rewritecond_parseflagfield(cmd->pool, new,
+ if ((err = cmd_rewritecond_parseflagfield(cmd->pool, newcond,
a3)) != NULL) {
return err;
}
@@ -600,14 +610,14 @@
try to compile the regexp to test if is ok */
cp = a2;
if (cp[0] == '!') {
- new->flags |= CONDFLAG_NOTMATCH;
+ newcond->flags |= CONDFLAG_NOTMATCH;
cp++;
}
/* now be careful: Under the POSIX regex library
we can compile the pattern for case insensitive matching,
under the old V8 library we have to do it self via a hack */
- if (new->flags & CONDFLAG_NOCASE) {
+ if (newcond->flags & CONDFLAG_NOCASE) {
rc = ((regexp = ap_pregcomp(cmd->pool, cp, REG_EXTENDED|REG_ICASE))
== NULL);
}
@@ -620,8 +630,8 @@
a2, "'\n", NULL);
}
- new->pattern = ap_pstrdup(cmd->pool, cp);
- new->regexp = regexp;
+ newcond->pattern = ap_pstrdup(cmd->pool, cp);
+ newcond->regexp = regexp;
return NULL;
}
@@ -699,7 +709,7 @@
char *str)
{
rewrite_server_conf *sconf;
- rewriterule_entry *new;
+ rewriterule_entry *newrule;
regex_t *regexp;
char *a1;
char *a2;
@@ -713,10 +723,10 @@
/* make a new entry in the internal rewrite rule list */
if (cmd->path == NULL) { /* is server command */
- new = ap_push_array(sconf->rewriterules);
+ newrule = ap_push_array(sconf->rewriterules);
}
else { /* is per-directory command */
- new = ap_push_array(dconf->rewriterules);
+ newrule = ap_push_array(dconf->rewriterules);
}
/* parse the argument line ourself */
@@ -726,13 +736,13 @@
}
/* arg3: optional flags field */
- new->forced_mimetype = NULL;
- new->forced_responsecode = HTTP_MOVED_TEMPORARILY;
- new->flags = RULEFLAG_NONE;
- new->env[0] = NULL;
- new->skip = 0;
+ newrule->forced_mimetype = NULL;
+ newrule->forced_responsecode = HTTP_MOVED_TEMPORARILY;
+ newrule->flags = RULEFLAG_NONE;
+ newrule->env[0] = NULL;
+ newrule->skip = 0;
if (a3 != NULL) {
- if ((err = cmd_rewriterule_parseflagfield(cmd->pool, new,
+ if ((err = cmd_rewriterule_parseflagfield(cmd->pool, newrule,
a3)) != NULL) {
return err;
}
@@ -743,11 +753,11 @@
*/
cp = a1;
if (cp[0] == '!') {
- new->flags |= RULEFLAG_NOTMATCH;
+ newrule->flags |= RULEFLAG_NOTMATCH;
cp++;
}
mode = REG_EXTENDED;
- if (new->flags & RULEFLAG_NOCASE) {
+ if (newrule->flags & RULEFLAG_NOCASE) {
mode |= REG_ICASE;
}
if ((regexp = ap_pregcomp(cmd->pool, cp, mode)) == NULL) {
@@ -755,26 +765,26 @@
"RewriteRule: cannot compile regular expression '",
a1, "'\n", NULL);
}
- new->pattern = ap_pstrdup(cmd->pool, cp);
- new->regexp = regexp;
+ newrule->pattern = ap_pstrdup(cmd->pool, cp);
+ newrule->regexp = regexp;
/* arg2: the output string
* replace the $<N> by \<n> which is needed by the currently
* used Regular Expression library
*/
- new->output = ap_pstrdup(cmd->pool, a2);
+ newrule->output = ap_pstrdup(cmd->pool, a2);
/* now, if the server or per-dir config holds an
* array of RewriteCond entries, we take it for us
* and clear the array
*/
if (cmd->path == NULL) { /* is server command */
- new->rewriteconds = sconf->rewriteconds;
+ newrule->rewriteconds = sconf->rewriteconds;
sconf->rewriteconds = ap_make_array(cmd->pool, 2,
sizeof(rewritecond_entry));
}
else { /* is per-directory command */
- new->rewriteconds = dconf->rewriteconds;
+ newrule->rewriteconds = dconf->rewriteconds;
dconf->rewriteconds = ap_make_array(cmd->pool, 2,
sizeof(rewritecond_entry));
}
@@ -939,7 +949,10 @@
**
*/
-static void init_module(server_rec *s, ap_context_t *p)
+static void init_module(ap_context_t *p,
+ ap_context_t *plog,
+ ap_context_t *ptemp,
+ server_rec *s)
{
/* check if proxy module is available */
proxy_available = (ap_find_linked_module("mod_proxy.c") != NULL);
@@ -954,8 +967,11 @@
*/
for (; s; s = s->next) {
open_rewritelog(s, p);
- run_rewritemap_programs(s, p);
+ if (once_through > 0)
+ run_rewritemap_programs(s, p);
}
+
+ once_through++;
}
@@ -966,7 +982,7 @@
**
*/
-static void init_child(server_rec *s, ap_context_t *p)
+static void init_child(ap_context_t *p, server_rec *s)
{
/* open the rewriting lockfile */
rewritelock_open(s, p);
@@ -2354,7 +2370,7 @@
char *olduri;
int l;
- cp = ap_http_method(r);
+ cp = (char *)ap_http_method(r);
l = strlen(cp);
if ( strlen(r->filename) > l+3
&& strncasecmp(r->filename, cp, l) == 0
@@ -2840,7 +2856,8 @@
static char *lookup_map_txtfile(request_rec *r, char *file, char *key)
{
- FILE *fp = NULL;
+ ap_file_t *fp = NULL;
+ ap_status_t rc;
char line[1024];
char *value = NULL;
char *cpT;
@@ -2848,11 +2865,12 @@
char *curkey;
char *curval;
- if ((fp = ap_pfopen(r->pool, file, "r")) == NULL) {
+ rc = ap_open(&fp, file, APR_READ | APR_BUFFERED, APR_OS_DEFAULT, r->pool);
+ if (rc != APR_SUCCESS) {
return NULL;
}
- while (fgets(line, sizeof(line), fp) != NULL) {
+ while (ap_fgets(line, sizeof(line), fp) == APR_SUCCESS) {
if (line[0] == '#')
continue; /* ignore comments */
cpT = line;
@@ -2878,7 +2896,7 @@
value = ap_pstrdup(r->pool, curval);
break;
}
- ap_pfclose(r->pool, fp);
+ ap_close(fp);
return value;
}
@@ -2908,13 +2926,16 @@
}
#endif
-static char *lookup_map_program(request_rec *r, int fpin, int fpout, char *key)
+static char *lookup_map_program(request_rec *r, ap_file_t *fpin,
+ ap_file_t *fpout, char *key)
{
char buf[LONG_STRING_LEN];
char c;
int i;
+ int size_val;
#ifndef NO_WRITEV
- struct iovec iov[2];
+ ap_iovec_t *iov;
+ struct iovec iova[2];
#endif
/* when `RewriteEngine off' was used in the per-server
@@ -2922,7 +2943,7 @@
* In this case using such a map (usually in per-dir context)
* is useless because it is not available.
*/
- if (fpin == -1 || fpout == -1) {
+ if (fpin == NULL || fpout == NULL) {
return NULL;
}
@@ -2931,23 +2952,30 @@
/* write out the request key */
#ifdef NO_WRITEV
- write(fpin, key, strlen(key));
- write(fpin, "\n", 1);
+ ap_write(fpin, key, strlen(key));
+ ap_write(fpin, "\n", 1);
#else
- iov[0].iov_base = key;
- iov[0].iov_len = strlen(key);
- iov[1].iov_base = "\n";
- iov[1].iov_len = 1;
- writev(fpin, iov, 2);
+ iova[0].iov_base = key;
+ iova[0].iov_len = strlen(key);
+ iova[1].iov_base = "\n";
+ iova[1].iov_len = 1;
+
+ ap_make_iov(&iov, iova, r->pool);
+ size_val = 2;
+ ap_writev(fpin, iov, &size_val);
#endif
/* read in the response value */
i = 0;
- while (read(fpout, &c, 1) == 1 && (i < LONG_STRING_LEN-1)) {
+ size_val = 1;
+ ap_read(fpout, &c, &size_val);
+ while (size_val == 1 && (i < LONG_STRING_LEN-1)) {
if (c == '\n') {
break;
}
buf[i++] = c;
+
+ ap_read(fpout, &c, &size_val);
}
buf[i] = '\0';
@@ -3084,14 +3112,11 @@
static void open_rewritelog(server_rec *s, ap_context_t *p)
{
rewrite_server_conf *conf;
- char *fname;
+ const char *fname;
+ ap_status_t rc;
piped_log *pl;
- int rewritelog_flags = ( O_WRONLY|O_APPEND|O_CREAT );
-#ifdef WIN32
- mode_t rewritelog_mode = ( _S_IREAD|_S_IWRITE );
-#else
- mode_t rewritelog_mode = ( S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH );
-#endif
+ int rewritelog_flags = ( APR_WRITE | APR_APPEND | APR_CREATE );
+ mode_t rewritelog_mode = ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD );
conf = ap_get_module_config(s->module_config, &rewrite_module);
@@ -3101,7 +3126,7 @@
if (*(conf->rewritelogfile) == '\0') {
return;
}
- if (conf->rewritelogfp > 0) {
+ if (conf->rewritelogfp != NULL) {
return; /* virtual log shared w/ main server */
}
@@ -3109,7 +3134,7 @@
if (*conf->rewritelogfile == '|') {
if ((pl = ap_open_piped_log(p, conf->rewritelogfile+1)) == NULL) {
- ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
"mod_rewrite: could not open reliable pipe "
"to RewriteLog filter %s", conf->rewritelogfile+1);
exit(1);
@@ -3117,10 +3142,9 @@
conf->rewritelogfp = ap_piped_log_write_fd(pl);
}
else if (*conf->rewritelogfile != '\0') {
- if ((conf->rewritelogfp = ap_popenf(p, fname, rewritelog_flags,
- rewritelog_mode)) < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, s,
-
+ rc = ap_open(&conf->rewritelogfp, fname, rewritelog_flags, rewritelog_mode, p);
+ if (rc != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
"mod_rewrite: could not open RewriteLog "
"file %s", fname);
exit(1);
@@ -3139,7 +3163,7 @@
char type[20];
char redir[20];
va_list ap;
- int i;
+ int i, size_val;
request_rec *req;
char *ruser;
const char *rhost;
@@ -3148,7 +3172,7 @@
conf = ap_get_module_config(r->server->module_config, &rewrite_module);
conn = r->connection;
- if (conf->rewritelogfp < 0) {
+ if (conf->rewritelogfp == NULL) {
return;
}
if (conf->rewritelogfile == NULL) {
@@ -3208,7 +3232,8 @@
type, redir, level, str2);
fd_lock(r, conf->rewritelogfp);
- write(conf->rewritelogfp, str3, strlen(str3));
+ size_val = strlen(str3);
+ ap_write(conf->rewritelogfp, str3, &size_val);
fd_unlock(r, conf->rewritelogfp);
va_end(ap);
@@ -3245,15 +3270,12 @@
** +-------------------------------------------------------+
*/
-#ifdef WIN32
-#define REWRITELOCK_MODE ( _S_IREAD|_S_IWRITE )
-#else
-#define REWRITELOCK_MODE ( S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH )
-#endif
+#define REWRITELOCK_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD )
static void rewritelock_create(server_rec *s, ap_context_t *p)
{
rewrite_server_conf *conf;
+ ap_status_t rc;
conf = ap_get_module_config(s->module_config, &rewrite_module);
@@ -3267,9 +3289,9 @@
/* create the lockfile */
unlink(lockname);
- if ((lockfd = ap_popenf(p, lockname, O_WRONLY|O_CREAT,
- REWRITELOCK_MODE)) < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ rc = ap_open(&lockfd, lockname, APR_WRITE | APR_CREATE, REWRITELOCK_MODE, p);
+ if (rc != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
"mod_rewrite: Parent could not create RewriteLock "
"file %s", lockname);
exit(1);
@@ -3277,7 +3299,7 @@
#if !defined(OS2) && !defined(WIN32)
/* make sure the childs have access to this file */
if (geteuid() == 0 /* is superuser */)
- chown(lockname, ap_user_id, -1 /* no gid change */);
+ chown(lockname, unixd_config.user_id, -1 /* no gid change */);
#endif
return;
@@ -3286,6 +3308,7 @@
static void rewritelock_open(server_rec *s, ap_context_t *p)
{
rewrite_server_conf *conf;
+ ap_status_t rc;
conf = ap_get_module_config(s->module_config, &rewrite_module);
@@ -3295,9 +3318,9 @@
}
/* open the lockfile (once per child) to get a unique fd */
- if ((lockfd = ap_popenf(p, lockname, O_WRONLY,
- REWRITELOCK_MODE)) < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ rc = ap_open(&lockfd, lockname, APR_WRITE | APR_CREATE, REWRITELOCK_MODE, p);
+ if (rc != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
"mod_rewrite: Child could not open RewriteLock "
"file %s", lockname);
exit(1);
@@ -3305,22 +3328,23 @@
return;
}
-static void rewritelock_remove(void *data)
+static ap_status_t rewritelock_remove(void *data)
{
/* only operate if a lockfile is used */
if (lockname == NULL || *(lockname) == '\0') {
- return;
+ return(-1);
}
/* remove the lockfile */
unlink(lockname);
lockname = NULL;
- lockfd = -1;
+ lockfd = NULL;
+ return(0);
}
static void rewritelock_alloc(request_rec *r)
{
- if (lockfd != -1) {
+ if (lockfd != NULL) {
fd_lock(r, lockfd);
}
return;
@@ -3328,7 +3352,7 @@
static void rewritelock_free(request_rec *r)
{
- if (lockfd != -1) {
+ if (lockfd != NULL) {
fd_unlock(r, lockfd);
}
return;
@@ -3346,9 +3370,9 @@
static void run_rewritemap_programs(server_rec *s, ap_context_t *p)
{
rewrite_server_conf *conf;
- FILE *fpin;
- FILE *fpout;
- FILE *fperr;
+ ap_file_t *fpin;
+ ap_file_t *fpout;
+ ap_file_t *fperr;
ap_array_header_t *rewritemaps;
rewritemap_entry *entries;
rewritemap_entry *map;
@@ -3373,78 +3397,83 @@
}
if (map->datafile == NULL
|| *(map->datafile) == '\0'
- || map->fpin != -1
- || map->fpout != -1 ) {
+ || map->fpin != NULL
+ || map->fpout != NULL ) {
continue;
}
fpin = NULL;
fpout = NULL;
- rc = ap_spawn_child(p, rewritemap_program_child,
- (void *)map->datafile, kill_after_timeout,
- &fpin, &fpout, &fperr);
- if (rc == 0 || fpin == NULL || fpout == NULL) {
- ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ rc = rewritemap_program_child(p, map->datafile,
+ &fpout, &fpin, &fperr);
+ if (rc != APR_SUCCESS || fpin == NULL || fpout == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
"mod_rewrite: could not fork child for "
- "RewriteMap process");
+ "RewriteMap process. %d", rc);
exit(1);
}
- map->fpin = fileno(fpin);
- map->fpout = fileno(fpout);
- map->fperr = fileno(fperr);
+ map->fpin = fpin;
+ map->fpout = fpout;
+ map->fperr = fperr;
}
return;
}
/* child process code */
-static int rewritemap_program_child(void *cmd, child_info *pinfo)
-{
- int child_pid = 1;
+static int rewritemap_program_child(ap_context_t *p, char *progname,
+ ap_file_t **fpout, ap_file_t **fpin,
+ ap_file_t **fperr)
+{
+ int rc = -1;
+ ap_procattr_t *procattr;
+ ap_proc_t *procnew;
+ ap_os_proc_t fred;
- /*
- * Prepare for exec
- */
- ap_cleanup_for_exec();
+ ap_block_alarms();
+
#ifdef SIGHUP
signal(SIGHUP, SIG_IGN);
#endif
- /*
- * Exec() the child program
- */
-#if defined(WIN32)
- /* MS Windows */
- {
- char pCommand[MAX_STRING_LEN];
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
-
- ap_snprintf(pCommand, sizeof(pCommand), "%s /C %s", SHELL_PATH, cmd);
-
- memset(&si, 0, sizeof(si));
- memset(&pi, 0, sizeof(pi));
-
- si.cb = sizeof(si);
- si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
- si.wShowWindow = SW_HIDE;
- si.hStdInput = pinfo->hPipeInputRead;
- si.hStdOutput = pinfo->hPipeOutputWrite;
- si.hStdError = pinfo->hPipeErrorWrite;
-
- if (CreateProcess(NULL, pCommand, NULL, NULL, TRUE, 0,
- environ, NULL, &si, &pi)) {
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- child_pid = pi.dwProcessId;
- }
- }
-#elif defined(OS2)
- /* IBM OS/2 */
- execl(SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
-#else
- /* Standard Unix */
- execl(SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL);
+
+ if ((ap_createprocattr_init(&procattr, p) != APR_SUCCESS) ||
+ (ap_setprocattr_io(procattr, APR_FULL_BLOCK,
+ APR_FULL_NONBLOCK,
+ APR_FULL_NONBLOCK) != APR_SUCCESS) ||
+ (ap_setprocattr_dir(procattr, ap_make_dirstr_parent(p, progname))
+ != APR_SUCCESS) ||
+ (ap_setprocattr_cmdtype(procattr, APR_PROGRAM) != APR_SUCCESS)) {
+ /* Something bad happened, give up and go away. */
+ rc = -1;
+ }
+ else {
+ rc = ap_create_process(&procnew, progname, NULL, NULL, procattr, p);
+
+ if (rc == APR_SUCCESS) {
+#ifndef WIN32
+ /* pjr - this is a cheap hack for now to get the basics working in
+ * stages. ap_note_subprocess and free_proc need to be redone
+ * to make use of ap_proc_t instead of pid.
+ */
+ ap_get_os_proc(&fred, procnew);
+ ap_note_subprocess(p, fred, kill_after_timeout);
#endif
- return(child_pid);
+ if (fpin) {
+ ap_get_childin(fpin, procnew);
+ }
+
+ if (fpout) {
+ ap_get_childout(fpout, procnew);
+ }
+
+ if (fperr) {
+ ap_get_childerr(fperr, procnew);
+ }
+ }
+ }
+
+ ap_unblock_alarms();
+
+ return (rc);
}
@@ -3757,11 +3786,11 @@
static char *lookup_header(request_rec *r, const char *name)
{
ap_array_header_t *hdrs_arr;
- table_entry *hdrs;
+ ap_table_entry_t *hdrs;
int i;
hdrs_arr = ap_table_elts(r->headers_in);
- hdrs = (table_entry *)hdrs_arr->elts;
+ hdrs = (ap_table_entry_t *)hdrs_arr->elts;
for (i = 0; i < hdrs_arr->nelts; ++i) {
if (hdrs[i].key == NULL) {
continue;
@@ -4163,9 +4192,10 @@
static struct flock unlock_it;
#endif
-static void fd_lock(request_rec *r, int fd)
+static void fd_lock(request_rec *r, ap_file_t *fd)
{
int rc;
+ int sys_file;
#ifdef USE_FCNTL
lock_it.l_whence = SEEK_SET; /* from current point */
@@ -4174,13 +4204,15 @@
lock_it.l_type = F_WRLCK; /* set exclusive/write lock */
lock_it.l_pid = 0; /* pid not actually interesting */
- while ( ((rc = fcntl(fd, F_SETLKW, &lock_it)) < 0)
+ ap_get_os_file(&sys_file, fd);
+ while ( ((rc = fcntl(sys_file, F_SETLKW, &lock_it)) < 0)
&& (errno == EINTR) ) {
continue;
}
#endif
#ifdef USE_FLOCK
- while ( ((rc = flock(fd, LOCK_EX)) < 0)
+ ap_get_os_file(fd, &sys_file);
+ while ( ((rc = flock(sys_file, LOCK_EX)) < 0)
&& (errno == EINTR) ) {
continue;
}
@@ -4188,9 +4220,10 @@
#ifdef USE_LOCKING
/* Lock the first byte, always, assume we want to append
and seek to the end afterwards */
- lseek(fd, 0, SEEK_SET);
- rc = _locking(fd, _LK_LOCK, 1);
- lseek(fd, 0, SEEK_END);
+ ap_seek(fd, APR_SET, 0);
+ ap_get_os_file(&sys_file, fd);
+ rc = _locking(sys_file, _LK_LOCK, 1);
+ ap_seek(fd, APR_END, 0);
#endif
if (rc < 0) {
@@ -4201,9 +4234,10 @@
return;
}
-static void fd_unlock(request_rec *r, int fd)
+static void fd_unlock(request_rec *r, ap_file_t *fd)
{
int rc;
+ int sys_file;
#ifdef USE_FCNTL
unlock_it.l_whence = SEEK_SET; /* from current point */
@@ -4212,15 +4246,18 @@
unlock_it.l_type = F_UNLCK; /* unlock */
unlock_it.l_pid = 0; /* pid not actually interesting */
- rc = fcntl(fd, F_SETLKW, &unlock_it);
+ ap_get_os_file(&sys_file, fd);
+ rc = fcntl(sys_file, F_SETLKW, &unlock_it);
#endif
#ifdef USE_FLOCK
- rc = flock(fd, LOCK_UN);
+ ap_get_os_file(fd, &sys_file);
+ rc = flock(sys_file, LOCK_UN);
#endif
#ifdef USE_LOCKING
- lseek(fd, 0, SEEK_SET);
- rc = _locking(fd, _LK_UNLCK, 1);
- lseek(fd, 0, SEEK_END);
+ ap_seek(fd, APR_SET, 0);
+ ap_get_os_file(&sys_file, fd);
+ rc = _locking(sys_file, _LK_UNLCK, 1);
+ ap_seek(fd, APR_END, 0);
#endif
if (rc < 0) {
Index: mod_rewrite.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_rewrite.h,v
retrieving revision 1.2
diff -u -r1.2 mod_rewrite.h
--- mod_rewrite.h 1999/08/31 05:34:00 1.2
+++ mod_rewrite.h 1999/12/03 19:55:29
@@ -266,9 +266,9 @@
char *datafile; /* filename for map data files */
char *checkfile; /* filename to check for map existence */
int type; /* the type of the map */
- int fpin; /* in file pointer for program maps */
- int fpout; /* out file pointer for program maps */
- int fperr; /* err file pointer for program maps */
+ ap_file_t *fpin; /* in file pointer for program maps */
+ ap_file_t *fpout; /* out file pointer for program maps */
+ ap_file_t *fperr; /* err file pointer for program maps */
char *(*func)(request_rec *, /* function pointer for internal maps */
char *);
} rewritemap_entry;
@@ -300,7 +300,7 @@
int state; /* the RewriteEngine state */
int options; /* the RewriteOption state */
char *rewritelogfile; /* the RewriteLog filename */
- int rewritelogfp; /* the RewriteLog open filepointer */
+ ap_file_t *rewritelogfp; /* the RewriteLog open filepointer */
int rewriteloglevel; /* the RewriteLog level of verbosity */
ap_array_header_t *rewritemaps; /* the RewriteMap entries */
ap_array_header_t *rewriteconds; /* the RewriteCond entries (temporary) */
@@ -400,8 +400,11 @@
char *key, char *val);
/* initialisation */
-static void init_module(server_rec *s, ap_context_t *p);
-static void init_child(server_rec *s, ap_context_t *p);
+static void init_module(ap_context_t *p,
+ ap_context_t *plog,
+ ap_context_t *ptemp,
+ server_rec *s);
+static void init_child(ap_context_t *p, server_rec *s);
/* runtime hooks */
static int hook_uri2file (request_rec *r);
@@ -433,8 +436,8 @@
#ifndef NO_DBM_REWRITEMAP
static char *lookup_map_dbmfile(request_rec *r, char *file, char *key);
#endif
-static char *lookup_map_program(request_rec *r, int fpin,
- int fpout, char *key);
+static char *lookup_map_program(request_rec *r, ap_file_t *fpin,
+ ap_file_t *fpout, char *key);
static char *lookup_map_internal(request_rec *r,
char *(*func)(request_rec *r, char *key),
char *key);
@@ -455,13 +458,15 @@
/* rewriting lockfile support */
static void rewritelock_create(server_rec *s, ap_context_t *p);
static void rewritelock_open(server_rec *s, ap_context_t *p);
-static void rewritelock_remove(void *data);
+static ap_status_t rewritelock_remove(void *data);
static void rewritelock_alloc(request_rec *r);
static void rewritelock_free(request_rec *r);
/* program map support */
static void run_rewritemap_programs(server_rec *s, ap_context_t *p);
-static int rewritemap_program_child(void *cmd, child_info *pinfo);
+static int rewritemap_program_child(ap_context_t *p, char *progname,
+ ap_file_t **fpout, ap_file_t **fpin,
+ ap_file_t **fperr);
/* env variable support */
static void expand_variables_inbuffer(request_rec *r, char *buf, int buf_len);
@@ -486,8 +491,8 @@
static void add_env_variable(request_rec *r, char *s);
/* File locking */
-static void fd_lock(request_rec *r, int fd);
-static void fd_unlock(request_rec *r, int fd);
+static void fd_lock(request_rec *r, ap_file_t *fd);
+static void fd_unlock(request_rec *r, ap_file_t *fd);
/* Lexicographic Comparison */
static int compare_lexicography(char *cpNum1, char *cpNum2);