brian       96/11/03 16:55:24

  Modified:    src       Configuration.tmpl Configure http_config.c
                        http_config.h  http_core.c http_main.c mod_info.c
  Log:
  Reviewed by:  Brian Behlendorf
  Submitted by: Tom Tromey ([EMAIL PROTECTED])
  
  Implemented the "AddModule" functionality.
  
  Revision  Changes    Path
  1.50      +6 -1      apache/src/Configuration.tmpl
  
  Index: Configuration.tmpl
  ===================================================================
  RCS file: /export/home/cvs/apache/src/Configuration.tmpl,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -C3 -r1.49 -r1.50
  *** Configuration.tmpl        1996/11/03 20:56:03     1.49
  --- Configuration.tmpl        1996/11/04 00:55:16     1.50
  ***************
  *** 8,14 ****
    # or an existing one modified. This will also most likely require some minor
    # changes to Configure to recognize those changes.
    
  ! # There are 4 types of lines here:
    
    # '#' comments, distinguished by having a '#' as the first non-blank 
character
    #
  --- 8,14 ----
    # or an existing one modified. This will also most likely require some minor
    # changes to Configure to recognize those changes.
    
  ! # There are 5 types of lines here:
    
    # '#' comments, distinguished by having a '#' as the first non-blank 
character
    #
  ***************
  *** 20,25 ****
  --- 20,30 ----
    # Module selection lines, distinguished by having 'Module' at the front.
    # These list the configured modules, in priority order (highest priority
    # first).  They're down at the bottom.
  + #
  + # Optional module selection lines, distinguished by having `%Module'
  + # at the front.  These specify a module that is to be compiled in (but
  + # not enabled).  The AddModule directive can be used to enable such a
  + # module.  By default no such modules are defined.
    
    
    ################################################################
  
  
  
  1.34      +25 -11    apache/src/Configure
  
  Index: Configure
  ===================================================================
  RCS file: /export/home/cvs/apache/src/Configure,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -C3 -r1.33 -r1.34
  *** Configure 1996/10/25 13:06:35     1.33
  --- Configure 1996/11/04 00:55:16     1.34
  ***************
  *** 1,5 ****
    #!/bin/sh
  ! # $Id: Configure,v 1.33 1996/10/25 13:06:35 jim Exp $
    trap 'rm -f $tmpfile; exit' 0 1 2 3 15
    
    # Apache configuration script, first cut --- rst.
  --- 1,5 ----
    #!/bin/sh
  ! # $Id: Configure,v 1.34 1996/11/04 00:55:16 brian Exp $
    trap 'rm -f $tmpfile; exit' 0 1 2 3 15
    
    # Apache configuration script, first cut --- rst.
  ***************
  *** 37,44 ****
    
    # Check for syntax errors...
    
  ! if egrep -v '^Module[       ]+[A-Za-z0-9_]+[        ]+[^    ]+$' $tmpfile | 
