You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 1999/08/03 11:27:44 UTC

cvs commit: apache-1.3/src/modules/standard mod_rewrite.c mod_rewrite.h

dgaudet     99/08/03 02:27:42

  Modified:    src      CHANGES
               src/modules/standard mod_rewrite.c mod_rewrite.h
  Log:
  > This patch includes fix for rewritelock in vhost problem and makes program
  > map writes atomic if writev is available.
  >
  >         -Dima
  
  PR:		3874
  Submitted by:	Dmitry Khrustalev <di...@bog.msu.su>
  
  Revision  Changes    Path
  1.1409    +4 -1      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1408
  retrieving revision 1.1409
  diff -u -r1.1408 -r1.1409
  --- CHANGES	1999/08/02 10:48:11	1.1408
  +++ CHANGES	1999/08/03 09:27:25	1.1409
  @@ -1,6 +1,9 @@
   Changes with Apache 1.3.8
   
  -  *  Support for compaq/tandem/com.
  +  *) RewriteLock/RewriteMap didn't work properly with virtual hosts.
  +     [Dmitry Khrustalev <di...@bog.msu.su>] PR#3874
  +
  +  *) Support for compaq/tandem/com.
        [Ottati, Michael" <mi...@compaq.com>, dirkx]
   
     *) Added SHA1 password encryption support to easy migration from 
  
  
  
  1.144     +35 -49    apache-1.3/src/modules/standard/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v
  retrieving revision 1.143
  retrieving revision 1.144
  diff -u -r1.143 -r1.144
  --- mod_rewrite.c	1999/07/29 17:54:06	1.143
  +++ mod_rewrite.c	1999/08/03 09:27:33	1.144
  @@ -91,6 +91,10 @@
   
   #include "mod_rewrite.h"
   
  +#ifndef NO_WRITEV
  +#include <sys/types.h>
  +#include <sys/uio.h>
  +#endif
   
   /*
   ** +-------------------------------------------------------+
  @@ -208,6 +212,8 @@
       /* whether proxy module is available or not */
   static int proxy_available;
   
  +static char *lockname;
  +static int lockfd = -1;
   
   /*
   ** +-------------------------------------------------------+
  @@ -234,8 +240,6 @@
       a->rewritelogfile  = NULL;
       a->rewritelogfp    = -1;
       a->rewriteloglevel = 0;
  -    a->rewritelockfile = NULL;
  -    a->rewritelockfp   = -1;
       a->rewritemaps     = ap_make_array(p, 2, sizeof(rewritemap_entry));
       a->rewriteconds    = ap_make_array(p, 2, sizeof(rewritecond_entry));
       a->rewriterules    = ap_make_array(p, 2, sizeof(rewriterule_entry));
  @@ -270,12 +274,6 @@
           a->rewritelogfp    = overrides->rewritelogfp != -1 
                                ? overrides->rewritelogfp 
                                : base->rewritelogfp;
  -        a->rewritelockfile = overrides->rewritelockfile != NULL
  -                             ? overrides->rewritelockfile
  -                             : base->rewritelockfile;
  -        a->rewritelockfp   = overrides->rewritelockfp != -1
  -                             ? overrides->rewritelockfp
  -                             : base->rewritelockfp;
           a->rewritemaps     = ap_append_arrays(p, overrides->rewritemaps,
                                                 base->rewritemaps);
           a->rewriteconds    = ap_append_arrays(p, overrides->rewriteconds,
  @@ -291,8 +289,6 @@
           a->rewriteloglevel = overrides->rewriteloglevel;
           a->rewritelogfile  = overrides->rewritelogfile;
           a->rewritelogfp    = overrides->rewritelogfp;
  -        a->rewritelockfile = overrides->rewritelockfile;
  -        a->rewritelockfp   = overrides->rewritelockfp;
           a->rewritemaps     = overrides->rewritemaps;
           a->rewriteconds    = overrides->rewriteconds;
           a->rewriterules    = overrides->rewriterules;
  @@ -528,15 +524,12 @@
   
   static const char *cmd_rewritelock(cmd_parms *cmd, void *dconf, char *a1)
   {
  -    rewrite_server_conf *sconf;
       const char *error;
   
       if ((error = ap_check_cmd_context(cmd, GLOBAL_ONLY)) != NULL)
           return error;
  -    sconf = (rewrite_server_conf *)
  -            ap_get_module_config(cmd->server->module_config, &rewrite_module);
   
  -    sconf->rewritelockfile = a1;
  +    lockname = a1;
   
       return NULL;
   }
  @@ -2920,6 +2913,9 @@
       char buf[LONG_STRING_LEN];
       char c;
       int i;
  +#ifndef NO_WRITEV
  +    struct iovec iov[2];
  +#endif
   
       /* when `RewriteEngine off' was used in the per-server
        * context then the rewritemap-programs were not spawned.
  @@ -2934,8 +2930,16 @@
       rewritelock_alloc(r);
   
       /* write out the request key */
  +#ifdef NO_WRITEV
       write(fpin, key, strlen(key));
       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);
  +#endif
   
       /* read in the response value */
       i = 0;
  @@ -3254,28 +3258,26 @@
       conf = ap_get_module_config(s->module_config, &rewrite_module);
   
       /* only operate if a lockfile is used */
  -    if (conf->rewritelockfile == NULL
  -        || *(conf->rewritelockfile) == '\0') {
  +    if (lockname == NULL || *(lockname) == '\0') {
           return;
       }
   
       /* fixup the path, especially for rewritelock_remove() */
  -    conf->rewritelockfile = ap_server_root_relative(p, conf->rewritelockfile);
  +    lockname = ap_server_root_relative(p, lockname);
   
       /* create the lockfile */
  -    unlink(conf->rewritelockfile);
  -    if ((conf->rewritelockfp = ap_popenf(p, conf->rewritelockfile,
  -                                         O_WRONLY|O_CREAT,
  +    unlink(lockname);
  +    if ((lockfd = ap_popenf(p, lockname, O_WRONLY|O_CREAT,
                                            REWRITELOCK_MODE)) < 0) {
           ap_log_error(APLOG_MARK, APLOG_ERR, s,
                        "mod_rewrite: Parent could not create RewriteLock "
  -                     "file %s", conf->rewritelockfile);
  +                     "file %s", lockname);
           exit(1);
       }
   #if !defined(OS2) && !defined(WIN32)
       /* make sure the childs have access to this file */
       if (geteuid() == 0 /* is superuser */)
  -        chown(conf->rewritelockfile, ap_user_id, -1 /* no gid change */);
  +        chown(lockname, ap_user_id, -1 /* no gid change */);
   #endif
   
       return;
  @@ -3288,18 +3290,16 @@
       conf = ap_get_module_config(s->module_config, &rewrite_module);
   
       /* only operate if a lockfile is used */
  -    if (conf->rewritelockfile == NULL
  -        || *(conf->rewritelockfile) == '\0') {
  +    if (lockname == NULL || *(lockname) == '\0') {
           return;
       }
   
       /* open the lockfile (once per child) to get a unique fd */
  -    if ((conf->rewritelockfp = ap_popenf(p, conf->rewritelockfile,
  -                                         O_WRONLY,
  +    if ((lockfd = ap_popenf(p, lockname, O_WRONLY,
                                            REWRITELOCK_MODE)) < 0) {
           ap_log_error(APLOG_MARK, APLOG_ERR, s,
                        "mod_rewrite: Child could not open RewriteLock "
  -                     "file %s", conf->rewritelockfile);
  +                     "file %s", lockname);
           exit(1);
       }
       return;
  @@ -3307,43 +3307,29 @@
   
   static void rewritelock_remove(void *data)
   {
  -    server_rec *s;
  -    rewrite_server_conf *conf;
  -
  -    /* the data is really the server_rec */
  -    s = (server_rec *)data;
  -    conf = ap_get_module_config(s->module_config, &rewrite_module);
  -
       /* only operate if a lockfile is used */
  -    if (conf->rewritelockfile == NULL
  -        || *(conf->rewritelockfile) == '\0') {
  +    if (lockname == NULL || *(lockname) == '\0') {
           return;
       }
   
       /* remove the lockfile */
  -    unlink(conf->rewritelockfile);
  +    unlink(lockname);
  +    lockname = NULL;
  +    lockfd = -1;
   }
   
   static void rewritelock_alloc(request_rec *r)
   {
  -    rewrite_server_conf *conf;
  -
  -    conf = ap_get_module_config(r->server->module_config, &rewrite_module);
  -
  -    if (conf->rewritelockfp != -1) {
  -        fd_lock(r, conf->rewritelockfp);
  +    if (lockfd != -1) {
  +        fd_lock(r, lockfd);
       }
       return;
   }
   
   static void rewritelock_free(request_rec *r)
   {
  -    rewrite_server_conf *conf;
  -
  -    conf = ap_get_module_config(r->server->module_config, &rewrite_module);
  -
  -    if (conf->rewritelockfp != -1) {
  -        fd_unlock(r, conf->rewritelockfp);
  +    if (lockfd != -1) {
  +        fd_unlock(r, lockfd);
       }
       return;
   }
  
  
  
  1.65      +0 -2      apache-1.3/src/modules/standard/mod_rewrite.h
  
  Index: mod_rewrite.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.h,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -u -r1.64 -r1.65
  --- mod_rewrite.h	1999/08/02 10:45:35	1.64
  +++ mod_rewrite.h	1999/08/03 09:27:35	1.65
  @@ -302,8 +302,6 @@
       char         *rewritelogfile;  /* the RewriteLog filename */
       int           rewritelogfp;    /* the RewriteLog open filepointer */
       int           rewriteloglevel; /* the RewriteLog level of verbosity */
  -    char         *rewritelockfile; /* the RewriteLock filename */
  -    int           rewritelockfp;   /* the RewriteLock open filepointer */
       array_header *rewritemaps;     /* the RewriteMap entries */
       array_header *rewriteconds;    /* the RewriteCond entries (temporary) */
       array_header *rewriterules;    /* the RewriteRule entries */