Initial revision
authorjbj <devnull@localhost>
Mon, 30 Sep 2002 21:45:34 +0000 (21:45 +0000)
committerjbj <devnull@localhost>
Mon, 30 Sep 2002 21:45:34 +0000 (21:45 +0000)
CVS patchset: 5732
CVS date: 2002/09/30 21:45:34

193 files changed:
file/.cvsignore [new file with mode: 0644]
file/Header [new file with mode: 0644]
file/LEGAL.NOTICE [new file with mode: 0644]
file/Localstuff [new file with mode: 0644]
file/MAINT [new file with mode: 0644]
file/Magdir/acorn [new file with mode: 0644]
file/Magdir/adi [new file with mode: 0644]
file/Magdir/adventure [new file with mode: 0644]
file/Magdir/allegro [new file with mode: 0644]
file/Magdir/alliant [new file with mode: 0644]
file/Magdir/alpha [new file with mode: 0644]
file/Magdir/amanda [new file with mode: 0644]
file/Magdir/amigaos [new file with mode: 0644]
file/Magdir/animation [new file with mode: 0644]
file/Magdir/apl [new file with mode: 0644]
file/Magdir/apple [new file with mode: 0644]
file/Magdir/applix [new file with mode: 0644]
file/Magdir/archive [new file with mode: 0644]
file/Magdir/asterix [new file with mode: 0644]
file/Magdir/att3b [new file with mode: 0644]
file/Magdir/audio [new file with mode: 0644]
file/Magdir/blender [new file with mode: 0644]
file/Magdir/blit [new file with mode: 0644]
file/Magdir/bsdi [new file with mode: 0644]
file/Magdir/c-lang [new file with mode: 0644]
file/Magdir/cddb [new file with mode: 0644]
file/Magdir/chi [new file with mode: 0644]
file/Magdir/cisco [new file with mode: 0644]
file/Magdir/citrus [new file with mode: 0644]
file/Magdir/claris [new file with mode: 0644]
file/Magdir/clipper [new file with mode: 0644]
file/Magdir/commands [new file with mode: 0644]
file/Magdir/compress [new file with mode: 0644]
file/Magdir/console [new file with mode: 0644]
file/Magdir/convex [new file with mode: 0644]
file/Magdir/ctags [new file with mode: 0644]
file/Magdir/cvs [new file with mode: 0644]
file/Magdir/database [new file with mode: 0644]
file/Magdir/diamond [new file with mode: 0644]
file/Magdir/diff [new file with mode: 0644]
file/Magdir/digital [new file with mode: 0644]
file/Magdir/dolby [new file with mode: 0644]
file/Magdir/dump [new file with mode: 0644]
file/Magdir/dyadic [new file with mode: 0644]
file/Magdir/editors [new file with mode: 0644]
file/Magdir/elf [new file with mode: 0644]
file/Magdir/encore [new file with mode: 0644]
file/Magdir/epoc [new file with mode: 0644]
file/Magdir/filesystems [new file with mode: 0644]
file/Magdir/flash [new file with mode: 0644]
file/Magdir/fonts [new file with mode: 0644]
file/Magdir/frame [new file with mode: 0644]
file/Magdir/freebsd [new file with mode: 0644]
file/Magdir/fsav [new file with mode: 0644]
file/Magdir/gimp [new file with mode: 0644]
file/Magdir/gnu [new file with mode: 0644]
file/Magdir/grace [new file with mode: 0644]
file/Magdir/gringotts [new file with mode: 0644]
file/Magdir/hitachi-sh [new file with mode: 0644]
file/Magdir/hp [new file with mode: 0644]
file/Magdir/human68k [new file with mode: 0644]
file/Magdir/ibm370 [new file with mode: 0644]
file/Magdir/ibm6000 [new file with mode: 0644]
file/Magdir/iff [new file with mode: 0644]
file/Magdir/images [new file with mode: 0644]
file/Magdir/impulse [new file with mode: 0644]
file/Magdir/intel [new file with mode: 0644]
file/Magdir/interleaf [new file with mode: 0644]
file/Magdir/island [new file with mode: 0644]
file/Magdir/ispell [new file with mode: 0644]
file/Magdir/java [new file with mode: 0644]
file/Magdir/jpeg [new file with mode: 0644]
file/Magdir/karma [new file with mode: 0644]
file/Magdir/lecter [new file with mode: 0644]
file/Magdir/lex [new file with mode: 0644]
file/Magdir/lif [new file with mode: 0644]
file/Magdir/linux [new file with mode: 0644]
file/Magdir/lisp [new file with mode: 0644]
file/Magdir/mach [new file with mode: 0644]
file/Magdir/macintosh [new file with mode: 0644]
file/Magdir/magic [new file with mode: 0644]
file/Magdir/mail.news [new file with mode: 0644]
file/Magdir/maple [new file with mode: 0644]
file/Magdir/mathematica [new file with mode: 0644]
file/Magdir/mcrypt [new file with mode: 0644]
file/Magdir/mime [new file with mode: 0644]
file/Magdir/mips [new file with mode: 0644]
file/Magdir/mirage [new file with mode: 0644]
file/Magdir/mkid [new file with mode: 0644]
file/Magdir/mlssa [new file with mode: 0644]
file/Magdir/mmdf [new file with mode: 0644]
file/Magdir/modem [new file with mode: 0644]
file/Magdir/motorola [new file with mode: 0644]
file/Magdir/msdos [new file with mode: 0644]
file/Magdir/msvc [new file with mode: 0644]
file/Magdir/natinst [new file with mode: 0644]
file/Magdir/ncr [new file with mode: 0644]
file/Magdir/netbsd [new file with mode: 0644]
file/Magdir/netscape [new file with mode: 0644]
file/Magdir/news [new file with mode: 0644]
file/Magdir/nitpicker [new file with mode: 0644]
file/Magdir/octave [new file with mode: 0644]
file/Magdir/olf [new file with mode: 0644]
file/Magdir/os2 [new file with mode: 0644]
file/Magdir/os9 [new file with mode: 0644]
file/Magdir/osf1 [new file with mode: 0644]
file/Magdir/palm [new file with mode: 0644]
file/Magdir/parix [new file with mode: 0644]
file/Magdir/pbm [new file with mode: 0644]
file/Magdir/pdf [new file with mode: 0644]
file/Magdir/pdp [new file with mode: 0644]
file/Magdir/perl [new file with mode: 0644]
file/Magdir/pgp [new file with mode: 0644]
file/Magdir/pkgadd [new file with mode: 0644]
file/Magdir/plus5 [new file with mode: 0644]
file/Magdir/printer [new file with mode: 0644]
file/Magdir/project [new file with mode: 0644]
file/Magdir/psdbms [new file with mode: 0644]
file/Magdir/pulsar [new file with mode: 0644]
file/Magdir/pyramid [new file with mode: 0644]
file/Magdir/python [new file with mode: 0644]
file/Magdir/riff [new file with mode: 0644]
file/Magdir/rpm [new file with mode: 0644]
file/Magdir/rtf [new file with mode: 0644]
file/Magdir/sc [new file with mode: 0644]
file/Magdir/sccs [new file with mode: 0644]
file/Magdir/sendmail [new file with mode: 0644]
file/Magdir/sequent [new file with mode: 0644]
file/Magdir/sgml [new file with mode: 0644]
file/Magdir/sharc [new file with mode: 0644]
file/Magdir/sketch [new file with mode: 0644]
file/Magdir/smalltalk [new file with mode: 0644]
file/Magdir/sniffer [new file with mode: 0644]
file/Magdir/softquad [new file with mode: 0644]
file/Magdir/spectrum [new file with mode: 0644]
file/Magdir/sun [new file with mode: 0644]
file/Magdir/sysex [new file with mode: 0644]
file/Magdir/teapot [new file with mode: 0644]
file/Magdir/terminfo [new file with mode: 0644]
file/Magdir/tex [new file with mode: 0644]
file/Magdir/tgif [new file with mode: 0644]
file/Magdir/ti-8x [new file with mode: 0644]
file/Magdir/timezone [new file with mode: 0644]
file/Magdir/troff [new file with mode: 0644]
file/Magdir/tuxedo [new file with mode: 0644]
file/Magdir/typeset [new file with mode: 0644]
file/Magdir/unknown [new file with mode: 0644]
file/Magdir/uuencode [new file with mode: 0644]
file/Magdir/varied.out [new file with mode: 0644]
file/Magdir/vax [new file with mode: 0644]
file/Magdir/vicar [new file with mode: 0644]
file/Magdir/visx [new file with mode: 0644]
file/Magdir/vms [new file with mode: 0644]
file/Magdir/vmware [new file with mode: 0644]
file/Magdir/vorbis [new file with mode: 0644]
file/Magdir/vxl [new file with mode: 0644]
file/Magdir/wordperfect [new file with mode: 0644]
file/Magdir/xdelta [new file with mode: 0644]
file/Magdir/xenix [new file with mode: 0644]
file/Magdir/zilog [new file with mode: 0644]
file/Magdir/zyxel [new file with mode: 0644]
file/Makefile.am [new file with mode: 0644]
file/Makefile.in [new file with mode: 0644]
file/Makefile.std [new file with mode: 0644]
file/README [new file with mode: 0644]
file/acconfig.h [new file with mode: 0644]
file/acinclude.m4 [new file with mode: 0644]
file/aclocal.m4 [new file with mode: 0644]
file/apprentice.c [new file with mode: 0644]
file/ascmagic.c [new file with mode: 0644]
file/compress.c [new file with mode: 0644]
file/config.h.in [new file with mode: 0644]
file/configure [new file with mode: 0755]
file/configure.in [new file with mode: 0644]
file/file.c [new file with mode: 0644]
file/file.h [new file with mode: 0644]
file/file.man [new file with mode: 0644]
file/fsmagic.c [new file with mode: 0644]
file/install-sh [new file with mode: 0755]
file/is_tar.c [new file with mode: 0644]
file/magic.man [new file with mode: 0644]
file/magic.mime [new file with mode: 0644]
file/magic2mime [new file with mode: 0755]
file/missing [new file with mode: 0755]
file/mkinstalldirs [new file with mode: 0644]
file/names.h [new file with mode: 0644]
file/patchlevel.h [new file with mode: 0644]
file/print.c [new file with mode: 0644]
file/readelf.c [new file with mode: 0644]
file/readelf.h [new file with mode: 0644]
file/softmagic.c [new file with mode: 0644]
file/stamp-h.in [new file with mode: 0644]
file/tar.h [new file with mode: 0644]

diff --git a/file/.cvsignore b/file/.cvsignore
new file mode 100644 (file)
index 0000000..f1a127a
--- /dev/null
@@ -0,0 +1,12 @@
+Makefile
+config.cache
+config.h
+config.log
+config.status
+stamp-h
+file
+file.1
+magic.4
+magic
+magic.mgc
+magic.mime.mgc
diff --git a/file/Header b/file/Header
new file mode 100644 (file)
index 0000000..3ca9b0e
--- /dev/null
@@ -0,0 +1,5 @@
+# Magic
+# Magic data for file(1) command.
+# Machine-generated from src/cmd/file/magdir/*; edit there only!
+# Format is described in magic(files), where:
+# files is 5 on V7 and BSD, 4 on SV, and ?? in the SVID.
diff --git a/file/LEGAL.NOTICE b/file/LEGAL.NOTICE
new file mode 100644 (file)
index 0000000..430d4b9
--- /dev/null
@@ -0,0 +1,34 @@
+Id: LEGAL.NOTICE,v 1.11 1999/01/14 16:30:12 christos Exp 
+Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992, 1994, 1995.
+Software written by Ian F. Darwin and others;
+maintained 1994-1999 Christos Zoulas.
+
+This software is not subject to any export provision of the United States
+Department of Commerce, and may be exported to any country or planet.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice immediately at the beginning of the file, without modification,
+   this list of conditions, and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+   This product includes software developed by Ian F. Darwin and others.
+4. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/file/Localstuff b/file/Localstuff
new file mode 100644 (file)
index 0000000..bd008c1
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# Localstuff:  file(1) magic for locally observed files
+#
+# Id: Localstuff,v 1.3 1995/01/21 21:09:00 christos Exp 
+# Add any locally observed files here.  Remember:
+# text if readable, executable if runnable binary, data if unreadable.
diff --git a/file/MAINT b/file/MAINT
new file mode 100644 (file)
index 0000000..25a01e1
--- /dev/null
@@ -0,0 +1,33 @@
+Id: MAINT,v 1.4 2000/04/11 02:43:51 christos Exp 
+
+Maintenance notes:
+
+I am continuing to maintain the file command. I welcome your help,
+but to make my life easier I'd like to request the following:
+
+- Don't change the version numbers!
+
+If your changes are extensive, I will have to work hard to 
+integrate them into my version.  If you check it into SCCS locally,
+the version numbers will likely be kept. IF you check it into RCS
+or CVS locally, please use -k to keep the version numbers, and
+please use branch deltas (1.21.1, 1.21.2, ...).  If you don't do
+this, I will likely be unable to use your changes; life's just too
+short.
+
+- Do not distribute changed versions.
+
+People trying to be helpful occasionally put up their hacked versions
+of the file command for FTP, then the "archie" server finds and publishes
+the hacked version, and people all over the world get copies of it.
+Within a day or two I am getting email from around the world
+asking me why "my" file command won't compile!!! Needless to say this
+detracts from the limited time I have available to work on the actual
+software.  Therefore I ask you again to please NOT distribute
+your changed version.
+
+
+Thank you for your assistance and cooperation.
+
+Christos Zoulas
+christos@astron.com
diff --git a/file/Magdir/acorn b/file/Magdir/acorn
new file mode 100644 (file)
index 0000000..ad89cc6
--- /dev/null
@@ -0,0 +1,32 @@
+#------------------------------------------------------------------------------
+# acorn:  file(1) magic for files found on Acorn systems
+#
+
+# RISC OS Chunk File Format
+# From RISC OS Programmer's Reference Manual, Appendix D
+# We guess the file type from the type of the first chunk.
+0      lelong          0xc3cbc6c5      RISC OS Chunk data
+>12    string          OBJ_            \b, AOF object
+>12    string          LIB_            \b, ALF library
+
+# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
+16     lelong          0xef000011      RISC OS AIF executable
+
+# RISC OS Draw files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0      string          Draw            RISC OS Draw file data
+
+# RISC OS new format font files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0      string          FONT\0          RISC OS outline font data,
+>5     byte            x               version %d
+0      string          FONT\1          RISC OS 1bpp font data,
+>5     byte            x               version %d
+0      string          FONT\4          RISC OS 4bpp font data
+>5     byte            x               version %d
+
+# RISC OS Music files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0      string          Maestro\r       RISC OS music file
+>8     byte            x               version %d
+
diff --git a/file/Magdir/adi b/file/Magdir/adi
new file mode 100644 (file)
index 0000000..12d7da5
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# adi: file(1) magic for ADi's objects
+# From Gregory McGarry <g.mcgarry@ieee.org>
+#
+0      leshort         0x521c          COFF DSP21k
+>18    lelong          &02             executable,
+>18    lelong          ^02
+>>18   lelong          &01             static object,
+>>18   lelong          ^01             relocatable object,
+>18    lelong          &010            stripped
+>18    lelong          ^010            not stripped
diff --git a/file/Magdir/adventure b/file/Magdir/adventure
new file mode 100644 (file)
index 0000000..38a5e33
--- /dev/null
@@ -0,0 +1,39 @@
+
+#------------------------------------------------------------------------------
+# adventure: file(1) magic for Adventure game files
+#
+# from Allen Garvin <earendil@faeryland.tamu-commerce.edu>
+# Edited by Dave Chapeskie <dchapes@ddm.on.ca> Jun 28, 1998
+#
+# ALAN
+# I assume there are other, lower versions, but these are the only ones I
+# saw in the archive.
+0      beshort 0x0206  ALAN text adventure code data
+>2     byte    <10     version 2.6%d
+
+# Conflicts with too much other stuff!
+# Infocom
+# (Note: to avoid false matches Z-machine version 1 and 2 are not
+# recognized since only the oldest Zork I and II used them.  Similarly
+# there are 4 Infocom games that use verion 4 that are not recognized.)
+#0     byte    3       Infocom game data (Z-machine 3,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*2
+#>18   string  >\0     Serial %.6s)
+#0     byte    5       Infocom game data (Z-machine 5,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*4
+#>18   string  >\0     Serial %.6s)
+#0     byte    6       Infocom game data (Z-machine 6,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*8
+#>18   string  >\0     Serial %.6s)
+#0     byte    8       Infocom game data (Z-machine 8,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*8
+#>18   string  >\0     Serial %.6s)
+
+# TADS (Text Adventure Development System)
+0      string  TADS    TADS game data
+>13    string  >\0     (ver. %.6s,
+>22    string  >\0     date %s)
diff --git a/file/Magdir/allegro b/file/Magdir/allegro
new file mode 100644 (file)
index 0000000..41f4ad6
--- /dev/null
@@ -0,0 +1,7 @@
+#------------------------------------------------------------------------------
+# allegro:  file(1) magic for Allegro datafiles
+# Toby Deshane <hac@shoelace.digivill.net>
+#
+0 belong 0x736C6821   Allegro datafile (packed)
+0 belong 0x736C682E   Allegro datafile (not packed/autodetect)
+0 belong 0x736C682B   Allegro datafile (appended exe data)
diff --git a/file/Magdir/alliant b/file/Magdir/alliant
new file mode 100644 (file)
index 0000000..69cf4b4
--- /dev/null
@@ -0,0 +1,17 @@
+
+#------------------------------------------------------------------------------
+# alliant:  file(1) magic for Alliant FX series a.out files
+#
+# If the FX series is the one that had a processor with a 68K-derived
+# instruction set, the "short" should probably become "beshort" and the
+# "long" should probably become "belong".
+# If it's the i860-based one, they should probably become either the
+# big-endian or little-endian versions, depending on the mode they ran
+# the 860 in....
+#
+0      short           0420            0420 Alliant virtual executable
+>2     short           &0x0020         common library
+>16    long            >0              not stripped
+0      short           0421            0421 Alliant compact executable
+>2     short           &0x0020         common library
+>16    long            >0              not stripped
diff --git a/file/Magdir/alpha b/file/Magdir/alpha
new file mode 100644 (file)
index 0000000..c0191fb
--- /dev/null
@@ -0,0 +1,30 @@
+#------------------------------------------------------------------------------
+# alpha architecture description
+#
+
+0      leshort         0603            COFF format alpha
+>22    leshort&030000  !020000         executable
+>24    leshort         0410            pure
+>24    leshort         0413            paged
+>22    leshort&020000  !0              dynamically linked
+>16    lelong          !0              not stripped
+>16    lelong          0               stripped
+>22    leshort&030000  020000          shared library
+>24    leshort         0407            object
+>27    byte            x               - version %d
+>26    byte            x               \b.%d
+>28    byte            x               \b-%d
+
+# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike@opac.bl.uk>
+#
+# The actual magic number is just "Core", followed by a 2-byte version
+# number; however, treating any file that begins with "Core" as a Digital
+# UNIX core dump file may produce too many false hits, so we include one
+# byte of the version number as well; DU 5.0 appears only to be up to
+# version 2.
+#
+0      string          Core\001        Alpha COFF format core dump (Digital UNIX)
+>24    string          >\0             \b, from '%s'
+0      string          Core\002        Alpha COFF format core dump (Digital UNIX)
+>24    string          >\0             \b, from '%s'
+
diff --git a/file/Magdir/amanda b/file/Magdir/amanda
new file mode 100644 (file)
index 0000000..2b95650
--- /dev/null
@@ -0,0 +1,10 @@
+#------------------------------------------------------------------------------
+# amanda:  file(1) magic for amanda file format
+#
+0      string  AMANDA:\                AMANDA 
+>8     string  TAPESTART\ DATE         tape header file,
+>>23   string  X
+>>>25  string  >\                      Unused %s
+>>23   string  >\                      DATE %s
+>8     string  FILE\                   dump file,
+>>13   string  >\                      DATE %s
diff --git a/file/Magdir/amigaos b/file/Magdir/amigaos
new file mode 100644 (file)
index 0000000..a4c3e82
--- /dev/null
@@ -0,0 +1,10 @@
+#------------------------------------------------------------------------------
+# amigaos:  file(1) magic for AmigaOS binary formats:
+
+#
+# From ignatios@cs.uni-bonn.de (Ignatios Souvatzis)
+# Some formats are still missing: AmigaOS special IFF's, e.g.: FORM....CTLG
+# (the others should be separate, anyway)
+#
+0      belong          0x000003f3      AmigaOS loadseg()ble executable/binary
+0      belong          0x000003e7      AmigaOS object/library data
diff --git a/file/Magdir/animation b/file/Magdir/animation
new file mode 100644 (file)
index 0000000..6fa689f
--- /dev/null
@@ -0,0 +1,170 @@
+
+#------------------------------------------------------------------------------
+# animation:  file(1) magic for animation/movie formats
+#
+# animation formats
+# MPEG, FLI, DL originally from vax@ccwf.cc.utexas.edu (VaX#n8)
+# FLC, SGI, Apple originally from Daniel Quinlan (quinlan@yggdrasil.com)
+
+# MPEG animation format
+0      belong          0x000001b3              MPEG video stream data
+#>4    beshort&0xfff0  x                       (%d x
+#>5    beshort&0x0fff  x                       %d)
+0      belong          0x000001ba              MPEG system stream data
+
+# MPEG Audio (*.mpx)
+# from dreesen@math.fu-berlin.de
+
+# XXX
+# This conflicts with the FF FE signature for UTF-16-encoded Unicode
+# text, which will be identified as an MP3 file.  I don't have any MP3s
+# so I don't know how to (or even if it's possible to) change this to
+# tell the two apart.    enf@pobox.com
+
+0       beshort         &0xfff0         MP
+# MPEG 1.0
+>1      byte&0x08       =0x08           \b
+# Layer 3
+>>1     byte            &0x02           \b3
+>>>2    byte&0xf0       =0x10           \b,  32 kBits
+>>>2    byte&0xf0       =0x20           \b,  40 kBits
+>>>2    byte&0xf0       =0x30           \b,  48 kBits
+>>>2    byte&0xf0       =0x40           \b,  56 kBits
+>>>2    byte&0xf0       =0x50           \b,  64 kBits
+>>>2    byte&0xf0       =0x60           \b,  80 kBits
+>>>2    byte&0xf0       =0x70           \b,  96 kBits
+>>>2    byte&0xf0       =0x80           \b, 112 kBits
+>>>2    byte&0xf0       =0x90           \b, 128 kBits
+>>>2    byte&0xf0       =0xA0           \b, 160 kBits
+>>>2    byte&0xf0       =0xB0           \b, 192 kBits
+>>>2    byte&0xf0       =0xC0           \b, 224 kBits
+>>>2    byte&0xf0       =0xD0           \b, 256 kBits
+>>>2    byte&0xf0       =0xE0           \b, 320 kBits
+# Layer 2
+>>1     byte            &0x04           \b2
+>>>2    byte&0xf0       =0x10           \b,  32 kBits
+>>>2    byte&0xf0       =0x20           \b,  48 kBits
+>>>2    byte&0xf0       =0x30           \b,  56 kBits
+>>>2    byte&0xf0       =0x40           \b,  64 kBits
+>>>2    byte&0xf0       =0x50           \b,  80 kBits
+>>>2    byte&0xf0       =0x60           \b,  96 kBits
+>>>2    byte&0xf0       =0x70           \b, 112 kBits
+>>>2    byte&0xf0       =0x80           \b, 128 kBits
+>>>2    byte&0xf0       =0x90           \b, 160 kBits
+>>>2    byte&0xf0       =0xA0           \b, 192 kBits
+>>>2    byte&0xf0       =0xB0           \b, 224 kBits
+>>>2    byte&0xf0       =0xC0           \b, 256 kBits
+>>>2    byte&0xf0       =0xD0           \b, 320 kBits
+>>>2    byte&0xf0       =0xE0           \b, 384 kBits
+# freq
+>>2     byte&0x0C       =0x00           \b, 44.1 kHz
+>>2     byte&0x0C       =0x04           \b, 48 kHz
+>>2     byte&0x0C       =0x08           \b, 32 kHz
+# MPEG 2.0
+>1      byte&0x08       =0x00           \b
+# Layer 3
+>>1     byte            &0x02           \b3
+# Layer 2
+>>1     byte            &0x04           \b2
+>>2     byte&0xf0       =0x10           \b,   8 kBits
+>>2     byte&0xf0       =0x20           \b,  16 kBits
+>>2     byte&0xf0       =0x30           \b,  24 kBits
+>>2     byte&0xf0       =0x40           \b,  32 kBits
+>>2     byte&0xf0       =0x50           \b,  40 kBits
+>>2     byte&0xf0       =0x60           \b,  48 kBits
+>>2     byte&0xf0       =0x70           \b,  56 kBits
+>>2     byte&0xf0       =0x80           \b,  64 kBits
+>>2     byte&0xf0       =0x90           \b,  80 kBits
+>>2     byte&0xf0       =0xA0           \b,  96 kBits
+>>2     byte&0xf0       =0xB0           \b, 112 kBits
+>>2     byte&0xf0       =0xC0           \b, 128 kBits
+>>2     byte&0xf0       =0xD0           \b, 144 kBits
+>>2     byte&0xf0       =0xE0           \b, 160 kBits
+# freq
+>>2     byte&0x0C       =0x00           \b, 22.05 kHz
+>>2     byte&0x0C       =0x04           \b, 24 kHz
+>>2     byte&0x0C       =0x08           \b, 16 kHz
+# misc
+>3      byte&0xC0       =0x00           \b, Stereo
+>3      byte&0xC0       =0x40           \b, JStereo
+>3      byte&0xC0       =0x80           \b, Dual-Ch
+>3      byte&0xC0       =0xC0           \b, Mono
+#>1     byte&0x01       =0x00           \b, Error Protection
+#>2     byte&0x02       =0x02           \b, Padding
+#>2     byte&0x01       =0x01           \b, Private
+#>3     byte&0x08       =0x08           \b, Copyright
+#>3     byte&0x04       =0x04           \b, Original
+#>3     byte&0x03       1               \b, Emphasis 5
+#>3     byte&0x03       3               \b, Emphasis c
+
+# FLI animation format
+4      leshort         0xAF11                  FLI file
+>6     leshort         x                       - %d frames,
+>8     leshort         x                       width=%d pixels,
+>10    leshort         x                       height=%d pixels,
+>12    leshort         x                       depth=%d,
+>16    leshort         x                       ticks/frame=%d
+# FLC animation format
+4      leshort         0xAF12                  FLC file
+>6     leshort         x                       - %d frames
+>8     leshort         x                       width=%d pixels,
+>10    leshort         x                       height=%d pixels,
+>12    leshort         x                       depth=%d,
+>16    leshort         x                       ticks/frame=%d
+
+# DL animation format
+# XXX - collision with most `mips' magic
+#
+# I couldn't find a real magic number for these, however, this
+# -appears- to work.  Note that it might catch other files, too, so be
+# careful!
+#
+# Note that title and author appear in the two 20-byte chunks
+# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
+# 255 (hex FF)!  The DL format is really bad.
+#
+#0     byte    1       DL version 1, medium format (160x100, 4 images/screen)
+#>42   byte    x       - %d screens,
+#>43   byte    x       %d commands
+#0     byte    2       DL version 2
+#>1    byte    1       - large format (320x200,1 image/screen),
+#>1    byte    2       - medium format (160x100,4 images/screen),
+#>1    byte    >2      - unknown format,
+#>42   byte    x       %d screens,
+#>43   byte    x       %d commands
+# Based on empirical evidence, DL version 3 have several nulls following the
+# \003.  Most of them start with non-null values at hex offset 0x34 or so.
+#0     string  \3\0\0\0\0\0\0\0\0\0\0\0        DL version 3
+
+# SGI and Apple formats
+0      string          MOVI            Silicon Graphics movie file
+4      string          moov            Apple QuickTime movie file (moov)
+4      string          mdat            Apple QuickTime movie file (mdat)
+
+# iso 13818 transport stream
+#
+# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001 (ISO 13818.1)
+# (the following is a little bit restrictive and works fine for a stream
+#  that starts with PAT properly. it won't work for stream data, that is
+#  cut from an input device data right in the middle, but this shouldn't
+#  disturb)
+# syncbyte      8 bit  0x47
+# error_ind     1 bit  -
+# payload_start 1 bit  1
+# priority      1 bit  -
+# PID          13 bit  0x0000
+# scrambling    2 bit  -
+# adaptfld_ctrl 2 bit  1 or 3
+# conti_count   4 bit  0
+0      belong&0xFF5FFF1F       0x47400010      MPEG transport stream data
+>188   byte                    !0x47           CORRUPTED
+
+# DIF digital video file format <mpruett@sgi.com>
+0      belong&0xffffff00       0x1f070000      DIF
+>4     byte                    &0x01           (DVCPRO) movie file
+>4     byte                    ^0x01           (DV) movie file
+>3     byte                    &0x80           (PAL)
+>3     byte                    ^0x80           (NTSC)
+
+# Microsoft Advanced Streaming Format (ASF) <mpruett@sgi.com>
+0      belong                  0x3026b275      Microsoft ASF
diff --git a/file/Magdir/apl b/file/Magdir/apl
new file mode 100644 (file)
index 0000000..0400431
--- /dev/null
@@ -0,0 +1,6 @@
+
+#------------------------------------------------------------------------------
+# apl:  file(1) magic for APL (see also "pdp" and "vax" for other APL
+#       workspaces)
+#
+0      long            0100554         APL workspace (Ken's original?)
diff --git a/file/Magdir/apple b/file/Magdir/apple
new file mode 100644 (file)
index 0000000..c2b372b
--- /dev/null
@@ -0,0 +1,122 @@
+
+#------------------------------------------------------------------------------
+# apple:  file(1) magic for Apple file formats
+#
+0      string          FiLeStArTfIlEsTaRt      binscii (apple ][) text
+0      string          \x0aGL                  Binary II (apple ][) data
+0      string          \x76\xff                Squeezed (apple ][) data
+0      string          NuFile                  NuFile archive (apple ][) data
+0      string          N\xf5F\xe9l\xe5         NuFile archive (apple ][) data
+0      belong          0x00051600              AppleSingle encoded Macintosh file
+0      belong          0x00051607              AppleDouble encoded Macintosh file
+
+# magic for Newton PDA package formats
+# from Ruda Moura <ruda@helllabs.org>
+0      string  package0        Newton package, NOS 1.x,
+>12    belong  &0x80000000     AutoRemove,
+>12    belong  &0x40000000     CopyProtect,
+>12    belong  &0x10000000     NoCompression,
+>12    belong  &0x04000000     Relocation,
+>12    belong  &0x02000000     UseFasterCompression,
+>16    belong  x               version %d
+
+0      string  package1        Newton package, NOS 2.x,
+>12    belong  &0x80000000     AutoRemove,
+>12    belong  &0x40000000     CopyProtect,
+>12    belong  &0x10000000     NoCompression,
+>12    belong  &0x04000000     Relocation,
+>12    belong  &0x02000000     UseFasterCompression,
+>16    belong  x               version %d
+
+# The following entries for the Apple II are for files that have
+# been transferred as raw binary data from an Apple, without having
+# been encapsulated by any of the above archivers.
+#
+# In general, Apple II formats are hard to identify because Apple DOS
+# and especially Apple ProDOS have strong typing in the file system and
+# therefore programmers never felt much need to include type information
+# in the files themselves.
+#
+# Eric Fischer <enf@pobox.com>
+
+# AppleWorks word processor:
+#
+# This matches the standard tab stops for an AppleWorks file, but if
+# a file has a tab stop set in the first four columns this will fail.
+#
+# The "O" is really the magic number, but that's so common that it's
+# necessary to check the tab stops that follow it to avoid false positives.
+
+4       string          O====   AppleWorks word processor data
+>85     byte&0x01       >0      \b, zoomed
+>90     byte&0x01       >0      \b, paginated
+>92     byte&0x01       >0      \b, with mail merge
+#>91    byte            x       \b, left margin %d
+
+# AppleWorks database:
+#
+# This isn't really a magic number, but it's the closest thing to one
+# that I could find.  The 1 and 2 really mean "order in which you defined
+# categories" and "left to right, top to bottom," respectively; the D and R
+# mean that the cursor should move either down or right when you press Return.
+
+#30    string          \x01D   AppleWorks database data
+#30    string          \x02D   AppleWorks database data
+#30    string          \x01R   AppleWorks database data
+#30    string          \x02R   AppleWorks database data
+
+# AppleWorks spreadsheet:
+#
+# Likewise, this isn't really meant as a magic number.  The R or C means
+# row- or column-order recalculation; the A or M means automatic or manual
+# recalculation.
+
+#131   string          RA      AppleWorks spreadsheet data
+#131   string          RM      AppleWorks spreadsheet data
+#131   string          CA      AppleWorks spreadsheet data
+#131   string          CM      AppleWorks spreadsheet data
+
+# Applesoft BASIC:
+#
+# This is incredibly sloppy, but will be true if the program was
+# written at its usual memory location of 2048 and its first line
+# number is less than 256.  Yuck.
+
+0       belong&0xff00ff 0x80000 Applesoft BASIC program data
+#>2     leshort         x       \b, first line number %d
+
+# ORCA/EZ assembler:
+# 
+# This will not identify ORCA/M source files, since those have
+# some sort of date code instead of the two zero bytes at 6 and 7
+# XXX Conflicts with ELF
+#4       belong&0xff00ffff       0x01000000      ORCA/EZ assembler source data
+#>5      byte                    x               \b, build number %d
+
+# Broderbund Fantavision
+#
+# I don't know what these values really mean, but they seem to recur.
+# Will they cause too many conflicts?
+
+# Probably :-)
+#2     belong&0xFF00FF         0x040008        Fantavision movie data
+
+# Some attempts at images.
+#
+# These are actually just bit-for-bit dumps of the frame buffer, so
+# there's really no reasonably way to distinguish them except for their
+# address (if preserved) -- 8192 or 16384 -- and their length -- 8192
+# or, occasionally, 8184.
+#
+# Nevertheless this will manage to catch a lot of images that happen
+# to have a solid-colored line at the bottom of the screen.
+
+8144   string  \x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F        Apple II image with white background
+8144   string  \x55\x2A\x55\x2A\x55\x2A\x55\x2A        Apple II image with purple background
+8144   string  \x2A\x55\x2A\x55\x2A\x55\x2A\x55        Apple II image with green background
+8144   string  \xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA        Apple II image with blue background
+8144   string  \xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5        Apple II image with orange background
+
+# Beagle Bros. Apple Mechanic fonts
+
+0      belong&0xFF00FFFF       0x6400D000      Apple Mechanic font
diff --git a/file/Magdir/applix b/file/Magdir/applix
new file mode 100644 (file)
index 0000000..9d348d1
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# applix:  file(1) magic for Applixware
+# From: Peter Soos <sp@osb.hu>
+#
+0      string          *BEGIN          Applixware
+>7     string          WORDS                   Words Document
+>7     string          GRAPHICS                Graphic
+>7     string          RASTER                  Bitmap
+>7     string          SPREADSHEETS            Spreadsheet
+>7     string          MACRO                   Macro
+>7     string          BUILDER                 Builder Object
diff --git a/file/Magdir/archive b/file/Magdir/archive
new file mode 100644 (file)
index 0000000..7e98240
--- /dev/null
@@ -0,0 +1,252 @@
+
+#------------------------------------------------------------------------------
+# archive:  file(1) magic for archive formats (see also "msdos" for self-
+#           extracting compressed archives)
+#
+# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.
+# pre-POSIX "tar" archives are handled in the C code.
+
+# POSIX tar archives
+257    string          ustar\0         POSIX tar archive
+257    string          ustar\040\040\0 GNU tar archive
+
+# cpio archives
+#
+# Yes, the top two "cpio archive" formats *are* supposed to just be "short".
+# The idea is to indicate archives produced on machines with the same
+# byte order as the machine running "file" with "cpio archive", and
+# to indicate archives produced on machines with the opposite byte order
+# from the machine running "file" with "byte-swapped cpio archive".
+#
+# The SVR4 "cpio(4)" hints that there are additional formats, but they
+# are defined as "short"s; I think all the new formats are
+# character-header formats and thus are strings, not numbers.
+0      short           070707          cpio archive
+0      short           0143561         byte-swapped cpio archive
+0      string          070707          ASCII cpio archive (pre-SVR4 or odc)
+0      string          070701          ASCII cpio archive (SVR4 with no CRC)
+0      string          070702          ASCII cpio archive (SVR4 with CRC)
+
+# Debian package (needs to go before regular portable archives)
+#
+0      string          !<arch>\ndebian
+>8     string          debian-split    part of multipart Debian package
+>8     string          debian-binary   Debian binary package
+>68    string          >\n             (format %s)
+>136   ledate          x               created: %s
+
+# other archives
+0      long            0177555         very old archive
+0      short           0177555         very old PDP-11 archive
+0      long            0177545         old archive
+0      short           0177545         old PDP-11 archive
+0      long            0100554         apl workspace
+0      string          =<ar>           archive
+
+# MIPS archive (needs to go before regular portable archives)
+#
+0      string  !<arch>\n__________E    MIPS archive
+>20    string  U                       with MIPS Ucode members
+>21    string  L                       with MIPSEL members
+>21    string  B                       with MIPSEB members
+>19    string  L                       and an EL hash table
+>19    string  B                       and an EB hash table
+>22    string  X                       -- out of date
+
+0      string          -h-             Software Tools format archive text
+
+#
+# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is
+# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
+#
+# 0    string          !<arch>         current ar archive
+# 0    long            0x213c6172      archive file
+#
+# and for SVR1 archives, we have:
+#
+# 0    string          \<ar>           System V Release 1 ar archive
+# 0    string          =<ar>           archive
+#
+# XXX - did Aegis really store shared libraries, breakpointed modules,
+# and absolute code program modules in the same format as new-style
+# "ar" archives?
+#
+0      string          !<arch>         current ar archive
+>8     string          __.SYMDEF       random library
+>0     belong          =65538          - pre SR9.5
+>0     belong          =65539          - post SR9.5
+>0     beshort         2               - object archive
+>0     beshort         3               - shared library module
+>0     beshort         4               - debug break-pointed module
+>0     beshort         5               - absolute code program module
+0      string          \<ar>           System V Release 1 ar archive
+0      string          =<ar>           archive
+#
+# XXX - from "vax", which appears to collect a bunch of byte-swapped
+# thingies, to help you recognize VAX files on big-endian machines;
+# with "leshort", "lelong", and "string", that's no longer necessary....
+#
+0      belong          0x65ff0000      VAX 3.0 archive
+0      belong          0x3c61723e      VAX 5.0 archive
+#
+0      long            0x213c6172      archive file
+0      lelong          0177555         very old VAX archive
+0      leshort         0177555         very old PDP-11 archive
+#
+# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
+# be a random library (it said 0xff65 rather than 0177545).
+#
+0      lelong          0177545         old VAX archive
+>8     string          __.SYMDEF       random library
+0      leshort         0177545         old PDP-11 archive
+>8     string          __.SYMDEF       random library
+#
+# From "pdp" (but why a 4-byte quantity?)
+#
+0      lelong          0x39bed         PDP-11 old archive
+0      lelong          0x39bee         PDP-11 4.0 archive
+
+# ARC archiver, from Daniel Quinlan (quinlan@yggdrasil.com)
+#
+# The first byte is the magic (0x1a), byte 2 is the compression type for
+# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS
+# filename of the first file (null terminated).  Since some types collide
+# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),
+# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%).  0x01 collides with terminfo.
+0      lelong&0x8080ffff       0x0000081a      ARC archive data, dynamic LZW
+0      lelong&0x8080ffff       0x0000091a      ARC archive data, squashed
+0      lelong&0x8080ffff       0x0000021a      ARC archive data, uncompressed
+0      lelong&0x8080ffff       0x0000031a      ARC archive data, packed
+0      lelong&0x8080ffff       0x0000041a      ARC archive data, squeezed
+0      lelong&0x8080ffff       0x0000061a      ARC archive data, crunched
+
+# Acorn archive formats (Disaster prone simpleton, m91dps@ecs.ox.ac.uk)
+# I can't create either SPARK or ArcFS archives so I have not tested this stuff
+# [GRR:  the original entries collide with ARC, above; replaced with combined
+#  version (not tested)]
+#0     byte            0x1a            RISC OS archive
+#>1    string          archive         (ArcFS format)
+0      string          \032archive     RISC OS archive (ArcFS format)
+
+# ARJ archiver (jason@jarthur.Claremont.EDU)
+0      leshort         0xea60          ARJ archive data
+>5     byte            x               \b, v%d,
+>8     byte            &0x04           multi-volume,
+>8     byte            &0x10           slash-switched,
+>8     byte            &0x20           backup,
+>34    string          x               original name: %s,
+>7     byte            0               os: MS-DOS
+>7     byte            1               os: PRIMOS
+>7     byte            2               os: Unix
+>7     byte            3               os: Amiga
+>7     byte            4               os: Macintosh
+>7     byte            5               os: OS/2
+>7     byte            6               os: Apple ][ GS
+>7     byte            7               os: Atari ST
+>7     byte            8               os: NeXT
+>7     byte            9               os: VAX/VMS
+>3     byte            >0              %d]
+
+# HA archiver (Greg Roelofs, newt@uchicago.edu)
+# This is a really bad format. A file containing HAWAII will match this...
+#0     string          HA              HA archive data,
+#>2    leshort         =1              1 file,
+#>2    leshort         >1              %u files,
+#>4    byte&0x0f       =0              first is type CPY
+#>4    byte&0x0f       =1              first is type ASC
+#>4    byte&0x0f       =2              first is type HSC
+#>4    byte&0x0f       =0x0e           first is type DIR
+#>4    byte&0x0f       =0x0f           first is type SPECIAL
+
+# HPACK archiver (Peter Gutmann, pgut1@cs.aukuni.ac.nz)
+0      string          HPAK            HPACK archive data
+
+# JAM Archive volume format, by Dmitry.Kohmanyuk@UA.net
+0      string          \351,\001JAM\           JAM archive,
+>7     string          >\0                     version %.4s
+>0x26  byte            =0x27                   -
+>>0x2b string          >\0                     label %.11s,
+>>0x27 lelong          x                       serial %08x,
+>>0x36 string          >\0                     fstype %.8s
+
+# LHARC/LHA archiver (Greg Roelofs, newt@uchicago.edu)
+2      string          -lh0-           LHarc 1.x archive data [lh0]
+2      string          -lh1-           LHarc 1.x archive data [lh1]
+2      string          -lz4-           LHarc 1.x archive data [lz4]
+2      string          -lz5-           LHarc 1.x archive data [lz5]
+#      [never seen any but the last; -lh4- reported in comp.compression:]
+2      string          -lzs-           LHa 2.x? archive data [lzs]
+2      string          -lh\40-         LHa 2.x? archive data [lh ]
+2      string          -lhd-           LHa 2.x? archive data [lhd]
+2      string          -lh2-           LHa 2.x? archive data [lh2]
+2      string          -lh3-           LHa 2.x? archive data [lh3]
+2      string          -lh4-           LHa (2.x) archive data [lh4]
+2      string          -lh5-           LHa (2.x) archive data [lh5]
+2      string          -lh6-           LHa (2.x) archive data [lh6]
+2      string          -lh7-           LHa (2.x) archive data [lh7]
+>20    byte            x               - header level %d
+
+# RAR archiver (Greg Roelofs, newt@uchicago.edu)
+0      string          Rar!            RAR archive data
+
+# SQUISH archiver (Greg Roelofs, newt@uchicago.edu)
+0      string          SQSH            squished archive data (Acorn RISCOS)
+
+# UC2 archiver (Greg Roelofs, newt@uchicago.edu)
+# I can't figure out the self-extracting form of these buggers...
+0      string          UC2\x1a         UC2 archive data
+
+# ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
+0      string          PK\003\004      Zip archive data
+>4     byte            0x09            \b, at least v0.9 to extract
+>4     byte            0x0a            \b, at least v1.0 to extract
+>4     byte            0x0b            \b, at least v1.1 to extract
+>4     byte            0x14            \b, at least v2.0 to extract
+
+# Zoo archiver
+20     lelong          0xfdc4a7dc      Zoo archive data
+>4     byte            >48             \b, v%c.
+>>6    byte            >47             \b%c
+>>>7   byte            >47             \b%c
+>32    byte            >0              \b, modify: v%d
+>>33   byte            x               \b.%d+
+>42    lelong          0xfdc4a7dc      \b,
+>>70   byte            >0              extract: v%d
+>>>71  byte            x               \b.%d+
+
+# Shell archives
+10     string          #\ This\ is\ a\ shell\ archive  shell archive text
+
+#
+# LBR. NB: May conflict with the questionable 
+#          "binary Computer Graphics Metafile" format.
+#
+0       string  \0\ \ \ \ \ \ \ \ \ \ \ \0\0    LBR archive data
+#
+# PMA (CP/M derivative of LHA)
+#
+2       string          -pm0-           PMarc archive data [pm0]
+2       string          -pm1-           PMarc archive data [pm1]
+2       string          -pm2-           PMarc archive data [pm2]
+2       string          -pms-           PMarc SFX archive (CP/M, DOS)
+5       string          -pc1-           PopCom compressed executable (CP/M)
+
+# From rafael@icp.inpg.fr (Rafael Laboissiere) 
+# The Project Revision Control System (see
+# http://www.XCF.Berkeley.EDU/~jmacd/prcs.html) generates a packaged project
+# file which is recognized by the following entry:
+0      leshort         0xeb81  PRCS packaged project
+
+# Microsoft cabinets 
+# by David Necas (Yeti) <yeti@physics.muni.cz>
+0      string  MSCF\0\0\0\0    Microsoft cabinet file data,
+>25    byte    x               v%d
+>24    byte    x               \b.%d
+
+# GTKtalog catalogs 
+# by David Necas (Yeti) <yeti@physics.muni.cz>
+4      string  gtktalog\       GTKtalog catalog data,
+>13    string  3               version 3
+>>14   beshort 0x677a          (gzipped)
+>>14   beshort !0x677a         (not gzipped)
+>13    string  >3              version %s
diff --git a/file/Magdir/asterix b/file/Magdir/asterix
new file mode 100644 (file)
index 0000000..d89504a
--- /dev/null
@@ -0,0 +1,17 @@
+
+#------------------------------------------------------------------------------
+# asterix:  file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character
+# strings as "long" - we assume they're just strings:
+# From: guy@netapp.com (Guy Harris)
+#
+0      string          *STA            Aster*x
+>7     string          WORD                    Words Document
+>7     string          GRAP                    Graphic
+>7     string          SPRE                    Spreadsheet
+>7     string          MACR                    Macro
+0      string          2278            Aster*x Version 2
+>29    byte            0x36                    Words Document
+>29    byte            0x35                    Graphic
+>29    byte            0x32                    Spreadsheet
+>29    byte            0x38                    Macro
+
diff --git a/file/Magdir/att3b b/file/Magdir/att3b
new file mode 100644 (file)
index 0000000..884ad4a
--- /dev/null
@@ -0,0 +1,40 @@
+
+#------------------------------------------------------------------------------
+# att3b:  file(1) magic for AT&T 3B machines
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+# 3B20
+#
+# The 3B20 conflicts with SCCS.
+#0     beshort         0550            3b20 COFF executable
+#>12   belong          >0              not stripped
+#>22   beshort         >0              - version %ld
+#0     beshort         0551            3b20 COFF executable (TV)
+#>12   belong          >0              not stripped
+#>22   beshort         >0              - version %ld
+#
+# WE32K
+#
+0      beshort         0560            WE32000 COFF
+>18    beshort         ^00000020       object
+>18    beshort         &00000020       executable
+>12    belong          >0              not stripped
+>18    beshort         ^00010000       N/A on 3b2/300 w/paging
+>18    beshort         &00020000       32100 required
+>18    beshort         &00040000       and MAU hardware required
+>20    beshort         0407            (impure)
+>20    beshort         0410            (pure)
+>20    beshort         0413            (demand paged)
+>20    beshort         0443            (target shared library)
+>22    beshort         >0              - version %ld
+0      beshort         0561            WE32000 COFF executable (TV)
+>12    belong          >0              not stripped
+#>18   beshort         &00020000       - 32100 required
+#>18   beshort         &00040000       and MAU hardware required
+#>22   beshort         >0              - version %ld
+#
+# core file for 3b2 
+0      string          \000\004\036\212\200    3b2 core file
+>364   string          >\0             of '%s'
diff --git a/file/Magdir/audio b/file/Magdir/audio
new file mode 100644 (file)
index 0000000..65988f1
--- /dev/null
@@ -0,0 +1,144 @@
+
+#------------------------------------------------------------------------------
+# audio:  file(1) magic for sound formats (see also "iff")
+#
+# Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),
+# and others
+#
+
+# Sun/NeXT audio data
+0      string          .snd            Sun/NeXT audio data:
+>12    belong          1               8-bit ISDN u-law,
+>12    belong          2               8-bit linear PCM [REF-PCM],
+>12    belong          3               16-bit linear PCM,
+>12    belong          4               24-bit linear PCM,
+>12    belong          5               32-bit linear PCM,
+>12    belong          6               32-bit IEEE floating point,
+>12    belong          7               64-bit IEEE floating point,
+>12    belong          23              8-bit ISDN u-law compressed (CCITT G.721 ADPCM voice data encoding),
+>12    belong          24              compressed (8-bit G.722 ADPCM)
+>12    belong          25              compressed (3-bit G.723 ADPCM),
+>12    belong          26              compressed (5-bit G.723 ADPCM),
+>12    belong          27              8-bit A-law,
+>20    belong          1               mono,
+>20    belong          2               stereo,
+>20    belong          4               quad,
+>16    belong          >0              %d Hz
+
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+0      lelong          0x0064732E      DEC audio data:
+>12    lelong          1               8-bit ISDN u-law,
+>12    lelong          2               8-bit linear PCM [REF-PCM],
+>12    lelong          3               16-bit linear PCM,
+>12    lelong          4               24-bit linear PCM,
+>12    lelong          5               32-bit linear PCM,
+>12    lelong          6               32-bit IEEE floating point,
+>12    lelong          7               64-bit IEEE floating point,
+>12    lelong          23              8-bit ISDN u-law compressed (CCITT G.721 ADPCM voice data encoding),
+>20    lelong          1               mono,
+>20    lelong          2               stereo,
+>20    lelong          4               quad,
+>16    lelong          >0              %d Hz
+
+# Creative Labs AUDIO stuff
+0      string  MThd                    Standard MIDI data
+>9     byte    >0                      (format %d)
+>11    byte    >1                      using %d tracks
+0      string  CTMF                    Creative Music (CMF) data
+0      string  SBI                     SoundBlaster instrument data
+0      string  Creative\ Voice\ File   Creative Labs voice data
+# is this next line right?  it came this way...
+>19    byte    0x1A
+>23    byte    >0                      - version %d
+>22    byte    >0                      \b.%d
+
+# first entry is also the string "NTRK"
+0      belong          0x4e54524b      MultiTrack sound data
+>4     belong          x               - version %ld
+
+# Extended MOD format (*.emd) (Greg Roelofs, newt@uchicago.edu); NOT TESTED
+# [based on posting 940824 by "Dirk/Elastik", husberg@lehtori.cc.tut.fi]
+0      string          EMOD            Extended MOD sound data,
+>4     byte&0xf0       x               version %d
+>4     byte&0x0f       x               \b.%d,
+>45    byte            x               %d instruments
+>83    byte            0               (module)
+>83    byte            1               (song)
+
+# Real Audio (Magic .ra\0375)
+0      belong          0x2e7261fd      RealAudio sound file
+0      string          .RMF            RealMedia file
+
+# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert@dialin.ind.net]
+# Oct 31, 1995
+0      string          MTM             MultiTracker Module sound file
+#0     string          if              Composer 669 Module sound data
+0      string          FAR             Module sound data
+0      string          MAS_U           ULT(imate) Module sound data
+0x2c   string          SCRM            ScreamTracker III Module sound data
+0      string          Extended Module Extended Module sound data
+
+# Gravis UltraSound patches
+# From <ache@nagual.ru>
+
+0      string          GF1PATCH110\0ID#000002\0        GUS patch
+0      string          GF1PATCH100\0ID#000002\0        Old GUS patch
+
+#
+# Taken from loader code from mikmod version 2.14
+# by Steve McIntyre (stevem@chiark.greenend.org.uk)
+0      string  JN              extended 669 module data
+0      string  MAS_UTrack_V00
+>14    string  >/0             ultratracker V1.%.1s module sound data
+0      string  UN05            MikMod UNI format module sound data
+0      string  Extended\ Module: Fasttracker II module sound data
+21     string  !SCREAM!        Screamtracker 2 module sound data
+1080   string  M.K.            4-channel Protracker module sound data
+1080   string  M!K!            4-channel Protracker module sound data
+1080   string  FLT4            4-channel Startracker module sound data
+1080   string  4CHN            4-channel Fasttracker module sound data
+1080   string  6CHN            6-channel Fasttracker module sound data
+1080   string  8CHN            8-channel Fasttracker module sound data
+1080   string  CD81            8-channel Oktalyzer module sound data
+1080   string  OKTA            8-channel Oktalyzer module sound data
+# Not good enough.
+#1082  string  CH
+#>1080 string  >/0             %.2s-channel Fasttracker "oktalyzer" module sound data
+1080   string  16CN            16-channel Taketracker module sound data
+1080   string  32CN            32-channel Taketracker module sound data
+
+# TOC sound files -Trevor Johnson <trevor@jpj.net>
+#
+0       string          TOC             TOC sound file
+
+# sidfiles <pooka@iki.fi>
+0      string          SIDPLAY\ INFOFILE       Sidplay info file
+0      string          PSID                    PlaySID v2.2+ (AMIGA) sidtune
+>4     beshort         >0                      w/ header v%d,
+>14    beshort         =1                      single song,
+>14    beshort         >1                      %d songs,
+>16    beshort         >0                      default song: %d
+
+# IRCAM <mpruett@sgi.com>
+# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
+0      belong          0x64a30100              IRCAM file (VAX)
+0      belong          0x64a30200              IRCAM file (Sun)
+0      belong          0x64a30300              IRCAM file (MIPS little-endian)
+0      belong          0x64a30400              IRCAM file (NeXT)
+
+# NIST SPHERE <mpruett@sgi.com>
+0      string          NIST_1A\n\ \ \ 1024\n   NIST SPHERE file
+
+# Sample Vision <mpruett@sgi.com>
+0      string          SOUND\ SAMPLE\ DATA\    Sample Vision file
+
+# Audio Visual Research <mpruett@sgi.com>
+0      string          2BIT                    Audio Visual Research file
+
+# From Felix von Leitner <leitner@fefe.de>
+0      string          OggS    Ogg-Vorbis compressed sound file
+
+# SGI SoundTrack <mpruett@sgi.com>
+0      string          _SGI_SoundTrack         SGI SoundTrack project file
+0      string          ID3     mp3 file with ID3 2.0 tag
diff --git a/file/Magdir/blender b/file/Magdir/blender
new file mode 100644 (file)
index 0000000..01d4e54
--- /dev/null
@@ -0,0 +1,17 @@
+#------------------------------------------------------------------------------
+# blender: file(1) magic for Blender 3D data files
+#
+# Coded by Guillermo S. Romero <gsromero@alumnos.euitt.upm.es> using the
+# data from Ton Roosendaal <ton@blender.nl>. Ton or his company do not
+# support the rule, so mail GSR if problems with it. Rule version: 1.1.
+# You can get latest version with comments and details about the format
+# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender
+
+0      string  =BLENDER        Blender3D,
+>7     string  =_              saved as 32-bits
+>7      string =-              saved as 64-bits
+>8     string  =v              little endian
+>8     string  =V              big endian
+>9     byte    x               with version %c.
+>10    byte    x               \b%c
+>11    byte    x               \b%c
diff --git a/file/Magdir/blit b/file/Magdir/blit
new file mode 100644 (file)
index 0000000..7a470ed
--- /dev/null
@@ -0,0 +1,19 @@
+
+#------------------------------------------------------------------------------
+# blit:  file(1) magic for 68K Blit stuff as seen from 680x0 machine
+#
+# Note that this 0407 conflicts with several other a.out formats...
+#
+# XXX - should this be redone with "be" and "le", so that it works on
+# little-endian machines as well?  If so, what's the deal with
+# "VAX-order" and "VAX-order2"?
+#
+#0     long            0407            68K Blit (standalone) executable
+#0     short           0407            VAX-order2 68K Blit (standalone) executable
+0      short           03401           VAX-order 68K Blit (standalone) executable
+0      long            0406            68k Blit mpx/mux executable
+0      short           0406            VAX-order2 68k Blit mpx/mux executable
+0      short           03001           VAX-order 68k Blit mpx/mux executable
+# Need more values for WE32 DMD executables.
+# Note that 0520 is the same as COFF
+#0     short           0520            tty630 layers executable
diff --git a/file/Magdir/bsdi b/file/Magdir/bsdi
new file mode 100644 (file)
index 0000000..ad54759
--- /dev/null
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+# bsdi:  file(1) magic for BSD/OS (from BSDI) objects
+#
+
+0      lelong          0314            386 compact demand paged pure executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+0      lelong          0407            386 executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+0      lelong          0410            386 pure executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+0      lelong          0413            386 demand paged pure executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+# same as in SunOS 4.x, except for static shared libraries
+0      belong&077777777        0600413         sparc demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+>36    belong          0xb4100001      (uses shared libs)
+
+0      belong&077777777        0600410         sparc pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+>36    belong          0xb4100001      (uses shared libs)
+
+0      belong&077777777        0600407         sparc
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+>36    belong          0xb4100001      (uses shared libs)
diff --git a/file/Magdir/c-lang b/file/Magdir/c-lang
new file mode 100644 (file)
index 0000000..1b01475
--- /dev/null
@@ -0,0 +1,13 @@
+
+#------------------------------------------------------------------------------
+# c-lang:  file(1) magic for C programs (or REXX)
+#
+
+# XPM icons (Greg Roelofs, newt@uchicago.edu)
+# if you uncomment "/*" for C/REXX below, also uncomment this entry
+#0     string          /*\ XPM\ */     X pixmap image data
+
+# this first will upset you if you're a PL/1 shop...
+# in which case rm it; ascmagic will catch real C programs
+#0     string          /*              C or REXX program text
+0      string          //              C++ program text
diff --git a/file/Magdir/cddb b/file/Magdir/cddb
new file mode 100644 (file)
index 0000000..2ea97ee
--- /dev/null
@@ -0,0 +1,11 @@
+
+#------------------------------------------------------------------------------
+# CDDB: file(1) magic for CDDB(tm) format CD text data files
+#
+# From <steve@gracenote.com>
+#
+# This is the /etc/magic entry to decode datafiles as used by
+# CDDB-enabled CD player applications.
+#
+
+0       string/b        #\040xmcd               CDDB(tm) format CD text data
diff --git a/file/Magdir/chi b/file/Magdir/chi
new file mode 100644 (file)
index 0000000..ee450f5
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# chi:  file(1) magic for ChiWriter files
+#
+0       string          \\1cw\          ChiWriter file
+>5      string          >\0             version %s
+0       string          \\1cw           ChiWriter file
diff --git a/file/Magdir/cisco b/file/Magdir/cisco
new file mode 100644 (file)
index 0000000..77e3efb
--- /dev/null
@@ -0,0 +1,10 @@
+#------------------------------------------------------------------------------
+# cisco:  file(1) magic for cisco Systems routers
+#
+# Most cisco file-formats are covered by the generic elf code
+#
+# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.
+0      belong&0xffffff00       0x85011400  cisco IOS microcode
+>7     string          >\0                 for '%s'
+0      belong&0xffffff00       0x8501cb00  cisco IOS experimental microcode
+>7     string          >\0                 for '%s'
diff --git a/file/Magdir/citrus b/file/Magdir/citrus
new file mode 100644 (file)
index 0000000..6d44794
--- /dev/null
@@ -0,0 +1,6 @@
+#------------------------------------------------------------------------------
+# citrus locale declaration
+#
+
+0      string          RuneCT          Citrus locale declaration for LC_CTYPE
+
diff --git a/file/Magdir/claris b/file/Magdir/claris
new file mode 100644 (file)
index 0000000..b18bd91
--- /dev/null
@@ -0,0 +1,46 @@
+
+#------------------------------------------------------------------------------
+# claris:  file(1) magic for claris
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Claris Works a word processor, etc.
+# Version 3.0
+
+# .pct claris works clip art files
+#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
+#*
+#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000
+#null to byte 1000 octal
+514    string  \377\377\377\377\000    Claris clip art?
+>0     string  \0\0\0\0\0\0\0\0\0\0\0\0\0      yes.
+514    string  \377\377\377\377\001    Claris clip art?
+>0     string  \0\0\0\0\0\0\0\0\0\0\0\0\0      yes.
+
+# Claris works files
+# .cwk
+0      string  \002\000\210\003\102\117\102\117\000\001\206 Claris works document
+# .plt
+0      string  \020\341\000\000\010\010        Claris Works pallete files .plt
+
+# .msp a dictionary file I am not sure about this I have only one .msp file
+0      string  \002\271\262\000\040\002\000\164        Claris works dictionary
+
+# .usp are user dictionary bits
+# I am not sure about a magic header:
+#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151
+#        soh   S   p   f   8   U   D  sp   ^   S  cr  nl   p   o   d   i
+#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043
+#          a   t   r   i   s   t  sp   ^   S  cr  nl   d   i   v  sp   #
+
+# .mth Thesaurus
+# statrts with \0 but no magic header
+
+# .chy Hyphenation file
+# I am not sure: 000 210 034 000 000
+
+# other claris files
+#./windows/claris/useng.ndx: data
+#./windows/claris/xtndtran.l32: data
+#./windows/claris/xtndtran.lst: data
+#./windows/claris/clworks.lbl: data
+#./windows/claris/clworks.prf: data
+#./windows/claris/userd.spl: data
diff --git a/file/Magdir/clipper b/file/Magdir/clipper
new file mode 100644 (file)
index 0000000..c325cb8
--- /dev/null
@@ -0,0 +1,64 @@
+
+#------------------------------------------------------------------------------
+# clipper:  file(1) magic for Intergraph (formerly Fairchild) Clipper.
+#
+# XXX - what byte order does the Clipper use?
+#
+# XXX - what's the "!" stuff:
+#
+# >18  short           !074000,000000  C1 R1 
+# >18  short           !074000,004000  C2 R1
+# >18  short           !074000,010000  C3 R1
+# >18  short           !074000,074000  TEST
+#
+# I shall assume it's ANDing the field with the first value and
+# comparing it with the second, and rewrite it as:
+#
+# >18  short&074000    000000          C1 R1 
+# >18  short&074000    004000          C2 R1
+# >18  short&074000    010000          C3 R1
+# >18  short&074000    074000          TEST
+#
+# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
+# sort, nor does SunOS 4.x, so either it's something Intergraph added
+# in CLIX, or something AT&T added in SVR3.2 or later, or something
+# somebody else thought was a good idea; it's not documented in the
+# man page for this version of "magic", nor does it appear to be
+# implemented (at least not after I blew off the bogus code to turn
+# old-style "&"s into new-style "&"s, which just didn't work at all).
+#
+0      short           0575            CLIPPER COFF executable (VAX #)
+>20    short           0407            (impure)
+>20    short           0410            (5.2 compatible)
+>20    short           0411            (pure)
+>20    short           0413            (demand paged)
+>20    short           0443            (target shared library)
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+0      short           0577            CLIPPER COFF executable
+>18    short&074000    000000          C1 R1 
+>18    short&074000    004000          C2 R1
+>18    short&074000    010000          C3 R1
+>18    short&074000    074000          TEST
+>20    short           0407            (impure)
+>20    short           0410            (pure)
+>20    short           0411            (separate I&D)
+>20    short           0413            (paged)
+>20    short           0443            (target shared library)
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>48    long&01         01              alignment trap enabled
+>52    byte            1               -Ctnc
+>52    byte            2               -Ctsw
+>52    byte            3               -Ctpw
+>52    byte            4               -Ctcb
+>53    byte            1               -Cdnc
+>53    byte            2               -Cdsw
+>53    byte            3               -Cdpw
+>53    byte            4               -Cdcb
+>54    byte            1               -Csnc
+>54    byte            2               -Cssw
+>54    byte            3               -Cspw
+>54    byte            4               -Cscb
+4      string          pipe            CLIPPER instruction trace
+4      string          prof            CLIPPER instruction profile
diff --git a/file/Magdir/commands b/file/Magdir/commands
new file mode 100644 (file)
index 0000000..3fe253a
--- /dev/null
@@ -0,0 +1,62 @@
+
+#------------------------------------------------------------------------------
+# commands:  file(1) magic for various shells and interpreters
+#
+0      string          :                       shell archive or script for antique kernel text
+0      string/b        #!\ /bin/sh             Bourne shell script text executable
+0      string/b        #!\ /bin/csh            C shell script text executable
+# korn shell magic, sent by George Wu, gwu@clyde.att.com
+0      string/b        #!\ /bin/ksh            Korn shell script text executable
+0      string/b        #!\ /bin/tcsh           Tenex C shell script text executable
+0      string/b        #!\ /usr/local/tcsh     Tenex C shell script text executable
+0      string/b        #!\ /usr/local/bin/tcsh Tenex C shell script text executable
+
+#
+# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson)
+0      string/b        #!\ /usr/local/bin/zsh  Paul Falstad's zsh script text executable
+0      string/b        #!\ /usr/local/bin/ash  Neil Brown's ash script text executable
+0      string/b        #!\ /usr/local/bin/ae   Neil Brown's ae script text executable
+0      string/b        #!\ /bin/nawk           new awk script text executable
+0      string/b        #!\ /usr/bin/nawk       new awk script text executable
+0      string/b        #!\ /usr/local/bin/nawk new awk script text executable
+0      string/b        #!\ /bin/gawk           GNU awk script text executable
+0      string/b        #!\ /usr/bin/gawk       GNU awk script text executable
+0      string/b        #!\ /usr/local/bin/gawk GNU awk script text executable
+#
+0      string/b        #!\ /bin/awk            awk script text executable
+0      string/b        #!\ /usr/bin/awk        awk script text executable
+0      string          BEGIN                   awk script text
+
+# For Larry Wall's perl language.  The ``eval'' line recognizes an
+# outrageously clever hack for USG systems.
+#                              Keith Waclena <keith@cerberus.uchicago.edu>
+0      string/b        #!\ /bin/perl                   perl script text executable
+0      string          eval\ "exec\ /bin/perl          perl script text
+0      string/b        #!\ /usr/bin/perl               perl script text executable
+0      string          eval\ "exec\ /usr/bin/perl      perl script text
+0      string/b        #!\ /usr/local/bin/perl         perl script text
+0      string          eval\ "exec\ /usr/local/bin/perl        perl script text executable
+
+# AT&T Bell Labs' Plan 9 shell
+0      string/b        #!\ /bin/rc     Plan 9 rc shell script text executable
+
+# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de)
+0      string/b        #!\ /bin/bash   Bourne-Again shell script text executable
+0      string/b        #!\ /usr/local/bin/bash Bourne-Again shell script text executable
+
+# using env
+0      string          #!/usr/bin/env          a
+>15    string          >\0                     %s script text executable
+0      string          #!\ /usr/bin/env        a
+>16    string          >\0                     %s script text executable
+
+
+# generic shell magic
+0      string          #!\ /                   a
+>3     string          >\0                     %s script text executable
+0      string          #!\     /               a
+>3     string          >\0                     %s script text executable
+0      string          #!/                     a
+>2     string          >\0                     %s script text executable
+0      string          #!\                     script text executable
+>3     string          >\0                     for %s
diff --git a/file/Magdir/compress b/file/Magdir/compress
new file mode 100644 (file)
index 0000000..f4fe4a4
--- /dev/null
@@ -0,0 +1,146 @@
+
+#------------------------------------------------------------------------------
+# compress:  file(1) magic for pure-compression formats (no archives)
+#
+# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+
+# standard unix compress
+0      string          \037\235        compress'd data
+>2     byte&0x80       >0              block compressed
+>2     byte&0x1f       x               %d bits
+
+# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
+0       string          \037\213        gzip compressed data
+>2      byte            <8              \b, reserved method,
+>2      byte            8               \b, deflated,
+>3     byte            &0x01           ASCII,
+>3     byte            &0x02           continuation,
+>3     byte            &0x04           extra field,
+>3     byte            &0x08           original filename,
+>>10    string          x               `%s',
+>3     byte            &0x10           comment,
+>3     byte            &0x20           encrypted,
+>4     ledate          x               last modified: %s,
+>8     byte            2               max compression,
+>8     byte            4               max speed,
+>9     byte            =0x00           os: MS-DOS
+>9     byte            =0x01           os: Amiga
+>9     byte            =0x02           os: VMS
+>9     byte            =0x03           os: Unix
+>9     byte            =0x05           os: Atari
+>9     byte            =0x06           os: OS/2
+>9     byte            =0x07           os: MacOS
+>9     byte            =0x0A           os: Tops/20
+>9     byte            =0x0B           os: Win/32
+
+# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis
+0      string          \037\036        packed data
+>2     belong          >1              \b, %d characters originally
+>2     belong          =1              \b, %d character originally
+#
+# This magic number is byte-order-independent.  XXX - Does that mean this
+# is big-endian, little-endian, either, or that you can't tell?
+# this short is valid for SunOS
+0      short           017437          old packed data
+
+# XXX - why *two* entries for "compacted data", one of which is
+# byte-order independent, and one of which is byte-order dependent?
+#
+0      short           0x1fff          compacted data
+# This string is valid for SunOS (BE) and a matching "short" is listed
+# in the Ultrix (LE) magic file.
+0      string          \377\037        compacted data
+0      short           0145405         huf output
+
+# bzip2
+0      string          BZh             bzip2 compressed data
+>3     byte            >47             \b, block size = %c00k
+
+# squeeze and crunch
+# Michael Haardt <michael@cantor.informatik.rwth-aachen.de>
+0      beshort         0x76FF          squeezed data,
+>4     string          x               original name %s
+0      beshort         0x76FE          crunched data,
+>2     string          x               original name %s
+0      beshort         0x76FD          LZH compressed data,
+>2     string          x               original name %s
+
+# Freeze
+0      string          \037\237        frozen file 2.1
+0      string          \037\236        frozen file 1.0 (or gzip 0.5)
+
+# SCO compress -H (LZH)
+0      string          \037\240        SCO compress -H (LZH) data
+
+# European GSM 06.10 is a provisional standard for full-rate speech
+# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
+# excitation/long term prediction) coding at 13 kbit/s.
+#
+# There's only a magic nibble (4 bits); that nibble repeats every 33
+# bytes.  This isn't suited for use, but maybe we can use it someday.
+#
+# This will cause very short GSM files to be declared as data and
+# mismatches to be declared as data too!
+#0     byte&0xF0       0xd0            data
+#>33   byte&0xF0       0xd0
+#>66   byte&0xF0       0xd0
+#>99   byte&0xF0       0xd0
+#>132  byte&0xF0       0xd0            GSM 06.10 compressed audio
+
+# bzip a block-sorting file compressor
+#      by Julian Seward <sewardj@cs.man.ac.uk> and others
+#
+0      string          BZ              bzip compressed data
+>2     byte            x               \b, version: %c
+>3     string          =1              \b, compression block size 100k
+>3     string          =2              \b, compression block size 200k
+>3     string          =3              \b, compression block size 300k
+>3     string          =4              \b, compression block size 400k
+>3     string          =5              \b, compression block size 500k
+>3     string          =6              \b, compression block size 600k
+>3     string          =7              \b, compression block size 700k
+>3     string          =8              \b, compression block size 800k
+>3     string          =9              \b, compression block size 900k
+
+# lzop from <markus.oberhumer@jk.uni-linz.ac.at>
+0      string          \x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a    lzop compressed data
+>9     beshort         <0x0940
+>>9    byte&0xf0       =0x00           - version 0.
+>>9    beshort&0x0fff  x               \b%03x,
+>>13   byte            1               LZO1X-1,
+>>13   byte            2               LZO1X-1(15),
+>>13   byte            3               LZO1X-999,
+## >>22        bedate          >0              last modified: %s,
+>>14   byte            =0x00           os: MS-DOS
+>>14   byte            =0x01           os: Amiga
+>>14   byte            =0x02           os: VMS
+>>14   byte            =0x03           os: Unix
+>>14   byte            =0x05           os: Atari
+>>14   byte            =0x06           os: OS/2
+>>14   byte            =0x07           os: MacOS
+>>14   byte            =0x0A           os: Tops/20
+>>14   byte            =0x0B           os: WinNT
+>>14   byte            =0x0E           os: Win32
+>9     beshort         >0x0939
+>>9    byte&0xf0       =0x00           - version 0.
+>>9    byte&0xf0       =0x10           - version 1.
+>>9    byte&0xf0       =0x20           - version 2.
+>>9    beshort&0x0fff  x               \b%03x,
+>>15   byte            1               LZO1X-1,
+>>15   byte            2               LZO1X-1(15),
+>>15   byte            3               LZO1X-999,
+## >>25        bedate          >0              last modified: %s,
+>>17   byte            =0x00           os: MS-DOS
+>>17   byte            =0x01           os: Amiga
+>>17   byte            =0x02           os: VMS
+>>17   byte            =0x03           os: Unix
+>>17   byte            =0x05           os: Atari
+>>17   byte            =0x06           os: OS/2
+>>17   byte            =0x07           os: MacOS
+>>17   byte            =0x0A           os: Tops/20
+>>17   byte            =0x0B           os: WinNT
+>>17   byte            =0x0E           os: Win32
diff --git a/file/Magdir/console b/file/Magdir/console
new file mode 100644 (file)
index 0000000..f8d2ebb
--- /dev/null
@@ -0,0 +1,122 @@
+#------------------------------------------------------------------------------
+# Console game magic
+# Toby Deshane <hac@shoelace.digivill.net>
+#    ines:  file(1) magic for Marat's iNES Nintendo Entertainment System
+#           ROM dump format
+
+0 string NES\032 iNES ROM dump,
+>4 byte  x     %dx16k PRG
+>5 byte  x     \b, %dx8k CHR
+>6 byte&0x01  =0x1  \b, [Vert.]
+>6 byte&0x01  =0x0  \b, [Horiz.]
+>6 byte&0x02  =0x2  \b, [SRAM]
+>6 byte&0x04  =0x4  \b, [Trainer]
+>6 byte&0x04  =0x8  \b, [4-Scr]
+
+#------------------------------------------------------------------------------
+# gameboy:  file(1) magic for the Nintendo (Color) Gameboy raw ROM format
+#
+0x104 belong 0xCEED6666 Gameboy ROM:
+>0x134 string >\0 "%.16s"
+>0x146 byte 0x03  \b,[SGB]
+>0x147 byte 0x00  \b, [ROM ONLY]
+>0x147 byte 0x01  \b, [ROM+MBC1]
+>0x147 byte 0x02  \b, [ROM+MBC1+RAM]
+>0x147 byte 0x03  \b, [ROM+MBC1+RAM+BATT]
+>0x147 byte 0x05  \b, [ROM+MBC2]
+>0x147 byte 0x06  \b, [ROM+MBC2+BATTERY]
+>0x147 byte 0x08  \b, [ROM+RAM]
+>0x147 byte 0x09  \b, [ROM+RAM+BATTERY]
+>0x147 byte 0x0B  \b, [ROM+MMM01]
+>0x147 byte 0x0C  \b, [ROM+MMM01+SRAM]
+>0x147 byte 0x0D  \b, [ROM+MMM01+SRAM+BATT]
+>0x147 byte 0x0F  \b, [ROM+MBC3+TIMER+BATT]
+>0x147 byte 0x10  \b, [ROM+MBC3+TIMER+RAM+BATT]
+>0x147 byte 0x11  \b, [ROM+MBC3]
+>0x147 byte 0x12  \b, [ROM+MBC3+RAM]
+>0x147 byte 0x13  \b, [ROM+MBC3+RAM+BATT]
+>0x147 byte 0x19  \b, [ROM+MBC5]
+>0x147 byte 0x1A  \b, [ROM+MBC5+RAM]
+>0x147 byte 0x1B  \b, [ROM+MBC5+RAM+BATT]
+>0x147 byte 0x1C  \b, [ROM+MBC5+RUMBLE]
+>0x147 byte 0x1D  \b, [ROM+MBC5+RUMBLE+SRAM]
+>0x147 byte 0x1E  \b, [ROM+MBC5+RUMBLE+SRAM+BATT]
+>0x147 byte 0x1F  \b, [Pocket Camera]
+>0x147 byte 0xFD  \b, [Bandai TAMA5]
+>0x147 byte 0xFE  \b, [Hudson HuC-3]
+>0x147 byte 0xFF  \b, [Hudson HuC-1]
+
+>0x148 byte 0     \b, ROM: 256Kbit
+>0x148 byte 1     \b, ROM: 512Kbit
+>0x148 byte 2     \b, ROM: 1Mbit
+>0x148 byte 3     \b, ROM: 2Mbit
+>0x148 byte 4     \b, ROM: 4Mbit
+>0x148 byte 5     \b, ROM: 8Mbit
+>0x148 byte 6     \b, ROM: 16Mbit
+>0x148 byte 0x52  \b, ROM: 9Mbit
+>0x148 byte 0x53  \b, ROM: 10Mbit
+>0x148 byte 0x54  \b, ROM: 12Mbit
+
+>0x149 byte 1     \b, RAM: 16Kbit
+>0x149 byte 2     \b, RAM: 64Kbit
+>0x149 byte 3     \b, RAM: 128Kbit
+>0x149 byte 4     \b, RAM: 1Mbit
+
+#>0x14e long  x     \b, CRC: %x
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Sega MegaDrive/Genesis raw ROM format
+#
+0x100 string SEGA  Sega MegaDrive/Genesis raw ROM dump
+>0x120 string >\0 Name: "%.16s"
+>0x110 string >\0 %.16s
+>0x1B0 string RA with SRAM
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAGN  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte 0 \b, last in series or standalone
+>2 byte >0 \b, split ROM
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) alternate magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAMG  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte x \b, last in series or standalone
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# smsgg:  file(1) magic for Sega Master System and Game Gear ROM dumps
+#
+# Does not detect all images.  Very preliminary guesswork.  Need more data
+# on format.
+#
+# FIXME: need a little more info...;P
+#
+#0 byte 0xF3
+#>1 byte 0xED  Sega Master System/Game Gear ROM dump
+#>1 byte 0x31  Sega Master System/Game Gear ROM dump
+#>1 byte 0xDB  Sega Master System/Game Gear ROM dump
+#>1 byte 0xAF  Sega Master System/Game Gear ROM dump
+#>1 byte 0xC3  Sega Master System/Game Gear ROM dump
+
+#------------------------------------------------------------------------------
+# dreamcast:  file(1) uncertain magic for the Sega Dreamcast VMU image format
+#
+0 belong 0x21068028   Sega Dreamcast VMU game image
+0 string LCDi         Dream Animator file
+
+#------------------------------------------------------------------------------
+# v64: file(1) uncertain magic for the V64 format N64 ROM dumps
+#
+0 belong 0x37804012    V64 Nintendo 64 ROM dump
+
+#------------------------------------------------------------------------------
+# msx: file(1) magic for MSX game cartridge dumps
+0 beshort 0x4142 MSX game cartridge dump 
diff --git a/file/Magdir/convex b/file/Magdir/convex
new file mode 100644 (file)
index 0000000..b1235d7
--- /dev/null
@@ -0,0 +1,69 @@
+#------------------------------------------------------------------------------
+# convex:  file(1) magic for Convex boxes
+#
+# Convexes are big-endian.
+#
+# /*\
+#  * Below are the magic numbers and tests added for Convex.
+#  * Added at beginning, because they are expected to be used most.
+# \*/
+0      belong  0507    Convex old-style object
+>16    belong  >0      not stripped
+0      belong  0513    Convex old-style demand paged executable
+>16    belong  >0      not stripped
+0      belong  0515    Convex old-style pre-paged executable
+>16    belong  >0      not stripped
+0      belong  0517    Convex old-style pre-paged, non-swapped executable
+>16    belong  >0      not stripped
+0      belong  0x011257        Core file
+#
+# The following are a series of dump format magic numbers.  Each one
+# corresponds to a drastically different dump format.  The first on is
+# the original dump format on a 4.1 BSD or earlier file system.  The
+# second marks the change between the 4.1 file system and the 4.2 file
+# system.  The Third marks the changing of the block size from 1K
+# to 2K to be compatible with an IDC file system.  The fourth indicates
+# a dump that is dependent on Convex Storage Manager, because data in
+# secondary storage is not physically contained within the dump.
+# The restore program uses these number to determine how the data is
+# to be extracted.
+#
+24     belong  =60011  dump format, 4.1 BSD or earlier
+24     belong  =60012  dump format, 4.2 or 4.3 BSD without IDC
+24     belong  =60013  dump format, 4.2 or 4.3 BSD (IDC compatible)
+24     belong  =60014  dump format, Convex Storage Manager by-reference dump
+#
+# what follows is a bunch of bit-mask checks on the flags field of the opthdr.
+# If there is no `=' sign, assume just checking for whether the bit is set?
+#
+0      belong  0601            Convex SOFF
+>88    belong&0x000f0000       =0x00000000     c1
+>88    belong                  &0x00010000     c2
+>88    belong                  &0x00020000     c2mp
+>88    belong                  &0x00040000     parallel
+>88    belong                  &0x00080000     intrinsic
+>88    belong                  &0x00000001     demand paged
+>88    belong                  &0x00000002     pre-paged
+>88    belong                  &0x00000004     non-swapped
+>88    belong                  &0x00000008     POSIX
+#
+>84    belong                  &0x80000000     executable
+>84    belong                  &0x40000000     object
+>84    belong&0x20000000       =0              not stripped
+>84    belong&0x18000000       =0x00000000     native fpmode
+>84    belong&0x18000000       =0x10000000     ieee fpmode
+>84    belong&0x18000000       =0x18000000     undefined fpmode
+#
+0      belong                  0605            Convex SOFF core
+#
+0      belong                  0607            Convex SOFF checkpoint
+>88    belong&0x000f0000       =0x00000000     c1
+>88    belong                  &0x00010000     c2
+>88    belong                  &0x00020000     c2mp
+>88    belong                  &0x00040000     parallel
+>88    belong                  &0x00080000     intrinsic
+>88    belong                  &0x00000008     POSIX
+#
+>84    belong&0x18000000       =0x00000000     native fpmode
+>84    belong&0x18000000       =0x10000000     ieee fpmode
+>84    belong&0x18000000       =0x18000000     undefined fpmode
diff --git a/file/Magdir/ctags b/file/Magdir/ctags
new file mode 100644 (file)
index 0000000..8d43971
--- /dev/null
@@ -0,0 +1,5 @@
+
+# ----------------------------------------------------------------------------
+# ctags:  file (1) magic for Exuberant Ctags files
+# From: Alexander Mai <mai@migdal.ikp.physik.tu-darmstadt.de>
+0       string  !_TAG   Exuberant Ctags tag file
diff --git a/file/Magdir/cvs b/file/Magdir/cvs
new file mode 100644 (file)
index 0000000..2ce9a1a
--- /dev/null
@@ -0,0 +1,6 @@
+#------------------------------------------------------------------------------
+# file(1) magic for cvs(1) files
+# From Hendrik Scholz <hendrik@scholz.net>
+
+0   string /1\ :pserver:    cvs password text file
+
diff --git a/file/Magdir/database b/file/Magdir/database
new file mode 100644 (file)
index 0000000..87ecac7
--- /dev/null
@@ -0,0 +1,74 @@
+
+#------------------------------------------------------------------------------
+# database:  file(1) magic for various databases
+#
+# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
+#
+#
+# GDBM magic numbers
+#  Will be maintained as part of the GDBM distribution in the future.
+#  <downsj@teeny.org>
+0      belong  0x13579ace      GNU dbm 1.x or ndbm database, big endian
+0      lelong  0x13579ace      GNU dbm 1.x or ndbm database, little endian
+0      string  GDBM            GNU dbm 2.x database
+#
+# Berkeley DB
+#
+# Ian Darwin's file /etc/magic files: big/little-endian version.
+#
+# Hash 1.85/1.86 databases store metadata in network byte order.
+# Btree 1.85/1.86 databases store the metadata in host byte order.
+# Hash and Btree 2.X and later databases store the metadata in host byte order.
+
+0      long    0x00061561      Berkeley DB
+>8     belong  4321
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, native byte-order)
+>8     belong  1234
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, little-endian)
+
+0      belong  0x00061561      Berkeley DB
+>8     belong  4321
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, big-endian)
+>8     belong  1234
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, native byte-order)
+
+0      long    0x00053162      Berkeley DB 1.85/1.86
+>4     long    >0              (Btree, version %d, native byte-order)
+0      belong  0x00053162      Berkeley DB 1.85/1.86
+>4     belong  >0              (Btree, version %d, big-endian)
+0      lelong  0x00053162      Berkeley DB 1.85/1.86
+>4     lelong  >0              (Btree, version %d, little-endian)
+
+12     long    0x00061561      Berkeley DB
+>16    long    >0              (Hash, version %d, native byte-order)
+12     belong  0x00061561      Berkeley DB
+>16    belong  >0              (Hash, version %d, big-endian)
+12     lelong  0x00061561      Berkeley DB
+>16    lelong  >0              (Hash, version %d, little-endian)
+
+12     long    0x00053162      Berkeley DB
+>16    long    >0              (Btree, version %d, native byte-order)
+12     belong  0x00053162      Berkeley DB
+>16    belong  >0              (Btree, version %d, big-endian)
+12     lelong  0x00053162      Berkeley DB
+>16    lelong  >0              (Btree, version %d, little-endian)
+
+12     long    0x00042253      Berkeley DB
+>16    long    >0              (Queue, version %d, native byte-order)
+12     belong  0x00042253      Berkeley DB
+>16    belong  >0              (Queue, version %d, big-endian)
+12     lelong  0x00042253      Berkeley DB
+>16    lelong  >0              (Queue, version %d, little-endian)
+#
+#
+# Round Robin Database Tool by Tobias Oetiker <oetiker@ee.ethz.ch>
+0      string  RRD             RRDTool DB
+>4     string  x               version %s
diff --git a/file/Magdir/diamond b/file/Magdir/diamond
new file mode 100644 (file)
index 0000000..1abd01e
--- /dev/null
@@ -0,0 +1,11 @@
+
+#------------------------------------------------------------------------------
+# diamond:  file(1) magic for Diamond system
+#
+# ... diamond is a multi-media mail and electronic conferencing system....
+#
+# XXX - I think it was either renamed Slate, or replaced by Slate....
+#
+#      The full deal is too long...
+#0     string  <list>\n<protocol\ bbn-multimedia-format>       Diamond Multimedia Document
+0      string  =<list>\n<protocol\ bbn-m       Diamond Multimedia Document
diff --git a/file/Magdir/diff b/file/Magdir/diff
new file mode 100644 (file)
index 0000000..81a9b82
--- /dev/null
@@ -0,0 +1,13 @@
+
+#------------------------------------------------------------------------------
+# diff:  file(1) magic for diff(1) output
+#
+0      string          diff\   'diff' output text
+0      string          ***\            'diff' output text
+0      string          Only\ in\       'diff' output text
+0      string          Common\ subdirectories:\        'diff' output text
+
+# xdelta is like diff(1) for binary files (works for text, too).
+# Available from: ftp://ftp.xcf.berkeley.edu/pub/xdelta/
+0       string          %XDZ            xdelta diff file
+>4      string          >%              version %.3s
diff --git a/file/Magdir/digital b/file/Magdir/digital
new file mode 100644 (file)
index 0000000..6a573a6
--- /dev/null
@@ -0,0 +1,41 @@
+#  Digital UNIX - Info
+#
+0      string  !<arch>\n________64E    Alpha archive
+>22    string  X                       -- out of date
+#
+# Alpha COFF Based Executables
+# The stripped stuff really needs to be an 8 byte (64 bit) compare,
+# but this works
+0      leshort         0x183           COFF format alpha
+>22    leshort&020000  &010000         sharable library,
+>22    leshort&020000  ^010000         dynamically linked,
+>24    leshort         0410            pure
+>24    leshort         0413            demand paged
+>8     lelong          >0              executable or object module, not stripped
+>8     lelong          0
+>>12   lelong          0               executable or object module, stripped
+>>12   lelong          >0              executable or object module, not stripped
+>27     byte            >0              - version %d.
+>26     byte            >0              %d-
+>28     leshort         >0              %d
+#
+# The next is incomplete, we could tell more about this format,
+# but its not worth it.
+0      leshort         0x188   Alpha compressed COFF
+0      leshort         0x18f   Alpha u-code object
+#
+#
+# Some other interesting Digital formats,
+0      string  \377\377\177            ddis/ddif
+0      string  \377\377\174            ddis/dots archive
+0      string  \377\377\176            ddis/dtif table data
+0      string  \033c\033               LN03 output
+0      long    04553207                X image
+#
+0      string  !<PDF>!\n               profiling data file
+#
+# Locale data tables (MIPS and Alpha).
+#
+0      short           0x0501          locale data table
+>6     short           0x24            for MIPS
+>6     short           0x40            for Alpha
diff --git a/file/Magdir/dolby b/file/Magdir/dolby
new file mode 100644 (file)
index 0000000..230f738
--- /dev/null
@@ -0,0 +1,57 @@
+# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka@gmx.at>
+# from http://www.atsc.org/standards/a_52a.pdf
+# corrections, additions, etc. are always welcome!
+#
+# syncword
+0       beshort         0x0b77  ATSC A/52 aka AC-3 aka Dolby Digital stream,
+# fscod
+>4      byte&0xc0       0x00    48 kHz,
+>4      byte&0xc0       0x40    44.1 kHz,
+>4      byte&0xc0       0x80    32 kHz,
+# is this one used for 96 kHz?
+>4      byte&0xc0       0xc0    reserved frequency,
+#
+>5     byte&7 = 0              \b, complete main (CM)
+>5     byte&7 = 1              \b, music and effects (ME)
+>5     byte&7 = 2              \b, visually impaired (VI)
+>5     byte&7 = 3              \b, hearing impaired (HI)
+>5     byte&7 = 4              \b, dialogue (D)
+>5     byte&7 = 5              \b, commentary (C)
+>5     byte&7 = 6              \b, emergency (E)
+# acmod
+>6      byte&0xe0       0x00    1+1 front,
+>6      byte&0xe0       0x20    1 front/0 rear,
+>6      byte&0xe0       0x40    2 front/0 rear,
+>6      byte&0xe0       0x60    3 front/0 rear,
+>6      byte&0xe0       0x80    2 front/1 rear,
+>6      byte&0xe0       0xa0    3 front/1 rear,
+>6      byte&0xe0       0xc0    2 front/2 rear,
+>6      byte&0xe0       0xe0    3 front/2 rear,
+# lfeon (these may be incorrect)
+>7      byte&0x40       0x00    LFE off,
+>7      byte&0x40       0x40    LFE on,
+#
+>4     byte&0x3e = 0x00        \b, 32 kbit/s
+>4     byte&0x3e = 0x02        \b, 40 kbit/s
+>4     byte&0x3e = 0x04        \b, 48 kbit/s
+>4     byte&0x3e = 0x06        \b, 56 kbit/s
+>4     byte&0x3e = 0x08        \b, 64 kbit/s
+>4     byte&0x3e = 0x0a        \b, 80 kbit/s
+>4     byte&0x3e = 0x0c        \b, 96 kbit/s
+>4     byte&0x3e = 0x0e        \b, 112 kbit/s
+>4     byte&0x3e = 0x10        \b, 128 kbit/s
+>4     byte&0x3e = 0x12        \b, 160 kbit/s
+>4     byte&0x3e = 0x14        \b, 192 kbit/s
+>4     byte&0x3e = 0x16        \b, 224 kbit/s
+>4     byte&0x3e = 0x18        \b, 256 kbit/s
+>4     byte&0x3e = 0x1a        \b, 320 kbit/s
+>4     byte&0x3e = 0x1c        \b, 384 kbit/s
+>4     byte&0x3e = 0x1e        \b, 448 kbit/s
+>4     byte&0x3e = 0x20        \b, 512 kbit/s
+>4     byte&0x3e = 0x22        \b, 576 kbit/s
+>4     byte&0x3e = 0x24        \b, 640 kbit/s
+# dsurmod (these may be incorrect)
+>6      beshort&0x0180  0x0000  Dolby Surround not indicated
+>6      beshort&0x0180  0x0080  not Dolby Surround encoded
+>6      beshort&0x0180  0x0100  Dolby Surround encoded
+>6      beshort&0x0180  0x0180  reserved Dolby Surround mode
diff --git a/file/Magdir/dump b/file/Magdir/dump
new file mode 100644 (file)
index 0000000..628ead8
--- /dev/null
@@ -0,0 +1,81 @@
+
+#------------------------------------------------------------------------------
+# dump:  file(1) magic for dump file format--for new and old dump filesystems
+#
+# We specify both byte orders in order to recognize byte-swapped dumps.
+#
+24     belong  60012           new-fs dump file (big endian),
+>4     bedate  x               Previous dump %s,
+>8     bedate  x               This dump %s,
+>12    belong  >0              Volume %ld,
+>692   belong  0               Level zero, type:
+>692   belong  >0              Level %d, type:
+>0     belong  1               tape header,
+>0     belong  2               beginning of file record,
+>0     belong  3               map of inodes on tape,
+>0     belong  4               continuation of file record,
+>0     belong  5               end of volume,
+>0     belong  6               map of inodes deleted,
+>0     belong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   belong  >0              Flags %x
+
+24     belong  60011           old-fs dump file (big endian),
+#>4    bedate  x               Previous dump %s,
+#>8    bedate  x               This dump %s,
+>12    belong  >0              Volume %ld,
+>692   belong  0               Level zero, type:
+>692   belong  >0              Level %d, type:
+>0     belong  1               tape header,
+>0     belong  2               beginning of file record,
+>0     belong  3               map of inodes on tape,
+>0     belong  4               continuation of file record,
+>0     belong  5               end of volume,
+>0     belong  6               map of inodes deleted,
+>0     belong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   belong  >0              Flags %x
+
+24     lelong  60012           new-fs dump file (little endian),
+>4     ledate  x               This dump %s,
+>8     ledate  x               Previous dump %s,
+>12    lelong  >0              Volume %ld,
+>692   lelong  0               Level zero, type:
+>692   lelong  >0              Level %d, type:
+>0     lelong  1               tape header,
+>0     lelong  2               beginning of file record,
+>0     lelong  3               map of inodes on tape,
+>0     lelong  4               continuation of file record,
+>0     lelong  5               end of volume,
+>0     lelong  6               map of inodes deleted,
+>0     lelong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   lelong  >0              Flags %x
+
+24     lelong  60011           old-fs dump file (little endian),
+#>4    ledate  x               Previous dump %s,
+#>8    ledate  x               This dump %s,
+>12    lelong  >0              Volume %ld,
+>692   lelong  0               Level zero, type:
+>692   lelong  >0              Level %d, type:
+>0     lelong  1               tape header,
+>0     lelong  2               beginning of file record,
+>0     lelong  3               map of inodes on tape,
+>0     lelong  4               continuation of file record,
+>0     lelong  5               end of volume,
+>0     lelong  6               map of inodes deleted,
+>0     lelong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   lelong  >0              Flags %x
diff --git a/file/Magdir/dyadic b/file/Magdir/dyadic
new file mode 100644 (file)
index 0000000..e8a9d25
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# Dyadic: file(1) magic for Dyalog APL.
+#
+0      byte    0xaa
+>1     byte    <4              Dyalog APL
+>>1    byte    0x00            incomplete workspace
+>>1    byte    0x01            component file
+>>1    byte    0x02            external variable
+>>1    byte    0x03            workspace
+>>2    byte    x               version %d
+>>3    byte    x               .%d
diff --git a/file/Magdir/editors b/file/Magdir/editors
new file mode 100644 (file)
index 0000000..c529d0d
--- /dev/null
@@ -0,0 +1,9 @@
+
+#------------------------------------------------------------------------------
+# T602 editor documents 
+# by David Necas <yeti@physics.muni.cz>
+0      string  @CT\    T602 document data,
+>4     string  0       Kamenicky
+>4     string  1       CP 852
+>4     string  2       KOI8-CS
+>4     string  >2      unknown encoding
diff --git a/file/Magdir/elf b/file/Magdir/elf
new file mode 100644 (file)
index 0000000..53a6bc9
--- /dev/null
@@ -0,0 +1,187 @@
+
+#------------------------------------------------------------------------------
+# elf:  file(1) magic for ELF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# MIPS R3000 may also be for MIPS R2000.
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# updated by Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \177ELF         ELF
+>4     byte            0               invalid class
+>4     byte            1               32-bit
+# only for MIPS
+>>18   beshort         8
+>>18   beshort         10
+>>>36   belong          &0x20           N32
+>4     byte            2               64-bit
+>5     byte            0               invalid byte order
+>5     byte            1               LSB
+# only for MIPS R3000_BE
+>>18    leshort                8
+# only for 32-bit
+>>>4   byte            1
+>>>>36  lelong&0xf0000000       0x00000000      mips-1
+>>>>36  lelong&0xf0000000       0x10000000      mips-2
+>>>>36  lelong&0xf0000000       0x20000000      mips-3
+>>>>36  lelong&0xf0000000       0x30000000      mips-4
+>>>>36  lelong&0xf0000000       0x40000000      mips-5
+>>>>36  lelong&0xf0000000       0x50000000      mips-6
+# only for 64-bit
+>>>4   byte            2
+>>>>48  lelong&0xf0000000       0x00000000      mips-1
+>>>>48  lelong&0xf0000000       0x10000000      mips-2
+>>>>48  lelong&0xf0000000       0x20000000      mips-3
+>>>>48  lelong&0xf0000000       0x30000000      mips-4
+>>>>48  lelong&0xf0000000       0x40000000      mips-5
+>>>>48  lelong&0xf0000000       0x50000000      mips-6
+>>16   leshort         0               no file type,
+>>16   leshort         1               relocatable,
+>>16   leshort         2               executable,
+>>16   leshort         3               shared object,
+# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
+>>16   leshort         4               core file
+>>>(0x38+0xcc) string  >\0             of '%s'
+>>>(0x38+0x10) lelong  >0              (signal %d),
+>>16   leshort         &0xff00         processor-specific,
+>>18   leshort         0               no machine,
+>>18   leshort         1               AT&T WE32100 - invalid byte order,
+>>18   leshort         2               SPARC - invalid byte order,
+>>18   leshort         3               Intel 80386,
+>>18   leshort         4               Motorola 68000 - invalid byte order,
+>>18   leshort         5               Motorola 88000 - invalid byte order,
+>>18   leshort         6               Intel 80486,
+>>18   leshort         7               Intel 80860,
+# "officially" big endian, but binutils bfd only emits magic #8 for MIPS.
+>>18   leshort         8               MIPS R3000_LE [bfd bug],
+>>18   leshort         9               Amdahl - invalid byte order,
+>>18   leshort         10              MIPS R3000_LE,
+>>18   leshort         11              RS6000 - invalid byte order,
+>>18   leshort         15              PA-RISC - invalid byte order,
+>>>50  leshort         0x0214          2.0
+>>>48  leshort         &0x0008         (LP64),
+>>18   leshort         16              nCUBE,
+>>18   leshort         17              Fujitsu VPP500,
+>>18   leshort         18              SPARC32PLUS,
+>>18   leshort         20              PowerPC,
+>>18   leshort         36              NEC V800,
+>>18   leshort         37              Fujitsu FR20,
+>>18   leshort         38              TRW RH-32,
+>>18   leshort         39              Motorola RCE,
+>>18   leshort         40              ARM,
+>>18   leshort         41              Alpha,
+>>18   leshort         42              Hitachi SH,
+>>18   leshort         43              SPARC V9 - invalid byte order,
+>>18   leshort         44              Siemens Tricore Embedded Processor,
+>>18   leshort         45              Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18   leshort         46              Hitachi H8/300,
+>>18   leshort         47              Hitachi H8/300H,
+>>18   leshort         48              Hitachi H8S,
+>>18   leshort         49              Hitachi H8/500,
+>>18   leshort         50              IA-64 (Intel 64 bit architecture)
+>>18   leshort         51              Stanford MIPS-X,
+>>18   leshort         52              Motorola Coldfire,
+>>18   leshort         53              Motorola M68HC12,
+>>18   leshort         62              AMD x86-64,
+>>18   leshort         75              Digital VAX,
+>>18   leshort         0x9026          Alpha (unofficial),
+>>20   lelong          0               invalid version
+>>20   lelong          1               version 1
+>>36   lelong          1               MathCoPro/FPU/MAU Required
+>5     byte            2               MSB
+# only for MIPS R3000_BE
+>>18    beshort                8
+# only for 32-bit
+>>>4   byte            1
+>>>>36  belong&0xf0000000       0x00000000      mips-1
+>>>>36  belong&0xf0000000       0x10000000      mips-2
+>>>>36  belong&0xf0000000       0x20000000      mips-3
+>>>>36  belong&0xf0000000       0x30000000      mips-4
+>>>>36  belong&0xf0000000       0x40000000      mips-5
+>>>>36  belong&0xf0000000       0x50000000      mips-6
+# only for 64-bit
+>>>4   byte            2
+>>>>48  belong&0xf0000000       0x00000000      mips-1
+>>>>48  belong&0xf0000000       0x10000000      mips-2
+>>>>48  belong&0xf0000000       0x20000000      mips-3
+>>>>48  belong&0xf0000000       0x30000000      mips-4
+>>>>48  belong&0xf0000000       0x40000000      mips-5
+>>>>48  belong&0xf0000000       0x50000000      mips-6
+>>16   beshort         0               no file type,
+>>16   beshort         1               relocatable,
+>>16   beshort         2               executable,
+>>16   beshort         3               shared object,
+>>16   beshort         4               core file,
+>>>(0x38+0xcc) string  >\0             of '%s'
+>>>(0x38+0x10) belong  >0              (signal %d),
+>>16   beshort         &0xff00         processor-specific,
+>>18   beshort         0               no machine,
+>>18   beshort         1               AT&T WE32100,
+>>18   beshort         2               SPARC,
+>>18   beshort         3               Intel 80386 - invalid byte order,
+>>18   beshort         4               Motorola 68000,
+>>18   beshort         5               Motorola 88000,
+>>18   beshort         6               Intel 80486 - invalid byte order,
+>>18   beshort         7               Intel 80860,
+>>18   beshort         8               MIPS R3000_BE,
+>>18   beshort         9               Amdahl,
+>>18   beshort         10              MIPS R3000_LE - invalid byte order,
+>>18   beshort         11              RS6000,
+>>18   beshort         15              PA-RISC
+>>>50  beshort         0x0214          2.0
+>>>48  beshort         &0x0008         (LP64)
+>>18   beshort         16              nCUBE,
+>>18   beshort         17              Fujitsu VPP500,
+>>18   beshort         18              SPARC32PLUS,
+>>>36  belong&0xffff00 &0x000100       V8+ Required,
+>>>36  belong&0xffff00 &0x000200       Sun UltraSPARC1 Extensions Required,
+>>>36  belong&0xffff00 &0x000400       HaL R1 Extensions Required,
+>>>36  belong&0xffff00 &0x000800       Sun UltraSPARC3 Extensions Required,
+>>18   beshort         20              PowerPC or cisco 4500,
+>>18   beshort         21              cisco 7500,
+>>18   beshort         24              cisco SVIP,
+>>18   beshort         25              cisco 7200,
+>>18   beshort         36              NEC V800 or cisco 12000,
+>>18   beshort         37              Fujitsu FR20,
+>>18   beshort         38              TRW RH-32,
+>>18   beshort         39              Motorola RCE,
+>>18   beshort         40              ARM,
+>>18   beshort         41              Alpha,
+>>18   beshort         42              Hitachi SH,
+>>18   beshort         43              SPARC V9,
+>>18   beshort         44              Siemens Tricore Embedded Processor,
+>>18   beshort         45              Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18   beshort         46              Hitachi H8/300,
+>>18   beshort         47              Hitachi H8/300H,
+>>18   beshort         48              Hitachi H8S,
+>>18   beshort         49              Hitachi H8/500,
+>>18   beshort         50              Intel Merced Processor,
+>>18   beshort         51              Stanford MIPS-X,
+>>18   beshort         52              Motorola Coldfire,
+>>18   beshort         53              Motorola M68HC12,
+>>18   beshort         73              Cray NV1,
+>>18   beshort         75              Digital VAX,
+>>18   beshort         0x9026          Alpha (unofficial),
+>>20   belong          0               invalid version
+>>20   belong          1               version 1
+>>36   belong          1               MathCoPro/FPU/MAU Required
+>8     string          >\0             (%s)
+>8     string          \0
+>>7    byte            0               (SYSV)
+>>7    byte            1               (HP-UX)
+>>7    byte            2               (NetBSD)
+>>7    byte            3               (GNU/Linux)
+>>7    byte            4               (GNU/Hurd)
+>>7    byte            5               (86Open)
+>>7    byte            6               (Solaris)
+>>7    byte            7               (Monterey)
+>>7    byte            8               (IRIX)
+>>7    byte            9               (FreeBSD)
+>>7    byte            10              (Tru64)
+>>7    byte            11              (Novell Modesto)
+>>7    byte            12              (OpenBSD)
+>>7    byte            97              (ARM)
+>>7    byte            255             (embedded)
diff --git a/file/Magdir/encore b/file/Magdir/encore
new file mode 100644 (file)
index 0000000..63cb5d4
--- /dev/null
@@ -0,0 +1,21 @@
+
+#------------------------------------------------------------------------------
+# encore:  file(1) magic for Encore machines
+#
+# XXX - needs to have the byte order specified (NS32K was little-endian,
+# dunno whether they run the 88K in little-endian mode or not).
+#
+0      short           0x154           Encore
+>20    short           0x107           executable
+>20    short           0x108           pure executable
+>20    short           0x10b           demand-paged executable
+>20    short           0x10f           unsupported executable
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>22    short           0               -
+#>4    date            x               stamp %s
+0      short           0x155           Encore unsupported executable
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>22    short           0               -
+#>4    date            x               stamp %s
diff --git a/file/Magdir/epoc b/file/Magdir/epoc
new file mode 100644 (file)
index 0000000..29bd947
--- /dev/null
@@ -0,0 +1,10 @@
+
+#------------------------------------------------------------------------------
+# Epoc 32 : file(1) magic for Epoc Documents [psion/osaris
+# Stefan Praszalowicz (hpicollo@worldnet.fr)
+#0     lelong          0x10000037      Epoc32
+>4     lelong          0x1000006D
+>>8    lelong          0x1000007F      Word
+>>8    lelong          0x10000088      Sheet
+>>8    lelong          0x1000007D      Sketch
+>>8    lelong          0x10000085      TextEd
diff --git a/file/Magdir/filesystems b/file/Magdir/filesystems
new file mode 100644 (file)
index 0000000..20600c6
--- /dev/null
@@ -0,0 +1,118 @@
+
+#------------------------------------------------------------------------------
+# filesystems:  file(1) magic for different filesystems
+#
+0      string  \366\366\366\366        PC formatted floppy with no filesystem
+# Sun disk labels
+# From /usr/include/sun/dklabel.h:
+0774   beshort         0xdabe          Sun disk label
+>0     string          x               '%s
+>>31   string          >\0             \b%s
+>>>63          string          >\0             \b%s
+>>>>95         string          >\0             \b%s
+>0     string          x               \b'
+>0734  short           >0              %d rpm,
+>0736  short           >0              %d phys cys,
+>0740  short           >0              %d alts/cyl,
+>0746  short           >0              %d interleave,
+>0750  short           >0              %d data cyls,
+>0752  short           >0              %d alt cyls,
+>0754  short           >0              %d heads/partition,
+>0756  short           >0              %d sectors/track,
+>0764  long            >0              start cyl %ld,
+>0770  long            x               %ld blocks
+# Is there a boot block written 1 sector in?
+>512    belong&077777777       0600407 \b, boot block present
+0x1FE  leshort 0xAA55                  x86 boot sector
+>2     string  OSBS                    \b, OS/BS MBR
+>0x8C  string  Invalid\ partition\ table       \b, MS-DOS MBR
+>0     string  \0\0\0\0                \b, extended partition table
+>0     leshort 0x3CEB                  \b, system
+>>3    string  >\0                     %s
+>>0x36 string  FAT                     \b, %s
+>>>0x39        string  12                      (%s bit)
+>>>0x39        string  16                      (%s bit)
+>0x52  string  FAT32                   \b, FAT (32 bit)
+>>>43  string          >NO\ NAME       label: %.11s,
+>>>43  string          <NO\ NAME       label: %.11s,
+>>>43  string          NO\ NAME        unlabeled,
+>>>19  leshort         >0              %d sectors
+>>>19  leshort         0               
+>>>>32 lelong          x               %d sectors
+>0x200 lelong  0x82564557              \b, BSD disklabel
+
+# Minix filesystems - Juan Cespedes <cespedes@debian.org>
+0x410  leshort         0x137f          Minix filesystem
+0x410  leshort         0x138f          Minix filesystem, 30 char names
+0x410  leshort         0x2468          Minix filesystem, version 2
+0x410  leshort         0x2478          Minix filesystem, version 2, 30 char names
+
+# romfs filesystems - Juan Cespedes <cespedes@debian.org>
+0      string          -rom1fs-\0      romfs filesystem, version 1
+>8     belong  x                       %d bytes,
+>16    string  x                       named %s.
+
+# netboot image - Juan Cespedes <cespedes@debian.org>
+0      lelong          0x1b031336L     Netboot image,
+>4     lelong&0xFFFFFF00       0
+>>4    lelong&0x100    0x000           mode 2
+>>4    lelong&0x100    0x100           mode 3
+>4     lelong&0xFFFFFF00       !0      unknown mode
+
+0x18b  string  OS/2    OS/2 Boot Manager
+
+9564   lelong          0x00011954      Unix Fast File system (little-endian),
+>8404  string          x               last mounted on %s,
+#>9504 ledate          x               last checked at %s,
+>8224  ledate          x               last written at %s,
+>8401  byte            x               clean flag %d,
+>8228  lelong          x               number of blocks %d,
+>8232  lelong          x               number of data blocks %d,
+>8236  lelong          x               number of cylinder groups %d,
+>8240  lelong          x               block size %d,
+>8244  lelong          x               fragment size %d,
+>8252  lelong          x               minimum percentage of free blocks %d,
+>8256  lelong          x               rotational delay %dms,
+>8260  lelong          x               disk rotational speed %drps,
+>8320  lelong          0               TIME optimization
+>8320  lelong          1               SPACE optimization
+
+9564   belong          0x00011954      Unix Fast File system (big-endian),
+>8404  string          x               last mounted on %s,
+#>9504 bedate          x               last checked at %s,
+>8224  bedate          x               last written at %s,
+>8401  byte            x               clean flag %d,
+>8228  belong          x               number of blocks %d,
+>8232  belong          x               number of data blocks %d,
+>8236  belong          x               number of cylinder groups %d,
+>8240  belong          x               block size %d,
+>8244  belong          x               fragment size %d,
+>8252  belong          x               minimum percentage of free blocks %d,
+>8256  belong          x               rotational delay %dms,
+>8260  belong          x               disk rotational speed %drps,
+>8320  belong          0               TIME optimization
+>8320  belong          1               SPACE optimization
+
+# ext2/ext3 filesystems - Andreas Dilger <adilger@turbolabs.com>
+0x438  leshort         0xEF53          Linux
+>0x44c lelong          x               rev %d
+>0x43e leshort         x               \b.%d
+>0x45c lelong          ^0x0000004      ext2 filesystem data
+>>0x43a        leshort         ^0x0000001      (mounted or unclean)
+>0x45c lelong          &0x0000004      ext3 filesystem data
+>>0x460        lelong          &0x0000004      (needs journal recovery)
+>0x43a leshort         &0x0000002      (errors)
+>0x460 lelong          &0x0000001      (compressed)
+#>0x460        lelong          &0x0000002      (filetype)
+#>0x464        lelong          &0x0000001      (sparse_super)
+>0x464 lelong          &0x0000002      (large files)
+
+# SGI disk labels - Nathan Scott <nathans@debian.org>
+0      belong          0x0BE5A941      SGI disk label (volume header)
+
+# SGI XFS filesystem - Nathan Scott <nathans@debian.org>
+0      belong          0x58465342      SGI XFS filesystem data
+>0x4   belong          x               (blksz=3D%d,
+>0x68  beshort         x               inosz=3D%d,
+>0x64  beshort         ^0x2004         v1 dirs)
+>0x64  beshort         &0x2004         v2 dirs)
diff --git a/file/Magdir/flash b/file/Magdir/flash
new file mode 100644 (file)
index 0000000..1d6f7b7
--- /dev/null
@@ -0,0 +1,10 @@
+
+#------------------------------------------------------------------------------
+# flash:       file(1) magic for Macromedia Flash file format
+#
+# See
+#
+#      http://www.macromedia.com/software/flash/open/
+#
+0      string          FWS             Macromedia Flash data,
+>3     byte            x               version %d
diff --git a/file/Magdir/fonts b/file/Magdir/fonts
new file mode 100644 (file)
index 0000000..d0dc225
--- /dev/null
@@ -0,0 +1,51 @@
+
+#------------------------------------------------------------------------------
+# fonts:  file(1) magic for font data
+#
+0      string          FONT            ASCII vfont text
+0      short           0436            Berkeley vfont data
+0      short           017001          byte-swapped Berkeley vfont data
+
+# PostScript fonts (must precede "printer" entries), quinlan@yggdrasil.com
+0      string          %!PS-AdobeFont-1.0      PostScript Type 1 font text
+>20    string          >\0                     (%s)
+6      string          %!PS-AdobeFont-1.0      PostScript Type 1 font program data
+
+# X11 font files in SNF (Server Natural Format) format
+0      belong          00000004                X11 SNF font data, MSB first
+0      lelong          00000004                X11 SNF font data, LSB first
+
+# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          STARTFONT\040           X11 BDF font text
+
+# X11 fonts, from Daniel Quinlan (quinlan@yggdrasil.com)
+# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides)
+0      string          \001fcp                 X11 Portable Compiled Font data
+>12    byte            0x02                    \b, LSB first
+>12    byte            0x0a                    \b, MSB first
+0      string          D1.0\015                X11 Speedo font data
+
+#------------------------------------------------------------------------------
+# FIGlet fonts and controlfiles
+# From figmagic supplied with Figlet version 2.2
+# "David E. O'Brien" <obrien@FreeBSD.ORG>
+0      string          flf             FIGlet font
+>3     string          >2a             version %-2.2s
+0      string          flc             FIGlet controlfile
+>3     string          >2a             version %-2.2s
+
+# libGrx graphics lib fonts, from Albert Cahalan (acahalan@cs.uml.edu)
+# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++
+0      belong          0x14025919      libGrx font data,
+>8     leshort         x               %dx
+>10    leshort         x               \b%d
+>40    string          x               %s
+# Misc. DOS VGA fonts, from Albert Cahalan (acahalan@cs.uml.edu)
+0      belong          0xff464f4e      DOS code page font data collection
+7      belong          0x00454741      DOS code page font data
+7      belong          0x00564944      DOS code page font data (from Linux?)
+4098   string          DOSFONT         DOSFONT2 encrypted font data
+
+# downloadable fonts for browser (prints type) anthon@mnt.org
+0      string          PFR1            PFR1 font
+>102   string          >0              \b: %s
diff --git a/file/Magdir/frame b/file/Magdir/frame
new file mode 100644 (file)
index 0000000..1b397df
--- /dev/null
@@ -0,0 +1,38 @@
+
+#------------------------------------------------------------------------------
+# frame:  file(1) magic for FrameMaker files
+#
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
+#
+0      string          \<MakerFile     FrameMaker document
+>11    string          5.5              (5.5
+>11    string          5.0              (5.0
+>11    string          4.0              (4.0
+>11    string          3.0              (3.0
+>11    string          2.0              (2.0
+>11    string          1.0              (1.0
+>14    byte            x                 %c)
+0      string          \<MIFFile       FrameMaker MIF (ASCII) file
+>9     string          4.0              (4.0)
+>9     string          3.0              (3.0)
+>9     string          2.0              (2.0)
+>9     string          1.0              (1.x)
+0      string          \<MakerDictionary       FrameMaker Dictionary text
+>17    string          3.0              (3.0)
+>17    string          2.0              (2.0)
+>17    string          1.0              (1.x)
+0      string          \<MakerScreenFont       FrameMaker Font file
+>17    string          1.01             (%s)
+0      string          \<MML           FrameMaker MML file
+0      string          \<BookFile      FrameMaker Book file
+>10    string          3.0              (3.0
+>10    string          2.0              (2.0
+>10    string          1.0              (1.0
+>13    byte            x                 %c)
+# XXX - this book entry should be verified, if you find one, uncomment this
+#0     string          \<Book\         FrameMaker Book (ASCII) file
+#>6    string          3.0              (3.0)
+#>6    string          2.0              (2.0)
+#>6    string          1.0              (1.0)
+0      string          \<Maker Intermediate Print File FrameMaker IPL file
diff --git a/file/Magdir/freebsd b/file/Magdir/freebsd
new file mode 100644 (file)
index 0000000..ee710fa
--- /dev/null
@@ -0,0 +1,143 @@
+
+#------------------------------------------------------------------------------
+# freebsd:  file(1) magic for FreeBSD objects
+#
+# All new-style FreeBSD magic numbers are in host byte order (i.e.,
+# little-endian on x86).
+#
+# XXX - this comes from the file "freebsd" in a recent FreeBSD version of
+# "file"; it, and the NetBSD stuff in "netbsd", appear to use different
+# schemes for distinguishing between executable images, shared libraries,
+# and object files.
+#
+# FreeBSD says:
+#
+#    Regardless of whether it's pure, demand-paged, or none of the
+#    above:
+#
+#      if the entry point is < 4096, then it's a shared library if
+#      the "has run-time loader information" bit is set, and is
+#      position-independent if the "is position-independent" bit
+#      is set;
+#
+#      if the entry point is >= 4096 (or >4095, same thing), then it's
+#      an executable, and is dynamically-linked if the "has run-time
+#      loader information" bit is set.
+#
+# On x86, NetBSD says:
+#
+#    If it's neither pure nor demand-paged:
+#
+#      if it has the "has run-time loader information" bit set, it's
+#      a dynamically-linked executable;
+#
+#      if it doesn't have that bit set, then:
+#
+#          if it has the "is position-independent" bit set, it's
+#          position-independent;
+#
+#          if the entry point is non-zero, it's an executable, otherwise
+#          it's an object file.
+#
+#    If it's pure:
+#
+#      if it has the "has run-time loader information" bit set, it's
+#      a dynamically-linked executable, otherwise it's just an
+#      executable.
+#
+#    If it's demand-paged:
+#
+#      if it has the "has run-time loader information" bit set,
+#      then:
+#
+#          if the entry point is < 4096, it's a shared library;
+#
+#          if the entry point is = 4096 or > 4096 (i.e., >= 4096),
+#          it's a dynamically-linked executable);
+#
+#      if it doesn't have the "has run-time loader information" bit
+#      set, then it's just an executable.
+#
+# (On non-x86, NetBSD does much the same thing, except that it uses
+# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K
+# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's
+# had 8K pages; dunno about MIPS.)
+#
+# I suspect the two will differ only in perverse and uninteresting cases
+# ("shared" libraries that aren't demand-paged and whose pages probably
+# won't actually be shared, executables with entry points <4096).
+#
+# I leave it to those more familiar with FreeBSD and NetBSD to figure out
+# what the right answer is (although using ">4095", FreeBSD-style, is
+# probably better than separately checking for "=4096" and ">4096",
+# NetBSD-style).  (The old "netbsd" file analyzed FreeBSD demand paged
+# executables using the NetBSD technique.)
+#
+0      lelong&0377777777       041400407       FreeBSD/i386
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+0      lelong&0377777777       041400410       FreeBSD/i386 pure
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+0      lelong&0377777777       041400413       FreeBSD/i386 demand paged
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+0      lelong&0377777777       041400314       FreeBSD/i386 compact demand paged
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+# XXX gross hack to identify core files
+# cores start with a struct tss; we take advantage of the following:
+# byte 7:     highest byte of the kernel stack pointer, always 0xfe
+#      8/9:   kernel (ring 0) ss value, always 0x0010
+#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0
+#      28:    low order byte of the current PTD entry, always 0 since the
+#             PTD is page-aligned
+#
+7      string  \357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0        FreeBSD/i386 a.out core file
+>1039  string  >\0     from '%s'
+
+# /var/run/ld.so.hints
+# What are you laughing about?
+0      lelong                  011421044151    ld.so hints file (Little Endian
+>4     lelong                  >0              \b, version %d)
+>4     belong                  <=0             \b)
+0      belong                  011421044151    ld.so hints file (Big Endian
+>4     belong                  >0              \b, version %d)
+>4     belong                  <=0             \b)
+
+#
+# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities
+#
+0      string  SCRSHOT_        scrshot(1) screenshot,
+>8     byte    x               version %d,
+>9     byte    2               %d bytes in header,
+>>10   byte    x               %d chars wide by
+>>11   byte    x               %d chars high
diff --git a/file/Magdir/fsav b/file/Magdir/fsav
new file mode 100644 (file)
index 0000000..4218936
--- /dev/null
@@ -0,0 +1,27 @@
+
+#------------------------------------------------------------------------------
+# fsav:  file(1) magic for datafellows fsav virus definition files
+# Anthon van der Neut (anthon@mnt.org)
+0      beshort         0x1575          fsav (linux) macro virus
+>8     leshort         >0              (%d-
+>11    byte            >0              \b%02d-
+>10    byte            >0              \b%02d)
+
+# comment this out for now because it regognizes every file where
+# the eighth character is \n
+#8     byte            0x0a
+#>12   byte            0x07
+#>11   leshort         >0              fsav (linux) virus (%d-
+#>10   byte            0               \b01-
+#>10   byte            1               \b02-
+#>10   byte            2               \b03-
+#>10   byte            3               \b04-
+#>10   byte            4               \b05-
+#>10   byte            5               \b06-
+#>10   byte            6               \b07-
+#>10   byte            7               \b08-
+#>10   byte            8               \b08-
+#>10   byte            9               \b10-
+#>10   byte            10              \b11-
+#>10   byte            11              \b12-
+#>9    byte            >0              \b%02d)
diff --git a/file/Magdir/gimp b/file/Magdir/gimp
new file mode 100644 (file)
index 0000000..9a9d61e
--- /dev/null
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+# GIMP Gradient: file(1) magic for the GIMP's gradient data files
+# by Federico Mena <federico@nuclecu.unam.mx>
+
+0       string          GIMP\ Gradient  GIMP gradient data
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the XCF image format used in the GIMP developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega@vt.edu)
+
+0      string          gimp\ xcf       GIMP XCF image data,
+>9     string          file            version 0,
+>9     string          v               version
+>>10   string          >\0             %s,
+>14    belong          x               %lu x
+>18    belong          x               %lu,
+>22     belong          0               RGB Color
+>22     belong          1               Greyscale
+>22     belong          2               Indexed Color
+>22    belong          >2              Unknown Image Type.
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the patterns used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega@vt.edu)
+
+20      string          GPAT            GIMP pattern data,
+>24     string          x               %s
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the brushes used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega@vt.edu)
+
+20      string          GIMP            GIMP brush data
diff --git a/file/Magdir/gnu b/file/Magdir/gnu
new file mode 100644 (file)
index 0000000..a385fc9
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# GNU nlsutils message catalog file format
+#
+0      string          \336\22\4\225   GNU message catalog (little endian),
+>4     lelong          x               revision %d,
+>8     lelong          x               %d messages
+0      string          \225\4\22\336   GNU message catalog (big endian),
+>4     belong          x               revision %d,
+>8     belong          x               %d messages
+# message catalogs, from Mitchum DSouza <m.dsouza@mrc-apu.cam.ac.uk>
+0      string          *nazgul*        Nazgul style compiled message catalog
+>8     lelong          >0              \b, version %ld
diff --git a/file/Magdir/grace b/file/Magdir/grace
new file mode 100644 (file)
index 0000000..a5f1433
--- /dev/null
@@ -0,0 +1,20 @@
+
+#------------------------------------------------------------------------------
+# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+#
+# ACE/gr binary
+0      string  \000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003             old ACE/gr binary file
+>39    byte    >0                      - version %c
+# ACE/gr ascii
+0      string  #\ xvgr\ parameter\ file        ACE/gr ascii file
+0      string  #\ xmgr\ parameter\ file        ACE/gr ascii file
+0      string  #\ ACE/gr\ parameter\ file      ACE/gr ascii file
+# Grace projects
+0      string  #\ Grace\ project\ file         Grace project file
+>23    string  @version\                       (version
+>>32   byte    >0                              %c
+>>33   string  >\0                             \b.%.2s
+>>35   string  >\0                             \b.%.2s)
+# ACE/gr fit description files
+0      string  #\ ACE/gr\ fit\ description\    ACE/gr fit description file
+# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
diff --git a/file/Magdir/gringotts b/file/Magdir/gringotts
new file mode 100644 (file)
index 0000000..2d135f8
--- /dev/null
@@ -0,0 +1,25 @@
+
+#------------------------------------------------------------------------------
+# gringotts:  file(1) magic for Gringotts
+# http://devel.pluto.linux.it/projects/Gringotts/
+# author: Germano Rizzo <mano@pluto.linux.it>
+#GRG2????Y
+0      string  GRG             Gringotts data file
+>3     string          1               v.1, SERPENT crypt, SHA-256 hash, ZLib lvl.9
+>3     string          2               v.2,
+>>8    byte&0x70       0x00            RIJNDAEL-128 crypt,
+>>8    byte&0x70       0x10            SERPENT crypt,
+>>8    byte&0x70       0x20            TWOFISH crypt, 
+>>8    byte&0x70       0x30            CAST-256 crypt,
+>>8    byte&0x70       0x40            SAFER+ crypt,
+>>8    byte&0x70       0x50            LOKI97 crypt,
+>>8    byte&0x70       0x60            3DES crypt,
+>>8    byte&0x70       0x70            RIJNDAEL-256 crypt,
+>>8    byte&0x08       0x00            SHA1 hash,
+>>8    byte&0x08       0x08            RIPEMD-160 hash,
+>>8    byte&0x04       0x00            ZLib
+>>8    byte&0x04       0x04            BZip2
+>>8    byte&0x03       0x00            lvl.0
+>>8    byte&0x03       0x01            lvl.3
+>>8    byte&0x03       0x02            lvl.6
+>>8    byte&0x03       0x03            lvl.9
diff --git a/file/Magdir/hitachi-sh b/file/Magdir/hitachi-sh
new file mode 100644 (file)
index 0000000..136c038
--- /dev/null
@@ -0,0 +1,18 @@
+
+#------------------------------------------------------------------------------
+# hitach-sh: file(1) magic for Hitachi Super-H
+#
+# Super-H COFF
+#
+0      beshort         0x0500          Hitachi SH big-endian COFF
+>18    beshort&0x0002  =0x0000         object
+>18    beshort&0x0002  =0x0002         executable
+>18    beshort&0x0008  =0x0000         \b, stripped
+>18    beshort&0x0008  =0x0008         \b, not stripped
+#
+0      leshort         0x0550          Hitachi SH little-endian COFF
+>18    leshort&0x0002  =0x0000         object
+>18    leshort&0x0002  =0x0002         executable
+>18    leshort&0x0008  =0x0000         \b, stripped
+>18    leshort&0x0008  =0x0008         \b, not stripped
+
diff --git a/file/Magdir/hp b/file/Magdir/hp
new file mode 100644 (file)
index 0000000..60574b5
--- /dev/null
@@ -0,0 +1,391 @@
+
+#------------------------------------------------------------------------------
+# hp:  file(1) magic for Hewlett Packard machines (see also "printer")
+#
+# XXX - somebody should figure out whether any byte order needs to be
+# applied to the "TML" stuff; I'm assuming the Apollo stuff is
+# big-endian as it was mostly 68K-based.
+#
+# I think the 500 series was the old stack-based machines, running a
+# UNIX environment atop the "SUN kernel"; dunno whether it was
+# big-endian or little-endian.
+#
+# Daniel Quinlan (quinlan@yggdrasil.com): hp200 machines are 68010 based;
+# hp300 are 68020+68881 based; hp400 are also 68k.  The following basic
+# HP magic is useful for reference, but using "long" magic is a better
+# practice in order to avoid collisions.
+#
+# Guy Harris (guy@netapp.com): some additions to this list came from
+# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1,
+# 1.2, and 2.0).  The 1.2 and 2.0 stuff isn't in the HP-UX 10.0
+# "/etc/magic", though, except for the "archive file relocatable library"
+# stuff, and the 68030 and 68040 stuff isn't there at all - are they not
+# used in executables, or have they just not yet updated "/etc/magic"
+# completely?
+#
+# 0    beshort         200             hp200 (68010) BSD binary
+# 0    beshort         300             hp300 (68020+68881) BSD binary
+# 0    beshort         0x20c           hp200/300 HP-UX binary
+# 0    beshort         0x20d           hp400 (68030) HP-UX binary
+# 0    beshort         0x20e           hp400 (68040?) HP-UX binary
+# 0    beshort         0x20b           PA-RISC1.0 HP-UX binary
+# 0    beshort         0x210           PA-RISC1.1 HP-UX binary
+# 0    beshort         0x211           PA-RISC1.2 HP-UX binary
+# 0    beshort         0x214           PA-RISC2.0 HP-UX binary
+
+#
+# The "misc" stuff needs a byte order; the archives look suspiciously
+# like the old 177545 archives (0xff65 = 0177545).
+#
+#### Old Apollo stuff
+0      beshort         0627            Apollo m68k COFF executable
+>18    beshort         ^040000         not stripped
+>22    beshort         >0              - version %ld
+0      beshort         0624            apollo a88k COFF executable
+>18    beshort         ^040000         not stripped
+>22    beshort         >0              - version %ld
+0       long            01203604016     TML 0123 byte-order format
+0       long            01702407010     TML 1032 byte-order format
+0       long            01003405017     TML 2301 byte-order format
+0       long            01602007412     TML 3210 byte-order format
+#### PA-RISC 1.1
+0      belong          0x02100106      PA-RISC1.1 relocatable object
+0      belong          0x02100107      PA-RISC1.1 executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x02100108      PA-RISC1.1 shared executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x0210010b      PA-RISC1.1 demand-load executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x0210010e      PA-RISC1.1 shared library
+>96    belong          >0              - not stripped
+
+0      belong          0x0210010d      PA-RISC1.1 dynamic load library
+>96    belong          >0              - not stripped
+
+#### PA-RISC 2.0
+0      belong          0x02140106      PA-RISC2.0 relocatable object
+
+0       belong         0x02140107      PA-RISC2.0 executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0       belong         0x02140108      PA-RISC2.0 shared executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0       belong         0x0214010b      PA-RISC2.0 demand-load executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0       belong         0x0214010e      PA-RISC2.0 shared library
+>96    belong          >0              - not stripped
+
+0       belong         0x0214010d      PA-RISC2.0 dynamic load library
+>96    belong          >0              - not stripped
+
+#### 800
+0      belong          0x020b0106      PA-RISC1.0 relocatable object
+
+0      belong          0x020b0107      PA-RISC1.0 executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x020b0108      PA-RISC1.0 shared executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x020b010b      PA-RISC1.0 demand-load executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x020b010e      PA-RISC1.0 shared library
+>96    belong          >0              - not stripped
+
+0      belong          0x020b010d      PA-RISC1.0 dynamic load library
+>96    belong          >0              - not stripped
+
+0      belong          0x213c6172      archive file
+>68    belong          0x020b0619      - PA-RISC1.0 relocatable library
+>68    belong          0x02100619      - PA-RISC1.1 relocatable library
+>68    belong          0x02110619      - PA-RISC1.2 relocatable library
+>68    belong          0x02140619      - PA-RISC2.0 relocatable library
+
+#### 500
+0      long            0x02080106      HP s500 relocatable executable
+>16    long            >0              - version %ld
+
+0      long            0x02080107      HP s500 executable
+>16    long            >0              - version %ld
+
+0      long            0x02080108      HP s500 pure executable
+>16    long            >0              - version %ld
+
+#### 200
+0      belong          0x020c0108      HP s200 pure executable
+>4     beshort         >0              - version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c0107      HP s200 executable
+>4     beshort         >0              - version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c010b      HP s200 demand-load executable
+>4     beshort         >0              - version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c0106      HP s200 relocatable executable
+>4     beshort         >0              - version %ld
+>6     beshort         >0              - highwater %d
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x20000000     debuggable
+>8     belong          &0x10000000     PIC
+
+0      belong          0x020a0108      HP s200 (2.x release) pure executable
+>4     beshort         >0              - version %ld
+>36    belong          >0              not stripped
+
+0      belong          0x020a0107      HP s200 (2.x release) executable
+>4     beshort         >0              - version %ld
+>36    belong          >0              not stripped
+
+0      belong          0x020c010e      HP s200 shared library
+>4     beshort         >0              - version %ld
+>6     beshort         >0              - highwater %d
+>36    belong          >0              not stripped
+
+0      belong          0x020c010d      HP s200 dynamic load library
+>4     beshort         >0              - version %ld
+>6     beshort         >0              - highwater %d
+>36    belong          >0              not stripped
+
+#### MISC
+0      long            0x0000ff65      HP old archive
+0      long            0x020aff65      HP s200 old archive
+0      long            0x020cff65      HP s200 old archive
+0      long            0x0208ff65      HP s500 old archive
+
+0      long            0x015821a6      HP core file
+
+0      long            0x4da7eee8      HP-WINDOWS font
+>8     byte            >0              - version %ld
+0      string          Bitmapfile      HP Bitmapfile
+
+0      string          IMGfile CIS     compimg HP Bitmapfile
+# XXX - see "lif"
+#0     short           0x8000          lif file
+0      long            0x020c010c      compiled Lisp
+
+0      string          msgcat01        HP NLS message catalog,
+>8     long            >0              %d messages
+
+# addendum to /etc/magic with HP-48sx file-types by phk@data.fls.dk 1jan92
+0      string          HPHP48-         HP48 binary
+>7     byte            >0              - Rev %c
+>8     beshort         0x1129          (ADR)
+>8     beshort         0x3329          (REAL)
+>8     beshort         0x5529          (LREAL)
+>8     beshort         0x7729          (COMPLX)
+>8     beshort         0x9d29          (LCOMPLX)
+>8     beshort         0xbf29          (CHAR)
+>8     beshort         0xe829          (ARRAY)
+>8     beshort         0x0a2a          (LNKARRAY)
+>8     beshort         0x2c2a          (STRING)
+>8     beshort         0x4e2a          (HXS)
+>8     beshort         0x742a          (LIST)
+>8     beshort         0x962a          (DIR)
+>8     beshort         0xb82a          (ALG)
+>8     beshort         0xda2a          (UNIT)
+>8     beshort         0xfc2a          (TAGGED)
+>8     beshort         0x1e2b          (GROB)
+>8     beshort         0x402b          (LIB)
+>8     beshort         0x622b          (BACKUP)
+>8     beshort         0x882b          (LIBDATA)
+>8     beshort         0x9d2d          (PROG)
+>8     beshort         0xcc2d          (CODE)
+>8     beshort         0x482e          (GNAME)
+>8     beshort         0x6d2e          (LNAME)
+>8     beshort         0x922e          (XLIB)
+0      string          %%HP:           HP48 text
+>6     string          T(0)            - T(0)
+>6     string          T(1)            - T(1)
+>6     string          T(2)            - T(2)
+>6     string          T(3)            - T(3)
+>10    string          A(D)            A(D)
+>10    string          A(R)            A(R)
+>10    string          A(G)            A(G)
+>14    string          F(.)            F(.);
+>14    string          F(,)            F(,);
+
+# hpBSD magic numbers
+0      beshort         200             hp200 (68010) BSD
+>2     beshort         0407            impure binary
+>2     beshort         0410            read-only binary
+>2     beshort         0413            demand paged binary
+0      beshort         300             hp300 (68020+68881) BSD
+>2     beshort         0407            impure binary
+>2     beshort         0410            read-only binary
+>2     beshort         0413            demand paged binary
+#
+# From David Gero <dgero@nortelnetworks.com>
+# HP-UX 10.20 core file format from /usr/include/sys/core.h
+# Unfortunately, HP-UX uses corehead blocks without specifying the order
+# There are four we care about:
+#     CORE_KERNEL, which starts with the string "HP-UX"
+#     CORE_EXEC, which contains the name of the command
+#     CORE_PROC, which contains the signal number that caused the core dump
+#     CORE_FORMAT, which contains the version of the core file format (== 1)
+# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
+# but we include all 6 variations of the order of the first 3, and
+# assume that PROC will always be last
+# Order 1: KERNEL, EXEC, FORMAT, PROC
+0x10           string  HP-UX
+>0             belong  2
+>>0xC          belong  0x3C
+>>>0x4C                belong  0x100
+>>>>0x58       belong  0x44
+>>>>>0xA0      belong  1
+>>>>>>0xAC     belong  4
+>>>>>>>0xB0    belong  1
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x90  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 2: KERNEL, FORMAT, EXEC, PROC
+>>>0x4C                belong  1
+>>>>0x58       belong  4
+>>>>>0x5C      belong  1
+>>>>>>0x60     belong  0x100
+>>>>>>>0x6C    belong  0x44
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0xA4  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 3: FORMAT, KERNEL, EXEC, PROC
+0x24           string  HP-UX
+>0             belong  1
+>>0xC          belong  4
+>>>0x10                belong  1
+>>>>0x14       belong  2
+>>>>>0x20      belong  0x3C
+>>>>>>0x60     belong  0x100
+>>>>>>>0x6C    belong  0x44
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0xA4  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 4: EXEC, KERNEL, FORMAT, PROC
+0x64           string  HP-UX
+>0             belong  0x100
+>>0xC          belong  0x44
+>>>0x54                belong  2
+>>>>0x60       belong  0x3C
+>>>>>0xA0      belong  1
+>>>>>>0xAC     belong  4
+>>>>>>>0xB0    belong  1
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x44  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 5: FORMAT, EXEC, KERNEL, PROC
+0x78           string  HP-UX
+>0             belong  1
+>>0xC          belong  4
+>>>0x10                belong  1
+>>>>0x14       belong  0x100
+>>>>>0x20      belong  0x44
+>>>>>>0x68     belong  2
+>>>>>>>0x74    belong  0x3C
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x58  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 6: EXEC, FORMAT, KERNEL, PROC
+>0             belong  0x100
+>>0xC          belong  0x44
+>>>0x54                belong  1
+>>>>0x60       belong  4
+>>>>>0x64      belong  1
+>>>>>>0x68     belong  2
+>>>>>>>0x74    belong  0x2C
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x44  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
diff --git a/file/Magdir/human68k b/file/Magdir/human68k
new file mode 100644 (file)
index 0000000..0ac82a7
--- /dev/null
@@ -0,0 +1,25 @@
+
+#------------------------------------------------------------------------------
+# human68k:  file(1) magic for Human68k (X680x0 DOS) binary formats
+
+0              string  HU              Human68k
+>68            string  LZX             LZX compressed
+>>72           string  >\0             (version %s)
+>(8.L+74)      string  LZX             LZX compressed
+>>(8.L+78)     string  >\0             (version %s)
+>60            belong  >0              binded
+>(8.L+66)      string  #HUPAIR         hupair
+>0             string  HU              X executable
+>(8.L+74)      string  #LIBCV1         - linked PD LIBC ver 1
+>4             belong  >0              - base address 0x%x
+>28            belong  >0              not stripped
+>32            belong  >0              with debug information
+0              beshort 0x601a          Human68k Z executable
+0              beshort 0x6000          Human68k object file
+0              belong  0xd1000000      Human68k ar binary archive
+0              belong  0xd1010000      Human68k ar ascii archive
+0              beshort 0x0068          Human68k lib archive
+4              string  LZX             Human68k LZX compressed
+>8             string  >\0             (version %s)
+>4             string  LZX             R executable
+2              string  #HUPAIR         Human68k hupair R executable
diff --git a/file/Magdir/ibm370 b/file/Magdir/ibm370
new file mode 100644 (file)
index 0000000..8cd9da2
--- /dev/null
@@ -0,0 +1,47 @@
+
+#------------------------------------------------------------------------------
+# ibm370:  file(1) magic for IBM 370 and compatibles.
+#
+# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
+# What the heck *is* "USS/370"?
+# AIX 4.1's "/etc/magic" has
+#
+#      0       short           0535            370 sysV executable 
+#      >12     long            >0              not stripped
+#      >22     short           >0              - version %d
+#      >30     long            >0              - 5.2 format
+#      0       short           0530            370 sysV pure executable 
+#      >12     long            >0              not stripped
+#      >22     short           >0              - version %d
+#      >30     long            >0              - 5.2 format
+#
+# instead of the "USS/370" versions of the same magic numbers.
+#
+0      beshort         0537            370 XA sysV executable 
+>12    belong          >0              not stripped
+>22    beshort         >0              - version %d
+>30    belong          >0              - 5.2 format
+0      beshort         0532            370 XA sysV pure executable 
+>12    belong          >0              not stripped
+>22    beshort         >0              - version %d
+>30    belong          >0              - 5.2 format
+0      beshort         054001          370 sysV pure executable
+>12    belong          >0              not stripped
+0      beshort         055001          370 XA sysV pure executable
+>12    belong          >0              not stripped
+0      beshort         056401          370 sysV executable
+>12    belong          >0              not stripped
+0      beshort         057401          370 XA sysV executable
+>12    belong          >0              not stripped
+0       beshort                0531            SVR2 executable (Amdahl-UTS)
+>12    belong          >0              not stripped
+>24     belong         >0              - version %ld
+0      beshort         0534            SVR2 pure executable (Amdahl-UTS)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+0      beshort         0530            SVR2 pure executable (USS/370)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+0      beshort         0535            SVR2 executable (USS/370)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
diff --git a/file/Magdir/ibm6000 b/file/Magdir/ibm6000
new file mode 100644 (file)
index 0000000..8e1077b
--- /dev/null
@@ -0,0 +1,17 @@
+
+#------------------------------------------------------------------------------
+# ibm6000:  file(1) magic for RS/6000 and the RT PC.
+#
+0      beshort         0x01df          executable (RISC System/6000 V3.1) or obj module
+>12    belong          >0              not stripped
+# Breaks sun4 statically linked execs.
+#0      beshort                0x0103          executable (RT Version 2) or obj module
+#>2    byte            0x50            pure
+#>28   belong          >0              not stripped
+#>6    beshort         >0              - version %ld
+0      beshort         0x0104          shared library
+0      beshort         0x0105          ctab data
+0      beshort         0xfe04          structured file
+0      string          0xabcdef        AIX message catalog
+0      belong          0x000001f9      AIX compiled message catalog
+0      string          \<aiaff>        archive
diff --git a/file/Magdir/iff b/file/Magdir/iff
new file mode 100644 (file)
index 0000000..68d1b79
--- /dev/null
@@ -0,0 +1,28 @@
+
+#------------------------------------------------------------------------------
+# iff: file(1) magic for Interchange File Format (see also "audio" & "images")
+#
+# Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic
+# Arts for file interchange.  It has also been used by Apple, SGI, and
+# especially Commodore-Amiga.
+#
+# IFF files begin with an 8 byte FORM header, followed by a 4 character
+# FORM type, which is followed by the first chunk in the FORM.
+
+0      string          FORM            IFF data
+#>4    belong          x               \b, FORM is %d bytes long
+# audio formats
+>8     string          AIFF            \b, AIFF audio
+>8     string          AIFC            \b, AIFF-C compressed audio
+>8     string          8SVX            \b, 8SVX 8-bit sampled sound voice
+>8     string          SAMP            \b, SAMP sampled audio
+# image formats
+>8     string          ILBMBMHD        \b, ILBM interleaved image
+>>20   beshort         x               \b, %d x
+>>22   beshort         x               %d
+>8     string          RGBN            \b, RGBN 12-bit RGB image
+>8     string          RGB8            \b, RGB8 24-bit RGB image
+>8     string          DR2D            \b, DR2D 2-D object
+>8     string          TDDD            \b, TDDD 3-D rendering
+# other formats
+>8     string          FTXT            \b, FTXT formatted text
diff --git a/file/Magdir/images b/file/Magdir/images
new file mode 100644 (file)
index 0000000..c07fa0c
--- /dev/null
@@ -0,0 +1,335 @@
+
+#------------------------------------------------------------------------------
+# images:  file(1) magic for image formats (see also "iff")
+#
+# originally from jef@helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl@ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# little magic: PCX (first byte is 0x0a)
+
+# Targa - matches `povray', `ppmtotga' and `xv' outputs
+# by Philippe De Muyter <phdm@macqel.be>
+# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11
+# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise
+# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs
+# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)
+# `tgatoppm' recognizes a superset (Index may be anything)
+1      belong&0xfff7ffff       0x01010000      Targa image data - Map
+>2     byte&8                  8               - RLE
+1      belong&0xfff7ffff       0x00020000      Targa image data - RGB
+>2     byte&8                  8               - RLE
+1      belong&0xfff7ffff       0x00030000      Targa image data - Mono
+>2     byte&8                  8               - RLE
+
+# PBMPLUS images
+# The next byte following the magic is always whitespace.
+0      string          P1              Netpbm PBM image text
+0      string          P2              Netpbm PGM image text
+0      string          P3              Netpbm PPM image text
+0      string          P4              Netpbm PBM "rawbits" image data
+0      string          P5              Netpbm PGM "rawbits" image data
+0      string          P6              Netpbm PPM "rawbits" image data
+0      string          P7              Netpbm PAM image file
+
+# From: bryanh@giraffe-data.com (Bryan Henderson)
+0      string          \117\072        Solitaire Image Recorder format
+>4     string          \013            MGI Type 11
+>4     string          \021            MGI Type 17
+0      string          .MDA            MicroDesign data
+>21    byte            48              version 2
+>21    byte            51              version 3
+0      string          .MDP            MicroDesign page data
+>21    byte            48              version 2
+>21    byte            51              version 3
+
+# NIFF (Navy Interchange File Format, a modification of TIFF) images
+0      string          IIN1            NIFF image data
+
+# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
+# The second word of TIFF files is the TIFF version number, 42, which has
+# never changed.  The TIFF specification recommends testing for it.
+0      string          MM\x00\x2a      TIFF image data, big-endian
+0      string          II\x2a\x00      TIFF image data, little-endian
+
+# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
+# (Greg Roelofs, newt@uchicago.edu)
+# (Albert Cahalan, acahalan@cs.uml.edu)
+#
+# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
+#
+0      string          \x89PNG         PNG image data,
+>4     belong          !0x0d0a1a0a     CORRUPTED,
+>4     belong          0x0d0a1a0a
+>>16   belong          x               %ld x
+>>20   belong          x               %ld,
+>>24   byte            x               %d-bit
+>>25   byte            0               grayscale,
+>>25   byte            2               \b/color RGB,
+>>25   byte            3               colormap,
+>>25   byte            4               gray+alpha,
+>>25   byte            6               \b/color RGBA,
+#>>26  byte            0               deflate/32K,
+>>28   byte            0               non-interlaced
+>>28   byte            1               interlaced
+1      string          PNG             PNG image data, CORRUPTED
+
+# GIF
+0      string          GIF8            GIF image data
+>4     string          7a              \b, version 8%s,
+>4     string          9a              \b, version 8%s,
+>6     leshort         >0              %hd x
+>8     leshort         >0              %hd,
+#>10   byte            &0x80           color mapped,
+#>10   byte&0x07       =0x00           2 colors
+#>10   byte&0x07       =0x01           4 colors
+#>10   byte&0x07       =0x02           8 colors
+#>10   byte&0x07       =0x03           16 colors
+#>10   byte&0x07       =0x04           32 colors
+#>10   byte&0x07       =0x05           64 colors
+#>10   byte&0x07       =0x06           128 colors
+#>10   byte&0x07       =0x07           256 colors
+
+# ITC (CMU WM) raster files.  It is essentially a byte-reversed Sun raster,
+# 1 plane, no encoding.
+0      string          \361\0\100\273  CMU window manager raster image data
+>4     lelong          >0              %d x
+>8     lelong          >0              %d,
+>12    lelong          >0              %d-bit
+
+# Magick Image File Format
+0      string          id=ImageMagick  MIFF image data
+
+# Artisan
+0      long            1123028772      Artisan image data
+>4     long            1               \b, rectangular 24-bit
+>4     long            2               \b, rectangular 8-bit with colormap
+>4     long            3               \b, rectangular 32-bit (24-bit with matte)
+
+# FIG (Facility for Interactive Generation of figures), an object-based format
+0      string          #FIG            FIG image text
+>5     string          x               \b, version %.3s
+
+# PHIGS
+0      string          ARF_BEGARF              PHIGS clear text archive
+0      string          @(#)SunPHIGS            SunPHIGS
+# version number follows, in the form m.n
+>40    string          SunBin                  binary
+>32    string          archive                 archive
+
+# GKS (Graphics Kernel System)
+0      string          GKSM            GKS Metafile
+>24    string          SunGKS          \b, SunGKS
+
+# CGM image files
+0      string          BEGMF           clear text Computer Graphics Metafile
+# XXX - questionable magic
+0      beshort&0xffe0  0x0020          binary Computer Graphics Metafile
+0      beshort         0x3020          character Computer Graphics Metafile
+
+# MGR bitmaps  (Michael Haardt, u31b3hs@pool.informatik.rwth-aachen.de)
+0      string  yz      MGR bitmap, modern format, 8-bit aligned
+0      string  zz      MGR bitmap, old format, 1-bit deep, 16-bit aligned
+0      string  xz      MGR bitmap, old format, 1-bit deep, 32-bit aligned
+0      string  yx      MGR bitmap, modern format, squeezed
+
+# Fuzzy Bitmap (FBM) images
+0      string          %bitmap\0       FBM image data
+>30    long            0x31            \b, mono
+>30    long            0x33            \b, color
+
+# facsimile data
+1      string          PC\ Research,\ Inc      group 3 fax data
+>29    byte            0               \b, normal resolution (204x98 DPI)
+>29    byte            1               \b, fine resolution (204x196 DPI)
+
+# PC bitmaps (OS/2, Windoze BMP files)  (Greg Roelofs, newt@uchicago.edu)
+0      string          BM              PC bitmap data
+>14    leshort         12              \b, OS/2 1.x format
+>>18   leshort         x               \b, %d x
+>>20   leshort         x               %d
+>14    leshort         64              \b, OS/2 2.x format
+>>18   leshort         x               \b, %d x
+>>20   leshort         x               %d
+>14    leshort         40              \b, Windows 3.x format
+>>18   lelong          x               \b, %d x
+>>22   lelong          x               %d x
+>>28   leshort         x               %d
+0      string          IC              PC icon data
+0      string          PI              PC pointer image data
+0      string          CI              PC color icon data
+0      string          CP              PC color pointer image data
+# Conflicts with other entries [BABYL]
+#0     string          BA              PC bitmap array data
+
+# XPM icons (Greg Roelofs, newt@uchicago.edu)
+# note possible collision with C/REXX entry in c-lang; currently commented out
+0      string          /*\ XPM\ */     X pixmap image text
+
+# Utah Raster Toolkit RLE images (janl@ifi.uio.no)
+0      leshort         0xcc52          RLE image data,
+>6     leshort         x               %d x
+>8     leshort         x               %d
+>2     leshort         >0              \b, lower left corner: %d
+>4     leshort         >0              \b, lower right corner: %d
+>10    byte&0x1        =0x1            \b, clear first
+>10    byte&0x2        =0x2            \b, no background
+>10    byte&0x4        =0x4            \b, alpha channel
+>10    byte&0x8        =0x8            \b, comment
+>11    byte            >0              \b, %d color channels
+>12    byte            >0              \b, %d bits per pixel
+>13    byte            >0              \b, %d color map channels
+
+# image file format (Robert Potter, potter@cs.rochester.edu)
+0      string          Imagefile\ version-     iff image data
+# this adds the whole header (inc. version number), informative but longish
+>10    string          >\0             %s
+
+# Sun raster images, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      belong          0x59a66a95      Sun raster image data
+>4     belong          >0              \b, %d x
+>8     belong          >0              %d,
+>12    belong          >0              %d-bit,
+#>16   belong          >0              %d bytes long,
+>20    belong          0               old format,
+#>20   belong          1               standard,
+>20    belong          2               compressed,
+>20    belong          3               RGB,
+>20    belong          4               TIFF,
+>20    belong          5               IFF,
+>20    belong          0xffff          reserved for testing,
+>24    belong          0               no colormap
+>24    belong          1               RGB colormap
+>24    belong          2               raw colormap
+#>28   belong          >0              colormap is %d bytes long
+
+# SGI image file format, from Daniel Quinlan (quinlan@yggdrasil.com)
+#
+# See
+#      http://reality.sgi.com/grafica/sgiimage.html
+#
+0      beshort         474             SGI image data
+#>2    byte            0               \b, verbatim
+>2     byte            1               \b, RLE
+#>3    byte            1               \b, normal precision
+>3     byte            2               \b, high precision
+>4     beshort         x               \b, %d-D
+>6     beshort         x               \b, %d x
+>8     beshort         x               %d
+>10    beshort         x               \b, %d channel
+>10    beshort         !1              \bs
+>80    string          >0              \b, "%s"
+
+0      string          IT01            FIT image data
+>4     belong          x               \b, %d x
+>8     belong          x               %d x
+>12    belong          x               %d
+#
+0      string          IT02            FIT image data
+>4     belong          x               \b, %d x
+>8     belong          x               %d x
+>12    belong          x               %d
+#
+2048   string          PCD_IPI         Kodak Photo CD image pack file
+>0xe02 byte&0x03       0x00            , landscape mode
+>0xe02 byte&0x03       0x01            , portrait mode
+>0xe02 byte&0x03       0x02            , landscape mode
+>0xe02 byte&0x03       0x03            , portrait mode
+0      string          PCD_OPA         Kodak Photo CD overview pack file
+
+# FITS format.  Jeff Uphoff <juphoff@tarsier.cv.nrao.edu>
+# FITS is the Flexible Image Transport System, the de facto standard for
+# data and image transfer, storage, etc., for the astronomical community.
+# (FITS floating point formats are big-endian.)
+0      string  SIMPLE\ \ =     FITS image data
+>109   string  8               \b, 8-bit, character or unsigned binary integer
+>108   string  16              \b, 16-bit, two's complement binary integer
+>107   string  \ 32            \b, 32-bit, two's complement binary integer
+>107   string  -32             \b, 32-bit, floating point, single precision
+>107   string  -64             \b, 64-bit, floating point, double precision
+
+# other images
+0      string  This\ is\ a\ BitMap\ file       Lisp Machine bit-array-file
+0      string          !!              Bennet Yee's "face" format
+
+# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image
+# stuff.
+#
+0      beshort         0x1010          PEX Binary Archive
+
+# Visio drawings
+03000  string  Visio\ (TM)\ Drawing    %s
+
+# Tgif files
+0      string  \%TGIF\ x               Tgif file version %s
+
+# DICOM medical imaging data
+128    string  DICM                    DICOM medical imaging data
+
+# XWD - X-Windows Dump file.
+#   As described in /usr/X11R6/include/X11/XWDFile.h
+#   used by the xwd program.
+#   Bradford Castalia, idaeim, 1/01
+4      belong  7                       XWD X-Windows Dump image data
+>100   string  >\0                     \b, "%s"
+>16    belong  x                       \b, %dx
+>20    belong  x                       \b%dx
+>12    belong  x                       \b%d
+
+# PDS - Planetary Data System
+#   These files use Parameter Value Language in the header section.
+#   Unfortunately, there is no certain magic, but the following
+#   strings have been found to be most likely.
+0      string  NJPL1I00                PDS (JPL) image data
+2      string  NJPL1I                  PDS (JPL) image data
+0      string  CCSD3ZF                 PDS (CCSD) image data
+2      string  CCSD3Z                  PDS (CCSD) image data
+0      string  PDS_                    PDS image data
+0      string  LBLSIZE=                PDS (VICAR) image data
+
+# pM8x: ATARI STAD compressed bitmap format
+#
+# from Oskar Schirmer <schirmer@scara.com> Feb 2, 2001
+# p M 8 5/6 xx yy zz data...
+# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
+# bytes either run horizontally (pM85) or vertically (pM86). yy is the
+# most frequent byte, xx and zz are runlength escape codes, where xx is
+# used for runs of yy.
+#
+0      string  pM85            Atari ST STAD bitmap image data (hor)
+>5     byte    0x00            (white background)
+>5     byte    0xFF            (black background)
+0      string  pM86            Atari ST STAD bitmap image data (vert)
+>5     byte    0x00            (white background)
+>5     byte    0xFF            (black background)
+
+# XXX:
+# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
+# magic.
+# SGI RICE image file <mpruett@sgi.com>
+#0     beshort 0x5249          RICE image
+#>2    beshort x               v%d
+#>4    beshort x               (%d x
+#>6    beshort x               %d)
+#>8    beshort 0               8 bit
+#>8    beshort 1               10 bit
+#>8    beshort 2               12 bit
+#>8    beshort 3               13 bit
+#>10   beshort 0               4:2:2
+#>10   beshort 1               4:2:2:4
+#>10   beshort 2               4:4:4
+#>10   beshort 3               4:4:4:4
+#>12   beshort 1               RGB
+#>12   beshort 2               CCIR601
+#>12   beshort 3               RP175
+#>12   beshort 4               YUV
+
+#------------------------------------------------------------------------------
+#
+# Marco Schmidt (marcoschmidt@users.sourceforge.net) -- an image  file format
+# for the EPOC operating system, which is used with PDAs like those from Psion
+#
+# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description
+# of various EPOC file formats
+
+0      string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file
diff --git a/file/Magdir/impulse b/file/Magdir/impulse
new file mode 100644 (file)
index 0000000..64c14c3
--- /dev/null
@@ -0,0 +1,18 @@
+#------------------------------------------------------------------------------
+# impulse tracker:  file(1) magic for Impulse Tracker data files
+#
+# From <collver1@attbi.com>
+# These are the /etc/magic entries to decode modules, instruments, and
+# samples in Impulse Tracker's native format.
+
+0      string          IMPS            Impulse Tracker Sample
+>18    byte            &2              16 bit
+>18    byte            ^2              8 bit
+>18    byte            &4              stereo
+>18    byte            ^4              mono
+0      string          IMPI            Impulse Tracker Instrument
+>28    leshort         !0              ITv%x
+>30    byte            !0              %d samples
+0      string          IMPM            Impulse Tracker Module
+>40    leshort         !0              compatible w/ITv%x
+>42    leshort         !0              created w/ITv%x
diff --git a/file/Magdir/intel b/file/Magdir/intel
new file mode 100644 (file)
index 0000000..d450e26
--- /dev/null
@@ -0,0 +1,35 @@
+
+#------------------------------------------------------------------------------
+# intel:  file(1) magic for x86 Unix
+#
+# Various flavors of x86 UNIX executable/object (other than Xenix, which
+# is in "microsoft").  DOS is in "msdos"; the ambitious soul can do
+# Windows as well.
+#
+# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
+# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere
+# as well, if, as, and when IBM makes it portable.
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0      leshort         0502            basic-16 executable
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0503            basic-16 executable (TV)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0510            x86 executable
+>12    lelong          >0              not stripped
+0      leshort         0511            x86 executable (TV)
+>12    lelong          >0              not stripped
+0      leshort         =0512           iAPX 286 executable small model (COFF)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         =0522           iAPX 286 executable large model (COFF)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
+0      leshort         =0514           80386 COFF executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
diff --git a/file/Magdir/interleaf b/file/Magdir/interleaf
new file mode 100644 (file)
index 0000000..3eea3cf
--- /dev/null
@@ -0,0 +1,8 @@
+
+#------------------------------------------------------------------------------
+# interleaf:  file(1) magic for InterLeaf TPS:
+#
+0      string          =\210OPS        Interleaf saved data
+0      string          =<!OPS          Interleaf document text
+>5     string          ,\ Version\ =   \b, version
+>>17   string          >\0             %.3s
diff --git a/file/Magdir/island b/file/Magdir/island
new file mode 100644 (file)
index 0000000..9903cdd
--- /dev/null
@@ -0,0 +1,9 @@
+
+#------------------------------------------------------------------------------
+# island:  file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1
+# "/etc/magic":
+# From: guy@netapp.com (Guy Harris)
+#
+4      string          pgscriptver     IslandWrite document
+13     string          DrawFile        IslandDraw document
+
diff --git a/file/Magdir/ispell b/file/Magdir/ispell
new file mode 100644 (file)
index 0000000..592f064
--- /dev/null
@@ -0,0 +1,62 @@
+
+#------------------------------------------------------------------------------
+# ispell:  file(1) magic for ispell
+#
+# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602.  This magic
+# will match 0x9600 through 0x9603 in *both* little endian and big endian.
+# (No other current magic entries collide.)
+#
+# Updated by Daniel Quinlan (quinlan@yggdrasil.com)
+#
+0      leshort&0xFFFC  0x9600          little endian ispell
+>0     byte            0               hash file (?),
+>0     byte            1               3.0 hash file,
+>0     byte            2               3.1 hash file,
+>0     byte            3               hash file (?),
+>2     leshort         0x00            8-bit, no capitalization, 26 flags
+>2     leshort         0x01            7-bit, no capitalization, 26 flags
+>2     leshort         0x02            8-bit, capitalization, 26 flags
+>2     leshort         0x03            7-bit, capitalization, 26 flags
+>2     leshort         0x04            8-bit, no capitalization, 52 flags
+>2     leshort         0x05            7-bit, no capitalization, 52 flags
+>2     leshort         0x06            8-bit, capitalization, 52 flags
+>2     leshort         0x07            7-bit, capitalization, 52 flags
+>2     leshort         0x08            8-bit, no capitalization, 128 flags
+>2     leshort         0x09            7-bit, no capitalization, 128 flags
+>2     leshort         0x0A            8-bit, capitalization, 128 flags
+>2     leshort         0x0B            7-bit, capitalization, 128 flags
+>2     leshort         0x0C            8-bit, no capitalization, 256 flags
+>2     leshort         0x0D            7-bit, no capitalization, 256 flags
+>2     leshort         0x0E            8-bit, capitalization, 256 flags
+>2     leshort         0x0F            7-bit, capitalization, 256 flags
+>4     leshort         >0              and %d string characters
+0      beshort&0xFFFC  0x9600          big endian ispell
+>1     byte            0               hash file (?),
+>1     byte            1               3.0 hash file,
+>1     byte            2               3.1 hash file,
+>1     byte            3               hash file (?),
+>2     beshort         0x00            8-bit, no capitalization, 26 flags
+>2     beshort         0x01            7-bit, no capitalization, 26 flags
+>2     beshort         0x02            8-bit, capitalization, 26 flags
+>2     beshort         0x03            7-bit, capitalization, 26 flags
+>2     beshort         0x04            8-bit, no capitalization, 52 flags
+>2     beshort         0x05            7-bit, no capitalization, 52 flags
+>2     beshort         0x06            8-bit, capitalization, 52 flags
+>2     beshort         0x07            7-bit, capitalization, 52 flags
+>2     beshort         0x08            8-bit, no capitalization, 128 flags
+>2     beshort         0x09            7-bit, no capitalization, 128 flags
+>2     beshort         0x0A            8-bit, capitalization, 128 flags
+>2     beshort         0x0B            7-bit, capitalization, 128 flags
+>2     beshort         0x0C            8-bit, no capitalization, 256 flags
+>2     beshort         0x0D            7-bit, no capitalization, 256 flags
+>2     beshort         0x0E            8-bit, capitalization, 256 flags
+>2     beshort         0x0F            7-bit, capitalization, 256 flags
+>4     beshort         >0              and %d string characters
+# ispell 4.0 hash files  kromJx <kromJx@crosswinds.net>
+# Ispell 4.0
+0       string          ISPL            ispell
+>4      long            x               hash file version %d,
+>8      long            x               lexletters %d,
+>12     long            x               lexsize %d,
+>16     long            x               hashsize %d,
+>20     long            x               stblsize %d
diff --git a/file/Magdir/java b/file/Magdir/java
new file mode 100644 (file)
index 0000000..d0677bf
--- /dev/null
@@ -0,0 +1,11 @@
+#------------------------------------------------------------
+# Java ByteCode
+# From Larry Schwimmer (schwim@cs.stanford.edu)
+0      belong          0xcafebabe      compiled Java class data,
+>6     beshort x       version %d.
+>4     beshort x       \b%d
+#------------------------------------------------------------
+# Java serialization
+# From Martin Pool (m.pool@pharos.com.au)
+0      beshort         0xaced          Java serialization data
+>2     beshort         >0x0004         \b, version %d
diff --git a/file/Magdir/jpeg b/file/Magdir/jpeg
new file mode 100644 (file)
index 0000000..f18a39e
--- /dev/null
@@ -0,0 +1,61 @@
+
+#------------------------------------------------------------------------------
+# JPEG images
+# SunOS 5.5.1 had
+#
+#      0       string          \377\330\377\340        JPEG file
+#      0       string          \377\330\377\356        JPG file
+#
+# both of which turn into "JPEG image data" here.
+#
+0      beshort         0xffd8          JPEG image data
+>6     string          JFIF            \b, JFIF standard
+>6     string          Exif            \b, EXIF standard
+# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
+# in a vain attempt to add image size reporting for JFIF.  Note that these
+# tests are not fool-proof since some perfectly valid JPEGs are currently
+# impossible to specify in magic(4) format.
+# First, a little JFIF version info:
+>11    byte            x               \b %d.
+>12    byte            x               \b%02d
+# Next, the resolution or aspect ratio of the image:
+>13    byte            0               \b, aspect ratio
+>13    byte            1               \b, resolution (DPI)
+>13    byte            2               \b, resolution (DPCM)
+#>4    beshort         x               \b, segment length %d
+# Next, show thumbnail info, if it exists:
+>18    byte            !0              \b, thumbnail %dx
+>>19   byte            x               \b%d
+# Here things get sticky.  We can do ONE MORE marker segment with
+# indirect addressing, and that's all.  It would be great if we could
+# do pointer arithemetic like in an assembler language.  Christos?
+# And if there was some sort of looping construct to do searches, plus a few
+# named accumulators, it would be even more effective...
+# At least we can show a comment if no other segments got inserted before:
+>(4.S+5)       byte            0xFE
+>>(4.S+8)      string          >\0             \b, "%s"
+#>(4.S+5)      byte            0xFE            \b, comment
+#>>(4.S+6)     beshort         x               \b length=%d
+#>>(4.S+8)     string          >\0             \b, "%s"
+# Or, we can show the encoding type (I've included only the three most common)
+# and image dimensions if we are lucky and the SOFn (image segment) is here:
+>(4.S+5)       byte            0xC0            \b, baseline
+>>(4.S+6)      byte            x               \b, precision %d
+>>(4.S+7)      beshort         x               \b, %dx
+>>(4.S+9)      beshort         x               \b%d
+>(4.S+5)       byte            0xC1            \b, extended sequential
+>>(4.S+6)      byte            x               \b, precision %d
+>>(4.S+7)      beshort         x               \b, %dx
+>>(4.S+9)      beshort         x               \b%d
+>(4.S+5)       byte            0xC2            \b, progressive
+>>(4.S+6)      byte            x               \b, precision %d
+>>(4.S+7)      beshort         x               \b, %dx
+>>(4.S+9)      beshort         x               \b%d
+# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
+#>(4.S+5)      byte            0xDB            \b, quantisation table
+#>>(4.S+6)     beshort         x               \b length=%d
+>14    beshort         x               \b, %d x
+>16    beshort         x               \b %d
+
+# HSI is Handmade Software's proprietary JPEG encoding scheme
+0      string          hsi1            JPEG image data, HSI proprietary
diff --git a/file/Magdir/karma b/file/Magdir/karma
new file mode 100644 (file)
index 0000000..89e7772
--- /dev/null
@@ -0,0 +1,8 @@
+
+#------------------------------------------------------------------------------
+# karma:  file(1) magic for Karma data files
+#
+# From <rgooch@atnf.csiro.au>
+
+0      string          KarmaRHD Version        Karma Data Structure Version
+>16    belong          x               %lu
diff --git a/file/Magdir/lecter b/file/Magdir/lecter
new file mode 100644 (file)
index 0000000..87c186b
--- /dev/null
@@ -0,0 +1,4 @@
+#------------------------------------------------------------------------------
+# DEC SRC Virtual Paper: Lectern files
+# Karl M. Hegbloom <karlheg@inetarena.com>
+0      string  lect    DEC SRC Virtual Paper Lectern file
diff --git a/file/Magdir/lex b/file/Magdir/lex
new file mode 100644 (file)
index 0000000..7b6d0f7
--- /dev/null
@@ -0,0 +1,11 @@
+
+#------------------------------------------------------------------------------
+# lex:  file(1) magic for lex
+#
+#      derived empirically, your offsets may vary!
+53     string          yyprevious      C program text (from lex)
+>3     string          >\0              for %s
+# C program text from GNU flex, from Daniel Quinlan <quinlan@yggdrasil.com>
+21     string          generated\ by\ flex     C program text (from flex)
+# lex description file, from Daniel Quinlan <quinlan@yggdrasil.com>
+0      string          %{              lex description text
diff --git a/file/Magdir/lif b/file/Magdir/lif
new file mode 100644 (file)
index 0000000..cf20e49
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# lif:  file(1) magic for lif
+#
+# (Daniel Quinlan <quinlan@yggdrasil.com>)
+#
+0      beshort         0x8000          lif file
diff --git a/file/Magdir/linux b/file/Magdir/linux
new file mode 100644 (file)
index 0000000..295edd9
--- /dev/null
@@ -0,0 +1,101 @@
+
+#------------------------------------------------------------------------------
+# linux:  file(1) magic for Linux files
+#
+# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
+# The following basic Linux magic is useful for reference, but using
+# "long" magic is a better practice in order to avoid collisions.
+#
+# 2    leshort         100             Linux/i386
+# >0   leshort         0407            impure executable (OMAGIC)
+# >0   leshort         0410            pure executable (NMAGIC)
+# >0   leshort         0413            demand-paged executable (ZMAGIC)
+# >0   leshort         0314            demand-paged executable (QMAGIC)
+#
+0      lelong          0x00640107      Linux/i386 impure executable (OMAGIC)
+>16    lelong          0               \b, stripped
+0      lelong          0x00640108      Linux/i386 pure executable (NMAGIC)
+>16    lelong          0               \b, stripped
+0      lelong          0x0064010b      Linux/i386 demand-paged executable (ZMAGIC)
+>16    lelong          0               \b, stripped
+0      lelong          0x006400cc      Linux/i386 demand-paged executable (QMAGIC)
+>16    lelong          0               \b, stripped
+#
+0      string          \007\001\000    Linux/i386 object file
+>20    lelong          >0x1020         \b, DLL library
+# Linux-8086 stuff:
+0      string          \01\03\020\04   Linux-8086 impure executable
+>28    long            !0              not stripped
+0      string          \01\03\040\04   Linux-8086 executable
+>28    long            !0              not stripped
+#
+0      string          \243\206\001\0  Linux-8086 object file
+#
+0      string          \01\03\020\20   Minix-386 impure executable
+>28    long            !0              not stripped
+0      string          \01\03\040\20   Minix-386 executable
+>28    long            !0              not stripped
+# core dump file, from Bill Reynolds <bill@goshawk.lanl.gov>
+216    lelong          0421            Linux/i386 core file
+>220   string          >\0             of '%s'
+>200   lelong          >0              (signal %d)
+#
+# LILO boot/chain loaders, from Daniel Quinlan <quinlan@yggdrasil.com>
+# this can be overridden by the DOS executable (COM) entry
+2      string          LILO            Linux/i386 LILO boot/chain loader
+#
+# Debian Packages, from Peter Tobias <tobias@server.et-inf.fho-emden.de>
+0      string          0.9
+>8     byte            0x0a            old Debian Binary Package
+>>3    byte            >0              \b, created by dpkg 0.9%c
+>>4    byte            >0              pl%c
+# PSF fonts, from H. Peter Anvin <hpa@yggdrasil.com>
+0      leshort         0x0436          Linux/i386 PC Screen Font data,
+>2     byte            0               256 characters, no directory,
+>2     byte            1               512 characters, no directory,
+>2     byte            2               256 characters, Unicode directory,
+>2     byte            3               512 characters, Unicode directory,
+>3     byte            >0              8x%d
+# Linux swap file, from Daniel Quinlan <quinlan@yggdrasil.com>
+4086   string          SWAP-SPACE      Linux/i386 swap file
+# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
+#
+#      from Erik Troan (ewt@redhat.com) examining od dumps, so this
+#              could be wrong
+#      updated by David Mosberger (davidm@azstarnet.com) based on
+#      GNU BFD and MIPS info found below.
+#
+0      leshort         0x0183          ECOFF alpha
+>24    leshort         0407            executable
+>24    leshort         0410            pure
+>24    leshort         0413            demand paged
+>8     long            >0              not stripped
+>8     long            0               stripped
+>23    leshort         >0              - version %ld.
+#
+# Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu>
+# and others such as Axel Kohlmeyer <akohlmey@rincewind.chemie.uni-ulm.de>
+# and Nicolás Lichtmaier <nick@debian.org>
+# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
+514            string  HdrS            Linux kernel
+>518           leshort >0
+>>529          byte    0               zImage data,
+>>529          byte    1               bzImage data,
+>0x048c                byte    0x31
+>>0x048c       string  x               version %s
+>0x0493                byte    0x31
+>>0x0493       string  x               version %s
+>0x048c                byte    0x32
+>>0x048c       string  x               version %s
+>0x0493                byte    0x32
+>>0x0493       string  x               version %s
+>0x04df                byte    0x32
+>>0x04df       string  x               version %s
+>0x04fb                byte    0x32
+>>0x04fb       string  x               version %s
+# This also matches new kernels, which were caught above by "HdrS".
+0              belong  0xb8c0078e      Linux kernel
+>0x1e3         string  Loading         version 1.3.79 or older
+>0x1e9         string  Loading         from prehistoric times
+# LSM entries - Nicolás Lichtmaier <nick@feedback.net.ar>
+0      string  Begin3  Linux Software Map entry text
diff --git a/file/Magdir/lisp b/file/Magdir/lisp
new file mode 100644 (file)
index 0000000..4e6c926
--- /dev/null
@@ -0,0 +1,22 @@
+
+#------------------------------------------------------------------------------
+# lisp:  file(1) magic for lisp programs
+#
+# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string  ;;                      Lisp/Scheme program text
+# Emacs 18 - this is always correct, but not very magical.
+0      string  \012(                   byte-compiled Emacs-Lisp program data
+# Emacs 19+ - ver. recognition added by Ian Springer
+0      string  ;ELC                    byte-compiled Emacs-Lisp program data,
+>4     byte    >0                      version %d
+#
+# Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr>
+0      string  (SYSTEM::VERSION\040'   CLISP byte-compiled Lisp program text
+0      long    0x70768BD2              CLISP memory image data
+0      long    0xD28B7670              CLISP memory image data, other endian
+# Files produced by GNU gettext
+0      long    0xDE120495              GNU-format message catalog data
+0      long    0x950412DE              GNU-format message catalog data
+
+#.com and .bin for MIT scheme 
+0      string  \372\372\372\372        MIT scheme (library?)
diff --git a/file/Magdir/mach b/file/Magdir/mach
new file mode 100644 (file)
index 0000000..e0f4808
--- /dev/null
@@ -0,0 +1,43 @@
+#------------------------------------------------------------------------------
+# mach file description
+#
+0      belong          0xcafebabe      Mach-O fat file
+>4     belong          1               with 1 architecture
+>4     belong          >1
+>>4    belong          x               with %ld architectures          
+#
+0      belong          0xfeedface      Mach-O
+>12    belong          1               object
+>12    belong          2               executable
+>12    belong          3               shared library
+>12    belong          4               core
+>12    belong          5               preload executable
+>12    belong          >5
+>>12   belong          x               filetype=%ld
+>4     belong          <0
+>>4    belong          x               architecture=%ld
+>4     belong          1               vax
+>4     belong          2               romp
+>4     belong          3               architecture=3
+>4     belong          4               ns32032
+>4     belong          5               ns32332
+>4     belong          6               for m68k architecture
+# from NeXTstep 3.0 <mach/machine.h>
+# i.e. mc680x0_all, ignore
+# >>8  belong          1               (mc68030)
+>>8    belong          2               (mc68040)
+>>8    belong          3               (mc68030 only)
+>4     belong          7               i386
+>4     belong          8               mips
+>4     belong          9               ns32532
+>4     belong          10              architecture=10
+>4     belong          11              hp pa-risc
+>4     belong          12              acorn
+>4     belong          13              m88k
+>4     belong          14              sparc
+>4     belong          15              i860-big
+>4     belong          16              i860
+>4     belong          17              rs6000
+>4     belong          18              powerPC
+>4     belong          >18
+>>4    belong          x               architecture=%ld
diff --git a/file/Magdir/macintosh b/file/Magdir/macintosh
new file mode 100644 (file)
index 0000000..1fb8241
--- /dev/null
@@ -0,0 +1,335 @@
+
+#------------------------------------------------------------------------------
+# macintosh description
+#
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan@yggdrasil.com
+11     string  must\ be\ converted\ with\ BinHex       BinHex binary text
+>41    string  x                                       \b, version %.3s
+
+# Stuffit archives are the de facto standard of compression for Macintosh
+# files obtained from most archives. (franklsm@tuns.ca)
+0      string          SIT!                    StuffIt Archive (data)
+>2     string          x                       : %s
+0      string          SITD                    StuffIt Deluxe (data)
+>2     string          x                       : %s
+0      string          Seg                     StuffIt Deluxe Segment (data)
+>2     string          x                       : %s
+
+# Macintosh Applications and Installation binaries (franklsm@tuns.ca)
+0      string          APPL                    Macintosh Application (data)
+>2     string          x                       \b: %s
+
+# Macintosh System files (franklsm@tuns.ca)
+0      string          zsys                    Macintosh System File (data)
+0      string          FNDR                    Macintosh Finder (data)
+0      string          libr                    Macintosh Library (data)
+>2     string          x                       : %s
+0      string          shlb                    Macintosh Shared Library (data)
+>2     string          x                       : %s
+0      string          cdev                    Macintosh Control Panel (data)
+>2     string          x                       : %s
+0      string          INIT                    Macintosh Extension (data)
+>2     string          x                       : %s
+0      string          FFIL                    Macintosh Truetype Font (data)
+>2     string          x                       : %s
+0      string          LWFN                    Macintosh Postscript Font (data)
+>2     string          x                       : %s
+
+# Additional Macintosh Files (franklsm@tuns.ca)
+0      string          PACT                    Macintosh Compact Pro Archive (data)
+>2     string          x                       : %s
+0      string          ttro                    Macintosh TeachText File (data)
+>2     string          x                       : %s
+0      string          TEXT                    Macintosh TeachText File (data)
+>2     string          x                       : %s
+0      string          PDF                     Macintosh PDF File (data)
+>2     string          x                       : %s
+
+# MacBinary format (Eric Fischer, enf@pobox.com)
+#
+# Unfortunately MacBinary doesn't really have a magic number prior
+# to the MacBinary III format.  The checksum is really the way to
+# do it, but the magic file format isn't up to the challenge.
+#
+# 0    byte            0
+# 1    byte                            # filename length
+# 2    string                          # filename
+# 65    string                         # file type
+# 69   string                          # file creator
+# 73   byte                            # Finder flags
+# 74   byte            0
+# 75   beshort                         # vertical posn in window
+# 77   beshort                         # horiz posn in window
+# 79   beshort                         # window or folder ID
+# 81    byte                           # protected?
+# 82   byte            0
+# 83   belong                          # length of data segment
+# 87   belong                          # length of resource segment
+# 91   belong                          # file creation date
+# 95   belong                          # file modification date
+# 99   beshort                         # length of comment after resource
+# 101  byte                            # new Finder flags
+# 102  string          mBIN            # (only in MacBinary III)
+# 106  byte                            # char. code of file name
+# 107  byte                            # still more Finder flags
+# 116  belong                          # total file length
+# 120  beshort                         # length of add'l header
+# 122  byte            129             # for MacBinary II
+# 122  byte            130             # for MacBinary III
+# 123  byte            129             # minimum version that can read fmt
+# 124  beshort                         # checksum
+#
+# This attempts to use the version numbers as a magic number, requiring
+# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second
+# be 0x81.  This works for the files I have, but maybe not for everyone's.
+
+122    beshort&0xFCFF  0x8081          Macintosh MacBinary data
+
+# MacBinary I doesn't have the version number field at all, but MacBinary II
+# has been in use since 1987 so I hope there aren't many really old files
+# floating around that this will miss.  The original spec calls for using
+# the nulls in 0, 74, and 82 as the magic number.
+#
+# Another possibility, that would also work for MacBinary I, is to use
+# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will
+# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,
+# and that 74 will be 0.  So something like
+# 
+# 71   belong&0x80804EFF 0x00000000    Macintosh MacBinary data
+# 
+# >73  byte&0x01       0x01            \b, inited
+# >73  byte&0x02       0x02            \b, changed
+# >73  byte&0x04       0x04            \b, busy
+# >73  byte&0x08       0x08            \b, bozo
+# >73  byte&0x10       0x10            \b, system
+# >73  byte&0x10       0x20            \b, bundle
+# >73  byte&0x10       0x40            \b, invisible
+# >73  byte&0x10       0x80            \b, locked
+
+>65    string          x               \b, type "%4.4s"
+
+>65    string          8BIM            (PhotoShop)
+>65    string          ALB3            (PageMaker 3)
+>65    string          ALB4            (PageMaker 4)
+>65    string          ALT3            (PageMaker 3)
+>65    string          APPL            (application)
+>65    string          AWWP            (AppleWorks word processor)
+>65    string          CIRC            (simulated circuit)
+>65    string          DRWG            (MacDraw)
+>65    string          EPSF            (Encapsulated PostScript)
+>65    string          FFIL            (font suitcase)
+>65    string          FKEY            (function key)
+>65    string          FNDR            (Macintosh Finder)
+>65    string          GIFf            (GIF image)
+>65    string          Gzip            (GNU gzip)
+>65    string          INIT            (system extension)
+>65    string          LIB\            (library)
+>65    string          LWFN            (PostScript font)
+>65    string          MSBC            (Microsoft BASIC)
+>65    string          PACT            (Compact Pro archive)
+>65    string          PDF\            (Portable Document Format)
+>65    string          PICT            (picture)
+>65    string          PNTG            (MacPaint picture)
+>65    string          PREF            (preferences)
+>65    string          PROJ            (Think C project)
+>65    string          QPRJ            (Think Pascal project)
+>65    string          SCFL            (Defender scores)
+>65    string          SCRN            (startup screen)
+>65    string          SITD            (StuffIt Deluxe)
+>65    string          SPn3            (SuperPaint)
+>65    string          STAK            (HyperCard stack)
+>65    string          Seg\            (StuffIt segment)
+>65    string          TARF            (Unix tar archive)
+>65    string          TEXT            (ASCII)
+>65    string          TIFF            (TIFF image)
+>65    string          TOVF            (Eudora table of contents)
+>65    string          WDBN            (Microsoft Word word processor)
+>65    string          WORD            (MacWrite word processor)
+>65    string          XLS\            (Microsoft Excel)
+>65    string          ZIVM            (compress (.Z))
+>65    string          ZSYS            (Pre-System 7 system file)
+>65    string          acf3            (Aldus FreeHand)
+>65    string          cdev            (control panel)
+>65    string          dfil            (Desk Acessory suitcase)
+>65    string          libr            (library)
+>65    string          nX^d            (WriteNow word processor)
+>65    string          nX^w            (WriteNow dictionary)
+>65    string          rsrc            (resource)
+>65    string          scbk            (Scrapbook)
+>65    string          shlb            (shared library)
+>65    string          ttro            (SimpleText read-only)
+>65    string          zsys            (system file)
+
+>69    string          x               \b, creator "%4.4s"
+
+# Somewhere, Apple has a repository of registered Creator IDs.  These are
+# just the ones that I happened to have files from and was able to identify.
+
+>69    string          8BIM            (Adobe Photoshop)
+>69    string          ALD3            (PageMaker 3)
+>69    string          ALD4            (PageMaker 4)
+>69    string          ALFA            (Alpha editor)
+>69    string          APLS            (Apple Scanner)
+>69    string          APSC            (Apple Scanner)
+>69    string          BRKL            (Brickles)
+>69    string          BTFT            (BitFont)
+>69    string          CCL2            (Common Lisp 2)
+>69    string          CCL\            (Common Lisp)
+>69    string          CDmo            (The Talking Moose)
+>69    string          CPCT            (Compact Pro)
+>69    string          CSOm            (Eudora)
+>69    string          DMOV            (Font/DA Mover)
+>69    string          DSIM            (DigSim)
+>69    string          EDIT            (Macintosh Edit)
+>69    string          ERIK            (Macintosh Finder)
+>69    string          EXTR            (self-extracting archive)
+>69    string          Gzip            (GNU gzip)
+>69    string          KAHL            (Think C)
+>69    string          LWFU            (LaserWriter Utility)
+>69    string          LZIV            (compress)
+>69    string          MACA            (MacWrite)
+>69    string          MACS            (Macintosh operating system)
+>69    string          MAcK            (MacKnowledge terminal emulator)
+>69    string          MLND            (Defender)
+>69    string          MPNT            (MacPaint)
+>69    string          MSBB            (Microsoft BASIC (binary))
+>69    string          MSWD            (Microsoft Word)
+>69    string          NCSA            (NCSA Telnet)
+>69    string          PJMM            (Think Pascal)
+>69    string          PSAL            (Hunt the Wumpus)
+>69    string          PSI2            (Apple File Exchange)
+>69    string          R*ch            (BBEdit)
+>69    string          RMKR            (Resource Maker)
+>69    string          RSED            (Resource Editor)
+>69    string          Rich            (BBEdit)
+>69    string          SIT!            (StuffIt)
+>69    string          SPNT            (SuperPaint)
+>69    string          Unix            (NeXT Mac filesystem)
+>69    string          VIM!            (Vim editor)
+>69    string          WILD            (HyperCard)
+>69    string          XCEL            (Microsoft Excel)
+>69    string          aCa2            (Fontographer)
+>69    string          aca3            (Aldus FreeHand)
+>69    string          dosa            (Macintosh MS-DOS file system)
+>69    string          movr            (Font/DA Mover)
+>69    string          nX^n            (WriteNow)
+>69    string          pdos            (Apple ProDOS file system)
+>69    string          scbk            (Scrapbook)
+>69    string          ttxt            (SimpleText)
+>69    string          ufox            (Foreign File Access)
+
+# Just in case...
+
+102    string          mBIN            MacBinary III data with surprising version number
+
+# sas magic from Bruce Foster (bef@nwu.edu)
+#
+#0     string          SAS             SAS
+#>8    string          x               %s
+0      string          SAS             SAS
+>24    string          DATA            data file
+>24    string          CATALOG         catalog
+>24    string          INDEX           data file index
+>24    string          VIEW            data view
+# spss magic for SPSS system and portable files, 
+#       from Bruce Foster (bef@nwu.edu).
+
+0      long            0xc1e2c3c9      SPSS Portable File
+>40    string          x               %s
+
+0      string          $FL2            SPSS System File
+>24    string          x               %s
+
+# Macintosh filesystem data
+# From "Tom N Harris" <telliamed@mac.com>
+# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these
+# entries depend on the data arithmetic added after v.35
+# There's also some Pascal strings in here, ditto...
+
+# The boot block signature, according to IM:Files, is 
+# "for HFS volumes, this field always contains the value 0x4C4B."
+# But if this is true for MFS or HFS+ volumes, I don't know.
+# Alternatively, the boot block is supposed to be zeroed if it's
+# unused, so a simply >0 should suffice.
+
+0x400  beshort                 0xD2D7          Macintosh MFS data
+>0     beshort                 0x4C4B          (bootable)
+>0x40a beshort                 &0x8000         (locked)
+>0x402 beldate-0x7C25B080      x               created: %s,
+>0x406 beldate-0x7C25B080      >0              last backup: %s,
+>0x414 belong                  x               block size: %d,
+>0x412 beshort                 x               number of blocks: %d,
+>0x424 pstring                 x               volume name: %s
+
+0x400  beshort                 0x4244          Macintosh HFS data
+>0     beshort                 0x4C4B          (bootable)
+>0x40a beshort                 &0x8000         (locked)
+>0x40a beshort                 ^0x0100         (mounted)
+>0x40a beshort                 &0x0800         (unclean)
+>0x402 beldate-0x7C25B080      x               created: %s,
+>0x406 beldate-0x7C25B080      x               last modified: %s,
+>0x440 beldate-0x7C25B080      >0              last backup: %s,
+>0x414 belong                  x               block size: %d,
+>0x412 beshort                 x               number of blocks: %d,
+>0x424 pstring                 x               volume name: %s
+#>0x480        beshort                 =0x482B         Embedded HFS+ Volume:
+#>>((0x482*(0x414))+(0x41c*512))       x       \b
+# Well, this is (theoretically) how we could do this. But it occurs to
+# me that we likely don't read in a large enough chunk. I don't have any
+# HFS+ volumes to see what a typical offset would be.
+
+0x400  beshort                 0x482B          Macintosh HFS Extended
+>&2    beshort                 x               version %d data
+>0     beshort                 0x4C4B          (bootable)
+>&4    belong                  ^0x00000100     (mounted)
+>&4    belong                  &0x00000800     (unclean)
+>&4    belong                  &0x00008000     (locked)
+>&8    string                  x               last mounted by: '%.4s',
+# really, that should be treated as a belong and we print a string
+# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1"
+>&16   beldate-0x7C25B080      x               created: %s,
+>&20   beldate-0x7C25B080      x               last modified: %s,
+>&24   beldate-0x7C25B080      >0              last backup: %s,
+>&28   beldate-0x7C25B080      >0              last checked: %s,
+>&40   belong                  x               block size: %d,
+>&44   belong                  x               number of blocks: %d,
+>&48   belong                  x               free blocks: %d
+
+# I don't think this is really necessary since it doesn't do much and 
+# anything with a valid driver descriptor will also have a valid
+# partition map
+#0             beshort         0x4552          Apple Device Driver data
+#>&24          beshort         =1              \b, MacOS
+
+# Is that the partition type a cstring or a pstring? Well, IM says "strings 
+# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a 
+# cstring. Of course, partitions can contain more than four entries, but 
+# what're you gonna do?
+0x200          beshort         0x504D          Apple Partition data
+>&2            beshort         x               block size: %d
+>&48           string          x               first type: %s,
+>&12           belong          x               number of blocks: %d,
+>(&0x2.S)      beshort         0x504D          
+>>&48          string          x               second type: %s
+>>&12          belong          x               number of blocks: %d,
+>>(&0x2.S)     beshort         0x504D          
+>>>&48         string          x               third type: %s
+>>>&12         belong          x               number of blocks: %d,
+>>>(&0x2.S)    beshort         0x504D          
+>>>>&48                string          x               fourth type: %s
+>>>>&12                belong          x               number of blocks: %d,
+# AFAIK, only the signature is different
+0x200          beshort         0x5453          Apple Old Partition data
+>&2            beshort         x               block size: %d
+>&48           string          x               first type: %s,
+>&12           belong          x               number of blocks: %d,
+>(&0x2.S)      beshort         0x504D          
+>>&48          string          x               second type: %s
+>>&12          belong          x               number of blocks: %d,
+>>(&0x2.S)     beshort         0x504D          
+>>>&48         string          x               third type: %s
+>>>&12         belong          x               number of blocks: %d,
+>>>(&0x2.S)    beshort         0x504D          
+>>>>&48                string          x               fourth type: %s
+>>>>&12                belong          x               number of blocks: %d,
diff --git a/file/Magdir/magic b/file/Magdir/magic
new file mode 100644 (file)
index 0000000..3bf4e2e
--- /dev/null
@@ -0,0 +1,9 @@
+
+#------------------------------------------------------------------------------
+# magic:  file(1) magic for magic files
+#
+0      string          #\ Magic        magic text file for file(1) cmd
+0      lelong          0xF11E041C      magic binary file for file(1) cmd
+>4     lelong          x               (version %d) (little endian)
+0      belong          0xF11E041C      magic binary file for file(1) cmd
+>4     belong          x               (version %d) (big endian)
diff --git a/file/Magdir/mail.news b/file/Magdir/mail.news
new file mode 100644 (file)
index 0000000..ab8b293
--- /dev/null
@@ -0,0 +1,28 @@
+
+#------------------------------------------------------------------------------
+# mail.news:  file(1) magic for mail and news
+#
+# Unfortunately, saved netnews also has From line added in some news software.
+#0     string          From            mail text
+# There are tests to ascmagic.c to cope with mail and news.
+0      string          Relay-Version:  old news text
+0      string          #!\ rnews       batched news text
+0      string          N#!\ rnews      mailed, batched news text
+0      string          Forward\ to     mail forwarding text
+0      string          Pipe\ to        mail piping text
+0      string          Return-Path:    smtp mail text
+0      string          Path:           news text
+0      string          Xref:           news text
+0      string          From:           news or mail text
+0      string          Article         saved news text
+0      string          BABYL           Emacs RMAIL text
+0      string          Received:       RFC 822 mail text
+0      string          MIME-Version:   MIME entity text
+#0     string          Content-        MIME entity text
+
+# TNEF files...
+0      lelong          0x223E9F78      Transport Neutral Encapsulation Format
+
+# From: Kevin Sullivan <ksulliva@psc.edu>
+0      string          *mbx*           MBX mail folder
+
diff --git a/file/Magdir/maple b/file/Magdir/maple
new file mode 100644 (file)
index 0000000..f39c62d
--- /dev/null
@@ -0,0 +1,57 @@
+
+#------------------------------------------------------------------------------
+# maple:  file(1) magic for maple files
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Maple V release 4, a multi-purpose math program
+#
+
+# maple library .lib
+0      string  \000MVR4\nI     MapleVr4 library
+
+# .ind
+# no magic for these :-(
+# they are compiled indexes for maple files
+
+# .hdb 
+0      string  \000\004\000\000        Maple help database
+
+# .mhp
+# this has the form <PACKAGE=name>
+0      string  \<PACKAGE=      Maple help file
+0      string  \<HELP\ NAME=   Maple help file
+0      string  \n\<HELP\ NAME= Maple help file with extra carriage return at start (yuck)
+0      string  #\ Newton       Maple help file, old style
+0      string  #\ daub Maple help file, old style
+0      string  #===========    Maple help file, old style
+
+# .mws
+0      string  \000\000\001\044\000\221        Maple worksheet
+#this is anomalous
+0      string  WriteNow\000\002\000\001\000\000\000\000\100\000\000\000\000\000        Maple worksheet, but weird
+# this has the form {VERSION 2 3 "IBM INTEL NT" "2.3" }\n
+# that is {VERSION major_version miunor_version computer_type version_string}
+0      string  {VERSION\       Maple worksheet
+>9     string  >\0     version %.1s.
+>>10   string
+>>>11  string  >\0     %.1s
+
+# .mps
+0      string  \0\0\001$       Maple something
+# from byte 4 it is either 'nul E' or 'soh R'
+# I think 'nul E' means a file that was saved as  a different name
+# a sort of revision marking
+# 'soh R' means new 
+>4     string  \000\105        An old revision
+>4     string  \001\122        The latest save
+
+# .mpl
+# some of these are the same as .mps above
+#0000000 000 000 001 044 000 105 same as .mps
+#0000000 000 000 001 044 001 122 same as .mps
+
+0      string  #\n##\ <SHAREFILE=      Maple something
+0      string  \n#\n##\ <SHAREFILE=    Maple something
+0      string  ##\ <SHAREFILE= Maple something
+0      string  #\r##\ <SHAREFILE=      Maple something
+0      string  \r#\r##\ <SHAREFILE=    Maple something
+0      string  #\ \r##\ <DESCRIBE>     Maple something anomalous.
diff --git a/file/Magdir/mathematica b/file/Magdir/mathematica
new file mode 100644 (file)
index 0000000..136c253
--- /dev/null
@@ -0,0 +1,59 @@
+
+#------------------------------------------------------------------------------
+# mathematica:  file(1) magic for mathematica files
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Mathematica a multi-purpose math program
+# versions 2.2 and 3.0
+
+#mathematica .mb
+0      string  \064\024\012\000\035\000\000\000        Mathematica version 2 notebook
+0      string  \064\024\011\000\035\000\000\000        Mathematica version 2 notebook
+
+# .ma
+# multiple possibilites:
+
+0      string  (*^\n\n::[\011frontEndVersion\ =\       Mathematica notebook
+#>41   string  >\0     %s
+
+#0     string  (*^\n\n::[\011palette   Mathematica notebook version 2.x
+
+#0     string  (*^\n\n::[\011Information       Mathematica notebook version 2.x
+#>675  string  >\0     %s #doesn't work well
+
+# there may be 'cr' instread of 'nl' in some does this matter?
+
+# generic:
+0      string  (*^\r\r::[\011  Mathematica notebook version 2.x
+0      string  \(\*\^\r\n\r\n\:\:\[\011        Mathematica notebook version 2.x
+0      string  (*^\015                 Mathematica notebook version 2.x
+0      string  (*^\n\r\n\r::[\011      Mathematica notebook version 2.x
+0      string  (*^\r::[\011    Mathematica notebook version 2.x
+0      string  (*^\r\n::[\011  Mathematica notebook version 2.x
+0      string  (*^\n\n::[\011  Mathematica notebook version 2.x
+0      string  (*^\n::[\011    Mathematica notebook version 2.x
+
+
+# Mathematica .mx files
+
+#0     string  (*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*)      Mathematica binary file
+0      string  (*This\ is\ a\ Mathematica\ binary\     Mathematica binary file
+#>71   string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000     
+# >71... is optional
+>88    string  >\0     from %s
+
+
+# Mathematica files PBF:
+# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000
+0      string  MMAPBF\000\001\000\000\000\203\000\001\000      Mathematica PBF (fonts I think)
+
+# .ml files  These are menu resources I think
+# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ 
+# how to put that into a magic rule?
+4      string  \ A~    MAthematica .ml file
+
+# .nb files
+#too long 0    string  (***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook     Mathematica 3.0 notebook
+0      string  (***********************        Mathematica 3.0 notebook
+
+# other (* matches it is a comment start in these langs
+0      string  (*      Mathematica, or Pascal,  Modula-2 or 3 code
diff --git a/file/Magdir/mcrypt b/file/Magdir/mcrypt
new file mode 100644 (file)
index 0000000..6416104
--- /dev/null
@@ -0,0 +1,31 @@
+#------------------------------------------------------------------------------
+# Mavroyanopoulos Nikos <nmav@hellug.gr>
+# mcrypt:   file(1) magic for mcrypt 2.2.x;
+0      string          \0m\2           mcrypt 2.2 encrypted data,
+>3     byte            0               algorithm: blowfish-448,
+>3     byte            1               algorithm: DES,
+>3     byte            2               algorithm: 3DES,
+>3     byte            3               algorithm: 3-WAY,
+>3     byte            4               algorithm: GOST,
+>3     byte            6               algorithm: SAFER-SK64,
+>3     byte            7               algorithm: SAFER-SK128,
+>3     byte            8               algorithm: CAST-128,
+>3     byte            9               algorithm: xTEA,
+>3     byte            10              algorithm: TWOFISH-128,
+>3     byte            11              algorithm: RC2,
+>3     byte            12              algorithm: TWOFISH-192,
+>3     byte            13              algorithm: TWOFISH-256,
+>3     byte            14              algorithm: blowfish-128,
+>3     byte            15              algorithm: blowfish-192,
+>3     byte            16              algorithm: blowfish-256,
+>3     byte            100             algorithm: RC6,
+>3     byte            101             algorithm: IDEA,
+>4     byte            0               mode: CBC,
+>4     byte            1               mode: ECB,
+>4     byte            2               mode: CFB,
+>4     byte            3               mode: OFB,
+>4     byte            4               mode: nOFB,
+>5     byte            0               keymode: 8bit
+>5     byte            1               keymode: 4bit
+>5     byte            2               keymode: SHA-1 hash
+>5     byte            3               keymode: MD5 hash
diff --git a/file/Magdir/mime b/file/Magdir/mime
new file mode 100644 (file)
index 0000000..0102709
--- /dev/null
@@ -0,0 +1,7 @@
+#------------------------------------------------------------------------------
+# mime:  file(1) magic for MIME encoded files
+#
+0      string          Content-Type:\
+>14    string          >\0             %s
+0      string          Content-Type:
+>13    string          >\0             %s
diff --git a/file/Magdir/mips b/file/Magdir/mips
new file mode 100644 (file)
index 0000000..9333bde
--- /dev/null
@@ -0,0 +1,177 @@
+
+#------------------------------------------------------------------------------
+# mips:  file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)
+#                         Dec Ultrix (MIPS)
+# all of SGI's *current* machines and OSes run in big-endian mode on the
+# MIPS machines, as far as I know.
+#
+# XXX - what is the blank "-" line?
+#
+# kbd file definitions
+0      string  kbd!map         kbd map file
+>8     byte    >0              Ver %d:
+>10    short   >0              with %d table(s)
+0      belong  0407            old SGI 68020 executable
+0      belong  0410            old SGI 68020 pure executable
+0      beshort 0x8765          disk quotas file
+0      beshort 0x0506          IRIS Showcase file
+>2     byte    0x49            -
+>3     byte    x               - version %ld
+0      beshort 0x0226          IRIS Showcase template
+>2     byte    0x63            -
+>3     byte    x               - version %ld
+0      belong  0x5343464d      IRIS Showcase file
+>4     byte    x               - version %ld
+0      belong  0x5443464d      IRIS Showcase template
+>4     byte    x               - version %ld
+0      belong  0xdeadbabe      IRIX Parallel Arena
+>8     belong  >0              - version %ld
+#
+0      beshort 0x0160          MIPSEB ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x0162          MIPSEL-BE ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %d
+>22    byte    x               \b.%ld
+#
+0      beshort 0x6001          MIPSEB-LE ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %d
+>22    byte    x               \b.%ld
+#
+0      beshort 0x6201          MIPSEL ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+# MIPS 2 additions
+#
+0      beshort 0x0163          MIPSEB MIPS-II ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x0166          MIPSEL-BE MIPS-II ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x6301          MIPSEB-LE MIPS-II ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+0      beshort 0x6601          MIPSEL MIPS-II ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+# MIPS 3 additions
+#
+0      beshort 0x0140          MIPSEB MIPS-III ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x0142          MIPSEL-BE MIPS-III ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x4001          MIPSEB-LE MIPS-III ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+0      beshort 0x4201          MIPSEL MIPS-III ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+0      beshort 0x180           MIPSEB Ucode
+0      beshort 0x182           MIPSEL-BE Ucode
+# 32bit core file
+0      belong  0xdeadadb0      IRIX core dump
+>4     belong  1               of
+>16    string  >\0             '%s'
+# 64bit core file
+0      belong  0xdeadad40      IRIX 64-bit core dump
+>4     belong  1               of
+>16    string  >\0             '%s'
+# N32bit core file
+0       belong 0xbabec0bb      IRIX N32 core dump
+>4      belong 1               of
+>16     string >\0             '%s'
+# New style crash dump file
+0      string  \x43\x72\x73\x68\x44\x75\x6d\x70        IRIX vmcore dump of
+>36    string  >\0                                     '%s'
+# Trusted IRIX info
+0      string  SGIAUDIT        SGI Audit file
+>8     byte    x               - version %d
+>9     byte    x               \b.%ld
+#
+0      string  WNGZWZSC        Wingz compiled script
+0      string  WNGZWZSS        Wingz spreadsheet
+0      string  WNGZWZHP        Wingz help file
+#
+0      string  \#Inventor V    IRIS Inventor 1.0 file
+0      string  \#Inventor V2   Open Inventor 2.0 file
+# GLF is OpenGL stream encoding
+0      string  glfHeadMagic();         GLF_TEXT
+4      belong  0x7d000000              GLF_BINARY_LSB_FIRST
+4      belong  0x0000007d              GLF_BINARY_MSB_FIRST
+# GLS is OpenGL stream encoding; GLS is the successor of GLF
+0      string  glsBeginGLS(            GLS_TEXT
+4      belong  0x10000000              GLS_BINARY_LSB_FIRST
+4      belong  0x00000010              GLS_BINARY_MSB_FIRST
diff --git a/file/Magdir/mirage b/file/Magdir/mirage
new file mode 100644 (file)
index 0000000..73c3747
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# mirage:  file(1) magic for Mirage executables
+#
+# XXX - byte order?
+#
+0      long    31415           Mirage Assembler m.out executable
diff --git a/file/Magdir/mkid b/file/Magdir/mkid
new file mode 100644 (file)
index 0000000..dfb2d93
--- /dev/null
@@ -0,0 +1,10 @@
+
+#------------------------------------------------------------------------------
+# mkid:  file(1) magic for mkid(1) databases
+#
+# ID is the binary tags database produced by mkid(1).
+#
+# XXX - byte order?
+#
+0      string          \311\304        ID tags data
+>2     short           >0              version %d
diff --git a/file/Magdir/mlssa b/file/Magdir/mlssa
new file mode 100644 (file)
index 0000000..21ab61e
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# mlssa: file(1) magic for MLSSA datafiles
+#
+0              lelong          0xffffabcd      MLSSA datafile,
+>4             leshort         x               algorithm %d,
+>10            lelong          x               %d samples
diff --git a/file/Magdir/mmdf b/file/Magdir/mmdf
new file mode 100644 (file)
index 0000000..72cd9f3
--- /dev/null
@@ -0,0 +1,5 @@
+
+#------------------------------------------------------------------------------
+# mmdf:  file(1) magic for MMDF mail files
+#
+0      string  \001\001\001\001        MMDF mailbox
diff --git a/file/Magdir/modem b/file/Magdir/modem
new file mode 100644 (file)
index 0000000..73e747e
--- /dev/null
@@ -0,0 +1,33 @@
+#------------------------------------------------------------------------------
+# modem:  file(1) magic for modem programs
+#
+# From: Florian La Roche <florian@knorke.saar.de>
+4      string          Research,       Digifax-G3-File
+>29    byte            1               , fine resolution
+>29    byte            0               , normal resolution
+
+0      short           0x0100          raw G3 data, byte-padded
+0      short           0x1400          raw G3 data
+#
+# Magic data for vgetty voice formats
+# (Martin Seine & Marc Eberhard)
+
+#
+# raw modem data version 1
+#
+0    string    RMD1      raw modem data
+>4   string    >\0       (%s /
+>20  short     >0        compression type 0x%04x)
+
+#
+# portable voice format 1
+#
+0    string    PVF1\n         portable voice format
+>5   string    >\0       (binary %s)
+
+#
+# portable voice format 2
+#
+0    string    PVF2\n         portable voice format
+>5   string >\0          (ascii %s)
+
diff --git a/file/Magdir/motorola b/file/Magdir/motorola
new file mode 100644 (file)
index 0000000..1a3174c
--- /dev/null
@@ -0,0 +1,50 @@
+
+#------------------------------------------------------------------------------
+# motorola:  file(1) magic for Motorola 68K and 88K binaries
+#
+# 68K
+#
+0      beshort         0520            mc68k COFF
+>18    beshort         ^00000020       object
+>18    beshort         &00000020       executable
+>12    belong          >0              not stripped
+>168   string          .lowmem         Apple toolbox
+>20    beshort         0407            (impure)
+>20    beshort         0410            (pure)
+>20    beshort         0413            (demand paged)
+>20    beshort         0421            (standalone)
+0      beshort         0521            mc68k executable (shared)
+>12    belong          >0              not stripped
+0      beshort         0522            mc68k executable (shared demand paged)
+>12    belong          >0              not stripped
+#
+# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
+#
+0      beshort         0554            68K BCS executable
+#
+# 88K
+#
+# Motorola/88Open BCS
+#
+0      beshort         0555            88K BCS executable
+#
+# Motorola S-Records, from Gerd Truschinski <gt@freebsd.first.gmd.de>
+0   string      S0          Motorola S-Record; binary data in text format
+
+# ATARI ST relocatable PRG
+#
+# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001
+# (according to Roland Waldi, Oct 21, 1987)
+# besides the magic 0x601a, the text segment size is checked to be
+# not larger than 1 MB (which is a lot on ST).
+# The additional 0x601b distinction I took from Doug Lee's magic.
+0      belong&0xFFFFFFF0       0x601A0000      Atari ST M68K contiguous executable
+>2     belong                  x               (txt=%ld,
+>6     belong                  x               dat=%ld,
+>10    belong                  x               bss=%ld,
+>14    belong                  x               sym=%ld)
+0      belong&0xFFFFFFF0       0x601B0000      Atari ST M68K non-contig executable
+>2     belong                  x               (txt=%ld,
+>6     belong                  x               dat=%ld,
+>10    belong                  x               bss=%ld,
+>14    belong                  x               sym=%ld)
diff --git a/file/Magdir/msdos b/file/Magdir/msdos
new file mode 100644 (file)
index 0000000..771a8fd
--- /dev/null
@@ -0,0 +1,309 @@
+
+#------------------------------------------------------------------------------
+# msdos:  file(1) magic for MS-DOS files
+#
+
+# .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)
+0      string  @echo\ off      MS-DOS batch file text
+
+# XXX - according to Microsoft's spec, at an offset of 0x3c in a
+# PE-format executable is the offset in the file of the PE header;
+# unfortunately, that's a little-endian offset, and there's no way
+# to specify an indirect offset with a specified byte order.
+# So, for now, we assume the standard MS-DOS stub, which puts the
+# PE header at 0x80 = 128.
+#
+# Required OS version and subsystem version were 4.0 on some NT 3.51
+# executables built with Visual C++ 4.0, so it's not clear that
+# they're interesting.  The user version was 0.0, but there's
+# probably some linker directive to set it.  The linker version was
+# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
+#
+128    string          PE\0\0  MS Windows PE
+>150   leshort&0x0100  >0      32-bit
+>132   leshort         0x0     unknown processor
+>132   leshort         0x14c   Intel 80386
+>132   leshort         0x166   MIPS R4000
+>132   leshort         0x184   Alpha
+>132   leshort         0x268   Motorola 68000
+>132   leshort         0x1f0   PowerPC
+>132   leshort         0x290   PA-RISC
+>148   leshort         >27
+>>220  leshort         0       unknown subsystem
+>>220  leshort         1       native
+>>220  leshort         2       GUI
+>>220  leshort         3       console
+>>220  leshort         7       POSIX
+>150   leshort&0x2000  =0      executable
+#>>136 ledate          x       stamp %s,
+>>150  leshort&0x0001  >0      not relocatable
+#>>150 leshort&0x0004  =0      with line numbers,
+#>>150 leshort&0x0008  =0      with local symbols,
+#>>150 leshort&0x0200  =0      with debug symbols,
+>>150  leshort&0x1000  >0      system file
+#>>148 leshort         >0
+#>>>154        byte            x       linker %d
+#>>>155        byte            x       \b.%d,
+#>>148 leshort         >27
+#>>>192        leshort         x       requires OS %d
+#>>>194        leshort         x       \b.%d,
+#>>>196        leshort         x       user version %d
+#>>>198        leshort         x       \b.%d,
+#>>>200        leshort         x       subsystem version %d
+#>>>202        leshort         x       \b.%d,
+>150   leshort&0x2000  >0      DLL
+#>>136 ledate          x       stamp %s,
+>>150  leshort&0x0001  >0      not relocatable
+#>>150 leshort&0x0004  =0      with line numbers,
+#>>150 leshort&0x0008  =0      with local symbols,
+#>>150 leshort&0x0200  =0      with debug symbols,
+>>150  leshort&0x1000  >0      system file
+#>>148 leshort         >0
+#>>>154        byte            x       linker %d
+#>>>155        byte            x       \b.%d,
+#>>148 leshort         >27
+#>>>192        leshort         x       requires OS %d
+#>>>194        leshort         x       \b.%d,
+#>>>196        leshort         x       user version %d
+#>>>198        leshort         x       \b.%d,
+#>>>200        leshort         x       subsystem version %d
+#>>>202        leshort         x       \b.%d,
+0      leshort         0x14c   MS Windows COFF Intel 80386 object file
+#>4    ledate          x       stamp %s
+0      leshort         0x166   MS Windows COFF MIPS R4000 object file
+#>4    ledate          x       stamp %s
+0      leshort         0x184   MS Windows COFF Alpha object file
+#>4    ledate          x       stamp %s
+0      leshort         0x268   MS Windows COFF Motorola 68000 object file
+#>4    ledate          x       stamp %s
+0      leshort         0x1f0   MS Windows COFF PowerPC object file
+#>4    ledate          x       stamp %s
+0      leshort         0x290   MS Windows COFF PA-RISC object file
+#>4    ledate          x       stamp %s
+
+# .EXE formats (Greg Roelofs, newt@uchicago.edu)
+#
+0      string  MZ              MS-DOS executable (EXE)
+>24    string  @               \b, OS/2 or MS Windows
+>>0xe7 string  LH/2\ Self-Extract      \b, %s
+>>0xe9 string  PKSFX2          \b, %s
+>>122  string  Windows\ self-extracting\ ZIP   \b, %s
+>0x1c  string  RJSX\xff\xff    \b, ARJ SFX
+>0x1c  string  diet\xf9\x9c    \b, diet compressed
+>0x1e  string  Copyright\ 1989-1990\ PKWARE\ Inc.      \b, PKSFX
+# JM: 0x1e "PKLITE Copr. 1990-92 PKWARE Inc. All Rights Reserved\7\0\0\0"
+>0x1e  string  PKLITE\ Copr.   \b, %.6s compressed
+>0x24  string  LHa's\ SFX      \b, %.15s
+>0x24  string  LHA's\ SFX      \b, %.15s
+>1638  string  -lh5-           \b, LHa SFX archive v2.13S
+>7195  string  Rar!            \b, RAR self-extracting archive
+#
+# [GRR 950118:  file 3.15 has a buffer-size limitation; offsets bigger than
+#   8161 bytes are ignored.  To make the following entries work, increase
+#   HOWMANY in file.h to 32K at least, and maybe to 70K or more for OS/2,
+#   NT/Win32 and VMS.]
+# [GRR:  some company sells a self-extractor/displayer for image data(!)]
+#
+>11696 string  PK\003\004      \b, PKZIP SFX archive v1.1
+>13297 string  PK\003\004      \b, PKZIP SFX archive v1.93a
+>15588 string  PK\003\004      \b, PKZIP2 SFX archive v1.09
+>15770 string  PK\003\004      \b, PKZIP SFX archive v2.04g
+>28374 string  PK\003\004      \b, PKZIP2 SFX archive v1.02
+#
+# Info-ZIP self-extractors
+#    these are the DOS versions:
+>25115 string  PK\003\004      \b, Info-ZIP SFX archive v5.12
+>26331 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+#    these are the OS/2 versions (OS/2 is flagged above):
+>47031 string  PK\003\004      \b, Info-ZIP SFX archive v5.12
+>49845 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+#    this is the NT/Win32 version:
+>69120 string  PK\003\004      \b, Info-ZIP NT SFX archive v5.12 w/decryption
+#
+# TELVOX Teleinformatica CODEC self-extractor for OS/2:
+>49801 string  \x79\xff\x80\xff\x76\xff        \b, CODEC archive v3.21
+>>49824        leshort         =1                      \b, 1 file
+>>49824        leshort         >1                      \b, %u files
+
+# .COM formats (Daniel Quinlan, quinlan@yggdrasil.com)
+# Uncommenting only the first two lines will cover about 2/3 of COM files,
+# but it isn't feasible to match all COM files since there must be at least
+# two dozen different one-byte "magics".
+#0     byte            0xe9            MS-DOS executable (COM)
+#>6    string  SFX\ of\ LHarc  (%s)
+#0     byte            0x8c            MS-DOS executable (COM)
+# 0xeb conflicts with "sequent" magic
+#0     byte            0xeb            MS-DOS executable (COM)
+#0     byte            0xb8            MS-DOS executable (COM)
+
+# miscellaneous formats
+0      string          LZ              MS-DOS executable (built-in)
+#0     byte            0xf0            MS-DOS program library data
+#
+
+#
+# Windows NT Registry files.
+#
+0      string          regf            Windows NT Registry file
+
+# Popular applications
+2080   string  Microsoft\ Word\ 6.0\ Document  %s
+2080   string  Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
+# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Word)
+2112   string  MSWordDoc                       Microsoft Word document data
+#
+0      belong  0x31be0000                      Microsoft Word Document
+#
+0       string  PO^Q`                          Microsoft Word 6.0 Document
+#
+0      string  \376\067\0\043                  Microsoft Office Document
+0      string  \320\317\021\340\241\261        Microsoft Office Document
+0      string  \333\245-\0\0\0                 Microsoft Office Document
+#
+2080   string  Microsoft\ Excel\ 5.0\ Worksheet        %s
+#
+# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
+2114   string  Biff5           Microsoft Excel 5.0 Worksheet
+#
+0      belong  0x00001a00      Lotus 1-2-3
+>4     belong  0x00100400      wk3 document data
+>4     belong  0x02100400      wk4 document data
+>4     belong  0x07800100      fm3 or fmb document data
+>4     belong  0x07800000      fm3 or fmb document data
+#
+0      belong  0x00000200      Lotus 1-2-3
+>4     belong  0x06040600      wk1 document data
+>4     belong  0x06800200      fmt document data
+
+# Help files
+0      string  ?_\3\0          MS Windows Help Data
+
+# Microsoft CAB distribution format  Dale Worley <root@dworley.ny.mediaone.net>
+0      string          MSCF\000\000\000\000    Microsoft CAB file
+
+#  DeIsL1.isu what this is I don't know
+0      string  \161\250\000\000\001\002        DeIsL1.isu whatever that is
+
+# Winamp .avs
+#0     string  Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player
+0      string  Nullsoft\ AVS\ Preset\  Winamp plug in
+
+# Hyper terminal:
+0      string  HyperTerminal\  hyperterm
+>15    string  1.0\ --\ HyperTerminal\ data\ file      MS-windows Hyperterminal
+
+# Windows Metafont .WMF
+0      string  \327\315\306\232\000\000\000\000\000\000        ms-windows metafont .wmf
+
+#tz3 files whatever that is (MS Works files)
+0      string  \003\001\001\004\070\001\000\000        tz3 ms-works file
+0      string  \003\002\001\004\070\001\000\000        tz3 ms-works file
+0      string  \003\003\001\004\070\001\000\000        tz3 ms-works file
+
+# PGP sig files .sig
+#0 string \211\000\077\003\005\000\063\237\127 065 to  \027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
+
+# windows zips files .dmf
+0      string  MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 Ms-windows special zipped file
+
+
+# Windows help file FTG FTS
+0      string  \164\146\115\122\012\000\000\000\001\000\000\000        ms-windows help cache
+
+# grp old windows 3.1 group files
+0 string  \120\115\103\103     Ms-windows 3.1 group files
+
+
+# lnk files windows symlinks
+0      string  \114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106        ms-Windows shortcut
+
+#ico files
+0      string  \102\101\050\000\000\000\056\000\000\000\000\000\000\000        Icon for ms-windows
+
+# Windows icons (Ian Springer <ips@fpk.hp.com>)
+0      string  \000\000\001\000        ms-windows icon resource
+>4     byte    1                       - 1 icon
+>4     byte    >1                      - %d icons
+>>6    byte    >0                      \b, %dx
+>>>7   byte    >0                      \b%d
+>>8    byte    0                       \b, 256-colors
+>>8    byte    >0                      \b, %d-colors
+
+
+# True Type fonts currently misidentified as raw G3 data
+
+0      string  \000\001\000\000\000 MS-Windows true type font .ttf
+
+
+# .chr files
+0      string  PK\010\010BGI   Borland font 
+>4     string  >\0     %s
+# then there is a copyright notice
+
+
+# .bgi files
+0      string  pk\010\010BGI   Borland device 
+>4     string  >\0     %s
+# then there is a copyright notice
+
+
+# recycled/info the windows trash bin index
+9      string  \000\000\000\030\001\000\000\000 ms-windows recycled bin info
+
+
+##### put in Either Magic/font or Magic/news
+# Acroread or something  files wrongly identified as G3  .pfm
+# these have the form \000 \001 any? \002 \000 \000
+# or \000 \001 any? \022 \000 \000
+0      string  \000\001 pfm?
+>3     string  \022\000\000Copyright\  yes
+>3     string  \002\000\000Copyright\  yes
+#>3    string  >\0     oops, not a font file. Cancel that.
+#it clashes with ttf files so put it lower down.
+
+# From Doug Lee via a FreeBSD pr
+9      string          GERBILDOC       First Choice document
+9      string          GERBILDB        First Choice database
+9      string          GERBILCLIP      First Choice database
+0      string          GERBIL          First Choice device file
+9      string          RABBITGRAPH     RabbitGraph file
+0      string          DCU1            Borland Delphi .DCU file
+0      string          !<spell>        MKS Spell hash list (old format)
+0      string          !<spell2>       MKS Spell hash list
+0      string          AH              Halo(TM) bitmapped font file
+0      lelong          0x08086b70      TurboC BGI file
+0      lelong          0x08084b50      TurboC Font file
+
+# WARNING: below line conflicts with Infocom game data Z-machine 3
+0      byte            0x03            DBase 3 data file
+>0x04  lelong          0               (no records)
+>0x04  lelong          >0              (%ld records)
+0      byte            0x83            DBase 3 data file with memo(s)
+>0x04  lelong          0               (no records)
+>0x04  lelong          >0              (%ld records)
+0      leshort         0x0006          DBase 3 index file
+0      string          PMCC            Windows 3.x .GRP file
+1      string          RDC-meg         MegaDots 
+>8     byte            >0x2F           version %c
+>9     byte            >0x2F           \b.%c file
+0      lelong          0x4C
+>4     lelong          0x00021401      Windows shortcut file
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews@Black.Market.NET>
+0      belong          0xC5D0D3C6      DOS EPS Binary File
+>4     long            >0              Postscript starts at byte %d
+>>8    long            >0              length %d
+>>>12  long            >0              Metafile starts at byte %d
+>>>>16 long            >0              length %d
+>>>20  long            >0              TIFF starts at byte %d
+>>>>24 long            >0              length %d
+
+# TNEF magic From "Joomy" <joomy@se-ed.net> 
+0      leshort         0x223e9f78      TNEF
diff --git a/file/Magdir/msvc b/file/Magdir/msvc
new file mode 100644 (file)
index 0000000..95853fe
--- /dev/null
@@ -0,0 +1,44 @@
+
+#------------------------------------------------------------------------------
+# msvc:  file(1) magic for msvc
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Microsoft visual C
+# 
+# I have version 1.0
+
+# .aps
+0      string  HWB\000\377\001\000\000\000     Microsoft Visual C .APS file
+
+# .ide
+#too long 0    string  \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316        MSVC .ide
+0      string  \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157    MSVC .ide
+
+# .res
+0      string  \000\000\000\000\040\000\000\000\377    MSVC .res
+0      string  \377\003\000\377\001\000\020\020\350    MSVC .res
+0      string  \377\003\000\377\001\000\060\020\350    MSVC .res
+
+#.lib
+0      string  \360\015\000\000        Microsoft Visual C library
+0      string  \360\075\000\000        Microsoft Visual C library
+0      string  \360\175\000\000        Microsoft Visual C library
+
+#.pch
+0      string  DTJPCH0\000\022\103\006\200     Microsoft Visual C .pch
+
+# .pdb
+# too long 0   string  Microsoft\ C/C++\ program\ database\ 
+0      string  Microsoft\ C/C++\       MSVC program database
+>18    string  program\ database\      
+>33    string  >\0     ver %s
+
+#.sbr
+0      string  \000\002\000\007\000    MSVC .sbr
+>5     string  >\0     %s
+
+#.bsc
+0      string  \002\000\002\001        MSVC .bsc
+
+#.wsp
+0      string  1.00\ .0000.0000\000\003        MSVC .wsp version 1.0000.0000
+# these seem to start with the version and contain menus
diff --git a/file/Magdir/natinst b/file/Magdir/natinst
new file mode 100644 (file)
index 0000000..5deb9de
--- /dev/null
@@ -0,0 +1,23 @@
+
+#-----------------------------------------------------------------------------
+# natinst:  file(1) magic for National Instruments Code Files
+
+#
+# From <egamez@fcfm.buap.mx> Enrique Gámez-Flores
+# version 1
+# Many formats still missing, we use, for the moment LabVIEW
+# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing
+#
+0       string          RSRC            National Instruments,
+# Check if it's a LabVIEW File
+>8      string          LV              LabVIEW File,
+# Check wich kind of file is
+>>10    string          SB              Code Resource File, data
+>>10    string          IN              Virtual Instrument Program, data
+>>10    string          AR              VI Library, data
+# This is for Menu Libraries
+>8      string          LMNULBVW        Portable File Names, data
+# This is for General Resources
+>8      string          rsc             Resources File, data
+# This is for VXI Package
+0       string          VMAP            National Instruments, VXI File, data
diff --git a/file/Magdir/ncr b/file/Magdir/ncr
new file mode 100644 (file)
index 0000000..987c94e
--- /dev/null
@@ -0,0 +1,48 @@
+
+#------------------------------------------------------------------------------
+# ncr:  file(1) magic for NCR Tower objects
+#
+# contributed by
+# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne@ford-vax.arpa
+# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne@fmsrl7.UUCP
+#
+0      beshort         000610  Tower/XP rel 2 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000615  Tower/XP rel 2 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000620  Tower/XP rel 3 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000625  Tower/XP rel 3 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000630  Tower32/600/400 68020 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000640  Tower32/800 68020
+>18       beshort              &020000 w/68881 object
+>18       beshort              &040000 compatible object
+>18       beshort              &~060000        object
+>20       beshort              0407    executable
+>20       beshort              0413    pure executable
+>12       belong               >0      not stripped
+>22       beshort              >0      - version %ld
+0      beshort         000645  Tower32/800 68010
+>18       beshort              &040000 compatible object
+>18       beshort              &~060000 object
+>20       beshort              0407    executable
+>20       beshort              0413    pure executable
+>12       belong               >0      not stripped
+>22       beshort              >0      - version %ld
diff --git a/file/Magdir/netbsd b/file/Magdir/netbsd
new file mode 100644 (file)
index 0000000..7c260e4
--- /dev/null
@@ -0,0 +1,246 @@
+
+#------------------------------------------------------------------------------
+# netbsd:  file(1) magic for NetBSD objects
+#
+# All new-style magic numbers are in network byte order.
+#
+
+0      lelong                  000000407       NetBSD little-endian object file
+>16    lelong                  >0              not stripped
+0      belong                  000000407       NetBSD big-endian object file
+>16    belong                  >0              not stripped
+
+0      belong&0377777777       041400413       NetBSD/i386 demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       041400410       NetBSD/i386 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       041400407       NetBSD/i386
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       041400507       NetBSD/i386 core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       041600413       NetBSD/m68k demand paged
+>0     byte                    &0x80           
+>>20   belong                  <8192           shared library
+>>20   belong                  =8192           dynamically linked executable
+>>20   belong                  >8192           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       041600410       NetBSD/m68k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       041600407       NetBSD/m68k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       041600507       NetBSD/m68k core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       042000413       NetBSD/m68k4k demand paged
+>0     byte                    &0x80           
+>>20   belong                  <4096           shared library
+>>20   belong                  =4096           dynamically linked executable
+>>20   belong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042000410       NetBSD/m68k4k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042000407       NetBSD/m68k4k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       042000507       NetBSD/m68k4k core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       042200413       NetBSD/ns32532 demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042200410       NetBSD/ns32532 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042200407       NetBSD/ns32532
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042200507       NetBSD/ns32532 core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       045200507       NetBSD/powerpc core
+>12    string                  >\0             from '%s'
+
+0      belong&0377777777       042400413       NetBSD/sparc demand paged
+>0     byte                    &0x80           
+>>20   belong                  <8192           shared library
+>>20   belong                  =8192           dynamically linked executable
+>>20   belong                  >8192           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042400410       NetBSD/sparc pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042400407       NetBSD/sparc
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       042400507       NetBSD/sparc core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       042600413       NetBSD/pmax demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042600410       NetBSD/pmax pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042600407       NetBSD/pmax
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042600507       NetBSD/pmax core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       043000413       NetBSD/vax 1k demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043000410       NetBSD/vax 1k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043000407       NetBSD/vax 1k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043000507       NetBSD/vax 1k core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       045400413       NetBSD/vax 4k demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       045400410       NetBSD/vax 4k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       045400407       NetBSD/vax 4k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       045400507       NetBSD/vax 4k core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+# NetBSD/alpha does not support (and has never supported) a.out objects,
+# so no rules are provided for them.  NetBSD/alpha ELF objects are 
+# dealt with in "elf".
+0      lelong          0x00070185              ECOFF NetBSD/alpha binary
+>10    leshort         0x0001                  not stripped
+>10    leshort         0x0000                  stripped
+0      belong&0377777777       043200507       NetBSD/alpha core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       043400413       NetBSD/mips demand paged
+>0     byte                    &0x80           
+>>20   belong                  <8192           shared library
+>>20   belong                  =8192           dynamically linked executable
+>>20   belong                  >8192           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       043400410       NetBSD/mips pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       043400407       NetBSD/mips
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       043400507       NetBSD/mips core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       043600413       NetBSD/arm32 demand paged
+>0     byte                    &0x80
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043600410       NetBSD/arm32 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043600407       NetBSD/arm32
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+# NetBSD/arm26 has always used ELF objects, but it shares a core file
+# format with NetBSD/arm32.
+0      belong&0377777777       043600507       NetBSD/arm core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
diff --git a/file/Magdir/netscape b/file/Magdir/netscape
new file mode 100644 (file)
index 0000000..eb4361c
--- /dev/null
@@ -0,0 +1,21 @@
+
+#------------------------------------------------------------------------------
+# netscape:  file(1) magic for Netscape files
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# version 3 and 4 I think
+#
+
+# Netscape Address book  .nab
+0      string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book
+
+# .snm Caches
+0      string          #\ Netscape\ folder\ cache      Netscape folder cache
+0      string  \000\036\204\220\000    Netscape folder cache
+# .n2p 
+# Net 2 Phone 
+#0     string  123\130\071\066\061\071\071\071\060\070\061\060\061\063\060
+0      string  SX961999        Net2phone
+
+#
+#This is files ending in .art, FIXME add more rules
+0       string          JG\004\016\0\0\0\0      ART
diff --git a/file/Magdir/news b/file/Magdir/news
new file mode 100644 (file)
index 0000000..0ac4fa2
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# news:  file(1) magic for SunOS NeWS fonts (not "news" as in "netnews")
+#
+0      string          StartFontMetrics        ASCII font metrics
+0      string          StartFont       ASCII font bits
+0      belong          0x137A2944      NeWS bitmap font
+0      belong          0x137A2947      NeWS font family
+0      belong          0x137A2950      scalable OpenFont binary
+0      belong          0x137A2951      encrypted scalable OpenFont binary
+8      belong          0x137A2B45      X11/NeWS bitmap font
+8      belong          0x137A2B48      X11/NeWS font family
diff --git a/file/Magdir/nitpicker b/file/Magdir/nitpicker
new file mode 100644 (file)
index 0000000..c40daec
--- /dev/null
@@ -0,0 +1,12 @@
+#------------------------------------------------------------------------------
+# nitpicker:  file(1) magic for Flowfiles.
+# From: Christian Jachmann <C.Jachmann@gmx.net> http://www.nitpicker.de
+0      string  NPFF    NItpicker Flow File 
+>4     byte    x       V%d.
+>5     byte    x       %d
+>6     bedate  x       started: %s
+>10    bedate  x       stopped: %s
+>14    belong  x       Bytes: %u
+>18    belong  x       Bytes1: %u
+>22    belong  x       Flows: %u
+>26    belong  x       Pkts: %u
diff --git a/file/Magdir/octave b/file/Magdir/octave
new file mode 100644 (file)
index 0000000..3093148
--- /dev/null
@@ -0,0 +1,4 @@
+#------------------------------------------------------------------------------
+# octave binary data file(1) magic, from Dirk Eddelbuettel <edd@debian.org>
+0      string          Octave-1-L      Octave binary data (little endian)
+0      string          Octave-1-B      Octave binary data (big endian)
diff --git a/file/Magdir/olf b/file/Magdir/olf
new file mode 100644 (file)
index 0000000..e698c36
--- /dev/null
@@ -0,0 +1,97 @@
+
+#------------------------------------------------------------------------------
+# olf:  file(1) magic for OLF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# MIPS R3000 may also be for MIPS R2000.
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# Created by Erik Theisen <etheisen@openbsd.org>
+# Based on elf from Daniel Quinlan <quinlan@yggdrasil.com>
+0      string          \177OLF         OLF
+>4     byte            0               invalid class
+>4     byte            1               32-bit
+>4     byte            2               64-bit
+>7     byte            0               invalid os
+>7     byte            1               OpenBSD
+>7     byte            2               NetBSD
+>7     byte            3               FreeBSD
+>7     byte            4               4.4BSD
+>7     byte            5               Linux
+>7     byte            6               SVR4
+>7     byte            7               esix
+>7     byte            8               Solaris
+>7     byte            9               Irix
+>7     byte            10              SCO
+>7     byte            11              Dell
+>7     byte            12              NCR
+>5     byte            0               invalid byte order
+>5     byte            1               LSB
+>>16   leshort         0               no file type,
+>>16   leshort         1               relocatable,
+>>16   leshort         2               executable,
+>>16   leshort         3               shared object,
+# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
+>>16   leshort         4               core file
+>>>(0x38+0xcc) string  >\0             of '%s'
+>>>(0x38+0x10) lelong  >0              (signal %d),
+>>16   leshort         &0xff00         processor-specific,
+>>18   leshort         0               no machine,
+>>18   leshort         1               AT&T WE32100 - invalid byte order,
+>>18   leshort         2               SPARC - invalid byte order,
+>>18   leshort         3               Intel 80386,
+>>18   leshort         4               Motorola 68000 - invalid byte order,
+>>18   leshort         5               Motorola 88000 - invalid byte order,
+>>18   leshort         6               Intel 80486,
+>>18   leshort         7               Intel 80860,
+>>18   leshort         8               MIPS R3000_BE - invalid byte order,
+>>18   leshort         9               Amdahl - invalid byte order,
+>>18   leshort         10              MIPS R3000_LE,
+>>18   leshort         11              RS6000 - invalid byte order,
+>>18   leshort         15              PA-RISC - invalid byte order,
+>>18   leshort         16              nCUBE,
+>>18   leshort         17              VPP500,
+>>18   leshort         18              SPARC32PLUS,
+>>18   leshort         20              PowerPC,
+>>18   leshort         0x9026          Alpha,
+>>20   lelong          0               invalid version
+>>20   lelong          1               version 1
+>>36   lelong          1               MathCoPro/FPU/MAU Required
+>8     string          >\0             (%s)
+>5     byte            2               MSB
+>>16   beshort         0               no file type,
+>>16   beshort         1               relocatable,
+>>16   beshort         2               executable,
+>>16   beshort         3               shared object,
+>>16   beshort         4               core file,
+>>>(0x38+0xcc) string  >\0             of '%s'
+>>>(0x38+0x10) belong  >0              (signal %d),
+>>16   beshort         &0xff00         processor-specific,
+>>18   beshort         0               no machine,
+>>18   beshort         1               AT&T WE32100,
+>>18   beshort         2               SPARC,
+>>18   beshort         3               Intel 80386 - invalid byte order,
+>>18   beshort         4               Motorola 68000,
+>>18   beshort         5               Motorola 88000,
+>>18   beshort         6               Intel 80486 - invalid byte order,
+>>18   beshort         7               Intel 80860,
+>>18   beshort         8               MIPS R3000_BE,
+>>18   beshort         9               Amdahl,
+>>18   beshort         10              MIPS R3000_LE - invalid byte order,
+>>18   beshort         11              RS6000,
+>>18   beshort         15              PA-RISC,
+>>18   beshort         16              nCUBE,
+>>18   beshort         17              VPP500,
+>>18   beshort         18              SPARC32PLUS,
+>>18   beshort         20              PowerPC or cisco 4500,
+>>18   beshort         21              cisco 7500,
+>>18   beshort         24              cisco SVIP,
+>>18   beshort         25              cisco 7200,
+>>18   beshort         36              cisco 12000,
+>>18   beshort         0x9026          Alpha,
+>>20   belong          0               invalid version
+>>20   belong          1               version 1
+>>36   belong          1               MathCoPro/FPU/MAU Required
diff --git a/file/Magdir/os2 b/file/Magdir/os2
new file mode 100644 (file)
index 0000000..7ae67c7
--- /dev/null
@@ -0,0 +1,47 @@
+
+#------------------------------------------------------------------------------
+# os2:  file(1) magic for OS/2 files
+#
+
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>
+1      string  InternetShortcut        MS Windows 95 Internet shortcut text
+>24    string  >\                      (URL=<%s>)
+
+# OS/2 URL objects
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>
+0      string  http:                   OS/2 URL object text
+>5     string  >\                      (WWW) <http:%s>
+0      string  mailto:                 OS/2 URL object text
+>7     string  >\                      (email) <%s>
+0      string  news:                   OS/2 URL object text
+>5     string  >\                      (Usenet) <%s>
+0      string  ftp:                    OS/2 URL object text
+>4     string  >\                      (FTP) <ftp:%s>
+0      string  file:                   OS/2 URL object text
+>5     string  >\                      (Local file) <%s>
+
+# >>>>> OS/2 INF/HLP <<<<<  (source: Daniel Dissett ddissett@netcom.com)
+# Carl Hauser (chauser.parc@xerox.com) and 
+# Marcus Groeber (marcusg@ph-cip.uni-koeln.de)
+# list the following header format in inf02a.doc:
+#
+#  int16 ID;           // ID magic word (5348h = "HS")
+#  int8  unknown1;     // unknown purpose, could be third letter of ID
+#  int8  flags;        // probably a flag word...
+#                      //  bit 0: set if INF style file
+#                      //  bit 4: set if HLP style file
+#                      // patching this byte allows reading HLP files
+#                      // using the VIEW command, while help files 
+#                      // seem to work with INF settings here as well.
+#  int16 hdrsize;      // total size of header
+#  int16 unknown2;     // unknown purpose
+# 
+0   string  HSP\x01\x9b\x00 OS/2 INF
+>107 string >0                      (%s)
+0   string  HSP\x10\x9b\x00     OS/2 HLP
+>107 string >0                      (%s)
+
+# OS/2 INI (this is a guess)
+0  string   \xff\xff\xff\xff\x14\0\0\0  OS/2 INI
diff --git a/file/Magdir/os9 b/file/Magdir/os9
new file mode 100644 (file)
index 0000000..df3bd1d
--- /dev/null
@@ -0,0 +1,84 @@
+#
+# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by Ignatios Souvatzis for
+#      the NetBSD project.
+# 4. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#
+#
+# OS9/6809 module descriptions:
+#
+0      beshort         0x87CD  OS9/6809 module:
+#
+>6     byte&0x0f       0x00    non-executable
+>6     byte&0x0f       0x01    machine language
+>6     byte&0x0f       0x02    BASIC I-code
+>6     byte&0x0f       0x03    P-code
+>6     byte&0x0f       0x04    C I-code
+>6     byte&0x0f       0x05    COBOL I-code
+>6     byte&0x0f       0x06    FORTRAN I-code
+#
+>6     byte&0xf0       0x10    program executable
+>6     byte&0xf0       0x20    subroutine
+>6     byte&0xf0       0x30    multi-module
+>6     byte&0xf0       0x40    data module
+#
+>6     byte&0xf0       0xC0    system module
+>6     byte&0xf0       0xD0    file manager
+>6     byte&0xf0       0xE0    device driver
+>6     byte&0xf0       0xF0    device descriptor
+#
+# OS9/m68k stuff (to be continued)
+#
+0      beshort         0x4AFC  OS9/68K module:
+#
+# attr
+>14    byte&0x80       0x80    re-entrant
+>14    byte&0x40       0x40    ghost
+>14    byte&0x20       0x20    system-state
+#
+# lang:
+#
+>13    byte            1       machine language
+>13    byte            2       BASIC I-code
+>13    byte            3       P-code
+>13    byte            4       C I-code
+>13    byte            5       COBOL I-code
+>13    byte            6       Fortran I-code
+#
+#
+# type:
+#
+>12    byte            1       program executable
+>12    byte            2       subroutine
+>12    byte            3       multi-module
+>12    byte            4       data module
+>12    byte            11      trap library
+>12    byte            12      system module
+>12    byte            13      file manager
+>12    byte            14      device driver
+>12    byte            15      device descriptor
diff --git a/file/Magdir/osf1 b/file/Magdir/osf1
new file mode 100644 (file)
index 0000000..31166c1
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Mach magic number info
+#
+0      long            0xefbe  OSF/Rose object
+# I386 magic number info
+#
+0      short           0565    i386 COFF object
diff --git a/file/Magdir/palm b/file/Magdir/palm
new file mode 100644 (file)
index 0000000..46bc632
--- /dev/null
@@ -0,0 +1,15 @@
+
+#------------------------------------------------------------------------------
+# palm:  file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks
+#
+# Brian Lalor <blalor@hcirisc.cs.binghamton.edu>
+
+# appl
+60      belong                  0x6170706c      PalmOS application
+>0      string                  >\0             "%s"
+# TEXt
+60      belong                  0x54455874      AportisDoc file
+>0      string                  >\0             "%s"
+# HACK
+60      belong                  0x4841434b      HackMaster hack
+>0      string                  >\0             "%s"
diff --git a/file/Magdir/parix b/file/Magdir/parix
new file mode 100644 (file)
index 0000000..09965d1
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+#
+# Parix COFF executables
+# From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de>
+#
+0      beshort&0xfff   0xACE   PARIX
+>0     byte&0xf0       0x80    T800
+>0     byte&0xf0       0x90    T9000
+>19    byte&0x02       0x02    executable
+>19    byte&0x02       0x00    object
+>19    byte&0x0c       0x00    not stripped
diff --git a/file/Magdir/pbm b/file/Magdir/pbm
new file mode 100644 (file)
index 0000000..98c15f7
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# pbm:  file(1) magic for Portable Bitmap files
+#
+# XXX - byte order?
+#
+0      short   0x2a17  "compact bitmap" format (Poskanzer)
diff --git a/file/Magdir/pdf b/file/Magdir/pdf
new file mode 100644 (file)
index 0000000..a1aef13
--- /dev/null
@@ -0,0 +1,7 @@
+#------------------------------------------------------------------------------
+# pdf:  file(1) magic for Portable Document Format
+#
+
+0      string          %PDF-           PDF document
+>5     byte            x               \b, version %c
+>7     byte            x               \b.%c
diff --git a/file/Magdir/pdp b/file/Magdir/pdp
new file mode 100644 (file)
index 0000000..5452005
--- /dev/null
@@ -0,0 +1,35 @@
+
+#------------------------------------------------------------------------------
+# pdp:  file(1) magic for PDP-11 executable/object and APL workspace
+#
+0      lelong          0101555         PDP-11 single precision APL workspace
+0      lelong          0101554         PDP-11 double precision APL workspace
+#
+# PDP-11 a.out
+#
+0      leshort         0407            PDP-11 executable
+>8     leshort         >0              not stripped
+>15    byte            >0              - version %ld
+
+0      leshort         0401            PDP-11 UNIX/RT ldp
+0      leshort         0405            PDP-11 old overlay
+
+0      leshort         0410            PDP-11 pure executable
+>8     leshort         >0              not stripped
+>15    byte            >0              - version %ld
+
+0      leshort         0411            PDP-11 separate I&D executable
+>8     leshort         >0              not stripped
+>15    byte            >0              - version %ld
+
+0      leshort         0437            PDP-11 kernel overlay
+
+# These last three are derived from 2.11BSD file(1)
+0      leshort         0413            PDP-11 demand-paged pure executable
+>8     leshort         >0              not stripped
+
+0      leshort         0430            PDP-11 overlaid pure executable
+>8     leshort         >0              not stripped
+
+0      leshort         0431            PDP-11 overlaid separate executable
+>8     leshort         >0              not stripped
diff --git a/file/Magdir/perl b/file/Magdir/perl
new file mode 100644 (file)
index 0000000..28b6086
--- /dev/null
@@ -0,0 +1,18 @@
+
+#------------------------------------------------------------------------------
+# perl:  file(1) magic for Larry Wall's perl language.
+#
+# The ``eval'' line recognizes an outrageously clever hack for USG systems.
+# Keith Waclena <keith@cerberus.uchicago.edu>
+# Send additions to <perl5-porters@perl.org>
+0      string/b        #!\ /bin/perl                   perl script text executable
+0      string          eval\ "exec\ /bin/perl          perl script text
+0      string/b        #!\ /usr/bin/perl               perl script text executable
+0      string          eval\ "exec\ /usr/bin/perl      perl script text
+0      string/b        #!\ /usr/local/bin/perl         perl script text
+0      string          eval\ "exec\ /usr/local/bin/perl        perl script text executable
+
+# a couple more, by me
+# XXX: christos matches
+#0     regex           package         Perl5 module source text (via regex)
+0      string          package         Perl5 module source text
diff --git a/file/Magdir/pgp b/file/Magdir/pgp
new file mode 100644 (file)
index 0000000..038d098
--- /dev/null
@@ -0,0 +1,13 @@
+
+#------------------------------------------------------------------------------
+# pgp:  file(1) magic for Pretty Good Privacy
+#
+0       beshort         0x9900                  PGP key public ring
+0       beshort         0x9501                  PGP key security ring
+0       beshort         0x9500                  PGP key security ring
+0      beshort         0xa600                  PGP encrypted data
+0       string          -----BEGIN\040PGP       PGP armored data
+>15     string          PUBLIC\040KEY\040BLOCK- public key block
+>15     string          MESSAGE-                message
+>15     string          SIGNED\040MESSAGE-      signed message
+>15     string          PGP\040SIGNATURE-       signature
diff --git a/file/Magdir/pkgadd b/file/Magdir/pkgadd
new file mode 100644 (file)
index 0000000..dc8ef5d
--- /dev/null
@@ -0,0 +1,5 @@
+
+#------------------------------------------------------------------------------
+# pkgadd:  file(1) magic for SysV R4 PKG Datastreams
+#
+0       string          #\ PaCkAgE\ DaTaStReAm  pkg Datastream (SVR4)
diff --git a/file/Magdir/plus5 b/file/Magdir/plus5
new file mode 100644 (file)
index 0000000..acf3bf4
--- /dev/null
@@ -0,0 +1,17 @@
+
+#------------------------------------------------------------------------------
+# plus5:  file(1) magic for Plus Five's UNIX MUMPS
+#
+# XXX - byte order?  Paging Hokey....
+#
+0      short           0x259           mumps avl global
+>2     byte            >0              (V%d)
+>6     byte            >0              with %d byte name
+>7     byte            >0              and %d byte data cells
+0      short           0x25a           mumps blt global
+>2     byte            >0              (V%d)
+>8     short           >0              - %d byte blocks
+>15    byte            0x00            - P/D format
+>15    byte            0x01            - P/K/D format
+>15    byte            0x02            - K/D format
+>15    byte            >0x02           - Bad Flags
diff --git a/file/Magdir/printer b/file/Magdir/printer
new file mode 100644 (file)
index 0000000..c47ff3b
--- /dev/null
@@ -0,0 +1,88 @@
+
+#------------------------------------------------------------------------------
+# printer:  file(1) magic for printer-formatted files
+#
+
+# PostScript, updated by Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          %!              PostScript document text
+>2     string          PS-Adobe-       conforming
+>>11   string          >\0             at level %.3s
+>>>15  string          EPS             - type %s
+>>>15  string          Query           - type %s
+>>>15  string          ExitServer      - type %s
+# Some PCs have the annoying habit of adding a ^D as a document separator
+0      string          \004%!          PostScript document text
+>3     string          PS-Adobe-       conforming
+>>12   string          >\0             at level %.3s
+>>>16  string          EPS             - type %s
+>>>16  string          Query           - type %s
+>>>16  string          ExitServer      - type %s
+0      string          \033%-12345X%!PS        PostScript document
+
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews@Black.Market.NET>
+0       belong          0xC5D0D3C6      DOS EPS Binary File
+>4      long            >0              Postscript starts at byte %d
+>>8     long            >0              length %d
+>>>12   long            >0              Metafile starts at byte %d
+>>>>16  long            >0              length %d
+>>>20   long            >0              TIFF starts at byte %d
+>>>>24  long            >0              length %d
+
+# Adobe's PostScript Printer Description (PPD) files
+#       Yves Arrouye <arrouye@marin.fdn.fr>
+#
+0      string          *PPD-Adobe:    PPD file
+>13    string          x              \b, ve
+
+# HP Printer Job Language
+0      string          \033%-12345X@PJL        HP Printer Job Language data
+# HP Printer Job Language
+# The header found on Win95 HP plot files is the "Silliest Thing possible" 
+# (TM)
+# Every driver puts the language at some random position, with random case
+# (LANGUAGE and Language)
+# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10
+# From: Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>
+# 
+0      string          \033%-12345X@PJL        HP Printer Job Language data
+>&0    string          >\0                     %s                      
+>>&0   string          >\0                     %s                      
+>>>&0  string          >\0                     %s              
+>>>>&0 string          >\0                     %s              
+#>15   string          \ ENTER\ LANGUAGE\ =
+#>31   string          PostScript              PostScript
+
+# HP Printer Control Language, Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \033E\033       HP PCL printer data
+>3     string          \&l0A           - default page size
+>3     string          \&l1A           - US executive page size
+>3     string          \&l2A           - US letter page size
+>3     string          \&l3A           - US legal page size
+>3     string          \&l26A          - A4 page size
+>3     string          \&l80A          - Monarch envelope size
+>3     string          \&l81A          - No. 10 envelope size
+>3     string          \&l90A          - Intl. DL envelope size
+>3     string          \&l91A          - Intl. C5 envelope size
+>3     string          \&l100A         - Intl. B5 envelope size
+>3     string          \&l-81A         - No. 10 envelope size (landscape)
+>3     string          \&l-90A         - Intl. DL envelope size (landscape)
+
+# IMAGEN printer-ready files:
+0      string  @document(              Imagen printer
+# this only works if "language xxx" is first item in Imagen header.
+>10    string  language\ impress       (imPRESS data)
+>10    string  language\ daisy         (daisywheel text)
+>10    string  language\ diablo        (daisywheel text)
+>10    string  language\ printer       (line printer emulation)
+>10    string  language\ tektronix     (Tektronix 4014 emulation)
+# Add any other languages that your Imagen uses - remember
+# to keep the word `text' if the file is human-readable.
+# [GRR 950115:  missing "postscript" or "ultrascript" (whatever it was called)]
+#
+# Now magic for IMAGEN font files...
+0      string          Rast            RST-format raster font data
+>45    string          >0              face %
+# From Jukka Ukkonen
+0      string          \033[K\002\0\0\017\033(a\001\0\001\033(g        Canon Bubble Jet BJC formatted data
diff --git a/file/Magdir/project b/file/Magdir/project
new file mode 100644 (file)
index 0000000..04e8865
--- /dev/null
@@ -0,0 +1,9 @@
+
+#------------------------------------------------------------------------------
+# project:  file(1) magic for Project management
+# 
+# Magic strings for ftnchek project files. Alexander Mai
+0      string  FTNCHEK_\ P     project file for ftnchek
+>10    string  1               version 2.7
+>10    string  2               version 2.8 to 2.10
+>10    string  3               version 2.11 or later
diff --git a/file/Magdir/psdbms b/file/Magdir/psdbms
new file mode 100644 (file)
index 0000000..f36121f
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# psdbms:  file(1) magic for psdatabase
+#
+0      belong&0xff00ffff       0x56000000      ps database
+>1     string  >\0     version %s
+>4     string  >\0     from kernel %s
diff --git a/file/Magdir/pulsar b/file/Magdir/pulsar
new file mode 100644 (file)
index 0000000..cb9cac6
--- /dev/null
@@ -0,0 +1,10 @@
+#------------------------------------------------------------------------------
+# pulsar:  file(1) magic for Pulsar POP3 daemon binary files
+#
+# http://pulsar.sourceforge.net
+# mailto:rok.papez@lugos.si
+#
+
+0      belong  0x1ee7f11e      Pulsar POP3 daemon mailbox cache file.
+>4     ubelong x               Version: %d.
+>8     ubelong x               \b%d
diff --git a/file/Magdir/pyramid b/file/Magdir/pyramid
new file mode 100644 (file)
index 0000000..fe16608
--- /dev/null
@@ -0,0 +1,11 @@
+
+#------------------------------------------------------------------------------
+# pyramid:  file(1) magic for Pyramids
+#
+# XXX - byte order?
+#
+0      long            0x50900107      Pyramid 90x family executable
+0      long            0x50900108      Pyramid 90x family pure executable
+>16    long            >0              not stripped
+0      long            0x5090010b      Pyramid 90x family demand paged pure executable
+>16    long            >0              not stripped
diff --git a/file/Magdir/python b/file/Magdir/python
new file mode 100644 (file)
index 0000000..2e7bbe7
--- /dev/null
@@ -0,0 +1,5 @@
+# often the module starts with a multiline string
+0      string          """     a python script text executable
+# MAGIC as specified in Python/import.c (1.5.2/1.6)
+# 20121  ( YEAR - 1995 ) + MONTH  + DAY (little endian followed by "\r\n"
+0      belong          0x994e0d0a      python compiled
diff --git a/file/Magdir/riff b/file/Magdir/riff
new file mode 100644 (file)
index 0000000..a81eb93
--- /dev/null
@@ -0,0 +1,104 @@
+
+#------------------------------------------------------------------------------
+# riff:  file(1) magic for RIFF format
+# See
+#
+#      http://www.seanet.com/users/matts/riffmci/riffmci.htm
+#
+# and
+#
+#      http://www.ora.com/centers/gff/formats/micriff/index.htm
+#
+# and
+#
+#      http://www.jtauber.com/music/encoding/niff/spec/
+#
+0      string          RIFF            RIFF (little-endian) data
+# RIFF Palette format
+>8     string          PAL             \b, palette
+>>16   leshort         x               \b, version %d
+>>18   leshort         x               \b, %d entries
+# RIFF Device Independent Bitmap format
+>8     string          RDIB            \b, device-independent bitmap
+>>16   string          BM              
+>>>30  leshort         12              \b, OS/2 1.x format
+>>>>34 leshort         x               \b, %d x
+>>>>36 leshort         x               %d
+>>>30  leshort         64              \b, OS/2 2.x format
+>>>>34 leshort         x               \b, %d x
+>>>>36 leshort         x               %d
+>>>30  leshort         40              \b, Windows 3.x format
+>>>>34 lelong          x               \b, %d x
+>>>>38 lelong          x               %d x
+>>>>44 leshort         x               %d
+# RIFF MIDI format
+>8     string          RMID            \b, MIDI
+# RIFF Multimedia Movie File format
+>8     string          RMMP            \b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8     string          WAVE            \b, WAVE audio
+>>20   leshort         1               \b, Microsoft PCM
+>>>34  leshort         >0              \b, %d bit
+>>20   leshort         2               \b, Microsoft ADPCM
+>>20   leshort         6               \b, ITU G.711 a-law
+>>20   leshort         7               \b, ITU G.711 u-law
+>>20   leshort         17              \b, IMA ADPCM
+>>20   leshort         20              \b, ITU G.723 ADPCM (Yamaha)
+>>20   leshort         49              \b, GSM 6.10
+>>20   leshort         64              \b, ITU G.721 ADPCM
+>>20   leshort         80              \b, MPEG
+>>20   leshort         85              \b, MPEG Layer 3
+>>22   leshort         =1              \b, mono
+>>22   leshort         =2              \b, stereo
+>>22   leshort         >2              \b, %d channels
+>>24   lelong          >0              %d Hz
+# AVI == Audio Video Interleave
+>8      string          AVI\            \b, AVI
+# Animated Cursor format
+>8     string          ACON            \b, animated cursor
+
+#
+# XXX - some of the below may only appear in little-endian form.
+#
+# Also "MV93" appears to be for one form of Macromedia Director
+# files, and "GDMF" appears to be another multimedia format.
+#
+0      string          RIFX            RIFF (big-endian) data
+# RIFF Palette format
+>8     string          PAL             \b, palette
+>>16   beshort         x               \b, version %d
+>>18   beshort         x               \b, %d entries
+# RIFF Device Independent Bitmap format
+>8     string          RDIB            \b, device-independent bitmap
+>>16   string          BM              
+>>>30  beshort         12              \b, OS/2 1.x format
+>>>>34 beshort         x               \b, %d x
+>>>>36 beshort         x               %d
+>>>30  beshort         64              \b, OS/2 2.x format
+>>>>34 beshort         x               \b, %d x
+>>>>36 beshort         x               %d
+>>>30  beshort         40              \b, Windows 3.x format
+>>>>34 belong          x               \b, %d x
+>>>>38 belong          x               %d x
+>>>>44 beshort         x               %d
+# RIFF MIDI format
+>8     string          RMID            \b, MIDI
+# RIFF Multimedia Movie File format
+>8     string          RMMP            \b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8     string          WAVE            \b, WAVE audio
+>>20   leshort         1               \b, Microsoft PCM
+>>>34  leshort         >0              \b, %d bit
+>>22   beshort         =1              \b, mono
+>>22   beshort         =2              \b, stereo
+>>22   beshort         >2              \b, %d channels
+>>24   belong          >0              %d Hz
+# AVI == Audio Video Interleave
+>8      string          AVI\            \b, AVI
+# Animated Cursor format
+>8     string          ACON            \b, animated cursor
+# Notation Interchange File Format (big-endian only)
+>8     string          NIFF            \b, Notation Interchange File Format
+
+# SoundFont 2 <mpruett@sgi.com>
+>8     string          sfbk            SoundFont 2
diff --git a/file/Magdir/rpm b/file/Magdir/rpm
new file mode 100644 (file)
index 0000000..14ad6db
--- /dev/null
@@ -0,0 +1,17 @@
+#------------------------------------------------------------------------------
+#
+# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt@redhat.com)
+#
+0      beshort         0xedab          
+>2     beshort         0xeedb          RPM
+>>4    byte            x               v%d
+>>6    beshort         0               bin
+>>6    beshort         1               src
+>>8    beshort         1               i386
+>>8    beshort         2               Alpha
+>>8    beshort         3               Sparc
+>>8    beshort         4               MIPS
+>>8    beshort         5               PowerPC
+>>8    beshort         6               68000
+>>8     beshort         7               SGI
+>>10   string          x               %s
diff --git a/file/Magdir/rtf b/file/Magdir/rtf
new file mode 100644 (file)
index 0000000..8e2d416
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# rtf: file(1) magic for Rich Text Format (RTF)
+#
+# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk
+#
+0      string          {\\rtf          Rich Text Format data,
+>5     byte            x               version %c,
+>6     string          \\ansi          ANSI
+>6     string          \\mac           Apple Macintosh
+>6     string          \\pc            IBM PC, code page 437
+>6     string          \\pca           IBM PS/2, code page 850
diff --git a/file/Magdir/sc b/file/Magdir/sc
new file mode 100644 (file)
index 0000000..98599f2
--- /dev/null
@@ -0,0 +1,5 @@
+
+#------------------------------------------------------------------------------
+# sc:  file(1) magic for "sc" spreadsheet
+#
+38     string          Spreadsheet     sc spreadsheet file
diff --git a/file/Magdir/sccs b/file/Magdir/sccs
new file mode 100644 (file)
index 0000000..11d50b2
--- /dev/null
@@ -0,0 +1,21 @@
+
+#------------------------------------------------------------------------------
+# sccs:  file(1) magic for SCCS archives
+#
+# SCCS archive structure:
+# \001h01207
+# \001s 00276/00000/00000
+# \001d D 1.1 87/09/23 08:09:20 ian 1 0
+# \001c date and time created 87/09/23 08:09:20 by ian
+# \001e
+# \001u
+# \001U
+# ... etc.
+# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550).
+# *Sigh*. And these both came from various parts of the USG.
+# Maybe we should just switch everybody from SCCS to RCS!
+# Further, you can't just say '\001h0', because the five-digit number
+# is a checksum that could (presumably) have any leading digit,
+# and we don't have regular expression matching yet. 
+# Hence the following official kludge:
+8      string          \001s\                  SCCS archive data
diff --git a/file/Magdir/sendmail b/file/Magdir/sendmail
new file mode 100644 (file)
index 0000000..503ef89
--- /dev/null
@@ -0,0 +1,10 @@
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail config files
+#
+# XXX - byte order?
+#
+0      byte    046       Sendmail frozen configuration 
+>16    string  >\0       - version %s
+0      short   0x271c    Sendmail frozen configuration
+>16    string  >\0       - version %s
diff --git a/file/Magdir/sequent b/file/Magdir/sequent
new file mode 100644 (file)
index 0000000..e6f7b52
--- /dev/null
@@ -0,0 +1,34 @@
+
+#------------------------------------------------------------------------------
+# sequent:  file(1) magic for Sequent machines
+#
+# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
+# For Sequent's multiprocessor systems (incomplete).
+0      lelong  0x00ea          BALANCE NS32000 .o
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      lelong  0x10ea          BALANCE NS32000 executable (0 @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      lelong  0x20ea          BALANCE NS32000 executable (invalid @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      lelong  0x30ea          BALANCE NS32000 standalone executable
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+#
+# Symmetry information added by Jason Merrill <jason@jarthur.claremont.edu>.
+# Symmetry magic nums will not be reached if DOS COM comes before them;
+# byte 0xeb is matched before these get a chance.
+0      leshort 0x12eb          SYMMETRY i386 .o
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      leshort 0x22eb          SYMMETRY i386 executable (0 @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      leshort 0x32eb          SYMMETRY i386 executable (invalid @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      leshort 0x42eb          SYMMETRY i386 standalone executable
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
diff --git a/file/Magdir/sgml b/file/Magdir/sgml
new file mode 100644 (file)
index 0000000..e831c3c
--- /dev/null
@@ -0,0 +1,20 @@
+
+#------------------------------------------------------------------------------
+# sgml:  file(1) magic for Standard Generalized Markup Language
+# HyperText Markup Language (HTML) is an SGML document type,
+# from Daniel Quinlan (quinlan@yggdrasil.com)
+# adapted to string extenstions by Anthon van der Neut <anthon@mnt.org)
+0   string/cB  \<!doctype\ html        HTML document text
+0   string/c   \<head                  HTML document text
+0   string/c   \<title                 HTML document text
+0   string/c   \<html                  HTML document text
+
+# Extensible markup language (XML), a subset of SGML
+# from Marc Prud'hommeaux (marc@apocalypse.org)
+0   string/c   \<?xml                  XML document text
+
+
+# SGML, mostly from rph@sq
+0   string/c   \<!doctype              exported SGML document text
+0   string/c   \<!subdoc               exported SGML subdocument text
+0   string     \<!--                   exported SGML document text
diff --git a/file/Magdir/sharc b/file/Magdir/sharc
new file mode 100644 (file)
index 0000000..7201e85
--- /dev/null
@@ -0,0 +1,22 @@
+
+#------------------------------------------------------------------------
+# file(1) magic for sharc files
+#
+# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by 
+# FutureGroove Music (dsp@futuregroove.de)
+
+#------------------------------------------------------------------------
+0      string                  Draw            RiscOS Drawfile
+0      string                  PACK            RiscOS PackdDir archive
+
+#------------------------------------------------------------------------
+# SHARC DSP stuff (based on the FGM SHARC DSP SDK)
+
+0      string                  !               Assembler source
+0      string                  Analog          ADi asm listing file
+0      string                  .SYSTEM         SHARC architecture file
+0      string                  .system         SHARC architecture file
+
+0      leshort                 0x521C          SHARC COFF binary
+>2     leshort                 >1              , %hd sections
+>>12   lelong                  >0              , not stripped
diff --git a/file/Magdir/sketch b/file/Magdir/sketch
new file mode 100644 (file)
index 0000000..d31d184
--- /dev/null
@@ -0,0 +1,5 @@
+
+#------------------------------------------------------------------------------
+# Sketch Drawings: http://sketch.sourceforge.net/ 
+# From: Edwin Mons <e@ik.nu>
+0      string  ##Sketch        Sketch document text
diff --git a/file/Magdir/smalltalk b/file/Magdir/smalltalk
new file mode 100644 (file)
index 0000000..b882759
--- /dev/null
@@ -0,0 +1,24 @@
+
+#-----------------------------------------------
+# GNU Smalltalk image, starting at version 1.6.2
+# From: catull_us@yahoo.com
+#
+0      string  GSTIm\0\0       GNU SmallTalk
+# little-endian
+>7     byte&1  =0              LE image version
+>>10   byte    x               %d.
+>>9    byte    x               \b%d.
+>>8    byte    x               \b%d
+#>>12  lelong  x               , data: %ld
+#>>16  lelong  x               , table: %ld
+#>>20  lelong  x               , memory: %ld
+# big-endian
+>7     byte&1  =1              BE image version
+>>8    byte    x               %d.
+>>9    byte    x               \b%d.
+>>10   byte    x               \b%d
+#>>12  belong  x               , data: %ld
+#>>16  belong  x               , table: %ld
+#>>20  belong  x               , memory: %ld
+
+
diff --git a/file/Magdir/sniffer b/file/Magdir/sniffer
new file mode 100644 (file)
index 0000000..626439e
--- /dev/null
@@ -0,0 +1,205 @@
+
+#------------------------------------------------------------------------------
+# sniffer:  file(1) magic for packet capture files
+#
+# From: guy@alum.mit.edu (Guy Harris)
+#
+
+#
+# Microsoft Network Monitor 1.x capture files.
+#
+0      string          RTSS            NetMon capture file
+>4     byte            x               - version %d
+>5     byte            x               \b.%d
+>6     leshort         0               (Unknown)
+>6     leshort         1               (Ethernet)
+>6     leshort         2               (Token Ring)
+>6     leshort         3               (FDDI)
+
+#
+# Microsoft Network Monitor 2.x capture files.
+#
+0      string          GMBU            NetMon capture file
+>4     byte            x               - version %d
+>5     byte            x               \b.%d
+>6     leshort         0               (Unknown)
+>6     leshort         1               (Ethernet)
+>6     leshort         2               (Token Ring)
+>6     leshort         3               (FDDI)
+
+#
+# Network General Sniffer capture files.
+# Sorry, make that "Network Associates Sniffer capture files."
+#
+0      string          TRSNIFF\ data\ \ \ \ \032       Sniffer capture file
+>33    byte            2               (compressed)
+>23    leshort         x               - version %d
+>25    leshort         x               \b.%d
+>32    byte            0               (Token Ring)
+>32    byte            1               (Ethernet)
+>32    byte            2               (ARCNET)
+>32    byte            3               (StarLAN)
+>32    byte            4               (PC Network broadband)
+>32    byte            5               (LocalTalk)
+>32    byte            6               (Znet)
+>32    byte            7               (Internetwork Analyzer)
+>32    byte            9               (FDDI)
+>32    byte            10              (ATM)
+
+#
+# Cinco Networks NetXRay capture files.
+# Sorry, make that "Network General Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic, and Windows
+# Sniffer Pro", capture files."
+#
+0      string          XCP\0           NetXRay capture file
+>4     string          >\0             - version %s
+>44    leshort         0               (Ethernet)
+>44    leshort         1               (Token Ring)
+>44    leshort         2               (FDDI)
+
+#
+# "libpcap" capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0      ubelong         0xa1b2c3d4      tcpdump capture file (big-endian)
+>4     beshort         x               - version %d
+>6     beshort         x               \b.%d
+>20    belong          0               (No link-layer encapsulation
+>20    belong          1               (Ethernet
+>20    belong          2               (3Mb Ethernet
+>20    belong          3               (AX.25
+>20    belong          4               (ProNET
+>20    belong          5               (CHAOS
+>20    belong          6               (Token Ring
+>20    belong          7               (ARCNET
+>20    belong          8               (SLIP
+>20    belong          9               (PPP
+>20    belong          10              (FDDI
+>20    belong          11              (RFC 1483 ATM
+>20    belong          12              (raw IP
+>20    belong          13              (BSD/OS SLIP
+>20    belong          14              (BSD/OS PPP
+>20    belong          50              (PPP or Cisco HDLC
+>20    belong          51              (PPP-over-Ethernet
+>20    belong          100             (RFC 1483 ATM
+>20    belong          101             (raw IP
+>20    belong          102             (BSD/OS SLIP
+>20    belong          103             (BSD/OS PPP
+>20    belong          104             (BSD/OS Cisco HDLC
+>20    belong          105             (802.11
+>20    belong          106             (Linux Classical IP over ATM
+>20    belong          108             (OpenBSD loopback
+>20    belong          109             (OpenBSD IPSEC encrypted
+>20    belong          113             (Linux "cooked"
+>20    belong          114             (LocalTalk
+>16    belong          x               \b, capture length %d)
+0      ulelong         0xa1b2c3d4      tcpdump capture file (little-endian)
+>4     leshort         x               - version %d
+>6     leshort         x               \b.%d
+>20    lelong          0               (No link-layer encapsulation
+>20    lelong          1               (Ethernet
+>20    lelong          2               (3Mb Ethernet
+>20    lelong          3               (AX.25
+>20    lelong          4               (ProNET
+>20    lelong          5               (CHAOS
+>20    lelong          6               (Token Ring
+>20    lelong          7               (ARCNET
+>20    lelong          8               (SLIP
+>20    lelong          9               (PPP
+>20    lelong          10              (FDDI
+>20    lelong          11              (RFC 1483 ATM
+>20    lelong          12              (raw IP
+>20    lelong          13              (BSD/OS SLIP
+>20    lelong          14              (BSD/OS PPP
+>20    lelong          50              (PPP or Cisco HDLC
+>20    lelong          51              (PPP-over-Ethernet
+>20    lelong          100             (RFC 1483 ATM
+>20    lelong          101             (raw IP
+>20    lelong          102             (BSD/OS SLIP
+>20    lelong          103             (BSD/OS PPP
+>20    lelong          104             (BSD/OS Cisco HDLC
+>20    lelong          105             (802.11
+>20    lelong          106             (Linux Classical IP over ATM
+>20    lelong          108             (OpenBSD loopback
+>20    lelong          109             (OpenBSD IPSEC encrypted
+>20    lelong          113             (Linux "cooked"
+>20    lelong          114             (LocalTalk
+>16    lelong          x               \b, capture length %d)
+
+#
+# "libpcap"-with-Alexey-Kuznetsov's-patches capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0      ubelong         0xa1b2cd34      extended tcpdump capture file (big-endian)
+>4     beshort         x               - version %d
+>6     beshort         x               \b.%d
+>20    belong          0               (No link-layer encapsulation
+>20    belong          1               (Ethernet
+>20    belong          2               (3Mb Ethernet
+>20    belong          3               (AX.25
+>20    belong          4               (ProNET
+>20    belong          5               (CHAOS
+>20    belong          6               (Token Ring
+>20    belong          7               (ARCNET
+>20    belong          8               (SLIP
+>20    belong          9               (PPP
+>20    belong          10              (FDDI
+>20    belong          11              (RFC 1483 ATM
+>20    belong          12              (raw IP
+>20    belong          13              (BSD/OS SLIP
+>20    belong          14              (BSD/OS PPP
+>16    belong          x               \b, capture length %d)
+0      ulelong         0xa1b2cd34      extended tcpdump capture file (little-endian)
+>4     leshort         x               - version %d
+>6     leshort         x               \b.%d
+>20    lelong          0               (No link-layer encapsulation
+>20    lelong          1               (Ethernet
+>20    lelong          2               (3Mb Ethernet
+>20    lelong          3               (AX.25
+>20    lelong          4               (ProNET
+>20    lelong          5               (CHAOS
+>20    lelong          6               (Token Ring
+>20    lelong          7               (ARCNET
+>20    lelong          8               (SLIP
+>20    lelong          9               (PPP
+>20    lelong          10              (FDDI
+>20    lelong          11              (RFC 1483 ATM
+>20    lelong          12              (raw IP
+>20    lelong          13              (BSD/OS SLIP
+>20    lelong          14              (BSD/OS PPP
+>16    lelong          x               \b, capture length %d)
+
+#
+# AIX "iptrace" capture files.
+#
+0      string          iptrace\ 2.0    "iptrace" capture file
+
+#
+# Novell LANalyzer capture files.
+#
+0      leshort         0x1001          LANalyzer capture file
+0      leshort         0x1007          LANalyzer capture file
+
+#
+# HP-UX "nettl" capture files.
+#
+0      string          \x54\x52\x00\x64\x00    "nettl" capture file
+
+#
+# RADCOM WAN/LAN Analyzer capture files.
+#
+0      string          \x42\xd2\x00\x34\x12\x66\x22\x88        RADCOM WAN/LAN Analyzer capture file
+
+#
+# NetStumbler log files.  Not really packets, per se, but about as
+# close as you can get.  These are log files from NetStumbler, a
+# Windows program, that scans for 802.11b networks.
+#
+0      string          NetS            NetStumbler log file
+>8     lelong          x               \b, %d stations found
diff --git a/file/Magdir/softquad b/file/Magdir/softquad
new file mode 100644 (file)
index 0000000..aa16904
--- /dev/null
@@ -0,0 +1,29 @@
+
+#------------------------------------------------------------------------------
+# softquad:  file(1) magic for SoftQuad Publishing Software
+#
+# Author/Editor and RulesBuilder
+#
+# XXX - byte order?
+#
+0      string          \<!SQ\ DTD>     Compiled SGML rules file
+>9     string          >\0              Type %s
+0      string          \<!SQ\ A/E>     A/E SGML Document binary
+>9     string          >\0              Type %s
+0      string          \<!SQ\ STS>     A/E SGML binary styles file
+>9     string          >\0              Type %s
+0      short           0xc0de          Compiled PSI (v1) data
+0      short           0xc0da          Compiled PSI (v2) data
+>3     string          >\0             (%s)
+# Binary sqtroff font/desc files...
+0      short           0125252         SoftQuad DESC or font file binary
+>2     short           >0              - version %d
+# Bitmaps...
+0      string          SQ\ BITMAP1     SoftQuad Raster Format text
+#0     string          SQ\ BITMAP2     SoftQuad Raster Format data
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0      string          X\              SoftQuad troff Context intermediate
+>2     string          495             for AT&T 495 laser printer
+>2     string          hp              for Hewlett-Packard LaserJet
+>2     string          impr            for IMAGEN imPRESS
+>2     string          ps              for PostScript
diff --git a/file/Magdir/spectrum b/file/Magdir/spectrum
new file mode 100644 (file)
index 0000000..e7a5549
--- /dev/null
@@ -0,0 +1,28 @@
+
+#------------------------------------------------------------------------------
+# spectrum:  file(1) magic for Spectrum emulator files.
+#
+# John Elliott <jce@seasip.demon.co.uk>
+
+#
+# Spectrum +3DOS header
+#
+0       string          PLUS3DOS\032    Spectrum +3 data
+>15     byte            0               - BASIC program
+>15     byte            1               - number array
+>15     byte            2               - character array
+>15     byte            3               - memory block
+>>16    belong          0x001B0040      (screen)
+>15     byte            4               - Tasword document
+>15     string          TAPEFILE        - ZXT tapefile
+#
+# Tape file. This assumes the .TAP starts with a Spectrum-format header,
+# which nearly all will.
+#
+0       string          \023\000\000    Spectrum .TAP data
+>4      string          x               "%-10.10s"
+>3      byte            0               - BASIC program
+>3      byte            1               - number array
+>3      byte            2               - character array
+>3      byte            3               - memory block
+>>14    belong          0x001B0040      (screen)
diff --git a/file/Magdir/sun b/file/Magdir/sun
new file mode 100644 (file)
index 0000000..10f30b4
--- /dev/null
@@ -0,0 +1,107 @@
+
+#------------------------------------------------------------------------------
+# sun:  file(1) magic for Sun machines
+#
+# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
+# releases.  (5.x uses ELF.)
+#
+0      belong&077777777        0600413         sparc demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0600410         sparc pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0600407         sparc
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+
+0      belong&077777777        0400413         mc68020 demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>16    belong          >0              not stripped
+0      belong&077777777        0400410         mc68020 pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0400407         mc68020
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+
+0      belong&077777777        0200413         mc68010 demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>16    belong          >0              not stripped
+0      belong&077777777        0200410         mc68010 pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0200407         mc68010
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+
+# reworked these to avoid anything beginning with zero becoming "old sun-2"
+0      belong          0407            old sun-2 executable
+>16    belong          >0              not stripped
+0      belong          0410            old sun-2 pure executable
+>16    belong          >0              not stripped
+0      belong          0413            old sun-2 demand paged executable
+>16    belong          >0              not stripped
+
+#
+# Core files.  "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
+# binary executed in compatibility mode under SunOS 5.x".
+#
+0      belong          0x080456        SunOS core file
+>4     belong          432             (SPARC)
+>>132  string          >\0             from '%s'
+>>116  belong          =3              (quit)
+>>116  belong          =4              (illegal instruction)
+>>116  belong          =5              (trace trap)
+>>116  belong          =6              (abort)
+>>116  belong          =7              (emulator trap)
+>>116  belong          =8              (arithmetic exception)
+>>116  belong          =9              (kill)
+>>116  belong          =10             (bus error)
+>>116  belong          =11             (segmentation violation)
+>>116  belong          =12             (bad argument to system call)
+>>116  belong          =29             (resource lost)
+>>120  belong          x               (T=%dK,
+>>124  belong          x               D=%dK,
+>>128  belong          x               S=%dK)
+>4     belong          826             (68K)
+>>128  string          >\0             from '%s'
+>4     belong          456             (SPARC 4.x BCP)
+>>152  string          >\0             from '%s'
+# Sun SunPC
+0      long            0xfa33c08e      SunPC 4.0 Hard Disk
+0      string          #SUNPC_CONFIG   SunPC 4.0 Properties Values
+# Sun snoop (see RFC 1761, which describes the capture file format).
+#
+0      string          snoop           Snoop capture file
+>8     belong          >0              - version %ld
+>12    belong          0               (IEEE 802.3)
+>12    belong          1               (IEEE 802.4)
+>12    belong          2               (IEEE 802.5)
+>12    belong          3               (IEEE 802.6)
+>12    belong          4               (Ethernet)
+>12    belong          5               (HDLC)
+>12    belong          6               (Character synchronous)
+>12    belong          7               (IBM channel-to-channel adapter)
+>12    belong          8               (FDDI)
+>12    belong          9               (Unknown)
+# Sun KCMS
+36     string          acsp            Kodak Color Management System, ICC Profile
+
+
diff --git a/file/Magdir/sysex b/file/Magdir/sysex
new file mode 100644 (file)
index 0000000..9a3fe2e
--- /dev/null
@@ -0,0 +1,142 @@
+#------------------------------------------------------------------------
+# sysex: file(1) magic for MIDI sysex files
+#
+# 
+0      byte                    0xF0            SysEx File -
+
+>1     byte                    0x2f            ELKA
+>>3    byte                    0x09            EK-44
+
+>1     byte                    0x3e            Waldorf
+>>3    byte                    0x7f            Microwave I
+
+>1     byte                    0x40            Kawai
+>>3    byte                    0x22            K4
+
+>1     byte                    0x41            Roland
+>>3    byte                    0x14            D-50
+>>3    byte                    0x2b            U-220
+>>3    byte                    0x02            TR-707
+
+>1     byte                    0x42            Korg
+>>3    byte                    0x19            M1
+
+>1     byte                    0x43            Yamaha
+>1     byte                    0x44            Casio
+>1     byte                    0x46            Kamiya
+>1     byte                    0x47            Akai
+>1     byte                    0x48            Victor
+>1     byte                    0x4b            Fujitsu
+>1     byte                    0x4c            Sony
+>1     byte                    0x4e            Teac
+>1     byte                    0x50            Matsushita
+>1     byte                    0x51            Fostex
+>1     byte                    0x52            Zoom
+>1     byte                    0x54            Matsushita
+>1     byte                    0x57            Acoustic tech. lab.
+
+>1     belong&0xffffff00       0x00007400      Ta Horng
+>1     belong&0xffffff00       0x00007500      e-Tek
+>1     belong&0xffffff00       0x00007600      E-Voice
+>1     belong&0xffffff00       0x00007700      Midisoft
+>1     belong&0xffffff00       0x00007800      Q-Sound
+>1     belong&0xffffff00       0x00007900      Westrex
+>1     belong&0xffffff00       0x00007a00      Nvidia*
+>1     belong&0xffffff00       0x00007b00      ESS
+>1     belong&0xffffff00       0x00007c00      Mediatrix
+>1     belong&0xffffff00       0x00007d00      Brooktree
+>1     belong&0xffffff00       0x00007e00      Otari
+>1     belong&0xffffff00       0x00007f00      Key Electronics
+>1     belong&0xffffff00       0x00010000      Shure
+>1     belong&0xffffff00       0x00010100      AuraSound
+>1     belong&0xffffff00       0x00010200      Crystal
+>1     belong&0xffffff00       0x00010300      Rockwell
+>1     belong&0xffffff00       0x00010400      Silicon Graphics
+>1     belong&0xffffff00       0x00010500      Midiman
+>1     belong&0xffffff00       0x00010600      PreSonus
+>1     belong&0xffffff00       0x00010800      Topaz
+>1     belong&0xffffff00       0x00010900      Cast Lightning
+>1     belong&0xffffff00       0x00010a00      Microsoft
+>1     belong&0xffffff00       0x00010b00      Sonic Foundry
+>1     belong&0xffffff00       0x00010c00      Line 6
+>1     belong&0xffffff00       0x00010d00      Beatnik Inc.
+>1     belong&0xffffff00       0x00010e00      Van Koerving
+>1     belong&0xffffff00       0x00010f00      Altech Systems
+>1     belong&0xffffff00       0x00011000      S & S Research
+>1     belong&0xffffff00       0x00011100      VLSI Technology
+>1     belong&0xffffff00       0x00011200      Chromatic
+>1     belong&0xffffff00       0x00011300      Sapphire
+>1     belong&0xffffff00       0x00011400      IDRC
+>1     belong&0xffffff00       0x00011500      Justonic Tuning
+>1     belong&0xffffff00       0x00011600      TorComp
+>1     belong&0xffffff00       0x00011700      Newtek Inc.
+>1     belong&0xffffff00       0x00011800      Sound Sculpture
+>1     belong&0xffffff00       0x00011900      Walker Technical
+>1     belong&0xffffff00       0x00011a00      Digital Harmony
+>1     belong&0xffffff00       0x00011b00      InVision
+>1     belong&0xffffff00       0x00011c00      T-Square
+>1     belong&0xffffff00       0x00011d00      Nemesys
+>1     belong&0xffffff00       0x00011e00      DBX
+>1     belong&0xffffff00       0x00011f00      Syndyne
+>1     belong&0xffffff00       0x00012000      Bitheadz        
+>1     belong&0xffffff00       0x00012100      Cakewalk
+>1     belong&0xffffff00       0x00012200      Staccato
+>1     belong&0xffffff00       0x00012300      National Semicon.
+>1     belong&0xffffff00       0x00012400      Boom Theory
+>1     belong&0xffffff00       0x00012500      Virtual DSP Corp
+>1     belong&0xffffff00       0x00012600      Antares
+>1     belong&0xffffff00       0x00012700      Angel Software
+>1     belong&0xffffff00       0x00012800      St Louis Music
+>1     belong&0xffffff00       0x00012900      Lyrrus dba G-VOX
+>1     belong&0xffffff00       0x00012a00      Ashley Audio
+>1     belong&0xffffff00       0x00012b00      Vari-Lite
+>1     belong&0xffffff00       0x00012c00      Summit Audio
+>1     belong&0xffffff00       0x00012d00      Aureal Semicon.
+>1     belong&0xffffff00       0x00012e00      SeaSound
+>1     belong&0xffffff00       0x00012f00      U.S. Robotics
+>1     belong&0xffffff00       0x00013000      Aurisis
+>1     belong&0xffffff00       0x00013100      Nearfield Multimedia
+>1     belong&0xffffff00       0x00013200      FM7 Inc.
+>1     belong&0xffffff00       0x00013300      Swivel Systems
+>1     belong&0xffffff00       0x00013400      Hyperactive
+>1     belong&0xffffff00       0x00013500      MidiLite
+>1     belong&0xffffff00       0x00013600      Radical
+>1     belong&0xffffff00       0x00013700      Roger Linn
+>1     belong&0xffffff00       0x00013800      Helicon
+>1     belong&0xffffff00       0x00013900      Event
+>1     belong&0xffffff00       0x00013a00      Sonic Network
+>1     belong&0xffffff00       0x00013b00      Realtime Music
+>1     belong&0xffffff00       0x00013c00      Apogee Digital
+
+>1     belong&0xffffff00       0x00202b00      Medeli Electronics
+>1     belong&0xffffff00       0x00202c00      Charlie Lab
+>1     belong&0xffffff00       0x00202d00      Blue Chip Music
+>1     belong&0xffffff00       0x00202e00      BEE OH Corp
+>1     belong&0xffffff00       0x00202f00      LG Semicon America
+>1     belong&0xffffff00       0x00203000      TESI
+>1     belong&0xffffff00       0x00203100      EMAGIC
+>1     belong&0xffffff00       0x00203200      Behringer
+>1     belong&0xffffff00       0x00203300      Access Music
+>1     belong&0xffffff00       0x00203400      Synoptic
+>1     belong&0xffffff00       0x00203500      Hanmesoft Corp
+>1     belong&0xffffff00       0x00203600      Terratec
+>1     belong&0xffffff00       0x00203700      Proel SpA
+>1     belong&0xffffff00       0x00203800      IBK MIDI
+>1     belong&0xffffff00       0x00203900      IRCAM
+>1     belong&0xffffff00       0x00203a00      Propellerhead Software
+>1     belong&0xffffff00       0x00203b00      Red Sound Systems
+>1     belong&0xffffff00       0x00203c00      Electron ESI AB
+>1     belong&0xffffff00       0x00203d00      Sintefex Audio
+>1     belong&0xffffff00       0x00203e00      Music and More
+>1     belong&0xffffff00       0x00203f00      Amsaro
+>1     belong&0xffffff00       0x00204000      CDS Advanced Technology
+>1     belong&0xffffff00       0x00204100      Touched by Sound
+>1     belong&0xffffff00       0x00204200      DSP Arts
+>1     belong&0xffffff00       0x00204300      Phil Rees Music
+>1     belong&0xffffff00       0x00204400      Stamer Musikanlagen GmbH
+>1     belong&0xffffff00       0x00204500      Soundart
+>1     belong&0xffffff00       0x00204600      C-Mexx Software
+>1     belong&0xffffff00       0x00204700      Klavis Tech.
+>1     belong&0xffffff00       0x00204800      Noteheads AB
+
+0      string                  T707            Roland TR-707 Data
diff --git a/file/Magdir/teapot b/file/Magdir/teapot
new file mode 100644 (file)
index 0000000..d9554bf
--- /dev/null
@@ -0,0 +1,4 @@
+#------------------------------------------------------------------------------
+# teapot:  file(1) magic for "teapot" spreadsheet
+#
+0       string          #!teapot\012xdr      teapot work sheet (XDR format)
diff --git a/file/Magdir/terminfo b/file/Magdir/terminfo
new file mode 100644 (file)
index 0000000..2226ce8
--- /dev/null
@@ -0,0 +1,9 @@
+
+#------------------------------------------------------------------------------
+# terminfo:  file(1) magic for terminfo
+#
+# XXX - byte order for screen images?
+#
+0      string          \032\001        Compiled terminfo entry
+0      short           0433            Curses screen image
+0      short           0434            Curses screen image
diff --git a/file/Magdir/tex b/file/Magdir/tex
new file mode 100644 (file)
index 0000000..79d5bba
--- /dev/null
@@ -0,0 +1,47 @@
+
+#------------------------------------------------------------------------------
+# tex:  file(1) magic for TeX files
+#
+# From <conklin@talisman.kaleida.com>
+
+# Although we may know the offset of certain text fields in TeX DVI
+# and font files, we can't use them reliably because they are not
+# zero terminated. [but we do anyway, christos]
+0      string          \367\002        TeX DVI file
+>16    string          >\0             (%s)
+0      string          \367\203        TeX generic font data
+0      string          \367\131        TeX packed font data
+>3     string          >\0             (%s)
+0      string          \367\312        TeX virtual font data
+0      string          This\ is\ TeX,  TeX transcript text
+0      string          This\ is\ METAFONT,     METAFONT transcript text
+
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2      string          \000\021        TeX font metric data
+>33    string          >\0             (%s)
+2      string          \000\022        TeX font metric data
+>33    string          >\0             (%s)
+
+# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \\input\ texinfo        Texinfo source text
+0      string          This\ is\ Info\ file    GNU Info text
+
+# TeX documents, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \\input         TeX document text
+0      string          \\section       LaTeX document text
+0      string          \\setlength     LaTeX document text
+0      string          \\documentstyle LaTeX document text
+0      string          \\chapter       LaTeX document text
+0      string          \\documentclass LaTeX 2e document text
+0      string          \\relax         LaTeX auxiliary file
+0      string          \\contentsline  LaTeX  table of contents
+
+# Index and glossary files
+0      string          \\indexentry    LaTeX raw index file
+0      string          \\begin{theindex}       LaTeX sorted index
+0      string          \\glossaryentry LaTeX raw glossary
+0      string          \\begin{theglossary}    LaTeX sorted glossary
+0      string          This\ is\ makeindex     Makeindex log file
+# End of TeX
diff --git a/file/Magdir/tgif b/file/Magdir/tgif
new file mode 100644 (file)
index 0000000..a6ffe36
--- /dev/null
@@ -0,0 +1,6 @@
+#------------------------------------------------------------------------------
+# file(1) magic for tgif(1) files
+# From Hendrik Scholz <hendrik@scholz.net>
+
+0   string  %TGIF\ 4   tgif version 4 object file
+
diff --git a/file/Magdir/ti-8x b/file/Magdir/ti-8x
new file mode 100644 (file)
index 0000000..d740060
--- /dev/null
@@ -0,0 +1,36 @@
+# ------------------------------------------------------------------------
+# ti-8x: file(1) magic for the TI-8x and TI-92 Graphing Calculators.
+#
+# From: Ryan McGuire (rmcguire@freenet.columbus.oh.us).
+#
+# NOTE: This list is not complete.
+#
+# Magic Numbers for the TI-82
+#
+0               string          **TI82**        TI-82 Graphing Calculator
+>0x000037       byte            0x0B            TI-BASIC Group/Program File.
+#
+# Magic Numbers for the TI-83
+#
+0               string          **TI83**        TI-83 Graphing Calculator
+>0x000037       byte            0x0B            TI-BASIC Group/Program File.
+#
+# Magic Numbers for the TI-85
+#
+0               string          **TI85**        TI-85 Graphing Calculator
+>11             string          Backup          Backup File.
+>0x000032       string          ZS4             - ZShell Version 4 File.
+>0x000032       string          ZS3             - ZShell Version 3 File.
+>0x00000B       string          GDatabase       Graphics Database.
+>0x00003B       byte            0x12            TI-BASIC Group/Program File.
+#
+# Magic Numbers for the TI-92
+#
+0               string          **TI92**        TI-92 Graphing Calculator
+>0x000058       byte            0x12            TI-BASIC Group File.
+>0x000012       string          Function        Function.
+>0x000048       byte            0x12            TI-BASIC Program.
+# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the
+# program/group magic numbers in here because I cannot find any.
+0               string          **TI80**        TI-80 Graphing Calculator File.
+0               string          **TI81**        TI-81 Graphing Calculator File.
diff --git a/file/Magdir/timezone b/file/Magdir/timezone
new file mode 100644 (file)
index 0000000..40e7558
--- /dev/null
@@ -0,0 +1,14 @@
+
+#------------------------------------------------------------------------------
+# timezone:  file(1) magic for timezone data
+#
+# from Daniel Quinlan (quinlan@yggdrasil.com)
+# this should work on Linux, SunOS, and maybe others
+# Added new official magic number for recent versions of the Olson code
+0      string  TZif    timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0      old timezone data
diff --git a/file/Magdir/troff b/file/Magdir/troff
new file mode 100644 (file)
index 0000000..01ad88a
--- /dev/null
@@ -0,0 +1,28 @@
+
+#------------------------------------------------------------------------------
+# troff:  file(1) magic for *roff
+#
+# updated by Daniel Quinlan (quinlan@yggdrasil.com)
+
+# troff input
+0      string          .\\"            troff or preprocessor input text
+0      string          '\\"            troff or preprocessor input text
+0      string          '.\\"           troff or preprocessor input text
+0      string          \\"             troff or preprocessor input text
+0      string          '''             troff or preprocessor input text
+
+# ditroff intermediate output text
+0      string          x\ T            ditroff output text
+>4     string          cat             for the C/A/T phototypesetter
+>4     string          ps              for PostScript
+>4     string          dvi             for DVI
+>4     string          ascii           for ASCII
+>4     string          lj4             for LaserJet 4
+>4     string          latin1          for ISO 8859-1 (Latin 1)
+>4     string          X75             for xditview at 75dpi
+>>7    string          -12             (12pt)
+>4     string          X100            for xditview at 100dpi
+>>8    string          -12             (12pt)
+
+# output data formats
+0      string          \100\357        very old (C/A/T) troff output data
diff --git a/file/Magdir/tuxedo b/file/Magdir/tuxedo
new file mode 100644 (file)
index 0000000..119afa6
--- /dev/null
@@ -0,0 +1,7 @@
+#
+#------------------------------------------------------------------------------
+# tuxedo:      file(1) magic for BEA TUXEDO data files
+#
+# from Ian Springer <ispringer@hotmail.com>
+#
+0      string          \0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0      BEA TUXEDO DES mask data
diff --git a/file/Magdir/typeset b/file/Magdir/typeset
new file mode 100644 (file)
index 0000000..2eda7c3
--- /dev/null
@@ -0,0 +1,7 @@
+
+#------------------------------------------------------------------------------
+# typeset:  file(1) magic for other typesetting
+#
+0      string          Interpress/Xerox        Xerox InterPress data
+>16    string          /                       (version
+>>17   string          >\0                     %s)
diff --git a/file/Magdir/unknown b/file/Magdir/unknown
new file mode 100644 (file)
index 0000000..843dc29
--- /dev/null
@@ -0,0 +1,36 @@
+
+#------------------------------------------------------------------------------
+# unknown:  file(1) magic for unknown machines
+#
+# XXX - this probably should be pruned, as it'll match PDP-11 and
+# VAX image formats.
+#
+# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
+# respectively).
+#
+# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
+# have the "version %ld", which may be a bogus COFFism (I don't think
+# there ever was COFF for the PDP-11).
+#
+# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
+# long, as it would be on a VAX.
+#
+# 0x10C is 0414, 0x10D is 0415, and 0x10E is 416; those *are* unknown.
+#
+0      short           0x107           unknown machine executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x108           unknown pure executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x109           PDP-11 separate I&D
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x10b           unknown pure executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      long            0x10c           unknown demand paged pure executable
+>16    long            >0              not stripped
+0      long            0x10d           unknown demand paged pure executable
+>16    long            >0              not stripped
+0      long            0x10e           unknown readable demand paged pure executable
diff --git a/file/Magdir/uuencode b/file/Magdir/uuencode
new file mode 100644 (file)
index 0000000..7e88619
--- /dev/null
@@ -0,0 +1,30 @@
+
+#------------------------------------------------------------------------------
+# uuencode:  file(1) magic for ASCII-encoded files
+#
+
+# GRR:  the first line of xxencoded files is identical to that in uuencoded
+# files, but the first character in most subsequent lines is 'h' instead of
+# 'M'.  (xxencoding uses lowercase letters in place of most of uuencode's
+# punctuation and survives BITNET gateways better.)  If regular expressions
+# were supported, this entry could possibly be split into two with
+# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs).
+0      string          begin\040       uuencoded or xxencoded text
+
+# btoa(1) is an alternative to uuencode that requires less space.
+0      string          xbtoa\ Begin    btoa'd text
+
+# ship(1) is another, much cooler alternative to uuencode.
+# Greg Roelofs, newt@uchicago.edu
+0      string          $\012ship       ship'd binary text
+
+# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)
+# Greg Roelofs, newt@uchicago.edu
+0      string  Decode\ the\ following\ with\ bdeco     bencoded News text
+
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan@yggdrasil.com
+11     string  must\ be\ converted\ with\ BinHex       BinHex binary text
+>41    string  x                                       \b, version %.3s
+
+# GRR:  is MIME BASE64 encoding handled somewhere?
diff --git a/file/Magdir/varied.out b/file/Magdir/varied.out
new file mode 100644 (file)
index 0000000..03ca510
--- /dev/null
@@ -0,0 +1,28 @@
+
+#------------------------------------------------------------------------------
+# varied.out:  file(1) magic for various USG systems
+#
+#      Herewith many of the object file formats used by USG systems.
+#      Most have been moved to files for a particular processor,
+#      and deleted if they duplicate other entries.
+#
+0      short           0610            Perkin-Elmer executable
+# AMD 29K
+0      beshort         0572            amd 29k coff noprebar executable
+0      beshort         01572           amd 29k coff prebar executable
+0      beshort         0160007         amd 29k coff archive
+# Cray
+6      beshort         0407            unicos (cray) executable
+# Ultrix 4.3
+596    string          \130\337\377\377        Ultrix core file
+>600   string          >\0             from '%s'
+# BeOS and MAcOS PEF executables
+# From: hplus@zilker.net (Jon Watte)
+0      string          Joy!peffpwpc    header for PowerPC PEF executable
+#
+# ava assembler/linker Uros Platise <uros.platise@ijs.si>
+0       string          avaobj  AVR assembler object code
+>7      string          >\0     version '%s'
+# gnu gmon magic From: Eugen Dedu <dedu@ese-metz.fr>
+0      string          gmon            GNU prof performance data
+>4     long            x               - version %ld
diff --git a/file/Magdir/vax b/file/Magdir/vax
new file mode 100644 (file)
index 0000000..7dd86cc
--- /dev/null
@@ -0,0 +1,34 @@
+
+#------------------------------------------------------------------------------
+# vax:  file(1) magic for VAX executable/object and APL workspace
+#
+0      lelong          0101557         VAX single precision APL workspace
+0      lelong          0101556         VAX double precision APL workspace
+
+#
+# VAX a.out (32V, BSD)
+#
+0      lelong          0407            VAX executable
+>16    lelong          >0              not stripped
+
+0      lelong          0410            VAX pure executable
+>16    lelong          >0              not stripped
+
+0      lelong          0413            VAX demand paged pure executable
+>16    lelong          >0              not stripped
+
+0      lelong          0420            VAX demand paged (first page unmapped) pure executable
+>16    lelong          >0              not stripped
+
+#
+# VAX COFF
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0      leshort         0570            VAX COFF executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
+0      leshort         0575            VAX COFF pure executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
diff --git a/file/Magdir/vicar b/file/Magdir/vicar
new file mode 100644 (file)
index 0000000..ab216ee
--- /dev/null
@@ -0,0 +1,16 @@
+
+#------------------------------------------------------------------------------
+# vicar:  file(1) magic for VICAR files.
+#
+# From: Ossama Othman <othman@astrosun.tn.cornell.edu
+# VICAR is JPL's in-house spacecraft image processing program
+# VICAR image
+0      string  LBLSIZE=        VICAR image data
+>32    string  BYTE            \b, 8 bits  = VAX byte
+>32    string  HALF            \b, 16 bits = VAX word     = Fortran INTEGER*2
+>32    string  FULL            \b, 32 bits = VAX longword = Fortran INTEGER*4
+>32    string  REAL            \b, 32 bits = VAX longword = Fortran REAL*4
+>32    string  DOUB            \b, 64 bits = VAX quadword = Fortran REAL*8
+>32    string  COMPLEX         \b, 64 bits = VAX quadword = Fortran COMPLEX*8
+# VICAR label file
+43     string  SFDU_LABEL      VICAR label file
diff --git a/file/Magdir/visx b/file/Magdir/visx
new file mode 100644 (file)
index 0000000..4919964
--- /dev/null
@@ -0,0 +1,31 @@
+
+#------------------------------------------------------------------------------
+# visx:  file(1) magic for Visx format files
+#
+0      short           0x5555          VISX image file
+>2     byte            0               (zero)
+>2     byte            1               (unsigned char)
+>2     byte            2               (short integer)
+>2     byte            3               (float 32)
+>2     byte            4               (float 64)
+>2     byte            5               (signed char)
+>2     byte            6               (bit-plane)
+>2     byte            7               (classes)
+>2     byte            8               (statistics)
+>2     byte            10              (ascii text)
+>2     byte            15              (image segments)
+>2     byte            100             (image set)
+>2     byte            101             (unsigned char vector)
+>2     byte            102             (short integer vector)
+>2     byte            103             (float 32 vector)
+>2     byte            104             (float 64 vector)
+>2     byte            105             (signed char vector)
+>2     byte            106             (bit plane vector)
+>2     byte            121             (feature vector)
+>2     byte            122             (feature vector library)
+>2     byte            124             (chain code)
+>2     byte            126             (bit vector)
+>2     byte            130             (graph)
+>2     byte            131             (adjacency graph)
+>2     byte            132             (adjacency graph library)
+>2     string          .VISIX          (ascii text)
diff --git a/file/Magdir/vms b/file/Magdir/vms
new file mode 100644 (file)
index 0000000..c91186f
--- /dev/null
@@ -0,0 +1,27 @@
+
+#------------------------------------------------------------------------------
+# vms:  file(1) magic for VMS executables (experimental)
+#
+# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt@uchicago.edu)
+
+# GRR 950122:  I'm just guessing on these, based on inspection of the headers
+# of three executables each for Alpha and VAX architectures.  The VAX files
+# all had headers similar to this:
+#
+#   00000  b0 00 30 00 44 00 60 00  00 00 00 00 30 32 30 35  ..0.D.`.....0205
+#   00010  01 01 00 00 ff ff ff ff  ff ff ff ff 00 00 00 00  ................
+#
+0      string  \xb0\0\x30\0    VMS VAX executable
+>44032 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+#
+# The AXP files all looked like this, except that the byte at offset 0x22
+# was 06 in some of them and 07 in others:
+#
+#   00000  03 00 00 00 00 00 00 00  ec 02 00 00 10 01 00 00  ................
+#   00010  68 00 00 00 98 00 00 00  b8 00 00 00 00 00 00 00  h...............
+#   00020  00 00 07 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00030  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00040  00 00 00 00 ff ff ff ff  ff ff ff ff 02 00 00 00  ................
+#
+0      belong  0x03000000      VMS Alpha executable
+>75264 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
diff --git a/file/Magdir/vmware b/file/Magdir/vmware
new file mode 100644 (file)
index 0000000..857a4a9
--- /dev/null
@@ -0,0 +1,12 @@
+
+# -----------------------------------------------------------
+# VMware specific files (deducted from version 1.1 and log file entries)
+# Anthon van der Neut (anthon@mnt.org)
+0      belong  0x4d52564e      VMware nvram 
+0      belong  0x434f5744      
+>8     byte    3               VMware virtual disk 
+>>32   lelong  x               (%d/
+>>36   lelong  x               \b%d/
+>>40   lelong  x               \b%d)
+>8     byte    2               VMware undoable disk
+>>32   string  >\0             (%s)
diff --git a/file/Magdir/vorbis b/file/Magdir/vorbis
new file mode 100644 (file)
index 0000000..6e4efad
--- /dev/null
@@ -0,0 +1,65 @@
+
+#------------------------------------------------------------------------------
+# vorbis:  file(1) magic for Ogg/Vorbis files
+#
+# From Felix von Leitner <leitner@fefe.de>
+# Extended by Beni Cherniavsky <cben@crosswinds.net>
+#
+# Most (everything but the number of channels and bitrate) is commented
+# out with `##' as it's not interesting to the average user.  The most
+# probable things advanced users would want to uncomment are probably
+# the number of comments and the encoder version.
+#
+# --- Ogg Framing ---
+0              string          OggS            Ogg data
+>4             byte            !0              UNKNOWN REVISION %u
+##>4           byte            0               revision 0
+>4             byte            0
+##>>14         lelong          x               (Serial %lX)
+# --- First vorbis packet - general header ---
+>>28           string          \x01vorbis      \b, Vorbis audio,
+>>>35          lelong          !0              UNKNOWN VERSION %lu,
+##>>>35                lelong          0               version 0,
+>>>35          lelong          0
+>>>>39         ubyte           1               mono,
+>>>>39         ubyte           2               stereo,
+>>>>39         ubyte           >2              %u channels,
+>>>>40         lelong          x               %lu Hz
+# Minimal, nominal and maximal bitrates specified when encoding
+>>>>48         string          <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff       \b,
+# The above tests if at least one of these is specified:
+>>>>>44                lelong          !-1
+>>>>>>44       lelong          x               >%lu
+>>>>>48                lelong          !-1
+>>>>>>48       lelong          x               ~%lu
+>>>>>52                lelong          !-1
+>>>>>>52       lelong          x               <%lu
+>>>>>48                string          <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff       kbps
+# -- Second vorbis header packet - the comments
+>>>102         string          \x03vorbis
+# A kludge to read the vendor string.  It's a counted string, not a
+# zero-terminated one, so file(1) can't read it in a generic way.
+# libVorbis is the only one existing currently, so I detect specifically
+# it.  The interesting value is the cvs date (8 digits decimal).
+##>>>>113              string/c        Xiphophorus\ libVorbis\ I       \b, created by: Xiphophorus libVorbis I
+##>>>>>137     string          >00000000       %.8s
+# Map to beta version numbers:
+##>>>>>>137    string          <20000508       (<beta1 - prepublic)
+# The string has not changed from beta1 to 2 - they are indistinguishable.
+##>>>>>>137    string          20000508        (beta1/2)
+##>>>>>>137    string          >20000508
+##>>>>>>>137   string          <20001031       (beta2-3)
+##>>>>>>137    string          20001031        (beta3)
+##>>>>>>137    string          >20001031
+##>>>>>>>137   string          <20010225       (beta3-4)
+##>>>>>>137    string          20010225        (beta4)
+##>>>>>>137    string          >20010225
+##>>>>>>>137   string          <20010615       (beta4-RC1)
+##>>>>>>137    string          20010615        (RC1)
+##>>>>>>137    string          >20010615       (>RC1)
+# Then come the comments, again length-counted (and number-counted).
+# Some looping constructs and registers would allow reading them but now
+# it's impossible.  However we can print the number of comments present
+# (skipping by the vendor string length):
+##>>>>(109.l.113)      lelong          0               \b, no comments
+##>>>>(109.l+113)      lelong          >0              \b, %lu comments
diff --git a/file/Magdir/vxl b/file/Magdir/vxl
new file mode 100644 (file)
index 0000000..d3f5561
--- /dev/null
@@ -0,0 +1,13 @@
+
+#------------------------------------------------------------------------------
+# VXL: file(1) magic for VXL binary IO data files
+#
+# from Ian Scott <scottim@sf.net>
+#
+# VXL is a collection of C++ libraries for Computer Vision.
+# See the vsl chapter in the VXL Book for more info
+# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html
+# http:/vxl.sf.net
+
+2      lelong  0x472b2c4e      VXL data file,
+>0     leshort >0              schema version no %d
diff --git a/file/Magdir/wordperfect b/file/Magdir/wordperfect
new file mode 100644 (file)
index 0000000..c77ac8d
--- /dev/null
@@ -0,0 +1,91 @@
+#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+0      string  \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable text
+>15    byte    0       Optimized for Intel
+>15    byte    1       Optimized for Non-Intel
+1      string  WPC     (Corel/WP)
+>8     short   257     WordPerfect macro
+>8     short   258     WordPerfect help file
+>8     short   259     WordPerfect keyboard file
+>8     short   266     WordPerfect document
+>8     short   267     WordPerfect dictionary
+>8     short   268     WordPerfect thesaurus
+>8     short   269     WordPerfect block
+>8     short   270     WordPerfect rectangular block
+>8     short   271     WordPerfect column block
+>8     short   272     WordPerfect printer data
+>8     short   275     WordPerfect printer data
+>8     short   276     WordPerfect driver resource data
+>8     short   279     WordPerfect hyphenation code
+>8     short   280     WordPerfect hyphenation data
+>8     short   281     WordPerfect macro resource data
+>8     short   283     WordPerfect hyphenation lex
+>8     short   285     WordPerfect wordlist
+>8     short   286     WordPerfect equation resource data
+>8     short   289     WordPerfect spell rules
+>8     short   290     WordPerfect dictionary rules
+>8     short   295     WordPerfect spell rules (Microlytics)
+>8     short   299     WordPerfect settings file
+>8     short   301     WordPerfect 4.2 document
+>8     short   325     WordPerfect dialog file
+>8     short   332     WordPerfect button bar
+>8     short   513     Shell macro
+>8     short   522     Shell definition
+>8     short   769     Notebook macro
+>8     short   770     Notebook help file
+>8     short   771     Notebook keyboard file
+>8     short   778     Notebook definition
+>8     short   1026    Calculator help file
+>8     short   1538    Calendar help file
+>8     short   1546    Calendar data file
+>8     short   1793    Editor macro
+>8     short   1794    Editor help file
+>8     short   1795    Editor keyboard file
+>8     short   1817    Editor macro resource file
+>8     short   2049    Macro editor macro
+>8     short   2050    Macro editor help file
+>8     short   2051    Macro editor keyboard file
+>8     short   2305    PlanPerfect macro
+>8     short   2306    PlanPerfect help file
+>8     short   2307    PlanPerfect keyboard file
+>8     short   2314    PlanPerfect worksheet
+>8     short   2319    PlanPerfect printer definition
+>8     short   2322    PlanPerfect graphic definition
+>8     short   2323    PlanPerfect data
+>8     short   2324    PlanPerfect temporary printer
+>8     short   2329    PlanPerfect macro resource data
+>8     byte    11      Mail
+>8     short   2818    help file
+>8     short   2821    distribution list
+>8     short   2826    out box
+>8     short   2827    in box
+>8     short   2836    users archived mailbox
+>8     short   2837    archived message database
+>8     short   2838    archived attachments
+>8     short   3083    Printer temporary file
+>8     short   3330    Scheduler help file
+>8     short   3338    Scheduler in file
+>8     short   3339    Scheduler out file
+>8     short   3594    GroupWise settings file
+>8     short   3601    GroupWise directory services
+>8     short   3627    GroupWise settings file
+>8     short   4362    Terminal resource data
+>8     short   4363    Terminal resource data
+>8     short   4395    Terminal resource data
+>8     short   4619    GUI loadable text
+>8     short   4620    graphics resource data
+>8     short   4621    printer settings file
+>8     short   4622    port definition file
+>8     short   4623    print queue parameters
+>8     short   4624    compressed file
+>8     short   5130    Network service msg file
+>8     short   5131    Network service msg file
+>8     short   5132    Async gateway login msg
+>8     short   5134    GroupWise message file
+>8     short   7956    GroupWise admin domain database
+>8     short   7957    GroupWise admin host database
+>8     short   7959    GroupWise admin remote host database
+>8     short   7960    GroupWise admin ADS deferment data file
+>8     short   8458    IntelliTAG (SGML) compiled DTD
+>8     long    18219264        WordPerfect graphic image (1.0)
+>8     long    18219520        WordPerfect graphic image (2.0)
+#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
diff --git a/file/Magdir/xdelta b/file/Magdir/xdelta
new file mode 100644 (file)
index 0000000..80c92da
--- /dev/null
@@ -0,0 +1,10 @@
+
+#------------------------------------------------------------------------------
+# file(1) magic(5) data for xdelta  Josh MacDonald <jmacd@CS.Berkeley.EDU>
+#
+0      string  %XDELTA%        XDelta binary patch file 0.14
+0      string  %XDZ000%        XDelta binary patch file 0.18
+0      string  %XDZ001%        XDelta binary patch file 0.20
+0      string  %XDZ002%        XDelta binary patch file 1.0
+0      string  %XDZ003%        XDelta binary patch file 1.0.4
+0      string  %XDZ004%        XDelta binary patch file 1.1
diff --git a/file/Magdir/xenix b/file/Magdir/xenix
new file mode 100644 (file)
index 0000000..1acadec
--- /dev/null
@@ -0,0 +1,72 @@
+
+#------------------------------------------------------------------------------
+# xenix:  file(1) magic for Microsoft Xenix
+#
+# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
+# model" lifted from "magic.xenix", with comment "derived empirically;
+# treat as folklore until proven"
+#
+# "small model", "large model", "huge model" stuff lifted from XXX
+#
+# XXX - "x.out" collides with PDP-11 archives
+#
+0      string          core            core file (Xenix)
+0      byte            0x80            8086 relocatable (Microsoft)
+0      leshort         0xff65          x.out
+>2     string          __.SYMDEF        randomized
+>0     byte            x               archive
+0      leshort         0x206           Microsoft a.out
+>8     leshort         1               Middle model
+>0x1e  leshort         &0x10           overlay
+>0x1e  leshort         &0x2            separate
+>0x1e  leshort         &0x4            pure
+>0x1e  leshort         &0x800          segmented
+>0x1e  leshort         &0x400          standalone
+>0x1e  leshort         &0x8            fixed-stack
+>0x1c  byte            &0x80           byte-swapped
+>0x1c  byte            &0x40           word-swapped
+>0x10  lelong          >0              not-stripped
+>0x1e  leshort         ^0xc000         pre-SysV
+>0x1e  leshort         &0x4000         V2.3
+>0x1e  leshort         &0x8000         V3.0
+>0x1c  byte            &0x4            86
+>0x1c  byte            &0xb            186
+>0x1c  byte            &0x9            286
+>0x1c  byte            &0xa            386
+>0x1f  byte            <0x040          small model
+>0x1f  byte            =0x048          large model     
+>0x1f  byte            =0x049          huge model 
+>0x1e  leshort         &0x1            executable
+>0x1e  leshort         ^0x1            object file
+>0x1e  leshort         &0x40           Large Text
+>0x1e  leshort         &0x20           Large Data
+>0x1e  leshort         &0x120          Huge Objects Enabled
+>0x10  lelong          >0              not stripped
+
+0      leshort         0x140           old Microsoft 8086 x.out
+>0x3   byte            &0x4            separate
+>0x3   byte            &0x2            pure
+>0     byte            &0x1            executable
+>0     byte            ^0x1            relocatable
+>0x14  lelong          >0              not stripped
+
+0      lelong          0x206           b.out
+>0x1e  leshort         &0x10           overlay
+>0x1e  leshort         &0x2            separate
+>0x1e  leshort         &0x4            pure
+>0x1e  leshort         &0x800          segmented
+>0x1e  leshort         &0x400          standalone
+>0x1e  leshort         &0x1            executable
+>0x1e  leshort         ^0x1            object file
+>0x1e  leshort         &0x4000         V2.3
+>0x1e  leshort         &0x8000         V3.0
+>0x1c  byte            &0x4            86
+>0x1c  byte            &0xb            186
+>0x1c  byte            &0x9            286
+>0x1c  byte            &0x29           286
+>0x1c  byte            &0xa            386
+>0x1e  leshort         &0x4            Large Text
+>0x1e  leshort         &0x2            Large Data
+>0x1e  leshort         &0x102          Huge Objects Enabled
+
+0      leshort         0x580           XENIX 8086 relocatable or 80286 small model
diff --git a/file/Magdir/zilog b/file/Magdir/zilog
new file mode 100644 (file)
index 0000000..b746e20
--- /dev/null
@@ -0,0 +1,11 @@
+
+#------------------------------------------------------------------------------
+# zilog:  file(1) magic for Zilog Z8000.
+#
+# Was it big-endian or little-endian?  My Product Specification doesn't
+# say.
+#
+0      long            0xe807          object file (z8000 a.out)
+0      long            0xe808          pure object file (z8000 a.out)
+0      long            0xe809          separate object file (z8000 a.out)
+0      long            0xe805          overlay object file (z8000 a.out)
diff --git a/file/Magdir/zyxel b/file/Magdir/zyxel
new file mode 100644 (file)
index 0000000..12a6abd
--- /dev/null
@@ -0,0 +1,16 @@
+
+#------------------------------------------------------------------------------
+# zyxel:  file(1) magic for ZyXEL modems
+#
+# From <rob@pe1chl.ampr.org>
+# These are the /etc/magic entries to decode datafiles as used for the
+# ZyXEL U-1496E DATA/FAX/VOICE modems.  (This header conforms to a
+# ZyXEL-defined standard)
+
+0      string          ZyXEL\002       ZyXEL voice data
+>10    byte            0               - CELP encoding
+>10    byte&0x0B       1               - ADPCM2 encoding
+>10    byte&0x0B       2               - ADPCM3 encoding
+>10    byte&0x0B       3               - ADPCM4 encoding
+>10    byte&0x0B       8               - New ADPCM3 encoding
+>10    byte&0x04       4               with resync
diff --git a/file/Makefile.am b/file/Makefile.am
new file mode 100644 (file)
index 0000000..790951f
--- /dev/null
@@ -0,0 +1,83 @@
+# don't enforce GNU packaging standards
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+bin_PROGRAMS = file
+
+data_DATA = magic magic.mime magic.mgc
+
+MAGIC   = @datadir@/magic
+CPPFLAGS = -DMAGIC='"$(MAGIC)"'
+
+if FSECT5
+man_MAGIC = magic.5
+else
+man_MAGIC = magic.4
+endif
+fsect = @fsect@
+man_MANS = file.1 $(man_MAGIC)
+
+file_SOURCES = file.c apprentice.c fsmagic.c softmagic.c ascmagic.c \
+       compress.c is_tar.c readelf.c print.c \
+       file.h names.h patchlevel.h readelf.h tar.h
+
+EXTRA_DIST = LEGAL.NOTICE MAINT PORTING Makefile.std magic2mime \
+       Localstuff Header $(magic_FRAGMENTS) file.man magic.man
+
+CLEANFILES = $(man_MANS) magic magic.mgc
+
+magic: Header Localstuff $(magic_FRAGMENTS)
+       cat $(srcdir)/Header $(srcdir)/Localstuff > $@
+       for frag in $(magic_FRAGMENTS); do \
+         if test -f $(srcdir)/$$frag; then \
+           f=$(srcdir)/$$frag; \
+         else \
+           f=$$frag; \
+         fi; \
+          cat $$f; \
+       done >> $@
+
+magic.mgc: magic file
+       ./file -C -m magic
+
+file.1:        Makefile file.man
+       @rm -f $@
+       sed -e s@__CSECTION__@1@g \
+           -e s@__FSECTION__@${fsect}@g \
+           -e s@__VERSION__@${VERSION}@g \
+           -e s@__MAGIC__@${MAGIC}@g $(srcdir)/file.man > $@
+
+magic.${fsect}: Makefile magic.man
+       @rm -f $@
+       sed -e s@__CSECTION__@1@g \
+           -e s@__FSECTION__@${fsect}@g \
+           -e s@__VERSION__@${VERSION}@g \
+           -e s@__MAGIC__@${MAGIC}@g $(srcdir)/magic.man > $@
+
+magic_FRAGMENTS = Magdir/adi Magdir/adventure Magdir/allegro Magdir/alliant \
+    Magdir/alpha Magdir/amanda Magdir/amigaos Magdir/animation \
+    Magdir/apl Magdir/apple Magdir/applix Magdir/archive Magdir/asterix \
+    Magdir/att3b Magdir/audio Magdir/blender Magdir/blit Magdir/bsdi \
+    Magdir/c-lang Magdir/chi Magdir/cisco Magdir/claris Magdir/clipper \
+    Magdir/commands Magdir/compress Magdir/console Magdir/convex \
+    Magdir/database Magdir/diamond Magdir/diff Magdir/digital \
+    Magdir/dump Magdir/elf Magdir/encore Magdir/epoc Magdir/filesystems \
+    Magdir/flash Magdir/fonts Magdir/frame Magdir/freebsd Magdir/fsav \
+    Magdir/gimp Magdir/gnu Magdir/grace Magdir/hp Magdir/ibm370 \
+    Magdir/ibm6000 Magdir/iff Magdir/images Magdir/intel \
+    Magdir/interleaf Magdir/island Magdir/ispell Magdir/java \
+    Magdir/jpeg Magdir/karma Magdir/lecter Magdir/lex Magdir/lif \
+    Magdir/linux Magdir/lisp Magdir/mach Magdir/macintosh Magdir/magic \
+    Magdir/mail.news Magdir/maple Magdir/mathematica Magdir/mcrypt \
+    Magdir/mime Magdir/mips Magdir/mirage Magdir/mkid Magdir/mmdf Magdir/modem \
+    Magdir/motorola Magdir/msdos Magdir/msvc Magdir/ncr Magdir/netbsd \
+    Magdir/netscape Magdir/news Magdir/octave Magdir/olf Magdir/os2 \
+    Magdir/os9 Magdir/osf1 Magdir/palm Magdir/pbm Magdir/pdf Magdir/pdp \
+    Magdir/pgp Magdir/pkgadd Magdir/plus5 Magdir/printer Magdir/project \
+    Magdir/psdbms Magdir/pyramid Magdir/python Magdir/riff Magdir/rpm \
+    Magdir/rtf Magdir/sc Magdir/sccs Magdir/sendmail Magdir/sequent \
+    Magdir/sgml Magdir/sketch Magdir/sniffer Magdir/softquad Magdir/spectrum \
+    Magdir/sun Magdir/teapot Magdir/terminfo Magdir/tex Magdir/ti-8x \
+    Magdir/timezone Magdir/troff Magdir/typeset Magdir/unknown \
+    Magdir/uuencode Magdir/varied.out Magdir/vax Magdir/vicar Magdir/visx \
+    Magdir/vms Magdir/vmware Magdir/wordperfect Magdir/xdelta Magdir/xenix \
+    Magdir/zilog Magdir/zyxel
diff --git a/file/Makefile.in b/file/Makefile.in
new file mode 100644 (file)
index 0000000..7a27145
--- /dev/null
@@ -0,0 +1,539 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# don't enforce GNU packaging standards
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+CC = @CC@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+bin_PROGRAMS = file
+
+data_DATA = magic magic.mime magic.mgc
+
+MAGIC = @datadir@/magic
+CPPFLAGS = -DMAGIC='"$(MAGIC)"'
+@FSECT5_TRUE@man_MAGIC = magic.5
+@FSECT5_FALSE@man_MAGIC = magic.4
+fsect = @fsect@
+man_MANS = file.1 $(man_MAGIC)
+
+file_SOURCES = file.c apprentice.c fsmagic.c softmagic.c ascmagic.c    compress.c is_tar.c readelf.c print.c   file.h names.h patchlevel.h readelf.h tar.h
+
+
+EXTRA_DIST = LEGAL.NOTICE MAINT PORTING Makefile.std magic2mime        Localstuff Header $(magic_FRAGMENTS) file.man magic.man
+
+
+CLEANFILES = $(man_MANS) magic magic.mgc
+
+magic_FRAGMENTS = Magdir/adi Magdir/adventure Magdir/allegro Magdir/alliant     Magdir/alpha Magdir/amanda Magdir/amigaos Magdir/animation     Magdir/apl Magdir/apple Magdir/applix Magdir/archive Magdir/asterix     Magdir/att3b Magdir/audio Magdir/blender Magdir/blit Magdir/bsdi     Magdir/c-lang Magdir/chi Magdir/cisco Magdir/claris Magdir/clipper     Magdir/commands Magdir/compress Magdir/console Magdir/convex     Magdir/database Magdir/diamond Magdir/diff Magdir/digital     Magdir/dump Magdir/elf Magdir/encore Magdir/epoc Magdir/filesystems     Magdir/flash Magdir/fonts Magdir/frame Magdir/freebsd Magdir/fsav     Magdir/gimp Magdir/gnu Magdir/grace Magdir/hp Magdir/ibm370     Magdir/ibm6000 Magdir/iff Magdir/images Magdir/intel     Magdir/interleaf Magdir/island Magdir/ispell Magdir/java     Magdir/jpeg Magdir/karma Magdir/lecter Magdir/lex Magdir/lif     Magdir/linux Magdir/lisp Magdir/mach Magdir/macintosh Magdir/magic     Magdir/mail.news Magdir/maple Magdir/mathematica Magdir/mcrypt     Magdir/mime Magdir/mips Magdir/mirage Magdir/mkid Magdir/mmdf Magdir/modem     Magdir/motorola Magdir/msdos Magdir/msvc Magdir/ncr    Magdir/natinst  Magdir/netbsd     Magdir/netscape Magdir/news Magdir/octave Magdir/olf Magdir/os2     Magdir/os9 Magdir/osf1 Magdir/palm Magdir/pbm Magdir/pdf Magdir/pdp     Magdir/pgp Magdir/pkgadd Magdir/plus5 Magdir/printer Magdir/project     Magdir/psdbms Magdir/pyramid Magdir/python Magdir/riff Magdir/rpm     Magdir/rtf Magdir/sc Magdir/sccs Magdir/sendmail Magdir/sequent     Magdir/sgml Magdir/sketch Magdir/sniffer Magdir/softquad Magdir/spectrum     Magdir/sun Magdir/teapot Magdir/terminfo Magdir/tex Magdir/ti-8x     Magdir/timezone Magdir/troff Magdir/typeset Magdir/unknown     Magdir/uuencode Magdir/varied.out Magdir/vax Magdir/vicar Magdir/visx     Magdir/vms Magdir/vmware Magdir/wordperfect Magdir/xdelta Magdir/xenix     Magdir/zilog Magdir/zyxel
+
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = 
+PROGRAMS =  $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I.
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+file_OBJECTS =  file.o apprentice.o fsmagic.o softmagic.o ascmagic.o \
+compress.o is_tar.o readelf.o print.o
+file_LDADD = $(LDADD)
+file_DEPENDENCIES = 
+file_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man1dir = $(mandir)/man1
+man4dir = $(mandir)/man4
+man5dir = $(mandir)/man5
+MANS = $(man_MANS)
+
+NROFF = nroff
+DATA =  $(data_DATA)
+
+DIST_COMMON =  README ./stamp-h.in Makefile.am Makefile.in acconfig.h \
+acinclude.m4 aclocal.m4 config.h.in configure configure.in install-sh \
+missing mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(file_SOURCES)
+OBJECTS = $(file_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in  acinclude.m4
+       cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h
+       @if test ! -f $@; then \
+               rm -f stamp-h; \
+               $(MAKE) stamp-h; \
+       else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h.in; \
+               $(MAKE) $(srcdir)/stamp-h.in; \
+       else :; fi
+$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h
+
+maintainer-clean-hdr:
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_PROGRAMS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+       done
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+file: $(file_OBJECTS) $(file_DEPENDENCIES)
+       @rm -f file
+       $(LINK) $(file_LDFLAGS) $(file_OBJECTS) $(file_LDADD) $(LIBS)
+
+install-man1:
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+       done
+
+uninstall-man1:
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man1dir)/$$inst; \
+       done
+
+install-man4:
+       $(mkinstalldirs) $(DESTDIR)$(man4dir)
+       @list='$(man4_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.4*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man4dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man4dir)/$$inst; \
+       done
+
+uninstall-man4:
+       @list='$(man4_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.4*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man4dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man4dir)/$$inst; \
+       done
+
+install-man5:
+       $(mkinstalldirs) $(DESTDIR)$(man5dir)
+       @list='$(man5_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.5*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst; \
+       done
+
+uninstall-man5:
+       @list='$(man5_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.5*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man5dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man5dir)/$$inst; \
+       done
+install-man: $(MANS)
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-man1 install-man4 install-man5
+uninstall-man:
+       @$(NORMAL_UNINSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 uninstall-man4 uninstall-man5
+
+install-dataDATA: $(data_DATA)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(datadir)
+       @list='$(data_DATA)'; for p in $$list; do \
+         if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(datadir)/$$p"; \
+           $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(datadir)/$$p; \
+         else if test -f $$p; then \
+           echo " $(INSTALL_DATA) $$p $(DESTDIR)$(datadir)/$$p"; \
+           $(INSTALL_DATA) $$p $(DESTDIR)$(datadir)/$$p; \
+         fi; fi; \
+       done
+
+uninstall-dataDATA:
+       @$(NORMAL_UNINSTALL)
+       list='$(data_DATA)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(datadir)/$$p; \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) dist
+       -rm -rf $(distdir)
+       @banner="$(distdir).tar.gz is ready for distribution"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+dist: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+dist-all: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+distdir: $(DISTFILES)
+       -rm -rf $(distdir)
+       mkdir $(distdir)
+       -chmod 777 $(distdir)
+       $(mkinstalldirs) $(distdir)/Magdir
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am: install-man install-dataDATA
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-dataDATA
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) config.h
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 \
+               $(DESTDIR)$(mandir)/man4 $(DESTDIR)$(mandir)/man5 \
+               $(DESTDIR)$(datadir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-binPROGRAMS \
+               mostlyclean-compile mostlyclean-tags \
+               mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-hdr clean-binPROGRAMS clean-compile clean-tags \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-hdr distclean-binPROGRAMS distclean-compile \
+               distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+       -rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-binPROGRAMS \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+       -rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile install-man1 uninstall-man1 install-man4 \
+uninstall-man4 install-man5 uninstall-man5 install-man uninstall-man \
+uninstall-dataDATA install-dataDATA tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+magic: Header Localstuff $(magic_FRAGMENTS)
+       cat $(srcdir)/Header $(srcdir)/Localstuff > $@
+       for frag in $(magic_FRAGMENTS); do \
+         if test -f $(srcdir)/$$frag; then \
+           f=$(srcdir)/$$frag; \
+         else \
+           f=$$frag; \
+         fi; \
+          cat $$f; \
+       done >> $@
+
+magic.mgc: magic file
+       ./file -C -m magic
+
+file.1:        Makefile file.man
+       @rm -f $@
+       sed -e s@__CSECTION__@1@g \
+           -e s@__FSECTION__@${fsect}@g \
+           -e s@__VERSION__@${VERSION}@g \
+           -e s@__MAGIC__@${MAGIC}@g $(srcdir)/file.man > $@
+
+magic.${fsect}: Makefile magic.man
+       @rm -f $@
+       sed -e s@__CSECTION__@1@g \
+           -e s@__FSECTION__@${fsect}@g \
+           -e s@__VERSION__@${VERSION}@g \
+           -e s@__MAGIC__@${MAGIC}@g $(srcdir)/magic.man > $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/file/Makefile.std b/file/Makefile.std
new file mode 100644 (file)
index 0000000..210950b
--- /dev/null
@@ -0,0 +1,167 @@
+# Makefile for file(1) cmd. 
+# Copyright (c) Ian F. Darwin 86/09/01 - see LEGAL.NOTICE.
+# @(#)Id: Makefile.std,v 1.12 2001/09/03 14:44:21 christos Exp 
+#
+# 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.
+#
+VERSION        = 3.37
+SHELL  = /bin/sh
+#MAGIC = /etc/magic
+MAGIC  = /usr/local/etc/magic
+DEFS   = -DMAGIC='"$(MAGIC)"' -DBUILTIN_ELF # -Dvoid=int
+CC     = cc
+COPTS  = -O -g         # newer compilers allow both; else drop -O
+# For truly antique environments, use this for (dummy) include files:
+COPTS  = -O # -Ilocalinc
+CFLAGS = $(COPTS) $(DEFS)
+LDFLAGS        = $(COPTS) # -Bstatic   # older gdb couldn't handle shared libs
+SHAR   = bundle
+OFILE  = /usr/bin/file         # old or distributed version, for comparison
+# Where new binary lives; typically /usr/local (BSD), /usr/lbin (USG).
+BINDIR = /usr/local/bin
+# For installing our man pages; 
+# MANCxxx is manual section for Commands, MANFxxx is section for file formats.
+# MANxDIR is directory names; MANxEXT is the filename extention. Usual values:
+# Variable     V7              4BSD            Sys V
+# MANCDIR      /usr/man/man1   /usr/man/man1   /usr/man/u_man/man1
+# MANFDIR      /usr/man/man5   /usr/man/man5   /usr/man/u_man/man4
+# MANCEXT      1               1               1
+# MANFEXT      5               5               4
+# --- possible alternative for 4BSD ---
+# MANCDIR                      /usr/local/man/man1
+# MANCEXT                      1
+# or
+# MANCDIR                      /usr/man/manl
+# MANCEXT                      l
+# --- possible alternative for USG ---
+# MANCDIR                      /usr/man/local/man1
+# MANCEXT                      1
+
+MANCDIR        = /usr/local/man/man1
+MANCEXT        = 1
+MANFDIR        = /usr/local/man/man4
+MANFEXT        = 4
+
+# There are no system-dependant configuration options (except maybe CFLAGS).
+# Uncomment any of these that is missing from your "standard" library.
+LOCALSRCS = # localsrc/getopt.c localsrc/strtol.c \
+#              localsrc/strtok.c localsrc/strchr.c
+LOCALOBJS = # localsrc/getopt.o localsrc/strtol.o \
+#              localsrc/strtok.o localsrc/strchr.o
+# These are not compiled in unless you use -Ilocalinc, but
+# are not commented out as "make dist" &c use them.
+LOCALINC = # localinc/*.h localinc/sys/*.h
+
+SRCS = file.c apprentice.c fsmagic.c softmagic.c ascmagic.c \
+       compress.c is_tar.c readelf.c internat.c \
+       print.c $(LOCALSRCS) $(LOCALINC)
+OBJS = file.o apprentice.o fsmagic.o softmagic.o ascmagic.o \
+       compress.o is_tar.o readelf.o internat.o \
+       print.o $(LOCALOBJS)
+HDRS = file.h names.h patchlevel.h readelf.h tar.h
+
+AUTOSRC=configure configure.in install-sh config.h.in Makefile.in
+ALLSRC = LEGAL.NOTICE README MAINT PORTING $(SRCS) $(HDRS) \
+        Makefile.std file.man magic.man magic2mime $(AUTOSRC) \
+        Localstuff Header
+ALLMAGIC =   Magdir/[a-z]*
+
+all:           file magic file.${MANCEXT} magic.${MANFEXT}
+
+TESTFILES = * tst/*
+try:           all $(OFILE)
+               cd tst; $(MAKE)
+               time $(OFILE) $(TESTFILES) >/tmp/t1 # can't use ./magic
+               time ./file -m ./magic $(TESTFILES) >/tmp/t2
+               -diff -b /tmp/t[12]
+               what ./file >lastnocore
+
+file:          $(OBJS)
+               $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $@
+lint:          $(SRCS)
+               lint -ha $(DEFS) $(SRCS) | tee $@
+magic:         Localstuff Header Magdir
+               cat Header Localstuff Magdir/[a-z] > $@
+
+ascmagic.o:    names.h
+
+compress.o apprentice.o ascmagic.o file.o fsmagic.o print.o softmagic.o: file.h
+
+install:       file magic
+               cp file $(BINDIR)/file
+               cp magic $(MAGIC)
+
+install.man: file.${MANCEXT} magic.${MANFEXT}
+               cp file.${MANCEXT} $(MANCDIR)/file.$(MANCEXT)
+               cp magic.${MANFEXT} $(MANFDIR)/magic.$(MANFEXT)
+
+clean:
+               rm -f *.o core file magic lint dist.* MANIFEST \
+                     magic.${MANFEXT} file.${MANCEXT} \
+                     config.h config.status config.cache config.log
+clobber:
+               cd tst; $(MAKE) clean
+
+
+magic.${MANFEXT} :     Makefile magic.man
+               @rm -f $@
+               sed -e s@__CSECTION__@${MANCEXT}@g \
+                   -e s@__FSECTION__@${MANFEXT}@g \
+                   -e s@__VERSION__@${VERSION}@g \
+                   -e s@__MAGIC__@${MAGIC}@g magic.man > $@
+
+file.${MANCEXT} :      Makefile file.man
+               @rm -f $@
+               sed -e s@__CSECTION__@${MANCEXT}@g \
+                   -e s@__FSECTION__@${MANFEXT}@g \
+                   -e s@__VERSION__@${VERSION}@g \
+                   -e s@__MAGIC__@${MAGIC}@g file.man > $@
+
+send:          dist
+               ftp ftp.cs
+
+dist:          dist.src dist.magic
+               @echo Now check this patchlevel!
+               ident patchlevel.h
+
+dist.src:      $(ALLSRC) MANIFEST
+#              Some versions of shar can't handle a single file from
+#              a subdirectory, so we manually insert mkdir as needed.
+#              The point is to exclude all the generable targets in tst.
+               (echo mkdir localinc localinc/sys localsrc tst; \
+                       $(SHAR) $(ALLSRC) MANIFEST) > $@
+
+rcsdiff:       $(ALLSRC)
+               rcsdiff -q RCS/*
+
+MANIFEST:      $(ALLSRC)
+               ident $(ALLSRC) > MANIFEST
+dist.magic:    Magdir
+#              As above, but to exclude Magdir/RCS from being shipped.
+               (echo mkdir Magdir; $(SHAR) $(ALLMAGIC)) >$@
+
+tar:           $(ALLSRC) $(ALLMAGIC)
+               -rm -fr file-${VERSION}
+               -mkdir file-${VERSION} file-${VERSION}/Magdir
+               ln $(ALLSRC) file-${VERSION}
+               ln ${ALLMAGIC} file-${VERSION}/Magdir
+               tar cvf file-${VERSION}.tar file-${VERSION}
+               -rm -fr file-${VERSION}
diff --git a/file/README b/file/README
new file mode 100644 (file)
index 0000000..664dae3
--- /dev/null
@@ -0,0 +1,98 @@
+** README for file(1) Command **
+@(#) Id: README,v 1.25 2001/07/23 21:30:22 christos Exp 
+
+This is Release 3.x of Ian Darwin's (copyright but distributable)
+file(1) command. This version is the standard "file" command for Linux,
+*BSD, and other systems. (See "patchlevel.h" for the exact release number).
+
+UNIX is a trademark of UNIX System Laboratories.
+
+The prime contributor to Release 3.8 was Guy Harris, who put in megachanges
+including byte-order independance.
+
+The prime contributor to Release 3.0 was Christos Zoulas, who put
+in hundreds of lines of source code changes, including his own
+ANSIfication of the code (I liked my own ANSIfication better, but
+his (__P()) is the "Berkeley standard" way of doing it, and I wanted UCB
+to include the code...), his HP-like "indirection" (a feature of
+the HP file command, I think), and his mods that finally got the
+uncompress (-z) mode finished and working.
+
+This release has compiled in numerous environments; see PORTING
+for a list and problems.
+
+This fine freeware file(1) follows the USG (System V) model of the file
+command, rather than the Research (V7) version or the V7-derived 4.[23]
+Berkeley one. That is, the file /etc/magic contains much of the ritual
+information that is the source of this program's power. My version
+knows a little more magic (including tar archives) than System V; the
+/etc/magic parsing seems to be compatible with the (poorly documented)
+System V /etc/magic format (with one exception; see the man page).
+
+In addition, the /etc/magic file is built from a subdirectory
+for easier(?) maintenance.  I will act as a clearinghouse for
+magic numbers assigned to all sorts of data files that
+are in reasonable circulation. Send your magic numbers,
+in magic(4) format please, to the maintainer, Christos Zoulas.
+
+LEGAL.NOTICE - read this first.
+README - read this second (you are currently reading this file).
+PORTING - read this only if the program won't compile.
+Makefile - read this next, adapt it as needed (particularly
+       the location of the old existing file command and
+       the man page layouts), type "make" to compile, 
+       "make try" to try it out against your old version.
+       Expect some diffs, particularly since your original
+       file(1) may not grok the imbedded-space ("\ ") in
+       the current magic file, or may even not use the
+       magic file.
+apprentice.c - parses /etc/magic to learn magic
+ascmagic.c - third & last set of tests, based on hardwired assumptions.
+core - not included in distribution due to mailer limitations.
+debug.c - includes -c printout routine
+file.1 - man page for the command
+magic.4 - man page for the magic file, courtesy Guy Harris.
+       Install as magic.4 on USG and magic.5 on V7 or Berkeley; cf Makefile.
+file.c - main program
+file.h - header file
+fsmagic.c - first set of tests the program runs, based on filesystem info
+is_tar.c, tar.h - knows about tarchives (courtesy John Gilmore).
+magdir - directory of /etc/magic pieces
+       magdir/Makefile - ADJUST THIS FOR YOUR CONFIGURATION
+names.h - header file for ascmagic.c
+softmagic.c - 2nd set of tests, based on /etc/magic
+readelf.[ch] - Standalone elf parsing code.
+compress.c - on-the-fly decompression.
+internat.c - recognize international `text' files.
+print.c - print results, errors, warnings.
+
+If your gzip sometimes fails to decompress things complaining about a short
+file, apply this patch [which is going to be in the next version of gzip]:
+*** -   Tue Oct 29 02:06:35 1996
+--- util.c      Sun Jul 21 21:51:38 1996
+*** 106,111 ****
+--- 108,114 ----
+  
+      if (insize == 0) {
+        if (eof_ok) return EOF;
++       flush_window();
+        read_error();
+      }
+      bytes_in += (ulg)insize;
+
+E-mail: christos@astron.com
+
+Phone: Do not even think of telephoning me about this program. Send cash first!
+
+Parts of this software were developed at SoftQuad Inc., 56 Aberfoyle
+Cres, # 810, Toronto, Ontario CANADA M8X 2W4.  Phone: 416-239-4801 or
+800-387-2777. Email: mail@sq.com.  Call for information on SGML editing
+and browsing, Unix text processing, and customised products on Unix,
+DOS and Mac.
+
+From: Kees Zeelenberg
+
+An MS-Windows (Win32) port of File-3.36 is available from
+http://gnuwin32.sourceforge.net/
+File is an implementation of the Unix File(1) command.
+It knows the 'magic number' of several thousands of file types.
diff --git a/file/acconfig.h b/file/acconfig.h
new file mode 100644 (file)
index 0000000..b2d201d
--- /dev/null
@@ -0,0 +1,48 @@
+/* Autoheader needs me */
+#undef PACKAGE
+
+/* Autoheader needs me */
+#undef VERSION
+
+/* Define if builtin ELF support is enabled.  */
+#undef BUILTIN_ELF
+
+/* Define if ELF core file support is enabled.  */
+#undef ELFCORE
+
+/* Define if the `long long' type works.  */
+#undef HAVE_LONG_LONG
+
+/* Define if we have "tm_isdst" in "struct tm".  */
+#undef HAVE_TM_ISDST
+
+/* Define if we have a global "int" variable "daylight".  */
+#undef HAVE_DAYLIGHT
+
+/* Define to `unsigned char' if standard headers don't define.  */
+#undef uint8_t
+
+/* Define to `unsigned short' if standard headers don't define.  */
+#undef uint16_t
+
+/* Define to `unsigned int' if standard headers don't define.  */
+#undef uint32_t
+
+/* Define to `unsigned long long', if available, or `unsigned long', if
+   standard headers don't define.  */
+#undef uint64_t
+
+/* FIXME: These have to be added manually because autoheader doesn't know
+   about AC_CHECK_SIZEOF_INCLUDES.  */
+
+/* The number of bytes in a uint8_t.  */
+#define SIZEOF_UINT8_T 0
+
+/* The number of bytes in a uint16_t.  */
+#define SIZEOF_UINT16_T 0
+
+/* The number of bytes in a uint32_t.  */
+#define SIZEOF_UINT32_T 0
+
+/* The number of bytes in a uint64_t.  */
+#define SIZEOF_UINT64_T 0
diff --git a/file/acinclude.m4 b/file/acinclude.m4
new file mode 100644 (file)
index 0000000..95990e5
--- /dev/null
@@ -0,0 +1,124 @@
+dnl cloned from autoconf 2.13 acspecific.m4
+AC_DEFUN(AC_C_LONG_LONG,
+[AC_CACHE_CHECK(for long long, ac_cv_c_long_long,
+[if test "$GCC" = yes; then
+  ac_cv_c_long_long=yes
+else
+AC_TRY_RUN([int main() {
+long long foo = 0;
+exit(sizeof(long long) < sizeof(long)); }],
+ac_cv_c_long_long=yes, ac_cv_c_long_long=no)
+fi])
+if test $ac_cv_c_long_long = yes; then
+  AC_DEFINE(HAVE_LONG_LONG)
+fi
+])
+
+dnl from autoconf 2.13 acgeneral.m4, with patch:
+dnl Date: Fri, 15 Jan 1999 05:52:41 -0800
+dnl Message-ID: <199901151352.FAA18237@shade.twinsun.com>
+dnl From: eggert@twinsun.com (Paul Eggert)
+dnl Subject: autoconf 2.13 AC_CHECK_TYPE doesn't allow shell vars
+dnl Newsgroups: gnu.utils.bug
+
+dnl from autoconf 2.13 acspecific.m4, with changes to check for daylight
+
+AC_DEFUN(AC_STRUCT_TIMEZONE_DAYLIGHT,
+[AC_REQUIRE([AC_STRUCT_TM])dnl
+AC_CACHE_CHECK([for tm_zone in struct tm], ac_cv_struct_tm_zone,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_zone;],
+  ac_cv_struct_tm_zone=yes, ac_cv_struct_tm_zone=no)])
+if test "$ac_cv_struct_tm_zone" = yes; then
+  AC_DEFINE(HAVE_TM_ZONE)
+fi
+AC_CACHE_CHECK(for tzname, ac_cv_var_tzname,
+[AC_TRY_LINK(
+changequote(<<, >>)dnl
+<<#include <time.h>
+#ifndef tzname /* For SGI.  */
+extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
+#endif>>,
+changequote([, ])dnl
+[atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)])
+  if test $ac_cv_var_tzname = yes; then
+    AC_DEFINE(HAVE_TZNAME)
+  fi
+
+AC_CACHE_CHECK([for tm_isdst in struct tm], ac_cv_struct_tm_isdst,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_isdst;],
+  ac_cv_struct_tm_isdst=yes, ac_cv_struct_tm_isdst=no)])
+if test "$ac_cv_struct_tm_isdst" = yes; then
+  AC_DEFINE(HAVE_TM_ISDST)
+fi
+AC_CACHE_CHECK(for daylight, ac_cv_var_daylight,
+[AC_TRY_LINK(
+changequote(<<, >>)dnl
+<<#include <time.h>
+#ifndef daylight /* In case IRIX #defines this, too  */
+extern int daylight;
+#endif>>,
+changequote([, ])dnl
+[atoi(daylight);], ac_cv_var_daylight=yes, ac_cv_var_daylight=no)])
+  if test $ac_cv_var_daylight = yes; then
+    AC_DEFINE(HAVE_DAYLIGHT)
+  fi
+])
+
+dnl AC_CHECK_TYPE2(TYPE, DEFAULT)
+AC_DEFUN(AC_CHECK_TYPE2,
+[AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(ac_cv_type_$1,
+[AC_EGREP_CPP(dnl
+changequote(<<,>>)dnl
+<<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl
+changequote([,]), [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif], eval "ac_cv_type_$1=yes", eval "ac_cv_type_$1=no")])dnl
+if eval "test \"`echo '$ac_cv_type_'$1`\" = yes"; then
+  AC_MSG_RESULT(yes)
+else
+  AC_MSG_RESULT(no)
+  AC_DEFINE_UNQUOTED($1, $2)
+fi
+])
+
+dnl from autoconf 2.13 acgeneral.m4, with additional third argument
+dnl AC_CHECK_SIZEOF_INCLUDES(TYPE [, CROSS-SIZE, [INCLUDES]])
+AC_DEFUN(AC_CHECK_SIZEOF_INCLUDES,
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[AC_TRY_RUN([$3
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof($1));
+  exit(0);
+}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$2], , , AC_CV_NAME=$2))])dnl
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
+dnl AC_CHECK_SIZEOF_STDC_HEADERS(TYPE [, CROSS_SIZE])
+AC_DEFUN(AC_CHECK_SIZEOF_STDC_HEADERS,
+[AC_CHECK_SIZEOF_INCLUDES($1, $2,
+[#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif
+])
+])
diff --git a/file/aclocal.m4 b/file/aclocal.m4
new file mode 100644 (file)
index 0000000..b8a4955
--- /dev/null
@@ -0,0 +1,265 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+dnl cloned from autoconf 2.13 acspecific.m4
+AC_DEFUN(AC_C_LONG_LONG,
+[AC_CACHE_CHECK(for long long, ac_cv_c_long_long,
+[if test "$GCC" = yes; then
+  ac_cv_c_long_long=yes
+else
+AC_TRY_RUN([int main() {
+long long foo = 0;
+exit(sizeof(long long) < sizeof(long)); }],
+ac_cv_c_long_long=yes, ac_cv_c_long_long=no)
+fi])
+if test $ac_cv_c_long_long = yes; then
+  AC_DEFINE(HAVE_LONG_LONG)
+fi
+])
+
+dnl from autoconf 2.13 acgeneral.m4, with patch:
+dnl Date: Fri, 15 Jan 1999 05:52:41 -0800
+dnl Message-ID: <199901151352.FAA18237@shade.twinsun.com>
+dnl From: eggert@twinsun.com (Paul Eggert)
+dnl Subject: autoconf 2.13 AC_CHECK_TYPE doesn't allow shell vars
+dnl Newsgroups: gnu.utils.bug
+
+dnl from autoconf 2.13 acspecific.m4, with changes to check for daylight
+
+AC_DEFUN(AC_STRUCT_TIMEZONE_DAYLIGHT,
+[AC_REQUIRE([AC_STRUCT_TM])dnl
+AC_CACHE_CHECK([for tm_zone in struct tm], ac_cv_struct_tm_zone,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_zone;],
+  ac_cv_struct_tm_zone=yes, ac_cv_struct_tm_zone=no)])
+if test "$ac_cv_struct_tm_zone" = yes; then
+  AC_DEFINE(HAVE_TM_ZONE)
+fi
+AC_CACHE_CHECK(for tzname, ac_cv_var_tzname,
+[AC_TRY_LINK(
+changequote(<<, >>)dnl
+<<#include <time.h>
+#ifndef tzname /* For SGI.  */
+extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
+#endif>>,
+changequote([, ])dnl
+[atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)])
+  if test $ac_cv_var_tzname = yes; then
+    AC_DEFINE(HAVE_TZNAME)
+  fi
+
+AC_CACHE_CHECK([for tm_isdst in struct tm], ac_cv_struct_tm_isdst,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_isdst;],
+  ac_cv_struct_tm_isdst=yes, ac_cv_struct_tm_isdst=no)])
+if test "$ac_cv_struct_tm_isdst" = yes; then
+  AC_DEFINE(HAVE_TM_ISDST)
+fi
+AC_CACHE_CHECK(for daylight, ac_cv_var_daylight,
+[AC_TRY_LINK(
+changequote(<<, >>)dnl
+<<#include <time.h>
+#ifndef daylight /* In case IRIX #defines this, too  */
+extern int daylight;
+#endif>>,
+changequote([, ])dnl
+[atoi(daylight);], ac_cv_var_daylight=yes, ac_cv_var_daylight=no)])
+  if test $ac_cv_var_daylight = yes; then
+    AC_DEFINE(HAVE_DAYLIGHT)
+  fi
+])
+
+dnl AC_CHECK_TYPE2(TYPE, DEFAULT)
+AC_DEFUN(AC_CHECK_TYPE2,
+[AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(ac_cv_type_$1,
+[AC_EGREP_CPP(dnl
+changequote(<<,>>)dnl
+<<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl
+changequote([,]), [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif], eval "ac_cv_type_$1=yes", eval "ac_cv_type_$1=no")])dnl
+if eval "test \"`echo '$ac_cv_type_'$1`\" = yes"; then
+  AC_MSG_RESULT(yes)
+else
+  AC_MSG_RESULT(no)
+  AC_DEFINE_UNQUOTED($1, $2)
+fi
+])
+
+dnl from autoconf 2.13 acgeneral.m4, with additional third argument
+dnl AC_CHECK_SIZEOF_INCLUDES(TYPE [, CROSS-SIZE, [INCLUDES]])
+AC_DEFUN(AC_CHECK_SIZEOF_INCLUDES,
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[AC_TRY_RUN([$3
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof($1));
+  exit(0);
+}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$2], , , AC_CV_NAME=$2))])dnl
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
+dnl AC_CHECK_SIZEOF_STDC_HEADERS(TYPE [, CROSS_SIZE])
+AC_DEFUN(AC_CHECK_SIZEOF_STDC_HEADERS,
+[AC_CHECK_SIZEOF_INCLUDES($1, $2,
+[#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif
+])
+])
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated.  We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+  case " <<$>>CONFIG_HEADERS " in
+  *" <<$>>am_file "*<<)>>
+    echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+# Define a conditional.
+
+AC_DEFUN(AM_CONDITIONAL,
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi])
+
diff --git a/file/apprentice.c b/file/apprentice.c
new file mode 100644 (file)
index 0000000..1bb71d9
--- /dev/null
@@ -0,0 +1,1145 @@
+/*
+ * apprentice - make one pass through /etc/magic, learning its secrets.
+ *
+ * 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.
+ */
+
+#include "file.h"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef QUICK
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#endif
+
+#ifndef        lint
+FILE_RCSID("@(#)Id: apprentice.c,v 1.44 2001/08/01 14:03:19 christos Exp ")
+#endif /* lint */
+
+#define        EATAB {while (isascii((unsigned char) *l) && \
+                     isspace((unsigned char) *l))  ++l;}
+#define LOWCASE(l) (isupper((unsigned char) (l)) ? \
+                       tolower((unsigned char) (l)) : (l))
+/*
+ * Work around a bug in headers on Digital Unix.
+ * At least confirmed for: OSF1 V4.0 878
+ */
+#if defined(__osf__) && defined(__DECC)
+#ifdef MAP_FAILED
+#undef MAP_FAILED
+#endif
+#endif
+
+#ifndef MAP_FAILED
+#define MAP_FAILED (void *) -1
+#endif
+
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif
+
+#ifdef __EMX__
+  char PATHSEP=';';
+#else
+  char PATHSEP=':';
+#endif
+
+
+static int getvalue    __P((struct magic *, char **));
+static int hextoint    __P((int));
+static char *getstr    __P((char *, char *, int, int *));
+static int parse       __P((struct magic **, uint32 *, char *, int));
+static void eatsize    __P((char **));
+static int apprentice_1        __P((const char *, int));
+static int apprentice_file     __P((struct magic **, uint32 *,
+    const char *, int));
+static void byteswap   __P((struct magic *, uint32));
+static void bs1                __P((struct magic *));
+static uint16 swap2    __P((uint16));
+static uint32 swap4    __P((uint32));
+static char *mkdbname  __P((const char *));
+static int apprentice_map      __P((struct magic **, uint32 *,
+    const char *, int));
+static int apprentice_compile  __P((struct magic **, uint32 *,
+    const char *, int));
+
+static int maxmagic = 0;
+
+struct mlist mlist;
+
+#ifdef COMPILE_ONLY
+const char *magicfile;
+char *progname;
+int lineno;
+
+int main __P((int, char *[]));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int ret;
+
+       if ((progname = strrchr(argv[0], '/')) != NULL)
+               progname++;
+       else
+               progname = argv[0];
+
+       if (argc != 2) {
+               (void)fprintf(stderr, "usage: %s file\n", progname);
+               exit(1);
+       }
+       magicfile = argv[1];
+
+       exit(apprentice(magicfile, COMPILE));
+}
+#endif /* COMPILE_ONLY */
+
+
+/*
+ * Handle one file.
+ */
+static int
+apprentice_1(fn, action)
+       const char *fn;
+       int action;
+{
+       struct magic *magic = NULL;
+       uint32 nmagic = 0;
+       struct mlist *ml;
+       int rv = -1;
+
+       if (action == COMPILE) {
+               rv = apprentice_file(&magic, &nmagic, fn, action);
+               if (rv == 0)
+                       return apprentice_compile(&magic, &nmagic, fn, action);
+               else
+                       return rv;
+       }
+#ifndef COMPILE_ONLY
+       if ((rv = apprentice_map(&magic, &nmagic, fn, action)) != 0)
+               (void)fprintf(stderr, "%s: Using regular magic file `%s'\n",
+                   progname, fn);
+               
+       if (rv != 0)
+               rv = apprentice_file(&magic, &nmagic, fn, action);
+
+       if (rv != 0)
+               return rv;
+            
+       if ((ml = malloc(sizeof(*ml))) == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory (%s).\n", progname,
+                   strerror(errno));
+               if (action == CHECK)
+                       return -1;
+       }
+
+       if (magic == NULL || nmagic == 0)
+               return rv;
+
+       ml->magic = magic;
+       ml->nmagic = nmagic;
+
+       mlist.prev->next = ml;
+       ml->prev = mlist.prev;
+       ml->next = &mlist;
+       mlist.prev = ml;
+
+       return rv;
+#endif /* COMPILE_ONLY */
+}
+
+
+int
+apprentice(fn, action)
+       const char *fn;                 /* list of magic files */
+       int action;
+{
+       char *p, *mfn;
+       int file_err, errs = -1;
+
+       mlist.next = mlist.prev = &mlist;
+       mfn = malloc(strlen(fn)+1);
+       if (mfn == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory (%s).\n", progname,
+                   strerror(errno));
+               if (action == CHECK)
+                       return -1;
+               else
+                       exit(1);
+       }
+       fn = strcpy(mfn, fn);
+  
+       while (fn) {
+               p = strchr(fn, PATHSEP);
+               if (p)
+                       *p++ = '\0';
+               file_err = apprentice_1(fn, action);
+               if (file_err > errs)
+                       errs = file_err;
+               fn = p;
+       }
+       if (errs == -1)
+               (void) fprintf(stderr, "%s: couldn't find any magic files!\n",
+                   progname);
+       if (action == CHECK && errs)
+               exit(1);
+
+       free(mfn);
+       return errs;
+}
+
+/*
+ * parse from a file
+ */
+static int
+apprentice_file(magicp, nmagicp, fn, action)
+       struct magic **magicp;
+       uint32 *nmagicp;
+       const char *fn;                 /* name of magic file */
+       int action;
+{
+       static const char hdr[] =
+               "cont\toffset\ttype\topcode\tmask\tvalue\tdesc";
+       FILE *f;
+       char line[BUFSIZ+1];
+       int errs = 0;
+
+       f = fopen(fn, "r");
+       if (f == NULL) {
+               if (errno != ENOENT)
+                       (void) fprintf(stderr,
+                           "%s: can't read magic file %s (%s)\n", 
+                           progname, fn, strerror(errno));
+               return -1;
+       }
+
+        maxmagic = MAXMAGIS;
+       *magicp = (struct magic *) calloc(sizeof(struct magic), maxmagic);
+       if (*magicp == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory (%s).\n", progname,
+                   strerror(errno));
+               if (action == CHECK)
+                       return -1;
+       }
+
+       /* parse it */
+       if (action == CHECK)    /* print silly verbose header for USG compat. */
+               (void) printf("%s\n", hdr);
+
+       for (lineno = 1;fgets(line, BUFSIZ, f) != NULL; lineno++) {
+               if (line[0]=='#')       /* comment, do not parse */
+                       continue;
+               if (strlen(line) <= (unsigned)1) /* null line, garbage, etc */
+                       continue;
+               line[strlen(line)-1] = '\0'; /* delete newline */
+               if (parse(magicp, nmagicp, line, action) != 0)
+                       errs = 1;
+       }
+
+       (void) fclose(f);
+       if (errs) {
+               free(*magicp);
+               *magicp = NULL;
+               *nmagicp = 0;
+       }
+       return errs;
+}
+
+/*
+ * extend the sign bit if the comparison is to be signed
+ */
+uint32
+signextend(m, v)
+       struct magic *m;
+       uint32 v;
+{
+       if (!(m->flag & UNSIGNED))
+               switch(m->type) {
+               /*
+                * Do not remove the casts below.  They are
+                * vital.  When later compared with the data,
+                * the sign extension must have happened.
+                */
+               case BYTE:
+                       v = (char) v;
+                       break;
+               case SHORT:
+               case BESHORT:
+               case LESHORT:
+                       v = (short) v;
+                       break;
+               case DATE:
+               case BEDATE:
+               case LEDATE:
+               case LDATE:
+               case BELDATE:
+               case LELDATE:
+               case LONG:
+               case BELONG:
+               case LELONG:
+                       v = (int32) v;
+                       break;
+               case STRING:
+               case PSTRING:
+                       break;
+               default:
+                       magwarn("can't happen: m->type=%d\n",
+                               m->type);
+                       return -1;
+               }
+       return v;
+}
+
+/*
+ * parse one line from magic file, put into magic[index++] if valid
+ */
+static int
+parse(magicp, nmagicp, l, action)
+       struct magic **magicp;
+       uint32 *nmagicp;
+       char *l;
+       int action;
+{
+       int i = 0;
+       struct magic *m;
+       char *t;
+
+#define ALLOC_INCR     200
+       if (*nmagicp + 1 >= maxmagic){
+               maxmagic += ALLOC_INCR;
+               if ((m = (struct magic *) realloc(*magicp,
+                   sizeof(struct magic) * maxmagic)) == NULL) {
+                       (void) fprintf(stderr, "%s: Out of memory (%s).\n",
+                           progname, strerror(errno));
+                       if (*magicp)
+                               free(*magicp);
+                       if (action == CHECK)
+                               return -1;
+                       else
+                               exit(1);
+               }
+               *magicp = m;
+               memset(&(*magicp)[*nmagicp], 0, sizeof(struct magic)
+                   * ALLOC_INCR);
+       }
+       m = &(*magicp)[*nmagicp];
+       m->flag = 0;
+       m->cont_level = 0;
+
+       while (*l == '>') {
+               ++l;            /* step over */
+               m->cont_level++; 
+       }
+
+       if (m->cont_level != 0 && *l == '(') {
+               ++l;            /* step over */
+               m->flag |= INDIR;
+       }
+       if (m->cont_level != 0 && *l == '&') {
+                ++l;            /* step over */
+                m->flag |= OFFADD;
+        }
+
+       /* get offset, then skip over it */
+       m->offset = (int) strtoul(l,&t,0);
+        if (l == t)
+               magwarn("offset %s invalid", l);
+        l = t;
+
+       if (m->flag & INDIR) {
+               m->in_type = LONG;
+               m->in_offset = 0;
+               /*
+                * read [.lbs][+-]nnnnn)
+                */
+               if (*l == '.') {
+                       l++;
+                       switch (*l) {
+                       case 'l':
+                               m->in_type = LELONG;
+                               break;
+                       case 'L':
+                               m->in_type = BELONG;
+                               break;
+                       case 'h':
+                       case 's':
+                               m->in_type = LESHORT;
+                               break;
+                       case 'H':
+                       case 'S':
+                               m->in_type = BESHORT;
+                               break;
+                       case 'c':
+                       case 'b':
+                       case 'C':
+                       case 'B':
+                               m->in_type = BYTE;
+                               break;
+                       default:
+                               magwarn("indirect offset type %c invalid", *l);
+                               break;
+                       }
+                       l++;
+               }
+               if (*l == '~') {
+                       m->in_op = OPINVERSE;
+                       l++;
+               }
+               switch (*l) {
+               case '&':
+                       m->in_op |= OPAND;
+                       l++;
+                       break;
+               case '|':
+                       m->in_op |= OPOR;
+                       l++;
+                       break;
+               case '^':
+                       m->in_op |= OPXOR;
+                       l++;
+                       break;
+               case '+':
+                       m->in_op |= OPADD;
+                       l++;
+                       break;
+               case '-':
+                       m->in_op |= OPMINUS;
+                       l++;
+                       break;
+               case '*':
+                       m->in_op |= OPMULTIPLY;
+                       l++;
+                       break;
+               case '/':
+                       m->in_op |= OPDIVIDE;
+                       l++;
+                       break;
+               case '%':
+                       m->in_op |= OPMODULO;
+                       l++;
+                       break;
+               }
+               if (isdigit((unsigned char)*l)) 
+                       m->in_offset = strtoul(l, &t, 0);
+               else
+                       t = l;
+               if (*t++ != ')') 
+                       magwarn("missing ')' in indirect offset");
+               l = t;
+       }
+
+
+       while (isascii((unsigned char)*l) && isdigit((unsigned char)*l))
+               ++l;
+       EATAB;
+
+#define NBYTE          4
+#define NSHORT         5
+#define NLONG          4
+#define NSTRING        6
+#define NDATE          4
+#define NBESHORT       7
+#define NBELONG                6
+#define NBEDATE                6
+#define NLESHORT       7
+#define NLELONG                6
+#define NLEDATE                6
+#define NPSTRING       7
+#define NLDATE         5
+#define NBELDATE       7
+#define NLELDATE       7
+
+       if (*l == 'u') {
+               ++l;
+               m->flag |= UNSIGNED;
+       }
+
+       /* get type, skip it */
+       if (strncmp(l, "char", NBYTE)==0) {     /* HP/UX compat */
+               m->type = BYTE;
+               l += NBYTE;
+       } else if (strncmp(l, "byte", NBYTE)==0) {
+               m->type = BYTE;
+               l += NBYTE;
+       } else if (strncmp(l, "short", NSHORT)==0) {
+               m->type = SHORT;
+               l += NSHORT;
+       } else if (strncmp(l, "long", NLONG)==0) {
+               m->type = LONG;
+               l += NLONG;
+       } else if (strncmp(l, "string", NSTRING)==0) {
+               m->type = STRING;
+               l += NSTRING;
+       } else if (strncmp(l, "date", NDATE)==0) {
+               m->type = DATE;
+               l += NDATE;
+       } else if (strncmp(l, "beshort", NBESHORT)==0) {
+               m->type = BESHORT;
+               l += NBESHORT;
+       } else if (strncmp(l, "belong", NBELONG)==0) {
+               m->type = BELONG;
+               l += NBELONG;
+       } else if (strncmp(l, "bedate", NBEDATE)==0) {
+               m->type = BEDATE;
+               l += NBEDATE;
+       } else if (strncmp(l, "leshort", NLESHORT)==0) {
+               m->type = LESHORT;
+               l += NLESHORT;
+       } else if (strncmp(l, "lelong", NLELONG)==0) {
+               m->type = LELONG;
+               l += NLELONG;
+       } else if (strncmp(l, "ledate", NLEDATE)==0) {
+               m->type = LEDATE;
+               l += NLEDATE;
+       } else if (strncmp(l, "pstring", NPSTRING)==0) {
+               m->type = PSTRING;
+               l += NPSTRING;
+       } else if (strncmp(l, "ldate", NLDATE)==0) {
+               m->type = LDATE;
+               l += NLDATE;
+       } else if (strncmp(l, "beldate", NBELDATE)==0) {
+               m->type = BELDATE;
+               l += NBELDATE;
+       } else if (strncmp(l, "leldate", NLELDATE)==0) {
+               m->type = LELDATE;
+               l += NLELDATE;
+       } else {
+               magwarn("type %s invalid", l);
+               return -1;
+       }
+       /* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */
+       /* New and improved: ~ & | ^ + - * / % -- exciting, isn't it? */
+       if (*l == '~') {
+               if (STRING != m->type && PSTRING != m->type)
+                       m->mask_op = OPINVERSE;
+               ++l;
+       }
+       switch (*l) {
+       case '&':
+               m->mask_op |= OPAND;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '|':
+               m->mask_op |= OPOR;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '^':
+               m->mask_op |= OPXOR;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '+':
+               m->mask_op |= OPADD;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '-':
+               m->mask_op |= OPMINUS;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '*':
+               m->mask_op |= OPMULTIPLY;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '%':
+               m->mask_op |= OPMODULO;
+               ++l;
+               m->mask = signextend(m, strtoul(l, &l, 0));
+               eatsize(&l);
+               break;
+       case '/':
+               if (STRING != m->type && PSTRING != m->type) {
+                       m->mask_op |= OPDIVIDE;
+                       ++l;
+                       m->mask = signextend(m, strtoul(l, &l, 0));
+                       eatsize(&l);
+               } else {
+                       m->mask = 0L;
+                       while (!isspace(*++l)) {
+                               switch (*l) {
+                               case CHAR_IGNORE_LOWERCASE:
+                                       m->mask |= STRING_IGNORE_LOWERCASE;
+                                       break;
+                               case CHAR_COMPACT_BLANK:
+                                       m->mask |= STRING_COMPACT_BLANK;
+                                       break;
+                               case CHAR_COMPACT_OPTIONAL_BLANK:
+                                       m->mask |=
+                                           STRING_COMPACT_OPTIONAL_BLANK;
+                                       break;
+                               default:
+                                       magwarn("string extension %c invalid",
+                                           *l);
+                                       return -1;
+                               }
+                       }
+               }
+               break;
+       }
+       /* We used to set mask to all 1's here, instead let's just not do anything 
+          if mask = 0 (unless you have a better idea) */
+       EATAB;
+  
+       switch (*l) {
+       case '>':
+       case '<':
+       /* Old-style anding: "0 byte &0x80 dynamically linked" */
+       case '&':
+       case '^':
+       case '=':
+               m->reln = *l;
+               ++l;
+               if (*l == '=') {
+                  /* HP compat: ignore &= etc. */
+                  ++l;
+               }
+               break;
+       case '!':
+               if (m->type != STRING && m->type != PSTRING) {
+                       m->reln = *l;
+                       ++l;
+                       break;
+               }
+               /* FALL THROUGH */
+       default:
+               if (*l == 'x' && isascii((unsigned char)l[1]) && 
+                   isspace((unsigned char)l[1])) {
+                       m->reln = *l;
+                       ++l;
+                       goto GetDesc;   /* Bill The Cat */
+               }
+               m->reln = '=';
+               break;
+       }
+       EATAB;
+  
+       if (getvalue(m, &l))
+               return -1;
+       /*
+        * TODO finish this macro and start using it!
+        * #define offsetcheck {if (offset > HOWMANY-1) 
+        *      magwarn("offset too big"); }
+        */
+
+       /*
+        * now get last part - the description
+        */
+GetDesc:
+       EATAB;
+       if (l[0] == '\b') {
+               ++l;
+               m->nospflag = 1;
+       } else if ((l[0] == '\\') && (l[1] == 'b')) {
+               ++l;
+               ++l;
+               m->nospflag = 1;
+       } else
+               m->nospflag = 0;
+       while ((m->desc[i++] = *l++) != '\0' && i<MAXDESC)
+               /* NULLBODY */;
+
+       if (action == CHECK) {
+               mdump(m);
+       }
+       ++(*nmagicp);           /* make room for next */
+       return 0;
+}
+
+/* 
+ * Read a numeric value from a pointer, into the value union of a magic 
+ * pointer, according to the magic type.  Update the string pointer to point 
+ * just after the number read.  Return 0 for success, non-zero for failure.
+ */
+static int
+getvalue(m, p)
+       struct magic *m;
+       char **p;
+{
+       int slen;
+
+       if (m->type == STRING || m->type == PSTRING) {
+               *p = getstr(*p, m->value.s, sizeof(m->value.s), &slen);
+               m->vallen = slen;
+       } else
+               if (m->reln != 'x') {
+                       m->value.l = signextend(m, strtoul(*p, p, 0));
+                       eatsize(p);
+               }
+       return 0;
+}
+
+/*
+ * Convert a string containing C character escapes.  Stop at an unescaped
+ * space or tab.
+ * Copy the converted version to "p", returning its length in *slen.
+ * Return updated scan pointer as function result.
+ */
+static char *
+getstr(s, p, plen, slen)
+       char    *s;
+       char    *p;
+       int     plen, *slen;
+{
+       char    *origs = s, *origp = p;
+       char    *pmax = p + plen - 1;
+       int     c;
+       int     val;
+
+       while ((c = *s++) != '\0') {
+               if (isspace((unsigned char) c))
+                       break;
+               if (p >= pmax) {
+                       fprintf(stderr, "String too long: %s\n", origs);
+                       break;
+               }
+               if(c == '\\') {
+                       switch(c = *s++) {
+
+                       case '\0':
+                               goto out;
+
+                       default:
+                               *p++ = (char) c;
+                               break;
+
+                       case 'n':
+                               *p++ = '\n';
+                               break;
+
+                       case 'r':
+                               *p++ = '\r';
+                               break;
+
+                       case 'b':
+                               *p++ = '\b';
+                               break;
+
+                       case 't':
+                               *p++ = '\t';
+                               break;
+
+                       case 'f':
+                               *p++ = '\f';
+                               break;
+
+                       case 'v':
+                               *p++ = '\v';
+                               break;
+
+                       /* \ and up to 3 octal digits */
+                       case '0':
+                       case '1':
+                       case '2':
+                       case '3':
+                       case '4':
+                       case '5':
+                       case '6':
+                       case '7':
+                               val = c - '0';
+                               c = *s++;  /* try for 2 */
+                               if(c >= '0' && c <= '7') {
+                                       val = (val<<3) | (c - '0');
+                                       c = *s++;  /* try for 3 */
+                                       if(c >= '0' && c <= '7')
+                                               val = (val<<3) | (c-'0');
+                                       else
+                                               --s;
+                               }
+                               else
+                                       --s;
+                               *p++ = (char)val;
+                               break;
+
+                       /* \x and up to 2 hex digits */
+                       case 'x':
+                               val = 'x';      /* Default if no digits */
+                               c = hextoint(*s++);     /* Get next char */
+                               if (c >= 0) {
+                                       val = c;
+                                       c = hextoint(*s++);
+                                       if (c >= 0)
+                                               val = (val << 4) + c;
+                                       else
+                                               --s;
+                               } else
+                                       --s;
+                               *p++ = (char)val;
+                               break;
+                       }
+               } else
+                       *p++ = (char)c;
+       }
+out:
+       *p = '\0';
+       *slen = p - origp;
+       return s;
+}
+
+
+/* Single hex char to int; -1 if not a hex char. */
+static int
+hextoint(c)
+       int c;
+{
+       if (!isascii((unsigned char) c))
+               return -1;
+       if (isdigit((unsigned char) c))
+               return c - '0';
+       if ((c >= 'a')&&(c <= 'f'))
+               return c + 10 - 'a';
+       if (( c>= 'A')&&(c <= 'F'))
+               return c + 10 - 'A';
+       return -1;
+}
+
+
+/*
+ * Print a string containing C character escapes.
+ */
+void
+showstr(fp, s, len)
+       FILE *fp;
+       const char *s;
+       int len;
+{
+       char    c;
+
+       for (;;) {
+               c = *s++;
+               if (len == -1) {
+                       if (c == '\0')
+                               break;
+               }
+               else  {
+                       if (len-- == 0)
+                               break;
+               }
+               if(c >= 040 && c <= 0176)       /* TODO isprint && !iscntrl */
+                       (void) fputc(c, fp);
+               else {
+                       (void) fputc('\\', fp);
+                       switch (c) {
+                       
+                       case '\n':
+                               (void) fputc('n', fp);
+                               break;
+
+                       case '\r':
+                               (void) fputc('r', fp);
+                               break;
+
+                       case '\b':
+                               (void) fputc('b', fp);
+                               break;
+
+                       case '\t':
+                               (void) fputc('t', fp);
+                               break;
+
+                       case '\f':
+                               (void) fputc('f', fp);
+                               break;
+
+                       case '\v':
+                               (void) fputc('v', fp);
+                               break;
+
+                       default:
+                               (void) fprintf(fp, "%.3o", c & 0377);
+                               break;
+                       }
+               }
+       }
+}
+
+/*
+ * eatsize(): Eat the size spec from a number [eg. 10UL]
+ */
+static void
+eatsize(p)
+       char **p;
+{
+       char *l = *p;
+
+       if (LOWCASE(*l) == 'u') 
+               l++;
+
+       switch (LOWCASE(*l)) {
+       case 'l':    /* long */
+       case 's':    /* short */
+       case 'h':    /* short */
+       case 'b':    /* char/byte */
+       case 'c':    /* char/byte */
+               l++;
+               /*FALLTHROUGH*/
+       default:
+               break;
+       }
+
+       *p = l;
+}
+
+/*
+ * handle an mmaped file.
+ */
+static int
+apprentice_map(magicp, nmagicp, fn, action)
+       struct magic **magicp;
+       uint32 *nmagicp;
+       const char *fn;
+       int action;
+{
+       int fd;
+       struct stat st;
+       uint32 *ptr;
+       uint32 version;
+       int needsbyteswap;
+       char *dbname = mkdbname(fn);
+
+       if (dbname == NULL)
+               return -1;
+
+       if ((fd = open(dbname, O_RDONLY)) == -1)
+               return -1;
+
+       if (fstat(fd, &st) == -1) {
+               (void)fprintf(stderr, "%s: Cannot stat `%s' (%s)\n",
+                   progname, dbname, strerror(errno));
+               goto error;
+       }
+
+#ifdef QUICK
+       if ((*magicp = mmap(0, (size_t)st.st_size, PROT_READ|PROT_WRITE,
+           MAP_PRIVATE|MAP_FILE, fd, (off_t)0)) == MAP_FAILED) {
+               (void)fprintf(stderr, "%s: Cannot map `%s' (%s)\n",
+                   progname, dbname, strerror(errno));
+               goto error;
+       }
+#else
+       if ((*magicp = malloc((size_t)st.st_size)) == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory (%s).\n", progname,
+                    strerror(errno));
+               goto error;
+       }
+       if (read(fd, *magicp, (size_t)st.st_size) != (size_t)st.st_size) {
+               (void) fprintf(stderr, "%s: Read failed (%s).\n", progname,
+                   strerror(errno));
+               goto error;
+       }
+#endif
+       (void)close(fd);
+       fd = -1;
+       ptr = (uint32 *) *magicp;
+       if (*ptr != MAGICNO) {
+               if (swap4(*ptr) != MAGICNO) {
+                       (void)fprintf(stderr, "%s: Bad magic in `%s'\n",
+                           progname, dbname);
+                       goto error;
+               }
+               needsbyteswap = 1;
+       } else
+               needsbyteswap = 0;
+       if (needsbyteswap)
+               version = swap4(ptr[1]);
+       else
+               version = ptr[1];
+       if (version != VERSIONNO) {
+               (void)fprintf(stderr, 
+                   "%s: version mismatch (%d != %d) in `%s'\n",
+                   progname, version, VERSIONNO, dbname);
+               goto error;
+       }
+       *nmagicp = (st.st_size / sizeof(struct magic)) - 1;
+       (*magicp)++;
+       if (needsbyteswap)
+               byteswap(*magicp, *nmagicp);
+       return 0;
+
+error:
+       if (fd != -1)
+               (void)close(fd);
+       if (*magicp) {
+#ifdef QUICK
+               (void)munmap(*magicp, (size_t)st.st_size);
+#else
+               free(*magicp);
+#endif
+       } else {
+               *magicp = NULL;
+               *nmagicp = 0;
+       }
+       return -1;
+}
+
+/*
+ * handle an mmaped file.
+ */
+static int
+apprentice_compile(magicp, nmagicp, fn, action)
+       struct magic **magicp;
+       uint32 *nmagicp;
+       const char *fn;
+       int action;
+{
+       int fd;
+       char *dbname = mkdbname(fn);
+       static const uint32 ar[] = {
+           MAGICNO, VERSIONNO
+       };
+
+       if (dbname == NULL) 
+               return -1;
+
+       if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
+               (void)fprintf(stderr, "%s: Cannot open `%s' (%s)\n",
+                   progname, dbname, strerror(errno));
+               return -1;
+       }
+
+       if (write(fd, ar, sizeof(ar)) != sizeof(ar)) {
+               (void)fprintf(stderr, "%s: error writing `%s' (%s)\n",
+                   progname, dbname, strerror(errno));
+               return -1;
+       }
+
+       if (lseek(fd, sizeof(struct magic), SEEK_SET) != sizeof(struct magic)) {
+               (void)fprintf(stderr, "%s: error seeking `%s' (%s)\n",
+                   progname, dbname, strerror(errno));
+               return -1;
+       }
+
+       if (write(fd, *magicp,  sizeof(struct magic) * *nmagicp) 
+           != sizeof(struct magic) * *nmagicp) {
+               (void)fprintf(stderr, "%s: error writing `%s' (%s)\n",
+                   progname, dbname, strerror(errno));
+               return -1;
+       }
+
+       (void)close(fd);
+       return 0;
+}
+
+/*
+ * make a dbname
+ */
+char *
+mkdbname(fn)
+       const char *fn;
+{
+       static const char ext[] = ".mgc";
+       static char *buf = NULL;
+       size_t len = strlen(fn) + sizeof(ext) + 1;
+       if (buf == NULL)
+               buf = malloc(len);
+       else
+               buf = realloc(buf, len);
+       if (buf == NULL) {
+               (void) fprintf(stderr, "%s: Out of memory (%s).\n", progname,
+                   strerror(errno));
+               return NULL;
+       }
+       (void)strcpy(buf, fn);
+       (void)strcat(buf, ext);
+       return buf;
+}
+
+/*
+ * Byteswap an mmap'ed file if needed
+ */
+static void
+byteswap(magic, nmagic)
+       struct magic *magic;
+       uint32 nmagic;
+{
+       uint32 i;
+       for (i = 0; i < nmagic; i++)
+               bs1(&magic[i]);
+}
+
+/*
+ * swap a short
+ */
+static uint16
+swap2(sv) 
+       uint16 sv;
+{
+       uint16 rv;
+       uint8 *s = (uint8 *) &sv; 
+       uint8 *d = (uint8 *) &rv; 
+       d[0] = s[1];
+       d[1] = s[0];
+       return rv;
+}
+
+/*
+ * swap an int
+ */
+static uint32
+swap4(sv) 
+       uint32 sv;
+{
+       uint32 rv;
+       uint8 *s = (uint8 *) &sv; 
+       uint8 *d = (uint8 *) &rv; 
+       d[0] = s[3];
+       d[1] = s[2];
+       d[2] = s[1];
+       d[3] = s[0];
+       return rv;
+}
+
+/*
+ * byteswap a single magic entry
+ */
+static
+void bs1(m)
+       struct magic *m;
+{
+       m->cont_level = swap2(m->cont_level);
+       m->offset = swap4(m->offset);
+       m->in_offset = swap4(m->in_offset);
+       if (m->type != STRING)
+               m->value.l = swap4(m->value.l);
+       m->mask = swap4(m->mask);
+}
diff --git a/file/ascmagic.c b/file/ascmagic.c
new file mode 100644 (file)
index 0000000..b1b8fc9
--- /dev/null
@@ -0,0 +1,689 @@
+/*
+ * ASCII magic -- file types that we know based on keywords
+ * that can appear anywhere in the file.
+ *
+ * Copyright (c) Ian F. Darwin, 1987.
+ * Written by Ian F. Darwin.
+ *
+ * Extensively modified by Eric Fischer <enf@pobox.com> in July, 2000,
+ * to handle character codes other than ASCII on a unified basis.
+ *
+ * Joerg Wunsch <joerg@freebsd.org> wrote the original support for 8-bit
+ * international characters, now subsumed into this file.
+ */
+
+/*
+ * 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.
+ */
+
+#include "file.h"
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#include <ctype.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "names.h"
+
+#ifndef        lint
+FILE_RCSID("@(#)Id: ascmagic.c,v 1.30 2001/07/26 13:15:49 christos Exp ")
+#endif /* lint */
+
+typedef unsigned long unichar;
+
+#define MAXLINELEN 300 /* longest sane line length */
+#define ISSPC(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n' \
+                 || (x) == 0x85 || (x) == '\f')
+
+static int looks_ascii __P((const unsigned char *, int, unichar *, int *));
+static int looks_utf8 __P((const unsigned char *, int, unichar *, int *));
+static int looks_unicode __P((const unsigned char *, int, unichar *, int *));
+static int looks_latin1 __P((const unsigned char *, int, unichar *, int *));
+static int looks_extended __P((const unsigned char *, int, unichar *, int *));
+static void from_ebcdic __P((const unsigned char *, int, unsigned char *));
+static int ascmatch __P((const unsigned char *, const unichar *, int));
+
+int
+ascmagic(buf, nbytes)
+       unsigned char *buf;
+       int nbytes;     /* size actually read */
+{
+       int i;
+       char nbuf[HOWMANY+1];           /* one extra for terminating '\0' */
+       unichar ubuf[HOWMANY+1];        /* one extra for terminating '\0' */
+       int ulen;
+       struct names *p;
+
+       char *code = NULL;
+       char *code_mime = NULL;
+       char *type = NULL;
+       char *subtype = NULL;
+       char *subtype_mime = NULL;
+
+       int has_escapes = 0;
+       int has_backspace = 0;
+
+       int n_crlf = 0;
+       int n_lf = 0;
+       int n_cr = 0;
+       int n_nel = 0;
+
+       int last_line_end = -1;
+       int has_long_lines = 0;
+
+       /*
+        * Do the tar test first, because if the first file in the tar
+        * archive starts with a dot, we can confuse it with an nroff file.
+        */
+       switch (is_tar(buf, nbytes)) {
+       case 1:
+               ckfputs(iflag ? "application/x-tar" : "tar archive", stdout);
+               return 1;
+       case 2:
+               ckfputs(iflag ? "application/x-tar, POSIX"
+                               : "POSIX tar archive", stdout);
+               return 1;
+       }
+
+       /*
+        * Undo the NUL-termination kindly provided by process()
+        * but leave at least one byte to look at
+        */
+
+       while (nbytes > 1 && buf[nbytes - 1] == '\0')
+               nbytes--;
+
+       /*
+        * Then try to determine whether it's any character code we can
+        * identify.  Each of these tests, if it succeeds, will leave
+        * the text converted into one-unichar-per-character Unicode in
+        * ubuf, and the number of characters converted in ulen.
+        */
+       if (looks_ascii(buf, nbytes, ubuf, &ulen)) {
+               code = "ASCII";
+               code_mime = "us-ascii";
+               type = "text";
+       } else if (looks_utf8(buf, nbytes, ubuf, &ulen)) {
+               code = "UTF-8 Unicode";
+               code_mime = "utf-8";
+               type = "text";
+       } else if ((i = looks_unicode(buf, nbytes, ubuf, &ulen))) {
+               if (i == 1)
+                       code = "Little-endian UTF-16 Unicode";
+               else
+                       code = "Big-endian UTF-16 Unicode";
+
+               type = "character data";
+               code_mime = "utf-16";    /* is this defined? */
+       } else if (looks_latin1(buf, nbytes, ubuf, &ulen)) {
+               code = "ISO-8859";
+               type = "text";
+               code_mime = "iso-8859-1"; 
+       } else if (looks_extended(buf, nbytes, ubuf, &ulen)) {
+               code = "Non-ISO extended-ASCII";
+               type = "text";
+               code_mime = "unknown";
+       } else {
+               from_ebcdic(buf, nbytes, nbuf);
+
+               if (looks_ascii(nbuf, nbytes, ubuf, &ulen)) {
+                       code = "EBCDIC";
+                       type = "character data";
+                       code_mime = "ebcdic";
+               } else if (looks_latin1(nbuf, nbytes, ubuf, &ulen)) {
+                       code = "International EBCDIC";
+                       type = "character data";
+                       code_mime = "ebcdic";
+               } else {
+                       return 0;  /* doesn't look like text at all */
+               }
+       }
+
+       /*
+        * for troff, look for . + letter + letter or .\";
+        * this must be done to disambiguate tar archives' ./file
+        * and other trash from real troff input.
+        *
+        * I believe Plan 9 troff allows non-ASCII characters in the names
+        * of macros, so this test might possibly fail on such a file.
+        */
+       if (*ubuf == '.') {
+               unichar *tp = ubuf + 1;
+
+               while (ISSPC(*tp))
+                       ++tp;   /* skip leading whitespace */
+               if ((tp[0] == '\\' && tp[1] == '\"') ||
+                   (isascii(tp[0]) && isalnum(tp[0]) &&
+                    isascii(tp[1]) && isalnum(tp[1]) &&
+                    ISSPC(tp[2]))) {
+                       subtype_mime = "text/troff";
+                       subtype = "troff or preprocessor input";
+                       goto subtype_identified;
+               }
+       }
+
+       if ((*buf == 'c' || *buf == 'C') && ISSPC(buf[1])) {
+               subtype_mime = "text/fortran";
+               subtype = "fortran program";
+               goto subtype_identified;
+       }
+
+       /* look for tokens from names.h - this is expensive! */
+
+       i = 0;
+       while (i < ulen) {
+               int end;
+
+               /*
+                * skip past any leading space
+                */
+               while (i < ulen && ISSPC(ubuf[i]))
+                       i++;
+               if (i >= ulen)
+                       break;
+
+               /*
+                * find the next whitespace
+                */
+               for (end = i + 1; end < nbytes; end++)
+                       if (ISSPC(ubuf[end]))
+                               break;
+
+               /*
+                * compare the word thus isolated against the token list
+                */
+               for (p = names; p < names + NNAMES; p++) {
+                       if (ascmatch(p->name, ubuf + i, end - i)) {
+                               subtype = types[p->type].human;
+                               subtype_mime = types[p->type].mime;
+                               goto subtype_identified;
+                       }
+               }
+
+               i = end;
+       }
+
+subtype_identified:
+
+       /*
+        * Now try to discover other details about the file.
+        */
+       for (i = 0; i < ulen; i++) {
+               if (i > last_line_end + MAXLINELEN)
+                       has_long_lines = 1;
+
+               if (ubuf[i] == '\033')
+                       has_escapes = 1;
+               if (ubuf[i] == '\b')
+                       has_backspace = 1;
+
+               if (ubuf[i] == '\r' && (i + 1 <  ulen && ubuf[i + 1] == '\n')) {
+                       n_crlf++;
+                       last_line_end = i;
+               }
+               if (ubuf[i] == '\r' && (i + 1 >= ulen || ubuf[i + 1] != '\n')) {
+                       n_cr++;
+                       last_line_end = i;
+               }
+               if (ubuf[i] == '\n' && (i - 1 <  0    || ubuf[i - 1] != '\r')) {
+                       n_lf++;
+                       last_line_end = i;
+               }
+               if (ubuf[i] == 0x85) { /* X3.64/ECMA-43 "next line" character */
+                       n_nel++;
+                       last_line_end = i;
+               }
+       }
+
+       if (iflag) {
+               if (subtype_mime)
+                       ckfputs(subtype_mime, stdout);
+               else
+                       ckfputs("text/plain", stdout);
+
+               if (code_mime) {
+                       ckfputs("; charset=", stdout);
+                       ckfputs(code_mime, stdout);
+               }
+       } else {
+               ckfputs(code, stdout);
+
+               if (subtype) {
+                       ckfputs(" ", stdout);
+                       ckfputs(subtype, stdout);
+               }
+
+               ckfputs(" ", stdout);
+               ckfputs(type, stdout);
+
+               if (has_long_lines)
+                       ckfputs(", with very long lines", stdout);
+
+               /*
+                * Only report line terminators if we find one other than LF,
+                * or if we find none at all.
+                */
+               if ((n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) ||
+                   (n_crlf != 0 || n_cr != 0 || n_nel != 0)) {
+                       ckfputs(", with", stdout);
+
+                       if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0)
+                               ckfputs(" no", stdout);
+                       else {
+                               if (n_crlf) {
+                                       ckfputs(" CRLF", stdout);
+                                       if (n_cr || n_lf || n_nel)
+                                               ckfputs(",", stdout);
+                               }
+                               if (n_cr) {
+                                       ckfputs(" CR", stdout);
+                                       if (n_lf || n_nel)
+                                               ckfputs(",", stdout);
+                               }
+                               if (n_lf) {
+                                       ckfputs(" LF", stdout);
+                                       if (n_nel)
+                                               ckfputs(",", stdout);
+                               }
+                               if (n_nel)
+                                       ckfputs(" NEL", stdout);
+                       }
+
+                       ckfputs(" line terminators", stdout);
+               }
+
+               if (has_escapes)
+                       ckfputs(", with escape sequences", stdout);
+               if (has_backspace)
+                       ckfputs(", with overstriking", stdout);
+       }
+
+       return 1;
+}
+
+static int
+ascmatch(s, us, ulen)
+       const unsigned char *s;
+       const unichar *us;
+       int ulen;
+{
+       size_t i;
+
+       for (i = 0; i < ulen; i++) {
+               if (s[i] != us[i])
+                       return 0;
+       }
+
+       if (s[i])
+               return 0;
+       else
+               return 1;
+}
+
+/*
+ * This table reflects a particular philosophy about what constitutes
+ * "text," and there is room for disagreement about it.
+ *
+ * Version 3.31 of the file command considered a file to be ASCII if
+ * each of its characters was approved by either the isascii() or
+ * isalpha() function.  On most systems, this would mean that any
+ * file consisting only of characters in the range 0x00 ... 0x7F
+ * would be called ASCII text, but many systems might reasonably
+ * consider some characters outside this range to be alphabetic,
+ * so the file command would call such characters ASCII.  It might
+ * have been more accurate to call this "considered textual on the
+ * local system" than "ASCII."
+ *
+ * It considered a file to be "International language text" if each
+ * of its characters was either an ASCII printing character (according
+ * to the real ASCII standard, not the above test), a character in
+ * the range 0x80 ... 0xFF, or one of the following control characters:
+ * backspace, tab, line feed, vertical tab, form feed, carriage return,
+ * escape.  No attempt was made to determine the language in which files
+ * of this type were written.
+ *
+ *
+ * The table below considers a file to be ASCII if all of its characters
+ * are either ASCII printing characters (again, according to the X3.4
+ * standard, not isascii()) or any of the following controls: bell,
+ * backspace, tab, line feed, form feed, carriage return, esc, nextline.
+ *
+ * I include bell because some programs (particularly shell scripts)
+ * use it literally, even though it is rare in normal text.  I exclude
+ * vertical tab because it never seems to be used in real text.  I also
+ * include, with hesitation, the X3.64/ECMA-43 control nextline (0x85),
+ * because that's what the dd EBCDIC->ASCII table maps the EBCDIC newline
+ * character to.  It might be more appropriate to include it in the 8859
+ * set instead of the ASCII set, but it's got to be included in *something*
+ * we recognize or EBCDIC files aren't going to be considered textual.
+ * Some old Unix source files use SO/SI (^N/^O) to shift between Greek
+ * and Latin characters, so these should possibly be allowed.  But they
+ * make a real mess on VT100-style displays if they're not paired properly,
+ * so we are probably better off not calling them text.
+ *
+ * A file is considered to be ISO-8859 text if its characters are all
+ * either ASCII, according to the above definition, or printing characters
+ * from the ISO-8859 8-bit extension, characters 0xA0 ... 0xFF.
+ *
+ * Finally, a file is considered to be international text from some other
+ * character code if its characters are all either ISO-8859 (according to
+ * the above definition) or characters in the range 0x80 ... 0x9F, which
+ * ISO-8859 considers to be control characters but the IBM PC and Macintosh
+ * consider to be printing characters.
+ */
+
+#define F 0   /* character never appears in text */
+#define T 1   /* character appears in plain ASCII text */
+#define I 2   /* character appears in ISO-8859 text */
+#define X 3   /* character appears in non-ISO extended ASCII (Mac, IBM PC) */
+
+static char text_chars[256] = {
+       /*                  BEL BS HT LF    FF CR    */
+       F, F, F, F, F, F, F, T, T, T, T, F, T, T, F, F,  /* 0x0X */
+        /*                              ESC          */
+       F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F,  /* 0x1X */
+       T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x2X */
+       T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x3X */
+       T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x4X */
+       T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x5X */
+       T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x6X */
+       T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F,  /* 0x7X */
+       /*            NEL                            */
+       X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X,  /* 0x8X */
+       X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,  /* 0x9X */
+       I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xaX */
+       I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xbX */
+       I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xcX */
+       I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xdX */
+       I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xeX */
+       I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I   /* 0xfX */
+};
+
+static int
+looks_ascii(buf, nbytes, ubuf, ulen)
+       const unsigned char *buf;
+       int nbytes;
+       unichar *ubuf;
+       int *ulen;
+{
+       int i;
+
+       *ulen = 0;
+
+       for (i = 0; i < nbytes; i++) {
+               int t = text_chars[buf[i]];
+
+               if (t != T)
+                       return 0;
+
+               ubuf[(*ulen)++] = buf[i];
+       }
+
+       return 1;
+}
+
+static int
+looks_latin1(buf, nbytes, ubuf, ulen)
+       const unsigned char *buf;
+       int nbytes;
+       unichar *ubuf;
+       int *ulen;
+{
+       int i;
+
+       *ulen = 0;
+
+       for (i = 0; i < nbytes; i++) {
+               int t = text_chars[buf[i]];
+
+               if (t != T && t != I)
+                       return 0;
+
+               ubuf[(*ulen)++] = buf[i];
+       }
+
+       return 1;
+}
+
+static int
+looks_extended(buf, nbytes, ubuf, ulen)
+       const unsigned char *buf;
+       int nbytes;
+       unichar *ubuf;
+       int *ulen;
+{
+       int i;
+
+       *ulen = 0;
+
+       for (i = 0; i < nbytes; i++) {
+               int t = text_chars[buf[i]];
+
+               if (t != T && t != I && t != X)
+                       return 0;
+
+               ubuf[(*ulen)++] = buf[i];
+       }
+
+       return 1;
+}
+
+int
+looks_utf8(buf, nbytes, ubuf, ulen)
+       const unsigned char *buf;
+       int nbytes;
+       unichar *ubuf;
+       int *ulen;
+{
+       int i, n;
+       unichar c;
+       int gotone = 0;
+
+       *ulen = 0;
+
+       for (i = 0; i < nbytes; i++) {
+               if ((buf[i] & 0x80) == 0) {        /* 0xxxxxxx is plain ASCII */
+                       /*
+                        * Even if the whole file is valid UTF-8 sequences,
+                        * still reject it if it uses weird control characters.
+                        */
+
+                       if (text_chars[buf[i]] != T)
+                               return 0;
+
+                       ubuf[(*ulen)++] = buf[i];
+               } else if ((buf[i] & 0x40) == 0) { /* 10xxxxxx never 1st byte */
+                       return 0;
+               } else {                           /* 11xxxxxx begins UTF-8 */
+                       int following;
+
+                       if ((buf[i] & 0x20) == 0) {             /* 110xxxxx */
+                               c = buf[i] & 0x1f;
+                               following = 1;
+                       } else if ((buf[i] & 0x10) == 0) {      /* 1110xxxx */
+                               c = buf[i] & 0x0f;
+                               following = 2;
+                       } else if ((buf[i] & 0x08) == 0) {      /* 11110xxx */
+                               c = buf[i] & 0x07;
+                               following = 3;
+                       } else if ((buf[i] & 0x04) == 0) {      /* 111110xx */
+                               c = buf[i] & 0x03;
+                               following = 4;
+                       } else if ((buf[i] & 0x02) == 0) {      /* 1111110x */
+                               c = buf[i] & 0x01;
+                               following = 5;
+                       } else
+                               return 0;
+
+                       for (n = 0; n < following; n++) {
+                               i++;
+                               if (i >= nbytes)
+                                       goto done;
+
+                               if ((buf[i] & 0x80) == 0 || (buf[i] & 0x40))
+                                       return 0;
+
+                               c = (c << 6) + (buf[i] & 0x3f);
+                       }
+
+                       ubuf[(*ulen)++] = c;
+                       gotone = 1;
+               }
+       }
+done:
+       return gotone;   /* don't claim it's UTF-8 if it's all 7-bit */
+}
+
+static int
+looks_unicode(buf, nbytes, ubuf, ulen)
+       const unsigned char *buf;
+       int nbytes;
+       unichar *ubuf;
+       int *ulen;
+{
+       int bigend;
+       int i;
+
+       if (nbytes < 2)
+               return 0;
+
+       if (buf[0] == 0xff && buf[1] == 0xfe)
+               bigend = 0;
+       else if (buf[0] == 0xfe && buf[1] == 0xff)
+               bigend = 1;
+       else
+               return 0;
+
+       *ulen = 0;
+
+       for (i = 2; i + 1 < nbytes; i += 2) {
+               /* XXX fix to properly handle chars > 65536 */
+
+               if (bigend)
+                       ubuf[(*ulen)++] = buf[i + 1] + 256 * buf[i];
+               else
+                       ubuf[(*ulen)++] = buf[i] + 256 * buf[i + 1];
+
+               if (ubuf[*ulen - 1] == 0xfffe)
+                       return 0;
+               if (ubuf[*ulen - 1] < 128 && text_chars[ubuf[*ulen - 1]] != T)
+                       return 0;
+       }
+
+       return 1;
+}
+
+#undef F
+#undef T
+#undef I
+#undef X
+
+/*
+ * This table maps each EBCDIC character to an (8-bit extended) ASCII
+ * character, as specified in the rationale for the dd(1) command in
+ * draft 11.2 (September, 1991) of the POSIX P1003.2 standard.
+ *
+ * Unfortunately it does not seem to correspond exactly to any of the
+ * five variants of EBCDIC documented in IBM's _Enterprise Systems
+ * Architecture/390: Principles of Operation_, SA22-7201-06, Seventh
+ * Edition, July, 1999, pp. I-1 - I-4.
+ *
+ * Fortunately, though, all versions of EBCDIC, including this one, agree
+ * on most of the printing characters that also appear in (7-bit) ASCII.
+ * Of these, only '|', '!', '~', '^', '[', and ']' are in question at all.
+ *
+ * Fortunately too, there is general agreement that codes 0x00 through
+ * 0x3F represent control characters, 0x41 a nonbreaking space, and the
+ * remainder printing characters.
+ *
+ * This is sufficient to allow us to identify EBCDIC text and to distinguish
+ * between old-style and internationalized examples of text.
+ */
+
+unsigned char ebcdic_to_ascii[] = {
+  0,   1,   2,   3, 156,   9, 134, 127, 151, 141, 142,  11,  12,  13,  14,  15,
+ 16,  17,  18,  19, 157, 133,   8, 135,  24,  25, 146, 143,  28,  29,  30,  31,
+128, 129, 130, 131, 132,  10,  23,  27, 136, 137, 138, 139, 140,   5,   6,   7,
+144, 145,  22, 147, 148, 149, 150,   4, 152, 153, 154, 155,  20,  21, 158,  26,
+' ', 160, 161, 162, 163, 164, 165, 166, 167, 168, 213, '.', '<', '(', '+', '|',
+'&', 169, 170, 171, 172, 173, 174, 175, 176, 177, '!', '$', '*', ')', ';', '~',
+'-', '/', 178, 179, 180, 181, 182, 183, 184, 185, 203, ',', '%', '_', '>', '?',
+186, 187, 188, 189, 190, 191, 192, 193, 194, '`', ':', '#', '@', '\'','=', '"',
+195, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 196, 197, 198, 199, 200, 201,
+202, 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', '^', 204, 205, 206, 207, 208,
+209, 229, 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 210, 211, 212, '[', 214, 215,
+216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, ']', 230, 231,
+'{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 232, 233, 234, 235, 236, 237,
+'}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 238, 239, 240, 241, 242, 243,
+'\\',159, 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 244, 245, 246, 247, 248, 249,
+'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 250, 251, 252, 253, 254, 255
+};
+
+/*
+ * The following EBCDIC-to-ASCII table may relate more closely to reality,
+ * or at least to modern reality.  It comes from
+ *
+ *   http://ftp.s390.ibm.com/products/oe/bpxqp9.html
+ *
+ * and maps the characters of EBCDIC code page 1047 (the code used for
+ * Unix-derived software on IBM's 390 systems) to the corresponding
+ * characters from ISO 8859-1.
+ *
+ * If this table is used instead of the above one, some of the special
+ * cases for the NEL character can be taken out of the code.
+ */
+
+unsigned char ebcdic_1047_to_8859[] = {
+0x00,0x01,0x02,0x03,0x9C,0x09,0x86,0x7F,0x97,0x8D,0x8E,0x0B,0x0C,0x0D,0x0E,0x0F,
+0x10,0x11,0x12,0x13,0x9D,0x0A,0x08,0x87,0x18,0x19,0x92,0x8F,0x1C,0x1D,0x1E,0x1F,
+0x80,0x81,0x82,0x83,0x84,0x85,0x17,0x1B,0x88,0x89,0x8A,0x8B,0x8C,0x05,0x06,0x07,
+0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9A,0x9B,0x14,0x15,0x9E,0x1A,
+0x20,0xA0,0xE2,0xE4,0xE0,0xE1,0xE3,0xE5,0xE7,0xF1,0xA2,0x2E,0x3C,0x28,0x2B,0x7C,
+0x26,0xE9,0xEA,0xEB,0xE8,0xED,0xEE,0xEF,0xEC,0xDF,0x21,0x24,0x2A,0x29,0x3B,0x5E,
+0x2D,0x2F,0xC2,0xC4,0xC0,0xC1,0xC3,0xC5,0xC7,0xD1,0xA6,0x2C,0x25,0x5F,0x3E,0x3F,
+0xF8,0xC9,0xCA,0xCB,0xC8,0xCD,0xCE,0xCF,0xCC,0x60,0x3A,0x23,0x40,0x27,0x3D,0x22,
+0xD8,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0xAB,0xBB,0xF0,0xFD,0xFE,0xB1,
+0xB0,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0xAA,0xBA,0xE6,0xB8,0xC6,0xA4,
+0xB5,0x7E,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0xA1,0xBF,0xD0,0x5B,0xDE,0xAE,
+0xAC,0xA3,0xA5,0xB7,0xA9,0xA7,0xB6,0xBC,0xBD,0xBE,0xDD,0xA8,0xAF,0x5D,0xB4,0xD7,
+0x7B,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0xAD,0xF4,0xF6,0xF2,0xF3,0xF5,
+0x7D,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0xB9,0xFB,0xFC,0xF9,0xFA,0xFF,
+0x5C,0xF7,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0xB2,0xD4,0xD6,0xD2,0xD3,0xD5,
+0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xB3,0xDB,0xDC,0xD9,0xDA,0x9F
+};
+
+/*
+ * Copy buf[0 ... nbytes-1] into out[], translating EBCDIC to ASCII.
+ */
+static void
+from_ebcdic(buf, nbytes, out)
+       const unsigned char *buf;
+       int nbytes;
+       unsigned char *out;
+{
+       int i;
+
+       for (i = 0; i < nbytes; i++) {
+               out[i] = ebcdic_to_ascii[buf[i]];
+       }
+}
diff --git a/file/compress.c b/file/compress.c
new file mode 100644 (file)
index 0000000..1f4094a
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * compress routines:
+ *     zmagic() - returns 0 if not recognized, uncompresses and prints
+ *                information if recognized
+ *     uncompress(method, old, n, newch) - uncompress old into new, 
+ *                                         using method, return sizeof new
+ */
+#include "file.h"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifndef lint
+FILE_RCSID("@(#)Id: compress.c,v 1.20 2001/07/22 21:04:15 christos Exp ")
+#endif
+
+
+static struct {
+       const char *magic;
+       int   maglen;
+       const char *const argv[3];
+       int      silent;
+} compr[] = {
+       { "\037\235", 2, { "gzip", "-cdq", NULL }, 1 },         /* compressed */
+       /* Uncompress can get stuck; so use gzip first if we have it
+        * Idea from Damien Clark, thanks! */
+       { "\037\235", 2, { "uncompress", "-c", NULL }, 1 },     /* compressed */
+       { "\037\213", 2, { "gzip", "-cdq", NULL }, 1 },         /* gzipped */
+       { "\037\236", 2, { "gzip", "-cdq", NULL }, 1 },         /* frozen */
+       { "\037\240", 2, { "gzip", "-cdq", NULL }, 1 },         /* SCO LZH */
+       /* the standard pack utilities do not accept standard input */
+       { "\037\036", 2, { "gzip", "-cdq", NULL }, 0 },         /* packed */
+       { "BZh",      3, { "bzip2", "-cd", NULL }, 1 },         /* bzip2-ed */
+};
+
+static int ncompr = sizeof(compr) / sizeof(compr[0]);
+
+
+static int uncompress __P((int, const unsigned char *, unsigned char **, int));
+static int swrite __P((int, const void *, size_t));
+static int sread __P((int, void *, size_t));
+
+int
+zmagic(buf, nbytes)
+       unsigned char *buf;
+       int nbytes;
+{
+       unsigned char *newbuf;
+       int newsize;
+       int i;
+
+       for (i = 0; i < ncompr; i++) {
+               if (nbytes < compr[i].maglen)
+                       continue;
+               if (memcmp(buf, compr[i].magic, compr[i].maglen) == 0 &&
+                   (newsize = uncompress(i, buf, &newbuf, nbytes)) != 0) {
+                       tryit(newbuf, newsize, 1);
+                       free(newbuf);
+                       printf(" (");
+                       tryit(buf, nbytes, 0);
+                       printf(")");
+                       return 1;
+               }
+       }
+
+       if (i == ncompr)
+               return 0;
+
+       return 1;
+}
+
+/*
+ * `safe' write for sockets and pipes.
+ */
+static int
+swrite(fd, buf, n)
+       int fd;
+       const void *buf;
+       size_t n;
+{
+       int rv;
+       size_t rn = n;
+
+       do
+               switch (rv = write(fd, buf, n)) {
+               case -1:
+                       if (errno == EINTR)
+                               continue;
+                       return -1;
+               default:
+                       n -= rv;
+                       buf = ((char *)buf) + rv;
+                       break;
+               }
+       while (n > 0);
+       return rn;
+}
+
+
+/*
+ * `safe' read for sockets and pipes.
+ */
+static int
+sread(fd, buf, n)
+       int fd;
+       void *buf;
+       size_t n;
+{
+       int rv;
+       size_t rn = n;
+
+       do
+               switch (rv = read(fd, buf, n)) {
+               case -1:
+                       if (errno == EINTR)
+                               continue;
+                       return -1;
+               default:
+                       n -= rv;
+                       buf = ((char *)buf) + rv;
+                       break;
+               }
+       while (n > 0);
+       return rn;
+}
+
+static int
+uncompress(method, old, newch, n)
+       int method;
+       const unsigned char *old;
+       unsigned char **newch;
+       int n;
+{
+       int fdin[2], fdout[2];
+
+       if (pipe(fdin) == -1 || pipe(fdout) == -1) {
+               error("cannot create pipe (%s).\n", strerror(errno));   
+               /*NOTREACHED*/
+       }
+       switch (fork()) {
+       case 0: /* child */
+               (void) close(0);
+               (void) dup(fdin[0]);
+               (void) close(fdin[0]);
+               (void) close(fdin[1]);
+
+               (void) close(1);
+               (void) dup(fdout[1]);
+               (void) close(fdout[0]);
+               (void) close(fdout[1]);
+               if (compr[method].silent)
+                       (void) close(2);
+
+               execvp(compr[method].argv[0],
+                      (char *const *)compr[method].argv);
+               exit(1);
+               /*NOTREACHED*/
+       case -1:
+               error("could not fork (%s).\n", strerror(errno));
+               /*NOTREACHED*/
+
+       default: /* parent */
+               (void) close(fdin[0]);
+               (void) close(fdout[1]);
+               if (swrite(fdin[1], old, n) != n) {
+                       n = 0;
+                       goto err;
+               }
+               (void) close(fdin[1]);
+               fdin[1] = -1;
+               if ((*newch = (unsigned char *) malloc(n)) == NULL) {
+                       n = 0;
+                       goto err;
+               }
+               if ((n = sread(fdout[0], *newch, n)) <= 0) {
+                       free(*newch);
+                       n = 0;
+                       goto err;
+               }
+err:
+               if (fdin[1] != -1)
+                       (void) close(fdin[1]);
+               (void) close(fdout[0]);
+               (void) wait(NULL);
+               return n;
+       }
+}
diff --git a/file/config.h.in b/file/config.h.in
new file mode 100644 (file)
index 0000000..a1b6f37
--- /dev/null
@@ -0,0 +1,100 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if your struct stat has st_rdev.  */
+#undef HAVE_ST_RDEV
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
+#undef HAVE_SYS_WAIT_H
+
+/* Define if your struct tm has tm_zone.  */
+#undef HAVE_TM_ZONE
+
+/* Define if you don't have tm_zone but do have the external array
+   tzname.  */
+#undef HAVE_TZNAME
+
+/* Define if major, minor, and makedev are declared in <mkdev.h>.  */
+#undef MAJOR_IN_MKDEV
+
+/* Define if major, minor, and makedev are declared in <sysmacros.h>.  */
+#undef MAJOR_IN_SYSMACROS
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define if your <sys/time.h> declares struct tm.  */
+#undef TM_IN_SYS_TIME
+
+/* Define if builtin ELF support is enabled.  */
+#undef BUILTIN_ELF
+
+/* Define if ELF core file support is enabled.  */
+#undef ELFCORE
+
+/* Define if the `long long' type works.  */
+#undef HAVE_LONG_LONG
+
+/* Define if we have "tm_isdst" in "struct tm".  */
+#undef HAVE_TM_ISDST
+
+/* Define if we have a global "int" variable "daylight".  */
+#undef HAVE_DAYLIGHT
+
+/* Define to `unsigned char' if standard headers don't define.  */
+#undef uint8_t
+
+/* Define to `unsigned short' if standard headers don't define.  */
+#undef uint16_t
+
+/* Define to `unsigned int' if standard headers don't define.  */
+#undef uint32_t
+
+/* Define to `unsigned long long', if available, or `unsigned long', if
+   standard headers don't define.  */
+#undef uint64_t
+
+/* The number of bytes in a uint8_t.  */
+#define SIZEOF_UINT8_T 0
+
+/* The number of bytes in a uint16_t.  */
+#define SIZEOF_UINT16_T 0
+
+/* The number of bytes in a uint32_t.  */
+#define SIZEOF_UINT32_T 0
+
+/* The number of bytes in a uint64_t.  */
+#define SIZEOF_UINT64_T 0
+
+/* Define if you have the mmap function.  */
+#undef HAVE_MMAP
+
+/* Define if you have the strerror function.  */
+#undef HAVE_STRERROR
+
+/* Define if you have the strtoul function.  */
+#undef HAVE_STRTOUL
+
+/* Define if you have the <locale.h> header file.  */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <sys/mman.h> header file.  */
+#undef HAVE_SYS_MMAN_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
diff --git a/file/configure b/file/configure
new file mode 100755 (executable)
index 0000000..bfa48ba
--- /dev/null
@@ -0,0 +1,2767 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --disable-elf            disable builtin ELF support"
+ac_help="$ac_help
+  --disable-elf-core       disable ELF core file support"
+ac_help="$ac_help
+  --enable-fsect-man5      enable file formats in man section 5"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=file.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:562: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:615: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.  echo might interpret backslashes.
+  cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:672: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+       @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=file
+
+VERSION=3.37
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:718: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$ac_t""found" 1>&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:731: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$ac_t""found" 1>&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:744: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$ac_t""found" 1>&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:757: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$ac_t""found" 1>&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:770: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$ac_t""found" 1>&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+echo $ac_n "checking for builtin ELF support""... $ac_c" 1>&6
+echo "configure:788: checking for builtin ELF support" >&5
+# Check whether --enable-elf or --disable-elf was given.
+if test "${enable_elf+set}" = set; then
+  enableval="$enable_elf"
+  if test "${enableval}" = yes; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define BUILTIN_ELF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+else
+  
+  # enable by default
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define BUILTIN_ELF 1
+EOF
+
+
+fi
+
+
+echo $ac_n "checking for ELF core file support""... $ac_c" 1>&6
+echo "configure:814: checking for ELF core file support" >&5
+# Check whether --enable-elf-core or --disable-elf-core was given.
+if test "${enable_elf_core+set}" = set; then
+  enableval="$enable_elf_core"
+  if test "${enableval}" = yes; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define ELFCORE 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+else
+  
+  # enable by default
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define ELFCORE 1
+EOF
+
+
+fi
+
+
+echo $ac_n "checking for file formats in man section 5""... $ac_c" 1>&6
+echo "configure:840: checking for file formats in man section 5" >&5
+# Check whether --enable-fsect-man5 or --disable-fsect-man5 was given.
+if test "${enable_fsect_man5+set}" = set; then
+  enableval="$enable_fsect_man5"
+  if test "${enableval}" = yes; then
+  echo "$ac_t""yes" 1>&6
+  fsect=5
+else
+  echo "$ac_t""no" 1>&6
+  fsect=4
+fi
+else
+  
+  # disable by default
+  echo "$ac_t""no" 1>&6
+  fsect=4
+
+fi
+
+
+
+
+if test x$fsect = x5; then
+  FSECT5_TRUE=
+  FSECT5_FALSE='#'
+else
+  FSECT5_TRUE='#'
+  FSECT5_FALSE=
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:873: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:903: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:954: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:986: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 997 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1028: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1033: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1042: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1061: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1104: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1157: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+  rm -f conftestdata
+  ac_cv_prog_LN_S="ln -s"
+else
+  ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1179: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1194 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1200: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1211 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1217: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1228 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1259: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1264 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1289 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1307 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1328 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1339: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+echo $ac_n "checking whether sys/types.h defines makedev""... $ac_c" 1>&6
+echo "configure:1363: checking whether sys/types.h defines makedev" >&5
+if eval "test \"`echo '$''{'ac_cv_header_sys_types_h_makedev'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1368 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+return makedev(0, 0);
+; return 0; }
+EOF
+if { (eval echo configure:1375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_header_sys_types_h_makedev=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_sys_types_h_makedev=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_header_sys_types_h_makedev" 1>&6
+
+if test $ac_cv_header_sys_types_h_makedev = no; then
+ac_safe=`echo "sys/mkdev.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for sys/mkdev.h""... $ac_c" 1>&6
+echo "configure:1393: checking for sys/mkdev.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1398 "configure"
+#include "confdefs.h"
+#include <sys/mkdev.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1403: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define MAJOR_IN_MKDEV 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+  if test $ac_cv_header_sys_mkdev_h = no; then
+ac_safe=`echo "sys/sysmacros.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for sys/sysmacros.h""... $ac_c" 1>&6
+echo "configure:1431: checking for sys/sysmacros.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1436 "configure"
+#include "confdefs.h"
+#include <sys/sysmacros.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1441: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define MAJOR_IN_SYSMACROS 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  fi
+fi
+
+echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
+echo "configure:1469: checking for sys/wait.h that is POSIX.1 compatible" >&5
+if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1474 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+#define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+int main() {
+int s;
+wait (&s);
+s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+; return 0; }
+EOF
+if { (eval echo configure:1490: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_sys_wait_h=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_sys_wait_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6
+if test $ac_cv_header_sys_wait_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_SYS_WAIT_H 1
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1514: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1519 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1524: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_hdr in locale.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1554: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1559 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1564: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_hdr in sys/mman.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1594: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1599 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1604: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1632: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1637 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1686: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1707: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1712 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_off_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+  cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1740: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1745 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+echo $ac_n "checking for st_rdev in struct stat""... $ac_c" 1>&6
+echo "configure:1773: checking for st_rdev in struct stat" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_st_rdev'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1778 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+int main() {
+struct stat s; s.st_rdev;
+; return 0; }
+EOF
+if { (eval echo configure:1786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_st_rdev=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_st_rdev=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_st_rdev" 1>&6
+if test $ac_cv_struct_st_rdev = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ST_RDEV 1
+EOF
+
+fi
+
+echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
+echo "configure:1807: checking whether struct tm is in sys/time.h or time.h" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1812 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <time.h>
+int main() {
+struct tm *tp; tp->tm_sec;
+; return 0; }
+EOF
+if { (eval echo configure:1820: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_tm=time.h
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_tm" 1>&6
+if test $ac_cv_struct_tm = sys/time.h; then
+  cat >> confdefs.h <<\EOF
+#define TM_IN_SYS_TIME 1
+EOF
+
+fi
+
+echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
+echo "configure:1841: checking for tm_zone in struct tm" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1846 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+int main() {
+struct tm tm; tm.tm_zone;
+; return 0; }
+EOF
+if { (eval echo configure:1854: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_tm_zone=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_tm_zone=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6
+if test "$ac_cv_struct_tm_zone" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_TM_ZONE 1
+EOF
+
+fi
+echo $ac_n "checking for tzname""... $ac_c" 1>&6
+echo "configure:1874: checking for tzname" >&5
+if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1879 "configure"
+#include "confdefs.h"
+#include <time.h>
+#ifndef tzname /* For SGI.  */
+extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
+#endif
+int main() {
+atoi(*tzname);
+; return 0; }
+EOF
+if { (eval echo configure:1889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_var_tzname=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_var_tzname=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_var_tzname" 1>&6
+  if test $ac_cv_var_tzname = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_TZNAME 1
+EOF
+
+  fi
+
+echo $ac_n "checking for tm_isdst in struct tm""... $ac_c" 1>&6
+echo "configure:1910: checking for tm_isdst in struct tm" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_tm_isdst'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1915 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+int main() {
+struct tm tm; tm.tm_isdst;
+; return 0; }
+EOF
+if { (eval echo configure:1923: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_tm_isdst=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_tm_isdst=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_tm_isdst" 1>&6
+if test "$ac_cv_struct_tm_isdst" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_TM_ISDST 1
+EOF
+
+fi
+echo $ac_n "checking for daylight""... $ac_c" 1>&6
+echo "configure:1943: checking for daylight" >&5
+if eval "test \"`echo '$''{'ac_cv_var_daylight'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1948 "configure"
+#include "confdefs.h"
+#include <time.h>
+#ifndef daylight /* In case IRIX #defines this, too  */
+extern int daylight;
+#endif
+int main() {
+atoi(daylight);
+; return 0; }
+EOF
+if { (eval echo configure:1958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_var_daylight=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_var_daylight=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_var_daylight" 1>&6
+  if test $ac_cv_var_daylight = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_DAYLIGHT 1
+EOF
+
+  fi
+
+
+echo $ac_n "checking for uint8_t""... $ac_c" 1>&6
+echo "configure:1980: checking for uint8_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_uint8_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1985 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])uint8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_uint8_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_uint8_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_uint8_t" 1>&6
+if test $ac_cv_type_uint8_t = no; then
+  cat >> confdefs.h <<\EOF
+#define uint8_t unsigned char
+EOF
+
+fi
+
+echo $ac_n "checking for uint16_t""... $ac_c" 1>&6
+echo "configure:2013: checking for uint16_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_uint16_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2018 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])uint16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_uint16_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_uint16_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_uint16_t" 1>&6
+if test $ac_cv_type_uint16_t = no; then
+  cat >> confdefs.h <<\EOF
+#define uint16_t unsigned short
+EOF
+
+fi
+
+echo $ac_n "checking for uint32_t""... $ac_c" 1>&6
+echo "configure:2046: checking for uint32_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_uint32_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2051 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_uint32_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_uint32_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_uint32_t" 1>&6
+if test $ac_cv_type_uint32_t = no; then
+  cat >> confdefs.h <<\EOF
+#define uint32_t unsigned int
+EOF
+
+fi
+
+
+echo $ac_n "checking for long long""... $ac_c" 1>&6
+echo "configure:2080: checking for long long" >&5
+if eval "test \"`echo '$''{'ac_cv_c_long_long'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$GCC" = yes; then
+  ac_cv_c_long_long=yes
+else
+if test "$cross_compiling" = yes; then
+    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2091 "configure"
+#include "confdefs.h"
+int main() {
+long long foo = 0;
+exit(sizeof(long long) < sizeof(long)); }
+EOF
+if { (eval echo configure:2097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_c_long_long=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_long_long=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_c_long_long" 1>&6
+if test $ac_cv_c_long_long = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_LONG_LONG 1
+EOF
+
+fi
+
+if test $ac_cv_c_long_long = yes; then
+  long64='unsigned long long';
+else
+  long64='unsigned long';
+fi
+echo $ac_n "checking for uint64_t""... $ac_c" 1>&6
+echo "configure:2126: checking for uint64_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_uint64_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2131 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])uint64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  eval "ac_cv_type_uint64_t=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_type_uint64_t=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_type_'uint64_t`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+  cat >> confdefs.h <<EOF
+#define uint64_t $long64
+EOF
+
+fi
+
+
+echo $ac_n "checking size of uint8_t""... $ac_c" 1>&6
+echo "configure:2162: checking size of uint8_t" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_uint8_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_uint8_t=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2170 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif
+
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(uint8_t));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_uint8_t=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_uint8_t=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_uint8_t" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_UINT8_T $ac_cv_sizeof_uint8_t
+EOF
+
+
+
+echo $ac_n "checking size of uint16_t""... $ac_c" 1>&6
+echo "configure:2207: checking size of uint16_t" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_uint16_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_uint16_t=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2215 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif
+
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(uint16_t));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_uint16_t=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_uint16_t=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_uint16_t" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_UINT16_T $ac_cv_sizeof_uint16_t
+EOF
+
+
+
+echo $ac_n "checking size of uint32_t""... $ac_c" 1>&6
+echo "configure:2252: checking size of uint32_t" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_uint32_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_uint32_t=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2260 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif
+
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(uint32_t));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_uint32_t=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_uint32_t=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_uint32_t" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_UINT32_T $ac_cv_sizeof_uint32_t
+EOF
+
+
+
+echo $ac_n "checking size of uint64_t""... $ac_c" 1>&6
+echo "configure:2297: checking size of uint64_t" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_uint64_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_uint64_t=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2305 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif
+
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(uint64_t));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_uint64_t=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_uint64_t=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_uint64_t" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_UINT64_T $ac_cv_sizeof_uint64_t
+EOF
+
+
+
+
+for ac_func in mmap strerror strtoul
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2345: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2350 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2373: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@fsect@%$fsect%g
+s%@FSECT5_TRUE@%$FSECT5_TRUE%g
+s%@FSECT5_FALSE@%$FSECT5_FALSE%g
+s%@CC@%$CC%g
+s%@LN_S@%$LN_S%g
+s%@CPP@%$CPP%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/file/configure.in b/file/configure.in
new file mode 100644 (file)
index 0000000..9626ae6
--- /dev/null
@@ -0,0 +1,93 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(file.c)
+AM_INIT_AUTOMAKE(file, 3.37)
+AM_CONFIG_HEADER(config.h)
+
+AC_MSG_CHECKING(for builtin ELF support)
+AC_ARG_ENABLE(elf,
+[  --disable-elf            disable builtin ELF support],
+[if test "${enableval}" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(BUILTIN_ELF)
+else
+  AC_MSG_RESULT(no)
+fi], [
+  # enable by default
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(BUILTIN_ELF)
+])
+
+AC_MSG_CHECKING(for ELF core file support)
+AC_ARG_ENABLE(elf-core,
+[  --disable-elf-core       disable ELF core file support],
+[if test "${enableval}" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(ELFCORE)
+else
+  AC_MSG_RESULT(no)
+fi], [
+  # enable by default
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(ELFCORE)
+])
+
+AC_MSG_CHECKING(for file formats in man section 5)
+AC_ARG_ENABLE(fsect-man5,
+[  --enable-fsect-man5      enable file formats in man section 5],
+[if test "${enableval}" = yes; then
+  AC_MSG_RESULT(yes)
+  fsect=5
+else
+  AC_MSG_RESULT(no)
+  fsect=4
+fi], [
+  # disable by default
+  AC_MSG_RESULT(no)
+  fsect=4
+])
+AC_SUBST(fsect)
+AM_CONDITIONAL(FSECT5, test x$fsect = x5)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LN_S
+
+dnl Checks for headers
+AC_HEADER_STDC
+AC_HEADER_MAJOR
+AC_HEADER_SYS_WAIT
+AC_CHECK_HEADERS(unistd.h)
+AC_CHECK_HEADERS(locale.h)
+AC_CHECK_HEADERS(sys/mman.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_STRUCT_ST_RDEV
+AC_STRUCT_TIMEZONE_DAYLIGHT
+
+dnl FIXME: only found in standard headers!
+AC_CHECK_TYPE(uint8_t, unsigned char)
+AC_CHECK_TYPE(uint16_t, unsigned short)
+AC_CHECK_TYPE(uint32_t, unsigned int)
+
+AC_C_LONG_LONG
+if test $ac_cv_c_long_long = yes; then
+  long64='unsigned long long';
+else
+  long64='unsigned long';
+fi
+dnl This needs a patch to autoconf 2.13 acgeneral.m4
+AC_CHECK_TYPE2(uint64_t, $long64)
+
+AC_CHECK_SIZEOF_STDC_HEADERS(uint8_t, 0)
+AC_CHECK_SIZEOF_STDC_HEADERS(uint16_t, 0)
+AC_CHECK_SIZEOF_STDC_HEADERS(uint32_t, 0)
+AC_CHECK_SIZEOF_STDC_HEADERS(uint64_t, 0)
+
+dnl Checks for functions
+AC_CHECK_FUNCS(mmap strerror strtoul)
+
+AC_OUTPUT(Makefile)
diff --git a/file/file.c b/file/file.c
new file mode 100644 (file)
index 0000000..b1d1dd4
--- /dev/null
@@ -0,0 +1,476 @@
+/*
+ * file - find type of a file or files - main program.
+ *
+ * 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.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/param.h> /* for MAXPATHLEN */
+#include <sys/stat.h>
+#include <fcntl.h>     /* for open() */
+#ifdef RESTORE_TIME
+# if (__COHERENT__ >= 0x420)
+#  include <sys/utime.h>
+# else
+#  ifdef USE_UTIMES
+#   include <sys/time.h>
+#  else
+#   include <utime.h>
+#  endif
+# endif
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>    /* for read() */
+#endif
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#include <netinet/in.h>                /* for byte swapping */
+
+#include "file.h"
+#include "patchlevel.h"
+
+#ifndef        lint
+FILE_RCSID("@(#)Id: file.c,v 1.59 2001/07/23 00:02:32 christos Exp ")
+#endif /* lint */
+
+
+#ifdef S_IFLNK
+# define USAGE  "Usage: %s [-bciknsvzL] [-f namefile] [-m magicfiles] file...\n"
+#else
+# define USAGE  "Usage: %s [-bciknsvz] [-f namefile] [-m magicfiles] file...\n"
+#endif
+
+#ifndef MAGIC
+# define MAGIC "/etc/magic"
+#endif
+
+#ifndef MAXPATHLEN
+#define        MAXPATHLEN      512
+#endif
+
+int                    /* Global command-line options          */
+       debug = 0,      /* debugging                            */
+       lflag = 0,      /* follow Symlinks (BSD only)           */
+       bflag = 0,      /* brief output format                  */
+       zflag = 0,      /* follow (uncompress) compressed files */
+       sflag = 0,      /* read block special files             */
+       iflag = 0,
+       nobuffer = 0,   /* Do not buffer stdout */
+       kflag = 0;      /* Keep going after the first match     */
+
+int                    /* Misc globals                         */
+       nmagic = 0;     /* number of valid magic[]s             */
+
+struct  magic *magic;  /* array of magic entries               */
+
+const char *magicfile = 0;     /* where the magic is           */
+const char *default_magicfile = MAGIC;
+
+char *progname;                /* used throughout                      */
+int lineno;            /* line number in the magic file        */
+
+
+static void    unwrap          __P((char *fn));
+static void    usage           __P((void));
+#if 0
+static int     byteconv4       __P((int, int, int));
+static short   byteconv2       __P((int, int, int));
+#endif
+
+int main __P((int, char *[]));
+
+/*
+ * main - parse arguments and handle options
+ */
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int c;
+       int action = 0, didsomefiles = 0, errflg = 0, ret = 0, app = 0;
+       char *mime, *home, *usermagic;
+       struct stat sb;
+
+#ifdef LC_CTYPE
+       setlocale(LC_CTYPE, ""); /* makes islower etc work for other langs */
+#endif
+
+       if ((progname = strrchr(argv[0], '/')) != NULL)
+               progname++;
+       else
+               progname = argv[0];
+
+       magicfile = default_magicfile;
+       if ((usermagic = getenv("MAGIC")) != NULL)
+               magicfile = usermagic;
+       else
+               if ((home = getenv("HOME")) != NULL) {
+                       if ((usermagic = malloc(strlen(home) + 8)) != NULL) {
+                               (void)strcpy(usermagic, home);
+                               (void)strcat(usermagic, "/.magic");
+                               if (stat(usermagic, &sb)<0) 
+                                       free(usermagic);
+                               else
+                                       magicfile = usermagic;
+                       }
+               }
+
+       while ((c = getopt(argc, argv, "bcdf:ikm:nsvzCL")) != EOF)
+               switch (c) {
+               case 'b':
+                       ++bflag;
+                       break;
+               case 'c':
+                       action = CHECK;
+                       break;
+               case 'C':
+                       action = COMPILE;
+                       break;
+               case 'd':
+                       ++debug;
+                       break;
+               case 'f':
+                       if (!app) {
+                               ret = apprentice(magicfile, action);
+                               if (action)
+                                       exit(ret);
+                               app = 1;
+                       }
+                       unwrap(optarg);
+                       ++didsomefiles;
+                       break;
+               case 'i':
+                       iflag++;
+                       if ((mime = malloc(strlen(magicfile) + 6)) != NULL) {
+                               (void)strcpy(mime, magicfile);
+                               (void)strcat(mime, ".mime");
+                               magicfile = mime;
+                       }
+                       break;
+               case 'k':
+                       kflag = 1;
+                       break;
+               case 'm':
+                       magicfile = optarg;
+                       break;
+               case 'n':
+                       ++nobuffer;
+                       break;
+               case 's':
+                       sflag++;
+                       break;
+               case 'v':
+                       (void) fprintf(stdout, "%s-%d.%d\n", progname,
+                                      FILE_VERSION_MAJOR, patchlevel);
+                       (void) fprintf(stdout, "magic file from %s\n",
+                                      magicfile);
+                       return 1;
+               case 'z':
+                       zflag++;
+                       break;
+#ifdef S_IFLNK
+               case 'L':
+                       ++lflag;
+                       break;
+#endif
+               case '?':
+               default:
+                       errflg++;
+                       break;
+               }
+
+       if (errflg) {
+               usage();
+       }
+
+       if (!app) {
+               ret = apprentice(magicfile, action);
+               if (action)
+                       exit(ret);
+               app = 1;
+       }
+
+       if (optind == argc) {
+               if (!didsomefiles) {
+                       usage();
+               }
+       }
+       else {
+               int i, wid, nw;
+               for (wid = 0, i = optind; i < argc; i++) {
+                       nw = strlen(argv[i]);
+                       if (nw > wid)
+                               wid = nw;
+               }
+               for (; optind < argc; optind++)
+                       process(argv[optind], wid);
+       }
+
+       return 0;
+}
+
+
+/*
+ * unwrap -- read a file of filenames, do each one.
+ */
+static void
+unwrap(fn)
+       char *fn;
+{
+       char buf[MAXPATHLEN];
+       FILE *f;
+       int wid = 0, cwid;
+
+       if (strcmp("-", fn) == 0) {
+               f = stdin;
+               wid = 1;
+       } else {
+               if ((f = fopen(fn, "r")) == NULL) {
+                       error("Cannot open `%s' (%s).\n", fn, strerror(errno));
+                       /*NOTREACHED*/
+               }
+
+               while (fgets(buf, MAXPATHLEN, f) != NULL) {
+                       cwid = strlen(buf) - 1;
+                       if (cwid > wid)
+                               wid = cwid;
+               }
+
+               rewind(f);
+       }
+
+       while (fgets(buf, MAXPATHLEN, f) != NULL) {
+               buf[strlen(buf)-1] = '\0';
+               process(buf, wid);
+               if(nobuffer)
+                       (void) fflush(stdout);
+       }
+
+       (void) fclose(f);
+}
+
+
+#if 0
+/*
+ * byteconv4
+ * Input:
+ *     from            4 byte quantity to convert
+ *     same            whether to perform byte swapping
+ *     big_endian      whether we are a big endian host
+ */
+static int
+byteconv4(from, same, big_endian)
+       int from;
+       int same;
+       int big_endian;
+{
+       if (same)
+               return from;
+       else if (big_endian) {          /* lsb -> msb conversion on msb */
+               union {
+                       int i;
+                       char c[4];
+               } retval, tmpval;
+
+               tmpval.i = from;
+               retval.c[0] = tmpval.c[3];
+               retval.c[1] = tmpval.c[2];
+               retval.c[2] = tmpval.c[1];
+               retval.c[3] = tmpval.c[0];
+
+               return retval.i;
+       }
+       else
+               return ntohl(from);     /* msb -> lsb conversion on lsb */
+}
+
+/*
+ * byteconv2
+ * Same as byteconv4, but for shorts
+ */
+static short
+byteconv2(from, same, big_endian)
+       int from;
+       int same;
+       int big_endian;
+{
+       if (same)
+               return from;
+       else if (big_endian) {          /* lsb -> msb conversion on msb */
+               union {
+                       short s;
+                       char c[2];
+               } retval, tmpval;
+
+               tmpval.s = (short) from;
+               retval.c[0] = tmpval.c[1];
+               retval.c[1] = tmpval.c[0];
+
+               return retval.s;
+       }
+       else
+               return ntohs(from);     /* msb -> lsb conversion on lsb */
+}
+#endif
+
+/*
+ * process - process input file
+ */
+void
+process(inname, wid)
+       const char      *inname;
+       int wid;
+{
+       int     fd = 0;
+       static  const char stdname[] = "standard input";
+       unsigned char   buf[HOWMANY+1]; /* one extra for terminating '\0' */
+       struct stat     sb;
+       int nbytes = 0; /* number of bytes read from a datafile */
+       char match = '\0';
+
+       if (strcmp("-", inname) == 0) {
+               if (fstat(0, &sb)<0) {
+                       error("cannot fstat `%s' (%s).\n", stdname,
+                             strerror(errno));
+                       /*NOTREACHED*/
+               }
+               inname = stdname;
+       }
+
+       if (wid > 0 && !bflag)
+            (void) printf("%s:%*s ", inname, 
+                          (int) (wid - strlen(inname)), "");
+
+       if (inname != stdname) {
+               /*
+                * first try judging the file based on its filesystem status
+                */
+               if (fsmagic(inname, &sb) != 0) {
+                       putchar('\n');
+                       return;
+               }
+
+               if ((fd = open(inname, O_RDONLY)) < 0) {
+                       /* We can't open it, but we were able to stat it. */
+                       if (sb.st_mode & 0002) ckfputs("writeable, ", stdout);
+                       if (sb.st_mode & 0111) ckfputs("executable, ", stdout);
+                       ckfprintf(stdout, "can't read `%s' (%s).\n",
+                           inname, strerror(errno));
+                       return;
+               }
+       }
+
+
+       /*
+        * try looking at the first HOWMANY bytes
+        */
+       if ((nbytes = read(fd, (char *)buf, HOWMANY)) == -1) {
+               error("read failed (%s).\n", strerror(errno));
+               /*NOTREACHED*/
+       }
+
+       if (nbytes == 0)
+               ckfputs(iflag ? "application/x-empty" : "empty", stdout);
+       else {
+               buf[nbytes++] = '\0';   /* null-terminate it */
+               match = tryit(buf, nbytes, zflag);
+       }
+
+#ifdef BUILTIN_ELF
+       if (match == 's' && nbytes > 5) {
+               /*
+                * We matched something in the file, so this *might*
+                * be an ELF file, and the file is at least 5 bytes long,
+                * so if it's an ELF file it has at least one byte
+                * past the ELF magic number - try extracting information
+                * from the ELF headers that can't easily be extracted
+                * with rules in the magic file.
+                */
+               tryelf(fd, buf, nbytes);
+       }
+#endif
+
+       if (inname != stdname) {
+#ifdef RESTORE_TIME
+               /*
+                * Try to restore access, modification times if read it.
+                * This is really *bad* because it will modify the status
+                * time of the file... And of course this will affect
+                * backup programs
+                */
+# ifdef USE_UTIMES
+               struct timeval  utsbuf[2];
+               utsbuf[0].tv_sec = sb.st_atime;
+               utsbuf[1].tv_sec = sb.st_mtime;
+
+               (void) utimes(inname, utsbuf); /* don't care if loses */
+# else
+               struct utimbuf  utbuf;
+
+               utbuf.actime = sb.st_atime;
+               utbuf.modtime = sb.st_mtime;
+               (void) utime(inname, &utbuf); /* don't care if loses */
+# endif
+#endif
+               (void) close(fd);
+       }
+       (void) putchar('\n');
+}
+
+
+int
+tryit(buf, nb, zflag)
+       unsigned char *buf;
+       int nb, zflag;
+{
+       /* try compression stuff */
+       if (zflag && zmagic(buf, nb))
+               return 'z';
+
+       /* try tests in /etc/magic (or surrogate magic file) */
+       if (softmagic(buf, nb))
+               return 's';
+
+       /* try known keywords, check whether it is ASCII */
+       if (ascmagic(buf, nb))
+               return 'a';
+
+       /* abandon hope, all ye who remain here */
+       ckfputs("data", stdout);
+               return '\0';
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr, USAGE, progname);
+       (void)fprintf(stderr, "Usage: %s -C [-m magic]\n", progname);
+       exit(1);
+}
diff --git a/file/file.h b/file/file.h
new file mode 100644 (file)
index 0000000..ead7b3a
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * file.h - definitions for file(1) program
+ * @(#)Id: file.h,v 1.37 2001/07/22 21:04:15 christos Exp 
+ *
+ * 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.
+ */
+
+#ifndef __file_h__
+#define __file_h__
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+typedef int int32;
+typedef unsigned int uint32;
+typedef short int16;
+typedef unsigned short uint16;
+typedef char int8;
+typedef unsigned char uint8;
+
+#ifndef HOWMANY
+# define HOWMANY 16384         /* how much of the file to look at */
+#endif
+#define MAXMAGIS 1000          /* max entries in /etc/magic */
+#define MAXDESC        50              /* max leng of text description */
+#define MAXstring 32           /* max leng of "string" types */
+
+#define MAGICNO                0xF11E041C
+#define VERSIONNO      1
+
+#define CHECK  1
+#define COMPILE        2
+
+struct magic {
+       uint16 cont_level;/* level of ">" */
+       uint8 nospflag; /* supress space character */
+       uint8 flag;
+#define INDIR  1               /* if '>(...)' appears,  */
+#define        UNSIGNED 2              /* comparison is unsigned */
+#define OFFADD 4               /* if '>&' appears,  */
+       uint8 reln;             /* relation (0=eq, '>'=gt, etc) */
+       uint8 vallen;           /* length of string value, if any */
+       uint8 type;             /* int, short, long or string. */
+       uint8 in_type;          /* type of indirrection */
+#define                        BYTE    1
+#define                                SHORT   2
+#define                                LONG    4
+#define                                STRING  5
+#define                                DATE    6
+#define                                BESHORT 7
+#define                                BELONG  8
+#define                                BEDATE  9
+#define                                LESHORT 10
+#define                                LELONG  11
+#define                                LEDATE  12
+#define                                PSTRING 13
+#define                                LDATE   14
+#define                                BELDATE 15
+#define                                LELDATE 16
+       uint8 in_op;            /* operator for indirection */
+       uint8 mask_op;          /* operator for mask */
+#define                                OPAND   1
+#define                                OPOR    2
+#define                                OPXOR   3
+#define                                OPADD   4
+#define                                OPMINUS 5
+#define                                OPMULTIPLY      6
+#define                                OPDIVIDE        7
+#define                                OPMODULO        8
+#define                                OPINVERSE       0x80
+       int32 offset;           /* offset to magic number */
+       int32 in_offset;        /* offset from indirection */
+       union VALUETYPE {
+               unsigned char b;
+               unsigned short h;
+               uint32 l;
+               char s[MAXstring];
+               unsigned char hs[2];    /* 2 bytes of a fixed-endian "short" */
+               unsigned char hl[4];    /* 4 bytes of a fixed-endian "long" */
+       } value;                /* either number or string */
+       uint32 mask;    /* mask before comparison with value */
+       char desc[MAXDESC];     /* description */
+};
+
+#define BIT(A)   (1 << (A))
+#define STRING_IGNORE_LOWERCASE                BIT(0)
+#define STRING_COMPACT_BLANK           BIT(1)
+#define STRING_COMPACT_OPTIONAL_BLANK  BIT(2)
+#define CHAR_IGNORE_LOWERCASE          'c'
+#define CHAR_COMPACT_BLANK             'B'
+#define CHAR_COMPACT_OPTIONAL_BLANK    'b'
+
+
+/* list of magic entries */
+struct mlist {
+       struct magic *magic;            /* array of magic entries */
+       uint32 nmagic;                  /* number of entries in array */
+       struct mlist *next, *prev;
+};
+
+#include <stdio.h>     /* Include that here, to make sure __P gets defined */
+#include <errno.h>
+
+#ifndef __P
+# if defined(__STDC__) || defined(__cplusplus)
+#  define __P(a) a
+# else
+#  define __P(a) ()
+#  define const
+# endif
+#endif
+
+extern int   apprentice                __P((const char *, int));
+extern int   ascmagic          __P((unsigned char *, int));
+extern void  error             __P((const char *, ...));
+extern void  ckfputs           __P((const char *, FILE *));
+struct stat;
+extern int   fsmagic           __P((const char *, struct stat *));
+extern char *fmttime           __P((long, int));
+extern int   is_compress       __P((const unsigned char *, int *));
+extern int   is_tar            __P((unsigned char *, int));
+extern void  magwarn           __P((const char *, ...));
+extern void  mdump             __P((struct magic *));
+extern void  process           __P((const char *, int));
+extern void  showstr           __P((FILE *, const char *, int));
+extern int   softmagic         __P((unsigned char *, int));
+extern int   tryit             __P((unsigned char *, int, int));
+extern int   zmagic            __P((unsigned char *, int));
+extern void  ckfprintf         __P((FILE *, const char *, ...));
+extern uint32 signextend       __P((struct magic *, unsigned int32));
+extern void tryelf             __P((int, unsigned char *, int));
+
+extern char *progname;         /* the program name                     */
+extern const char *magicfile;  /* name of the magic file               */
+extern int lineno;             /* current line number in magic file    */
+
+extern struct mlist mlist;     /* list of arrays of magic entries      */
+
+extern int debug;              /* enable debugging?                    */
+extern int zflag;              /* process compressed files?            */
+extern int lflag;              /* follow symbolic links?               */
+extern int sflag;              /* read/analyze block special files?    */
+extern int iflag;              /* Output types as mime-types           */
+
+extern int optind;             /* From getopt(3)                       */
+extern char *optarg;
+
+#ifndef HAVE_STRERROR
+extern int sys_nerr;
+extern char *sys_errlist[];
+#define strerror(e) \
+       (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error")
+#endif
+
+#ifndef HAVE_STRTOUL
+#define strtoul(a, b, c)       strtol(a, b, c)
+#endif
+
+#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
+#define QUICK
+#endif
+
+#ifdef __STDC__
+#define FILE_RCSID(id) \
+static const char *rcsid(const char *p) { \
+       return rcsid(p = id); \
+}
+#else
+#define FILE_RCSID(id) static char rcsid[] = id;
+#endif
+
+#endif /* __file_h__ */
diff --git a/file/file.man b/file/file.man
new file mode 100644 (file)
index 0000000..dd510b4
--- /dev/null
@@ -0,0 +1,448 @@
+.TH FILE __CSECTION__ "Copyright but distributable"
+.\" Id: file.man,v 1.39 2001/04/27 22:48:33 christos Exp 
+.SH NAME
+file
+\- determine file type
+.SH SYNOPSIS
+.B file
+[
+.B \-bciknsvzL
+]
+[
+.B \-f
+.I namefile
+]
+[
+.B \-m 
+.I magicfiles
+]
+.I file
+\&...
+.br
+.B file
+.B -C
+[
+.B \-m 
+magicfile ]
+.SH DESCRIPTION
+This manual page documents version __VERSION__ of the
+.B file
+command.
+.PP
+.B File
+tests each argument in an attempt to classify it.
+There are three sets of tests, performed in this order:
+filesystem tests, magic number tests, and language tests.
+The
+.I first
+test that succeeds causes the file type to be printed.
+.PP
+The type printed will usually contain one of the words
+.B text
+(the file contains only
+printing characters and a few common control
+characters and is probably safe to read on an
+.SM ASCII
+terminal),
+.B executable
+(the file contains the result of compiling a program
+in a form understandable to some \s-1UNIX\s0 kernel or another),
+or
+.B data
+meaning anything else (data is usually `binary' or non-printable).
+Exceptions are well-known file formats (core files, tar archives)
+that are known to contain binary data.
+When modifying the file
+.I __MAGIC__
+or the program itself, 
+.B "preserve these keywords" .
+People depend on knowing that all the readable files in a directory
+have the word ``text'' printed.
+Don't do as Berkeley did and change ``shell commands text''
+to ``shell script''.
+Note that the file
+.I __MAGIC__
+is built mechanically from a large number of small files in
+the subdirectory
+.I Magdir
+in the source distribution of this program.
+.PP
+The filesystem tests are based on examining the return from a
+.BR stat (2)
+system call.
+The program checks to see if the file is empty,
+or if it's some sort of special file.
+Any known file types appropriate to the system you are running on
+(sockets, symbolic links, or named pipes (FIFOs) on those systems that
+implement them)
+are intuited if they are defined in
+the system header file
+.IR <sys/stat.h>  .
+.PP
+The magic number tests are used to check for files with data in
+particular fixed formats.
+The canonical example of this is a binary executable (compiled program)
+.I a.out
+file, whose format is defined in 
+.I a.out.h
+and possibly
+.I exec.h
+in the standard include directory.
+These files have a `magic number' stored in a particular place
+near the beginning of the file that tells the \s-1UNIX\s0 operating system
+that the file is a binary executable, and which of several types thereof.
+The concept of `magic number' has been applied by extension to data files.
+Any file with some invariant identifier at a small fixed
+offset into the file can usually be described in this way.
+The information identifying these files is read from the compiled
+magic file
+.I __MAGIC__.mgc ,
+or 
+.I __MAGIC__
+if the compile file does not exist.
+.PP
+If a file does not match any of the entries in the magic file,
+it is examined to see if it seems to be a text file.
+ASCII, ISO-8859-x, non-ISO 8-bit extended-ASCII character sets
+(such as those used on Macintosh and IBM PC systems),
+UTF-8-encoded Unicode, UTF-16-encoded Unicode, and EBCDIC
+character sets can be distinguished by the different
+ranges and sequences of bytes that constitute printable text
+in each set.
+If a file passes any of these tests, its character set is reported.
+ASCII, ISO-8859-x, UTF-8, and extended-ASCII files are identified
+as ``text'' because they will be mostly readable on nearly any terminal;
+UTF-16 and EBCDIC are only ``character data'' because, while
+they contain text, it is text that will require translation
+before it can be read.
+In addition,
+.B file
+will attempt to determine other characteristics of text-type files.
+If the lines of a file are terminated by CR, CRLF, or NEL, instead
+of the Unix-standard LF, this will be reported.
+Files that contain embedded escape sequences or overstriking
+will also be identified.
+.PP
+Once
+.B file
+has determined the character set used in a text-type file,
+it will
+attempt to determine in what language the file is written.
+The language tests look for particular strings (cf
+.IR names.h )
+that can appear anywhere in the first few blocks of a file.
+For example, the keyword
+.B .br
+indicates that the file is most likely a
+.BR troff (1)
+input file, just as the keyword 
+.B struct
+indicates a C program.
+These tests are less reliable than the previous
+two groups, so they are performed last.
+The language test routines also test for some miscellany
+(such as 
+.BR tar (1)
+archives).
+.PP
+Any file that cannot be identified as having been written
+in any of the character sets listed above is simply said to be ``data''.
+.SH OPTIONS
+.TP 8
+.B \-b
+Do not prepend filenames to output lines (brief mode).
+.TP 8
+.B \-c
+Cause a checking printout of the parsed form of the magic file.
+This is usually used in conjunction with 
+.B \-m
+to debug a new magic file before installing it.
+.TP 8
+.B \-C
+Write a magic.mgc output file that contains a pre-parsed version of
+file.
+.TP 8
+.BI \-f " namefile"
+Read the names of the files to be examined from 
+.I namefile
+(one per line) 
+before the argument list.
+Either 
+.I namefile
+or at least one filename argument must be present;
+to test the standard input, use ``\-'' as a filename argument.
+.TP 8
+.B \-i
+Causes the file command to output mime type strings rather than the more
+traditional human readable ones. Thus it may say
+``text/plain; charset=us-ascii''
+rather
+than ``ASCII text''. In order for this option to work, file changes the way
+it handles files recognised by the command itself (such as many of the
+text file types, directories etc), and makes use of an alternative
+``magic'' file.
+(See ``FILES'' section, below).
+.TP 8
+.B \-k
+Don't stop at the first match, keep going.
+.TP 8
+.BI \-m " list"
+Specify an alternate list of files containing magic numbers.
+This can be a single file, or a colon-separated list of files.
+.TP 8
+.B \-n
+Force stdout to be flushed after checking each file. This is only useful if
+checking a list of files. It is intended to be used by programs that want
+filetype output from a pipe.
+.TP 8
+.B \-v
+Print the version of the program and exit.
+.TP 8
+.B \-z
+Try to look inside compressed files.
+.TP 8
+.B \-L
+option causes symlinks to be followed, as the like-named option in
+.BR ls (1).
+(on systems that support symbolic links).
+.TP 8
+.B \-s
+Normally,
+.B file
+only attempts to read and determine the type of argument files which
+.BR stat (2)
+reports are ordinary files.
+This prevents problems, because reading special files may have peculiar
+consequences.
+Specifying the
+.BR \-s
+option causes
+.B file
+to also read argument files which are block or character special files.
+This is useful for determining the filesystem types of the data in raw
+disk partitions, which are block special files.
+This option also causes
+.B file
+to disregard the file size as reported by
+.BR stat (2)
+since on some systems it reports a zero size for raw disk partitions.
+.SH FILES
+.I __MAGIC__.mgc
+\- defaults compiled list of magic numbers
+.PP
+.I __MAGIC__
+\- default list of magic numbers
+.PP
+.I __MAGIC__.mime
+\- default list of magic numbers, used to output mime types when the -i option
+is specified.
+
+.SH ENVIRONMENT
+The environment variable
+.B MAGIC
+can be used to set the default magic number files.
+.SH SEE ALSO
+.BR magic (__FSECTION__)
+\- description of magic file format.
+.br
+.BR strings (1), " od" (1), " hexdump(1)"
+\- tools for examining non-textfiles.
+.SH STANDARDS CONFORMANCE
+This program is believed to exceed the System V Interface Definition
+of FILE(CMD), as near as one can determine from the vague language
+contained therein. 
+Its behaviour is mostly compatible with the System V program of the same name.
+This version knows more magic, however, so it will produce
+different (albeit more accurate) output in many cases. 
+.PP
+The one significant difference 
+between this version and System V
+is that this version treats any white space
+as a delimiter, so that spaces in pattern strings must be escaped.
+For example,
+.br
+>10    string  language impress\       (imPRESS data)
+.br
+in an existing magic file would have to be changed to
+.br
+>10    string  language\e impress      (imPRESS data)
+.br
+In addition, in this version, if a pattern string contains a backslash,
+it must be escaped.  For example
+.br
+0      string          \ebegindata     Andrew Toolkit document
+.br
+in an existing magic file would have to be changed to
+.br
+0      string          \e\ebegindata   Andrew Toolkit document
+.br
+.PP
+SunOS releases 3.2 and later from Sun Microsystems include a
+.BR file (1)
+command derived from the System V one, but with some extensions.
+My version differs from Sun's only in minor ways.
+It includes the extension of the `&' operator, used as,
+for example,
+.br
+>16    long&0x7fffffff >0              not stripped
+.SH MAGIC DIRECTORY
+The magic file entries have been collected from various sources,
+mainly USENET, and contributed by various authors.
+Christos Zoulas (address below) will collect additional
+or corrected magic file entries.
+A consolidation of magic file entries 
+will be distributed periodically.
+.PP
+The order of entries in the magic file is significant.
+Depending on what system you are using, the order that
+they are put together may be incorrect.
+If your old
+.B file
+command uses a magic file,
+keep the old magic file around for comparison purposes
+(rename it to 
+.IR __MAGIC__.orig ).
+.SH EXAMPLES
+.nf
+$ file file.c file /dev/hda
+file.c:   C program text
+file:     ELF 32-bit LSB executable, Intel 80386, version 1,
+          dynamically linked, not stripped
+/dev/hda: block special
+
+$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
+/dev/hda:   x86 boot sector
+/dev/hda1:  Linux/i386 ext2 filesystem
+/dev/hda2:  x86 boot sector
+/dev/hda3:  x86 boot sector, extended partition table
+/dev/hda4:  Linux/i386 ext2 filesystem
+/dev/hda5:  Linux/i386 swap file
+/dev/hda6:  Linux/i386 swap file
+/dev/hda7:  Linux/i386 swap file
+/dev/hda8:  Linux/i386 swap file
+/dev/hda9:  empty
+/dev/hda10: empty
+
+$ file -i file.c file /dev/hda
+file.c:      text/x-c
+file:        application/x-executable, dynamically linked (uses shared libs), not stripped
+/dev/hda:    application/x-not-regular-file
+
+.fi
+.SH HISTORY
+There has been a 
+.B file
+command in every \s-1UNIX\s0 since at least Research Version 6
+(man page dated January 16, 1975).
+The System V version introduced one significant major change:
+the external list of magic number types.
+This slowed the program down slightly but made it a lot more flexible.
+.PP
+This program, based on the System V version,
+was written by Ian Darwin <ian@darwinsys.com>
+without looking at anybody else's source code.
+.PP
+John Gilmore revised the code extensively, making it better than
+the first version.
+Geoff Collyer found several inadequacies
+and provided some magic file entries.
+Contributions by the `&' operator by Rob McMahon, cudcv@warwick.ac.uk, 1989.
+.PP
+Guy Harris, guy@netapp.com, made many changes from 1993 to the present.
+.PP
+Primary development and maintenance from 1990 to the present by
+Christos Zoulas (christos@astron.com).
+.PP
+Altered by Chris Lowth, chris@lowth.com, 2000:
+Handle the ``-i'' option to output mime type strings and using an alternative
+magic file and internal logic.
+.PP
+Altered by Eric Fischer (enf@pobox.com), July, 2000,
+to identify character codes and attempt to identify the languages
+of non-ASCII files.
+.PP
+The list of contributors to the "Magdir" directory (source for the
+/etc/magic
+file) is too long to include here. You know who you are; thank you.
+.SH LEGAL NOTICE
+Copyright (c) Ian F. Darwin, Toronto, Canada, 1986-1999.
+Covered by the standard Berkeley Software Distribution copyright; see the file
+LEGAL.NOTICE in the source distribution.
+.PP
+The files
+.I tar.h
+and
+.I is_tar.c
+were written by John Gilmore from his public-domain
+.B tar
+program, and are not covered by the above license.
+.SH BUGS
+There must be a better way to automate the construction of the Magic
+file from all the glop in Magdir. What is it?
+Better yet, the magic file should be compiled into binary (say,
+.BR ndbm (3)
+or, better yet, fixed-length
+.SM ASCII
+strings for use in heterogenous network environments) for faster startup.
+Then the program would run as fast as the Version 7 program of the same name,
+with the flexibility of the System V version.
+.PP
+.B File
+uses several algorithms that favor speed over accuracy,
+thus it can be misled about the contents of
+text
+files.
+.PP
+The support for
+text
+files (primarily for programming languages)
+is simplistic, inefficient and requires recompilation to update.
+.PP
+There should be an ``else'' clause to follow a series of continuation lines.
+.PP
+The magic file and keywords should have regular expression support.
+Their use of
+.SM "ASCII TAB"
+as a field delimiter is ugly and makes
+it hard to edit the files, but is entrenched.
+.PP
+It might be advisable to allow upper-case letters in keywords
+for e.g.,
+.BR troff (1)
+commands vs man page macros.
+Regular expression support would make this easy.
+.PP
+The program doesn't grok \s-2FORTRAN\s0.
+It should be able to figure \s-2FORTRAN\s0 by seeing some keywords which 
+appear indented at the start of line.
+Regular expression support would make this easy.
+.PP
+The list of keywords in 
+.I ascmagic
+probably belongs in the Magic file.
+This could be done by using some keyword like `*' for the offset value.
+.PP
+Another optimisation would be to sort
+the magic file so that we can just run down all the
+tests for the first byte, first word, first long, etc, once we
+have fetched it.  Complain about conflicts in the magic file entries.
+Make a rule that the magic entries sort based on file offset rather
+than position within the magic file?
+.PP
+The program should provide a way to give an estimate 
+of ``how good'' a guess is.
+We end up removing guesses (e.g. ``From '' as first 5 chars of file) because
+they are not as good as other guesses (e.g. ``Newsgroups:'' versus
+``Return-Path:'').  Still, if the others don't pan out, it should be
+possible to use the first guess.  
+.PP
+This program is slower than some vendors' file commands.
+The new support for multiple character codes makes it even slower.
+.PP
+This manual page, and particularly this section, is too long.
+.SH AVAILABILITY
+You can obtain the original author's latest version by anonymous FTP
+on
+.B ftp.astron.com
+in the directory
+.I /pub/file/file-X.YY.tar.gz
diff --git a/file/fsmagic.c b/file/fsmagic.c
new file mode 100644 (file)
index 0000000..c7869dd
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * fsmagic - magic based on filesystem info - directory, special files, etc.
+ *
+ * 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.
+ */
+
+#include "file.h"
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+/* Since major is a function on SVR4, we can't use `ifndef major'.  */
+#ifdef MAJOR_IN_MKDEV
+# include <sys/mkdev.h>
+# define HAVE_MAJOR
+#endif
+#ifdef MAJOR_IN_SYSMACROS
+# include <sys/sysmacros.h>
+# define HAVE_MAJOR
+#endif
+#ifdef major                   /* Might be defined in sys/types.h.  */
+# define HAVE_MAJOR
+#endif
+  
+#ifndef HAVE_MAJOR
+# define major(dev)  (((dev) >> 8) & 0xff)
+# define minor(dev)  ((dev) & 0xff)
+#endif
+#undef HAVE_MAJOR
+
+#ifndef        lint
+FILE_RCSID("@(#)Id: fsmagic.c,v 1.33 2000/08/05 17:36:48 christos Exp ")
+#endif /* lint */
+
+int
+fsmagic(fn, sb)
+       const char *fn;
+       struct stat *sb;
+{
+       int ret = 0;
+
+       /*
+        * Fstat is cheaper but fails for files you don't have read perms on.
+        * On 4.2BSD and similar systems, use lstat() to identify symlinks.
+        */
+#ifdef S_IFLNK
+       if (!lflag)
+               ret = lstat(fn, sb);
+       else
+#endif
+       ret = stat(fn, sb);     /* don't merge into if; see "ret =" above */
+
+       if (ret) {
+               ckfprintf(stdout,
+                       /* Yes, I do mean stdout. */
+                       /* No \n, caller will provide. */
+                       "can't stat `%s' (%s).", fn, strerror(errno));
+               return 1;
+       }
+
+       if (iflag) {
+               if ((sb->st_mode & S_IFMT) != S_IFREG) {
+                       ckfputs("application/x-not-regular-file", stdout);
+                       return 1;
+               }
+       }
+       else {
+#ifdef S_ISUID
+               if (sb->st_mode & S_ISUID) ckfputs("setuid ", stdout);
+#endif
+#ifdef S_ISGID
+               if (sb->st_mode & S_ISGID) ckfputs("setgid ", stdout);
+#endif
+#ifdef S_ISVTX
+               if (sb->st_mode & S_ISVTX) ckfputs("sticky ", stdout);
+#endif
+       }
+       
+       switch (sb->st_mode & S_IFMT) {
+       case S_IFDIR:
+               ckfputs("directory", stdout);
+               return 1;
+#ifdef S_IFCHR
+       case S_IFCHR:
+               /* 
+                * If -s has been specified, treat character special files
+                * like ordinary files.  Otherwise, just report that they
+                * are block special files and go on to the next file.
+                */
+               if (sflag)
+                       break;
+#ifdef HAVE_ST_RDEV
+# ifdef dv_unit
+               (void) printf("character special (%d/%d/%d)",
+                       major(sb->st_rdev),
+                       dv_unit(sb->st_rdev),
+                       dv_subunit(sb->st_rdev));
+# else
+               (void) printf("character special (%ld/%ld)",
+                       (long) major(sb->st_rdev), (long) minor(sb->st_rdev));
+# endif
+#else
+               (void) printf("character special");
+#endif
+               return 1;
+#endif
+#ifdef S_IFBLK
+       case S_IFBLK:
+               /* 
+                * If -s has been specified, treat block special files
+                * like ordinary files.  Otherwise, just report that they
+                * are block special files and go on to the next file.
+                */
+               if (sflag)
+                       break;
+#ifdef HAVE_ST_RDEV
+# ifdef dv_unit
+               (void) printf("block special (%d/%d/%d)",
+                       major(sb->st_rdev),
+                       dv_unit(sb->st_rdev),
+                       dv_subunit(sb->st_rdev));
+# else
+               (void) printf("block special (%ld/%ld)",
+                       (long) major(sb->st_rdev), (long) minor(sb->st_rdev));
+# endif
+#else
+               (void) printf("block special");
+#endif
+               return 1;
+#endif
+       /* TODO add code to handle V7 MUX and Blit MUX files */
+#ifdef S_IFIFO
+       case S_IFIFO:
+               ckfputs("fifo (named pipe)", stdout);
+               return 1;
+#endif
+#ifdef S_IFDOOR
+       case S_IFDOOR:
+               ckfputs("door", stdout);
+               return 1;
+#endif
+#ifdef S_IFLNK
+       case S_IFLNK:
+               {
+                       char buf[BUFSIZ+4];
+                       int nch;
+                       struct stat tstatbuf;
+
+                       if ((nch = readlink(fn, buf, BUFSIZ-1)) <= 0) {
+                               ckfprintf(stdout, "unreadable symlink (%s).", 
+                                     strerror(errno));
+                               return 1;
+                       }
+                       buf[nch] = '\0';        /* readlink(2) forgets this */
+
+                       /* If broken symlink, say so and quit early. */
+                       if (*buf == '/') {
+                           if (stat(buf, &tstatbuf) < 0) {
+                               ckfprintf(stdout,
+                                       "broken symbolic link to %s", buf);
+                               return 1;
+                           }
+                       }
+                       else {
+                           char *tmp;
+                           char buf2[BUFSIZ+BUFSIZ+4];
+
+                           if ((tmp = strrchr(fn,  '/')) == NULL) {
+                               tmp = buf; /* in current directory anyway */
+                           }
+                           else {
+                               strcpy (buf2, fn);  /* take directory part */
+                               buf2[tmp-fn+1] = '\0';
+                               strcat (buf2, buf); /* plus (relative) symlink */
+                               tmp = buf2;
+                           }
+                           if (stat(tmp, &tstatbuf) < 0) {
+                               ckfprintf(stdout,
+                                       "broken symbolic link to %s", buf);
+                               return 1;
+                           }
+                        }
+
+                       /* Otherwise, handle it. */
+                       if (lflag) {
+                               process(buf, strlen(buf));
+                               return 1;
+                       } else { /* just print what it points to */
+                               ckfputs("symbolic link to ", stdout);
+                               ckfputs(buf, stdout);
+                       }
+               }
+               return 1;
+#endif
+#ifdef S_IFSOCK
+#ifndef __COHERENT__
+       case S_IFSOCK:
+               ckfputs("socket", stdout);
+               return 1;
+#endif
+#endif
+       case S_IFREG:
+               break;
+       default:
+               error("invalid mode 0%o.\n", sb->st_mode);
+               /*NOTREACHED*/
+       }
+
+       /*
+        * regular file, check next possibility
+        *
+        * If stat() tells us the file has zero length, report here that
+        * the file is empty, so we can skip all the work of opening and 
+        * reading the file.
+        * But if the -s option has been given, we skip this optimization,
+        * since on some systems, stat() reports zero size for raw disk
+        * partitions.  (If the block special device really has zero length,
+        * the fact that it is empty will be detected and reported correctly
+        * when we read the file.)
+        */
+       if (!sflag && sb->st_size == 0) {
+               ckfputs(iflag ? "application/x-empty" : "empty", stdout);
+               return 1;
+       }
+       return 0;
+}
diff --git a/file/install-sh b/file/install-sh
new file mode 100755 (executable)
index 0000000..89fc9b0
--- /dev/null
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/file/is_tar.c b/file/is_tar.c
new file mode 100644 (file)
index 0000000..fd184d6
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * is_tar() -- figure out whether file is a tar archive.
+ *
+ * Stolen (by the author!) from the public domain tar program:
+ * Public Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
+ *
+ * @(#)list.c 1.18 9/23/86 Public Domain - gnu
+ * Id: is_tar.c,v 1.13 2000/08/05 17:36:48 christos Exp 
+ *
+ * Comments changed and some code/comments reformatted
+ * for file command by Ian Darwin.
+ */
+
+#include <string.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include "tar.h"
+#include "file.h"
+
+#ifndef lint
+FILE_RCSID("@(#)Id: is_tar.c,v 1.13 2000/08/05 17:36:48 christos Exp ")
+#endif
+
+#define        isodigit(c)     ( ((c) >= '0') && ((c) <= '7') )
+
+static int from_oct __P((int, char *));        /* Decode octal number */
+
+/*
+ * Return 
+ *     0 if the checksum is bad (i.e., probably not a tar archive), 
+ *     1 for old UNIX tar file,
+ *     2 for Unix Std (POSIX) tar file.
+ */
+int
+is_tar(buf, nbytes)
+       unsigned char *buf;
+       int nbytes;
+{
+       union record *header = (union record *)buf;
+       int     i;
+       int     sum, recsum;
+       char    *p;
+
+       if (nbytes < sizeof(union record))
+               return 0;
+
+       recsum = from_oct(8,  header->header.chksum);
+
+       sum = 0;
+       p = header->charptr;
+       for (i = sizeof(union record); --i >= 0;) {
+               /*
+                * We can't use unsigned char here because of old compilers,
+                * e.g. V7.
+                */
+               sum += 0xFF & *p++;
+       }
+
+       /* Adjust checksum to count the "chksum" field as blanks. */
+       for (i = sizeof(header->header.chksum); --i >= 0;)
+               sum -= 0xFF & header->header.chksum[i];
+       sum += ' '* sizeof header->header.chksum;       
+
+       if (sum != recsum)
+               return 0;       /* Not a tar archive */
+       
+       if (0==strcmp(header->header.magic, TMAGIC)) 
+               return 2;               /* Unix Standard tar archive */
+
+       return 1;                       /* Old fashioned tar archive */
+}
+
+
+/*
+ * Quick and dirty octal conversion.
+ *
+ * Result is -1 if the field is invalid (all blank, or nonoctal).
+ */
+static int
+from_oct(digs, where)
+       int     digs;
+       char    *where;
+{
+       int     value;
+
+       while (isspace((unsigned char)*where)) {        /* Skip spaces */
+               where++;
+               if (--digs <= 0)
+                       return -1;              /* All blank field */
+       }
+       value = 0;
+       while (digs > 0 && isodigit(*where)) {  /* Scan til nonoctal */
+               value = (value << 3) | (*where++ - '0');
+               --digs;
+       }
+
+       if (digs > 0 && *where && !isspace((unsigned char)*where))
+               return -1;                      /* Ended on non-space/nul */
+
+       return value;
+}
diff --git a/file/magic.man b/file/magic.man
new file mode 100644 (file)
index 0000000..d90a76c
--- /dev/null
@@ -0,0 +1,222 @@
+.TH MAGIC __FSECTION__ "Public Domain"
+.\" install as magic.4 on USG, magic.5 on V7 or Berkeley systems.
+.SH NAME
+magic \- file command's magic number file
+.SH DESCRIPTION
+This manual page documents the format of the magic file as
+used by the
+.BR file (__CSECTION__)
+command, version __VERSION__. The
+.B file
+command identifies the type of a file using,
+among other tests,
+a test for whether the file begins with a certain
+.IR "magic number" .
+The file
+.I __MAGIC__
+specifies what magic numbers are to be tested for,
+what message to print if a particular magic number is found,
+and additional information to extract from the file.
+.PP
+Each line of the file specifies a test to be performed.
+A test compares the data starting at a particular offset
+in the file with a 1-byte, 2-byte, or 4-byte numeric value or
+a string.  If the test succeeds, a message is printed.
+The line consists of the following fields:
+.IP offset \w'message'u+2n
+A number specifying the offset, in bytes, into the file of the data
+which is to be tested.
+.IP type
+The type of the data to be tested.  The possible values are:
+.RS
+.IP byte \w'message'u+2n
+A one-byte value.
+.IP short
+A two-byte value (on most systems) in this machine's native byte order.
+.IP long
+A four-byte value (on most systems) in this machine's native byte order.
+.IP string
+A string of bytes. The string type specification can be optionally followed
+by /[Bbc]*. The ``B'' flag compacts whitespace in the target, which must
+contain at least one whitespace character. If the magic has "n" consecutive
+blanks, the target needs at least "n" consecutive blanks to match. The ``b''
+flag treats every blank in the target as an optional blank. Finally the ``c''
+flag, specifies case insensitive matching: lowercase characters in the magic
+match both lower and upper case characters in the targer, whereas upper case
+characters in the magic, only much uppercase characters in the target.
+.IP date
+A four-byte value interpreted as a UNIX date.
+.IP ldate
+A four-byte value interpreted as a UNIX-style date, but interpreted as
+local time rather than UTC.
+.IP beshort
+A two-byte value (on most systems) in big-endian byte order.
+.IP belong
+A four-byte value (on most systems) in big-endian byte order.
+.IP bedate
+A four-byte value (on most systems) in big-endian byte order,
+interpreted as a unix date.
+.IP leshort
+A two-byte value (on most systems) in little-endian byte order.
+.IP lelong
+A four-byte value (on most systems) in little-endian byte order.
+.IP ledate
+A four-byte value (on most systems) in little-endian byte order,
+interpreted as a UNIX date.
+.IP leldate
+A four-byte value (on most systems) in little-endian byte order,
+interpreted as a UNIX-style date, but interpreted as local time rather
+than UTC.
+.RE
+.PP
+The numeric types may optionally be followed by
+.B &
+and a numeric value,
+to specify that the value is to be AND'ed with the
+numeric value before any comparisons are done.  Prepending a
+.B u
+to the type indicates that ordered comparisons should be unsigned.
+.IP test
+The value to be compared with the value from the file.  If the type is
+numeric, this value
+is specified in C form; if it is a string, it is specified as a C string
+with the usual escapes permitted (e.g. \en for new-line).
+.IP
+Numeric values
+may be preceded by a character indicating the operation to be performed.
+It may be
+.BR = ,
+to specify that the value from the file must equal the specified value,
+.BR < ,
+to specify that the value from the file must be less than the specified
+value,
+.BR > ,
+to specify that the value from the file must be greater than the specified
+value,
+.BR & ,
+to specify that the value from the file must have set all of the bits 
+that are set in the specified value,
+.BR ^ ,
+to specify that the value from the file must have clear any of the bits 
+that are set in the specified value, or
+.BR x ,
+to specify that any value will match. If the character is omitted,
+it is assumed to be
+.BR = .
+.IP
+Numeric values are specified in C form; e.g.
+.B 13
+is decimal,
+.B 013
+is octal, and
+.B 0x13
+is hexadecimal.
+.IP
+For string values, the byte string from the
+file must match the specified byte string. 
+The operators
+.BR = ,
+.B <
+and
+.B >
+(but not
+.BR & )
+can be applied to strings.
+The length used for matching is that of the string argument
+in the magic file.  This means that a line can match any string, and
+then presumably print that string, by doing
+.B >\e0
+(because all strings are greater than the null string).
+.IP message
+The message to be printed if the comparison succeeds.  If the string
+contains a
+.BR printf (3S)
+format specification, the value from the file (with any specified masking
+performed) is printed using the message as the format string.
+.PP
+Some file formats contain additional information which is to be printed
+along with the file type.  A line which begins with the character
+.B >
+indicates additional tests and messages to be printed.  The number of
+.B >
+on the line indicates the level of the test; a line with no
+.B >
+at the beginning is considered to be at level 0.
+Each line at level
+.IB n \(pl1
+is under the control of the line at level
+.IB n
+most closely preceding it in the magic file.
+If the test on a line at level
+.I n
+succeeds, the tests specified in all the subsequent lines at level
+.IB n \(pl1
+are performed, and the messages printed if the tests succeed.  The next
+line at level
+.I n
+terminates this.
+If the first character following the last
+.B >
+is a
+.B (
+then the string after the parenthesis is interpreted as an indirect offset.
+That means that the number after the parenthesis is used as an offset in
+the file. The value at that offset is read, and is used again as an offset
+in the file. Indirect offsets are of the form:
+.BI (( x [.[bslBSL]][+-][ y ]).
+The value of 
+.I x
+is used as an offset in the file. A byte, short or long is read at that offset
+depending on the 
+.B [bslBSL] 
+type specifier. The capitalized types interpret the number as a big endian
+value, whereas the small letter versions interpet the number as a little
+endian value. To that number the value of
+.I y
+is added and the result is used as an offset in the file. The default type
+if one is not specified is long.
+.PP
+Sometimes you do not know the exact offset as this depends on the length of
+preceding fields. You can specify an offset relative to the end of the
+last uplevel field (of course this may only be done for sublevel tests, i.e.
+test beginning with 
+.B >
+). Such a relative offset is specified using
+.B &
+as a prefix to the offset.
+.SH BUGS
+The formats 
+.IR long ,
+.IR belong ,
+.IR lelong ,
+.IR short ,
+.IR beshort ,
+.IR leshort ,
+.IR date ,
+.IR bedate ,
+and
+.I ledate
+are system-dependent; perhaps they should be specified as a number
+of bytes (2B, 4B, etc), 
+since the files being recognized typically come from
+a system on which the lengths are invariant.
+.PP
+There is (currently) no support for specified-endian data to be used in
+indirect offsets.
+.SH SEE ALSO
+.BR file (__CSECTION__)
+\- the command that reads this file.
+.\"
+.\" From: guy@sun.uucp (Guy Harris)
+.\" Newsgroups: net.bugs.usg
+.\" Subject: /etc/magic's format isn't well documented
+.\" Message-ID: <2752@sun.uucp>
+.\" Date: 3 Sep 85 08:19:07 GMT
+.\" Organization: Sun Microsystems, Inc.
+.\" Lines: 136
+.\" 
+.\" Here's a manual page for the format accepted by the "file" made by adding
+.\" the changes I posted to the S5R2 version.
+.\"
+.\" Modified for Ian Darwin's version of the file command.
+.\" @(#)Id: magic.man,v 1.17 2001/08/07 15:38:42 christos Exp 
diff --git a/file/magic.mime b/file/magic.mime
new file mode 100644 (file)
index 0000000..836942a
--- /dev/null
@@ -0,0 +1,543 @@
+# Magic data for KMimeMagic (originally for file(1) command)
+#
+# The format is 4-5 columns:
+#    Column #1: byte number to begin checking from, ">" indicates continuation
+#    Column #2: type of data to match
+#    Column #3: contents of data to match
+#    Column #4: MIME type of result
+#    Column #5: MIME encoding of result (optional)
+
+#------------------------------------------------------------------------------
+# Localstuff:  file(1) magic for locally observed files
+# Add any locally observed files here.
+
+#------------------------------------------------------------------------------
+# end local stuff
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# Java
+
+0      short           0xcafe
+>2     short           0xbabe          application/java
+
+#------------------------------------------------------------------------------
+# audio:  file(1) magic for sound formats
+#
+# from Jan Nicolai Langfeldt <janl@ifi.uio.no>,
+#
+
+# Sun/NeXT audio data
+0      string          .snd
+>12    belong          1               audio/basic
+>12    belong          2               audio/basic
+>12    belong          3               audio/basic
+>12    belong          4               audio/basic
+>12    belong          5               audio/basic
+>12    belong          6               audio/basic
+>12    belong          7               audio/basic
+
+>12    belong          23              audio/x-adpcm
+
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+# (0x0064732E in little-endian encoding).
+0      lelong          0x0064732E      
+>12    lelong          1               audio/x-dec-basic
+>12    lelong          2               audio/x-dec-basic
+>12    lelong          3               audio/x-dec-basic
+>12    lelong          4               audio/x-dec-basic
+>12    lelong          5               audio/x-dec-basic
+>12    lelong          6               audio/x-dec-basic
+>12    lelong          7               audio/x-dec-basic
+#                                       compressed (G.721 ADPCM)
+>12    lelong          23              audio/x-dec-adpcm
+
+# Bytes 0-3 of AIFF, AIFF-C, & 8SVX audio files are "FORM"
+#                                      AIFF audio data
+8      string          AIFF            audio/x-aiff    
+#                                      AIFF-C audio data
+8      string          AIFC            audio/x-aiff    
+#                                      IFF/8SVX audio data
+8      string          8SVX            audio/x-aiff    
+
+# Creative Labs AUDIO stuff
+#                                      Standard MIDI data
+0      string  MThd                    audio/unknown   
+#>9    byte    >0                      (format %d)
+#>11   byte    >1                      using %d channels
+#                                      Creative Music (CMF) data
+0      string  CTMF                    audio/unknown   
+#                                      SoundBlaster instrument data
+0      string  SBI                     audio/unknown   
+#                                      Creative Labs voice data
+0      string  Creative\ Voice\ File   audio/unknown   
+## is this next line right?  it came this way...
+#>19   byte    0x1A
+#>23   byte    >0                      - version %d
+#>22   byte    >0                      \b.%d
+
+# [GRR 950115:  is this also Creative Labs?  Guessing that first line
+#  should be string instead of unknown-endian long...]
+#0     long            0x4e54524b      MultiTrack sound data
+#0     string          NTRK            MultiTrack sound data
+#>4    long            x               - version %ld
+
+# Microsoft WAVE format (*.wav)
+# [GRR 950115:  probably all of the shorts and longs should be leshort/lelong]
+#                                      Microsoft RIFF
+0      string          RIFF            audio/unknown   
+#                                      - WAVE format
+>8     string          WAVE            audio/x-wav     
+>8     string          AVI             video/x-msvideo
+#
+0      belong          0x2e7261fd      application/x-realaudio
+
+# MPEG Layer 3 sound files
+# Modified the 11/20/97 at 15:59:04 by Christophe Prud'homme <christophe.prudhomme@asci.fr>
+0       belong          0xfffb          audio/x-mp3
+#MP3 with ID3 tag
+0      string          ID3             audio/x-mp3
+# Ogg/Vorbis
+0      string          OggS            audio/x-ogg
+
+#------------------------------------------------------------------------------
+# c-lang:  file(1) magic for C programs or various scripts
+#
+
+# XPM icons (Greg Roelofs, newt@uchicago.edu)
+# ideally should go into "images", but entries below would tag XPM as C source
+0      string          /*\ XPM         image/x-xpm     7bit
+
+# 3DS (3d Studio files)
+16     beshort         0x3d3d          image/x-3ds
+
+# this first will upset you if you're a PL/1 shop... (are there any left?)
+# in which case rm it; ascmagic will catch real C programs
+#                                      C or REXX program text
+#0     string          /*              text/x-c
+#                                      C++ program text
+#0     string          //              text/x-c++
+
+#------------------------------------------------------------------------------
+# commands:  file(1) magic for various shells and interpreters
+#
+#0       string          :\ shell archive or commands for antique kernel text
+0       string          #!/bin/sh               application/x-shellscript
+0       string          #!\ /bin/sh             application/x-shellscript
+0       string          #!/bin/csh              application/x-shellscript
+0       string          #!\ /bin/csh            application/x-shellscript
+# korn shell magic, sent by George Wu, gwu@clyde.att.com
+0       string          #!/bin/ksh              application/x-shellscript
+0       string          #!\ /bin/ksh            application/x-shellscript
+0       string          #!/bin/tcsh             application/x-shellscript
+0       string          #!\ /bin/tcsh           application/x-shellscript
+0       string          #!/usr/local/tcsh       application/x-shellscript
+0       string          #!\ /usr/local/tcsh     application/x-shellscript
+0       string          #!/usr/local/bin/tcsh   application/x-shellscript
+0       string          #!\ /usr/local/bin/tcsh application/x-shellscript
+# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de)
+0       string          #!/bin/bash                    application/x-shellscript
+0       string          #!\ /bin/bash           application/x-shellscript
+0       string          #!/usr/local/bin/bash   application/x-shellscript
+0       string          #!\ /usr/local/bin/bash application/x-shellscript
+
+#
+# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson)
+0       string          #!/usr/local/bin/zsh    application/x-shellscript
+0       string          #!\ /usr/local/bin/zsh  application/x-shellscript
+0       string          #!/usr/local/bin/ash    application/x-shellscript
+0       string          #!\ /usr/local/bin/ash  application/x-shellscript
+#0       string          #!/usr/local/bin/ae     Neil Brown's ae
+#0       string          #!\ /usr/local/bin/ae   Neil Brown's ae
+0       string          #!/bin/nawk             application/x-nawk
+0       string          #!\ /bin/nawk           application/x-nawk
+0       string          #!/usr/bin/nawk         application/x-nawk
+0       string          #!\ /usr/bin/nawk       application/x-nawk
+0       string          #!/usr/local/bin/nawk   application/x-nawk
+0       string          #!\ /usr/local/bin/nawk application/x-nawk
+0       string          #!/bin/gawk             application/x-gawk
+0       string          #!\ /bin/gawk           application/x-gawk
+0       string          #!/usr/bin/gawk         application/x-gawk
+0       string          #!\ /usr/bin/gawk       application/x-gawk
+0       string          #!/usr/local/bin/gawk   application/x-gawk
+0       string          #!\ /usr/local/bin/gawk application/x-gawk
+#
+0       string          #!/bin/awk              application/x-awk
+0       string          #!\ /bin/awk            application/x-awk
+0       string          #!/usr/bin/awk          application/x-awk
+0       string          #!\ /usr/bin/awk        application/x-awk
+0       string          BEGIN                   application/x-awk
+
+# For Larry Wall's perl language.  The ``eval'' line recognizes an
+# outrageously clever hack for USG systems.
+#                               Keith Waclena <keith@cerberus.uchicago.edu>
+0       string          #!/bin/perl                     application/x-perl
+0       string          #!\ /bin/perl                   application/x-perl
+0       string          eval\ "exec\ /bin/perl          application/x-perl
+0       string          #!/usr/bin/perl                 application/x-perl
+0       string          #!\ /usr/bin/perl               application/x-perl
+0       string          eval\ "exec\ /usr/bin/perl      application/x-perl
+0       string          #!/usr/local/bin/perl           application/x-perl
+0       string          #!\ /usr/local/bin/perl         application/x-perl
+0       string          eval\ "exec\ /usr/local/bin/perl application/x-perl
+
+#------------------------------------------------------------------------------
+# compress:  file(1) magic for pure-compression formats (no archives)
+#
+# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, whap, etc.
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+
+# standard unix compress
+0      string          \037\235        application/x-compress
+
+# gzip (GNU zip, not to be confused with [Info-ZIP/PKWARE] zip archiver)
+0       string          \037\213        application/x-gzip
+
+0              string                  PK\003\004              application/x-zip
+
+# According to gzip.h, this is the correct byte order for packed data.
+0      string          \037\036        application/octet-stream
+#
+# This magic number is byte-order-independent.
+#
+0      short           017437          application/octet-stream
+
+# XXX - why *two* entries for "compacted data", one of which is
+# byte-order independent, and one of which is byte-order dependent?
+#
+# compacted data
+0      short           0x1fff          application/octet-stream
+0      string          \377\037        application/octet-stream
+# huf output
+0      short           0145405         application/octet-stream
+
+# Squeeze and Crunch...
+# These numbers were gleaned from the Unix versions of the programs to
+# handle these formats.  Note that I can only uncrunch, not crunch, and
+# I didn't have a crunched file handy, so the crunch number is untested.
+#                              Keith Waclena <keith@cerberus.uchicago.edu>
+#0     leshort         0x76FF          squeezed data (CP/M, DOS)
+#0     leshort         0x76FE          crunched data (CP/M, DOS)
+
+# Freeze
+#0     string          \037\237        Frozen file 2.1
+#0     string          \037\236        Frozen file 1.0 (or gzip 0.5)
+
+# lzh?
+#0     string          \037\240        LZH compressed data
+
+257    string          ustar\0         application/x-tar       posix
+257    string          ustar\040\040\0         application/x-tar       gnu
+
+0      short           070707          application/x-cpio
+0      short           0143561         application/x-cpio      swapped
+
+0      string          =<ar>           application/x-archive
+0      string          !<arch>         application/x-archive
+>8     string          debian          application/x-debian-package
+
+#------------------------------------------------------------------------------
+#
+# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt@redhat.com)
+#
+0       beshort         0xedab
+>2      beshort         0xeedb          application/x-rpm
+
+0      lelong&0x8080ffff       0x0000081a      application/x-arc       lzw
+0      lelong&0x8080ffff       0x0000091a      application/x-arc       squashed
+0      lelong&0x8080ffff       0x0000021a      application/x-arc       uncompressed
+0      lelong&0x8080ffff       0x0000031a      application/x-arc       packed
+0      lelong&0x8080ffff       0x0000041a      application/x-arc       squeezed
+0      lelong&0x8080ffff       0x0000061a      application/x-arc       crunched
+
+0      leshort 0xea60  application/octet-stream        x-arj
+
+# LHARC/LHA archiver (Greg Roelofs, newt@uchicago.edu)
+2      string  -lh0-   application/x-lharc     lh0
+2      string  -lh1-   application/x-lharc     lh1
+2      string  -lz4-   application/x-lharc     lz4
+2      string  -lz5-   application/x-lharc     lz5
+#      [never seen any but the last; -lh4- reported in comp.compression:]
+2      string  -lzs-   application/x-lha       lzs
+2      string  -lh\ -  application/x-lha       lh
+2      string  -lhd-   application/x-lha       lhd
+2      string  -lh2-   application/x-lha       lh2
+2      string  -lh3-   application/x-lha       lh3
+2      string  -lh4-   application/x-lha       lh4
+2      string  -lh5-   application/x-lha       lh5
+2      string  -lh6-   application/x-lha       lh6
+2      string  -lh7-   application/x-lha       lh7
+# Shell archives
+10     string  #\ This\ is\ a\ shell\ archive  application/octet-stream        x-shell
+
+#------------------------------------------------------------------------------
+# frame:  file(1) magic for FrameMaker files
+#
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
+#
+0      string          \<MakerFile     application/x-frame
+0      string          \<MIFFile       application/x-frame
+0      string          \<MakerDictionary       application/x-frame
+0      string          \<MakerScreenFon        application/x-frame
+0      string          \<MML           application/x-frame
+0      string          \<Book          application/x-frame
+0      string          \<Maker         application/x-frame
+
+#------------------------------------------------------------------------------
+# html:  file(1) magic for HTML (HyperText Markup Language) docs
+#
+# from Daniel Quinlan <quinlan@yggdrasil.com>
+#
+0      string          \<HEAD  text/html
+0      string          \<head  text/html
+0      string          \<TITLE text/html
+0      string          \<title text/html
+0       string          \<html text/html
+0       string          \<HTML text/html
+0      string          \<!--   text/html
+0      string          \<h1    text/html
+0      string          \<H1    text/html
+0      string          \<!doctype\ HTML        text/html
+0      string          \<!DOCTYPE\ HTML        text/html
+0      string          \<!doctype\ html        text/html
+
+#------------------------------------------------------------------------------
+# images:  file(1) magic for image formats (see also "c-lang" for XPM bitmaps)
+#
+# originally from jef@helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl@ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# XXX - byte order for GIF and TIFF fields?
+# [GRR:  TIFF allows both byte orders; GIF is probably little-endian]
+#
+
+# [GRR:  what the hell is this doing in here?]
+#0     string          xbtoa           btoa'd file
+
+# PBMPLUS
+#                                      PBM file
+0      string          P1              image/x-portable-bitmap 7bit
+#                                      PGM file
+0      string          P2              image/x-portable-greymap        7bit
+#                                      PPM file
+0      string          P3              image/x-portable-pixmap 7bit
+#                                      PBM "rawbits" file
+0      string          P4              image/x-portable-bitmap
+#                                      PGM "rawbits" file
+0      string          P5              image/x-portable-greymap
+#                                      PPM "rawbits" file
+0      string          P6              image/x-portable-pixmap
+
+# NIFF (Navy Interchange File Format, a modification of TIFF)
+# [GRR:  this *must* go before TIFF]
+0      string          IIN1            image/x-niff
+
+# TIFF and friends
+#                                      TIFF file, big-endian
+0      string          MM              image/tiff
+#                                      TIFF file, little-endian
+0      string          II              image/tiff
+
+# possible GIF replacements; none yet released!
+# (Greg Roelofs, newt@uchicago.edu)
+#
+# GRR 950115:  this was mine ("Zip GIF"):
+#                                      ZIF image (GIF+deflate alpha)
+0      string          GIF94z          image/unknown
+#
+# GRR 950115:  this is Jeremy Wohl's Free Graphics Format (better):
+#                                      FGF image (GIF+deflate beta)
+0      string          FGF95a          image/unknown
+#
+# GRR 950115:  this is Thomas Boutell's Portable Bitmap Format proposal
+# (best; not yet implemented):
+#                                      PBF image (deflate compression)
+0      string          PBF             image/unknown
+
+# GIF
+0      string          GIF             image/gif
+
+# JPEG images
+0      beshort         0xffd8          image/jpeg
+
+# PC bitmaps (OS/2, Windoze BMP files)  (Greg Roelofs, newt@uchicago.edu)
+0      string          BM              image/bmp
+#>14   byte            12              (OS/2 1.x format)
+#>14   byte            64              (OS/2 2.x format)
+#>14   byte            40              (Windows 3.x format)
+#0     string          IC              icon
+#0     string          PI              pointer
+#0     string          CI              color icon
+#0     string          CP              color pointer
+#0     string          BA              bitmap array
+
+
+#------------------------------------------------------------------------------
+# lisp:  file(1) magic for lisp programs
+#
+# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string  ;;                      text/plain      8bit
+# Emacs 18 - this is always correct, but not very magical.
+0      string  \012(                   application/x-elc
+# Emacs 19
+0      string  ;ELC\023\000\000\000    application/x-elc
+
+#------------------------------------------------------------------------------
+# mail.news:  file(1) magic for mail and news
+#
+# There are tests to ascmagic.c to cope with mail and news.
+0      string          Relay-Version:  message/rfc822  7bit
+0      string          #!\ rnews       message/rfc822  7bit
+0      string          N#!\ rnews      message/rfc822  7bit
+0      string          Forward\ to     message/rfc822  7bit
+0      string          Pipe\ to        message/rfc822  7bit
+0      string          Return-Path:    message/rfc822  7bit
+0      string          Path:           message/news    8bit
+0      string          Xref:           message/news    8bit
+0      string          From:           message/rfc822  7bit
+0      string          Article         message/news    8bit
+#------------------------------------------------------------------------------
+# msword: file(1) magic for MS Word files
+#
+# Contributor claims:
+# Reversed-engineered MS Word magic numbers
+#
+
+0      string          \376\067\0\043                  application/msword
+0      string          \320\317\021\340\241\261        application/msword
+0      string          \333\245-\0\0\0                 application/msword
+
+
+
+#------------------------------------------------------------------------------
+# printer:  file(1) magic for printer-formatted files
+#
+
+# PostScript
+0      string          %!              application/postscript
+0      string          \004%!          application/postscript
+
+# Acrobat
+# (due to clamen@cs.cmu.edu)
+0      string          %PDF-           application/pdf
+
+#------------------------------------------------------------------------------
+# sc:  file(1) magic for "sc" spreadsheet
+#
+38     string          Spreadsheet     application/x-sc
+
+#------------------------------------------------------------------------------
+# tex:  file(1) magic for TeX files
+#
+# XXX - needs byte-endian stuff (big-endian and little-endian DVI?)
+#
+# From <conklin@talisman.kaleida.com>
+
+# Although we may know the offset of certain text fields in TeX DVI
+# and font files, we can't use them reliably because they are not
+# zero terminated. [but we do anyway, christos]
+0      string          \367\002        application/x-dvi
+#0     string          \367\203        TeX generic font data
+#0     string          \367\131        TeX packed font data
+#0     string          \367\312        TeX virtual font data
+#0     string          This\ is\ TeX,  TeX transcript text     
+#0     string          This\ is\ METAFONT,     METAFONT transcript text
+
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2      string          \000\021        application/x-tex-tfm
+2      string          \000\022        application/x-tex-tfm
+#>34   string          >\0             (%s)
+
+# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com)
+#0     string          \\input\ texinfo        Texinfo source text
+#0     string          This\ is\ Info\ file    GNU Info text
+
+# correct TeX magic for Linux (and maybe more)
+# from Peter Tobias (tobias@server.et-inf.fho-emden.de)
+#
+0      leshort         0x02f7          application/x-dvi
+
+# RTF - Rich Text Format
+0      string          {\\rtf          text/rtf
+
+#------------------------------------------------------------------------------
+# animation:  file(1) magic for animation/movie formats
+#
+# animation formats, originally from vax@ccwf.cc.utexas.edu (VaX#n8)
+#                                              MPEG file
+0      belong          0x000001b3                      video/mpeg
+0      belong          0x000001ba                      video/mpeg
+# FLI animation format
+0      leshort         0xAF11                          video/fli
+# FLC animation format
+0      leshort         0xAF12                          video/flc
+# AVI
+>8     string          AVI\                            video/avi
+#
+# SGI and Apple formats
+#
+0      string          MOVI                            video/sgi
+4      string          moov                            video/quicktime moov
+4      string          mdat                            video/quicktime mdat
+# The contributor claims:
+#   I couldn't find a real magic number for these, however, this
+#   -appears- to work.  Note that it might catch other files, too,
+#   so BE CAREFUL!
+#
+# Note that title and author appear in the two 20-byte chunks
+# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
+# 255 (hex FF)! DL format SUCKS BIG ROCKS.
+#
+#                                              DL file version 1 , medium format (160x100, 4 images/screen)
+0      byte            1                       video/unknown
+0      byte            2                       video/unknown
+#
+# Databases
+#
+# GDBM magic numbers
+#  Will be maintained as part of the GDBM distribution in the future.
+#  <downsj@teeny.org>
+0       belong  0x13579ace      application/x-gdbm
+0       lelong  0x13579ace      application/x-gdbm
+0       string  GDBM            application/x-gdbm
+#
+0       belong  0x061561        application/x-dbm
+#
+# Executables
+#
+0       string          \177ELF 
+>4      byte            0
+>4      byte            1
+>4      byte            2
+>5      byte            0
+>5      byte            1
+>>16    leshort         0
+>>16    leshort         1               application/x-object
+>>16    leshort         2               application/x-executable
+>>16    leshort         3               application/x-sharedlib
+>>16    leshort         4               application/x-coredump
+#
+# DOS
+0              string                  MZ                              application/x-dosexec
+#
+# KDE
+0              string  [KDE\ Desktop\ Entry]   application/x-kdelnk
+0              string  \#\ KDE\ Config\ File   application/x-kdelnk
+# xmcd database file for kscd
+0              string  \#\ xmcd                text/xmcd
+
+#------------------------------------------------------------------------------
+# pkgadd:  file(1) magic for SysV R4 PKG Datastreams
+#
+0       string          #\ PaCkAgE\ DaTaStReAm  application/x-svr4-package
+
+#PNG Image Format
+0      string          \x89PNG                 image/png
diff --git a/file/magic2mime b/file/magic2mime
new file mode 100755 (executable)
index 0000000..45796bb
--- /dev/null
@@ -0,0 +1,68 @@
+#! /usr/local/bin/perl
+# -*- PERL -*-
+# Id: magic2mime,v 1.1 1998/02/15 23:18:53 christos Exp 
+# Copyright (c) 1996, 1997 vax@linkdead.paranoia.com (VaX#n8)
+#
+# Usage: echo 'your-file-output-here' | file_to_ctype.pl
+#        file -b files... | file_to_ctype.pl
+# It acts like a filter, reading from STDIN and any files on the command
+# line, printing to STDOUT.
+
+## refs
+# http://www.faqs.org/faqs/mail/mime-faq/part1/index.html
+#  comp.mail.mime FAQ
+# ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types
+#  assigned content-types
+# ftp://ftp.uu.net/inet/rfc/rfc-index
+#  RFC index; search for MIME
+
+@mapping =
+(
+       # defaults
+    'data', 'application/octet-stream',
+    'text', 'text/plain',
+       # more specific
+       '^Rich Text Format data', 'text/richtext',
+       '^HTML document text', 'text/html',
+       '^exported SGML document text', 'text/sgml',
+       'mail text', 'message/rfc822',
+       'news text', 'message/news',
+       '^PostScript document text', 'application/postscript',
+       '^BinHex binary text', 'application/mac-binhex40',
+       '^Zip archive data', 'application/zip',
+       '^Microsoft Word', 'application/msword',
+       '^PGP key', 'application/pgp-keys',
+       '^PGP encrypted', 'application/pgp-encrypted',
+       '^PGP armored data signature', 'application/pgp-signature',
+    '^JPEG image', 'image/jpeg',
+    '^GIF image', 'image/gif',
+       '^PNG image', 'image/png',
+    '^TIFF image', 'image/tiff',
+       'Computer Graphics Metafile', 'image/cgf',
+       '^Sun/NeXT audio data', 'audio/basic',
+    '^MPEG', 'video/mpeg',
+    '^Apple QuickTime movie', 'video/quicktime',
+       # made up by me
+    '^bitmap', 'image/x-bitmap',
+    '^PC bitmap data, Windows 3.x format', 'image/x-msw3bmp',
+    '^FLI', 'video/x-fli',
+    '^FLC', 'video/x-flc',
+    'AVI data', 'video/x-avi',
+    'WAVE', 'audio/x-wav',
+    'VOC', 'audio/x-voc',
+);
+
+local($mimetype,$index,$regexp);
+while (<>)
+  {
+    chop;
+    $index = $#mapping - 1;
+    while ($index > -1 && !defined($mimetype))
+      {
+         $mimetype = $mapping[$index + 1] if (/$mapping[$index]/);
+         $index -= 2;
+      }
+    print "$mimetype\n";
+       undef $mimetype; # hack
+  }
+0;
diff --git a/file/missing b/file/missing
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/file/mkinstalldirs b/file/mkinstalldirs
new file mode 100644 (file)
index 0000000..1fdcd90
--- /dev/null
@@ -0,0 +1,39 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# Id: mkinstalldirs,v 1.2 2000/11/13 00:30:49 christos Exp 
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
diff --git a/file/names.h b/file/names.h
new file mode 100644 (file)
index 0000000..4dd53eb
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Names.h - names and types used by ascmagic in file(1).
+ * These tokens are here because they can appear anywhere in
+ * the first HOWMANY bytes, while tokens in /etc/magic must
+ * appear at fixed offsets into the file. Don't make HOWMANY
+ * too high unless you have a very fast CPU.
+ *
+ * Copyright (c) Ian F. Darwin, 1987.
+ * Written by Ian F. Darwin.
+ *
+ * See LEGAL.NOTICE
+ *
+ * Id: names.h,v 1.18 2000/08/05 17:36:49 christos Exp 
+ */
+
+/*
+       modified by Chris Lowth - 9 April 2000
+       to add mime type strings to the types table.
+*/
+
+/* these types are used to index the table 'types': keep em in sync! */
+#define        L_C     0               /* first and foremost on UNIX */
+#define        L_CC    1               /* Bjarne's postincrement */
+#define        L_FORT  2               /* the oldest one */
+#define        L_MAKE  3               /* Makefiles */
+#define        L_PLI   4               /* PL/1 */
+#define        L_MACH  5               /* some kinda assembler */
+#define        L_ENG   6               /* English */
+#define        L_PAS   7               /* Pascal */
+#define        L_MAIL  8               /* Electronic mail */
+#define        L_NEWS  9               /* Usenet Netnews */
+#define        L_JAVA  10              /* Java code */
+#define        L_HTML  11              /* HTML */
+#define        L_BCPL  12              /* BCPL */
+#define        L_M4    13              /* M4 */
+
+static const struct {
+       char *human;
+       char *mime;
+} types[] = {
+       { "C program",                                  "text/x-c", },
+       { "C++ program",                                "text/x-c++" },
+       { "FORTRAN program",                            "text/x-fortran" },
+       { "make commands",                              "text/x-makefile" },
+       { "PL/1 program",                               "text/x-pl1" },
+       { "assembler program",                          "text/x-asm" },
+       { "English",                                    "text/plain, English" },
+       { "Pascal program",                             "text/x-pascal" },
+       { "mail",                                       "text/x-mail" },
+       { "news",                                       "text/x-news" },
+       { "Java program",                               "text/x-java" },
+       { "HTML document",                              "text/html", },
+       { "BCPL program",                               "text/x-bcpl" },
+       { "M4 macro language pre-processor",            "text/x-m4" },
+       { "can't happen error on names.h/types",        "error/x-error" },
+       { 0, 0}
+};
+
+/*
+ * XXX - how should we distinguish Java from C++?
+ * The trick used in a Debian snapshot, of having "extends" or "implements"
+ * as tags for Java, doesn't work very well, given that those keywords
+ * are often preceded by "class", which flags it as C++.
+ *
+ * Perhaps we need to be able to say
+ *
+ *     If "class" then
+ *
+ *             if "extends" or "implements" then
+ *                     Java
+ *             else
+ *                     C++
+ *     endif
+ *
+ * Or should we use other keywords, such as "package" or "import"?
+ * Unfortunately, Ada95 uses "package", and Modula-3 uses "import",
+ * although I infer from the language spec at
+ *
+ *     http://www.research.digital.com/SRC/m3defn/html/m3.html
+ *
+ * that Modula-3 uses "IMPORT" rather than "import", i.e. it must be
+ * in all caps.
+ *
+ * So, for now, we go with "import".  We must put it before the C++
+ * stuff, so that we don't misidentify Java as C++.  Not using "package"
+ * means we won't identify stuff that defines a package but imports
+ * nothing; hopefully, very little Java code imports nothing (one of the
+ * reasons for doing OO programming is to import as much as possible
+ * and write only what you need to, right?).
+ *
+ * Unfortunately, "import" may cause us to misidentify English text
+ * as Java, as it comes after "the" and "The".  Perhaps we need a fancier
+ * heuristic to identify Java?
+ */
+static struct names {
+       const char *name;
+       short type;
+} names[] = {
+       /* These must be sorted by eye for optimal hit rate */
+       /* Add to this list only after substantial meditation */
+       {"dnl",         L_M4},
+       {"import",      L_JAVA},
+       {"\"libhdr\"",  L_BCPL},
+       {"\"LIBHDR\"",  L_BCPL},
+       {"//",          L_CC},
+       {"template",    L_CC},
+       {"virtual",     L_CC},
+       {"class",       L_CC},
+       {"public:",     L_CC},
+       {"private:",    L_CC},
+       {"/*",          L_C},   /* must precede "The", "the", etc. */
+       {"#include",    L_C},
+       {"char",        L_C},
+       {"The",         L_ENG},
+       {"the",         L_ENG},
+       {"double",      L_C},
+       {"extern",      L_C},
+       {"float",       L_C},
+       {"struct",      L_C},
+       {"union",       L_C},
+       {"CFLAGS",      L_MAKE},
+       {"LDFLAGS",     L_MAKE},
+       {"all:",        L_MAKE},
+       {".PRECIOUS",   L_MAKE},
+/* Too many files of text have these words in them.  Find another way
+ * to recognize Fortrash.
+ */
+#ifdef NOTDEF
+       {"subroutine",  L_FORT},
+       {"function",    L_FORT},
+       {"block",       L_FORT},
+       {"common",      L_FORT},
+       {"dimension",   L_FORT},
+       {"integer",     L_FORT},
+       {"data",        L_FORT},
+#endif /*NOTDEF*/
+       {".ascii",      L_MACH},
+       {".asciiz",     L_MACH},
+       {".byte",       L_MACH},
+       {".even",       L_MACH},
+       {".globl",      L_MACH},
+       {".text",       L_MACH},
+       {"clr",         L_MACH},
+       {"(input,",     L_PAS},
+       {"dcl",         L_PLI},
+       {"Received:",   L_MAIL},
+       {">From",       L_MAIL},
+       {"Return-Path:",L_MAIL},
+       {"Cc:",         L_MAIL},
+       {"Newsgroups:", L_NEWS},
+       {"Path:",       L_NEWS},
+       {"Organization:",L_NEWS},
+       {"href=",       L_HTML},
+       {"HREF=",       L_HTML},
+       {"<body",       L_HTML},
+       {"<BODY",       L_HTML},
+       {NULL,          0}
+};
+#define NNAMES ((sizeof(names)/sizeof(struct names)) - 1)
diff --git a/file/patchlevel.h b/file/patchlevel.h
new file mode 100644 (file)
index 0000000..8e0f5e4
--- /dev/null
@@ -0,0 +1,219 @@
+#define        FILE_VERSION_MAJOR      3
+#define        patchlevel              37
+
+/*
+ * Patchlevel file for Ian Darwin's MAGIC command.
+ * Id: patchlevel.h,v 1.37 2001/09/03 14:44:22 christos Exp 
+ *
+ * Log: patchlevel.h,v 
+ * Revision 1.37  2001/09/03 14:44:22  christos
+ * daylight/tm_isdst detection
+ * magic fixes
+ * don't eat the whole file if it has only nulls
+ *
+ * Revision 1.36  2001/07/22 21:04:15  christos
+ * - magic fixes
+ * - add new operators, pascal strings, UTC date printing, $HOME/.magic
+ *   [from "Tom N Harris" <telliamed@mac.com>]
+ *
+ * Revision 1.35  2001/04/24 14:40:25  christos
+ * - rename magic file sgi to mips and fix it
+ * - add support for building magic.mgc
+ * - portability fixes for mmap()
+ * - try gzip before uncompress, because uncompress sometimes hangs
+ * - be more conservative about pipe reads and writes
+ * - many magic fixes
+ *
+ * Revision 1.34  2001/03/12 05:05:57  christos
+ * - new compiled magic format
+ * - lots of magic additions
+ *
+ * Revision 1.33  2000/11/13 00:30:50  christos
+ * - wordperfect magic fix: freebsd pr 9388
+ * - more msdos fixes from freebsd pr's 20131 and 20812
+ * - sas and spss magic [Bruce Foster]
+ * - mkinstalldirs [John Fremlin]
+ * - sgi opengl fixes [Michael Pruett]
+ * - netbsd magic fixes [Ignatios Souvatzis]
+ * - audio additions [Michael Pruett]
+ * - fix problem with non ansi RCSID [Andreas Ley]
+ * - oggs magic [Felix von Leitner]
+ * - gmon magic [Eugen Dedu]
+ * - TNEF magic [Joomy]
+ * - netpbm magic and misc other image stuff [Bryan Henderson]
+ *
+ * Revision 1.32  2000/08/05 18:24:18  christos
+ * Correct indianness detection in elf (Charles Hannum)
+ * FreeBSD elf core support (Guy Harris)
+ * Use gzip in systems that don't have uncompress (Anthon van der Neut)
+ * Internationalization/EBCDIC support (Eric Fisher)
+ * Many many magic changes
+ *
+ * Revision 1.31  2000/05/14 17:58:36  christos
+ * - new magic for claris files
+ * - new magic for mathematica and maple files
+ * - new magic for msvc files
+ * - new -k flag to keep going matching all possible entries
+ * - add the word executable on #! magic files, and fix the usage of
+ *   the word script
+ * - lots of other magic fixes
+ * - fix typo test -> text
+ *
+ * Revision 1.30  2000/04/11 02:41:17  christos
+ * - add support for mime output (-i)
+ * - make sure we free memory in case realloc fails
+ * - magic fixes
+ *
+ * Revision 1.29  1999/11/28 20:02:29  christos
+ * new string/[Bcb] magic from anthon, and adjustments to the magic files to
+ * use it.
+ *
+ * Revision 1.28  1999/10/31 22:11:48  christos
+ * - add "char" type for compatibility with HP/UX
+ * - recognize HP/UX syntax &=n etc.
+ * - include errno.h for CYGWIN
+ * - conditionalize the S_IS* macros
+ * - revert the SHT_DYNSYM test that broke the linux stripped binaries test
+ * - lots of Magdir changes
+ *
+ * Revision 1.27  1999/02/14 17:21:41  christos
+ * Automake support and misc cleanups from Rainer Orth
+ * Enable reading character and block special files from Dale R. Worley
+ *
+ * Revision 1.26  1998/09/12 13:19:39  christos
+ * - add support for bi-endian indirect offsets (Richard Verhoeven)
+ * - add recognition for bcpl (Joseph Myers)
+ * - remove non magic files from Magdir to avoid difficulties building
+ *   on os2 where files are case independent
+ * - magic fixes.
+ *
+ * Revision 1.25  1998/06/27 14:04:04  christos
+ * OLF patch Guy Harris
+ * Recognize java/html (debian linux)
+ * Const poisoning (debian linux)
+ * More magic!
+ *
+ * Revision 1.24  1998/02/15 23:20:38  christos
+ * Autoconf patch: Felix von Leitner <leitner@math.fu-berlin.de>
+ * More magic fixes
+ * Elf64 fixes
+ *
+ * Revision 1.23  1997/11/05 16:03:37  christos
+ * - correct elf prps offset for SunOS-2.5.1 [guy@netapp.com]
+ * - handle 64 bit time_t's correctly [ewt@redhat.com]
+ * - new mime style magic [clarosse@netvista.net]
+ * - new TI calculator magic [rmcguire@freenet.columbus.oh.us]
+ * - new figlet fonts [obrien@freebsd.org]
+ * - new cisco magic, and elf fixes [jhawk@bbnplanet.com]
+ * - -b flag addition, and x86 filesystem magic [vax@linkhead.paranoia.com]
+ * - s/Mpeg/MPEG, header and elf typo fixes [guy@netapp.com]
+ * - Windows/NT registry files, audio code [guy@netapp.com]
+ * - libGrx graphics lib fonts [guy@netapp.com]
+ * - PNG fixes [guy@netapp.com]
+ * - more m$ document magic [guy@netapp.com]
+ * - PPD files [guy@netapp.com]
+ * - archive magic cleanup [guy@netapp.com]
+ * - linux kernel magic cleanup [guy@netapp.com]
+ * - lecter magic [guy@netapp.com]
+ * - vgetty magic [guy@netapp.com]
+ * - sniffer additions [guy@netapp.com]
+ *
+ * Revision 1.22  1997/01/15 17:23:24  christos
+ * - add support for elf core files: find the program name under SVR4 [Ken Pizzini]
+ * - print strings only up to the first carriage return [various]
+ * - freebsd international ascii support [J Wunsch]
+ * - magic fixes and additions [Guy Harris]
+ * - 64 bit fixes [Larry Schwimmer]
+ * - support for both utime and utimes, but don't restore file access times
+ *   by default [various]
+ * - \xXX only takes 2 hex digits, not 3.
+ * - re-implement support for core files [Guy Harris]
+ *
+ * Revision 1.21  1996/10/05 18:15:29  christos
+ * Segregate elf stuff and conditionally enable it with -DBUILTIN_ELF
+ * More magic fixes
+ *
+ * Revision 1.20  1996/06/22  22:15:52  christos
+ * - support relative offsets of the form >&
+ * - fix bug with truncating magic strings that contain \n
+ * - file -f - did not read from stdin as documented
+ * - support elf file parsing using our own elf support.
+ * - as always magdir fixes and additions.
+ *
+ * Revision 1.19  1995/10/27  23:14:46  christos
+ * Ability to parse colon separated list of magic files
+ * New LEGAL.NOTICE
+ * Various magic file changes
+ *
+ * Revision 1.18  1995/05/20  22:09:21  christos
+ * Passed incorrect argument to eatsize().
+ * Use %ld and %lx where appropriate.
+ * Remove unused variables
+ * ELF support for both big and little endian
+ * Fixes for small files again.
+ *
+ * Revision 1.17  1995/04/28  17:29:13  christos
+ * - Incorrect nroff detection fix from der Mouse
+ * - Lost and incorrect magic entries.
+ * - Added ELF stripped binary detection [in C; ugh]
+ * - Look for $MAGIC to find the magic file.
+ * - Eat trailing size specifications from numbers i.e. ignore 10L
+ * - More fixes for very short files
+ *
+ * Revision 1.16  1995/03/25  22:06:45  christos
+ * - use strtoul() where it exists.
+ * - fix sign-extend bug
+ * - try to detect tar archives before nroff files, otherwise
+ *   tar files where the first file starts with a . will not work
+ *
+ * Revision 1.15  1995/01/21  21:03:35  christos
+ * Added CSECTION for the file man page
+ * Added version flag -v
+ * Fixed bug with -f input flag (from iorio@violet.berkeley.edu)
+ * Lots of magic fixes and reorganization...
+ *
+ * Revision 1.14  1994/05/03  17:58:23  christos
+ * changes from mycroft@gnu.ai.mit.edu (Charles Hannum) for unsigned
+ *
+ * Revision 1.13  1994/01/21  01:27:01  christos
+ * Fixed null termination bug from Don Seeley at BSDI in ascmagic.c
+ *
+ * Revision 1.12  1993/10/27  20:59:05  christos
+ * Changed -z flag to understand gzip format too.
+ * Moved builtin compression detection to a table, and move
+ * the compress magic entry out of the source.
+ * Made printing of numbers unsigned, and added the mask to it.
+ * Changed the buffer size to 8k, because gzip will refuse to
+ * unzip just a few bytes.
+ *
+ * Revision 1.11  1993/09/24  18:49:06  christos
+ * Fixed small bug in softmagic.c introduced by
+ * copying the data to be examined out of the input
+ * buffer. Changed the Makefile to use sed to create
+ * the correct man pages.
+ *
+ * Revision 1.10  1993/09/23  21:56:23  christos
+ * Passed purify. Fixed indirections. Fixed byte order printing.
+ * Fixed segmentation faults caused by referencing past the end
+ * of the magic buffer. Fixed bus errors caused by referencing
+ * unaligned shorts or longs.
+ *
+ * Revision 1.9  1993/03/24  14:23:40  ian
+ * Batch of minor changes from several contributors.
+ *
+ * Revision 1.8  93/02/19  15:01:26  ian
+ * Numerous changes from Guy Harris too numerous to mention but including
+ * byte-order independance, fixing "old-style masking", etc. etc. A bugfix
+ * for broken symlinks from martin@@d255s004.zfe.siemens.de.
+ * 
+ * Revision 1.7  93/01/05  14:57:27  ian
+ * Couple of nits picked by Christos (again, thanks).
+ * 
+ * Revision 1.6  93/01/05  13:51:09  ian
+ * Lotsa work on the Magic directory.
+ * 
+ * Revision 1.5  92/09/14  14:54:51  ian
+ * Fix a tiny null-pointer bug in previous fix for tar archive + uncompress.
+ * 
+ */
+
diff --git a/file/print.c b/file/print.c
new file mode 100644 (file)
index 0000000..f562c66
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * print.c - debugging printout routines
+ *
+ * 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.
+ */
+
+#include "file.h"
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#ifdef __STDC__
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <time.h>
+
+#ifndef lint
+FILE_RCSID("@(#)Id: print.c,v 1.34 2001/08/07 16:01:26 christos Exp ")
+#endif  /* lint */
+
+#define SZOF(a)        (sizeof(a) / sizeof(a[0]))
+
+void
+mdump(m)
+       struct magic *m;
+{
+       static const char *typ[] = { "invalid", "byte", "short", "invalid",
+                                    "long", "string", "date", "beshort",
+                                    "belong", "bedate", "leshort", "lelong",
+                                    "ledate", "pstring", "ldate", "beldate",
+                                    "leldate" };
+       static const char optyp[] = { '@', '&', '|', '^', '+', '-', 
+                                     '*', '/', '%' };
+       (void) fputc('[', stderr);
+       (void) fprintf(stderr, ">>>>>>>> %d" + 8 - (m->cont_level & 7),
+                      m->offset);
+
+       if (m->flag & INDIR) {
+               (void) fprintf(stderr, "(%s,",
+                              /* Note: type is unsigned */
+                              (m->in_type < SZOF(typ)) ? 
+                                       typ[m->in_type] : "*bad*");
+               if (m->in_op & OPINVERSE)
+                       (void) fputc('~', stderr);
+               (void) fprintf(stderr, "%c%d),",
+                              ((m->in_op&0x7F) < SZOF(optyp)) ? 
+                                       optyp[m->in_op&0x7F] : '?',
+                               m->in_offset);
+       }
+       (void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "",
+                      /* Note: type is unsigned */
+                      (m->type < SZOF(typ)) ? typ[m->type] : "*bad*");
+       if (m->mask_op & OPINVERSE)
+               (void) fputc('~', stderr);
+       if (m->mask) {
+               ((m->mask_op&0x7F) < SZOF(optyp)) ? 
+                       (void) fputc(optyp[m->mask_op&0x7F], stderr) :
+                       (void) fputc('?', stderr);
+               if(STRING != m->type || PSTRING != m->type)
+                       (void) fprintf(stderr, "%.8x", m->mask);
+               else {
+                       if (m->mask & STRING_IGNORE_LOWERCASE) 
+                               (void) fputc(CHAR_IGNORE_LOWERCASE, stderr);
+                       if (m->mask & STRING_COMPACT_BLANK) 
+                               (void) fputc(CHAR_COMPACT_BLANK, stderr);
+                       if (m->mask & STRING_COMPACT_OPTIONAL_BLANK) 
+                               (void) fputc(CHAR_COMPACT_OPTIONAL_BLANK,
+                               stderr);
+               }
+       }
+
+       (void) fprintf(stderr, ",%c", m->reln);
+
+       if (m->reln != 'x') {
+               switch (m->type) {
+               case BYTE:
+               case SHORT:
+               case LONG:
+               case LESHORT:
+               case LELONG:
+               case BESHORT:
+               case BELONG:
+                       (void) fprintf(stderr, "%d", m->value.l);
+                       break;
+               case STRING:
+               case PSTRING:
+                       showstr(stderr, m->value.s, -1);
+                       break;
+               case DATE:
+               case LEDATE:
+               case BEDATE:
+                       (void)fprintf(stderr, "%s,", fmttime(m->value.l, 1));
+                       break;
+               case LDATE:
+               case LELDATE:
+               case BELDATE:
+                       (void)fprintf(stderr, "%s,", fmttime(m->value.l, 0));
+                       break;
+               default:
+                       (void) fputs("*bad*", stderr);
+                       break;
+               }
+       }
+       (void) fprintf(stderr, ",\"%s\"]\n", m->desc);
+}
+
+/*
+ * ckfputs - fputs, but with error checking
+ * ckfprintf - fprintf, but with error checking
+ */
+void
+ckfputs(str, fil)      
+       const char *str;
+       FILE *fil;
+{
+       if (fputs(str,fil) == EOF)
+               error("write failed.\n");
+}
+
+/*VARARGS*/
+void
+#ifdef __STDC__
+ckfprintf(FILE *f, const char *fmt, ...)
+#else
+ckfprintf(va_alist)
+       va_dcl
+#endif
+{
+       va_list va;
+#ifdef __STDC__
+       va_start(va, fmt);
+#else
+       FILE *f;
+       const char *fmt;
+       va_start(va);
+       f = va_arg(va, FILE *);
+       fmt = va_arg(va, const char *);
+#endif
+       (void) vfprintf(f, fmt, va);
+       if (ferror(f))
+               error("write failed.\n");
+       va_end(va);
+}
+
+/*
+ * error - print best error message possible and exit
+ */
+/*VARARGS*/
+void
+#ifdef __STDC__
+error(const char *f, ...)
+#else
+error(va_alist)
+       va_dcl
+#endif
+{
+       va_list va;
+#ifdef __STDC__
+       va_start(va, f);
+#else
+       const char *f;
+       va_start(va);
+       f = va_arg(va, const char *);
+#endif
+       /* cuz we use stdout for most, stderr here */
+       (void) fflush(stdout); 
+
+       if (progname != NULL) 
+               (void) fprintf(stderr, "%s: ", progname);
+       (void) vfprintf(stderr, f, va);
+       va_end(va);
+       exit(1);
+}
+
+/*VARARGS*/
+void
+#ifdef __STDC__
+magwarn(const char *f, ...)
+#else
+magwarn(va_alist)
+       va_dcl
+#endif
+{
+       va_list va;
+#ifdef __STDC__
+       va_start(va, f);
+#else
+       const char *f;
+       va_start(va);
+       f = va_arg(va, const char *);
+#endif
+       /* cuz we use stdout for most, stderr here */
+       (void) fflush(stdout); 
+
+       if (progname != NULL) 
+               (void) fprintf(stderr, "%s: %s, %d: ", 
+                              progname, magicfile, lineno);
+       (void) vfprintf(stderr, f, va);
+       va_end(va);
+       fputc('\n', stderr);
+}
+
+
+char *
+fmttime(v, local)
+       long v;
+       int local;
+{
+       char *pp, *rt;
+       time_t t = (time_t)v;
+       struct tm *tm;
+
+       if (local) {
+               pp = ctime(&t);
+       } else {
+#ifndef HAVE_DAYLIGHT
+               static int daylight = 0;
+#ifdef HAVE_TM_ISDST
+               static time_t now = (time_t)0;
+
+               if (now == (time_t)0) {
+                       struct tm *tm1;
+                       (void)time(&now);
+                       tm1 = localtime(&now);
+                       daylight = tm1->tm_isdst;
+               }
+#endif /* HAVE_TM_ISDST */
+#endif /* HAVE_DAYLIGHT */
+               if (daylight)
+                       t += 3600;
+               tm = gmtime(&t);
+               pp = asctime(tm);
+       }
+
+       if ((rt = strchr(pp, '\n')) != NULL)
+               *rt = '\0';
+       return pp;
+}
diff --git a/file/readelf.c b/file/readelf.c
new file mode 100644 (file)
index 0000000..b455675
--- /dev/null
@@ -0,0 +1,515 @@
+#include "file.h"
+
+#ifdef BUILTIN_ELF
+#include <sys/types.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <errno.h>
+
+#include "readelf.h"
+
+#ifndef lint
+FILE_RCSID("@(#)Id: readelf.c,v 1.17 2000/08/05 19:00:12 christos Exp ")
+#endif
+
+#ifdef ELFCORE
+static void dophn_core __P((int, int, int, off_t, int, size_t));
+#endif
+static void dophn_exec __P((int, int, int, off_t, int, size_t));
+static void doshn __P((int, int, int, off_t, int, size_t));
+
+static uint16_t getu16 __P((int, int));
+static uint32_t getu32 __P((int, uint32_t));
+static uint64_t getu64 __P((int, uint64_t));
+
+static uint16_t
+getu16(swap, value)
+       int swap;
+       uint16_t value;
+{
+       union {
+               uint16_t ui;
+               char c[2];
+       } retval, tmpval;
+
+       if (swap) {
+               tmpval.ui = value;
+
+               retval.c[0] = tmpval.c[1];
+               retval.c[1] = tmpval.c[0];
+               
+               return retval.ui;
+       } else
+               return value;
+}
+
+static uint32_t
+getu32(swap, value)
+       int swap;
+       uint32_t value;
+{
+       union {
+               uint32_t ui;
+               char c[4];
+       } retval, tmpval;
+
+       if (swap) {
+               tmpval.ui = value;
+
+               retval.c[0] = tmpval.c[3];
+               retval.c[1] = tmpval.c[2];
+               retval.c[2] = tmpval.c[1];
+               retval.c[3] = tmpval.c[0];
+               
+               return retval.ui;
+       } else
+               return value;
+}
+
+static uint64_t
+getu64(swap, value)
+       int swap;
+       uint64_t value;
+{
+       union {
+               uint64_t ui;
+               char c[8];
+       } retval, tmpval;
+
+       if (swap) {
+               tmpval.ui = value;
+
+               retval.c[0] = tmpval.c[7];
+               retval.c[1] = tmpval.c[6];
+               retval.c[2] = tmpval.c[5];
+               retval.c[3] = tmpval.c[4];
+               retval.c[4] = tmpval.c[3];
+               retval.c[5] = tmpval.c[2];
+               retval.c[6] = tmpval.c[1];
+               retval.c[7] = tmpval.c[0];
+               
+               return retval.ui;
+       } else
+               return value;
+}
+
+#define sh_addr                (class == ELFCLASS32            \
+                        ? (void *) &sh32               \
+                        : (void *) &sh64)
+#define shs_type       (class == ELFCLASS32            \
+                        ? getu32(swap, sh32.sh_type)   \
+                        : getu32(swap, sh64.sh_type))
+#define ph_addr                (class == ELFCLASS32            \
+                        ? (void *) &ph32               \
+                        : (void *) &ph64)
+#define ph_type                (class == ELFCLASS32            \
+                        ? getu32(swap, ph32.p_type)    \
+                        : getu32(swap, ph64.p_type))
+#define ph_offset      (class == ELFCLASS32            \
+                        ? getu32(swap, ph32.p_offset)  \
+                        : getu64(swap, ph64.p_offset))
+#define nh_size                (class == ELFCLASS32            \
+                        ? sizeof *nh32                 \
+                        : sizeof *nh64)
+#define nh_type                (class == ELFCLASS32            \
+                        ? getu32(swap, nh32->n_type)   \
+                        : getu32(swap, nh64->n_type))
+#define nh_namesz      (class == ELFCLASS32            \
+                        ? getu32(swap, nh32->n_namesz) \
+                        : getu32(swap, nh64->n_namesz))
+#define nh_descsz      (class == ELFCLASS32            \
+                        ? getu32(swap, nh32->n_descsz) \
+                        : getu32(swap, nh64->n_descsz))
+#define prpsoffsets(i) (class == ELFCLASS32            \
+                        ? prpsoffsets32[i]             \
+                        : prpsoffsets64[i])
+
+static void
+doshn(class, swap, fd, off, num, size)
+       int class;
+       int swap;
+       int fd;
+       off_t off;
+       int num;
+       size_t size;
+{
+       Elf32_Shdr sh32;
+       Elf64_Shdr sh64;
+
+       if (lseek(fd, off, SEEK_SET) == -1)
+               error("lseek failed (%s).\n", strerror(errno));
+
+       for ( ; num; num--) {
+               if (read(fd, sh_addr, size) == -1)
+                       error("read failed (%s).\n", strerror(errno));
+               if (shs_type == SHT_SYMTAB /* || shs_type == SHT_DYNSYM */) {
+                       (void) printf (", not stripped");
+                       return;
+               }
+       }
+       (void) printf (", stripped");
+}
+
+/*
+ * Look through the program headers of an executable image, searching
+ * for a PT_INTERP section; if one is found, it's dynamically linked,
+ * otherwise it's statically linked.
+ */
+static void
+dophn_exec(class, swap, fd, off, num, size)
+       int class;
+       int swap;
+       int fd;
+       off_t off;
+       int num;
+       size_t size;
+{
+       Elf32_Phdr ph32;
+       Elf64_Phdr ph64;
+       char *linking_style = "statically";
+       char *shared_libraries = "";
+
+       if (lseek(fd, off, SEEK_SET) == -1)
+               error("lseek failed (%s).\n", strerror(errno));
+
+       for ( ; num; num--) {
+               if (read(fd, ph_addr, size) == -1)
+                       error("read failed (%s).\n", strerror(errno));
+
+               switch (ph_type) {
+               case PT_DYNAMIC:
+                       linking_style = "dynamically";
+                       break;
+               case PT_INTERP:
+                       shared_libraries = " (uses shared libs)";
+                       break;
+               }
+       }
+       printf(", %s linked%s", linking_style, shared_libraries);
+}
+
+#ifdef ELFCORE
+size_t prpsoffsets32[] = {
+       8,              /* FreeBSD */
+       28,             /* Linux 2.0.36 */
+       32,             /* Linux (I forget which kernel version) */
+       84,             /* SunOS 5.x */
+};
+
+size_t prpsoffsets64[] = {
+       120,            /* SunOS 5.x, 64-bit */
+};
+
+#define        NOFFSETS32      (sizeof prpsoffsets32 / sizeof prpsoffsets32[0])
+#define NOFFSETS64     (sizeof prpsoffsets64 / sizeof prpsoffsets64[0])
+
+#define NOFFSETS       (class == ELFCLASS32 ? NOFFSETS32 : NOFFSETS64)
+
+/*
+ * Look through the program headers of an executable image, searching
+ * for a PT_NOTE section of type NT_PRPSINFO, with a name "CORE" or
+ * "FreeBSD"; if one is found, try looking in various places in its
+ * contents for a 16-character string containing only printable
+ * characters - if found, that string should be the name of the program
+ * that dropped core.  Note: right after that 16-character string is,
+ * at least in SunOS 5.x (and possibly other SVR4-flavored systems) and
+ * Linux, a longer string (80 characters, in 5.x, probably other
+ * SVR4-flavored systems, and Linux) containing the start of the
+ * command line for that program.
+ *
+ * The signal number probably appears in a section of type NT_PRSTATUS,
+ * but that's also rather OS-dependent, in ways that are harder to
+ * dissect with heuristics, so I'm not bothering with the signal number.
+ * (I suppose the signal number could be of interest in situations where
+ * you don't have the binary of the program that dropped core; if you
+ * *do* have that binary, the debugger will probably tell you what
+ * signal it was.)
+ */
+static void
+dophn_core(class, swap, fd, off, num, size)
+       int class;
+       int swap;
+       int fd;
+       off_t off;
+       int num;
+       size_t size;
+{
+       Elf32_Phdr ph32;
+       Elf32_Nhdr *nh32;
+       Elf64_Phdr ph64;
+       Elf64_Nhdr *nh64;
+       size_t offset, nameoffset, noffset, reloffset;
+       unsigned char c;
+       int i, j;
+       char nbuf[BUFSIZ];
+       int bufsize;
+       int is_freebsd;
+
+       /*
+        * Loop through all the program headers.
+        */
+       for ( ; num; num--) {
+               if (lseek(fd, off, SEEK_SET) == -1)
+                       error("lseek failed (%s).\n", strerror(errno));
+               if (read(fd, ph_addr, size) == -1)
+                       error("read failed (%s).\n", strerror(errno));
+               off += size;
+               if (ph_type != PT_NOTE)
+                       continue;
+
+               /*
+                * This is a PT_NOTE section; loop through all the notes
+                * in the section.
+                */
+               if (lseek(fd, (off_t) ph_offset, SEEK_SET) == -1)
+                       error("lseek failed (%s).\n", strerror(errno));
+               bufsize = read(fd, nbuf, BUFSIZ);
+               if (bufsize == -1)
+                       error(": " "read failed (%s).\n", strerror(errno));
+               offset = 0;
+               for (;;) {
+                       if (offset >= bufsize)
+                               break;
+                       if (class == ELFCLASS32)
+                               nh32 = (Elf32_Nhdr *)&nbuf[offset];
+                       else
+                               nh64 = (Elf64_Nhdr *)&nbuf[offset];
+                       offset += nh_size;
+
+                       /*
+                        * Check whether this note has the name "CORE" or
+                        * "FreeBSD".
+                        */
+                       if (offset + nh_namesz >= bufsize) {
+                               /*
+                                * We're past the end of the buffer.
+                                */
+                               break;
+                       }
+
+                       nameoffset = offset;
+                       offset += nh_namesz;
+                       offset = ((offset + 3)/4)*4;
+
+                       /*
+                        * Sigh.  The 2.0.36 kernel in Debian 2.1, at
+                        * least, doesn't correctly implement name
+                        * sections, in core dumps, as specified by
+                        * the "Program Linking" section of "UNIX(R) System
+                        * V Release 4 Programmer's Guide: ANSI C and
+                        * Programming Support Tools", because my copy
+                        * clearly says "The first 'namesz' bytes in 'name'
+                        * contain a *null-terminated* [emphasis mine]
+                        * character representation of the entry's owner
+                        * or originator", but the 2.0.36 kernel code
+                        * doesn't include the terminating null in the
+                        * name....
+                        */
+                       if ((nh_namesz == 4 &&
+                             strncmp(&nbuf[nameoffset], "CORE", 4) == 0) ||
+                           (nh_namesz == 5 &&
+                             strcmp(&nbuf[nameoffset], "CORE") == 0))
+                               is_freebsd = 0;
+                       else if ((nh_namesz == 8 &&
+                             strcmp(&nbuf[nameoffset], "FreeBSD") == 0))
+                               is_freebsd = 1;
+                       else
+                               continue;
+                       if (nh_type == NT_PRPSINFO) {
+                               /*
+                                * Extract the program name.  We assume
+                                * it to be 16 characters (that's what it
+                                * is in SunOS 5.x and Linux).
+                                *
+                                * Unfortunately, it's at a different offset
+                                * in varous OSes, so try multiple offsets.
+                                * If the characters aren't all printable,
+                                * reject it.
+                                */
+                               for (i = 0; i < NOFFSETS; i++) {
+                                       reloffset = prpsoffsets(i);
+                                       noffset = offset + reloffset;
+                                       for (j = 0; j < 16;
+                                           j++, noffset++, reloffset++) {
+                                               /*
+                                                * Make sure we're not past
+                                                * the end of the buffer; if
+                                                * we are, just give up.
+                                                */
+                                               if (noffset >= bufsize)
+                                                       goto tryanother;
+
+                                               /*
+                                                * Make sure we're not past
+                                                * the end of the contents;
+                                                * if we are, this obviously
+                                                * isn't the right offset.
+                                                */
+                                               if (reloffset >= nh_descsz)
+                                                       goto tryanother;
+
+                                               c = nbuf[noffset];
+                                               if (c == '\0') {
+                                                       /*
+                                                        * A '\0' at the
+                                                        * beginning is
+                                                        * obviously wrong.
+                                                        * Any other '\0'
+                                                        * means we're done.
+                                                        */
+                                                       if (j == 0)
+                                                               goto tryanother;
+                                                       else
+                                                               break;
+                                               } else {
+                                                       /*
+                                                        * A nonprintable
+                                                        * character is also
+                                                        * wrong.
+                                                        */
+#define isquote(c) (strchr("'\"`", (c)) != NULL)
+                                                       if (!isprint(c) ||
+                                                            isquote(c))
+                                                               goto tryanother;
+                                               }
+                                       }
+
+                                       /*
+                                        * Well, that worked.
+                                        */
+                                       printf(", from '%.16s'",
+                                           &nbuf[offset + prpsoffsets(i)]);
+                                       break;
+
+                               tryanother:
+                                       ;
+                               }
+                               break;
+                       }
+                       offset += nh_descsz;
+                       offset = ((offset + 3)/4)*4;
+               }
+       }
+}
+#endif
+
+void
+tryelf(fd, buf, nbytes)
+       int fd;
+       unsigned char *buf;
+       int nbytes;
+{
+       union {
+               int32 l;
+               char c[sizeof (int32)];
+       } u;
+       int class;
+       int swap;
+
+       /*
+        * ELF executables have multiple section headers in arbitrary
+        * file locations and thus file(1) cannot determine it from easily.
+        * Instead we traverse thru all section headers until a symbol table
+        * one is found or else the binary is stripped.
+        */
+       if (buf[EI_MAG0] != ELFMAG0
+           || (buf[EI_MAG1] != ELFMAG1 && buf[EI_MAG1] != OLFMAG1)
+           || buf[EI_MAG2] != ELFMAG2 || buf[EI_MAG3] != ELFMAG3)
+           return;
+
+
+       class = buf[4];
+
+       if (class == ELFCLASS32) {
+               Elf32_Ehdr elfhdr;
+               if (nbytes <= sizeof (Elf32_Ehdr))
+                       return;
+
+
+               u.l = 1;
+               (void) memcpy(&elfhdr, buf, sizeof elfhdr);
+               swap = (u.c[sizeof(int32) - 1] + 1) != elfhdr.e_ident[5];
+
+               if (getu16(swap, elfhdr.e_type) == ET_CORE) 
+#ifdef ELFCORE
+                       dophn_core(class, swap,
+                                  fd,
+                                  getu32(swap, elfhdr.e_phoff),
+                                  getu16(swap, elfhdr.e_phnum), 
+                                  getu16(swap, elfhdr.e_phentsize));
+#else
+                       ;
+#endif
+               else {
+                       if (getu16(swap, elfhdr.e_type) == ET_EXEC) {
+                               dophn_exec(class, swap,
+                                          fd,
+                                          getu32(swap, elfhdr.e_phoff),
+                                          getu16(swap, elfhdr.e_phnum), 
+                                          getu16(swap, elfhdr.e_phentsize));
+                       }
+                       doshn(class, swap,
+                             fd,
+                             getu32(swap, elfhdr.e_shoff),
+                             getu16(swap, elfhdr.e_shnum),
+                             getu16(swap, elfhdr.e_shentsize));
+               }
+               return;
+       }
+
+        if (class == ELFCLASS64) {
+               Elf64_Ehdr elfhdr;
+               if (nbytes <= sizeof (Elf64_Ehdr))
+                       return;
+
+
+               u.l = 1;
+               (void) memcpy(&elfhdr, buf, sizeof elfhdr);
+               swap = (u.c[sizeof(int32) - 1] + 1) != elfhdr.e_ident[5];
+
+               if (getu16(swap, elfhdr.e_type) == ET_CORE) 
+#ifdef ELFCORE
+                       dophn_core(class, swap,
+                                  fd,
+#ifdef USE_ARRAY_FOR_64BIT_TYPES
+                                  getu32(swap, elfhdr.e_phoff[1]),
+#else
+                                  getu64(swap, elfhdr.e_phoff),
+#endif
+                                  getu16(swap, elfhdr.e_phnum), 
+                                  getu16(swap, elfhdr.e_phentsize));
+#else
+                       ;
+#endif
+               else
+               {
+                       if (getu16(swap, elfhdr.e_type) == ET_EXEC) {
+                               dophn_exec(class, swap,
+                                          fd,
+#ifdef USE_ARRAY_FOR_64BIT_TYPES
+                                          getu32(swap, elfhdr.e_phoff[1]),
+#else
+                                          getu64(swap, elfhdr.e_phoff),
+#endif
+                                          getu16(swap, elfhdr.e_phnum), 
+                                          getu16(swap, elfhdr.e_phentsize));
+                       }
+                       doshn(class, swap,
+                             fd,
+#ifdef USE_ARRAY_FOR_64BIT_TYPES
+                             getu32(swap, elfhdr.e_shoff[1]),
+#else
+                             getu64(swap, elfhdr.e_shoff),
+#endif
+                             getu16(swap, elfhdr.e_shnum),
+                             getu16(swap, elfhdr.e_shentsize));
+               }
+               return;
+       }
+}
+#endif
diff --git a/file/readelf.h b/file/readelf.h
new file mode 100644 (file)
index 0000000..4fb5d68
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * readelf.h 
+ * @(#)Id: readelf.h,v 1.7 1999/02/14 17:16:11 christos Exp 
+ *
+ * Provide elf data structures for non-elf machines, allowing file
+ * non-elf hosts to determine if an elf binary is stripped.
+ * Note: cobbled from the linux header file, with modifications
+ */
+#ifndef __fake_elf_h__
+#define __fake_elf_h__
+
+typedef uint32_t       Elf32_Addr;
+typedef uint32_t       Elf32_Off;
+typedef uint16_t       Elf32_Half;
+typedef uint32_t       Elf32_Word;
+typedef uint8_t                Elf32_Char;
+
+#if SIZEOF_UINT64_T != 8
+#define USE_ARRAY_FOR_64BIT_TYPES
+typedef        uint32_t        Elf64_Addr[2];
+typedef        uint32_t        Elf64_Off[2];
+typedef uint32_t       Elf64_Xword[2];
+#else
+typedef        uint64_t        Elf64_Addr;
+typedef        uint64_t        Elf64_Off;
+typedef uint64_t       Elf64_Xword;
+#endif
+typedef uint16_t       Elf64_Half;
+typedef uint32_t       Elf64_Word;
+typedef uint8_t                Elf64_Char;
+
+#define EI_NIDENT      16
+
+typedef struct {
+    Elf32_Char e_ident[EI_NIDENT];
+    Elf32_Half e_type;
+    Elf32_Half e_machine;
+    Elf32_Word e_version;
+    Elf32_Addr e_entry;  /* Entry point */
+    Elf32_Off  e_phoff;
+    Elf32_Off  e_shoff;
+    Elf32_Word e_flags;
+    Elf32_Half e_ehsize;
+    Elf32_Half e_phentsize;
+    Elf32_Half e_phnum;
+    Elf32_Half e_shentsize;
+    Elf32_Half e_shnum;
+    Elf32_Half e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct {
+    Elf64_Char e_ident[EI_NIDENT];
+    Elf64_Half e_type;
+    Elf64_Half e_machine;
+    Elf64_Word e_version;
+    Elf64_Addr e_entry;  /* Entry point */
+    Elf64_Off  e_phoff;
+    Elf64_Off  e_shoff;
+    Elf64_Word e_flags;
+    Elf64_Half e_ehsize;
+    Elf64_Half e_phentsize;
+    Elf64_Half e_phnum;
+    Elf64_Half e_shentsize;
+    Elf64_Half e_shnum;
+    Elf64_Half e_shstrndx;
+} Elf64_Ehdr;
+
+/* e_type */
+#define ET_EXEC                2
+#define ET_CORE                4
+
+/* sh_type */
+#define SHT_SYMTAB     2
+#define SHT_NOTE       7
+#define SHT_DYNSYM     11
+
+/* elf type */
+#define ELFDATANONE    0               /* e_ident[EI_DATA] */
+#define ELFDATA2LSB    1
+#define ELFDATA2MSB    2
+
+/* elf class */
+#define ELFCLASSNONE   0
+#define ELFCLASS32     1
+#define ELFCLASS64     2
+
+/* magic number */
+#define        EI_MAG0         0               /* e_ident[] indexes */
+#define        EI_MAG1         1
+#define        EI_MAG2         2
+#define        EI_MAG3         3
+#define        EI_CLASS        4
+#define        EI_DATA         5
+#define        EI_VERSION      6
+#define        EI_PAD          7
+
+#define        ELFMAG0         0x7f            /* EI_MAG */
+#define        ELFMAG1         'E'
+#define        ELFMAG2         'L'
+#define        ELFMAG3         'F'
+#define        ELFMAG          "\177ELF"
+
+#define        OLFMAG1         'O'
+#define        OLFMAG          "\177OLF"
+
+typedef struct {
+    Elf32_Word p_type;
+    Elf32_Off  p_offset;
+    Elf32_Addr p_vaddr;
+    Elf32_Addr p_paddr;
+    Elf32_Word p_filesz;
+    Elf32_Word p_memsz;
+    Elf32_Word p_flags;
+    Elf32_Word p_align;
+} Elf32_Phdr;
+
+typedef struct {
+    Elf64_Word p_type;
+    Elf64_Word p_flags;
+    Elf64_Off  p_offset;
+    Elf64_Addr p_vaddr;
+    Elf64_Addr p_paddr;
+    Elf64_Xword        p_filesz;
+    Elf64_Xword        p_memsz;
+    Elf64_Xword        p_align;
+} Elf64_Phdr;
+
+#define        PT_NULL         0               /* p_type */
+#define        PT_LOAD         1
+#define        PT_DYNAMIC      2
+#define        PT_INTERP       3
+#define        PT_NOTE         4
+#define        PT_SHLIB        5
+#define        PT_PHDR         6
+#define        PT_NUM          7
+
+typedef struct {
+    Elf32_Word sh_name;
+    Elf32_Word sh_type;
+    Elf32_Word sh_flags;
+    Elf32_Addr sh_addr;
+    Elf32_Off  sh_offset;
+    Elf32_Word sh_size;
+    Elf32_Word sh_link;
+    Elf32_Word sh_info;
+    Elf32_Word sh_addralign;
+    Elf32_Word sh_entsize;
+} Elf32_Shdr;
+
+typedef struct {
+    Elf64_Word sh_name;
+    Elf64_Word sh_type;
+    Elf64_Off  sh_flags;
+    Elf64_Addr sh_addr;
+    Elf64_Off  sh_offset;
+    Elf64_Off  sh_size;
+    Elf64_Word sh_link;
+    Elf64_Word sh_info;
+    Elf64_Off  sh_addralign;
+    Elf64_Off  sh_entsize;
+} Elf64_Shdr;
+
+/* Notes used in ET_CORE */
+#define NT_PRSTATUS    1
+#define NT_PRFPREG     2
+#define NT_PRPSINFO    3
+#define NT_TASKSTRUCT  4
+
+/* Note header in a PT_NOTE section */
+typedef struct elf_note {
+    Elf32_Word n_namesz;       /* Name size */
+    Elf32_Word n_descsz;       /* Content size */
+    Elf32_Word n_type;         /* Content type */
+} Elf32_Nhdr;
+
+typedef struct {
+    Elf64_Word n_namesz;
+    Elf64_Word n_descsz;
+    Elf64_Word n_type;
+} Elf64_Nhdr;
+
+#define        NT_PRSTATUS     1
+#define        NT_PRFPREG      2
+#define        NT_PRPSINFO     3
+#define        NT_PRXREG       4
+#define        NT_PLATFORM     5
+#define        NT_AUXV         6
+
+#endif
diff --git a/file/softmagic.c b/file/softmagic.c
new file mode 100644 (file)
index 0000000..4be8504
--- /dev/null
@@ -0,0 +1,1099 @@
+/*
+ * softmagic - interpret variable magic from MAGIC
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/types.h>
+
+#include "file.h"
+
+#ifndef        lint
+FILE_RCSID("@(#)Id: softmagic.c,v 1.46 2001/07/23 00:02:32 christos Exp ")
+#endif /* lint */
+
+static int match       __P((struct magic *, uint32, unsigned char *, int));
+static int mget                __P((union VALUETYPE *,
+                            unsigned char *, struct magic *, int));
+static int mcheck      __P((union VALUETYPE *, struct magic *));
+static int32 mprint    __P((union VALUETYPE *, struct magic *));
+static void mdebug     __P((int32, char *, int));
+static int mconvert    __P((union VALUETYPE *, struct magic *));
+
+extern int kflag;
+
+/*
+ * softmagic - lookup one file in database 
+ * (already read from /etc/magic by apprentice.c).
+ * Passed the name and FILE * of one file to be typed.
+ */
+/*ARGSUSED1*/          /* nbytes passed for regularity, maybe need later */
+int
+softmagic(buf, nbytes)
+       unsigned char *buf;
+       int nbytes;
+{
+       struct mlist *ml;
+
+       for (ml = mlist.next; ml != &mlist; ml = ml->next)
+               if (match(ml->magic, ml->nmagic, buf, nbytes))
+                       return 1;
+
+       return 0;
+}
+
+/*
+ * Go through the whole list, stopping if you find a match.  Process all
+ * the continuations of that match before returning.
+ *
+ * We support multi-level continuations:
+ *
+ *     At any time when processing a successful top-level match, there is a
+ *     current continuation level; it represents the level of the last
+ *     successfully matched continuation.
+ *
+ *     Continuations above that level are skipped as, if we see one, it
+ *     means that the continuation that controls them - i.e, the
+ *     lower-level continuation preceding them - failed to match.
+ *
+ *     Continuations below that level are processed as, if we see one,
+ *     it means we've finished processing or skipping higher-level
+ *     continuations under the control of a successful or unsuccessful
+ *     lower-level continuation, and are now seeing the next lower-level
+ *     continuation and should process it.  The current continuation
+ *     level reverts to the level of the one we're seeing.
+ *
+ *     Continuations at the current level are processed as, if we see
+ *     one, there's no lower-level continuation that may have failed.
+ *
+ *     If a continuation matches, we bump the current continuation level
+ *     so that higher-level continuations are processed.
+ */
+static int
+match(magic, nmagic, s, nbytes)
+       struct magic *magic;
+       uint32 nmagic;
+       unsigned char   *s;
+       int nbytes;
+{
+       int magindex = 0;
+       int cont_level = 0;
+       int need_separator = 0;
+       union VALUETYPE p;
+       static int32 *tmpoff = NULL;
+       static size_t tmplen = 0;
+       int32 oldoff = 0;
+       int returnval = 0; /* if a match is found it is set to 1*/
+       int firstline = 1; /* a flag to print X\n  X\n- X */
+
+       if (tmpoff == NULL)
+               if ((tmpoff = (int32 *) malloc(tmplen = 20)) == NULL)
+                       error("out of memory\n");
+
+       for (magindex = 0; magindex < nmagic; magindex++) {
+               /* if main entry matches, print it... */
+               if (!mget(&p, s, &magic[magindex], nbytes) ||
+                   !mcheck(&p, &magic[magindex])) {
+                           /* 
+                            * main entry didn't match,
+                            * flush its continuations
+                            */
+                           while (magindex < nmagic &&
+                                  magic[magindex + 1].cont_level != 0)
+                                  magindex++;
+                           continue;
+               }
+
+               if (! firstline) { /* we found another match */
+                       /* put a newline and '-' to do some simple formatting*/
+                       printf("\n- ");
+               }
+
+               tmpoff[cont_level] = mprint(&p, &magic[magindex]);
+               /*
+                * If we printed something, we'll need to print
+                * a blank before we print something else.
+                */
+               if (magic[magindex].desc[0])
+                       need_separator = 1;
+               /* and any continuations that match */
+               if (++cont_level >= tmplen)
+                       if ((tmpoff = (int32 *) realloc(tmpoff,
+                                                      tmplen += 20)) == NULL)
+                               error("out of memory\n");
+               while (magic[magindex+1].cont_level != 0 && 
+                      ++magindex < nmagic) {
+                       if (cont_level >= magic[magindex].cont_level) {
+                               if (cont_level > magic[magindex].cont_level) {
+                                       /*
+                                        * We're at the end of the level
+                                        * "cont_level" continuations.
+                                        */
+                                       cont_level = magic[magindex].cont_level;
+                               }
+                               if (magic[magindex].flag & OFFADD) {
+                                       oldoff=magic[magindex].offset;
+                                       magic[magindex].offset +=
+                                           tmpoff[cont_level-1];
+                               }
+                               if (mget(&p, s, &magic[magindex], nbytes) &&
+                                   mcheck(&p, &magic[magindex])) {
+                                       /*
+                                        * This continuation matched.
+                                        * Print its message, with
+                                        * a blank before it if
+                                        * the previous item printed
+                                        * and this item isn't empty.
+                                        */
+                                       /* space if previous printed */
+                                       if (need_separator
+                                          && (magic[magindex].nospflag == 0)
+                                          && (magic[magindex].desc[0] != '\0')
+                                          ) {
+                                               (void) putchar(' ');
+                                               need_separator = 0;
+                                       }
+                                       tmpoff[cont_level] =
+                                           mprint(&p, &magic[magindex]);
+                                       if (magic[magindex].desc[0])
+                                               need_separator = 1;
+
+                                       /*
+                                        * If we see any continuations
+                                        * at a higher level,
+                                        * process them.
+                                        */
+                                       if (++cont_level >= tmplen)
+                                               if ((tmpoff = 
+                                                   (int32 *) realloc(tmpoff,
+                                                   tmplen += 20)) == NULL)
+                                                       error("out of memory\n");
+                               }
+                               if (magic[magindex].flag & OFFADD) {
+                                        magic[magindex].offset = oldoff;
+                               }
+                       }
+               }
+               firstline = 0;
+               returnval = 1;
+               if (!kflag) {
+                       return 1; /* don't keep searching */
+               }                       
+       }
+       return returnval;  /* This is hit if -k is set or there is no match */
+}
+
+static int32
+mprint(p, m)
+       union VALUETYPE *p;
+       struct magic *m;
+{
+       uint32 v;
+       int32 t=0 ;
+
+
+       switch (m->type) {
+       case BYTE:
+               v = signextend(m, p->b);
+               (void) printf(m->desc, (unsigned char) v);
+               t = m->offset + sizeof(char);
+               break;
+
+       case SHORT:
+       case BESHORT:
+       case LESHORT:
+               v = signextend(m, p->h);
+               (void) printf(m->desc, (unsigned short) v);
+               t = m->offset + sizeof(short);
+               break;
+
+       case LONG:
+       case BELONG:
+       case LELONG:
+               v = signextend(m, p->l);
+               (void) printf(m->desc, (uint32) v);
+               t = m->offset + sizeof(int32);
+               break;
+
+       case STRING:
+       case PSTRING:
+               if (m->reln == '=') {
+                       (void) printf(m->desc, m->value.s);
+                       t = m->offset + strlen(m->value.s);
+               }
+               else {
+                       if (*m->value.s == '\0') {
+                               char *cp = strchr(p->s,'\n');
+                               if (cp)
+                                       *cp = '\0';
+                       }
+                       (void) printf(m->desc, p->s);
+                       t = m->offset + strlen(p->s);
+               }
+               break;
+
+       case DATE:
+       case BEDATE:
+       case LEDATE:
+               (void) printf(m->desc, fmttime(p->l, 1));
+               t = m->offset + sizeof(time_t);
+               break;
+
+       case LDATE:
+       case BELDATE:
+       case LELDATE:
+               (void) printf(m->desc, fmttime(p->l, 0));
+               t = m->offset + sizeof(time_t);
+               break;
+
+       default:
+               error("invalid m->type (%d) in mprint().\n", m->type);
+               /*NOTREACHED*/
+       }
+       return(t);
+}
+
+/*
+ * Convert the byte order of the data we are looking at
+ * While we're here, let's apply the mask operation
+ * (unless you have a better idea)
+ */
+static int
+mconvert(p, m)
+       union VALUETYPE *p;
+       struct magic *m;
+{
+       switch (m->type) {
+       case BYTE:
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->b &= m->mask;
+                               break;
+                       case OPOR:
+                               p->b |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->b ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->b += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->b -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->b *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->b /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->b %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->b = ~p->b;
+               return 1;
+       case SHORT:
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->h &= m->mask;
+                               break;
+                       case OPOR:
+                               p->h |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->h ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->h += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->h -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->h *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->h /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->h %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->h = ~p->h;
+               return 1;
+       case LONG:
+       case DATE:
+       case LDATE:
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->l &= m->mask;
+                               break;
+                       case OPOR:
+                               p->l |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->l ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->l += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->l -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->l *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->l /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->l %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->l = ~p->l;
+               return 1;
+       case STRING:
+               {
+                       int n;
+
+                       /* Null terminate and eat *trailing* return */
+                       p->s[sizeof(p->s) - 1] = '\0';
+                       n = strlen(p->s) - 1;
+                       if (p->s[n] == '\n')
+                               p->s[n] = '\0';
+                       return 1;
+               }
+       case PSTRING:
+               {
+                       char *ptr1 = p->s, *ptr2 = ptr1 + 1;
+                       int n = *p->s;
+                       if (n >= sizeof(p->s))
+                               n = sizeof(p->s) - 1;
+                       while (n--)
+                               *ptr1++ = *ptr2++;
+                       *ptr1 = '\0';
+                       n = strlen(p->s) - 1;
+                       if (p->s[n] == '\n')
+                               p->s[n] = '\0';
+                       return 1;
+               }
+       case BESHORT:
+               p->h = (short)((p->hs[0]<<8)|(p->hs[1]));
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->h &= m->mask;
+                               break;
+                       case OPOR:
+                               p->h |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->h ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->h += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->h -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->h *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->h /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->h %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->h = ~p->h;
+               return 1;
+       case BELONG:
+       case BEDATE:
+       case BELDATE:
+               p->l = (int32)
+                   ((p->hl[0]<<24)|(p->hl[1]<<16)|(p->hl[2]<<8)|(p->hl[3]));
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->l &= m->mask;
+                               break;
+                       case OPOR:
+                               p->l |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->l ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->l += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->l -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->l *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->l /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->l %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->l = ~p->l;
+               return 1;
+       case LESHORT:
+               p->h = (short)((p->hs[1]<<8)|(p->hs[0]));
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->h &= m->mask;
+                               break;
+                       case OPOR:
+                               p->h |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->h ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->h += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->h -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->h *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->h /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->h %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->h = ~p->h;
+               return 1;
+       case LELONG:
+       case LEDATE:
+       case LELDATE:
+               p->l = (int32)
+                   ((p->hl[3]<<24)|(p->hl[2]<<16)|(p->hl[1]<<8)|(p->hl[0]));
+               if (m->mask)
+                       switch (m->mask_op&0x7F) {
+                       case OPAND:
+                               p->l &= m->mask;
+                               break;
+                       case OPOR:
+                               p->l |= m->mask;
+                               break;
+                       case OPXOR:
+                               p->l ^= m->mask;
+                               break;
+                       case OPADD:
+                               p->l += m->mask;
+                               break;
+                       case OPMINUS:
+                               p->l -= m->mask;
+                               break;
+                       case OPMULTIPLY:
+                               p->l *= m->mask;
+                               break;
+                       case OPDIVIDE:
+                               p->l /= m->mask;
+                               break;
+                       case OPMODULO:
+                               p->l %= m->mask;
+                               break;
+                       }
+               if (m->mask_op & OPINVERSE)
+                       p->l = ~p->l;
+               return 1;
+       default:
+               error("invalid type %d in mconvert().\n", m->type);
+               return 0;
+       }
+}
+
+
+static void
+mdebug(offset, str, len)
+       int32 offset;
+       char *str;
+       int len;
+{
+       (void) fprintf(stderr, "mget @%d: ", offset);
+       showstr(stderr, (char *) str, len);
+       (void) fputc('\n', stderr);
+       (void) fputc('\n', stderr);
+}
+
+static int
+mget(p, s, m, nbytes)
+       union VALUETYPE* p;
+       unsigned char   *s;
+       struct magic *m;
+       int nbytes;
+{
+       int32 offset = m->offset;
+
+       if (offset + sizeof(union VALUETYPE) <= nbytes)
+               memcpy(p, s + offset, sizeof(union VALUETYPE));
+       else {
+               /*
+                * the usefulness of padding with zeroes eludes me, it
+                * might even cause problems
+                */
+               int32 have = nbytes - offset;
+               memset(p, 0, sizeof(union VALUETYPE));
+               if (have > 0)
+                       memcpy(p, s + offset, have);
+       }
+
+
+       if (debug) {
+               mdebug(offset, (char *) p, sizeof(union VALUETYPE));
+               mdump(m);
+       }
+
+       if (m->flag & INDIR) {
+
+               switch (m->in_type) {
+               case BYTE:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = p->b & m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = p->b | m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = p->b ^ m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = p->b + m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = p->b - m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = p->b * m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = p->b / m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = p->b % m->in_offset;
+                                       break;
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               case BESHORT:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) &
+                                                m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) |
+                                                m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) ^
+                                                m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) +
+                                                m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) -
+                                                m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) *
+                                                m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) /
+                                                m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = (short)((p->hs[0]<<8)|
+                                                        (p->hs[1])) %
+                                                m->in_offset;
+                                       break;
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               case LESHORT:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) &
+                                                m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) |
+                                                m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) ^
+                                                m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) +
+                                                m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) -
+                                                m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) *
+                                                m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) /
+                                                m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = (short)((p->hs[1]<<8)|
+                                                        (p->hs[0])) %
+                                                m->in_offset;
+                                       break;
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               case SHORT:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = p->h & m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = p->h | m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = p->h ^ m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = p->h + m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = p->h - m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = p->h * m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = p->h / m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = p->h % m->in_offset;
+                                       break;
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               case BELONG:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) &
+                                                m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) |
+                                                m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) ^
+                                                m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) +
+                                                m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) -
+                                                m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) *
+                                                m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) /
+                                                m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = (int32)((p->hl[0]<<24)|
+                                                        (p->hl[1]<<16)|
+                                                        (p->hl[2]<<8)|
+                                                        (p->hl[3])) %
+                                                m->in_offset;
+                                       break;
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               case LELONG:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) &
+                                                m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) |
+                                                m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) ^
+                                                m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) +
+                                                m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) -
+                                                m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) *
+                                                m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) /
+                                                m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = (int32)((p->hl[3]<<24)|
+                                                        (p->hl[2]<<16)|
+                                                        (p->hl[1]<<8)|
+                                                        (p->hl[0])) %
+                                                m->in_offset;
+                                       break;
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               case LONG:
+                       if (m->in_offset)
+                               switch (m->in_op&0x7F) {
+                               case OPAND:
+                                       offset = p->l & m->in_offset;
+                                       break;
+                               case OPOR:
+                                       offset = p->l | m->in_offset;
+                                       break;
+                               case OPXOR:
+                                       offset = p->l ^ m->in_offset;
+                                       break;
+                               case OPADD:
+                                       offset = p->l + m->in_offset;
+                                       break;
+                               case OPMINUS:
+                                       offset = p->l - m->in_offset;
+                                       break;
+                               case OPMULTIPLY:
+                                       offset = p->l * m->in_offset;
+                                       break;
+                               case OPDIVIDE:
+                                       offset = p->l / m->in_offset;
+                                       break;
+                               case OPMODULO:
+                                       offset = p->l % m->in_offset;
+                                       break;
+                       /*      case TOOMANYSWITCHBLOCKS:
+                        *              ugh = p->eye % m->strain;
+                        *              rub;
+                        *      case BEER:
+                        *              off = p->tab & m->in_gest;
+                        *              sleep;
+                        */
+                               }
+                       if (m->in_op & OPINVERSE)
+                               offset = ~offset;
+                       break;
+               }
+
+               if (offset + sizeof(union VALUETYPE) > nbytes)
+                       return 0;
+
+               memcpy(p, s + offset, sizeof(union VALUETYPE));
+
+               if (debug) {
+                       mdebug(offset, (char *) p, sizeof(union VALUETYPE));
+                       mdump(m);
+               }
+       }
+       if (!mconvert(p, m))
+         return 0;
+       return 1;
+}
+
+static int
+mcheck(p, m)
+       union VALUETYPE* p;
+       struct magic *m;
+{
+       uint32 l = m->value.l;
+       uint32 v;
+       int matched;
+
+       if ( (m->value.s[0] == 'x') && (m->value.s[1] == '\0') ) {
+               fprintf(stderr, "BOINK");
+               return 1;
+       }
+
+
+       switch (m->type) {
+       case BYTE:
+               v = p->b;
+               break;
+
+       case SHORT:
+       case BESHORT:
+       case LESHORT:
+               v = p->h;
+               break;
+
+       case LONG:
+       case BELONG:
+       case LELONG:
+       case DATE:
+       case BEDATE:
+       case LEDATE:
+       case LDATE:
+       case BELDATE:
+       case LELDATE:
+               v = p->l;
+               break;
+
+       case STRING:
+       case PSTRING:
+               {
+               /*
+                * What we want here is:
+                * v = strncmp(m->value.s, p->s, m->vallen);
+                * but ignoring any nulls.  bcmp doesn't give -/+/0
+                * and isn't universally available anyway.
+                */
+               unsigned char *a = (unsigned char*)m->value.s;
+               unsigned char *b = (unsigned char*)p->s;
+               int len = m->vallen;
+               l = 0;
+               v = 0;
+               if (0L == m->mask) { /* normal string: do it fast */
+                       while (--len >= 0)
+                               if ((v = *b++ - *a++) != '\0')
+                                       break; 
+               } else { /* combine the others */
+                       while (--len >= 0) {
+                               if ((m->mask & STRING_IGNORE_LOWERCASE) &&
+                                   islower(*a)) {
+                                       if ((v = tolower(*b++) - *a++) != '\0')
+                                               break;
+                               } else if ((m->mask & STRING_COMPACT_BLANK) && 
+                                   isspace(*a)) { 
+                                       a++;
+                                       if (isspace(*b++)) {
+                                               while (isspace(*b))
+                                                       b++;
+                                       } else {
+                                               v = 1;
+                                               break;
+                                       }
+                               } else if (isspace(*a) &&
+                                   (m->mask & STRING_COMPACT_OPTIONAL_BLANK)) {
+                                       a++;
+                                       while (isspace(*b))
+                                               b++;
+                               } else {
+                                       if ((v = *b++ - *a++) != '\0')
+                                               break;
+                               }
+                       }
+               }
+               break;
+       }
+       default:
+               error("invalid type %d in mcheck().\n", m->type);
+               return 0;/*NOTREACHED*/
+       }
+
+       if(m->type != STRING && m->type != PSTRING)
+               v = signextend(m, v);
+
+       switch (m->reln) {
+       case 'x':
+               if (debug)
+                       (void) fprintf(stderr, "%u == *any* = 1\n", v);
+               matched = 1;
+               break;
+
+       case '!':
+               matched = v != l;
+               if (debug)
+                       (void) fprintf(stderr, "%u != %u = %d\n",
+                                      v, l, matched);
+               break;
+
+       case '=':
+               matched = v == l;
+               if (debug)
+                       (void) fprintf(stderr, "%u == %u = %d\n",
+                                      v, l, matched);
+               break;
+
+       case '>':
+               if (m->flag & UNSIGNED) {
+                       matched = v > l;
+                       if (debug)
+                               (void) fprintf(stderr, "%u > %u = %d\n",
+                                              v, l, matched);
+               }
+               else {
+                       matched = (int32) v > (int32) l;
+                       if (debug)
+                               (void) fprintf(stderr, "%d > %d = %d\n",
+                                              v, l, matched);
+               }
+               break;
+
+       case '<':
+               if (m->flag & UNSIGNED) {
+                       matched = v < l;
+                       if (debug)
+                               (void) fprintf(stderr, "%u < %u = %d\n",
+                                              v, l, matched);
+               }
+               else {
+                       matched = (int32) v < (int32) l;
+                       if (debug)
+                               (void) fprintf(stderr, "%d < %d = %d\n",
+                                              v, l, matched);
+               }
+               break;
+
+       case '&':
+               matched = (v & l) == l;
+               if (debug)
+                       (void) fprintf(stderr, "((%x & %x) == %x) = %d\n",
+                                      v, l, l, matched);
+               break;
+
+       case '^':
+               matched = (v & l) != l;
+               if (debug)
+                       (void) fprintf(stderr, "((%x & %x) != %x) = %d\n",
+                                      v, l, l, matched);
+               break;
+
+       default:
+               matched = 0;
+               error("mcheck: can't happen: invalid relation %d.\n", m->reln);
+               break;/*NOTREACHED*/
+       }
+
+       return matched;
+}
diff --git a/file/stamp-h.in b/file/stamp-h.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/file/tar.h b/file/tar.h
new file mode 100644 (file)
index 0000000..c03139a
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Header file for public domain tar (tape archive) program.
+ *
+ * @(#)tar.h 1.20 86/10/29     Public Domain.
+ *
+ * Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
+ *
+ * Id: tar.h,v 1.5 1999/01/13 15:44:10 christos Exp  # checkin only
+ */
+
+/*
+ * Kludge for handling systems that can't cope with multiple
+ * external definitions of a variable.  In ONE routine (tar.c),
+ * we #define TAR_EXTERN to null; here, we set it to "extern" if
+ * it is not already set.
+ */
+#ifndef TAR_EXTERN
+#define TAR_EXTERN extern
+#endif
+
+/*
+ * Header block on tape.
+ *
+ * I'm going to use traditional DP naming conventions here.
+ * A "block" is a big chunk of stuff that we do I/O on.
+ * A "record" is a piece of info that we care about.
+ * Typically many "record"s fit into a "block".
+ */
+#define        RECORDSIZE      512
+#define        NAMSIZ  100
+#define        TUNMLEN 32
+#define        TGNMLEN 32
+
+union record {
+       char            charptr[RECORDSIZE];
+       struct header {
+               char    name[NAMSIZ];
+               char    mode[8];
+               char    uid[8];
+               char    gid[8];
+               char    size[12];
+               char    mtime[12];
+               char    chksum[8];
+               char    linkflag;
+               char    linkname[NAMSIZ];
+               char    magic[8];
+               char    uname[TUNMLEN];
+               char    gname[TGNMLEN];
+               char    devmajor[8];
+               char    devminor[8];
+       } header;
+};
+
+/* The checksum field is filled with this while the checksum is computed. */
+#define        CHKBLANKS       "        "      /* 8 blanks, no null */
+
+/* The magic field is filled with this if uname and gname are valid. */
+#define        TMAGIC          "ustar  "       /* 7 chars and a null */
+
+/* The linkflag defines the type of file */
+#define        LF_OLDNORMAL    '\0'            /* Normal disk file, Unix compat */
+#define        LF_NORMAL       '0'             /* Normal disk file */
+#define        LF_LINK         '1'             /* Link to previously dumped file */
+#define        LF_SYMLINK      '2'             /* Symbolic link */
+#define        LF_CHR          '3'             /* Character special file */
+#define        LF_BLK          '4'             /* Block special file */
+#define        LF_DIR          '5'             /* Directory */
+#define        LF_FIFO         '6'             /* FIFO special file */
+#define        LF_CONTIG       '7'             /* Contiguous file */
+/* Further link types may be defined later. */
+
+/*
+ * Exit codes from the "tar" program
+ */
+#define        EX_SUCCESS      0               /* success! */
+#define        EX_ARGSBAD      1               /* invalid args */
+#define        EX_BADFILE      2               /* invalid filename */
+#define        EX_BADARCH      3               /* bad archive */
+#define        EX_SYSTEM       4               /* system gave unexpected error */
+
+
+/*
+ * Global variables
+ */
+TAR_EXTERN union record        *ar_block;      /* Start of block of archive */
+TAR_EXTERN union record        *ar_record;     /* Current record of archive */
+TAR_EXTERN union record        *ar_last;       /* Last+1 record of archive block */
+TAR_EXTERN char                ar_reading;     /* 0 writing, !0 reading archive */
+TAR_EXTERN int         blocking;       /* Size of each block, in records */
+TAR_EXTERN int         blocksize;      /* Size of each block, in bytes */
+TAR_EXTERN char                *ar_file;       /* File containing archive */
+TAR_EXTERN char                *name_file;     /* File containing names to work on */
+TAR_EXTERN char                *tar;           /* Name of this program */
+
+/*
+ * Flags from the command line
+ */
+TAR_EXTERN char        f_reblock;              /* -B */
+TAR_EXTERN char        f_create;               /* -c */
+TAR_EXTERN char        f_debug;                /* -d */
+TAR_EXTERN char        f_sayblock;             /* -D */
+TAR_EXTERN char        f_follow_links;         /* -h */
+TAR_EXTERN char        f_ignorez;              /* -i */
+TAR_EXTERN char        f_keep;                 /* -k */
+TAR_EXTERN char        f_modified;             /* -m */
+TAR_EXTERN char        f_oldarch;              /* -o */
+TAR_EXTERN char        f_use_protection;       /* -p */
+TAR_EXTERN char        f_sorted_names;         /* -s */
+TAR_EXTERN char        f_list;                 /* -t */
+TAR_EXTERN char        f_namefile;             /* -T */
+TAR_EXTERN char        f_verbose;              /* -v */
+TAR_EXTERN char        f_extract;              /* -x */
+TAR_EXTERN char        f_compress;             /* -z */
+
+/*
+ * We now default to Unix Standard format rather than 4.2BSD tar format.
+ * The code can actually produce all three:
+ *     f_standard      ANSI standard
+ *     f_oldarch       V7
+ *     neither         4.2BSD
+ * but we don't bother, since 4.2BSD can read ANSI standard format anyway.
+ * The only advantage to the "neither" option is that we can cmp(1) our
+ * output to the output of 4.2BSD tar, for debugging.
+ */
+#define                f_standard              (!f_oldarch)
+
+/*
+ * Structure for keeping track of filenames and lists thereof.
+ */
+struct name {
+       struct name     *next;
+       short           length;
+       char            found;
+       char            name[NAMSIZ+1];
+};
+
+TAR_EXTERN struct name *namelist;      /* Points to first name in list */
+TAR_EXTERN struct name *namelast;      /* Points to last name in list */
+
+TAR_EXTERN int         archive;        /* File descriptor for archive file */
+TAR_EXTERN int         errors;         /* # of files in error */
+
+/*
+ *
+ * Due to the next struct declaration, each routine that includes
+ * "tar.h" must also include <sys/types.h>.  I tried to make it automatic,
+ * but System V has no defines in <sys/types.h>, so there is no way of
+ * knowing when it has been included.  In addition, it cannot be included
+ * twice, but must be included exactly once.  Argghh!
+ *
+ * Thanks, typedef.  Thanks, USG.
+ */
+struct link {
+       struct link     *next;
+       dev_t           dev;
+       ino_t           ino;
+       short           linkcount;
+       char            name[NAMSIZ+1];
+};
+
+TAR_EXTERN struct link *linklist;      /* Points to first link in list */
+
+
+/*
+ * Error recovery stuff
+ */
+TAR_EXTERN char                read_error_flag;
+
+
+#if 0
+/*
+ * Declarations of functions available to the world.
+ */
+/*LINTLIBRARY*/
+#define         annorec(stream, msg)   anno(stream, msg, 0)    /* Cur rec */
+#define        annofile(stream, msg)   anno(stream, msg, 1)    /* Saved rec */
+#endif