\
  !    grep -v = > /dev/null
    then
       echo "Syntax error --- The configuration file is used only to"
       echo "define the list of included modules or to set Makefile"
  --- 37,44 ----
    
    # Check for syntax errors...
    
  ! if egrep -v '^%?Module[     ]+[A-Za-z0-9_]+[        ]+[^    ]+$' $tmpfile \
  !    | grep -v = > /dev/null
    then
       echo "Syntax error --- The configuration file is used only to"
       echo "define the list of included modules or to set Makefile"
  ***************
  *** 53,61 ****
    if [ -f Makefile ] ; then mv Makefile Makefile.bak; fi
    if [ -f modules.c ] ; then mv modules.c modules.c.bak; fi
    
  ! awk >modules.c <$tmpfile '\
  !    BEGIN { modules[n++] = "core_module" } \
  !    /^Module/ { modules[n++] = $2 } \
       END { print "/* modules.c --- automatically generated by Apache"; \
             print " * configuration script.  DO NOT HAND EDIT!!!!!"; \
             print " */"; \
  --- 53,62 ----
    if [ -f Makefile ] ; then mv Makefile Makefile.bak; fi
    if [ -f modules.c ] ; then mv modules.c modules.c.bak; fi
    
  ! sed -e 's/_module//' $tmpfile | awk >modules.c '\
  !    BEGIN { modules[n++] = "core" ; pmodules[pn++] = "core"} \
  !    /^Module/ { modules[n++] = $2 ; pmodules[pn++] = $2 } \
  !    /^%Module/ { pmodules[pn++] = $2 } \
       END { print "/* modules.c --- automatically generated by Apache"; \
             print " * configuration script.  DO NOT HAND EDIT!!!!!"; \
             print " */"; \
  ***************
  *** 63,83 ****
         print "#include \"httpd.h\""; \
         print "#include \"http_config.h\""; \
             print ""; \
  !          for (i = 0; i < n; ++i) { \
  !              printf ("extern module %s;\n", modules[i]); \
             } \
             print ""; \
             print "module *prelinked_modules[] = {"; \
             for (i = 0; i < n; ++i) { \
  !              printf "  &%s,\n", modules[i]; \
             } \
         print "  NULL"; \
             print "};"; \
             print "char *module_names[] = {"; \
  !          for (i = n-1; i > -1; --i) { \
                 printf "  \"%s\",\n", modules[i]; \
             } \
  !        print "  NULL"; \
             print "};"; \
       }'
    
  --- 64,96 ----
         print "#include \"httpd.h\""; \
         print "#include \"http_config.h\""; \
             print ""; \
  !          for (i = 0; i < pn; ++i) { \
  !              printf ("extern module %s_module;\n", pmodules[i]); \
             } \
             print ""; \
             print "module *prelinked_modules[] = {"; \
             for (i = 0; i < n; ++i) { \
  !              printf "  &%s_module,\n", modules[i]; \
             } \
         print "  NULL"; \
             print "};"; \
             print "char *module_names[] = {"; \
  !          for (i = 0; i < n; ++i) { \
                 printf "  \"%s\",\n", modules[i]; \
             } \
  !          print "  NULL"; \
  !          print "};"; \
  !          print "module *preloaded_modules[] = {"; \
  !          for (i = 0; i < pn; ++i) { \
  !              printf "  &%s_module,\n", pmodules[i]; \
  !          } \
  !      print "  NULL"; \
  !          print "};"; \
  !          print "char *preloaded_module_names[] = {"; \
  !          for (i = 0; i < pn; ++i) { \
  !              printf "  \"%s\",\n", pmodules[i]; \
  !          } \
  !          print "  NULL"; \
             print "};"; \
       }'
    
  ***************
  *** 91,96 ****
  --- 104,110 ----
           print "# is re-run."; \
             } \
       /^Module/ { modules[n++] = $3 } \
  +    /^%Module/ { modules[n++] = $3 } \
       END { print "MODULES=\\"; \
             for (i = 0; i < n; ++i) { \
                 if (i < n-1) printf ("  %s \\\n", modules[i]); \
  
  
  
  1.31      +71 -11    apache/src/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.c,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -C3 -r1.30 -r1.31
  *** http_config.c     1996/11/03 20:52:09     1.30
  --- http_config.c     1996/11/04 00:55:17     1.31
  ***************
  *** 83,89 ****
  --- 83,92 ----
     * of modules which control just about all of the server operation.
     */
    
  + /* num_modules is the number of currently active modules.  */
    static int num_modules = 0;    
  + /* total_modules is the number of modules linked in.  */
  + static int total_modules = 0;
    module *top_module = NULL;
        
    typedef int (*handler)(request_rec *);
  ***************
  *** 119,132 ****
    void *
    create_empty_config (pool *p)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * num_modules);
       return (void *)conf_vector;
    }
    
    void *
    create_default_per_dir_config (pool *p)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * 
(num_modules+DYNAMIC_MODULE_LIMIT));
       module *modp;
    
       for (modp = top_module; modp; modp = modp->next) {
  --- 122,135 ----
    void *
    create_empty_config (pool *p)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * total_modules);
       return (void *)conf_vector;
    }
    
    void *
    create_default_per_dir_config (pool *p)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * 
(total_modules+DYNAMIC_MODULE_LIMIT));
       module *modp;
    
       for (modp = top_module; modp; modp = modp->next) {
  ***************
  *** 141,147 ****
    void *
    merge_per_dir_configs (pool *p, void *base, void *new)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * num_modules);
       void **base_vector = (void **) base;
       void **new_vector = (void **) new;
       module *modp;
  --- 144,150 ----
    void *
    merge_per_dir_configs (pool *p, void *base, void *new)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * total_modules);
       void **base_vector = (void **) base;
       void **new_vector = (void **) new;
       module *modp;
  ***************
  *** 162,168 ****
    void *
    create_server_config (pool *p, server_rec *s)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * 
