You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Roy T. Fielding" <fi...@kiwi.ICS.UCI.EDU> on 1996/10/04 08:33:57 UTC

Changes for httpd -h

Please have a look at these changes for the "httpd -h" output.
You might want to run that first, before applying the patch,
just to see what the current output looks like.
Note that I moved the print routines to http_config, since that is
where they belong (even without the changes).

I couldn't think of any reason for preferring the single-line output
over multiple lines, since both are machine-readable and only the
latter is human readable.  If there is already a program out there
that processes the old format, then we could change the option to -H,
though there is no documentation on the current -h option either.

.....Roy

Index: http_config.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.h,v
retrieving revision 1.11
diff -c -r1.11 http_config.h
*** http_config.h	1996/08/20 11:50:43	1.11
--- http_config.h	1996/10/04 06:17:14
***************
*** 1,5 ****
  /* ====================================================================
!  * Copyright (c) 1995 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
--- 1,5 ----
  /* ====================================================================
!  * Copyright (c) 1995, 1996 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
***************
*** 86,93 ****
    char *errmsg;			/* 'usage' message, in case of syntax errors */
  } command_rec;
  
! /* Values for the req_override slot */
! 
  #define OR_NONE 0
  #define OR_LIMIT 1
  #define OR_OPTIONS 2
--- 86,107 ----
    char *errmsg;			/* 'usage' message, in case of syntax errors */
  } command_rec;
  
! /* The allowed locations for a configuration directive are the union of
!  * those indicated by each set bit in the req_override mask.
!  *
!  * (req_override & RSRC_CONF)   => *.conf outside <Directory> or <Location>
!  * (req_override & ACCESS_CONF) => *.conf inside <Directory> or <Location>
!  * (req_override & OR_AUTHCFG)  => *.conf inside <Directory> or <Location>
!  *                                 and .htaccess when AllowOverride AuthConfig
!  * (req_override & OR_LIMIT)    => *.conf inside <Directory> or <Location>
!  *                                 and .htaccess when AllowOverride Limit
!  * (req_override & OR_OPTIONS)  => *.conf anywhere
!  *                                 and .htaccess when AllowOverride Options
!  * (req_override & OR_FILEINFO) => *.conf anywhere
!  *                                 and .htaccess when AllowOverride FileInfo
!  * (req_override & OR_INDEXES)  => *.conf anywhere
!  *                                 and .htaccess when AllowOverride Indexes
!  */
  #define OR_NONE 0
  #define OR_LIMIT 1
  #define OR_OPTIONS 2
***************
*** 95,102 ****
  #define OR_AUTHCFG 8
  #define OR_INDEXES 16
  #define OR_UNSET 32
! #define ACCESS_CONF 64		/* command valid in access.conf */
! #define RSRC_CONF 128		/* command valid in srm.conf */
  #define OR_ALL (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES)
  
  /*
--- 109,116 ----
  #define OR_AUTHCFG 8
  #define OR_INDEXES 16
  #define OR_UNSET 32
! #define ACCESS_CONF 64
! #define RSRC_CONF 128
  #define OR_ALL (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES)
  
  /*
***************
*** 232,237 ****
--- 246,252 ----
  
  server_rec *read_config (pool *conf_pool, pool *temp_pool, char *config_name);
  void setup_prelinked_modules();
+ void show_directives();
  
  /* For http_request.c... */
  
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.c,v
retrieving revision 1.23
diff -c -r1.23 http_config.c
*** http_config.c	1996/09/23 03:01:03	1.23
--- http_config.c	1996/10/04 06:17:20
***************
*** 1,5 ****
  /* ====================================================================
!  * Copyright (c) 1995 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
--- 1,5 ----
  /* ====================================================================
!  * Copyright (c) 1995, 1996 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
***************
*** 82,89 ****
  /****************************************************************
   *
   * We begin with the functions which deal with the linked list
!  * of modules which control just about all of server operation in
!  * Shambhala.
   */
  
  static int num_modules = 0;    
--- 82,88 ----
  /****************************************************************
   *
   * We begin with the functions which deal with the linked list
!  * of modules which control just about all of the server operation.
   */
  
  static int num_modules = 0;    
***************
*** 915,919 ****
--- 914,1011 ----
  	    (*m->init) (s, p);
      
      return s;
