httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tom Tromey <tro...@creche.cygnus.com>
Subject addmodule revisited
Date Wed, 16 Oct 1996 16:30:43 GMT
My previous AddModule patch had a serious bug.  I forget the precise
symptoms, but basically it had to do with various arrays (eg
conf_vector) not being sized properly.

I have a new version of the patch that fixes this.  This patch
slightly changes the meaning module_index; whereas module_index used
to be the location of the module in the module list, it is now just
the index at which the module is linked in.

I also changed the default module_index in STANDARD_MODULE_STUFF to be
-1 instead of 0.  This change is not really necessary, but I thought
it didn't really make sense for the default value to be a valid index.

Changing the module_index makes find_module_name constant time.

It is also now an error if AddModule can't find the named module.

BTW I noticed that mod_info is inherently broken if you are using
mod_dld (this is true with or without the AddModule patch).  If you
load a module using mod_dld there is no way to get its name.  Another
reason the module name should go in the module structure, I guess.

The patch is appended.  It is also available for ftp from
ftp.cygnus.com in pub/tromey.  I tested this patch by running the
modified Apache against my test suite.

Tom
-- 
tromey@cygnus.com                 Member, League for Programming Freedom

Index: Configuration.tmpl
===================================================================
RCS file: /export/home/cvs/apache/src/Configuration.tmpl,v
retrieving revision 1.44
diff -c -5 -r1.44 Configuration.tmpl
*** Configuration.tmpl	1996/10/09 17:36:18	1.44
--- Configuration.tmpl	1996/10/16 15:22:34
***************
*** 7,17 ****
  
  # The template should only be changed when a new system or module is added,
  # 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
  #
  # Makefile options, such as CC=gcc, etc...
  #
--- 7,17 ----
  
  # The template should only be changed when a new system or module is added,
  # 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
  #
  # Makefile options, such as CC=gcc, etc...
  #
***************
*** 19,28 ****
--- 19,33 ----
  # control Configure's behavior as far as how to create Makefile.
  #
  # 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.
  
  
  ################################################################
  # Makefile configuration
  #
Index: Configure
===================================================================
RCS file: /export/home/cvs/apache/src/Configure,v
retrieving revision 1.27
diff -c -5 -r1.27 Configure
*** Configure	1996/10/10 02:24:37	1.27
--- Configure	1996/10/16 15:22:42
***************
*** 33,44 ****
  sed 's/#.*//' $file | sed '/^[ 	]*$/d' | sed 's/[ 	]*$//' | \
   sed 's/^Rule[ 	]*/##Rule:/' > $tmpfile
  
  # 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"
     echo "options or Configure rules, and I don't see that at all:"
     egrep -v '^Module[ 	]+[A-Za-z0-9_]+[ 	]+[^ 	]+$' $tmpfile | \
--- 33,44 ----
  sed 's/#.*//' $file | sed '/^[ 	]*$/d' | sed 's/[ 	]*$//' | \
   sed 's/^Rule[ 	]*/##Rule:/' > $tmpfile
  
  # 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"
     echo "options or Configure rules, and I don't see that at all:"
     egrep -v '^Module[ 	]+[A-Za-z0-9_]+[ 	]+[^ 	]+$' $tmpfile | \
***************
*** 49,83 ****
  # File is OK --- make backup copies of things and then get the new ones:
  
  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 " */"; \
           print ""; \
  	 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 "};"; \
     }'
  
  #
  # Add module set only
--- 49,96 ----
  # File is OK --- make backup copies of things and then get the new ones:
  
  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 " */"; \
           print ""; \
  	 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 "};"; \
     }'
  
  #
  # Add module set only
***************
*** 87,96 ****
--- 100,110 ----
  	   print "# and configuration file by Apache config script. "; \
  	   print "# Hand-edited changes will be lost if the config script"; \
  	   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]); \
               else printf ("  %s\n", modules[i]); \
           } \
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.c,v
retrieving revision 1.26
diff -c -5 -r1.26 http_config.c
*** http_config.c	1996/10/09 15:23:08	1.26
--- http_config.c	1996/10/16 15:23:02
***************
*** 83,93 ****
--- 83,96 ----
   *
   * We begin with the functions which deal with the linked list
   * 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 *);
  typedef void *(*maker)(pool *);
  typedef void *(*dir_maker)(pool *, char *);
***************
*** 119,136 ****
  }
  
  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) {
         dir_maker df = modp->create_dir_config;
  
--- 122,139 ----
  }
  
  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) {
         dir_maker df = modp->create_dir_config;
  
***************
*** 141,151 ****
  }
  
  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;
  
     for (modp = top_module; modp; modp = modp->next) {
--- 144,154 ----
  }
  
  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;
  
     for (modp = top_module; modp; modp = modp->next) {
***************
*** 162,172 ****
  }
  
  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) {
         if (modp->create_server_config)
  	   conf_vector[modp->module_index]=(*modp->create_server_config)(p,s);
--- 165,175 ----
  }
  
  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) {
         if (modp->create_server_config)
  	   conf_vector[modp->module_index]=(*modp->create_server_config)(p,s);
***************
*** 371,394 ****
  		        "version of Apache.\n", m->name);
  	fprintf(stderr, "Please contact the author for the correct version.\n");
  	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;
      }
  }
  
  /*****************************************************************
   *
   * Resource, access, and .htaccess config files now parsed by a common
--- 374,455 ----
  		        "version of Apache.\n", m->name);
  	fprintf(stderr, "Please contact the author for the correct version.\n");
  	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[];
+     int i;
+ 
+     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");
  }
  
  /*****************************************************************
   *
   * Resource, access, and .htaccess config files now parsed by a common
Index: http_config.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.h,v
retrieving revision 1.15
diff -c -5 -r1.15 http_config.h
*** http_config.h	1996/10/09 15:23:08	1.15
--- http_config.h	1996/10/16 15:23:14
***************
*** 226,236 ****
   * the API (the server can detect an old-format module, and either
   * handle it back-compatibly, or at least signal an error).
   */
  
  #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,236 ----
   * the API (the server can detect an old-format module, and either
   * handle it back-compatibly, or at least signal an error).
   */
  
  #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,258 ****
