dreid       99/11/20 04:55:27

  Modified:    src/modules/experimental Makefile.tmpl mod_mmap_static.c
  Log:
  This brings mod_mmap_static into Apache 2.0 using APR.
  
  Tested on BeOS.
  
  Revision  Changes    Path
  1.5       +5 -4      apache-2.0/src/modules/experimental/Makefile.tmpl
  
  Index: Makefile.tmpl
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/experimental/Makefile.tmpl,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Makefile.tmpl     1999/11/19 18:46:00     1.4
  +++ Makefile.tmpl     1999/11/20 12:55:26     1.5
  @@ -7,12 +7,12 @@
   mod_mmap_static.o: mod_mmap_static.c $(INCDIR)/httpd.h \
    $(INCDIR)/ap_config.h $(INCDIR)/ap_mmn.h \
    $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
  - $(OSDIR)/os-inline.c $(INCDIR)/ap_ctype.h \
  - $(INCDIR)/hsregex.h ../../lib/apr/include/apr_general.h \
  + $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h \
  + ../../lib/apr/include/apr_general.h \
    ../../lib/apr/include/apr_config.h ../../lib/apr/include/apr_errno.h \
    ../../lib/apr/include/apr_lib.h ../../lib/apr/include/apr_file_io.h \
    $(INCDIR)/buff.h $(INCDIR)/ap_iol.h $(INCDIR)/ap.h \
  - $(INCDIR)/util_uri.h \
  + $(INCDIR)/apr.h $(INCDIR)/util_uri.h \
    $(INCDIR)/http_config.h $(INCDIR)/ap_hooks.h \
    $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h \
    ../../lib/apr/include/apr_portable.h \
  @@ -20,4 +20,5 @@
    ../../lib/apr/include/apr_win.h \
    ../../lib/apr/include/apr_network_io.h \
    ../../lib/apr/include/apr_lock.h ../../lib/apr/include/apr_time.h \
  - $(INCDIR)/http_request.h $(INCDIR)/http_core.h
  + ../../lib/apr/include/apr_mmap.h $(INCDIR)/http_request.h \
  + $(INCDIR)/http_core.h
  
  
  
  1.5       +49 -56    apache-2.0/src/modules/experimental/mod_mmap_static.c
  
  Index: mod_mmap_static.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/experimental/mod_mmap_static.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- mod_mmap_static.c 1999/08/31 21:37:08     1.4
  +++ mod_mmap_static.c 1999/11/20 12:55:26     1.5
  @@ -111,7 +111,6 @@
   #include <fcntl.h>
   #include <errno.h>
   #include <string.h>
  -#include <sys/mman.h>
   
   #define CORE_PRIVATE
   
  @@ -121,14 +120,16 @@
   #include "http_protocol.h"
   #include "http_request.h"
   #include "http_core.h"
  +#include "apr_mmap.h"
   
   module MODULE_VAR_EXPORT mmap_static_module;
   
   typedef struct {
  +    ap_mmap_t *mm;
       char *filename;
  -    void *mm;
       struct stat finfo;
   } a_file;
  +ap_context_t *context;
   
   typedef struct {
       ap_array_header_t *files;
  @@ -145,7 +146,7 @@
       return sconf;
   }
   
  -static void cleanup_mmap(void *sconfv)
  +ap_status_t cleanup_mmap(void *sconfv)
   {
       a_server_config *sconf = sconfv;
       size_t n;
  @@ -154,10 +155,11 @@
       n = sconf->files->nelts;
       file = (a_file *)sconf->files->elts;
       while(n) {
  -     munmap(file->mm, file->finfo.st_size);
  -     ++file;
  -     --n;
  +         ap_mmap_delete(file->mm);
  +         ++file;
  +         --n;
       }
  +    return APR_SUCCESS;
   }
   
   static const char *mmapfile(cmd_parms *cmd, void *dummy, char *filename)
  @@ -165,36 +167,33 @@
       a_server_config *sconf;
       a_file *new_file;
       a_file tmp;
  -    int fd;
  +    ap_file_t *fd;
       caddr_t mm;
   
       if (stat(filename, &tmp.finfo) == -1) {
  -     ap_log_error(APLOG_MARK, APLOG_WARNING, cmd->server,
  +     ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
            "mmap_static: unable to stat(%s), skipping", filename);
        return NULL;
       }
       if ((tmp.finfo.st_mode & S_IFMT) != S_IFREG) {
  -     ap_log_error(APLOG_MARK, APLOG_WARNING, cmd->server,
  +     ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
            "mmap_static: %s isn't a regular file, skipping", filename);
        return NULL;
       }
  -    fd = open(filename, O_RDONLY, 0);
  -    if (fd == -1) {
  -     ap_log_error(APLOG_MARK, APLOG_WARNING, cmd->server,
  +    if (ap_open(&fd, filename, APR_READ, APR_OS_DEFAULT, context) != 
APR_SUCCESS) {
  +     ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
            "mmap_static: unable to open(%s, O_RDONLY), skipping", filename);
        return NULL;
       }
  -    mm = mmap(NULL, tmp.finfo.st_size, PROT_READ, MAP_SHARED, fd, 0);
  -    if (mm == (caddr_t)-1) {
  +    if (ap_mmap_create(&tmp.mm, fd, 0, tmp.finfo.st_size, context) != 
APR_SUCCESS) {
        int save_errno = errno;
  -     close(fd);
  +     ap_close(fd);
        errno = save_errno;
  -     ap_log_error(APLOG_MARK, APLOG_WARNING, cmd->server,
  +     ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
            "mmap_static: unable to mmap %s, skipping", filename);
        return NULL;
       }
  -    close(fd);
  -    tmp.mm = mm;
  +    ap_close(fd);
       tmp.filename = ap_pstrdup(cmd->pool, filename);
       sconf = ap_get_module_config(cmd->server->module_config, 
&mmap_static_module);
       new_file = ap_push_array(sconf->files);
  @@ -206,17 +205,6 @@
       return NULL;
   }
   
  -static command_rec mmap_static_cmds[] =
  -{
  -    {
  -     "mmapfile", mmapfile, NULL, RSRC_CONF, ITERATE,
  -     "A space separated list of files to mmap at config time"
  -    },
  -    {
  -     NULL
  -    }
  -};
  -
   static int file_compare(const void *av, const void *bv)
   {
       const a_file *a = av;
  @@ -238,7 +226,8 @@
       return c;
   }
   
  -static void mmap_init(server_rec *s, ap_context_t *p)
  +static void mmap_post_config(ap_context_t *p, ap_context_t *plog,
  +          ap_context_t *ptemp, server_rec *s)
   {
       a_server_config *sconf;
       ap_array_header_t *inodes;
  @@ -246,6 +235,7 @@
       int nelts;
       int i;
       
  +    context = p;    
       /* sort the elements of the main_server, by filename */
       sconf = ap_get_module_config(s->module_config, &mmap_static_module);
       elts = (a_file *)sconf->files->elts;
  @@ -283,17 +273,17 @@
       if (ap_is_empty_table(sconf->files))
        return DECLINED;
   
  -    /* we require other modules to first set up a filename */
  -    res = core_module.translate_handler(r);
  +/*    res = core_module.translate_handler(r);
       if (res == DECLINED || !r->filename) {
        return res;
  -    }
  +    }*/
  +    if (!r->filename)
  +        return DECLINED;
       tmp.filename = r->filename;
       match = (a_file *)bsearch(&tmp, sconf->files->elts, sconf->files->nelts,
        sizeof(a_file), file_compare);
  -    if (match == NULL) {
  -     return DECLINED;
  -    }
  +    if (match == NULL)
  +         return DECLINED;
   
       /* shortcircuit the get_path_info() stat() calls and stuff */
       r->finfo = match->finfo;
  @@ -352,7 +342,8 @@
            ap_send_mmap (match->mm, r, 0, match->finfo.st_size);
        }
        else {
  -         long offset, length;
  +         long length;
  +         ap_off_t offset;
            while (ap_each_byterange(r, &offset, &length)) {
                ap_send_mmap(match->mm, r, offset, length);
            }
  @@ -361,6 +352,19 @@
       return OK;
   }
   
  +static command_rec mmap_cmds[] =
  +{
  +    {"mmapfile", mmapfile, NULL, RSRC_CONF, ITERATE,
  +     "A space seperated list of files to mmap at config time"},
  +    {NULL}
  +};
  +
  +static void register_hooks(void)
  +{
  +    static const char* const aszPre[]={"http_core.c",NULL};
  +    ap_hook_post_config(mmap_post_config, NULL, NULL, HOOK_MIDDLE);
  +    ap_hook_translate_name(mmap_static_xlat, aszPre, NULL, HOOK_LAST);
  +};
   
   static const handler_rec mmap_static_handlers[] =
   {
  @@ -370,23 +374,12 @@
   
   module MODULE_VAR_EXPORT mmap_static_module =
   {
  -    STANDARD_MODULE_STUFF,
  -    mmap_init,                       /* initializer */
  -    NULL,                    /* dir config creater */
  -    NULL,                    /* dir merger --- default is to override */
  -    create_server_config,    /* server config */
  -    NULL,                    /* merge server config */
  -    mmap_static_cmds,                /* command handlers */
  -    mmap_static_handlers,    /* handlers */
  -    mmap_static_xlat,                /* filename translation */
  -    NULL,                    /* check_user_id */
  -    NULL,                    /* check auth */
  -    NULL,                    /* check access */
  -    NULL,                    /* type_checker */
  -    NULL,                    /* fixups */
  -    NULL,                    /* logger */
  -    NULL,                    /* header parser */
  -    NULL,                    /* child_init */
  -    NULL,                    /* child_exit */
  -    NULL                     /* post read-request */
  +    STANDARD20_MODULE_STUFF,
  +    NULL,                     /* create per-directory config structure */
  +    NULL,                     /* merge per-directory config structures */
  +    create_server_config,     /* create per-server config structure */
  +    NULL,                     /* merge per-server config structures */
  +    mmap_cmds,                /* command handlers */
  +    mmap_static_handlers,     /* handlers */
  +    register_hooks            /* register hooks */
   };
  
  
  

Reply via email to