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 } };