--- 249,261 ----
  char *server_root_relative (pool *p, char *fname);
       
  /* 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
  
  /* For http_main.c... */
  
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.c,v
retrieving revision 1.36
diff -c -5 -r1.36 http_core.c
*** http_core.c	1996/10/14 00:18:46	1.36
--- http_core.c	1996/10/16 15:23:34
***************
*** 746,755 ****
--- 746,768 ----
      
      if (errmsg == end_virthost_magic) return NULL;
      return errmsg;
  }
  
+ char *add_module_command (cmd_parms *cmd, void *dummy, char *arg)
+ {
+   if (add_named_module (arg))
+     return NULL;
+   return "required module not found";
+ }
+ 
+ char *clear_module_list_command (cmd_parms *cmd, void *dummy)
+ {
+   clear_module_list ();
+   return NULL;
+ }
+ 
  char *set_server_string_slot (cmd_parms *cmd, void *dummy, char *arg)
  {
      /* This one's pretty generic... */
    
      int offset = (int)cmd->info;
***************
*** 1120,1129 ****
--- 1133,1145 ----
    "'*', a numeric IP address, or the name of a host with a unique IP address"},
  { "Listen", set_listener, NULL, RSRC_CONF, TAKE1,
        "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 },
  };
  
  /*****************************************************************
   *
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_main.c,v
retrieving revision 1.76
diff -c -5 -r1.76 http_main.c
*** http_main.c	1996/10/06 02:25:03	1.76
--- http_main.c	1996/10/16 15:28:45
***************
*** 341,355 ****
  }
  #endif
  
  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,356 ----
  }
  #endif
  
  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);
  }
  
  /*****************************************************************
   *
***************
*** 1846,1855 ****
--- 1847,1866 ----
  	*/
      }
  
  } /* 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;
  
  int
  main(int argc, char *argv[])
***************
*** 1876,1886 ****
      
      server_argv0 = argv[0];
      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);
              break;
            case 'f':
--- 1887,1897 ----
      
      server_argv0 = argv[0];
      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);
              break;
            case 'f':
***************
*** 1889,1898 ****
--- 1900,1912 ----
            case 'v':
              printf("Server version %s.\n",SERVER_VERSION);
              exit(0);
            case 'h':
  	    show_directives();
+ 	    exit(0);
+ 	  case 'l':
+ 	    show_modules();
  	    exit(0);
  	  case 'X':
  	    ++one_process;	/* Weird debugging mode. */
  	    break;
            case '?':
Index: mod_info.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_info.c,v
retrieving revision 1.3
diff -c -5 -r1.3 mod_info.c
*** mod_info.c	1996/08/20 11:51:13	1.3
--- mod_info.c	1996/10/16 15:28:55
***************
*** 235,246 ****
  }
  
  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;
  	int comma=0;
  	mod_info_config_lines *mod_info_cfg_httpd=NULL;
--- 235,245 ----
  }
  
  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;
  	int comma=0;
  	mod_info_config_lines *mod_info_cfg_httpd=NULL;
***************
*** 277,288 ****
  		mod_info_cfg_srm = mod_info_load_config(r->pool,buf);
  		sprintf(buf,"%s/%s",server_root,serv->access_confname);
  		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);
  			}
  			rputs("</tt><hr>",r);
  
--- 276,288 ----
  		mod_info_cfg_srm = mod_info_load_config(r->pool,buf);
  		sprintf(buf,"%s/%s",server_root,serv->access_confname);
  		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);
  			}
  			rputs("</tt><hr>",r);
  
***************
*** 312,324 ****
  			rputs(buf,r);
  			sprintf(buf,"<strong>Scoreboard File:</strong> <tt>%s</tt><br>\n",scoreboard_fname);
  			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;
  				if(hand) {
  					while(hand) {
--- 312,325 ----
  			rputs(buf,r);
  			sprintf(buf,"<strong>Scoreboard File:</strong> <tt>%s</tt><br>\n",scoreboard_fname);
  			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;
  				if(hand) {
  					while(hand) {
***************
*** 392,403 ****
  				if(r->args) break;
  			}
  		}
  		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);
  		}	
  	}	
  	rputs("</dl></body></html>\n",r);
  	/* Done, turn off timeout, close file and return */
--- 393,405 ----
  				if(r->args) break;
  			}
  		}
  		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);
  		}	
  	}	
  	rputs("</dl></body></html>\n",r);
  	/* Done, turn off timeout, close file and return */

Mime
View raw message