You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Dean Gaudet <dg...@hyperreal.org> on 1997/07/08 21:50:50 UTC
cvs commit: apache/src CHANGES Configuration.tmpl mod_autoindex.c mod_dir.c
dgaudet 97/07/08 12:50:49
Modified: htdocs/manual/mod directives.html index.html
mod_autoindex.html mod_dir.html
src CHANGES Configuration.tmpl mod_autoindex.c
mod_dir.c
Log:
Automatic indexes moved from mod_dir into mod_autoindex. The mod_autoindex
CVS files are copies of the mod_dir files so that we retain history in
both places.
Revision Changes Path
1.26 +13 -13 apache/htdocs/manual/mod/directives.html
Index: directives.html
===================================================================
RCS file: /export/home/cvs/apache/htdocs/manual/mod/directives.html,v
retrieving revision 1.25
retrieving revision 1.26
diff -C3 -r1.25 -r1.26
*** directives.html 1997/07/08 04:45:24 1.25
--- directives.html 1997/07/08 19:50:39 1.26
***************
*** 19,33 ****
<li><A HREF="core.html#accessconfig">AccessConfig</A>
<li><A HREF="core.html#accessfilename">AccessFileName</A>
<li><A HREF="mod_actions.html#action">Action</A>
! <li><A HREF="mod_dir.html#addalt">AddAlt</A>
! <li><A HREF="mod_dir.html#addaltbyencoding">AddAltByEncoding</A>
! <li><A HREF="mod_dir.html#addaltbytype">AddAltByType</A>
! <li><A HREF="mod_dir.html#adddescription">AddDescription</A>
<li><A HREF="mod_mime.html#addencoding">AddEncoding</A>
<li><A HREF="mod_mime.html#addhandler">AddHandler</A>
! <li><A HREF="mod_dir.html#addicon">AddIcon</A>
! <li><A HREF="mod_dir.html#addiconbyencoding">AddIconByEncoding</A>
! <li><A HREF="mod_dir.html#addiconbytype">AddIconByType</A>
<li><A HREF="mod_mime.html#addlanguage">AddLanguage</A>
<li><A HREF="core.html#addmodule">AddModule</A>
<li><A HREF="mod_mime.html#addtype">AddType</A>
--- 19,33 ----
<li><A HREF="core.html#accessconfig">AccessConfig</A>
<li><A HREF="core.html#accessfilename">AccessFileName</A>
<li><A HREF="mod_actions.html#action">Action</A>
! <li><A HREF="mod_autoindex.html#addalt">AddAlt</A>
! <li><A HREF="mod_autoindex.html#addaltbyencoding">AddAltByEncoding</A>
! <li><A HREF="mod_autoindex.html#addaltbytype">AddAltByType</A>
! <li><A HREF="mod_autoindex.html#adddescription">AddDescription</A>
<li><A HREF="mod_mime.html#addencoding">AddEncoding</A>
<li><A HREF="mod_mime.html#addhandler">AddHandler</A>
! <li><A HREF="mod_autoindex.html#addicon">AddIcon</A>
! <li><A HREF="mod_autoindex.html#addiconbyencoding">AddIconByEncoding</A>
! <li><A HREF="mod_autoindex.html#addiconbytype">AddIconByType</A>
<li><A HREF="mod_mime.html#addlanguage">AddLanguage</A>
<li><A HREF="core.html#addmodule">AddModule</A>
<li><A HREF="mod_mime.html#addtype">AddType</A>
***************
*** 73,79 ****
<li><A HREF="mod_log_config.html#cookielog">CookieLog</A> (mod_log_config)
<li><A HREF="mod_usertrack.html#cookietracking">CookieTracking</A>
<li><A HREF="mod_log_config.html#customlog">CustomLog</A>
! <li><A HREF="mod_dir.html#defaulticon">DefaultIcon</A>
<li><A HREF="core.html#defaulttype">DefaultType</A>
<li><A HREF="mod_access.html#deny">deny</A>
<li><A HREF="core.html#directory"><Directory></A>
--- 73,79 ----
<li><A HREF="mod_log_config.html#cookielog">CookieLog</A> (mod_log_config)
<li><A HREF="mod_usertrack.html#cookietracking">CookieTracking</A>
<li><A HREF="mod_log_config.html#customlog">CustomLog</A>
! <li><A HREF="mod_autoindex.html#defaulticon">DefaultIcon</A>
<li><A HREF="core.html#defaulttype">DefaultType</A>
<li><A HREF="mod_access.html#deny">deny</A>
<li><A HREF="core.html#directory"><Directory></A>
***************
*** 86,106 ****
<li><A HREF="mod_expires.html#expiresactive">ExpiresActive</A>
<li><A HREF="mod_expires.html#expiresbytype">ExpiresByType</A>
<li><A HREF="mod_expires.html#expiresdefault">ExpiresDefault</A>
! <li><A HREF="mod_dir.html#fancyindexing">FancyIndexing</A>
<li><A HREF="core.html#files"><Files></A>
<li><A HREF="core.html#filesmatch"><FilesMatch></A>
<li><A HREF="mod_mime.html#forcetype">ForceType</A>
<li><A HREF="core.html#group">Group</A>
<li><A HREF="mod_headers.html#header">Header</A>
! <li><A HREF="mod_dir.html#headername">HeaderName</A>
<li><A HREF="core.html#hostnamelookups">HostNameLookups</A>
<li><A HREF="core.html#identitycheck">IdentityCheck</A>
<li><A HREF="core.html#ifmodule"><IfModule></A>
<li><A HREF="mod_imap.html#imapbase">ImapBase</A>
<li><A HREF="mod_imap.html#imapdefault">ImapDefault</A>
<li><A HREF="mod_imap.html#imapmenu">ImapMenu</A>
! <li><A HREF="mod_dir.html#indexignore">IndexIgnore</A>
! <li><A HREF="mod_dir.html#indexoptions">IndexOptions</A>
<li><A HREF="core.html#keepalive">KeepAlive</A>
<li><A HREF="core.html#keepalivetimeout">KeepAliveTimeout</A>
<li><A HREF="mod_negotiation.html#languagepriority">LanguagePriority</A>
--- 86,106 ----
<li><A HREF="mod_expires.html#expiresactive">ExpiresActive</A>
<li><A HREF="mod_expires.html#expiresbytype">ExpiresByType</A>
<li><A HREF="mod_expires.html#expiresdefault">ExpiresDefault</A>
! <li><A HREF="mod_autoindex.html#fancyindexing">FancyIndexing</A>
<li><A HREF="core.html#files"><Files></A>
<li><A HREF="core.html#filesmatch"><FilesMatch></A>
<li><A HREF="mod_mime.html#forcetype">ForceType</A>
<li><A HREF="core.html#group">Group</A>
<li><A HREF="mod_headers.html#header">Header</A>
! <li><A HREF="mod_autoindex.html#headername">HeaderName</A>
<li><A HREF="core.html#hostnamelookups">HostNameLookups</A>
<li><A HREF="core.html#identitycheck">IdentityCheck</A>
<li><A HREF="core.html#ifmodule"><IfModule></A>
<li><A HREF="mod_imap.html#imapbase">ImapBase</A>
<li><A HREF="mod_imap.html#imapdefault">ImapDefault</A>
<li><A HREF="mod_imap.html#imapmenu">ImapMenu</A>
! <li><A HREF="mod_autoindex.html#indexignore">IndexIgnore</A>
! <li><A HREF="mod_autoindex.html#indexoptions">IndexOptions</A>
<li><A HREF="core.html#keepalive">KeepAlive</A>
<li><A HREF="core.html#keepalivetimeout">KeepAliveTimeout</A>
<li><A HREF="mod_negotiation.html#languagepriority">LanguagePriority</A>
***************
*** 131,137 ****
<li><A HREF="mod_proxy.html#proxypass">ProxyPass</A>
<li><A HREF="mod_proxy.html#proxyremote">ProxyRemote</A>
<li><A HREF="mod_proxy.html#proxyrequests">ProxyRequests</A>
! <li><A HREF="mod_dir.html#readmename">ReadmeName</A>
<li><A HREF="mod_alias.html#redirect">Redirect</A>
<li><A HREF="mod_alias.html#redirectmatch">RedirectMatch</A>
<li><A HREF="mod_alias.html#redirectperm">RedirectPermanent</A>
--- 131,137 ----
<li><A HREF="mod_proxy.html#proxypass">ProxyPass</A>
<li><A HREF="mod_proxy.html#proxyremote">ProxyRemote</A>
<li><A HREF="mod_proxy.html#proxyrequests">ProxyRequests</A>
! <li><A HREF="mod_autoindex.html#readmename">ReadmeName</A>
<li><A HREF="mod_alias.html#redirect">Redirect</A>
<li><A HREF="mod_alias.html#redirectmatch">RedirectMatch</A>
<li><A HREF="mod_alias.html#redirectperm">RedirectPermanent</A>
1.16 +3 -1 apache/htdocs/manual/mod/index.html
Index: index.html
===================================================================
RCS file: /export/home/cvs/apache/htdocs/manual/mod/index.html,v
retrieving revision 1.15
retrieving revision 1.16
diff -C3 -r1.15 -r1.16
*** index.html 1997/07/07 18:18:39 1.15
--- index.html 1997/07/08 19:50:40 1.16
***************
*** 44,49 ****
--- 44,51 ----
<dd>User authentication using DBM files.
<dt><A HREF="mod_auth_msql.html">mod_auth_msql</A>
<dd>User authentication using mSQL files.
+ <dt><A HREF="mod_autoindex.html">mod_autoindex</A>
+ <dd>Automatic directory listings.
<dt><A HREF="mod_browser.html">mod_browser</A> Apache 1.2 and up
<dd>Set environment variables based on User-Agent strings
<dt><A HREF="mod_cern_meta.html">mod_cern_meta</a>
***************
*** 56,62 ****
<dt><A HREF="mod_digest.html">mod_digest</A>
<dd>MD5 authentication
<dt><A HREF="mod_dir.html">mod_dir</A>
! <dd>Automatic directory listings.
<dt><A HREF="mod_dld.html">mod_dld</A>
<dd>Start-time linking with the GNU libdld.
<dt><A HREF="mod_env.html">mod_env</A>
--- 58,64 ----
<dt><A HREF="mod_digest.html">mod_digest</A>
<dd>MD5 authentication
<dt><A HREF="mod_dir.html">mod_dir</A>
! <dd>Basic directory handling.
<dt><A HREF="mod_dld.html">mod_dld</A>
<dd>Start-time linking with the GNU libdld.
<dt><A HREF="mod_env.html">mod_env</A>
1.9 +12 -45 apache/htdocs/manual/mod/mod_autoindex.html
Index: mod_autoindex.html
===================================================================
RCS file: /export/home/cvs/apache/htdocs/manual/mod/mod_autoindex.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -C3 -r1.8 -r1.9
*** mod_autoindex.html 1997/07/06 17:19:16 1.8
--- mod_autoindex.html 1997/07/08 19:50:41 1.9
***************
*** 1,7 ****
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
! <TITLE>Apache module mod_dir</TITLE>
</HEAD>
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
--- 1,7 ----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
! <TITLE>Apache module mod_autoindex</TITLE>
</HEAD>
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
***************
*** 13,37 ****
ALINK="#FF0000"
>
<!--#include virtual="header.html" -->
! <H1 ALIGN="CENTER">Module mod_dir</H1>
! This module is contained in the <code>mod_dir.c</code> file, and
! is compiled in by default. It provides for directory indexing.
<h2>Summary</h2>
! This module controls the directory indexing. The index of a directory
! can come from one of two sources:
<ul>
<li>A file written by the user, typically called <code>index.html</code>.
! The <A HREF="#directoryindex">DirectoryIndex</A> directive sets the name
! of this file.
<li>Otherwise, a listing generated by the server. The other directives
control the format of this listing. The <A HREF="#addicon">AddIcon</A>,
<A HREF="#addiconbyencoding">AddIconByEncoding</A> and
<A HREF="#addiconbytype">AddIconByType</A> are used to set a list of
icons to display for various file types; for each file listed, the
! first icon listed that matches the file is displayed.
</ul>
<h2>Directives</h2>
--- 13,40 ----
ALINK="#FF0000"
>
<!--#include virtual="header.html" -->
! <H1 ALIGN="CENTER">Module mod_autoindex</H1>
! This module is contained in the <code>mod_autoindex.c</code> file, and
! is compiled in by default. It provides for automatic directory indexing.
<h2>Summary</h2>
! The index of a directory can come from one of two sources:
<ul>
<li>A file written by the user, typically called <code>index.html</code>.
! The <A HREF="mod_dir.html#directoryindex">DirectoryIndex</A> directive sets
! the name of this file.
! This is controlled by <a href="mod_dir.html"><code>mod_dir</code></a>.
<li>Otherwise, a listing generated by the server. The other directives
control the format of this listing. The <A HREF="#addicon">AddIcon</A>,
<A HREF="#addiconbyencoding">AddIconByEncoding</A> and
<A HREF="#addiconbytype">AddIconByType</A> are used to set a list of
icons to display for various file types; for each file listed, the
! first icon listed that matches the file is displayed. These
! are controlled by <code>mod_autoindex</code>.
</ul>
+ The two functions are separated so that you can completely remove
+ (or replace) automatic index generation should you want to.
<h2>Directives</h2>
***************
*** 45,51 ****
<li><A HREF="#addiconbyencoding">AddIconByEncoding</A>
<li><A HREF="#addiconbytype">AddIconByType</A>
<li><A HREF="#defaulticon">DefaultIcon</A>
- <li><A HREF="#directoryindex">DirectoryIndex</A>
<li><A HREF="#fancyindexing">FancyIndexing</A>
<li><A HREF="#headername">HeaderName</A>
<li><A HREF="#indexignore">IndexIgnore</A>
--- 48,53 ----
***************
*** 199,239 ****
<blockquote><code>
DefaultIcon /icon/unknown.xbm
</code></blockquote><p><hr>
-
- <A name="directoryindex"><h2>DirectoryIndex</h2></A>
- <!--%plaintext <?INDEX {\tt DirectoryIndex} directive> -->
- <strong>Syntax:</strong> DirectoryIndex <em>local-url local-url ...</em><br>
- <strong>Default:</strong> <code>DirectoryIndex index.html</code><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The DirectoryIndex directive sets the list of resources to look for,
- when the client requests an index of the directory by specifying a /
- at the end of the a directory name. <em>Local-url</em> is the
- (%-encoded) URL of a document on the server relative to the requested
- directory; it is usually the name of a file in the directory. Several
- URLs may be given, in which case the server will return the first one
- that it finds. If none of the resources exist and the
- <CODE>Indexes</CODE> option is set, the server will generate its own
- listing of the directory.
- <P>
-
- Example:
- <blockquote><code>
- DirectoryIndex index.html
- </code></blockquote>
- then a request for <code>http://myserver/docs/</code> would return
- <code>http://myserver/docs/index.html</code> if it exists, or would list
- the directory if it did not. <p>
-
- Note that the documents do not need to be relative to the directory;
- <blockquote><code>
- DirectoryIndex index.html index.txt /cgi-bin/index.pl</code></blockquote>
- would cause the CGI script <code>/cgi-bin/index.pl</code> to be executed
- if neither <code>index.html</code> or <code>index.txt</code> existed in
- a directory.<p><hr>
<A name="fancyindexing"><h2>FancyIndexing</h2></A>
<!--%plaintext <?INDEX {\tt FancyIndexing} directive> -->
--- 201,206 ----
1.9 +15 -317 apache/htdocs/manual/mod/mod_dir.html
Index: mod_dir.html
===================================================================
RCS file: /export/home/cvs/apache/htdocs/manual/mod/mod_dir.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -C3 -r1.8 -r1.9
*** mod_dir.html 1997/07/06 17:19:16 1.8
--- mod_dir.html 1997/07/08 19:50:41 1.9
***************
*** 16,205 ****
<H1 ALIGN="CENTER">Module mod_dir</H1>
This module is contained in the <code>mod_dir.c</code> file, and
! is compiled in by default. It provides for directory indexing.
<h2>Summary</h2>
! This module controls the directory indexing. The index of a directory
! can come from one of two sources:
<ul>
<li>A file written by the user, typically called <code>index.html</code>.
! The <A HREF="#directoryindex">DirectoryIndex</A> directive sets the name
! of this file.
! <li>Otherwise, a listing generated by the server. The other directives
! control the format of this listing. The <A HREF="#addicon">AddIcon</A>,
! <A HREF="#addiconbyencoding">AddIconByEncoding</A> and
! <A HREF="#addiconbytype">AddIconByType</A> are used to set a list of
! icons to display for various file types; for each file listed, the
! first icon listed that matches the file is displayed.
</ul>
!
<h2>Directives</h2>
<menu>
- <li><A HREF="#addalt">AddAlt</A>
- <li><A HREF="#addaltbyencoding">AddAltByEncoding</A>
- <li><A HREF="#addaltbytype">AddAltByType</A>
- <li><A HREF="#adddescription">AddDescription</A>
- <li><A HREF="#addicon">AddIcon</A>
- <li><A HREF="#addiconbyencoding">AddIconByEncoding</A>
- <li><A HREF="#addiconbytype">AddIconByType</A>
- <li><A HREF="#defaulticon">DefaultIcon</A>
<li><A HREF="#directoryindex">DirectoryIndex</A>
- <li><A HREF="#fancyindexing">FancyIndexing</A>
- <li><A HREF="#headername">HeaderName</A>
- <li><A HREF="#indexignore">IndexIgnore</A>
- <li><A HREF="#indexoptions">IndexOptions</A>
- <li><A HREF="#readmename">ReadmeName</A>
</menu>
<hr>
- <A name="addalt"><h2>AddAlt</h2></A>
- <!--%plaintext <?INDEX {\tt AddAlt} directive> -->
- <strong>Syntax:</strong> AddAlt <em>string file file...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the alternate text to display for a file, instead of an icon, for
- <A HREF="#fancyindexing">FancyIndexing</A>. <em>File</em> is a file
- extension, partial filename, wild-card expression or full filename for files
- to describe. <em>String</em> is enclosed in double quotes
- (<code>"</code>). This alternate text is displayed if the client is
- image-incapable or has image loading disabled.
-
- <HR>
- <A name="addaltbyencoding"><h2>AddAltByEncoding</h2></A>
- <!--%plaintext <?INDEX {\tt AddAltByEncoding} directive> -->
- <strong>Syntax:</strong> AddAltByEncoding <em>string MIME-encoding
- MIME-encoding...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the alternate text to display for a file, instead of an icon, for
- <A HREF="#fancyindexing">FancyIndexing</A>. <em>MIME-encoding</em> is a
- valid content-encoding, such as <SAMP>x-compress</SAMP>.
- <em>String</em> is enclosed in double quotes
- (<code>"</code>). This alternate text is displayed if the client is
- image-incapable or has image loading disabled.
-
- <HR>
- <A name="addaltbytype"><h2>AddAltByType</h2></A>
- <!--%plaintext <?INDEX {\tt AddAltByType} directive> -->
- <strong>Syntax:</strong> AddAltByType <em>string MIME-type MIME-type...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the alternate text to display for a file, instead of an icon, for
- <A HREF="#fancyindexing">FancyIndexing</A>. <em>MIME-type</em> is a
- valid content-type, such as <SAMP>text/html</SAMP>.
- <em>String</em> is enclosed in double quotes
- (<code>"</code>). This alternate text is displayed if the client is
- image-incapable or has image loading disabled.
-
- <HR>
-
- <A name="adddescription"><h2>AddDescription</h2></A>
- <!--%plaintext <?INDEX {\tt AddDescription} directive> -->
- <strong>Syntax:</strong> AddDescription <em>string file file...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the description to display for a file, for
- <A HREF="#fancyindexing">FancyIndexing</A>. <em>File</em> is a file
- extension, partial filename, wild-card expression or full filename for files
- to describe. <em>String</em> is enclosed in double quotes
- (<code>"</code>). Example:
- <blockquote><code>AddDescription "The planet Mars" /web/pics/mars.gif
- </code></blockquote><p><hr>
-
- <A name="addicon"><h2>AddIcon</h2></A>
- <!--%plaintext <?INDEX {\tt AddIcon} directive> -->
- <strong>Syntax:</strong> AddIcon <em>icon name name ...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the icon to display next to a file ending in <em>name</em> for
- <A HREF="#fancyindexing">FancyIndexing</A>. <em>Icon</em> is either a
- (%-escaped) relative URL to the icon, or of the format
- (<em>alttext</em>,<em>url</em>) where <em>alttext</em> is the text tag given
- for an icon for non-graphical browsers.<p>
-
- <em>Name</em> is either ^^DIRECTORY^^ for directories, ^^BLANKICON^^ for
- blank lines (to format the list correctly), a file extension, a wildcard
- expression, a partial filename or a complete filename. Examples:
- <blockquote><code>
- AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm <br>
- AddIcon /icons/dir.xbm ^^DIRECTORY^^ <br>
- AddIcon /icons/backup.xbm *~
- </code></blockquote>
- <A HREF="#addiconbytype">AddIconByType</A> should be used in preference to
- AddIcon, when possible.<p><hr>
-
- <A name="addiconbyencoding"><h2>AddIconByEncoding</h2></A>
- <!--%plaintext <?INDEX {\tt AddIconByEncoding} directive> -->
- <strong>Syntax:</strong> AddIconByEncoding <em>icon mime-encoding mime-encoding
- ...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the icon to display next to files with
- <em>mime-encoding</em> for <A HREF="#fancyindexing">FancyIndexing</A>.
- <em>Icon</em> is either a (%-escaped) relative URL to the icon, or of the
- format (<em>alttext</em>,<em>url</em>) where <em>alttext</em> is the text tag
- given for an icon for non-graphical browsers.<p>
-
- <em>Mime-encoding</em> is a wildcard expression matching required the
- content-encoding. Examples:
- <blockquote><code>
- AddIconByEncoding /icons/compress.xbm x-compress
- </code></blockquote><p><hr>
-
- <A name="addiconbytype"><h2>AddIconByType</h2></A>
- <!--%plaintext <?INDEX {\tt AddIconByType} directive> -->
- <strong>Syntax:</strong> AddIconByType <em>icon mime-type mime-type ...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- This sets the icon to display next to files of type <em>mime-type</em> for
- <A HREF="#fancyindexing">FancyIndexing</A>. <em>Icon</em> is either a
- (%-escaped) relative URL to the icon, or of the format
- (<em>alttext</em>,<em>url</em>) where <em>alttext</em> is the text tag given
- for an icon for non-graphical browsers.<p>
- <em>Mime-type</em> is a wildcard expression matching required the mime types.
- Examples:
- <blockquote><code>
- AddIconByType (IMG,/icons/image.xbm) image/*
- </code></blockquote><p><hr>
-
- <A name="defaulticon"><h2>DefaultIcon</h2></A>
- <!--%plaintext <?INDEX {\tt DefaultIcon} directive> -->
- <strong>Syntax:</strong> DefaultIcon <em>url</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The DefaultIcon directive sets the icon to display for files when no
- specific icon is known, for <A HREF="#fancyindexing">FancyIndexing</A>.
- <em>Url</em> is a (%-escaped) relative URL to the icon. Examples:
- <blockquote><code>
- DefaultIcon /icon/unknown.xbm
- </code></blockquote><p><hr>
-
<A name="directoryindex"><h2>DirectoryIndex</h2></A>
<!--%plaintext <?INDEX {\tt DirectoryIndex} directive> -->
<strong>Syntax:</strong> DirectoryIndex <em>local-url local-url ...</em><br>
--- 16,49 ----
<H1 ALIGN="CENTER">Module mod_dir</H1>
This module is contained in the <code>mod_dir.c</code> file, and
! is compiled in by default. It provides for "trailing slash" redirects and
! serving directory index files.
<h2>Summary</h2>
! The index of a directory can come from one of two sources:
<ul>
<li>A file written by the user, typically called <code>index.html</code>.
! The <A HREF="#directoryindex">DirectoryIndex</A> directive sets
! the name of this file.
! This is controlled by <code>mod_dir</code>.
! <li>Otherwise, a listing generated by the server. This is provided by
! <a href="mod_autoindex.html"><code>mod_autoindex</code></a>.
</ul>
! The two functions are separated so that you can completely remove
! (or replace) automatic index generation should you want to.
! <p>A "trailing slash" redirect is issued when the server receives a
! request for a URL <SAMP>http://servername/foo/dirname</SAMP> where
! <SAMP>dirname</SAMP> is a directory. Directories require a trailing
! slash, so <code>mod_dir</code> issues a redirect to
! <SAMP>http://servername/foo/dirname/</SAMP>.
<h2>Directives</h2>
<menu>
<li><A HREF="#directoryindex">DirectoryIndex</A>
</menu>
<hr>
<A name="directoryindex"><h2>DirectoryIndex</h2></A>
<!--%plaintext <?INDEX {\tt DirectoryIndex} directive> -->
<strong>Syntax:</strong> DirectoryIndex <em>local-url local-url ...</em><br>
***************
*** 234,385 ****
would cause the CGI script <code>/cgi-bin/index.pl</code> to be executed
if neither <code>index.html</code> or <code>index.txt</code> existed in
a directory.<p><hr>
-
- <A name="fancyindexing"><h2>FancyIndexing</h2></A>
- <!--%plaintext <?INDEX {\tt FancyIndexing} directive> -->
- <strong>Syntax:</strong> FancyIndexing <em>boolean</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The FancyIndexing directive sets the FancyIndexing option for a directory.
- <em>Boolean</em> can be <code>on</code> or <code>off</code>. The
- <A HREF="#indexoptions">IndexOptions</A> directive should be used in
- preference.<p><hr>
-
- <A name="headername"><h2>HeaderName</h2></A>
- <!--%plaintext <?INDEX {\tt HeaderName} directive> -->
- <strong>Syntax:</strong> HeaderName <em>filename</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The HeaderName directive sets the name of the file that will be inserted
- at the top of the index listing. <em>Filename</em> is the name of the file
- to include, and is taken to be relative to the directory being indexed.
- The server first attempts to include <em>filename</em><code>.html</code>
- as an HTML document, otherwise it will include <em>filename</em> as plain
- text. Example:
- <blockquote><code>HeaderName HEADER</code></blockquote>
- when indexing the directory <code>/web</code>, the server will first look for
- the HTML file <code>/web/HEADER.html</code> and include it if found, otherwise
- it will include the plain text file <code>/web/HEADER</code>, if it exists.
-
- <p>See also <A HREF="#readmename">ReadmeName</A>.<p><hr>
-
- <A name="indexignore"><h2>IndexIgnore</h2></A>
- <!--%plaintext <?INDEX {\tt IndexIgnore} directive> -->
- <strong>Syntax:</strong> IndexIgnore <em>file file ...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The IndexIgnore directive adds to the list of files to hide when listing
- a directory. <em>File</em> is a file extension, partial filename,
- wildcard expression or full filename for files to ignore. Multiple
- IndexIgnore directives add to the list, rather than the replacing the list
- of ignored files. By default, the list contains `<code>.</code>'. Example:
- <blockquote><code>
- IndexIgnore README .htaccess *~
- </code></blockquote><p><hr>
-
- <A name="indexoptions"><h2>IndexOptions</h2></A>
- <!--%plaintext <?INDEX {\tt IndexOptions} directive> -->
- <strong>Syntax:</strong> IndexOptions <em>option option ...</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The IndexOptions directive specifies the behavior of the directory indexing.
- <em>Option</em> can be one of
- <dl>
- <dt>FancyIndexing
- <dd><!--%plaintext <?INDEX {\tt FancyIndexing} index option> -->
- This turns on fancy indexing of directories.
- <dt>IconsAreLinks
- <dd>
- <!--%plaintext <?INDEX {\tt IconsAreLinks} index option> -->
- This makes the icons part of the anchor for the filename, for
- fancy indexing.
- <dt>ScanHTMLTitles
- <dd><!--%plaintext <?INDEX {\tt ScanHTMLTitles} index option> -->
- This enables the extraction of the title from HTML documents for fancy
- indexing. If the file does not have a description given by
- <A HREF="#adddescription">AddDescription</A> then httpd will read the
- document for the value of the TITLE tag. This is CPU and disk intensive.
- <dt>SuppressLastModified
- <dd>
- <!--%plaintext <?INDEX {\tt SuppressLastModified} index option> -->
- This will suppress the display of the last modification date, in fancy
- indexing listings.
- <dt>SuppressSize
- <dd>
- <!--%plaintext <?INDEX {\tt SuppressSize} index option> -->
- This will suppress the file size in fancy indexing listings.
- <dt>SuppressDescription
- <dd>
- <!--%plaintext <?INDEX {\tt SuppressDescription} index option> -->
- This will suppress the file description in fancy indexing listings.
- <dt>IconHeight[=pixels] (<EM>Apache 1.3 and later</EM>)
- <dd>
- <!--%plaintext <?INDEX {\tt IconHeight} index option> -->
- Presence of this option, when used with IconWidth, will cause the server
- to include <SAMP>HEIGHT</SAMP> and <SAMP>WIDTH</SAMP> attributes in the
- <SAMP>IMG</SAMP> tag for the file icon. This allows browser to
- precalculate the page layout without having to wait until all the
- images have been loaded. If no value is given for the option, it
- defaults to the standard height of the icons supplied with the Apache
- software.
- <dt>IconWidth[=pixels] (<EM>Apache 1.3 and later</EM>)
- <dd>
- <!--%plaintext <?INDEX {\tt IconWidth} index option> -->
- Presence of this option, when used with IconHeight, will cause the server
- to include <SAMP>HEIGHT</SAMP> and <SAMP>WIDTH</SAMP> attributes in the
- <SAMP>IMG</SAMP> tag for the file icon. This allows browser to
- precalculate the page layout without having to wait until all the
- images have been loaded. If no value is given for the option, it
- defaults to the standard width of the icons supplied with the Apache
- software.
- </dl>
- This default is that no options are enabled. If multiple IndexOptions
- could apply to a directory, then the most specific one is taken complete;
- the options are not merged. For example:
- <blockquote><code>
- <Directory /web/docs> <br>
- IndexOptions FancyIndexing <br>
- </Directory><br>
- <Directory /web/docs/spec> <br>
- IndexOptions ScanHTMLTitles <br>
- </Directory>
- </code></blockquote>
- then only <code>ScanHTMLTitles</code> will be set for the /web/docs/spec
- directory.<p><hr>
-
- <A name="readmename"><h2>ReadmeName</h2></A>
- <!--%plaintext <?INDEX {\tt ReadmeName} directive> -->
- <strong>Syntax:</strong> ReadmeName <em>filename</em><br>
- <Strong>Context:</strong> server config, virtual host, directory, .htaccess<br>
- <Strong>Override:</strong> Indexes<br>
- <strong>Status:</strong> Base<br>
- <strong>Module:</strong> mod_dir<p>
-
- The ReadmeName directive sets the name of the file that will be appended
- to the end of the index listing. <em>Filename</em> is the name of the file
- to include, and is taken to be relative to the directory being indexed.
- The server first attempts to include <em>filename</em><code>.html</code>
- as an HTML document, otherwise it will include <em>filename</em> as plain
- text. Example:
- <blockquote><code>ReadmeName README</code></blockquote>
- when indexing the directory <code>/web</code>, the server will first look for
- the HTML file <code>/web/README.html</code> and include it if found, otherwise
- it will include the plain text file <code>/web/README</code>, if it exists.
-
- <p>See also <A HREF="#headername">HeaderName</A>.<p>
-
<!--#include virtual="footer.html" -->
</BODY>
--- 78,83 ----
1.329 +5 -0 apache/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache/src/CHANGES,v
retrieving revision 1.328
retrieving revision 1.329
diff -C3 -r1.328 -r1.329
*** CHANGES 1997/07/08 06:32:32 1.328
--- CHANGES 1997/07/08 19:50:45 1.329
***************
*** 1,5 ****
--- 1,10 ----
Changes with Apache 1.3
+ *) Automatic indexing removed from mod_dir and placed into mod_autoindex.
+ This allows the admin to completely remove automatic indexing
+ from the server, while still supporting the basic functions of
+ trailing-slash redirects and DirectoryIndex files. [Dean Gaudet]
+
*) popendir/pclosedir created to properly protect directory scanning.
[Dean Gaudet] PR#525
1.66 +4 -2 apache/src/Configuration.tmpl
Index: Configuration.tmpl
===================================================================
RCS file: /export/home/cvs/apache/src/Configuration.tmpl,v
retrieving revision 1.65
retrieving revision 1.66
diff -C3 -r1.65 -r1.66
*** Configuration.tmpl 1997/07/07 18:18:42 1.65
--- Configuration.tmpl 1997/07/08 19:50:45 1.66
***************
*** 175,185 ****
# Module info_module mod_info.o
## mod_include translates server-side include (SSI) statements in text files.
! ## mod_dir handles requests on directories and directory indexes.
## mod_cgi handles CGI scripts.
Module includes_module mod_include.o
! Module dir_module mod_dir.o
Module cgi_module mod_cgi.o
## The asis module implemented ".asis" file types, which allow the embedding
--- 175,187 ----
# Module info_module mod_info.o
## mod_include translates server-side include (SSI) statements in text files.
! ## mod_autoindex handles requests for directories which have no index file
! ## mod_dir handles requests on directories and directory index files.
## mod_cgi handles CGI scripts.
Module includes_module mod_include.o
! Module autoindex_module mod_autoindex.o
! Module dir_module mod_dir.o
Module cgi_module mod_cgi.o
## The asis module implemented ".asis" file types, which allow the embedding
1.33 +82 -157 apache/src/mod_autoindex.c
Index: mod_autoindex.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_autoindex.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -C3 -r1.32 -r1.33
*** mod_autoindex.c 1997/07/08 06:32:34 1.32
--- mod_autoindex.c 1997/07/08 19:50:46 1.33
***************
*** 51,57 ****
*/
/*
! * http_dir.c: Handles the on-the-fly html index generation
*
* Rob McCool
* 3/23/93
--- 51,57 ----
*/
/*
! * mod_autoindex.c: Handles the on-the-fly html index generation
*
* Rob McCool
* 3/23/93
***************
*** 72,78 ****
#include "nt/readdir.h"
#endif
! module dir_module;
/****************************************************************
*
--- 72,78 ----
#include "nt/readdir.h"
#endif
! module autoindex_module;
/****************************************************************
*
***************
*** 99,115 ****
char *data;
};
! typedef struct dir_config_struct {
char *default_icon;
- char *index_names;
int icon_width;
int icon_height;
array_header *icon_list, *alt_list, *desc_list, *ign_list;
array_header *hdr_list, *rdme_list, *opts_list;
! } dir_config_rec;
char c_by_encoding, c_by_type, c_by_path;
--- 99,114 ----
char *data;
};
! typedef struct autoindex_config_struct {
char *default_icon;
int icon_width;
int icon_height;
array_header *icon_list, *alt_list, *desc_list, *ign_list;
array_header *hdr_list, *rdme_list, *opts_list;
! } autoindex_config_rec;
char c_by_encoding, c_by_type, c_by_path;
***************
*** 117,123 ****
#define BY_TYPE &c_by_type
#define BY_PATH &c_by_path
! void push_item(array_header *arr, char *type, char *to, char *path, char *data)
{
struct item *p = (struct item *)push_array(arr);
--- 116,123 ----
#define BY_TYPE &c_by_type
#define BY_PATH &c_by_path
! static void push_item(array_header *arr, char *type, char *to, char *path,
! char *data)
{
struct item *p = (struct item *)push_array(arr);
***************
*** 136,152 ****
p->apply_to = NULL;
}
! const char *add_alt(cmd_parms *cmd, void *d, char *alt, char *to)
{
if (cmd->info == BY_PATH)
if(!strcmp(to,"**DIRECTORY**"))
to = "^^DIRECTORY^^";
! push_item(((dir_config_rec *)d)->alt_list, cmd->info, to, cmd->path, alt);
return NULL;
}
! const char *add_icon(cmd_parms *cmd, void *d, char *icon, char *to)
{
char *iconbak = pstrdup (cmd->pool, icon);
--- 136,152 ----
p->apply_to = NULL;
}
! static const char *add_alt(cmd_parms *cmd, void *d, char *alt, char *to)
{
if (cmd->info == BY_PATH)
if(!strcmp(to,"**DIRECTORY**"))
to = "^^DIRECTORY^^";
! push_item(((autoindex_config_rec *)d)->alt_list, cmd->info, to, cmd->path, alt);
return NULL;
}
! static const char *add_icon(cmd_parms *cmd, void *d, char *icon, char *to)
{
char *iconbak = pstrdup (cmd->pool, icon);
***************
*** 159,212 ****
if(!strcmp(to,"**DIRECTORY**"))
to = "^^DIRECTORY^^";
! push_item(((dir_config_rec *)d)->icon_list, cmd->info, to, cmd->path,
iconbak);
return NULL;
}
! const char *add_desc(cmd_parms *cmd, void *d, char *desc, char *to)
{
! push_item(((dir_config_rec *)d)->desc_list, cmd->info, to, cmd->path,desc);
return NULL;
}
! const char *add_ignore(cmd_parms *cmd, void *d, char *ext) {
! push_item(((dir_config_rec *)d)->ign_list, 0, ext, cmd->path, NULL);
return NULL;
}
! const char *add_header(cmd_parms *cmd, void *d, char *name) {
if (strchr (name, '/')) {
return "HeaderName cannot contain a /";
}
! push_item(((dir_config_rec *)d)->hdr_list, 0, NULL, cmd->path, name);
return NULL;
}
! const char *add_readme(cmd_parms *cmd, void *d, char *name) {
if (strchr (name, '/')) {
return "ReadmeName cannot contain a /";
}
! push_item(((dir_config_rec *)d)->rdme_list, 0, NULL, cmd->path, name);
return NULL;
}
! const char *add_opts_int(cmd_parms *cmd, void *d, int opts) {
! push_item(((dir_config_rec *)d)->opts_list, (char*)opts, NULL,
cmd->path, NULL);
return NULL;
}
! const char *fancy_indexing (cmd_parms *cmd, void *d, int arg)
{
return add_opts_int (cmd, d, arg? FANCY_INDEXING : 0);
}
! const char *add_opts(cmd_parms *cmd, void *d, const char *optstr) {
char *w;
int opts = 0;
! dir_config_rec *d_cfg = (dir_config_rec *) d;
while(optstr[0]) {
w = getword_conf(cmd->pool, &optstr);
--- 159,212 ----
if(!strcmp(to,"**DIRECTORY**"))
to = "^^DIRECTORY^^";
! push_item(((autoindex_config_rec *)d)->icon_list, cmd->info, to, cmd->path,
iconbak);
return NULL;
}
! static const char *add_desc(cmd_parms *cmd, void *d, char *desc, char *to)
{
! push_item(((autoindex_config_rec *)d)->desc_list, cmd->info, to, cmd->path,desc);
return NULL;
}
! static const char *add_ignore(cmd_parms *cmd, void *d, char *ext) {
! push_item(((autoindex_config_rec *)d)->ign_list, 0, ext, cmd->path, NULL);
return NULL;
}
! static const char *add_header(cmd_parms *cmd, void *d, char *name) {
if (strchr (name, '/')) {
return "HeaderName cannot contain a /";
}
! push_item(((autoindex_config_rec *)d)->hdr_list, 0, NULL, cmd->path, name);
return NULL;
}
! static const char *add_readme(cmd_parms *cmd, void *d, char *name) {
if (strchr (name, '/')) {
return "ReadmeName cannot contain a /";
}
! push_item(((autoindex_config_rec *)d)->rdme_list, 0, NULL, cmd->path, name);
return NULL;
}
! static const char *add_opts_int(cmd_parms *cmd, void *d, int opts) {
! push_item(((autoindex_config_rec *)d)->opts_list, (char*)opts, NULL,
cmd->path, NULL);
return NULL;
}
! static const char *fancy_indexing (cmd_parms *cmd, void *d, int arg)
{
return add_opts_int (cmd, d, arg? FANCY_INDEXING : 0);
}
! static const char *add_opts(cmd_parms *cmd, void *d, const char *optstr) {
char *w;
int opts = 0;
! autoindex_config_rec *d_cfg = (autoindex_config_rec *) d;
while(optstr[0]) {
w = getword_conf(cmd->pool, &optstr);
***************
*** 256,262 ****
#define DIR_CMD_PERMS OR_INDEXES
! command_rec dir_cmds[] = {
{ "AddIcon", add_icon, BY_PATH, DIR_CMD_PERMS, ITERATE2,
"an icon URL followed by one or more filenames" },
{ "AddIconByType", add_icon, BY_TYPE, DIR_CMD_PERMS, ITERATE2,
--- 256,262 ----
#define DIR_CMD_PERMS OR_INDEXES
! static command_rec autoindex_cmds[] = {
{ "AddIcon", add_icon, BY_PATH, DIR_CMD_PERMS, ITERATE2,
"an icon URL followed by one or more filenames" },
{ "AddIconByType", add_icon, BY_TYPE, DIR_CMD_PERMS, ITERATE2,
***************
*** 280,300 ****
{ "FancyIndexing", fancy_indexing, NULL, DIR_CMD_PERMS, FLAG,
"Limited to 'on' or 'off' (superseded by IndexOptions FancyIndexing)" },
{ "DefaultIcon", set_string_slot,
! (void*)XtOffsetOf(dir_config_rec, default_icon),
DIR_CMD_PERMS, TAKE1, "an icon URL"},
- { "DirectoryIndex", set_string_slot,
- (void*)XtOffsetOf(dir_config_rec, index_names),
- DIR_CMD_PERMS, RAW_ARGS,
- "a list of file names" },
{ NULL }
};
! void *create_dir_config (pool *p, char *dummy)
{
! dir_config_rec *new =
! (dir_config_rec *) pcalloc (p, sizeof(dir_config_rec));
- new->index_names = NULL;
new->icon_width = 0;
new->icon_height = 0;
new->icon_list = make_array (p, 4, sizeof (struct item));
--- 280,295 ----
{ "FancyIndexing", fancy_indexing, NULL, DIR_CMD_PERMS, FLAG,
"Limited to 'on' or 'off' (superseded by IndexOptions FancyIndexing)" },
{ "DefaultIcon", set_string_slot,
! (void*)XtOffsetOf(autoindex_config_rec, default_icon),
DIR_CMD_PERMS, TAKE1, "an icon URL"},
{ NULL }
};
! static void *create_autoindex_config (pool *p, char *dummy)
{
! autoindex_config_rec *new =
! (autoindex_config_rec *) pcalloc (p, sizeof(autoindex_config_rec));
new->icon_width = 0;
new->icon_height = 0;
new->icon_list = make_array (p, 4, sizeof (struct item));
***************
*** 308,321 ****
return (void *)new;
}
! void *merge_dir_configs (pool *p, void *basev, void *addv)
{
! dir_config_rec *new=(dir_config_rec*)pcalloc (p, sizeof(dir_config_rec));
! dir_config_rec *base = (dir_config_rec *)basev;
! dir_config_rec *add = (dir_config_rec *)addv;
new->default_icon = add->default_icon?add->default_icon:base->default_icon;
- new->index_names = add->index_names? add->index_names: base->index_names;
new->icon_height = add->icon_height ? add->icon_height : base->icon_height;
new->icon_width = add->icon_width ? add->icon_width : base->icon_width;
--- 303,315 ----
return (void *)new;
}
! static void *merge_autoindex_configs (pool *p, void *basev, void *addv)
{
! autoindex_config_rec *new=(autoindex_config_rec*)pcalloc (p, sizeof(autoindex_config_rec));
! autoindex_config_rec *base = (autoindex_config_rec *)basev;
! autoindex_config_rec *add = (autoindex_config_rec *)addv;
new->default_icon = add->default_icon?add->default_icon:base->default_icon;
new->icon_height = add->icon_height ? add->icon_height : base->icon_height;
new->icon_width = add->icon_width ? add->icon_width : base->icon_width;
***************
*** 347,353 ****
struct ent *next;
};
! char *find_item(request_rec *r, array_header *list, int path_only) {
char *content_type = r->content_type;
char *content_encoding = r->content_encoding;
char *path = r->filename;
--- 341,347 ----
struct ent *next;
};
! static char *find_item(request_rec *r, array_header *list, int path_only) {
char *content_type = r->content_type;
char *content_encoding = r->content_encoding;
char *path = r->filename;
***************
*** 389,395 ****
#define find_header(d,p) find_item(p,d->hdr_list,0)
#define find_readme(d,p) find_item(p,d->rdme_list,0)
! char *find_default_icon (dir_config_rec *d, char *bogus_name)
{
request_rec r;
--- 383,389 ----
#define find_header(d,p) find_item(p,d->hdr_list,0)
#define find_readme(d,p) find_item(p,d->rdme_list,0)
! static char *find_default_icon (autoindex_config_rec *d, char *bogus_name)
{
request_rec r;
***************
*** 404,410 ****
return find_item (&r, d->icon_list, 1);
}
! int ignore_entry(dir_config_rec *d, char *path) {
array_header *list = d->ign_list;
struct item *items = (struct item *)list->elts;
char *tt;
--- 398,404 ----
return find_item (&r, d->icon_list, 1);
}
! static int ignore_entry(autoindex_config_rec *d, char *path) {
array_header *list = d->ign_list;
struct item *items = (struct item *)list->elts;
char *tt;
***************
*** 431,437 ****
return 0;
}
! int find_opts(dir_config_rec *d, request_rec *r) {
char *path = r->filename;
array_header *list = d->opts_list;
struct item *items = (struct item *)list->elts;
--- 425,431 ----
return 0;
}
! static int find_opts(autoindex_config_rec *d, request_rec *r) {
char *path = r->filename;
array_header *list = d->opts_list;
struct item *items = (struct item *)list->elts;
***************
*** 452,458 ****
*/
! int insert_readme(char *name, char *readme_fname, int rule, request_rec *r) {
char *fn;
FILE *f;
struct stat finfo;
--- 446,454 ----
*/
! static int insert_readme(char *name, char *readme_fname, int rule,
! request_rec *r)
! {
char *fn;
FILE *f;
struct stat finfo;
***************
*** 516,522 ****
}
! char *find_title(request_rec *r) {
char titlebuf[MAX_STRING_LEN], *find = "<TITLE>";
FILE *thefile = NULL;
int x,y,n,p;
--- 512,518 ----
}
! static char *find_title(request_rec *r) {
char titlebuf[MAX_STRING_LEN], *find = "<TITLE>";
FILE *thefile = NULL;
int x,y,n,p;
***************
*** 548,555 ****
return NULL;
}
! struct ent *make_dir_entry(char *name, int dir_opts,
! dir_config_rec *d, request_rec *r)
{
struct ent *p;
--- 544,551 ----
return NULL;
}
! static struct ent *make_autoindex_entry(char *name, int autoindex_opts,
! autoindex_config_rec *d, request_rec *r)
{
struct ent *p;
***************
*** 567,573 ****
p->desc = NULL;
p->lm = -1;
! if(dir_opts & FANCY_INDEXING) {
request_rec *rr = sub_req_lookup_file (name, r);
if (rr->finfo.st_mode != 0) {
--- 563,569 ----
p->desc = NULL;
p->lm = -1;
! if(autoindex_opts & FANCY_INDEXING) {
request_rec *rr = sub_req_lookup_file (name, r);
if (rr->finfo.st_mode != 0) {
***************
*** 589,595 ****
p->desc = find_desc(d, rr);
! if((!p->desc) && (dir_opts & SCAN_HTML_TITLES))
p->desc = pstrdup (r->pool, find_title(rr));
destroy_sub_req (rr);
--- 585,591 ----
p->desc = find_desc(d, rr);
! if((!p->desc) && (autoindex_opts & SCAN_HTML_TITLES))
p->desc = pstrdup (r->pool, find_title(rr));
destroy_sub_req (rr);
***************
*** 597,608 ****
return(p);
}
! char *terminate_description(dir_config_rec *d, char *desc, int dir_opts) {
int maxsize = 23;
register int x;
! if(dir_opts & SUPPRESS_LAST_MOD) maxsize += 17;
! if(dir_opts & SUPPRESS_SIZE) maxsize += 7;
for(x=0;desc[x] && maxsize;x++) {
if(desc[x] == '<') {
--- 593,606 ----
return(p);
}
! static char *terminate_description(autoindex_config_rec *d, char *desc,
! int autoindex_opts)
! {
int maxsize = 23;
register int x;
! if(autoindex_opts & SUPPRESS_LAST_MOD) maxsize += 17;
! if(autoindex_opts & SUPPRESS_SIZE) maxsize += 7;
for(x=0;desc[x] && maxsize;x++) {
if(desc[x] == '<') {
***************
*** 623,630 ****
return desc;
}
! void output_directories(struct ent **ar, int n,
! dir_config_rec *d, request_rec *r, int dir_opts)
{
int x, len;
char *name = r->uri;
--- 621,628 ----
return desc;
}
! static void output_directories(struct ent **ar, int n,
! autoindex_config_rec *d, request_rec *r, int autoindex_opts)
{
int x, len;
char *name = r->uri;
***************
*** 633,639 ****
if(name[0] == '\0') name = "/";
! if(dir_opts & FANCY_INDEXING) {
rputs("<PRE>", r);
if((tp = find_default_icon(d,"^^BLANKICON^^"))) {
rvputs(r, "<IMG SRC=\"", escape_html(scratch, tp),
--- 631,637 ----
if(name[0] == '\0') name = "/";
! if(autoindex_opts & FANCY_INDEXING) {
rputs("<PRE>", r);
if((tp = find_default_icon(d,"^^BLANKICON^^"))) {
rvputs(r, "<IMG SRC=\"", escape_html(scratch, tp),
***************
*** 650,660 ****
rputs ("> ", r);
}
rputs("Name ", r);
! if(!(dir_opts & SUPPRESS_LAST_MOD))
rputs("Last modified ", r);
! if(!(dir_opts & SUPPRESS_SIZE))
rputs("Size ", r);
! if(!(dir_opts & SUPPRESS_DESC))
rputs("Description", r);
rputs("\n<HR>\n", r);
}
--- 648,658 ----
rputs ("> ", r);
}
rputs("Name ", r);
! if(!(autoindex_opts & SUPPRESS_LAST_MOD))
rputs("Last modified ", r);
! if(!(autoindex_opts & SUPPRESS_SIZE))
rputs("Size ", r);
! if(!(autoindex_opts & SUPPRESS_DESC))
rputs("Description", r);
rputs("\n<HR>\n", r);
}
***************
*** 698,705 ****
"\">", NULL);
}
! if(dir_opts & FANCY_INDEXING) {
! if(dir_opts & ICONS_ARE_LINKS)
rputs(anchor, r);
if((ar[x]->icon) || d->default_icon) {
rvputs(r, "<IMG SRC=\"",
--- 696,703 ----
"\">", NULL);
}
! if(autoindex_opts & FANCY_INDEXING) {
! if(autoindex_opts & ICONS_ARE_LINKS)
rputs(anchor, r);
if((ar[x]->icon) || d->default_icon) {
rvputs(r, "<IMG SRC=\"",
***************
*** 718,728 ****
}
rputs (">", r);
}
! if(dir_opts & ICONS_ARE_LINKS)
rputs("</A>", r);
rvputs(r," ", anchor, t2, NULL);
! if(!(dir_opts & SUPPRESS_LAST_MOD)) {
if(ar[x]->lm != -1) {
char time[MAX_STRING_LEN];
struct tm *ts = localtime(&ar[x]->lm);
--- 716,726 ----
}
rputs (">", r);
}
! if(autoindex_opts & ICONS_ARE_LINKS)
rputs("</A>", r);
rvputs(r," ", anchor, t2, NULL);
! if(!(autoindex_opts & SUPPRESS_LAST_MOD)) {
if(ar[x]->lm != -1) {
char time[MAX_STRING_LEN];
struct tm *ts = localtime(&ar[x]->lm);
***************
*** 733,745 ****
rputs(" ", r);
}
}
! if(!(dir_opts & SUPPRESS_SIZE)) {
send_size(ar[x]->size,r);
rputs(" ", r);
}
! if(!(dir_opts & SUPPRESS_DESC)) {
if(ar[x]->desc) {
! rputs(terminate_description(d, ar[x]->desc, dir_opts), r);
}
}
}
--- 731,743 ----
rputs(" ", r);
}
}
! if(!(autoindex_opts & SUPPRESS_SIZE)) {
send_size(ar[x]->size,r);
rputs(" ", r);
}
! if(!(autoindex_opts & SUPPRESS_DESC)) {
if(ar[x]->desc) {
! rputs(terminate_description(d, ar[x]->desc, autoindex_opts), r);
}
}
}
***************
*** 747,753 ****
rvputs(r, "<LI> ", anchor," ", t2, NULL);
rputc('\n', r);
}
! if(dir_opts & FANCY_INDEXING) {
rputs("</PRE>", r);
}
else {
--- 745,751 ----
rvputs(r, "<LI> ", anchor," ", t2, NULL);
rputc('\n', r);
}
! if(autoindex_opts & FANCY_INDEXING) {
rputs("</PRE>", r);
}
else {
***************
*** 756,768 ****
}
! int dsortf(struct ent **s1,struct ent **s2)
{
return(strcmp((*s1)->name,(*s2)->name));
}
! int index_directory(request_rec *r, dir_config_rec *dir_conf)
{
char *title_name = escape_html(r->pool, r->uri);
char *title_endp;
--- 754,766 ----
}
! static int dsortf(struct ent **s1,struct ent **s2)
{
return(strcmp((*s1)->name,(*s2)->name));
}
! static int index_directory(request_rec *r, autoindex_config_rec *autoindex_conf)
{
char *title_name = escape_html(r->pool, r->uri);
char *title_endp;
***************
*** 774,780 ****
struct ent *head,*p;
struct ent **ar = NULL;
char *tmp;
! int dir_opts = find_opts(dir_conf, r);
if(!(d=popendir(r->pool, name))) {
log_reason ("Can't open directory for index", r->filename, r);
--- 772,778 ----
struct ent *head,*p;
struct ent **ar = NULL;
char *tmp;
! int autoindex_opts = find_opts(autoindex_conf, r);
if(!(d=popendir(r->pool, name))) {
log_reason ("Can't open directory for index", r->filename, r);
***************
*** 807,813 ****
NULL
);
! if((!(tmp = find_header(dir_conf,r))) || (!(insert_readme(name,tmp,0,r))))
rvputs(r, "<H1>Index of ", title_name, "</H1>\n", NULL);
/*
--- 805,811 ----
NULL
);
! if((!(tmp = find_header(autoindex_conf,r))) || (!(insert_readme(name,tmp,0,r))))
rvputs(r, "<H1>Index of ", title_name, "</H1>\n", NULL);
/*
***************
*** 816,822 ****
*/
head=NULL;
while((dstruct=readdir(d))) {
! if((p = make_dir_entry(dstruct->d_name, dir_opts, dir_conf, r))) {
p->next=head;
head=p;
num_ent++;
--- 814,820 ----
*/
head=NULL;
while((dstruct=readdir(d))) {
! if((p = make_autoindex_entry(dstruct->d_name, autoindex_opts, autoindex_conf, r))) {
p->next=head;
head=p;
num_ent++;
***************
*** 838,848 ****
(int (*)(const void *,const void *))dsortf);
#endif
}
! output_directories(ar, num_ent, dir_conf, r, dir_opts);
pclosedir(r->pool, d);
! if (dir_opts & FANCY_INDEXING)
! if((tmp = find_readme(dir_conf, r)))
insert_readme(name,tmp,1,r);
else {
rputs("</UL>", r);
--- 836,846 ----
(int (*)(const void *,const void *))dsortf);
#endif
}
! output_directories(ar, num_ent, autoindex_conf, r, autoindex_opts);
pclosedir(r->pool, d);
! if (autoindex_opts & FANCY_INDEXING)
! if((tmp = find_readme(autoindex_conf, r)))
insert_readme(name,tmp,1,r);
else {
rputs("</UL>", r);
***************
*** 856,940 ****
/* The formal handler... */
! int handle_dir (request_rec *r)
{
! dir_config_rec *d =
! (dir_config_rec *)get_module_config (r->per_dir_config, &dir_module);
! const char *names_ptr = d->index_names ? d->index_names : DEFAULT_INDEX;
int allow_opts = allow_options (r);
- int error_notfound = 0;
-
- if (r->uri[0] == '\0' || r->uri[strlen(r->uri)-1] != '/') {
- char* ifile;
- if (r->args != NULL)
- ifile = pstrcat (r->pool, escape_uri(r->pool, r->uri),
- "/", "?", r->args, NULL);
- else
- ifile = pstrcat (r->pool, escape_uri(r->pool, r->uri),
- "/", NULL);
-
- table_set (r->headers_out, "Location",
- construct_url(r->pool, ifile, r->server));
- return HTTP_MOVED_PERMANENTLY;
- }
-
- /* KLUDGE --- make the sub_req lookups happen in the right directory.
- * Fixing this in the sub_req_lookup functions themselves is difficult,
- * and would probably break virtual includes...
- */
-
- r->filename = pstrcat (r->pool, r->filename, "/", NULL);
-
- while (*names_ptr) {
-
- char *name_ptr = getword_conf (r->pool, &names_ptr);
- request_rec *rr = sub_req_lookup_uri (name_ptr, r);
-
- if (rr->status == HTTP_OK && rr->finfo.st_mode != 0) {
- char* new_uri = escape_uri(r->pool, rr->uri);
-
- if (rr->args != NULL)
- new_uri = pstrcat(r->pool, new_uri, "?", rr->args, NULL);
- else if (r->args != NULL)
- new_uri = pstrcat(r->pool, new_uri, "?", r->args, NULL);
-
- destroy_sub_req (rr);
- internal_redirect (new_uri, r);
- return OK;
- }
-
- /* If the request returned a redirect, propagate it to the client */
-
- if (is_HTTP_REDIRECT(rr->status) ||
- (rr->status == HTTP_NOT_ACCEPTABLE && *names_ptr == '\0')) {
-
- error_notfound = rr->status;
- r->notes = overlay_tables(r->pool, r->notes, rr->notes);
- r->headers_out = overlay_tables(r->pool, r->headers_out,
- rr->headers_out);
- r->err_headers_out = overlay_tables(r->pool, r->err_headers_out,
- rr->err_headers_out);
- destroy_sub_req(rr);
- return error_notfound;
- }
-
- /* If the request returned something other than 404 (or 200),
- * it means the module encountered some sort of problem. To be
- * secure, we should return the error, rather than create
- * along a (possibly unsafe) directory index.
- *
- * So we store the error, and if none of the listed files
- * exist, we return the last error response we got, instead
- * of a directory listing.
- */
- if (rr->status && rr->status != HTTP_NOT_FOUND && rr->status != HTTP_OK)
- error_notfound = rr->status;
-
- destroy_sub_req (rr);
- }
-
- if (error_notfound)
- return error_notfound;
if (r->method_number != M_GET) return NOT_IMPLEMENTED;
--- 854,865 ----
/* The formal handler... */
! static int handle_autoindex (request_rec *r)
{
! autoindex_config_rec *d =
! (autoindex_config_rec *)get_module_config (r->per_dir_config,
! &autoindex_module);
int allow_opts = allow_options (r);
if (r->method_number != M_GET) return NOT_IMPLEMENTED;
***************
*** 949,968 ****
}
! handler_rec dir_handlers[] = {
! { DIR_MAGIC_TYPE, handle_dir },
{ NULL }
};
! module dir_module = {
STANDARD_MODULE_STUFF,
NULL, /* initializer */
! create_dir_config, /* dir config creater */
! merge_dir_configs, /* dir merger --- default is to override */
NULL, /* server config */
NULL, /* merge server config */
! dir_cmds, /* command table */
! dir_handlers, /* handlers */
NULL, /* filename translation */
NULL, /* check_user_id */
NULL, /* check auth */
--- 874,893 ----
}
! static handler_rec autoindex_handlers[] = {
! { DIR_MAGIC_TYPE, handle_autoindex },
{ NULL }
};
! module autoindex_module = {
STANDARD_MODULE_STUFF,
NULL, /* initializer */
! create_autoindex_config, /* dir config creater */
! merge_autoindex_configs, /* dir merger --- default is to override */
NULL, /* server config */
NULL, /* merge server config */
! autoindex_cmds, /* command table */
! autoindex_handlers, /* handlers */
NULL, /* filename translation */
NULL, /* check_user_id */
NULL, /* check auth */
1.33 +11 -769 apache/src/mod_dir.c
Index: mod_dir.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_dir.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -C3 -r1.32 -r1.33
*** mod_dir.c 1997/07/08 06:32:34 1.32
--- mod_dir.c 1997/07/08 19:50:46 1.33
***************
*** 51,62 ****
*/
/*
! * http_dir.c: Handles the on-the-fly html index generation
! *
! * Rob McCool
! * 3/23/93
! *
! * Adapted to Apache by rst.
*/
#include "httpd.h"
--- 51,57 ----
*/
/*
! * mod_dir.c: handle default index files, and trailing-/ redirects
*/
#include "httpd.h"
***************
*** 74,287 ****
module dir_module;
- /****************************************************************
- *
- * Handling configuration directives...
- */
-
- #define FANCY_INDEXING 1 /* Indexing options */
- #define ICONS_ARE_LINKS 2
- #define SCAN_HTML_TITLES 4
- #define SUPPRESS_LAST_MOD 8
- #define SUPPRESS_SIZE 16
- #define SUPPRESS_DESC 32
-
- /*
- * These are the dimensions of the default icons supplied with Apache.
- */
- #define DEFAULT_ICON_WIDTH 20
- #define DEFAULT_ICON_HEIGHT 22
-
- struct item {
- char *type;
- char *apply_to;
- char *apply_path;
- char *data;
- };
-
typedef struct dir_config_struct {
-
- char *default_icon;
char *index_names;
- int icon_width;
- int icon_height;
-
- array_header *icon_list, *alt_list, *desc_list, *ign_list;
- array_header *hdr_list, *rdme_list, *opts_list;
-
} dir_config_rec;
- char c_by_encoding, c_by_type, c_by_path;
-
- #define BY_ENCODING &c_by_encoding
- #define BY_TYPE &c_by_type
- #define BY_PATH &c_by_path
-
- void push_item(array_header *arr, char *type, char *to, char *path, char *data)
- {
- struct item *p = (struct item *)push_array(arr);
-
- if (!to) to = "";
- if (!path) path = "";
-
- p->type = type;
- p->data = data ? pstrdup(arr->pool, data): NULL;
- p->apply_path = pstrcat(arr->pool, path, "*", NULL);
-
- if((type == BY_PATH) && (!is_matchexp(to)))
- p->apply_to = pstrcat (arr->pool, "*", to, NULL);
- else if (to)
- p->apply_to = pstrdup (arr->pool, to);
- else
- p->apply_to = NULL;
- }
-
- const char *add_alt(cmd_parms *cmd, void *d, char *alt, char *to)
- {
- if (cmd->info == BY_PATH)
- if(!strcmp(to,"**DIRECTORY**"))
- to = "^^DIRECTORY^^";
-
- push_item(((dir_config_rec *)d)->alt_list, cmd->info, to, cmd->path, alt);
- return NULL;
- }
-
- const char *add_icon(cmd_parms *cmd, void *d, char *icon, char *to)
- {
- char *iconbak = pstrdup (cmd->pool, icon);
-
- if(icon[0] == '(') {
- char *alt = getword_nc (cmd->pool, &iconbak, ',');
- iconbak[strlen(iconbak) - 1] = '\0'; /* Lose closing paren */
- add_alt(cmd, d, &alt[1], to);
- }
- if(cmd->info == BY_PATH)
- if(!strcmp(to,"**DIRECTORY**"))
- to = "^^DIRECTORY^^";
-
- push_item(((dir_config_rec *)d)->icon_list, cmd->info, to, cmd->path,
- iconbak);
- return NULL;
- }
-
- const char *add_desc(cmd_parms *cmd, void *d, char *desc, char *to)
- {
- push_item(((dir_config_rec *)d)->desc_list, cmd->info, to, cmd->path,desc);
- return NULL;
- }
-
- const char *add_ignore(cmd_parms *cmd, void *d, char *ext) {
- push_item(((dir_config_rec *)d)->ign_list, 0, ext, cmd->path, NULL);
- return NULL;
- }
-
- const char *add_header(cmd_parms *cmd, void *d, char *name) {
- if (strchr (name, '/')) {
- return "HeaderName cannot contain a /";
- }
- push_item(((dir_config_rec *)d)->hdr_list, 0, NULL, cmd->path, name);
- return NULL;
- }
-
- const char *add_readme(cmd_parms *cmd, void *d, char *name) {
- if (strchr (name, '/')) {
- return "ReadmeName cannot contain a /";
- }
- push_item(((dir_config_rec *)d)->rdme_list, 0, NULL, cmd->path, name);
- return NULL;
- }
-
-
- const char *add_opts_int(cmd_parms *cmd, void *d, int opts) {
- push_item(((dir_config_rec *)d)->opts_list, (char*)opts, NULL,
- cmd->path, NULL);
- return NULL;
- }
-
- const char *fancy_indexing (cmd_parms *cmd, void *d, int arg)
- {
- return add_opts_int (cmd, d, arg? FANCY_INDEXING : 0);
- }
-
- const char *add_opts(cmd_parms *cmd, void *d, const char *optstr) {
- char *w;
- int opts = 0;
- dir_config_rec *d_cfg = (dir_config_rec *) d;
-
- while(optstr[0]) {
- w = getword_conf(cmd->pool, &optstr);
- if(!strcasecmp(w,"FancyIndexing"))
- opts |= FANCY_INDEXING;
- else if(!strcasecmp(w,"IconsAreLinks"))
- opts |= ICONS_ARE_LINKS;
- else if(!strcasecmp(w,"ScanHTMLTitles"))
- opts |= SCAN_HTML_TITLES;
- else if(!strcasecmp(w,"SuppressLastModified"))
- opts |= SUPPRESS_LAST_MOD;
- else if(!strcasecmp(w,"SuppressSize"))
- opts |= SUPPRESS_SIZE;
- else if(!strcasecmp(w,"SuppressDescription"))
- opts |= SUPPRESS_DESC;
- else if(!strcasecmp(w,"None"))
- opts = 0;
- else if (! strncasecmp (w, "IconWidth", 9)) {
- if (strchr (w, '=') != NULL) {
- const char *x = pstrdup (cmd->pool, w);
- char *val;
- val = getword (cmd->pool, &x, '=');
- val = getword (cmd->pool, &x, '=');
- d_cfg->icon_width = atoi(val);
- }
- else {
- d_cfg->icon_width = DEFAULT_ICON_WIDTH;
- }
- }
- else if (! strncasecmp (w, "IconHeight", 10)) {
- if (strchr (w, '=') != NULL) {
- const char *x = pstrdup (cmd->pool, w);
- char *val;
- val = getword (cmd->pool, &x, '=');
- val = getword (cmd->pool, &x, '=');
- d_cfg->icon_height = atoi(val);
- }
- else {
- d_cfg->icon_height = DEFAULT_ICON_HEIGHT;
- }
- }
- else
- return "Invalid directory indexing option";
- }
- return add_opts_int(cmd, d, opts);
- }
-
#define DIR_CMD_PERMS OR_INDEXES
! command_rec dir_cmds[] = {
! { "AddIcon", add_icon, BY_PATH, DIR_CMD_PERMS, ITERATE2,
! "an icon URL followed by one or more filenames" },
! { "AddIconByType", add_icon, BY_TYPE, DIR_CMD_PERMS, ITERATE2,
! "an icon URL followed by one or more MIME types" },
! { "AddIconByEncoding", add_icon, BY_ENCODING, DIR_CMD_PERMS, ITERATE2,
! "an icon URL followed by one or more content encodings" },
! { "AddAlt", add_alt, BY_PATH, DIR_CMD_PERMS, ITERATE2,
! "alternate descriptive text followed by one or more filenames" },
! { "AddAltByType", add_alt, BY_TYPE, DIR_CMD_PERMS, ITERATE2,
! "alternate descriptive text followed by one or more MIME types" },
! { "AddAltByEncoding", add_alt, BY_ENCODING, DIR_CMD_PERMS, ITERATE2,
! "alternate descriptive text followed by one or more content encodings" },
! { "IndexOptions", add_opts, NULL, DIR_CMD_PERMS, RAW_ARGS,
! "one or more index options" },
! { "IndexIgnore", add_ignore, NULL, DIR_CMD_PERMS, ITERATE,
! "one or more file extensions" },
! { "AddDescription", add_desc, BY_PATH, DIR_CMD_PERMS, ITERATE2,
! "Descriptive text followed by one or more filenames" },
! { "HeaderName", add_header, NULL, DIR_CMD_PERMS, TAKE1, "a filename" },
! { "ReadmeName", add_readme, NULL, DIR_CMD_PERMS, TAKE1, "a filename" },
! { "FancyIndexing", fancy_indexing, NULL, DIR_CMD_PERMS, FLAG,
! "Limited to 'on' or 'off' (superseded by IndexOptions FancyIndexing)" },
! { "DefaultIcon", set_string_slot,
! (void*)XtOffsetOf(dir_config_rec, default_icon),
! DIR_CMD_PERMS, TAKE1, "an icon URL"},
{ "DirectoryIndex", set_string_slot,
(void*)XtOffsetOf(dir_config_rec, index_names),
DIR_CMD_PERMS, RAW_ARGS,
--- 69,81 ----
module dir_module;
typedef struct dir_config_struct {
char *index_names;
} dir_config_rec;
#define DIR_CMD_PERMS OR_INDEXES
! static command_rec dir_cmds[] = {
{ "DirectoryIndex", set_string_slot,
(void*)XtOffsetOf(dir_config_rec, index_names),
DIR_CMD_PERMS, RAW_ARGS,
***************
*** 289,865 ****
{ NULL }
};
! void *create_dir_config (pool *p, char *dummy)
{
dir_config_rec *new =
(dir_config_rec *) pcalloc (p, sizeof(dir_config_rec));
new->index_names = NULL;
- new->icon_width = 0;
- new->icon_height = 0;
- new->icon_list = make_array (p, 4, sizeof (struct item));
- new->alt_list = make_array (p, 4, sizeof (struct item));
- new->desc_list = make_array (p, 4, sizeof (struct item));
- new->ign_list = make_array (p, 4, sizeof (struct item));
- new->hdr_list = make_array (p, 4, sizeof (struct item));
- new->rdme_list = make_array (p, 4, sizeof (struct item));
- new->opts_list = make_array (p, 4, sizeof (struct item));
-
return (void *)new;
}
! void *merge_dir_configs (pool *p, void *basev, void *addv)
{
dir_config_rec *new=(dir_config_rec*)pcalloc (p, sizeof(dir_config_rec));
dir_config_rec *base = (dir_config_rec *)basev;
dir_config_rec *add = (dir_config_rec *)addv;
- new->default_icon = add->default_icon?add->default_icon:base->default_icon;
new->index_names = add->index_names? add->index_names: base->index_names;
- new->icon_height = add->icon_height ? add->icon_height : base->icon_height;
- new->icon_width = add->icon_width ? add->icon_width : base->icon_width;
-
- new->alt_list = append_arrays (p, add->alt_list, base->alt_list);
- new->ign_list = append_arrays (p, add->ign_list, base->ign_list);
- new->hdr_list = append_arrays (p, add->hdr_list, base->hdr_list);
- new->desc_list = append_arrays (p, add->desc_list, base->desc_list);
- new->icon_list = append_arrays (p, add->icon_list, base->icon_list);
- new->rdme_list = append_arrays (p, add->rdme_list, base->rdme_list);
- new->opts_list = append_arrays (p, add->opts_list, base->opts_list);
-
return new;
}
! /****************************************************************
! *
! * Looking things up in config entries...
! */
!
! /* Structure used to hold entries when we're actually building an index */
!
! struct ent {
! char *name;
! char *icon;
! char *alt;
! char *desc;
! size_t size;
! time_t lm;
! struct ent *next;
! };
!
! char *find_item(request_rec *r, array_header *list, int path_only) {
! char *content_type = r->content_type;
! char *content_encoding = r->content_encoding;
! char *path = r->filename;
!
! struct item *items = (struct item *)list->elts;
! int i;
!
! for (i = 0; i < list->nelts; ++i) {
! struct item *p = &items[i];
!
! /* Special cased for ^^DIRECTORY^^ and ^^BLANKICON^^ */
! if((path[0] == '^') || (!strcmp_match(path,p->apply_path))) {
! if(!*(p->apply_to))
! return p->data;
! else if(p->type == BY_PATH || path[0] == '^') {
! if(!strcmp_match(path,p->apply_to))
! return p->data;
! } else if(!path_only) {
! if(!content_encoding) {
! if(p->type == BY_TYPE) {
! if(content_type && !strcmp_match(content_type,p->apply_to))
! return p->data;
! }
! } else {
! if(p->type == BY_ENCODING) {
! if(!strcmp_match(content_encoding,p->apply_to))
! return p->data;
! }
! }
! }
! }
! }
! return NULL;
! }
!
! #define find_icon(d,p,t) find_item(p,d->icon_list,t)
! #define find_alt(d,p,t) find_item(p,d->alt_list,t)
! #define find_desc(d,p) find_item(p,d->desc_list,0)
! #define find_header(d,p) find_item(p,d->hdr_list,0)
! #define find_readme(d,p) find_item(p,d->rdme_list,0)
!
! char *find_default_icon (dir_config_rec *d, char *bogus_name)
! {
! request_rec r;
!
! /* Bleah. I tried to clean up find_item, and it lead to this bit
! * of ugliness. Note that the fields initialized are precisely
! * those that find_item looks at...
! */
!
! r.filename = bogus_name;
! r.content_type = r.content_encoding = NULL;
!
! return find_item (&r, d->icon_list, 1);
! }
!
! int ignore_entry(dir_config_rec *d, char *path) {
! array_header *list = d->ign_list;
! struct item *items = (struct item *)list->elts;
! char *tt;
! int i;
!
! if((tt=strrchr(path,'/')) == NULL)
! tt=path;
! else {
! tt++;
! }
!
! for (i = 0; i < list->nelts; ++i) {
! struct item *p = &items[i];
! char *ap;
!
! if((ap=strrchr(p->apply_to,'/')) == NULL)
! ap=p->apply_to;
! else
! ap++;
!
! if(!strcmp_match(path,p->apply_path) && !strcmp_match(tt,ap))
! return 1;
! }
! return 0;
! }
!
! int find_opts(dir_config_rec *d, request_rec *r) {
! char *path = r->filename;
! array_header *list = d->opts_list;
! struct item *items = (struct item *)list->elts;
! int i;
!
! for (i = 0; i < list->nelts; ++i) {
! struct item *p = &items[i];
!
! if(!strcmp_match(path,p->apply_path))
! return (int)p->type;
! }
! return 0;
! }
!
! /*****************************************************************
! *
! * Actually generating output
! */
!
!
! int insert_readme(char *name, char *readme_fname, int rule, request_rec *r) {
! char *fn;
! FILE *f;
! struct stat finfo;
! int plaintext=0;
! request_rec *rr;
!
! /* XXX: this is a load of crap, it needs to do a full sub_req_lookup_uri */
! fn = make_full_path(r->pool, name, readme_fname);
! fn = pstrcat(r->pool, fn, ".html", NULL);
! if(stat(fn,&finfo) == -1) {
! /* A brief fake multiviews search for README.html */
! fn[strlen(fn)-5] = '\0';
! if(stat(fn,&finfo) == -1)
! return 0;
! plaintext=1;
! if(rule) rputs("<HR>\n", r);
! rputs("<PRE>\n", r);
! }
! else if (rule) rputs("<HR>\n", r);
! /* XXX: when the above is rewritten properly, this necessary security
! * check will be redundant. -djg */
! rr = sub_req_lookup_file (fn, r);
! if (rr->status != HTTP_OK) {
! destroy_sub_req (rr);
! return 0;
! }
! destroy_sub_req (rr);
! if(!(f = pfopen(r->pool,fn,"r")))
! return 0;
! if (!plaintext)
! send_fd(f, r);
! else
! {
! char buf[IOBUFSIZE+1];
! int i, n, c, ch;
! while (!feof(f))
! {
! do n = fread(buf, sizeof(char), IOBUFSIZE, f);
! while (n == -1 && ferror(f) && errno == EINTR);
! if (n == -1 || n == 0) break;
! buf[n] = '\0';
! c = 0;
! while (c < n)
! {
! for (i=c; i < n; i++)
! if (buf[i] == '<' || buf[i] == '>' || buf[i] == '&') break;
! ch = buf[i];
! buf[i] = '\0';
! rputs(&buf[c], r);
! if (ch == '<') rputs("<", r);
! else if (ch == '>') rputs(">", r);
! else if (ch == '&') rputs("&", r);
! c = i + 1;
! }
! }
! }
! pfclose(r->pool, f);
! if(plaintext)
! rputs("</PRE>\n", r);
! return 1;
! }
!
!
! char *find_title(request_rec *r) {
! char titlebuf[MAX_STRING_LEN], *find = "<TITLE>";
! FILE *thefile = NULL;
! int x,y,n,p;
!
! if (r->status != HTTP_OK) {
! return NULL;
! }
! if (r->content_type && !strcmp(r->content_type,"text/html") && !r->content_encoding) {
! if(!(thefile = pfopen(r->pool, r->filename,"r")))
! return NULL;
! n = fread(titlebuf,sizeof(char),MAX_STRING_LEN - 1,thefile);
! titlebuf[n] = '\0';
! for(x=0,p=0;titlebuf[x];x++) {
! if(toupper(titlebuf[x]) == find[p]) {
! if(!find[++p]) {
! if((p = ind(&titlebuf[++x],'<')) != -1)
! titlebuf[x+p] = '\0';
! /* Scan for line breaks for Tanmoy's secretary */
! for(y=x;titlebuf[y];y++)
! if((titlebuf[y] == CR) || (titlebuf[y] == LF))
! titlebuf[y] = ' ';
! pfclose (r->pool, thefile);
! return pstrdup(r->pool, &titlebuf[x]);
! }
! } else p=0;
! }
! pfclose(r->pool, thefile);
! }
! return NULL;
! }
!
! struct ent *make_dir_entry(char *name, int dir_opts,
! dir_config_rec *d, request_rec *r)
! {
! struct ent *p;
!
! if((name[0] == '.') && (!name[1]))
! return(NULL);
!
! if (ignore_entry(d, make_full_path (r->pool, r->filename, name)))
! return(NULL);
!
! p=(struct ent *)pcalloc(r->pool, sizeof(struct ent));
! p->name = pstrdup (r->pool, name);
! p->size = 0;
! p->icon = NULL;
! p->alt = NULL;
! p->desc = NULL;
! p->lm = -1;
!
! if(dir_opts & FANCY_INDEXING) {
! request_rec *rr = sub_req_lookup_file (name, r);
!
! if (rr->finfo.st_mode != 0) {
! p->lm = rr->finfo.st_mtime;
! if(S_ISDIR(rr->finfo.st_mode)) {
! if(!(p->icon = find_icon(d,rr,1)))
! p->icon = find_default_icon(d,"^^DIRECTORY^^");
! if(!(p->alt = find_alt(d,rr,1)))
! p->alt = "DIR";
! p->size = 0;
! p->name = pstrcat (r->pool, name, "/", NULL);
! }
! else {
! p->icon = find_icon(d, rr, 0);
! p->alt = find_alt(d, rr, 0);
! p->size = rr->finfo.st_size;
! }
! }
!
! p->desc = find_desc(d, rr);
!
! if((!p->desc) && (dir_opts & SCAN_HTML_TITLES))
! p->desc = pstrdup (r->pool, find_title(rr));
!
! destroy_sub_req (rr);
! }
! return(p);
! }
!
! char *terminate_description(dir_config_rec *d, char *desc, int dir_opts) {
! int maxsize = 23;
! register int x;
!
! if(dir_opts & SUPPRESS_LAST_MOD) maxsize += 17;
! if(dir_opts & SUPPRESS_SIZE) maxsize += 7;
!
! for(x=0;desc[x] && maxsize;x++) {
! if(desc[x] == '<') {
! while(desc[x] != '>') {
! if(!desc[x]) {
! maxsize = 0;
! break;
! }
! ++x;
! }
! }
! else --maxsize;
! }
! if(!maxsize) {
! desc[x-1] = '>'; /* Grump. */
! desc[x] = '\0'; /* Double Grump! */
! }
! return desc;
! }
!
! void output_directories(struct ent **ar, int n,
! dir_config_rec *d, request_rec *r, int dir_opts)
! {
! int x, len;
! char *name = r->uri;
! char *tp;
! pool *scratch = make_sub_pool (r->pool);
!
! if(name[0] == '\0') name = "/";
!
! if(dir_opts & FANCY_INDEXING) {
! rputs("<PRE>", r);
! if((tp = find_default_icon(d,"^^BLANKICON^^"))) {
! rvputs(r, "<IMG SRC=\"", escape_html(scratch, tp),
! "\" ALT=\" \"", NULL);
! if (d->icon_width && d->icon_height) {
! rprintf
! (
! r,
! " HEIGHT=\"%d\" WIDTH=\"%d\"",
! d->icon_height,
! d->icon_width
! );
! }
! rputs ("> ", r);
! }
! rputs("Name ", r);
! if(!(dir_opts & SUPPRESS_LAST_MOD))
! rputs("Last modified ", r);
! if(!(dir_opts & SUPPRESS_SIZE))
! rputs("Size ", r);
! if(!(dir_opts & SUPPRESS_DESC))
! rputs("Description", r);
! rputs("\n<HR>\n", r);
! }
! else {
! rputs("<UL>", r);
! }
!
! for(x=0;x<n;x++) {
! char *anchor = NULL, *t = NULL, *t2 = NULL;
!
! clear_pool (scratch);
!
! if((!strcmp(ar[x]->name,"../")) || (!strcmp(ar[x]->name,".."))) {
! char *t = make_full_path (scratch, name, "../");
! getparents(t);
! if(t[0] == '\0') t = "/";
! anchor = pstrcat (scratch, "<A HREF=\"",
! escape_html(scratch, os_escape_path(scratch, t, 0)),
! "\">", NULL);
! t2 = "Parent Directory</A> ";
! }
! else {
! t = ar[x]->name;
! len = strlen(t);
! if(len > 23) {
! t2 = pstrdup(scratch, t);
! t2[21] = '.';
! t2[22] = '.';
! t2[23] = '\0';
! t2 = escape_html(scratch, t2);
! t2 = pstrcat(scratch, t2, "</A>", NULL);
! } else
! {
! char buff[24]=" ";
! t2 = escape_html(scratch, t);
! buff[23-len] = '\0';
! t2 = pstrcat(scratch, t2, "</A>", buff, NULL);
! }
! anchor = pstrcat (scratch, "<A HREF=\"",
! escape_html(scratch, os_escape_path(scratch, t, 0)),
! "\">", NULL);
! }
!
! if(dir_opts & FANCY_INDEXING) {
! if(dir_opts & ICONS_ARE_LINKS)
! rputs(anchor, r);
! if((ar[x]->icon) || d->default_icon) {
! rvputs(r, "<IMG SRC=\"",
! escape_html(scratch, ar[x]->icon ?
! ar[x]->icon : d->default_icon),
! "\" ALT=\"[", (ar[x]->alt ? ar[x]->alt : " "),
! "]\"", NULL);
! if (d->icon_width && d->icon_height) {
! rprintf
! (
! r,
! " HEIGHT=\"%d\" WIDTH=\"%d\"",
! d->icon_height,
! d->icon_width
! );
! }
! rputs (">", r);
! }
! if(dir_opts & ICONS_ARE_LINKS)
! rputs("</A>", r);
!
! rvputs(r," ", anchor, t2, NULL);
! if(!(dir_opts & SUPPRESS_LAST_MOD)) {
! if(ar[x]->lm != -1) {
! char time[MAX_STRING_LEN];
! struct tm *ts = localtime(&ar[x]->lm);
! strftime(time,MAX_STRING_LEN,"%d-%b-%y %H:%M ",ts);
! rputs(time, r);
! }
! else {
! rputs(" ", r);
! }
! }
! if(!(dir_opts & SUPPRESS_SIZE)) {
! send_size(ar[x]->size,r);
! rputs(" ", r);
! }
! if(!(dir_opts & SUPPRESS_DESC)) {
! if(ar[x]->desc) {
! rputs(terminate_description(d, ar[x]->desc, dir_opts), r);
! }
! }
! }
! else
! rvputs(r, "<LI> ", anchor," ", t2, NULL);
! rputc('\n', r);
! }
! if(dir_opts & FANCY_INDEXING) {
! rputs("</PRE>", r);
! }
! else {
! rputs("</UL>", r);
! }
! }
!
!
! int dsortf(struct ent **s1,struct ent **s2)
! {
! return(strcmp((*s1)->name,(*s2)->name));
! }
!
!
! int index_directory(request_rec *r, dir_config_rec *dir_conf)
! {
! char *title_name = escape_html(r->pool, r->uri);
! char *title_endp;
! char *name = r->filename;
!
! DIR *d;
! struct DIR_TYPE *dstruct;
! int num_ent=0,x;
! struct ent *head,*p;
! struct ent **ar = NULL;
! char *tmp;
! int dir_opts = find_opts(dir_conf, r);
!
! if(!(d=popendir(r->pool, name))) {
! log_reason ("Can't open directory for index", r->filename, r);
! return HTTP_FORBIDDEN;
! }
!
! r->content_type = "text/html";
!
! send_http_header(r);
!
! if (r->header_only) {
! pclosedir (r->pool, d);
! return 0;
! }
! hard_timeout("send directory", r);
!
! /* Spew HTML preamble */
!
! title_endp = title_name + strlen(title_name) - 1;
!
! while (title_endp > title_name && *title_endp == '/')
! *title_endp-- = '\0';
!
! rvputs
! (
! r,
! "<HTML><HEAD>\n<TITLE>Index of ",
! title_name,
! "</TITLE>\n</HEAD><BODY>\n",
! NULL
! );
!
! if((!(tmp = find_header(dir_conf,r))) || (!(insert_readme(name,tmp,0,r))))
! rvputs(r, "<H1>Index of ", title_name, "</H1>\n", NULL);
!
! /*
! * Since we don't know how many dir. entries there are, put them into a
! * linked list and then arrayificate them so qsort can use them.
! */
! head=NULL;
! while((dstruct=readdir(d))) {
! if((p = make_dir_entry(dstruct->d_name, dir_opts, dir_conf, r))) {
! p->next=head;
! head=p;
! num_ent++;
! }
! }
! if (num_ent > 0) {
! ar=(struct ent **) palloc(r->pool, num_ent*sizeof(struct ent *));
! p=head;
! x=0;
! while(p) {
! ar[x++]=p;
! p = p->next;
! }
!
! qsort((void *)ar,num_ent,sizeof(struct ent *),
! #ifdef ULTRIX_BRAIN_DEATH
! (int (*))dsortf);
! #else
! (int (*)(const void *,const void *))dsortf);
! #endif
! }
! output_directories(ar, num_ent, dir_conf, r, dir_opts);
! pclosedir(r->pool, d);
!
! if (dir_opts & FANCY_INDEXING)
! if((tmp = find_readme(dir_conf, r)))
! insert_readme(name,tmp,1,r);
! else {
! rputs("</UL>", r);
! }
!
! rputs ("</BODY></HTML>\n", r);
!
! kill_timeout(r);
! return 0;
! }
!
! /* The formal handler... */
!
! int handle_dir (request_rec *r)
{
dir_config_rec *d =
! (dir_config_rec *)get_module_config (r->per_dir_config, &dir_module);
const char *names_ptr = d->index_names ? d->index_names : DEFAULT_INDEX;
int allow_opts = allow_options (r);
int error_notfound = 0;
--- 83,112 ----
{ NULL }
};
! static void *create_dir_config (pool *p, char *dummy)
{
dir_config_rec *new =
(dir_config_rec *) pcalloc (p, sizeof(dir_config_rec));
new->index_names = NULL;
return (void *)new;
}
! static void *merge_dir_configs (pool *p, void *basev, void *addv)
{
dir_config_rec *new=(dir_config_rec*)pcalloc (p, sizeof(dir_config_rec));
dir_config_rec *base = (dir_config_rec *)basev;
dir_config_rec *add = (dir_config_rec *)addv;
new->index_names = add->index_names? add->index_names: base->index_names;
return new;
}
! static int handle_dir (request_rec *r)
{
dir_config_rec *d =
! (dir_config_rec *)get_module_config (r->per_dir_config,
! &dir_module);
const char *names_ptr = d->index_names ? d->index_names : DEFAULT_INDEX;
int allow_opts = allow_options (r);
int error_notfound = 0;
***************
*** 917,923 ****
destroy_sub_req(rr);
return error_notfound;
}
!
/* If the request returned something other than 404 (or 200),
* it means the module encountered some sort of problem. To be
* secure, we should return the error, rather than create
--- 164,170 ----
destroy_sub_req(rr);
return error_notfound;
}
!
/* If the request returned something other than 404 (or 200),
* it means the module encountered some sort of problem. To be
* secure, we should return the error, rather than create
***************
*** 938,955 ****
if (r->method_number != M_GET) return NOT_IMPLEMENTED;
! /* OK, nothing easy. Trot out the heavy artillery... */
! if (allow_opts & OPT_INDEXES)
! return index_directory (r, d);
! else {
! log_reason ("Directory index forbidden by rule", r->filename, r);
! return HTTP_FORBIDDEN;
! }
}
! handler_rec dir_handlers[] = {
{ DIR_MAGIC_TYPE, handle_dir },
{ NULL }
};
--- 185,197 ----
if (r->method_number != M_GET) return NOT_IMPLEMENTED;
! /* nothing for us to do, pass on through */
! return DECLINED;
}
! static handler_rec dir_handlers[] = {
{ DIR_MAGIC_TYPE, handle_dir },
{ NULL }
};