mod_mime_magic.html revision f9b3be308809978f797e0c57b296147532a4313c
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk<HTML>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <HEAD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TITLE>Apache module mod_mime_magic</TITLE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </HEAD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <!-- Background white, links blue (unvisited), navy (visited), red (active) -->
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <BODY
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk BGCOLOR="#FFFFFF"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk TEXT="#000000"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk LINK="#0000FF"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk VLINK="#000080"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk ALINK="#FF0000"
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk >
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <DIV ALIGN="CENTER">
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <IMG SRC="/images/sub.gif" ALT="[APACHE DOCUMENTATION]">
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </DIV>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <h1 align="CENTER">Module mod_mime_magic</H1>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk This module is contained in the mod_mime_magic.c file, and is
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk an optional extension to the Apache HTTPD server.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk It can be used to determine the MIME type of a file by looking at a
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk few bytes of its contents, the same way the Unix file(1) command works.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk To use mod_mime_magic you have to enable the following line in the
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk server build <TT>Configuration</TT> file:
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk AddModule modules/standard/mod_mime_magic.o
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk This should be listed <EM>before</EM> mod_mime in the build
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TT>Configuration</TT> file so that it will be used after mod_mime.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk mod_mime_magic is intended as a "second line of defense" for cases
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk mod_mime cannot resolve.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <h2>Summary</h2>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk This module is derived from a free version of the <CODE>file(1)</CODE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk command for Unix,
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk which uses "magic numbers" and other hints from a file's contents to
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk figure out what the contents are.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk In the case of this module,
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk it tries to figure out the MIME type of the file.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk This module active only if the magic file is specified by the
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <A HREF="#mimemagicfile"><CODE>MimeMagicFile</CODE></A> directive.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk The contents of the file are plain ASCII text in 4-5 columns.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk Blank lines are allowed but ignored.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk Commented lines use a hash mark "#".
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk The remaining lines are parsed for the following columns:
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <table border=1>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <tr valign=top>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TH>Column</TH>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TH>Description</TH>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <tr valign=top>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>1</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>byte number to begin checking from
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <BR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk "&gt;" indicates a dependency upon the previous non-"&gt;" line</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TR><tr valign=top>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>2</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>type of data to match
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <table border=1>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>byte</TD><TD>single character</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>short</TD><TD>machine-order 16-bit integer</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>long</TD><TD>machine-order 32-bit integer</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>string</TD><TD>arbitrary-length string</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>date</TD><TD>long integer date
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk (seconds since Unix epoch/1970)</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>beshort</TD><TD>big-endian 16-bit integer</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>belong</TD><TD>big-endian 32-bit integer</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>bedate</TD><TD>big-endian 32-bit integer date</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>leshort</TD><TD>little-endian 16-bit integer</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>lelong</TD><TD>little-endian 32-bit integer</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TR><TD>ledate</TD><TD>little-endian 32-bit integer date</TD></TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TABLE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TR><tr valign=top>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>3</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>contents of data to match</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TR><tr valign=top>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>4</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>MIME type if matched</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TR><tr valign=top>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>5</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <TD>MIME encoding if matched (optional)</TD>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </TABLE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk For example, the following magic file lines
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk would recognize some audio formats.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk<PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk# Sun/NeXT audio data
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string .snd
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 1 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 2 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 3 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 4 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 5 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 6 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 7 audio/basic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk&gt;12 belong 23 audio/x-adpcm
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk</PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk Or these would recognize the difference between "*.doc" files containing
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk Microsoft Word or FrameMaker documents. (These are incompatible file
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk formats which use the same file suffix.)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk<PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk# Frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;MakerFile application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;MIFFile application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;MakerDictionary application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;MakerScreenFon application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;MML application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;Book application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \&lt;Maker application/x-frame
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk# MS-Word
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \376\067\0\043 application/msword
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \320\317\021\340\241\261 application/msword
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \333\245-\0\0\0 application/msword
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk</PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk An optional MIME encoding can be included as a fifth column.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk For example, this can recognize gzipped files and set the encoding
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk for them.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk<PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk# gzip (GNU zip, not to be confused with [Info-ZIP/PKWARE] zip archiver)
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk0 string \037\213 application/octet-stream x-gzip
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk</PRE>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <h3>Performance Issues</h3>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk This module is not for every system. If your system is barely keeping
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk up with its load or if you're performing a web server benchmark,
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk you may not want to enable this because the processing is not free.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk However, an effort was made to improve the performance of the original
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk file(1) code to make it fit in a busy web server.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk It was designed for a server where there are thousands of users who
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk publish their own documents.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk This is probably very common on intranets.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk Many times, it's helpful
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk if the server can make more intelligent decisions about a file's
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk contents than the file name allows
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk ...even if just to reduce the "why doesn't my page work" calls
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk when users improperly name their own files.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk You have to decide if the extra work suits your environment.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk When compiling an Apache server, this module should be at or near the
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk top of the list of modules in the Configuration file. The modules are
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk listed in increasing priority so that will mean this one is used only
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk as a last resort, just like it was designed to.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <h2>Directives</h2>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <UL>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <LI><A HREF="#mimemagicfile">MimeMagicFile</A>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </LI>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </UL>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <HR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <H2><A NAME="mimemagicfile">
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk MimeMagicFile
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk </A></H2>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <STRONG>Syntax:</STRONG> MimeMagicFile <EM>magic-file-name</EM>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <BR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <STRONG>Default:</STRONG> none
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <BR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <STRONG>Context:</STRONG> server config, virtual host
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <BR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <STRONG>Status:</STRONG> Extension
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <BR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <STRONG>Module:</STRONG> mod_mime_magic
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk The <CODE>MimeMagicFile</CODE> directive can be used to enable this module,
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk the default file is distributed at <CODE>conf/magic</CODE>.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk Non-rooted paths are relative to the ServerRoot. Virtual hosts
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk will use the same file as the main server unless a more specific setting
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk is used, in which case the more specific setting overrides the main server's
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk file.
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <P>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <HR>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk <h2><A name="notes">Notes</A></h2>
4b8d88eb610aa1e0bb6ec632f792744b3d6b5f22jeff.schenk
The following notes apply to the mod_mime_magic module and are
included here for compliance with contributors' copyright restrictions
that require their acknowledgment.
<PRE>
/*
* mod_mime_magic: MIME type lookup via file magic numbers
* Copyright (c) 1996-1997 Cisco Systems, Inc.
*
* This software was submitted by Cisco Systems to the Apache Group in July
* 1997. Future revisions and derivatives of this source code must
* acknowledge Cisco Systems as the original contributor of this module.
* All other licensing and usage conditions are those of the Apache Group.
*
* Some of this code is derived from the free version of the file command
* originally posted to comp.sources.unix. Copyright info for that program
* is included below as required.
* ---------------------------------------------------------------------------
* - Copyright (c) Ian F. Darwin, 1987. Written by Ian F. Darwin.
*
* This software is not subject to any license of the American Telephone and
* Telegraph Company or of the Regents of the University of California.
*
* Permission is granted to anyone to use this software for any purpose on any
* computer system, and to alter it and redistribute it freely, subject to
* the following restrictions:
*
* 1. The author is not responsible for the consequences of use of this
* software, no matter how awful, even if they arise from flaws in it.
*
* 2. The origin of this software must not be misrepresented, either by
* explicit claim or by omission. Since few users ever read sources, credits
* must appear in the documentation.
*
* 3. Altered versions must be plainly marked as such, and must not be
* misrepresented as being the original software. Since few users ever read
* sources, credits must appear in the documentation.
*
* 4. This notice may not be removed or altered.
* -------------------------------------------------------------------------
*
* For compliance with Mr Darwin's terms: this has been very significantly
* modified from the free "file" command.
* - all-in-one file for compilation convenience when moving from one
* version of Apache to the next.
* - Memory allocation is done through the Apache API's pool structure.
* - All functions have had necessary Apache API request or server
* structures passed to them where necessary to call other Apache API
* routines. (i.e. usually for logging, files, or memory allocation in
* itself or a called function.)
* - struct magic has been converted from an array to a single-ended linked
* list because it only grows one record at a time, it's only accessed
* sequentially, and the Apache API has no equivalent of realloc().
* - Functions have been changed to get their parameters from the server
* configuration instead of globals. (It should be reentrant now but has
* not been tested in a threaded environment.)
* - Places where it used to print results to stdout now saves them in a
* list where they're used to set the MIME type in the Apache request
* record.
* - Command-line flags have been removed since they will never be used here.
*
*/
</PRE>
</BODY>
</HTML>