+ }
+ 
+ /********************************************************************
+  * Configuration directives are restricted in terms of where they may
+  * appear in the main configuration files and/or .htaccess files according
+  * to the bitmask req_override in the command_rec structure.
+  * If any of the overrides set in req_override are also allowed in the
+  * context in which the command is read, then the command is allowed.
+  * The context is determined as follows:
+  *
+  *    inside *.conf --> override = (RSRC_CONF|OR_ALL)&~(OR_AUTHCFG|OR_LIMIT);
+  *    within <Directory> or <Location> --> override = OR_ALL|ACCESS_CONF;
+  *    within .htaccess --> override = AllowOverride for current directory;
+  *
+  * the result is, well, a rather confusing set of possibilities for when
+  * a particular directive is allowed to be used.  This procedure prints
+  * in English where the given (pc) directive can be used.
+  */
+ void show_overrides(command_rec *pc, module *pm)
+ {
+     int n = 0;
+     
+     printf("\tAllowed in *.conf ");
+     if ((pc->req_override & (OR_OPTIONS|OR_FILEINFO|OR_INDEXES)) ||
+         ((pc->req_override & RSRC_CONF) &&
+          ((pc->req_override & (ACCESS_CONF|OR_AUTHCFG|OR_LIMIT)))))
+         printf("anywhere");
+     else if (pc->req_override & RSRC_CONF)
+         printf("only outside <Directory> or <Location>");
+     else 
+         printf("only inside <Directory> or <Location>");
+ 
+     /* Warn if the directive is allowed inside <Directory> or .htaccess
+      * but module doesn't support per-dir configuration */
+ 
+     if ((pc->req_override & (OR_ALL|ACCESS_CONF)) && !pm->create_dir_config)
+         printf(" [no per-dir config]");
+ 
+     if (pc->req_override & OR_ALL) {
+         printf(" and in .htaccess\n\twhen AllowOverride");
+ 
+         if ((pc->req_override & OR_ALL) == OR_ALL)
+             printf(" isn't None");
+         else {
+             printf(" includes ");
+ 
+             if (pc->req_override & OR_AUTHCFG) {
+                 if (n++) printf(" or ");
+                 printf("AuthConfig");
+             }
+             if (pc->req_override & OR_LIMIT) {
+                 if (n++) printf(" or ");
+                 printf("Limit");
+             }
+             if (pc->req_override & OR_OPTIONS) {
+                 if (n++) printf(" or ");
+                 printf("Options");
+             }
+             if (pc->req_override & OR_FILEINFO) {
+                 if (n++) printf(" or ");
+                 printf("FileInfo");
+             }
+             if (pc->req_override & OR_INDEXES) {
+                 if (n++) printf(" or ");
+                 printf("Indexes");
+             }
+         }
+     }
+     printf("\n");
+ }
+ 
+ /* Show the prelinked configuration directives, the help string explaining
+  * the directive arguments, in what module they are handled, and in
+  * what parts of the configuration they are allowed.  Used for httpd -h.
+  */
+ void show_directives()
+ {
+     extern module *prelinked_modules[];
+     extern char *module_names[];
+     command_rec *pc;
+     int n;
+     int t;
+     
+     for(t=0 ; prelinked_modules[t] ; ++t)
+         ;
+     for(n=0 ; prelinked_modules[n] ; ++n)
+         for(pc=prelinked_modules[n]->cmds ; pc && pc->name ; ++pc) {
+             printf("%s\n", pc->name);
+             if (pc->errmsg)
+                 printf("\t%s\n", pc->errmsg);
+             printf("\t%s\n", module_names[t-n-1]);
+             show_overrides(pc, prelinked_modules[n]);
+         }
  }
  
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_main.c,v
retrieving revision 1.75
diff -c -r1.75 http_main.c
*** http_main.c	1996/10/02 00:31:52	1.75
--- http_main.c	1996/10/04 06:17:28
***************
*** 1,5 ****
  /* ====================================================================
!  * Copyright (c) 1995 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
--- 1,5 ----
  /* ====================================================================
!  * Copyright (c) 1995, 1996 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
***************
*** 1847,1899 ****
      }
  
  } /* standalone_main */
- 
- void show_overrides(command_rec *pc,module *pm)
-     {
-     int n;
-     struct
- 	{
- 	int override;
- 	char letter;
- 	} aOvers[]= {
- 	{ OR_LIMIT, 'L' },
- 	{ OR_OPTIONS, 'O' },
- 	{ OR_FILEINFO, 'F' },
- 	{ OR_AUTHCFG, 'A' },
- 	{ OR_INDEXES, 'I' },
- 	{ ACCESS_CONF, 'a' },
- 	{ RSRC_CONF, 'r' },
- 	{ (OR_ALL|RSRC_CONF)&~(OR_LIMIT|OR_AUTHCFG), 'd' }, /* outside <Directory> */
- 	{ OR_ALL|ACCESS_CONF, 'D' }, /* inside <Directory> */
- 	{ 0, '\0' }
- 	};
- 	
-     for(n=0 ; aOvers[n].override ; ++n)
- 	if(pc->req_override&aOvers[n].override)
- 	    putchar(aOvers[n].letter);
-     if((pc->req_override&(OR_ALL|ACCESS_CONF)) && !pm->create_dir_config)
- 	putchar('!');	/* Directive allowed inside <Directory> but module doesn't support per-dir config */
-     }
- 
- void show_directives()
-     {
-     extern module *prelinked_modules[];
-     extern char *module_names[];
-     command_rec *pc;
-     int n;
-     int t;
-     
-     for(t=0 ; prelinked_modules[t] ; ++t)
- 	;
-     for(n=0 ; prelinked_modules[n] ; ++n)
- 	for(pc=prelinked_modules[n]->cmds ; pc && pc->name ; ++pc)
- 	    {
- 	    printf("%s\t%s\t%s\t", pc->name, pc->errmsg ? pc->errmsg : "",
- 	           module_names[t-n-1]);
- 	    show_overrides(pc,prelinked_modules[n]);
- 	    putchar('\n');
- 	    }
-     }
  
  extern char *optarg;
  extern int optind;
--- 1847,1852 ----