(num_modules+DYNAMIC_MODULE_LIMIT));
       module *modp;
    
       for (modp = top_module; modp; modp = modp->next) {
  --- 165,171 ----
    void *
    create_server_config (pool *p, server_rec *s)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * 
(total_modules+DYNAMIC_MODULE_LIMIT));
       module *modp;
    
       for (modp = top_module; modp; modp = modp->next) {
  ***************
  *** 371,390 ****
        exit(1);
        }
    
  !     m->next = top_module;
  !     top_module = m;
  !     m->module_index = num_modules++;
    }
    
    void setup_prelinked_modules ()
    {
  !     extern module *prelinked_modules[];
  !     module **m = prelinked_modules;
    
  !     while (*m) {
            add_module (*m);
  -     ++m;
        }
    }
    
    /*****************************************************************
  --- 374,450 ----
        exit(1);
        }
    
  !     if (m->next == NULL) {
  !         m->next = top_module;
  !     top_module = m;
  !     }
  !     if (m->module_index == -1) {
  !     m->module_index = num_modules++;
  !     }
    }
    
    void setup_prelinked_modules ()
    {
  !     extern module *prelinked_modules[], *preloaded_modules[];
  !     module **m;
    
  !     /* First, set all module indices, and init total_modules.  */
  !     total_modules = 0;
  !     for (m = preloaded_modules; *m; ++m, ++total_modules) {
  !         (*m)->module_index = total_modules;
  !     }
  ! 
  !     for (m = prelinked_modules; *m; ++m) {
            add_module (*m);
        }
  + }
  + 
  + char *find_module_name (module *m)
  + {
  +     extern char *preloaded_module_names[];
  + 
  +     if (m->module_index >= 0 && m->module_index < total_modules)
  +       return preloaded_module_names[m->module_index];
  +     return NULL;
  + }
  + 
  + /* Add a named module.  Returns 1 if module found, 0 otherwise.  */
  + int add_named_module (char *name)
  + {
  +     extern module *preloaded_modules[];
  +     extern char *preloaded_module_names[];
  +     int i;
  + 
  +     for (i = 0; preloaded_module_names[i]; ++i) {
  +         if (strcmp (preloaded_module_names[i], name) == 0) {
  +         /* Only add modules that are not already enabled.  */
  +         if (preloaded_modules[i]->next == NULL) {
  +             add_module (preloaded_modules[i]);
  +         }
  +         return 1;
  +     }
  +     }
  + 
  +     return 0;
  + }
  + 
  + /* Clear the internal list of modules, in preparation for starting
  +    over.  */
  + void clear_module_list ()
  + {
  +     module **m = &top_module;
  +     module **next_m;
  + 
  +     while (*m) {
  +     next_m = &((*m)->next);
  +     *m = NULL;
  +     m = next_m;
  +     }
  + 
  +     num_modules = 0;
  + 
  +     /* This is required; so we add it always.  */
  +     add_named_module ("core");
    }
    
    /*****************************************************************
  
  
  
  1.20      +5 -2      apache/src/http_config.h
  
  Index: http_config.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.h,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -C3 -r1.19 -r1.20
  *** http_config.h     1996/11/03 21:25:06     1.19
  --- http_config.h     1996/11/04 00:55:17     1.20
  ***************
  *** 226,232 ****
     */
    
    #define MODULE_MAGIC_NUMBER 19961007
  ! #define STANDARD_MODULE_STUFF MODULE_MAGIC_NUMBER, 0, __FILE__, NULL
    
    /* Generic accessors for other modules to get at their own module-specific
     * data
  --- 226,232 ----
     */
    
    #define MODULE_MAGIC_NUMBER 19961007
  ! #define STANDARD_MODULE_STUFF MODULE_MAGIC_NUMBER, -1, __FILE__, NULL
    
    /* Generic accessors for other modules to get at their own module-specific
     * data
  ***************
  *** 249,254 ****
  --- 249,257 ----
    /* Finally, the hook for dynamically loading modules in... */
    
    void add_module (module *m);
  + int add_named_module (char *name);
  + void clear_module_list ();
  + char *find_module_name (module *m);
    
    #ifdef CORE_PRIVATE
    
  ***************
  *** 285,289 ****
    int run_fixups (request_rec *);     /* poke around for other metainfo, 
etc.... */
    int invoke_handler (request_rec *);     
    int log_transaction (request_rec *r);
  !      
    #endif
  --- 288,292 ----
    int run_fixups (request_rec *);     /* poke around for other metainfo, 
etc.... */
    int invoke_handler (request_rec *);     
    int log_transaction (request_rec *r);
  ! 
    #endif
  
  
  
  1.42      +16 -0     apache/src/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_core.c,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -C3 -r1.41 -r1.42
  *** http_core.c       1996/11/03 20:29:39     1.41
  --- http_core.c       1996/11/04 00:55:18     1.42
  ***************
  *** 751,756 ****
  --- 751,769 ----
        return errmsg;
    }
    
  + const char *add_module_command (cmd_parms *cmd, void *dummy, char *arg)
  + {
  +     if (add_named_module (arg))
  +         return NULL;
  +     return "required module not found";
  + }
  + 
  + const char *clear_module_list_command (cmd_parms *cmd, void *dummy)
  + {
  +     clear_module_list ();
  +     return NULL;
  + }
  + 
    const char *set_server_string_slot (cmd_parms *cmd, void *dummy, char *arg)
    {
        /* This one's pretty generic... */
  ***************
  *** 1129,1134 ****
  --- 1142,1150 ----
          "a port number or a numeric IP address and a port number"},
    { "<VirtualHost", virtualhost_section, NULL, RSRC_CONF, RAW_ARGS, NULL },
    { "</VirtualHost>", end_virtualhost_section, NULL, RSRC_CONF, NO_ARGS, NULL 
},
  + { "AddModule", add_module_command, NULL, RSRC_CONF, ITERATE,
  +   "the name of a module" },
  + { "ClearModuleList", clear_module_list_command, NULL, RSRC_CONF, NO_ARGS, 
NULL },
    { NULL },
    };
    
  
  
  
  1.84      +16 -2     apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.83
  retrieving revision 1.84
  diff -C3 -r1.83 -r1.84
  *** http_main.c       1996/11/03 20:52:10     1.83
  --- http_main.c       1996/11/04 00:55:19     1.84
  ***************
  *** 341,351 ****
    
    void usage(char *bin)
    {
  !     fprintf(stderr,"Usage: %s [-d directory] [-f file] [-v] [-h]\n",bin);
        fprintf(stderr,"-d directory : specify an alternate initial 
ServerRoot\n");
        fprintf(stderr,"-f file : specify an alternate ServerConfigFile\n");
        fprintf(stderr,"-v : show version number\n");
        fprintf(stderr,"-h : list directives\n");
        exit(1);
    }
    
  --- 341,352 ----
    
    void usage(char *bin)
    {
  !     fprintf(stderr,"Usage: %s [-d directory] [-f file] [-v] [-h] 
[-l]\n",bin);
        fprintf(stderr,"-d directory : specify an alternate initial 
ServerRoot\n");
        fprintf(stderr,"-f file : specify an alternate ServerConfigFile\n");
        fprintf(stderr,"-v : show version number\n");
        fprintf(stderr,"-h : list directives\n");
  +     fprintf(stderr,"-l : list modules\n");
        exit(1);
    }
    
  ***************
  *** 1865,1870 ****
  --- 1866,1881 ----
    
    } /* standalone_main */
    
  + void show_modules()
  + {
  +     extern char *preloaded_module_names[];
  +     int t;
  + 
  +     printf ("Compiled-in modules:\n");
  +     for (t = 0; preloaded_module_names[t]; ++t)
  +       printf ("  %s\n", preloaded_module_names[t]);
  + }
  + 
    extern char *optarg;
    extern int optind;
    
  ***************
  *** 1895,1901 ****
        strcpy (server_root, HTTPD_ROOT);
        strcpy (server_confname, SERVER_CONFIG_FILE);
    
  !     while((c = getopt(argc,argv,"Xd:f:vh")) != -1) {
            switch(c) {
              case 'd':
                strcpy (server_root, optarg);
  --- 1906,1912 ----
        strcpy (server_root, HTTPD_ROOT);
        strcpy (server_confname, SERVER_CONFIG_FILE);
    
  !     while((c = getopt(argc,argv,"Xd:f:vhl")) != -1) {
            switch(c) {
              case 'd':
                strcpy (server_root, optarg);
  ***************
  *** 1908,1913 ****
  --- 1919,1927 ----
                exit(0);
              case 'h':
            show_directives();
  +         exit(0);
  +       case 'l':
  +         show_modules();
            exit(0);
          case 'X':
            ++one_process;      /* Weird debugging mode. */
  
  
  
  1.5       +11 -9     apache/src/mod_info.c
  
  Index: mod_info.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_info.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -C3 -r1.4 -r1.5
  *** mod_info.c        1996/11/03 20:48:35     1.4
  --- mod_info.c        1996/11/04 00:55:20     1.5
  ***************
  *** 235,242 ****
    int display_info(request_rec *r) {
        module *modp = NULL;
        char buf[256];
  !     extern char *module_names[];
  !     char **names = module_names;
        command_rec *cmd=NULL;
        handler_rec *hand=NULL;
        server_rec *serv = r->server;
  --- 235,241 ----
    int display_info(request_rec *r) {
        module *modp = NULL;
        char buf[256];
  !     char *name;
        command_rec *cmd=NULL;
        handler_rec *hand=NULL;
        server_rec *serv = r->server;
  ***************
  *** 277,284 ****
                mod_info_cfg_access = mod_info_load_config(r->pool,buf);
                if(!r->args) {
                        rputs("<tt><a href=\"#server\">Server Settings</a>, 
",r);
  !                     for(modp = top_module, names=module_names; modp; modp = 
modp->next, names++) {
  !                             sprintf(buf,"<a 
href=\"#%s\">%s</a>",*names,*names);
                                rputs(buf, r);
                                if(modp->next) rputs(", ",r);
                        }
  --- 276,284 ----
                mod_info_cfg_access = mod_info_load_config(r->pool,buf);
                if(!r->args) {
                        rputs("<tt><a href=\"#server\">Server Settings</a>, 
",r);
  !                     for(modp = top_module; modp; modp = modp->next) {
  !                             name=find_module_name (modp);
  !                             sprintf(buf,"<a href=\"#%s\">%s</a>",name,name);
                                rputs(buf, r);
                                if(modp->next) rputs(", ",r);
                        }
  ***************
  *** 312,320 ****
                        rputs(buf,r);
                }
                rputs("<hr><dl>",r);
  !             for(modp = top_module, names=module_names; modp; modp = 
modp->next, names++) {
  !                     if(!r->args || !strcasecmp(*names,r->args)) {   
  !                             sprintf(buf,"<dt><a name=\"%s\"><strong>Module 
Name:</strong> <font size=+1><tt>%s</tt></a></font>\n",*names,*names);
                                rputs(buf,r);
                                rputs("<dt><strong>Content-types 
affected:</strong>",r);        
                                hand = modp->handlers;
  --- 312,321 ----
                        rputs(buf,r);
                }
                rputs("<hr><dl>",r);
  !             for(modp = top_module; modp; modp = modp->next) {
  !                     name=find_module_name (modp);
  !                     if(!r->args || !strcasecmp(name,r->args)) {     
  !                             sprintf(buf,"<dt><a name=\"%s\"><strong>Module 
Name:</strong> <font size=+1><tt>%s</tt></a></font>\n",name,name);
                                rputs(buf,r);
                                rputs("<dt><strong>Content-types 
affected:</strong>",r);        
                                hand = modp->handlers;
  ***************
  *** 392,399 ****
                }
                if(!modp && r->args && strcasecmp(r->args,"server")) 
rputs("<b>No such module</b>\n",r);
        } else {
  !             for(modp = top_module; modp; modp = modp->next, names++) {
  !                     rputs(*names,r);
                        if(modp->next) rputs("<br>",r);
                }       
        }       
  --- 393,401 ----
                }
                if(!modp && r->args && strcasecmp(r->args,"server")) 
rputs("<b>No such module</b>\n",r);
        } else {
  !             for(modp = top_module; modp; modp = modp->next) {
  !                     name=find_module_name (modp);
  !                     rputs(name,r);
                        if(modp->next) rputs("<br>",r);
                }       
        }       
  
  
  

Reply via email to