diff options
Diffstat (limited to 'usr.bin/file')
102 files changed, 5269 insertions, 72 deletions
diff --git a/usr.bin/file/LEGAL.NOTICE b/usr.bin/file/LEGAL.NOTICE new file mode 100644 index 0000000..a8255b9 --- /dev/null +++ b/usr.bin/file/LEGAL.NOTICE @@ -0,0 +1,37 @@ +Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992. +Written by Ian F. Darwin and others. +$Id: LEGAL.NOTICE,v 1.8 1993/03/17 11:35:30 ian Exp $ + +This software is not subject to and may not be made subject to any +license of the American Telephone and Telegraph Company (AT&T Inc.), +UNIX System Laboratories (USL Inc.), Novell Inc., Sun Microsystems +Inc., Digital Equipment Inc., Lotus Development Inc., the Regents of +the University of California, The X Consortium or MIT, or The Free +Software Foundation. + +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. + +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. + +UNIX is a trademark of UNIX System Laboratories (which is probably a +subsidiary of Novell, Inc., by the time you read this). The name "UNIX" +may not be used by commercial undertakings without permission in +writing from USL. Just ask BSDI (Berkeley Software Design Inc.), a +commercial venture not officially connected with the University of +California at Berkeley. diff --git a/usr.bin/file/MAINT b/usr.bin/file/MAINT new file mode 100644 index 0000000..7fc5e36 --- /dev/null +++ b/usr.bin/file/MAINT @@ -0,0 +1,33 @@ +$Id: MAINT,v 1.2 1993/09/23 21:47:01 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. + +Mark Moraes Christos Zoulas +moraes@deshaw.com christos@deshaw.com diff --git a/usr.bin/file/Magdir/Header b/usr.bin/file/Magdir/Header new file mode 100644 index 0000000..0c97bae --- /dev/null +++ b/usr.bin/file/Magdir/Header @@ -0,0 +1,5 @@ +#! file +# Magic data for file(1) command. +# Machine-genererated from src/cmd/file/magdir/*; edit there only! +# Format is described in magic(files), where: +# files is 4 on V7 and BSD, 4 on SV, and ?? in the SVID. diff --git a/usr.bin/file/Magdir/Localstuff b/usr.bin/file/Magdir/Localstuff new file mode 100644 index 0000000..224940b --- /dev/null +++ b/usr.bin/file/Magdir/Localstuff @@ -0,0 +1,3 @@ +# $Id: Localstuff,v 1.2 1993/01/05 13:22:25 ian Exp $ +# Add any locally-observed files here. Remember: +# text if readable, executable if runnable binary, data if unreadable. diff --git a/usr.bin/file/Magdir/alliant b/usr.bin/file/Magdir/alliant new file mode 100644 index 0000000..52ed628 --- /dev/null +++ b/usr.bin/file/Magdir/alliant @@ -0,0 +1,15 @@ +# +# 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/usr.bin/file/Magdir/apl b/usr.bin/file/Magdir/apl new file mode 100644 index 0000000..6ede926 --- /dev/null +++ b/usr.bin/file/Magdir/apl @@ -0,0 +1,4 @@ +# +# magic.apl: +# +0 long 0100554 APL workspace (Ken's original?) diff --git a/usr.bin/file/Magdir/apple b/usr.bin/file/Magdir/apple new file mode 100644 index 0000000..eb48673 --- /dev/null +++ b/usr.bin/file/Magdir/apple @@ -0,0 +1,10 @@ +# +# Apple II file formats +# +0 string FiLeStArTfIlEsTaRt binscii (apple ][) text +0 string \x0aGL Binary II (apple ][) data +0 string \x76\xff Squeezed (apple ][) data +0 string SIT! StuffIt (macintosh) text +0 string NuFile NuFile archive (apple ][) data +0 string N\xf5F\xe9l\xe5 NuFile archive (apple ][) data + diff --git a/usr.bin/file/Magdir/ar b/usr.bin/file/Magdir/ar new file mode 100644 index 0000000..583ec30 --- /dev/null +++ b/usr.bin/file/Magdir/ar @@ -0,0 +1,104 @@ +# +# "ar", for all kinds of archives. +# +# 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 SVR3.1 archives, we have: +# +# 0 string \<ar> System V Release 1 ar archive +# 0 string =<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 long 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 +# +0 string =<ar> archive +# +# From "pdp": +# +0 lelong 0x39bed PDP-11 old archive +0 lelong 0x39bee PDP-11 4.0 archive +# +0 string -h- Software Tools format archive text +# "arc" archiver +0 byte 26 'arc' archive +>1 byte 0 (empty) +>1 byte 1 (old format) +# Rahul Dhesi's zoo archive format, from keith@cerberus.uchicago.edu. +20 long 0xdca7c4fd Rahul Dhesi's "zoo" archive +# ZIP archiver +0 string PK zip archive file +>4 byte x - version +>4 byte 10 1.0 +>4 byte 20 2.0 + +2 string -lh LHarc archive data +>6 byte x type %c +>20 byte x - header level %d + +# From: <u31b3hs@pool.informatik.rwth-aachen.de> (Michael Haardt) +2 string -lh0- Lharc 1.x archive +2 string -lh1- Lharc 1.x archive +2 string -lz4- Lharc 1.x archive +2 string -lz5- Lharc 1.x archive +2 string -lzs- LHa 2.x? archive [lzs] +2 string -lh - LHa 2.x? archive [lh ] +2 string -lhd- LHa 2.x? archive [lhd] +2 string -lh2- LHa 2.x? archive [lh2] +2 string -lh3- LHa 2.x? archive [lh3] +2 string -lh4- LHa 2.x? archive [lh4] +2 string -lh5- LHa (2.x) archive + +# ARJ archive data from jason@jarthur.Claremont.EDU +0 leshort 0xea60 ARJ archive data +>5 byte x - version %d, +>8 byte >0 flags: +>>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] diff --git a/usr.bin/file/Magdir/arc b/usr.bin/file/Magdir/arc new file mode 100644 index 0000000..1ebb260 --- /dev/null +++ b/usr.bin/file/Magdir/arc @@ -0,0 +1,3 @@ +0 byte 26 'arc' archive +>1 byte 0 (empty) +>1 byte 1 (old format) diff --git a/usr.bin/file/Magdir/archive b/usr.bin/file/Magdir/archive new file mode 100644 index 0000000..8999c2f --- /dev/null +++ b/usr.bin/file/Magdir/archive @@ -0,0 +1,15 @@ +# A collection of various "ar" and "cpio" archive formats. +# "Tar" archives are handled in the C code. +0 short 070707 cpio archive +0 string 070707 ASCII cpio archive +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 +0 string !<arch> archive +>8 string __.SYMDEF random library +0 string -h- Software Tools format archive text +# Rahul Dhesi's zoo archive format, from keith@cerberus.uchicago.edu. +20 long 0xdca7c4fd Rahul Dhesi's "zoo" archive diff --git a/usr.bin/file/Magdir/att3b b/usr.bin/file/Magdir/att3b new file mode 100644 index 0000000..c1e9e39 --- /dev/null +++ b/usr.bin/file/Magdir/att3b @@ -0,0 +1,38 @@ +# +# AT&T 3B machines +# +# The `versions' should be un-commented if they work for you. +# (Was the problem just one of endianness?) +# +# 3B20 +# +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/usr.bin/file/Magdir/audio b/usr.bin/file/Magdir/audio new file mode 100644 index 0000000..6b4cb36 --- /dev/null +++ b/usr.bin/file/Magdir/audio @@ -0,0 +1,43 @@ +# +# Sound formats, from Jan Nicolai Langfeldt <janl@ifi.uio.no>, +# + +# Sun/NeXT audio data +0 string .snd audio data: +>12 belong 1 8-bit u-law, +>12 belong 2 8-bit linear 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 floating point, +>12 belong 7 64-bit floating point, +>12 belong 23 compressed (G.721 ADPCM), +>20 belong 1 mono, +>20 belong 2 stereo, +>20 belong 4 quad, +>16 belong x %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 +# (0x0064732E in little-endian encoding). +0 lelong 0x0064732E DEC audio data: +>12 lelong 1 8-bit u-law, +>12 lelong 2 8-bit linear 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 floating point, +>12 lelong 7 64-bit floating point, +>12 lelong 23 compressed (G.721 ADPCM), +>20 lelong 1 mono, +>20 lelong 2 stereo, +>20 lelong 4 quad, +>16 lelong x %d Hz +# Bytes 0-3 of AIFF, AIFF-C, & 8SVX audio files are "FORM" +8 string AIFF AIFF audio data +8 string AIFC AIFF-C audio data +8 string 8SVX IFF/8SVX audio data +# Bytes 0-3 of Waveform (*.wav) audio files are "RIFF" +8 string WAVE Waveform audio data +0 string Creative\ Voice\ File Soundblaster audio data +0 long 0x4e54524b MultiTrack sound data file +>4 long x - version %ld diff --git a/usr.bin/file/Magdir/blit b/usr.bin/file/Magdir/blit new file mode 100644 index 0000000..0f4804d --- /dev/null +++ b/usr.bin/file/Magdir/blit @@ -0,0 +1,16 @@ +# 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/usr.bin/file/Magdir/bsdi b/usr.bin/file/Magdir/bsdi new file mode 100644 index 0000000..faf0a60 --- /dev/null +++ b/usr.bin/file/Magdir/bsdi @@ -0,0 +1,2 @@ +# BSDI BSD/386 +0 long 0314 BSD/386 demand paged (first page unmapped) pure executable diff --git a/usr.bin/file/Magdir/c-lang b/usr.bin/file/Magdir/c-lang new file mode 100644 index 0000000..79b2254 --- /dev/null +++ b/usr.bin/file/Magdir/c-lang @@ -0,0 +1,3 @@ +# 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 program text diff --git a/usr.bin/file/Magdir/chi b/usr.bin/file/Magdir/chi new file mode 100644 index 0000000..2dfbfcf --- /dev/null +++ b/usr.bin/file/Magdir/chi @@ -0,0 +1,4 @@ +# ChiWriter files +0 string \\1cw\ ChiWriter file +>5 string >\0 version %s +0 string \\1cw ChiWriter file diff --git a/usr.bin/file/Magdir/clipper b/usr.bin/file/Magdir/clipper new file mode 100644 index 0000000..f4e9fa7 --- /dev/null +++ b/usr.bin/file/Magdir/clipper @@ -0,0 +1,63 @@ +# +# 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/usr.bin/file/Magdir/commands b/usr.bin/file/Magdir/commands new file mode 100644 index 0000000..d7c04c1 --- /dev/null +++ b/usr.bin/file/Magdir/commands @@ -0,0 +1,40 @@ +# +# "Commands": stuff for various shells and interpreters. +# +0 string :\ shell archive or commands for antique kernel text +0 string #!/bin/sh Bourne Shell script text +0 string #!\ /bin/sh Bourne Shell script text +0 string #!/bin/csh C Shell script text +0 string #!\ /bin/csh C Shell script text +# korn shell magic, sent by George Wu, gwu@clyde.att.com +0 string #!/bin/ksh Korn Shell script text +0 string #!\ /bin/ksh Korn Shell script text +0 string #!/bin/tcsh Tenex C Shell script text +0 string #!\ /bin/tcsh Tenex C Shell script text +0 string #!/usr/local/tcsh Tenex C Shell script text +0 string #!\ /usr/local/tcsh Tenex C Shell script text +0 string #!/usr/local/bin/tcsh Tenex C Shell script text +0 string #!\ /usr/local/bin/tcsh Tenex C Shell script text +0 string #!/bin/awk Awk Commands text +0 string #!\ /bin/awk Awk Commands text +0 string #!\ / a +>3 string >\0 %s script text +0 string #!/ a +>2 string >\0 %s script text +0 string #!\ commands text +>3 string >\0 for %s + +# 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 perl commands text +0 string #!\ /bin/perl perl commands text +0 string eval\ "exec\ /bin/perl perl commands text +0 string #!/usr/bin/perl perl commands text +0 string #!\ /usr/bin/perl perl commands text +0 string eval\ "exec\ /usr/bin/perl perl commands text +0 string #!/usr/local/bin/perl perl commands text +0 string #!\ /usr/local/bin/perl perl commands text +0 string eval\ "exec\ /usr/local/bin/perl perl commands text +0 string #!/bin/rc Plan 9 rc Shell script text +0 string #!\ /bin/rc Plan 9 rc Shell script text diff --git a/usr.bin/file/Magdir/compress b/usr.bin/file/Magdir/compress new file mode 100644 index 0000000..6309c180 --- /dev/null +++ b/usr.bin/file/Magdir/compress @@ -0,0 +1,40 @@ +# +# 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. + +# According to gzip.h, this is the correct byte order for packed data. +# +0 string \037\036 packed data + +# +# This magic number is byte-order-independent. +# +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 +0 string \377\037 compacted data +0 short 0145405 huf output +# +# 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) +# +# Standard unix compress +# +0 string \037\235 compressed data +>2 byte&0x80 >0 block compressed +>2 byte&0x1f x %d bits + +0 string \037\240 LZH compressed data diff --git a/usr.bin/file/Magdir/convex b/usr.bin/file/Magdir/convex new file mode 100644 index 0000000..0220a81 --- /dev/null +++ b/usr.bin/file/Magdir/convex @@ -0,0 +1,4 @@ +# +# XXX - what byte order does a Convex use? +# +0 long 0513 Convex executable diff --git a/usr.bin/file/Magdir/cpio b/usr.bin/file/Magdir/cpio new file mode 100644 index 0000000..d1805cc --- /dev/null +++ b/usr.bin/file/Magdir/cpio @@ -0,0 +1,16 @@ +# +# Yes, the 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) diff --git a/usr.bin/file/Magdir/diamond b/usr.bin/file/Magdir/diamond new file mode 100644 index 0000000..d515d61 --- /dev/null +++ b/usr.bin/file/Magdir/diamond @@ -0,0 +1,8 @@ +# +# ... 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/usr.bin/file/Magdir/diff b/usr.bin/file/Magdir/diff new file mode 100644 index 0000000..abf1b87 --- /dev/null +++ b/usr.bin/file/Magdir/diff @@ -0,0 +1,6 @@ +# +# magic file lines for output from "diff"... +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 diff --git a/usr.bin/file/Magdir/ditroff b/usr.bin/file/Magdir/ditroff new file mode 100644 index 0000000..1fff178 --- /dev/null +++ b/usr.bin/file/Magdir/ditroff @@ -0,0 +1,4 @@ +# Magic numbers for ditroff intermediate language +0 string x\ T\ cat titroff output for the C/A/T text +0 string x\ T\ ps titroff output for PostScript +0 string x\ T titroff output text diff --git a/usr.bin/file/Magdir/dump b/usr.bin/file/Magdir/dump new file mode 100644 index 0000000..d641747 --- /dev/null +++ b/usr.bin/file/Magdir/dump @@ -0,0 +1,80 @@ +# +# magic.dump, 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 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 + +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/usr.bin/file/Magdir/elf b/usr.bin/file/Magdir/elf new file mode 100644 index 0000000..e34332d --- /dev/null +++ b/usr.bin/file/Magdir/elf @@ -0,0 +1,44 @@ +# +# ELF +# Missing MIPS image type and flags +# +# Question marks on processor types flag "should not happen because the +# byte order is wrong". We have to check the byte order flag to see what +# byte order all the other stuff in the header is in. +# +0 string \177ELF ELF +>4 byte 0 invalid class +>4 byte 1 32-bit +>4 byte 2 64-bit +>5 byte 0 invalid byte order +>5 byte 1 LSB +>>16 leshort 0 unknown type +>>16 leshort 1 relocatable +>>16 leshort 2 executable +>>16 leshort 3 dynamic lib +>>16 leshort 4 core file +>>18 leshort 0 unknown machine +>>18 leshort 1 WE32100 and up +>>18 leshort 2 SPARC? +>>18 leshort 3 i386 (386 and up) +>>18 leshort 4 M68000? +>>18 leshort 5 M88000? +>>18 leshort 7 i860 +>>20 lelong 1 Version 1 +>>36 lelong 1 MathCoPro/FPU/MAU Required +>5 byte 2 MSB +>>16 beshort 0 unknown type +>>16 beshort 1 relocatable +>>16 beshort 2 executable +>>16 beshort 3 dynamic lib +>>16 beshort 4 core file +>>18 beshort 0 unknown machine +>>18 beshort 1 WE32100 and up +>>18 beshort 2 SPARC +>>18 beshort 3 i386 (386 and up)? +>>18 beshort 4 M68000 +>>18 beshort 5 M88000 +>>18 beshort 7 i860 +>>20 belong 1 Version 1 +>>36 belong 1 MathCoPro/FPU/MAU Required + diff --git a/usr.bin/file/Magdir/encore b/usr.bin/file/Magdir/encore new file mode 100644 index 0000000..7244f87 --- /dev/null +++ b/usr.bin/file/Magdir/encore @@ -0,0 +1,20 @@ +# +# magic.encore: Recognize 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/usr.bin/file/Magdir/floppy.raw b/usr.bin/file/Magdir/floppy.raw new file mode 100644 index 0000000..75091b9 --- /dev/null +++ b/usr.bin/file/Magdir/floppy.raw @@ -0,0 +1 @@ +0 string \366\366\366\366 Formatted floppy w/ no filesystem data diff --git a/usr.bin/file/Magdir/fonts b/usr.bin/file/Magdir/fonts new file mode 100644 index 0000000..594db76 --- /dev/null +++ b/usr.bin/file/Magdir/fonts @@ -0,0 +1,3 @@ +0 string FONT ASCII vfont text +0 short 0436 Berkeley vfont data +0 short 017001 byte-swapped Berkeley vfont data diff --git a/usr.bin/file/Magdir/frame b/usr.bin/file/Magdir/frame new file mode 100644 index 0000000..46e8648 --- /dev/null +++ b/usr.bin/file/Magdir/frame @@ -0,0 +1,28 @@ +# +# Magic number 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 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 file +>9 string 3.0 (3.0) +>9 string 2.0 (2.0) +>9 string 1.0 (1.x) +0 string \<MakerDictionary FraneMaker Dictionary text +>17 string 3.0 (3.0) +>17 string 2.0 (2.0) +>17 string 1.0 (1.x) +0 string \<MakerScreenFon FrameMaker Font file +>17 string 1.01 (%s) +0 string \<MML FrameMaker MML file +0 string \<Book 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) +0 string \<Maker Intermediate Print File FrameMaker IPL file +0 string \<MakerDictionary FraneMaker Dictionary text diff --git a/usr.bin/file/Magdir/gzip b/usr.bin/file/Magdir/gzip new file mode 100644 index 0000000..a19a654 --- /dev/null +++ b/usr.bin/file/Magdir/gzip @@ -0,0 +1,21 @@ +0 string \037\213 gzip compressed data +>2 byte <8 - reserved method +>2 byte 8 - deflate method +>3 byte &0x01 , ascii +>3 byte &0x02 , continuation +>3 byte &0x04 , extra field +>3 byte &0x08 , original file name +>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 diff --git a/usr.bin/file/Magdir/hp b/usr.bin/file/Magdir/hp new file mode 100644 index 0000000..db02e54 --- /dev/null +++ b/usr.bin/file/Magdir/hp @@ -0,0 +1,191 @@ +# +# magic.hp: Hewlett Packard Magic +# +# 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. +# +# HP-PA is big-endian, so it (and "800", which is *also* HP-PA-based; I +# assume "HPPA-RISC1.1" really means "HP-PA Version 1.1", which first +# showed up in the 700 series, although later 800 series machines are, +# I think, based on the PA7100 which implements HP-PA 1.1) are flagged +# as big-endian. +# +# 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. +# +# I'm guessing that the 200 series was 68K-based; the 300 and 400 series +# are. +# +# 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 +#### HPPA +0 belong 0x02100106 HPPA-RISC1.1 relocatable object +0 belong 0x02100107 HPPA-RISC1.1 executable +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 -not stripped + +0 belong 0x02100108 HPPA-RISC1.1 shared executable +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 -not stripped + +0 belong 0x0210010b HPPA-RISC1.1 demand-load executable +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 -not stripped + +0 belong 0x0210010e HPPA-RISC1.1 shared library +>96 belong >0 -not stripped + +0 belong 0x0210010d HPPA-RISC1.1 dynamic load library +>96 belong >0 -not stripped + +#### 800 +0 belong 0x020b0106 HP s800 relocatable object + +0 belong 0x020b0107 HP s800 executable +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 -not stripped + +0 belong 0x020b0108 HP s800 shared executable +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 -not stripped + +0 belong 0x020b010b HP s800 demand-load executable +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 -not stripped + +0 belong 0x020b010e HP s800 shared library +>96 belong >0 -not stripped + +0 belong 0x020b010d HP s800 dynamic load library +>96 belong >0 -not stripped + +0 belong 0x213c6172 archive file +>68 belong 0x020b0619 -HP s800 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 +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 short 0x1129 (ADR) +>8 short 0x3329 (REAL) +>8 short 0x5529 (LREAL) +>8 short 0x7729 (COMPLX) +>8 short 0x9d29 (LCOMPLX) +>8 short 0xbf29 (CHAR) +>8 short 0xe829 (ARRAY) +>8 short 0x0a2a (LNKARRAY) +>8 short 0x2c2a (STRING) +>8 short 0x4e2a (HXS) +>8 short 0x742a (LIST) +>8 short 0x962a (DIR) +>8 short 0xb82a (ALG) +>8 short 0xda2a (UNIT) +>8 short 0xfc2a (TAGGED) +>8 short 0x1e2b (GROB) +>8 short 0x402b (LIB) +>8 short 0x622b (BACKUP) +>8 short 0x882b (LIBDATA) +>8 short 0x9d2d (PROG) +>8 short 0xcc2d (CODE) +>8 short 0x482e (GNAME) +>8 short 0x6d2e (LNAME) +>8 short 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(,); diff --git a/usr.bin/file/Magdir/ibm370 b/usr.bin/file/Magdir/ibm370 new file mode 100644 index 0000000..b40fbf4 --- /dev/null +++ b/usr.bin/file/Magdir/ibm370 @@ -0,0 +1,19 @@ +# +# IBM 370 and compatibles. +# +# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable". +# What the heck *is* "USS/370"? +# +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/usr.bin/file/Magdir/ibm6000 b/usr.bin/file/Magdir/ibm6000 new file mode 100644 index 0000000..e4d73df --- /dev/null +++ b/usr.bin/file/Magdir/ibm6000 @@ -0,0 +1,17 @@ +# +# magic.rs6000: +# +# 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 message catalog +#0 string <aiaff> archive diff --git a/usr.bin/file/Magdir/iff b/usr.bin/file/Magdir/iff new file mode 100644 index 0000000..2d2f95b --- /dev/null +++ b/usr.bin/file/Magdir/iff @@ -0,0 +1,5 @@ +# image file format +# From 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 diff --git a/usr.bin/file/Magdir/imagen b/usr.bin/file/Magdir/imagen new file mode 100644 index 0000000..5fa4f6c --- /dev/null +++ b/usr.bin/file/Magdir/imagen @@ -0,0 +1,14 @@ +# Tell file about magic for 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. +# +# Now magic for IMAGEN font files... +0 string Rast RST-format raster font data +>45 string >0 face % diff --git a/usr.bin/file/Magdir/images b/usr.bin/file/Magdir/images new file mode 100644 index 0000000..074c743 --- /dev/null +++ b/usr.bin/file/Magdir/images @@ -0,0 +1,69 @@ +# image formats, 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? +# + +0 string xbtoa btoa'd file + +# PBMPLUS +0 string P1 PBM file +0 string P2 PGM file +0 string P3 PPM file +0 string P4 PBM "rawbits" file +0 string P5 PGM "rawbits" file +0 string P6 PPM "rawbits" file + +# TIFF and friends +0 string \115\115 TIFF file, big-endian +>2 short >0 version %d +0 string \111\111 TIFF file, little-endian +>2 short >0 version %d +# +# NIFF (Navy Interchange File Format, a modification of TIFF) +0 string IIN1 NIFF raster data + +# GIF +0 string GIF GIF picture +>3 string 87a - version %s +>3 string 89a - version %s +>6 leshort >0 %hd x +>8 leshort >0 %hd, +>10 byte &0x40 interlaced, +>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 + +# Miscellany +0 long 1123028772 Artisan image file +>4 long 1 rectangular 24-bit image +>4 long 2 rectangular 8-bit image with colormap +>4 long 3 rectangular 32-bit image (24-bit with matte) +0 string \361\0\100\273 CMU window manager bitmap +0 string #FIG FIG graphics savefile text +>6 string 2.1 Version 2.1 +>6 string 2.0 Version 2.0 +0 string GKSM GKS Metafile +8 string ILBM IFF ILBM file +6 string JFIF JPEG picture +0 string ARF_BEGARF PHIGS clear text archive + +# From: <u31b3hs@pool.informatik.rwth-aachen.de> (Michael Haardt) +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 + +0 string %bitmap FBM pixmap +>30 long 0x31 (mono) +>30 long 0x33 (color) + +4 string Research, Digifax-G3-File +>29 byte 1 , fine resolution +>29 byte 0 , normal resolution diff --git a/usr.bin/file/Magdir/intel b/usr.bin/file/Magdir/intel new file mode 100644 index 0000000..3f7ade7 --- /dev/null +++ b/usr.bin/file/Magdir/intel @@ -0,0 +1,31 @@ +# +# Various flavors of x86 UNIX executable/object (other than Xenix, which +# is in "microsoft"). DOS is in "ms-dos"; 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 +0 leshort =0514 80386 COFF executable +>12 lelong >0 not stripped +>22 leshort >0 - version %ld diff --git a/usr.bin/file/Magdir/interleaf b/usr.bin/file/Magdir/interleaf new file mode 100644 index 0000000..ab5f3c6 --- /dev/null +++ b/usr.bin/file/Magdir/interleaf @@ -0,0 +1,7 @@ +# +# magic for InterLeaf TPS: +0 string =\210OPS Interleaf saved data +0 string =<!OPS Interleaf document text +>5 string ,\ Version\ (version +>>14 string >\0 %s) + diff --git a/usr.bin/file/Magdir/iris b/usr.bin/file/Magdir/iris new file mode 100644 index 0000000..952a5f1 --- /dev/null +++ b/usr.bin/file/Magdir/iris @@ -0,0 +1,57 @@ +# +# magic.iris: Magic for mips from an iris4d +# +# Dunno what byte-order munging is needed; all of SGI's *current* +# machines and OSes run in big-endian mode on the MIPS machines, +# as far as I know, but they do have the MIPSEB and MIPSEL stuff +# here.... +# +0 short 0x0160 mipseb +>20 short 0407 executable +>20 short 0410 pure +>20 short 0413 demand paged +>8 long >0 not stripped +>8 long 0 stripped +>22 byte >0 - version %ld. +>23 byte >0 %ld +0 short 0x0162 mipsel +>20 short 0407 executable +>20 short 0410 pure +>20 short 0413 demand paged +>8 long >0 not stripped +>8 long 0 stripped +>23 byte >0 - version %ld. +>22 byte >0 %ld +0 short 0x6001 swapped mipseb +>20 short 03401 executable +>20 short 04001 pure +>20 short 05401 demand paged +>8 long >0 not stripped +>8 long 0 stripped +>22 byte >0 - version %ld. +>23 byte >0 %ld +0 short 0x6201 swapped mipsel +>20 short 03401 executable +>20 short 04001 pure +>20 short 05401 demand paged +>8 long >0 not stripped +>8 long 0 stripped +>22 byte >0 - version %ld. +>23 byte >0 %ld +0 short 0x180 mipseb ucode +0 short 0x182 mipsel ucode +# +# IRIX core format version 1 (from /usr/include/core.out.h) +0 long 0xdeadadb0 IRIX core dump +>4 long 1 of +>16 string >\0 '%s' +# +# Archives - This handles archive subtypes +# +0 string !<arch>\n__________E MIPS archive +>20 string U with mipsucode members +>21 string L with mipsel members +>21 string B with mipseb members +>19 string L and a EL hash table +>19 string B and a EB hash table +>22 string X -- out of date diff --git a/usr.bin/file/Magdir/ispell b/usr.bin/file/Magdir/ispell new file mode 100644 index 0000000..04814b8 --- /dev/null +++ b/usr.bin/file/Magdir/ispell @@ -0,0 +1,23 @@ +# +# magic.ispell +# +# XXX - byte order? +# +0 short 0xffff9601 ispell hash file +>2 short 0x00 - 8-bit, no capitalization, 26 flags +>2 short 0x01 - 7-bit, no capitalization, 26 flags +>2 short 0x02 - 8-bit, capitalization, 26 flags +>2 short 0x03 - 7-bit, capitalization, 26 flags +>2 short 0x04 - 8-bit, no capitalization, 52 flags +>2 short 0x05 - 7-bit, no capitalization, 52 flags +>2 short 0x06 - 8-bit, capitalization, 52 flags +>2 short 0x07 - 7-bit, capitalization, 52 flags +>2 short 0x08 - 8-bit, no capitalization, 128 flags +>2 short 0x09 - 7-bit, no capitalization, 128 flags +>2 short 0x0A - 8-bit, capitalization, 128 flags +>2 short 0x0B - 7-bit, capitalization, 128 flags +>2 short 0x0C - 8-bit, no capitalization, 256 flags +>2 short 0x0D - 7-bit, no capitalization, 256 flags +>2 short 0x0E - 8-bit, capitalization, 256 flags +>2 short 0x0F - 7-bit, capitalization, 256 flags +>4 short >0 and %d string characters diff --git a/usr.bin/file/Magdir/lex b/usr.bin/file/Magdir/lex new file mode 100644 index 0000000..929e68d --- /dev/null +++ b/usr.bin/file/Magdir/lex @@ -0,0 +1,3 @@ +# derived empirically, your offsets may vary! +53 string yyprevious c program text (from lex) +>3 string >\0 for %s diff --git a/usr.bin/file/Magdir/lif b/usr.bin/file/Magdir/lif new file mode 100644 index 0000000..9ac80b9 --- /dev/null +++ b/usr.bin/file/Magdir/lif @@ -0,0 +1,6 @@ +# +# magic.lif: +# +# XXX - byte order? +# +0 short 0x8000 lif file diff --git a/usr.bin/file/Magdir/linux b/usr.bin/file/Magdir/linux new file mode 100644 index 0000000..7c2855e --- /dev/null +++ b/usr.bin/file/Magdir/linux @@ -0,0 +1,11 @@ +# Values for Linux/i386 binaries, From: Rik Faith <faith@cs.unc.edu> +2 leshort 100 Linux/i386 +>0 leshort 0407 executable or impure executable (OMAGIC) +>0 leshort 0410 pure executable (NMAGIC) +>0 leshort 0413 demand-paged executable (ZMAGIC) +>0 leshort 0314 demand-paged executable (QMAGIC) +>16 lelong >0 not stripped +>0 string Jump jump +# core dump file +216 lelong 0421 core file (Linux) +>220 string >\0 core file (Linux) of %s diff --git a/usr.bin/file/Magdir/magic b/usr.bin/file/Magdir/magic new file mode 100644 index 0000000..20ee340 --- /dev/null +++ b/usr.bin/file/Magdir/magic @@ -0,0 +1 @@ +0 string #\ Magic magic text file for file(1) cmd diff --git a/usr.bin/file/Magdir/mail.news b/usr.bin/file/Magdir/mail.news new file mode 100644 index 0000000..d55b108 --- /dev/null +++ b/usr.bin/file/Magdir/mail.news @@ -0,0 +1,13 @@ +# 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 diff --git a/usr.bin/file/Magdir/microsoft b/usr.bin/file/Magdir/microsoft new file mode 100644 index 0000000..72bb0df --- /dev/null +++ b/usr.bin/file/Magdir/microsoft @@ -0,0 +1,68 @@ +# +# Microsoft (Xenix, not DOS) +# +# "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 +>0x1c byte &0x4 86 +>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/usr.bin/file/Magdir/mips b/usr.bin/file/Magdir/mips new file mode 100644 index 0000000..ae17cbd --- /dev/null +++ b/usr.bin/file/Magdir/mips @@ -0,0 +1,8 @@ +# +# RISC MIPS decstation +# Should this be "leshort", given that DEC ran the DECstations in +# little-endian mode? +# +# Where is the non-SGI, non-DEC MIPS stuff? +# +0 short 0x6201 MIPS executable diff --git a/usr.bin/file/Magdir/mirage b/usr.bin/file/Magdir/mirage new file mode 100644 index 0000000..8a2dbcbe --- /dev/null +++ b/usr.bin/file/Magdir/mirage @@ -0,0 +1,4 @@ +# +# XXX - byte order? +# +0 long 31415 Mirage Assembler m.out executable diff --git a/usr.bin/file/Magdir/mkid b/usr.bin/file/Magdir/mkid new file mode 100644 index 0000000..cd2cf86 --- /dev/null +++ b/usr.bin/file/Magdir/mkid @@ -0,0 +1,7 @@ +# +# 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/usr.bin/file/Magdir/mmdf b/usr.bin/file/Magdir/mmdf new file mode 100644 index 0000000..236c721 --- /dev/null +++ b/usr.bin/file/Magdir/mmdf @@ -0,0 +1 @@ +0 string \001\001\001\001 MMDF mailbox diff --git a/usr.bin/file/Magdir/motorola b/usr.bin/file/Magdir/motorola new file mode 100644 index 0000000..b892794 --- /dev/null +++ b/usr.bin/file/Magdir/motorola @@ -0,0 +1,28 @@ +# +# Motorola +# +# 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 diff --git a/usr.bin/file/Magdir/ms-dos b/usr.bin/file/Magdir/ms-dos new file mode 100644 index 0000000..830493a --- /dev/null +++ b/usr.bin/file/Magdir/ms-dos @@ -0,0 +1,8 @@ +# +# Various MS-DOS magic numbers +# +0 string MZ DOS executable (EXE) +0 string LZ DOS executable (built-in) +0 byte 0xe9 DOS executable (COM) +0 byte 0xeb DOS executable (COM) +0 byte 0xf0 MS-DOS program library diff --git a/usr.bin/file/Magdir/ncr b/usr.bin/file/Magdir/ncr new file mode 100644 index 0000000..89df750 --- /dev/null +++ b/usr.bin/file/Magdir/ncr @@ -0,0 +1,47 @@ +# +# magic.tower: +# +# 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/usr.bin/file/Magdir/netbsd b/usr.bin/file/Magdir/netbsd new file mode 100644 index 0000000..c89f6fa --- /dev/null +++ b/usr.bin/file/Magdir/netbsd @@ -0,0 +1,117 @@ +# +# All new-style magic numbers are in network byte order. +# +0 lelong 000000413 386BSD demand paged executable +>16 lelong >0 not stripped +0 lelong 000000314 BSDI demand paged executable +>16 lelong >0 not stripped + +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 +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped + +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 +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped + +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 +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped + +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 +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped + +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 +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped + +0 belong&0377777777 041400507 NetBSD/i386 core +>12 string >\0 from '%s' + +0 belong&0377777777 041600507 NetBSD/m68k core +>12 string >\0 from '%s' + +0 belong&0377777777 042000507 NetBSD/m68k4k core +>12 string >\0 from '%s' + +0 belong&0377777777 042200507 NetBSD/ns32532 core +>12 string >\0 from '%s' + +0 belong&0377777777 042400507 NetBSD/sparc core +>12 string >\0 from '%s' diff --git a/usr.bin/file/Magdir/news b/usr.bin/file/Magdir/news new file mode 100644 index 0000000..df7b659 --- /dev/null +++ b/usr.bin/file/Magdir/news @@ -0,0 +1,5 @@ +# NeWS, not "news" as in "netnews" +0 string StartFontMetrics ASCII font metrics +0 string StartFont ASCII font bits +0 long 0x137A2944 NeWS bitmap font +0 long 0x137A2947 NeWS font family diff --git a/usr.bin/file/Magdir/pbm b/usr.bin/file/Magdir/pbm new file mode 100644 index 0000000..bed702e --- /dev/null +++ b/usr.bin/file/Magdir/pbm @@ -0,0 +1,4 @@ +# +# XXX - byte order? +# +0 short 0x2a17 "compact bitmap" format (Poskanzer) diff --git a/usr.bin/file/Magdir/pdp b/usr.bin/file/Magdir/pdp new file mode 100644 index 0000000..cf1129d --- /dev/null +++ b/usr.bin/file/Magdir/pdp @@ -0,0 +1,22 @@ +# +# magic.pdp: 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 + +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 + +0 leshort 0411 PDP-11 separate I&D executable +>8 leshort >0 not stripped + +0 leshort 0437 PDP-11 kernel overlay diff --git a/usr.bin/file/Magdir/pgp b/usr.bin/file/Magdir/pgp new file mode 100644 index 0000000..3965553 --- /dev/null +++ b/usr.bin/file/Magdir/pgp @@ -0,0 +1,10 @@ +# +# pgp (pretty good protection) +0 beshort 0x9900 pgp key public ring +0 beshort 0x9501 pgp key security ring +0 beshort 0x9500 pgp key security ring +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/usr.bin/file/Magdir/pkgadd b/usr.bin/file/Magdir/pkgadd new file mode 100644 index 0000000..2cdb5e5 --- /dev/null +++ b/usr.bin/file/Magdir/pkgadd @@ -0,0 +1,4 @@ +# +# SysV R4 PKG Datastreams: +# +0 string #\ PaCkAgE\ DaTaStReAm pkg Datastream (SVR4) diff --git a/usr.bin/file/Magdir/plus5 b/usr.bin/file/Magdir/plus5 new file mode 100644 index 0000000..a5fa4e7 --- /dev/null +++ b/usr.bin/file/Magdir/plus5 @@ -0,0 +1,16 @@ +# +#/etc/magic entries 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/usr.bin/file/Magdir/postscript b/usr.bin/file/Magdir/postscript new file mode 100644 index 0000000..dcd8f65 --- /dev/null +++ b/usr.bin/file/Magdir/postscript @@ -0,0 +1,17 @@ +# +# magic.postscript: Magic for postscript files +# +# XXX - should we match only versions 1.0 and 2.0, or should we wildcard +# it? +# +0 string %! PostScript document +>2 string PS-Adobe- conforming +>>11 string 1.0 at level %s +>>11 string 2.0 at level %s +>>11 string 3.0 at level %s +# Some pc's have the annoying habit of adding a ^D +0 string \004%! PostScript document +>3 string PS-Adobe- conforming +>>12 string 1.0 at level %s +>>12 string 2.0 at level %s +>>12 string 3.0 at level %s diff --git a/usr.bin/file/Magdir/psdbms b/usr.bin/file/Magdir/psdbms new file mode 100644 index 0000000..b1fc2e1 --- /dev/null +++ b/usr.bin/file/Magdir/psdbms @@ -0,0 +1,6 @@ +# +# magic.ps: psdatabase magic +# +0 belong&0xff00ffff 0x56000000 ps database +>1 string >\0 version %s +>4 string >\0 from kernel %s diff --git a/usr.bin/file/Magdir/pyramid b/usr.bin/file/Magdir/pyramid new file mode 100644 index 0000000..b9c9e56 --- /dev/null +++ b/usr.bin/file/Magdir/pyramid @@ -0,0 +1,10 @@ +# +# magic.pyramid: 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/usr.bin/file/Magdir/rle b/usr.bin/file/Magdir/rle new file mode 100644 index 0000000..f45605b --- /dev/null +++ b/usr.bin/file/Magdir/rle @@ -0,0 +1,19 @@ +# From <janl@ifi.uio.no> +# I made this with the help of the man page for rle(5). Ihey missing +# from the magic numbers I have: + +# +# rle +# +0 short 0xcc52 Utah Raster Toolkit RLE +>2 short >0 lower left corner: %d +>4 short >0 lower right corner: %d +>6 short >0 %d x +>8 short >0 %d +>10 byte&0x1 =0x1 CLEARFIRST +>10 byte&0x2 =0x2 NO_BACKGROUND +>10 byte&0x4 =0x4 ALPHA +>10 byte&0x8 =0x8 COMMENT +>11 byte >0 %d colour channels +>12 byte >0 %d bits pr. pixel +>13 byte >0 %d colour map channels diff --git a/usr.bin/file/Magdir/sc b/usr.bin/file/Magdir/sc new file mode 100644 index 0000000..9bc9199 --- /dev/null +++ b/usr.bin/file/Magdir/sc @@ -0,0 +1,2 @@ +# for SC +38 string Spreadsheet sc file diff --git a/usr.bin/file/Magdir/sccs b/usr.bin/file/Magdir/sccs new file mode 100644 index 0000000..d27c5a7 --- /dev/null +++ b/usr.bin/file/Magdir/sccs @@ -0,0 +1,17 @@ +# 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. diff --git a/usr.bin/file/Magdir/sendmail b/usr.bin/file/Magdir/sendmail new file mode 100644 index 0000000..7eea31d --- /dev/null +++ b/usr.bin/file/Magdir/sendmail @@ -0,0 +1,9 @@ +# +# magic.sendmail: +# +# 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/usr.bin/file/Magdir/sequent b/usr.bin/file/Magdir/sequent new file mode 100644 index 0000000..bcb7061 --- /dev/null +++ b/usr.bin/file/Magdir/sequent @@ -0,0 +1,30 @@ +# 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/usr.bin/file/Magdir/sgml b/usr.bin/file/Magdir/sgml new file mode 100644 index 0000000..bb8b5dd --- /dev/null +++ b/usr.bin/file/Magdir/sgml @@ -0,0 +1,6 @@ +# $Id: sgml,v 1.3 1993/01/05 12:52:44 ian Exp $ +# SGML goop, mostly from rph@sq. +0 string \<!DOCTYPE Exported SGML document +0 string \<!doctype Exported SGML document +0 string \<!SUBDOC Exported SGML subdocument +0 string \<!subdoc Exported SGML subdocument diff --git a/usr.bin/file/Magdir/softquad b/usr.bin/file/Magdir/softquad new file mode 100644 index 0000000..e49d052 --- /dev/null +++ b/usr.bin/file/Magdir/softquad @@ -0,0 +1,27 @@ +# SoftQuad Publishing Software magic numbers +# $Id: softquad,v 1.8 1993/02/19 14:36:43 ian Exp $ +# 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/usr.bin/file/Magdir/sun b/usr.bin/file/Magdir/sun new file mode 100644 index 0000000..d6ce809 --- /dev/null +++ b/usr.bin/file/Magdir/sun @@ -0,0 +1,84 @@ +# +# 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' diff --git a/usr.bin/file/Magdir/sunraster b/usr.bin/file/Magdir/sunraster new file mode 100644 index 0000000..39db3a3 --- /dev/null +++ b/usr.bin/file/Magdir/sunraster @@ -0,0 +1,12 @@ +# +# Sun rasterfiles +# +# XXX - byte order? What about the 386i? +# +0 string \x59\xa6\x6a\x95 rasterfile +>4 belong >0 %d +>8 belong >0 x %d +>12 belong >0 x %d +>20 belong 0 old format +>20 belong 2 compressed +>24 belong 1 with color map diff --git a/usr.bin/file/Magdir/terminfo b/usr.bin/file/Magdir/terminfo new file mode 100644 index 0000000..76e171d --- /dev/null +++ b/usr.bin/file/Magdir/terminfo @@ -0,0 +1,8 @@ +# +# 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/usr.bin/file/Magdir/tex b/usr.bin/file/Magdir/tex new file mode 100644 index 0000000..734bedd --- /dev/null +++ b/usr.bin/file/Magdir/tex @@ -0,0 +1,25 @@ +# +# magic.tex: +# +# 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 TeX DVI file +>16 string >\0 (%s) +0 string \367\203 TeX generic font data +0 string \367\131 TeX packed font data +>4 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 +2 string \000\022 TeX font metric data +>34 string >\0 (%s) diff --git a/usr.bin/file/Magdir/troff b/usr.bin/file/Magdir/troff new file mode 100644 index 0000000..d414c16 --- /dev/null +++ b/usr.bin/file/Magdir/troff @@ -0,0 +1,6 @@ +# +# magic.troff: +# +0 string \100\357 very old (C/A/T) troff output data +0 string ' [nt]roff, tbl, or eqn input text + diff --git a/usr.bin/file/Magdir/typeset b/usr.bin/file/Magdir/typeset new file mode 100644 index 0000000..5064563 --- /dev/null +++ b/usr.bin/file/Magdir/typeset @@ -0,0 +1,5 @@ +# other typesetting magic +0 string \100\357 very old (C/A/T) troff output data +0 string Interpress/Xerox Xerox InterPress data +>16 string / (version +>>17 string >\0 %s) diff --git a/usr.bin/file/Magdir/unknown b/usr.bin/file/Magdir/unknown new file mode 100644 index 0000000..1ea5f06 --- /dev/null +++ b/usr.bin/file/Magdir/unknown @@ -0,0 +1,35 @@ +# +# magic.unknown: Unknown machine magic +# +# 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/usr.bin/file/Magdir/uuencode b/usr.bin/file/Magdir/uuencode new file mode 100644 index 0000000..add48a8 --- /dev/null +++ b/usr.bin/file/Magdir/uuencode @@ -0,0 +1,3 @@ +0 string begin uuencoded mail text +# Btoa(1) is an alternative to uuencode that requires less space. +0 string xbtoa\ Begin btoa'd text diff --git a/usr.bin/file/Magdir/varied.out b/usr.bin/file/Magdir/varied.out new file mode 100644 index 0000000..3a997d1c --- /dev/null +++ b/usr.bin/file/Magdir/varied.out @@ -0,0 +1,5 @@ +# 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 diff --git a/usr.bin/file/Magdir/vax b/usr.bin/file/Magdir/vax new file mode 100644 index 0000000..af665fa --- /dev/null +++ b/usr.bin/file/Magdir/vax @@ -0,0 +1,33 @@ +# +# magic.pdp: 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/usr.bin/file/Magdir/visx b/usr.bin/file/Magdir/visx new file mode 100644 index 0000000..e95cc5e --- /dev/null +++ b/usr.bin/file/Magdir/visx @@ -0,0 +1,30 @@ +# +# magic.visx: Visx format file +# +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/usr.bin/file/Magdir/x11 b/usr.bin/file/Magdir/x11 new file mode 100644 index 0000000..ed0ff44 --- /dev/null +++ b/usr.bin/file/Magdir/x11 @@ -0,0 +1,9 @@ +# +# magic.x11 +# +# I think this is byte-order-dependent; if so, it should become: +# +# 0 belong 00000004 X11 big-endian snf font +# 0 lelong 00000004 X11 little-endian snf font +# +0 long 00000004 X11 snf font diff --git a/usr.bin/file/Magdir/zilog b/usr.bin/file/Magdir/zilog new file mode 100644 index 0000000..c7503cd --- /dev/null +++ b/usr.bin/file/Magdir/zilog @@ -0,0 +1,11 @@ +# +# 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/usr.bin/file/Magdir/zyxel b/usr.bin/file/Magdir/zyxel new file mode 100644 index 0000000..dfb48bf --- /dev/null +++ b/usr.bin/file/Magdir/zyxel @@ -0,0 +1,9 @@ +# 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 1 - ADPCM2 encoding +>10 byte 2 - ADPCM3 encoding diff --git a/usr.bin/file/Makefile b/usr.bin/file/Makefile new file mode 100644 index 0000000..d59f490 --- /dev/null +++ b/usr.bin/file/Makefile @@ -0,0 +1,159 @@ +# Makefile for file(1) cmd. +# Copyright (c) Ian F. Darwin 86/09/01 - see LEGAL.NOTICE. +# @(#)$Id: Makefile,v 1.43 1994/05/03 17:57:59 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.14 +SHELL = /bin/sh +#MAGIC = /etc/magic +MAGIC = /usr/local/etc/magic +DEFS = -DMAGIC='"$(MAGIC)"' # -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 \ + print.c $(LOCALSRCS) $(LOCALINC) +OBJS = file.o apprentice.o fsmagic.o softmagic.o ascmagic.o \ + compress.o is_tar.o \ + print.o $(LOCALOBJS) + +ALLSRC = LEGAL.NOTICE README MAINT PORTING $(SRCS) *.h \ + Makefile file.man magic.man +ALLMAGIC = Magdir/Makefile Magdir/Localstuff Magdir/Header 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) $(OBJS) -o $@ +lint: $(SRCS) + lint -ha $(DEFS) $(SRCS) | tee $@ +magic: Magdir +# Magdir/Makefile's "install" mv's magic to here for testing. + cd Magdir; $(MAKE) install + +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} +clobber: + cd tst; $(MAKE) clean + + +magic.${MANFEXT} : Makefile magic.man + @rm -f $@ + sed -e s@__SECTION__@${MANFEXT}@g \ + -e s@__MAGIC__@${MAGIC}@g magic.man > $@ + +file.${MANCEXT} : Makefile file.man + @rm -f $@ + sed -e s@__SECTION__@${MANCEXT}@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/usr.bin/file/PORTING b/usr.bin/file/PORTING new file mode 100644 index 0000000..06790e6 --- /dev/null +++ b/usr.bin/file/PORTING @@ -0,0 +1,76 @@ +Portability of the new file(1) command. +@(#) $Id: PORTING,v 1.11 1993/09/23 21:47:23 christos Exp $ + +Read this file only if the program doesn't compile on your system. + +This release has been around UNIX; it has been compiled and tested +in the following environments: + +SunOS sqarc 4.1.1 8 sun4 + No problems. +ULTRIX squint 4.2 0 RISC + No problems. +A/UX sqmac 3.0a9 SVR22 mc68020 + No problems. +AIX sqibm 2 3 000XXXXXX100 + Had weird "make" problems making "magic" file automatically; just + built it by hand. Your mileage may vary. +SCO sqwang 3.2 2 i386 + Compiles fine; their weird make can't handle "[a-z]*" as a dependancy, + so build magic by hand. Runs fine. +sqzme sqzme 3.1.1 3 3B2 + The 3B2 SVR3 needed a few tweaks as well as COPTS = -Ilocalinc + in order to compile. + +This version, reluctanly, includes <stdlib.h>, which won't exist +on older systems or those that aren't even close to the ANSI C +standard. There is a null "stdlib.h", and some other bogus headers, +in subdirectory "localinc"; if you get complaints about missing +stdlib.h and others, uncomment the line with COPTS=-Ilocalinc +in the Makefile, and try again. + +You must have either <stdarg.h> or the older <varargs.h>, otherwise you'll +have to butcher some routines in print.c. + +Beyond that, I have tried to make a program that doesn't need any +command-line defines (-D) to specify what version of UNIX is in use, +by using the definitions available in the system #include +files. For example, the lstat(2) call is normally found in +4BSD systems, but might be grafted into some other variant +of UNIX. If it's done right (ie., using the same definitions), +my program will compile and work correctly. Look at the #ifdefs +to see how it's done. + +I've also tried to include source for all the non-portable library routines +I used (getopt, str*). Non-portable here means `not in every +reasonably standard UNIX out there: V7, System V, 4BSD'. +These are in subdirectory "localsrc", and not used unless you +need them; again, see the Makefile. + +There is one area that just might cause problems. On System +V, they moved the definition of major() and minor() out of +<sys/types.h> into <sys/sysmacros.h>. Hence, if major isn't +defined after including types.h, I automatically include sys/sysmacros.h. +This will work for 99% of the systems out there. ONLY if you +have a system in which neither types.h nor sysmacros.h defines +`major' will this automatic include fail (I hope). On such +systems, you will get a compilation error in trying to compile +a warning message. Please do the following: + + 1) change the appropriate #include at the start of fsmagic.c +and 2) let me know the name of the system, the release number, + and the name of the header file that *does* include + this "standard" definition. + +If you are running the old Ritchie PDP-11 C compiler or +some other compiler that doesn't know about `void', you will have +to include `-Dvoid=int' in the variable COPTS in the Makefile. + +Other than this, there should be no portability problems, +but one never knows these days. Please let me know of any +other problems you find porting to a UNIX system. I don't much +care about non-UNIX systems but will collect widely-used magic +numbers for them as well as for UNIX systems. + +Mark Moraes and Christos Zoulas +(address in README) diff --git a/usr.bin/file/README b/usr.bin/file/README new file mode 100644 index 0000000..2ee8e67 --- /dev/null +++ b/usr.bin/file/README @@ -0,0 +1,79 @@ +** README for file(1) Command ** +@(#) $Id: README,v 1.20 1993/09/23 21:47:01 christos Exp $ + +This is Release 3.x of Ian Darwin's (copyright but distributable) +file(1) command. Release 3.x is scheduled for inclusion in the +4.4 BSD (Berkeley Software Distribution) of UNIX-like +software, and is the standard "file" command for Linux, 386bsd, +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 - 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 +strtok.c, getopt.c - in case you them (courtesy of Henry Spencer). +strtol.c, strchr.c - in case you need them - public domain. +tst - simple test suite, built from tst/Makefile + + +E-mail: christos@deshaw.com, moraes@deshaw.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. diff --git a/usr.bin/file/apprentice.c b/usr.bin/file/apprentice.c new file mode 100644 index 0000000..e1b4f45 --- /dev/null +++ b/usr.bin/file/apprentice.c @@ -0,0 +1,551 @@ +/* + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "file.h" + +#ifndef lint +static char *moduleid = + "@(#)$Id: apprentice.c,v 1.19 1994/05/03 17:58:23 christos Exp $"; +#endif /* lint */ + +#define EATAB {while (isascii((unsigned char) *l) && \ + isspace((unsigned char) *l)) ++l;} + + +static int getvalue __P((struct magic *, char **)); +static int hextoint __P((int)); +static char *getstr __P((char *, char *, int, int *)); +static int parse __P((char *, int *, int)); + +static int maxmagic = 0; + +int +apprentice(fn, check) +char *fn; /* name of magic file */ +int check; /* non-zero? checking-only run. */ +{ + FILE *f; + char line[BUFSIZ+1]; + int errs = 0; + + f = fopen(fn, "r"); + if (f==NULL) { + (void) fprintf(stderr, "%s: can't read magic file %s\n", + progname, fn); + if (check) + return -1; + else + exit(1); + } + + maxmagic = MAXMAGIS; + if ((magic = (struct magic *) calloc(sizeof(struct magic), maxmagic)) + == NULL) { + (void) fprintf(stderr, "%s: Out of memory.\n", progname); + if (check) + return -1; + else + exit(1); + } + + /* parse it */ + if (check) /* print silly verbose header for USG compat. */ + (void) printf("cont\toffset\ttype\topcode\tmask\tvalue\tdesc\n"); + + 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(line, &nmagic, check) != 0) + ++errs; + } + + (void) fclose(f); + return errs ? -1 : 0; +} + +/* + * extend the sign bit if the comparison is to be signed + */ +unsigned long +signextend(m, v) +struct magic *m; +unsigned long 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 LONG: + case BELONG: + case LELONG: + v = (long) v; + break; + case STRING: + 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(l, ndx, check) +char *l; +int *ndx, check; +{ + int i = 0, nd = *ndx; + struct magic *m; + char *t, *s; + + if (nd+1 >= maxmagic){ + maxmagic += 20; + if ((magic = (struct magic *) realloc(magic, + sizeof(struct magic) * + maxmagic)) == NULL) { + (void) fprintf(stderr, "%s: Out of memory.\n", progname); + if (check) + return -1; + else + exit(1); + } + } + m = &magic[*ndx]; + 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; + } + + /* get offset, then skip over it */ + m->offset = (int) strtol(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 == '.') { + switch (*++l) { + case 'l': + m->in.type = LONG; + break; + case 's': + m->in.type = SHORT; + break; + case 'b': + m->in.type = BYTE; + break; + default: + magwarn("indirect offset type %c invalid", *l); + break; + } + l++; + } + s = l; + if (*l == '+' || *l == '-') l++; + if (isdigit((unsigned char)*l)) { + m->in.offset = strtol(l, &t, 0); + if (*s == '-') m->in.offset = - m->in.offset; + } + 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 + + if (*l == 'u') { + ++l; + m->flag |= UNSIGNED; + } + + /* get type, skip it */ + 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 { + magwarn("type %s invalid", l); + return -1; + } + /* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */ + if (*l == '&') { + ++l; + m->mask = signextend(m, strtol(l, &l, 0)); + } else + m->mask = ~0L; + EATAB; + + switch (*l) { + case '>': + case '<': + /* Old-style anding: "0 byte &0x80 dynamically linked" */ + case '&': + case '^': + case '=': + m->reln = *l; + ++l; + break; + case '!': + if (m->type != STRING) { + 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 (check) { + mdump(m); + } + ++(*ndx); /* 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) { + *p = getstr(*p, m->value.s, sizeof(m->value.s), &slen); + m->vallen = slen; + } else + if (m->reln != 'x') + m->value.l = signextend(m, strtol(*p, p, 0)); + 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) +register char *s; +register char *p; +int plen, *slen; +{ + char *origs = s, *origp = p; + char *pmax = p + plen - 1; + register int c; + register 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 3 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; + c = hextoint(*s++); + if (c >= 0) { + val = (val << 4) + c; + } else + --s; + } 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; +{ + register 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; + } + } + } +} diff --git a/usr.bin/file/ascmagic.c b/usr.bin/file/ascmagic.c new file mode 100644 index 0000000..600b0ab --- /dev/null +++ b/usr.bin/file/ascmagic.c @@ -0,0 +1,120 @@ +/* + * 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. + * + * 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 <unistd.h> +#include "file.h" +#include "names.h" + +#ifndef lint +static char *moduleid = + "@(#)$Id: ascmagic.c,v 1.17 1994/01/21 01:25:30 christos Exp $"; +#endif /* lint */ + + /* an optimisation over plain strcmp() */ +#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) + +int +ascmagic(buf, nbytes) +unsigned char *buf; +int nbytes; /* size actually read */ +{ + int i, isblock, has_escapes = 0; + unsigned char *s; + char nbuf[HOWMANY+1]; /* one extra for terminating '\0' */ + char *token; + register struct names *p; + + /* these are easy, do them first */ + + /* + * for troff, look for . + letter + letter or .\"; + * this must be done to disambiguate tar archives' ./file + * and other trash from real troff input. + */ + if (*buf == '.') { + unsigned char *tp = buf + 1; + + while (isascii(*tp) && isspace(*tp)) + ++tp; /* skip leading whitespace */ + if ((isascii(*tp) && (isalnum(*tp) || *tp=='\\') && + isascii(*(tp+1)) && (isalnum(*(tp+1)) || *tp=='"'))) { + ckfputs("troff or preprocessor input text", stdout); + return 1; + } + } + if ((*buf == 'c' || *buf == 'C') && + isascii(*(buf + 1)) && isspace(*(buf + 1))) { + ckfputs("fortran program text", stdout); + return 1; + } + + /* look for tokens from names.h - this is expensive! */ + /* make a copy of the buffer here because strtok() will destroy it */ + s = (unsigned char*) memcpy(nbuf, buf, nbytes); + s[nbytes] = '\0'; + has_escapes = (memchr(s, '\033', nbytes) != NULL); + while ((token = strtok((char*)s, " \t\n\r\f")) != NULL) { + s = NULL; /* make strtok() keep on tokin' */ + for (p = names; p < names + NNAMES; p++) { + if (STREQ(p->name, token)) { + ckfputs(types[p->type], stdout); + if (has_escapes) + ckfputs(" (with escape sequences)", + stdout); + return 1; + } + } + } + + switch (is_tar(buf, nbytes)) { + case 1: + ckfputs("tar archive", stdout); + return 1; + case 2: + ckfputs("POSIX tar archive", stdout); + return 1; + } + + for (i = 0; i < nbytes; i++) { + if (!isascii(*(buf+i))) + return 0; /* not all ascii */ + } + + /* all else fails, but it is ascii... */ + ckfputs("ascii text", stdout); + if (has_escapes) { + ckfputs(" (with escape sequences)", stdout); + } + return 1; +} + + diff --git a/usr.bin/file/compress.c b/usr.bin/file/compress.c new file mode 100644 index 0000000..a665306 --- /dev/null +++ b/usr.bin/file/compress.c @@ -0,0 +1,125 @@ +/* + * 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 + * $Id: compress.c,v 1.8 1994/01/21 01:38:24 christos Exp $ + */ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <sys/wait.h> + +#include "file.h" + +static struct { + char *magic; + int maglen; + char *argv[3]; + int silent; +} compr[] = { + { "\037\235", 2, { "uncompress", "-c", NULL }, 0 }, + { "\037\213", 2, { "gzip", "-dq", NULL }, 1 }, + /* + * XXX pcat does not work, cause I don't know how to make it read stdin, + * so we use gzip + */ + { "\037\036", 2, { "gzip", "-dq", NULL }, 0 }, +}; + +static int ncompr = sizeof(compr) / sizeof(compr[0]); + + +static int uncompress __P((int, const unsigned char *, unsigned char **, int)); + +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) + break; + } + + if (i == ncompr) + return 0; + + if ((newsize = uncompress(i, buf, &newbuf, nbytes)) != 0) { + tryit(newbuf, newsize, 1); + free(newbuf); + printf(" ("); + tryit(buf, nbytes, 0); + printf(")"); + } + return 1; +} + + +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], compr[method].argv); + error("could not execute `%s' (%s).\n", + compr[method].argv[0], strerror(errno)); + /*NOTREACHED*/ + case -1: + error("could not fork (%s).\n", strerror(errno)); + /*NOTREACHED*/ + + default: /* parent */ + (void) close(fdin[0]); + (void) close(fdout[1]); + if (write(fdin[1], old, n) != n) { + error("write failed (%s).\n", strerror(errno)); + /*NOTREACHED*/ + } + (void) close(fdin[1]); + if ((*newch = (unsigned char *) malloc(n)) == NULL) { + error("out of memory.\n"); + /*NOTREACHED*/ + } + if ((n = read(fdout[0], *newch, n)) <= 0) { + free(*newch); + error("read failed (%s).\n", strerror(errno)); + /*NOTREACHED*/ + } + (void) close(fdout[0]); + (void) wait(NULL); + return n; + } +} + + diff --git a/usr.bin/file/file.1 b/usr.bin/file/file.1 index 8e70f84..c10b221 100644 --- a/usr.bin/file/file.1 +++ b/usr.bin/file/file.1 @@ -1,72 +1,351 @@ -.\" Copyright (c) 1990, 1993, 1994 -.\" The Regents of the University of California. 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 the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. -.\" -.\" @(#)file.1 8.2 (Berkeley) 3/31/94 -.\" -.Dd March 31, 1994 -.Dt FILE 1 -.Os -.Sh NAME -.Nm file -.Nd identify file content -.Sh SYNOPSIS -.Nm file -.Op Fl h -.Ar file ... -.Sh DESCRIPTION -.Nm File -tests the specified files and attempts to classify them. -If a file is a text file, -it attempts to determine the type of text (e.g. -.Xr csh 1 -commands or C source code). -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl h -If a symbolic link is specified, identify the file as a symbolic -link. -By default, symbolic links are only identified if they reference -non-existent files. -.El -.Sh COMPATIBILITY -Previous implementations of the -.Nm file -utility did not follow symbolic links by default. -.Sh BUGS -As many tests are used and -.Nm file -stops testing on the first successful one, it can often make mistakes. -.Sh HISTORY -A -.Nm file -command appeared in -.At v6 . +.TH FILE 1 "Copyright but distributable" +.\# $Id: file.man,v 1.23 1993/09/24 18:50:48 christos Exp $ +.SH NAME +.I file +\- determine file type +.SH SYNOPSIS +.B file +[ +.B \-c +] +[ +.B \-z +] +[ +.B \-L +] +[ +.B \-f +namefile ] +[ +.B \-m +magicfile ] +file ... +.SH DESCRIPTION +.I 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 ASCII characters and is +probably safe to read on an 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 \- change ``shell commands text'' +to ``shell script''. +.PP +The filesystem tests are based on examining the return from a +.IR 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 +.BR 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) +.B a.out +file, whose format is defined in +.B a.out.h +and possibly +.B 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 in these files is read from the magic file +.I __MAGIC__. +.PP +If an argument appears to be an +.SM ASCII +file, +.I file +attempts to guess its language. +The language tests look for particular strings (cf \fInames.h\fP) +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 troff 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 +.I tar +archives) and determine whether an unknown file should be +labelled as `ascii text' or `data'. +.PP +Use +.B \-m +.I file +to specify an alternate file of magic numbers. +.PP +The +.B \-z +tries to look inside compressed files. +.PP +The +.B \-c +option causes 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. +.PP +The +.B \-f +.I namefile +option specifies that the names of the files to be examined +are to be read (one per line) from +.I namefile +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. +.PP +The +.B \-L +option causes symlinks to be followed, as the like-named option in +.IR ls (1). +.SH FILES +.I __MAGIC__ +\- default list of magic numbers +.SH SEE ALSO +.IR magic (__SECTION__) +\- description of magic file format. +.br +.IR Strings (1), " od" (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 +.IR 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 +.I file +command uses a magic file, +keep the old magic file around for comparison purposes +(rename it to +.IR __MAGIC__.orig ). +.SH HISTORY +There has been a +.I file +command in every UNIX since at least Research Version 6 +(man page dated January, 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 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. +The program has undergone continued evolution since. +.SH AUTHOR +Written by Ian F. Darwin, UUCP address {utzoo | ihnp4}!darwin!ian, +Internet address ian@sq.com, +postal address: P.O. Box 603, Station F, Toronto, Ontario, CANADA M4Y 2L8. +.PP +Altered by Rob McMahon, cudcv@warwick.ac.uk, 1989, to extend the `&' operator +from simple `x&y != 0' to `x&y op z'. +.PP +Altered by Guy Harris, guy@auspex.com, 1993, to: +.RS +.PP +put the ``old-style'' `&' +operator back the way it was, because 1) Rob McMahon's change broke the +previous style of usage, 2) the SunOS ``new-style'' `&' operator, +which this version of +.I file +supports, also handles `x&y op z', and 3) Rob's change wasn't documented +in any case; +.PP +put in multiple levels of `>'; +.PP +put in ``beshort'', ``leshort'', etc. keywords to look at numbers in the +file in a specific byte order, rather than in the native byte order of +the process running +.IR file . +.RE +.PP +Changes by Ian Darwin and various authors including +Christos Zoulas (christos@ee.cornell.edu), 1990-1992. +.SH LEGAL NOTICE +Copyright (c) Ian F. Darwin, Toronto, Canada, +1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993. +.PP +This software is not subject to and may not be made subject to any +license of the American Telephone and Telegraph Company, Sun +Microsystems Inc., Digital Equipment Inc., Lotus Development Inc., the +Regents of the University of California, The X Consortium or MIT, or +The Free Software Foundation. +.PP +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. +.PP +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: +.PP +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. +.PP +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. +.PP +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. +.PP +4. This notice may not be removed or altered. +.PP +A few support files (\fIgetopt\fP, \fIstrtok\fP) +distributed with this package +are by Henry Spencer and are subject to the same terms as above. +.PP +A few simple support files (\fIstrtol\fP, \fIstrchr\fP) +distributed with this package +are in the public domain; they are so marked. +.PP +The files +.I tar.h +and +.I is_tar.c +were written by John Gilmore from his public-domain +.I tar +program, and are not covered by the above restrictions. +.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, +.IR ndbm (3) +or, better yet, fixed-length 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 +.I File +uses several algorithms that favor speed over accuracy, +thus it can be misled about the contents of ASCII files. +.PP +The support for ASCII 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 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., troff 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. +.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 tesla.ee.cornell.edu +in the directory +.BR /pub/file-X.YY.tar.gz diff --git a/usr.bin/file/file.c b/usr.bin/file/file.c new file mode 100644 index 0000000..a8acdd4 --- /dev/null +++ b/usr.bin/file/file.c @@ -0,0 +1,276 @@ +/* + * 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. + */ +#ifndef lint +static char *moduleid = + "@(#)$Id: file.c,v 1.29 1993/10/27 20:59:05 christos Exp $"; +#endif /* lint */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/param.h> /* for MAXPATHLEN */ +#include <sys/stat.h> +#include <fcntl.h> /* for open() */ +#include <utime.h> +#include <unistd.h> /* for read() */ + +#include "file.h" + +#ifdef S_IFLNK +# define USAGE "Usage: %s [-czL] [-f namefile] [-m magicfile] file...\n" +#else +# define USAGE "Usage: %s [-cz] [-f namefile] [-m magicfile] file...\n" +#endif + +#ifndef MAGIC +# define MAGIC "/etc/magic" +#endif + +int /* Global command-line options */ + debug = 0, /* debugging */ + lflag = 0, /* follow Symlinks (BSD only) */ + zflag = 0; /* follow (uncompress) compressed files */ + +int /* Misc globals */ + nmagic = 0; /* number of valid magic[]s */ + +struct magic *magic; /* array of magic entries */ + +char *magicfile = MAGIC;/* where magic be found */ + +char *progname; /* used throughout */ +int lineno; /* line number in the magic file */ + + +static void unwrap __P((char *fn)); + +/* + * main - parse arguments and handle options + */ +int +main(argc, argv) +int argc; +char *argv[]; +{ + int c; + int check = 0, didsomefiles = 0, errflg = 0, ret = 0; + + if ((progname = strrchr(argv[0], '/')) != NULL) + progname++; + else + progname = argv[0]; + + while ((c = getopt(argc, argv, "cdf:Lm:z")) != EOF) + switch (c) { + case 'c': + ++check; + break; + case 'd': + ++debug; + break; + case 'f': + unwrap(optarg); + ++didsomefiles; + break; +#ifdef S_IFLNK + case 'L': + ++lflag; + break; +#endif + case 'm': + magicfile = optarg; + break; + case 'z': + zflag++; + break; + case '?': + default: + errflg++; + break; + } + if (errflg) { + (void) fprintf(stderr, USAGE, progname); + exit(2); + } + + ret = apprentice(magicfile, check); + if (check) + exit(ret); + + if (optind == argc) { + if (!didsomefiles) { + (void)fprintf(stderr, USAGE, progname); + exit(2); + } + } + 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 ((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); + } + + (void) fclose(f); +} + + +/* + * 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 utimbuf utbuf; + struct stat sb; + int nbytes = 0; /* number of bytes read from a datafile */ + + if (strcmp("-", inname) == 0) { + if (fstat(0, &sb)<0) { + error("cannot fstat `%s' (%s).\n", stdname, + strerror(errno)); + /*NOTREACHED*/ + } + inname = stdname; + } + + if (wid > 0) + (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("empty", stdout); + else { + buf[nbytes++] = '\0'; /* null-terminate it */ + tryit(buf, nbytes, zflag); + } + + if (inname != stdname) { + /* + * Try to restore access, modification times if read it. + */ + utbuf.actime = sb.st_atime; + utbuf.modtime = sb.st_mtime; + (void) utime(inname, &utbuf); /* don't care if loses */ + (void) close(fd); + } + (void) putchar('\n'); +} + + +void +tryit(buf, nb, zflag) +unsigned char *buf; +int nb, zflag; +{ + /* + * Try compression stuff + */ + if (!zflag || zmagic(buf, nb) != 1) + /* + * try tests in /etc/magic (or surrogate magic file) + */ + if (softmagic(buf, nb) != 1) + /* + * try known keywords, check for ascii-ness too. + */ + if (ascmagic(buf, nb) != 1) + /* + * abandon hope, all ye who remain here + */ + ckfputs("data", stdout); +} diff --git a/usr.bin/file/file.h b/usr.bin/file/file.h new file mode 100644 index 0000000..12d5c6f --- /dev/null +++ b/usr.bin/file/file.h @@ -0,0 +1,128 @@ +/* + * file.h - definitions for file(1) program + * @(#)$Id: file.h,v 1.19 1994/05/03 17:58:23 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. + */ + +#define HOWMANY 8192 /* how much of the file to look at */ +#define MAXMAGIS 1000 /* max entries in /etc/magic */ +#define MAXDESC 50 /* max leng of text description */ +#define MAXstring 32 /* max leng of "string" types */ + +struct magic { + short flag; +#define INDIR 1 /* if '>(...)' appears, */ +#define UNSIGNED 2 /* comparison is unsigned */ + short cont_level; /* level of ">" */ + struct { + char type; /* byte short long */ + long offset; /* offset from indirection */ + } in; + long offset; /* offset to magic number */ + unsigned char reln; /* relation (0=eq, '>'=gt, etc) */ + char type; /* int, short, long or string. */ + char vallen; /* length of string value, if any */ +#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 + union VALUETYPE { + unsigned char b; + unsigned short h; + unsigned long l; + char s[MAXstring]; + unsigned char hs[2]; /* 2 bytes of a fixed-endian "short" */ + unsigned char hl[4]; /* 2 bytes of a fixed-endian "long" */ + } value; /* either number or string */ + unsigned long mask; /* mask before comparison with value */ + char nospflag; /* supress space character */ + char desc[MAXDESC]; /* description */ +}; + +#include <stdio.h> /* Include that here, to make sure __P gets defined */ + +#ifndef __P +# if __STDC__ || __cplusplus +# define __P(a) a +# else +# define __P(a) () +# define const +# endif +#endif + +extern int apprentice __P((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 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 void tryit __P((unsigned char *, int, int)); +extern int zmagic __P((unsigned char *, int)); +extern void ckfprintf __P((FILE *, const char *, ...)); +extern unsigned long signextend __P((struct magic *, unsigned long)); + + + +extern int errno; /* Some unixes don't define this.. */ + +extern char *progname; /* the program name */ +extern char *magicfile; /* name of the magic file */ +extern int lineno; /* current line number in magic file */ + +extern struct magic *magic; /* array of magic entries */ +extern int nmagic; /* number of valid magic[]s */ + + +extern int debug; /* enable debugging? */ +extern int zflag; /* process compressed files? */ +extern int lflag; /* follow symbolic links? */ + +extern int optind; /* From getopt(3) */ +extern char *optarg; + +#if !defined(__STDC__) || defined(sun) || defined(__sun__) || defined(__convex__) +extern int sys_nerr; +extern char *sys_errlist[]; +#define strerror(e) \ + (((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error") +#endif + +#ifndef MAXPATHLEN +#define MAXPATHLEN 512 +#endif diff --git a/usr.bin/file/fsmagic.c b/usr.bin/file/fsmagic.c new file mode 100644 index 0000000..684e118 --- /dev/null +++ b/usr.bin/file/fsmagic.c @@ -0,0 +1,174 @@ +/* + * 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 <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdlib.h> +#ifndef major /* if `major' not defined in types.h, */ +#include <sys/sysmacros.h> /* try this one. */ +#endif +#ifndef major /* still not defined? give up, manual intervention needed */ + /* If cc tries to compile this, read and act on it. */ + /* On most systems cpp will discard it automatically */ + Congratulations, you have found a portability bug. + Please grep /usr/include/sys and edit the above #include + to point at the file that defines the "major" macro. +#endif /*major*/ + +#include "file.h" + +#ifndef lint +static char *moduleid = + "@(#)$Id: fsmagic.c,v 1.22 1993/02/19 12:09:04 ian 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 (sb->st_mode & S_ISUID) ckfputs("setuid ", stdout); + if (sb->st_mode & S_ISGID) ckfputs("setgid ", stdout); + if (sb->st_mode & S_ISVTX) ckfputs("sticky ", stdout); + + switch (sb->st_mode & S_IFMT) { + case S_IFDIR: + ckfputs("directory", stdout); + return 1; + case S_IFCHR: + (void) printf("character special (%d/%d)", + major(sb->st_rdev), minor(sb->st_rdev)); + return 1; + case S_IFBLK: + (void) printf("block special (%d/%d)", + major(sb->st_rdev), minor(sb->st_rdev)); + return 1; + /* 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_IFLNK + case S_IFLNK: + { + char buf[BUFSIZ+4]; + register 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 + case S_IFSOCK: + ckfputs("socket", stdout); + return 1; +#endif + case S_IFREG: + break; + default: + error("invalid mode 0%o.\n", sb->st_mode); + /*NOTREACHED*/ + } + + /* + * regular file, check next possibility + */ + if (sb->st_size == 0) { + ckfputs("empty", stdout); + return 1; + } + return 0; +} + diff --git a/usr.bin/file/is_tar.c b/usr.bin/file/is_tar.c new file mode 100644 index 0000000..5b036be --- /dev/null +++ b/usr.bin/file/is_tar.c @@ -0,0 +1,100 @@ +/* + * is_tar() -- figure out whether file is a tar archive. + * + * Stolen (by the author!) from the public domain tar program: + * Pubic 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.8 1993/09/16 21:09:35 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" + +#define isodigit(c) ( ((c) >= '0') && ((c) <= '7') ) + +#if defined(__STDC__) || defined(__cplusplus) +static long from_oct(int, char*); /* Decode octal number */ +#else +static long from_oct(); +#endif + +/* + * 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; +{ + register union record *header = (union record *)buf; + register int i; + register long sum, recsum; + register 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 long +from_oct(digs, where) + register int digs; + register char *where; +{ + register long value; + + while (isspace(*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(*where)) + return -1; /* Ended on non-space/nul */ + + return value; +} diff --git a/usr.bin/file/magic.5 b/usr.bin/file/magic.5 new file mode 100644 index 0000000..7c2788e --- /dev/null +++ b/usr.bin/file/magic.5 @@ -0,0 +1,194 @@ +.TH MAGIC __SECTION__ "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 +The +.IR file (1) +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 +.B __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. +.IP date +A four-byte value interpreted as a unix date. +.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. +.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, +or +.BR ^ , +to specify that the value from the file must have clear any of the bits +that are set in the specified value. +.IP +Numeric values are specified in C form; e.g. +.B 13 +is decimal, +.B 013 +is octal, and +.B 0x13 +is hexadecimal. +to specify that any value will match. If the character +is omitted, it is assumed to be +.BR = . +.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 +.IR 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 a 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 [.[bsl]][+-][ 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 [bsl] +type specifier. 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. +.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-dependant; 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 +.IR file (1) +\- 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.11 1994/05/03 17:58:23 christos Exp $ diff --git a/usr.bin/file/names.h b/usr.bin/file/names.h new file mode 100644 index 0000000..5d989ee --- /dev/null +++ b/usr.bin/file/names.h @@ -0,0 +1,90 @@ +/* + * 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.11 1993/09/16 21:14:20 christos Exp $ + */ + +/* these types are used to index the table 'types': keep em in sync! */ +#define L_C 0 /* first and foremost on UNIX */ +#define L_FORT 1 /* the oldest one */ +#define L_MAKE 2 /* Makefiles */ +#define L_PLI 3 /* PL/1 */ +#define L_MACH 4 /* some kinda assembler */ +#define L_ENG 5 /* English */ +#define L_PAS 6 /* Pascal */ +#define L_MAIL 7 /* Electronic mail */ +#define L_NEWS 8 /* Usenet Netnews */ + +static char *types[] = { + "c program text", + "fortran program text", + "make commands text" , + "pl/1 program text", + "assembler program text", + "English text", + "pascal program text", + "mail text", + "news text", + "can't happen error on names.h/types", + 0}; + +static struct names { + char *name; + short type; +} names[] = { + /* These must be sorted by eye for optimal hit rate */ + /* Add to this list only after substantial meditation */ + {"/*", L_C}, /* must preced "The", "the", etc. */ + {"#include", L_C}, + {"char", L_C}, + {"The", L_ENG}, + {"the", L_ENG}, + {"double", L_C}, + {"extern", L_C}, + {"float", L_C}, + {"real", 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}, + {"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}, + {NULL, 0} +}; +#define NNAMES ((sizeof(names)/sizeof(struct names)) - 1) diff --git a/usr.bin/file/patchlevel.h b/usr.bin/file/patchlevel.h new file mode 100644 index 0000000..25f01c8 --- /dev/null +++ b/usr.bin/file/patchlevel.h @@ -0,0 +1,53 @@ +#define FILE_VERSION_MAJOR 3 +#define patchlevel 14 + +/* + * Patchlevel file for Ian Darwin's MAGIC command. + * $Id: patchlevel.h,v 1.14 1994/05/03 17:58:23 christos Exp $ + * + * $Log: patchlevel.h,v $ + * 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/usr.bin/file/print.c b/usr.bin/file/print.c new file mode 100644 index 0000000..a91f429 --- /dev/null +++ b/usr.bin/file/print.c @@ -0,0 +1,204 @@ +/* + * 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 <stdio.h> +#include <errno.h> +#include <string.h> +#if __STDC__ +# include <stdarg.h> +#else +# include <varargs.h> +#endif +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include "file.h" + +#ifndef lint +static char *moduleid = + "@(#)$Id: print.c,v 1.21 1994/05/03 17:58:23 christos Exp $"; +#endif /* lint */ + +#define SZOF(a) (sizeof(a) / sizeof(a[0])) + +void +mdump(m) +struct magic *m; +{ + static char *typ[] = { "invalid", "byte", "short", "invalid", + "long", "string", "date", "beshort", + "belong", "bedate", "leshort", "lelong", + "ledate" }; + (void) fputc('[', stderr); + (void) fprintf(stderr, ">>>>>>>> %d" + 8 - (m->cont_level & 7), + m->offset); + + if (m->flag & INDIR) + (void) fprintf(stderr, "(%s,%d),", + (m->in.type >= 0 && m->in.type < SZOF(typ)) ? + typ[(unsigned char) m->in.type] : + "*bad*", + m->in.offset); + + (void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "", + (m->type >= 0 && m->type < SZOF(typ)) ? + typ[(unsigned char) m->type] : + "*bad*"); + if (m->mask != ~0L) + (void) fprintf(stderr, " & %.8x", m->mask); + + (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: + showstr(stderr, m->value.s, -1); + break; + case DATE: + case LEDATE: + case BEDATE: + { + char *rt, *pp = ctime((time_t*) &m->value.l); + if ((rt = strchr(pp, '\n')) != NULL) + *rt = '\0'; + (void) fprintf(stderr, "%s,", pp); + if (rt) + *rt = '\n'; + } + break; + default: + (void) fputs("*bad*", stderr); + break; + } + } + (void) fprintf(stderr, ",\"%s\"]\n", m->desc); +} + +/* + * ckfputs - futs, 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 +#if __STDC__ +ckfprintf(FILE *f, const char *fmt, ...) +#else +ckfprintf(va_alist) + va_dcl +#endif +{ + va_list va; +#if __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 +#if __STDC__ +error(const char *f, ...) +#else +error(va_alist) + va_dcl +#endif +{ + va_list va; +#if __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 +#if __STDC__ +magwarn(const char *f, ...) +#else +magwarn(va_alist) + va_dcl +#endif +{ + va_list va; +#if __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); +} diff --git a/usr.bin/file/softmagic.c b/usr.bin/file/softmagic.c new file mode 100644 index 0000000..17840966 --- /dev/null +++ b/usr.bin/file/softmagic.c @@ -0,0 +1,463 @@ +/* + * softmagic - interpret variable magic from /etc/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 <time.h> +#include <sys/types.h> + +#include "file.h" + +#ifndef lint +static char *moduleid = + "@(#)$Id: softmagic.c,v 1.26 1994/06/06 05:27:29 christos Exp $"; +#endif /* lint */ + +static int match __P((unsigned char *, int)); +static int mget __P((union VALUETYPE *, + unsigned char *, struct magic *, int)); +static int mcheck __P((union VALUETYPE *, struct magic *)); +static void mprint __P((union VALUETYPE *, struct magic *)); +static void mdebug __P((long, char *, int)); +static int mconvert __P((union VALUETYPE *, struct magic *)); + +/* + * 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; +{ + if (match(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(s, nbytes) +unsigned char *s; +int nbytes; +{ + int magindex = 0; + int cont_level = 0; + int need_separator = 0; + union VALUETYPE p; + + 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; + } + + 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 */ + cont_level++; + 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 (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; + } + mprint(&p, &magic[magindex]); + if (magic[magindex].desc[0]) + need_separator = 1; + + /* + * If we see any continuations + * at a higher level, + * process them. + */ + cont_level++; + } + } + } + return 1; /* all through */ + } + return 0; /* no match at all */ +} + +static void +mprint(p, m) +union VALUETYPE *p; +struct magic *m; +{ + char *pp, *rt; + unsigned long v; + + + 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: + v = p->l; + break; + + case STRING: + if (m->reln == '=') { + (void) printf(m->desc, m->value.s); + } + else { + (void) printf(m->desc, p->s); + } + return; + + case DATE: + case BEDATE: + case LEDATE: + pp = ctime((time_t*) &p->l); + if ((rt = strchr(pp, '\n')) != NULL) + *rt = '\0'; + (void) printf(m->desc, pp); + return; + default: + error("invalid m->type (%d) in mprint().\n", m->type); + /*NOTREACHED*/ + } + + v = signextend(m, v) & m->mask; + (void) printf(m->desc, (unsigned char) v); +} + +/* + * Convert the byte order of the data we are looking at + */ +static int +mconvert(p, m) +union VALUETYPE *p; +struct magic *m; +{ + char *rt; + + switch (m->type) { + case BYTE: + case SHORT: + case LONG: + case DATE: + return 1; + case STRING: + /* Null terminate and eat the return */ + p->s[sizeof(p->s) - 1] = '\0'; + if ((rt = strchr(p->s, '\n')) != NULL) + *rt = '\0'; + return 1; + case BESHORT: + p->h = (short)((p->hs[0]<<8)|(p->hs[1])); + return 1; + case BELONG: + case BEDATE: + p->l = (long) + ((p->hl[0]<<24)|(p->hl[1]<<16)|(p->hl[2]<<8)|(p->hl[3])); + return 1; + case LESHORT: + p->h = (short)((p->hs[1]<<8)|(p->hs[0])); + return 1; + case LELONG: + case LEDATE: + p->l = (long) + ((p->hl[3]<<24)|(p->hl[2]<<16)|(p->hl[1]<<8)|(p->hl[0])); + return 1; + default: + error("invalid type %d in mconvert().\n", m->type); + return 0; + } +} + + +static void +mdebug(offset, str, len) +long 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; +{ + long offset = m->offset; + 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; + + if (m->flag & INDIR) { + + switch (m->in.type) { + case BYTE: + offset = p->b + m->in.offset; + break; + case SHORT: + offset = p->h + m->in.offset; + break; + case LONG: + offset = p->l + m->in.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; +{ + register unsigned long l = m->value.l; + register unsigned long 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: + v = p->l; + break; + + case STRING: + l = 0; + /* 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. + */ + v = 0; + { + register unsigned char *a = (unsigned char*)m->value.s; + register unsigned char *b = (unsigned char*)p->s; + register int len = m->vallen; + + while (--len >= 0) + if ((v = *b++ - *a++) != 0) + break; + } + break; + default: + error("invalid type %d in mcheck().\n", m->type); + return 0;/*NOTREACHED*/ + } + + v = signextend(m, v) & m->mask; + + switch (m->reln) { + case 'x': + if (debug) + (void) fprintf(stderr, "%lu == *any* = 1\n", v); + matched = 1; + break; + + case '!': + matched = v != l; + if (debug) + (void) fprintf(stderr, "%lu != %lu = %d\n", + v, l, matched); + break; + + case '=': + matched = v == l; + if (debug) + (void) fprintf(stderr, "%lu == %lu = %d\n", + v, l, matched); + break; + + case '>': + if (m->flag & UNSIGNED) { + matched = v > l; + if (debug) + (void) fprintf(stderr, "%lu > %lu = %d\n", + v, l, matched); + } + else { + matched = (long) v > (long) l; + if (debug) + (void) fprintf(stderr, "%ld > %ld = %d\n", + v, l, matched); + } + break; + + case '<': + if (m->flag & UNSIGNED) { + matched = v < l; + if (debug) + (void) fprintf(stderr, "%lu < %lu = %d\n", + v, l, matched); + } + else { + matched = (long) v < (long) l; + if (debug) + (void) fprintf(stderr, "%ld < %ld = %d\n", + v, l, matched); + } + break; + + case '&': + matched = (v & l) == l; + if (debug) + (void) fprintf(stderr, "((%lx & %lx) == %lx) = %d\n", + v, l, l, matched); + break; + + case '^': + matched = (v & l) != l; + if (debug) + (void) fprintf(stderr, "((%lx & %lx) != %lx) = %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/usr.bin/file/tar.h b/usr.bin/file/tar.h new file mode 100644 index 0000000..fd6f0c9 --- /dev/null +++ b/usr.bin/file/tar.h @@ -0,0 +1,179 @@ +/* + * 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.3 1992/09/08 15:32:41 ian 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; + + +/* + * Declarations of functions available to the world. + */ +/*LINTLIBRARY*/ +union record *findrec(); +void userec(); +union record *endofrecs(); +void anno(); +#define annorec(stream, msg) anno(stream, msg, 0) /* Cur rec */ +#define annofile(stream, msg) anno(stream, msg, 1) /* Saved rec */ |