Virgin import of Christos Zoulas's FILE 3.34.

This commit is contained in:
obrien 2001-03-25 18:37:04 +00:00
parent 8178afbfe8
commit b5e130840c
28 changed files with 773 additions and 129 deletions

View File

@ -140,3 +140,33 @@
0 string MOVI Silicon Graphics movie file 0 string MOVI Silicon Graphics movie file
4 string moov Apple QuickTime movie file (moov) 4 string moov Apple QuickTime movie file (moov)
4 string mdat Apple QuickTime movie file (mdat) 4 string mdat Apple QuickTime movie file (mdat)
# iso 13818 transport stream
#
# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001 (ISO 13818.1)
# (the following is a little bit restrictive and works fine for a stream
# that starts with PAT properly. it won't work for stream data, that is
# cut from an input device data right in the middle, but this shouldn't
# disturb)
# syncbyte 8 bit 0x47
# error_ind 1 bit -
# payload_start 1 bit 1
# priority 1 bit -
# PID 13 bit 0x0000
# scrambling 2 bit -
# adaptfld_ctrl 2 bit 1 or 3
# conti_count 4 bit 0
0 belong&0xFF5FFF1F 0x47400010 MPEG transport stream data
>188 byte !0x47 CORRUPTED
# ATARI ST relocatable PRG
#
# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001
# (according to Roland Waldi, Oct 21, 1987)
# besides the magic 0x601a, the text segment size is checked to be
# not larger than 1 MB (which is a lot on ST).
0 belong&0xFFFFFFF0 0x601A0000 Atari ST M68K executable
>2 belong x (txt=%ld,
>6 belong x dat=%ld,
>10 belong x bss=%ld,
>14 belong x sym=%ld)

View File

@ -234,3 +234,18 @@
# http://www.XCF.Berkeley.EDU/~jmacd/prcs.html) generates a packaged project # http://www.XCF.Berkeley.EDU/~jmacd/prcs.html) generates a packaged project
# file which is recognized by the following entry: # file which is recognized by the following entry:
0 leshort 0xeb81 PRCS packaged project 0 leshort 0xeb81 PRCS packaged project
# Microsoft cabinets
# by David Necas (Yeti) <yeti@physics.muni.cz>
0 string MSCF\0\0\0\0 Microsoft cabinet file data,
>25 byte x v%d
>24 byte x \b.%d
# GTKtalog catalogs
# by David Necas (Yeti) <yeti@physics.muni.cz>
0 lelong <20
>4 string gtktalog\ GTKtalog catalog data,
>>13 string 3 version 3
>>>14 beshort 0x677a (gzipped)
>>>14 beshort !0x677a (not gzipped)
>>13 string >3 version %s

View File

@ -0,0 +1,12 @@
#------------------------------------------------------------------------------
# Dyadic: file(1) magic for Dyalog APL.
#
0 byte 0xaa
>1 byte <4 Dyalog APL
>>1 byte 0x00 incomplete workspace
>>1 byte 0x01 component file
>>1 byte 0x02 external variable
>>1 byte 0x03 workspace
>>2 byte x version %d
>>3 byte x .%d

View File

@ -0,0 +1,9 @@
#------------------------------------------------------------------------------
# T602 editor documents
# by David Necas <yeti@physics.muni.cz>
0 string @CT\ T602 document data,
>4 string 0 Kamenicky
>4 string 1 CP 852
>4 string 2 KOI8-CS
>4 string >2 unknown encoding

View File

@ -61,6 +61,8 @@
>>18 leshort 10 MIPS R3000_LE, >>18 leshort 10 MIPS R3000_LE,
>>18 leshort 11 RS6000 - invalid byte order, >>18 leshort 11 RS6000 - invalid byte order,
>>18 leshort 15 PA-RISC - invalid byte order, >>18 leshort 15 PA-RISC - invalid byte order,
>>>50 leshort 0x0214 2.0
>>>48 leshort &0x0008 (LP64),
>>18 leshort 16 nCUBE, >>18 leshort 16 nCUBE,
>>18 leshort 17 Fujitsu VPP500, >>18 leshort 17 Fujitsu VPP500,
>>18 leshort 18 SPARC32PLUS, >>18 leshort 18 SPARC32PLUS,
@ -89,6 +91,20 @@
>>20 lelong 1 version 1 >>20 lelong 1 version 1
>>36 lelong 1 MathCoPro/FPU/MAU Required >>36 lelong 1 MathCoPro/FPU/MAU Required
>8 string >\0 (%s) >8 string >\0 (%s)
>8 string \0
>>7 byte 0 (SYSV)
>>7 byte 1 (HP-UX)
>>7 byte 2 (NetBSD)
>>7 byte 3 (GNU/Linux)
>>7 byte 4 (GNU/Hurd)
>>7 byte 5 (86Open)
>>7 byte 6 (Solaris)
>>7 byte 7 (Monterey)
>>7 byte 8 (IRIX)
>>7 byte 9 (FreeBSD)
>>7 byte 10 (Tru64)
>>7 byte 97 (ARM)
>>7 byte 255 (embedded)
>5 byte 2 MSB >5 byte 2 MSB
# only for MIPS R3000_BE # only for MIPS R3000_BE
>>18 beshort 8 >>18 beshort 8
@ -128,7 +144,9 @@
>>18 beshort 9 Amdahl, >>18 beshort 9 Amdahl,
>>18 beshort 10 MIPS R3000_LE - invalid byte order, >>18 beshort 10 MIPS R3000_LE - invalid byte order,
>>18 beshort 11 RS6000, >>18 beshort 11 RS6000,
>>18 beshort 15 PA-RISC, >>18 beshort 15 PA-RISC
>>>50 beshort 0x0214 2.0
>>>48 beshort &0x0008 (LP64)
>>18 beshort 16 nCUBE, >>18 beshort 16 nCUBE,
>>18 beshort 17 Fujitsu VPP500, >>18 beshort 17 Fujitsu VPP500,
>>18 beshort 18 SPARC32PLUS, >>18 beshort 18 SPARC32PLUS,

View File

@ -0,0 +1,18 @@
#------------------------------------------------------------------------------
# hitach-sh: file(1) magic for Hitachi Super-H
#
# Super-H COFF
#
0 beshort 0x0500 Hitachi SH big-endian COFF
>18 beshort&0x0002 =0x0000 object
>18 beshort&0x0002 =0x0002 executable
>18 beshort&0x0008 =0x0000 \b, stripped
>18 beshort&0x0008 =0x0008 \b, not stripped
#
0 leshort 0x0550 Hitachi SH little-endian COFF
>18 leshort&0x0002 =0x0000 object
>18 leshort&0x0002 =0x0002 executable
>18 leshort&0x0008 =0x0000 \b, stripped
>18 leshort&0x0008 =0x0008 \b, not stripped

View File

@ -249,3 +249,143 @@
>2 beshort 0407 impure binary >2 beshort 0407 impure binary
>2 beshort 0410 read-only binary >2 beshort 0410 read-only binary
>2 beshort 0413 demand paged binary >2 beshort 0413 demand paged binary
#
# From David Gero <dgero@nortelnetworks.com>
# HP-UX 10.20 core file format from /usr/include/sys/core.h
# Unfortunately, HP-UX uses corehead blocks without specifying the order
# There are four we care about:
# CORE_KERNEL, which starts with the string "HP-UX"
# CORE_EXEC, which contains the name of the command
# CORE_PROC, which contains the signal number that caused the core dump
# CORE_FORMAT, which contains the version of the core file format (== 1)
# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
# but we include all 6 variations of the order of the first 3, and
# assume that PROC will always be last
# Order 1: KERNEL, EXEC, FORMAT, PROC
0x10 string HP-UX
>0 belong 2
>>0xC belong 0x3C
>>>0x4C belong 0x100
>>>>0x58 belong 0x44
>>>>>0xA0 belong 1
>>>>>>0xAC belong 4
>>>>>>>0xB0 belong 1
>>>>>>>>0xB4 belong 4 core file
>>>>>>>>>0x90 string >\0 from '%s'
>>>>>>>>>0xC4 belong 3 - received SIGQUIT
>>>>>>>>>0xC4 belong 4 - received SIGILL
>>>>>>>>>0xC4 belong 5 - received SIGTRAP
>>>>>>>>>0xC4 belong 6 - received SIGABRT
>>>>>>>>>0xC4 belong 7 - received SIGEMT
>>>>>>>>>0xC4 belong 8 - received SIGFPE
>>>>>>>>>0xC4 belong 10 - received SIGBUS
>>>>>>>>>0xC4 belong 11 - received SIGSEGV
>>>>>>>>>0xC4 belong 12 - received SIGSYS
>>>>>>>>>0xC4 belong 33 - received SIGXCPU
>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
# Order 2: KERNEL, FORMAT, EXEC, PROC
>>>0x4C belong 1
>>>>0x58 belong 4
>>>>>0x5C belong 1
>>>>>>0x60 belong 0x100
>>>>>>>0x6C belong 0x44
>>>>>>>>0xB4 belong 4 core file
>>>>>>>>>0xA4 string >\0 from '%s'
>>>>>>>>>0xC4 belong 3 - received SIGQUIT
>>>>>>>>>0xC4 belong 4 - received SIGILL
>>>>>>>>>0xC4 belong 5 - received SIGTRAP
>>>>>>>>>0xC4 belong 6 - received SIGABRT
>>>>>>>>>0xC4 belong 7 - received SIGEMT
>>>>>>>>>0xC4 belong 8 - received SIGFPE
>>>>>>>>>0xC4 belong 10 - received SIGBUS
>>>>>>>>>0xC4 belong 11 - received SIGSEGV
>>>>>>>>>0xC4 belong 12 - received SIGSYS
>>>>>>>>>0xC4 belong 33 - received SIGXCPU
>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
# Order 3: FORMAT, KERNEL, EXEC, PROC
0x24 string HP-UX
>0 belong 1
>>0xC belong 4
>>>0x10 belong 1
>>>>0x14 belong 2
>>>>>0x20 belong 0x3C
>>>>>>0x60 belong 0x100
>>>>>>>0x6C belong 0x44
>>>>>>>>0xB4 belong 4 core file
>>>>>>>>>0xA4 string >\0 from '%s'
>>>>>>>>>0xC4 belong 3 - received SIGQUIT
>>>>>>>>>0xC4 belong 4 - received SIGILL
>>>>>>>>>0xC4 belong 5 - received SIGTRAP
>>>>>>>>>0xC4 belong 6 - received SIGABRT
>>>>>>>>>0xC4 belong 7 - received SIGEMT
>>>>>>>>>0xC4 belong 8 - received SIGFPE
>>>>>>>>>0xC4 belong 10 - received SIGBUS
>>>>>>>>>0xC4 belong 11 - received SIGSEGV
>>>>>>>>>0xC4 belong 12 - received SIGSYS
>>>>>>>>>0xC4 belong 33 - received SIGXCPU
>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
# Order 4: EXEC, KERNEL, FORMAT, PROC
0x64 string HP-UX
>0 belong 0x100
>>0xC belong 0x44
>>>0x54 belong 2
>>>>0x60 belong 0x3C
>>>>>0xA0 belong 1
>>>>>>0xAC belong 4
>>>>>>>0xB0 belong 1
>>>>>>>>0xB4 belong 4 core file
>>>>>>>>>0x44 string >\0 from '%s'
>>>>>>>>>0xC4 belong 3 - received SIGQUIT
>>>>>>>>>0xC4 belong 4 - received SIGILL
>>>>>>>>>0xC4 belong 5 - received SIGTRAP
>>>>>>>>>0xC4 belong 6 - received SIGABRT
>>>>>>>>>0xC4 belong 7 - received SIGEMT
>>>>>>>>>0xC4 belong 8 - received SIGFPE
>>>>>>>>>0xC4 belong 10 - received SIGBUS
>>>>>>>>>0xC4 belong 11 - received SIGSEGV
>>>>>>>>>0xC4 belong 12 - received SIGSYS
>>>>>>>>>0xC4 belong 33 - received SIGXCPU
>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
# Order 5: FORMAT, EXEC, KERNEL, PROC
0x78 string HP-UX
>0 belong 1
>>0xC belong 4
>>>0x10 belong 1
>>>>0x14 belong 0x100
>>>>>0x20 belong 0x44
>>>>>>0x68 belong 2
>>>>>>>0x74 belong 0x3C
>>>>>>>>0xB4 belong 4 core file
>>>>>>>>>0x58 string >\0 from '%s'
>>>>>>>>>0xC4 belong 3 - received SIGQUIT
>>>>>>>>>0xC4 belong 4 - received SIGILL
>>>>>>>>>0xC4 belong 5 - received SIGTRAP
>>>>>>>>>0xC4 belong 6 - received SIGABRT
>>>>>>>>>0xC4 belong 7 - received SIGEMT
>>>>>>>>>0xC4 belong 8 - received SIGFPE
>>>>>>>>>0xC4 belong 10 - received SIGBUS
>>>>>>>>>0xC4 belong 11 - received SIGSEGV
>>>>>>>>>0xC4 belong 12 - received SIGSYS
>>>>>>>>>0xC4 belong 33 - received SIGXCPU
>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
# Order 6: EXEC, FORMAT, KERNEL, PROC
>0 belong 0x100
>>0xC belong 0x44
>>>0x54 belong 1
>>>>0x60 belong 4
>>>>>0x64 belong 1
>>>>>>0x68 belong 2
>>>>>>>0x74 belong 0x2C
>>>>>>>>0xB4 belong 4 core file
>>>>>>>>>0x44 string >\0 from '%s'
>>>>>>>>>0xC4 belong 3 - received SIGQUIT
>>>>>>>>>0xC4 belong 4 - received SIGILL
>>>>>>>>>0xC4 belong 5 - received SIGTRAP
>>>>>>>>>0xC4 belong 6 - received SIGABRT
>>>>>>>>>0xC4 belong 7 - received SIGEMT
>>>>>>>>>0xC4 belong 8 - received SIGFPE
>>>>>>>>>0xC4 belong 10 - received SIGBUS
>>>>>>>>>0xC4 belong 11 - received SIGSEGV
>>>>>>>>>0xC4 belong 12 - received SIGSYS
>>>>>>>>>0xC4 belong 33 - received SIGXCPU
>>>>>>>>>0xC4 belong 34 - received SIGXFSZ

View File

@ -162,19 +162,6 @@
# Conflicts with other entries [BABYL] # Conflicts with other entries [BABYL]
#0 string BA PC bitmap array data #0 string BA PC bitmap array data
# JPEG images
# SunOS 5.5.1 had
#
# 0 string \377\330\377\340 JPEG file
# 0 string \377\330\377\356 JPG file
#
# both of which turn into "JPEG image data" here.
#
0 beshort 0xffd8 JPEG image data
>6 string JFIF \b, JFIF standard
# HSI is Handmade Software's proprietary JPEG encoding scheme
0 string hsi1 JPEG image data, HSI proprietary
# XPM icons (Greg Roelofs, newt@uchicago.edu) # XPM icons (Greg Roelofs, newt@uchicago.edu)
# note possible collision with C/REXX entry in c-lang; currently commented out # note possible collision with C/REXX entry in c-lang; currently commented out
0 string /*\ XPM\ */ X pixmap image text 0 string /*\ XPM\ */ X pixmap image text
@ -274,3 +261,42 @@
# DICOM medical imaging data # DICOM medical imaging data
128 string DICM DICOM medical imaging data 128 string DICM DICOM medical imaging data
# XWD - X-Windows Dump file.
# As described in /usr/X11R6/include/X11/XWDFile.h
# used by the xwd program.
# Bradford Castalia, idaeim, 1/01
4 belong 7 XWD X-Widows Dump image data
>100 string >\0 \b, "%s"
>16 belong x \b, %dx
>20 belong x \b%dx
>12 belong x \b%d
# PDS - Planetary Data System
# These files use Parameter Value Language in the header section.
# Unfortunately, there is no certain magic, but the following
# strings have been found to be most likely.
0 string NJPL1I00 PDS (JPL) image data
2 string NJPL1I PDS (JPL) image data
0 string CCSD3ZF PDS (CCSD) image data
2 string CCSD3Z PDS (CCSD) image data
0 string PDS_ PDS image data
0 string LBLSIZE= PDS (VICAR) image data
0 string GSTIm GNU SmallTalk image file
# pM8x: ATARI STAD compressed bitmap format
#
# from Oskar Schirmer <schirmer@scara.com> Feb 2, 2001
# p M 8 5/6 xx yy zz data...
# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
# bytes either run horizontally (pM85) or vertically (pM86). yy is the
# most frequent byte, xx and zz are runlength escape codes, where xx is
# used for runs of yy.
#
0 string pM85 Atari ST STAD bitmap image data (hor)
>5 byte 0x00 (white background)
>5 byte 0xFF (black background)
0 string pM86 Atari ST STAD bitmap image data (vert)
>5 byte 0x00 (white background)
>5 byte 0xFF (black background)

View File

@ -10,7 +10,6 @@
# #
0 beshort 0xffd8 JPEG image data 0 beshort 0xffd8 JPEG image data
>6 string JFIF \b, JFIF standard >6 string JFIF \b, JFIF standard
# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06 # The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
# in a vain attempt to add image size reporting for JFIF. Note that these # in a vain attempt to add image size reporting for JFIF. Note that these
# tests are not fool-proof since some perfectly valid JPEGs are currently # tests are not fool-proof since some perfectly valid JPEGs are currently
@ -22,8 +21,8 @@
>13 byte 0 \b, aspect ratio >13 byte 0 \b, aspect ratio
>13 byte 1 \b, resolution (DPI) >13 byte 1 \b, resolution (DPI)
>13 byte 2 \b, resolution (DPCM) >13 byte 2 \b, resolution (DPCM)
>14 beshort x \b X%d: >14 beshort x \b, %d x
>16 beshort x \bY%d >16 beshort x \b %d
#>4 beshort x \b, segment length %d #>4 beshort x \b, segment length %d
# Next, show thumbnail info, if it exists: # Next, show thumbnail info, if it exists:
>18 byte !0 \b, thumbnail %dx >18 byte !0 \b, thumbnail %dx

View File

@ -6,8 +6,9 @@
0 string ;; Lisp/Scheme program text 0 string ;; Lisp/Scheme program text
# Emacs 18 - this is always correct, but not very magical. # Emacs 18 - this is always correct, but not very magical.
0 string \012( byte-compiled Emacs-Lisp program data 0 string \012( byte-compiled Emacs-Lisp program data
# Emacs 19 # Emacs 19+ - ver. recognition added by Ian Springer
0 string ;ELC\023\000\000\000 byte-compiled Emacs-Lisp program data 0 string ;ELC byte-compiled Emacs-Lisp program data,
>4 byte >0 version %d
# #
# Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr> # Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr>
0 string (SYSTEM::VERSION\040' CLISP byte-compiled Lisp program text 0 string (SYSTEM::VERSION\040' CLISP byte-compiled Lisp program text

View File

@ -3,3 +3,5 @@
# magic: file(1) magic for magic files # magic: file(1) magic for magic files
# #
0 string #\ Magic magic text file for file(1) cmd 0 string #\ Magic magic text file for file(1) cmd
0 lelong 0xF11E041C magic binary file for file(1) cmd
>4 lelong x (version %d)

View File

@ -224,12 +224,14 @@
0 string \114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106 ms-Windows shortcut 0 string \114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106 ms-Windows shortcut
#ico files #ico files
0 string \000\000\001\000\001\000\040\040\020\000\000\000\000\000\350\002\000\000 Icon for ms-windows
0 string \000\000\001\000\004\000\040\040\020\000\000\000\000\000\350\002 Icon for ms-windows
0 string \102\101\050\000\000\000\056\000\000\000\000\000\000\000 Icon for ms-windows 0 string \102\101\050\000\000\000\056\000\000\000\000\000\000\000 Icon for ms-windows
0 string \000\000\001\000\002\000\040\040\010\000\000\000\000\000\350\002 Icon for ms-windows 0 string \000\000\001\000 ms-windows icon resource
0 string \000\000\001\000\006\000\020\020\020\000\000\000\000\000\050\001 Icon for ms-windows >4 byte 1 - 1 icon
0 string \000\000\001\000\002\000\020\020\020\000\000\000\000\000\050\001 Icon for ms-windows >4 byte >1 - %d icons
>>6 byte >0 \b, %dx
>>>7 byte >0 \b%d
>>8 byte 0 \b, 256-colors
>>8 byte >0 \b, %d-colors
# True Type fonts currently misidentified as raw G3 data # True Type fonts currently misidentified as raw G3 data

View File

@ -223,9 +223,9 @@
0 belong&0377777777 043600413 NetBSD/arm32 demand paged 0 belong&0377777777 043600413 NetBSD/arm32 demand paged
>0 byte &0x80 >0 byte &0x80
>>20 lelong <8192 shared library >>20 lelong <4096 shared library
>>20 lelong =8192 dynamically linked executable >>20 lelong =4096 dynamically linked executable
>>20 lelong >8192 dynamically linked executable >>20 lelong >4096 dynamically linked executable
>0 byte ^0x80 executable >0 byte ^0x80 executable
>16 lelong >0 not stripped >16 lelong >0 not stripped
0 belong&0377777777 043600410 NetBSD/arm32 pure 0 belong&0377777777 043600410 NetBSD/arm32 pure

View File

@ -1,6 +1,4 @@
# #
# $NetBSD: os9,v 1.2 1997/01/09 20:19:04 tls Exp $
#
# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved. # Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without

12
contrib/file/Magdir/parix Normal file
View File

@ -0,0 +1,12 @@
#------------------------------------------------------------------------------
#
# Parix COFF executables
# From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de>
#
0 beshort&0xfff 0xACE PARIX
>0 byte&0xf0 0x80 T800
>0 byte&0xf0 0x90 T9000
>19 byte&0x02 0x02 executable
>19 byte&0x02 0x00 object
>19 byte&0x0c 0x00 not stripped

View File

@ -0,0 +1,7 @@
#
#------------------------------------------------------------------------------
# tuxedo: file(1) magic for BEA TUXEDO data files
#
# from Ian Springer <ispringer@hotmail.com>
#
0 string \0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0 BEA TUXEDO DES mask data

View File

@ -6,7 +6,7 @@ bin_PROGRAMS = file
data_DATA = magic magic.mime data_DATA = magic magic.mime
MAGIC = @datadir@/magic MAGIC = @datadir@/magic
CPPFLAGS = -DMAGIC='"$(MAGIC)"' CPPFLAGS = -DMAGIC='"$(MAGIC)"' -DQUICK
man_MANS = file.1 magic.4 man_MANS = file.1 magic.4

View File

@ -72,7 +72,7 @@ bin_PROGRAMS = file
data_DATA = magic magic.mime data_DATA = magic magic.mime
MAGIC = @datadir@/magic MAGIC = @datadir@/magic
CPPFLAGS = -DMAGIC='"$(MAGIC)"' CPPFLAGS = -DMAGIC='"$(MAGIC)"' -DQUICK
man_MANS = file.1 magic.4 man_MANS = file.1 magic.4
@ -119,7 +119,7 @@ missing mkinstalldirs
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar TAR = gtar
GZIP_ENV = --best GZIP_ENV = --best
SOURCES = $(file_SOURCES) SOURCES = $(file_SOURCES)
OBJECTS = $(file_OBJECTS) OBJECTS = $(file_OBJECTS)

View File

@ -1,5 +1,5 @@
** README for file(1) Command ** ** README for file(1) Command **
@(#) $Id: README,v 1.23 2000/08/05 18:25:29 christos Exp $ @(#) $Id: README,v 1.24 2001/03/12 05:05:57 christos Exp $
This is Release 3.x of Ian Darwin's (copyright but distributable) This is Release 3.x of Ian Darwin's (copyright but distributable)
file(1) command. This version is the standard "file" command for Linux, file(1) command. This version is the standard "file" command for Linux,
@ -89,3 +89,12 @@ 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 800-387-2777. Email: mail@sq.com. Call for information on SGML editing
and browsing, Unix text processing, and customised products on Unix, and browsing, Unix text processing, and customised products on Unix,
DOS and Mac. DOS and Mac.
From Kees Zeelenberg
File 3.33 is available from Simtelnet and its mirrors:
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/file333b.zip
Documentation and sources are available from the same folder.
File determines the file type of a given file. It is an implementation
of the Unix file(1) command. It knows the 'magic number' of some 4000
files.

View File

@ -1,4 +1,4 @@
dnl aclocal.m4 generated automatically by aclocal 1.4a dnl aclocal.m4 generated automatically by aclocal 1.4
dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
@ -101,8 +101,6 @@ dnl AM_INIT_AUTOMAKE(package,version, [no-define])
AC_DEFUN(AM_INIT_AUTOMAKE, AC_DEFUN(AM_INIT_AUTOMAKE,
[AC_REQUIRE([AC_PROG_INSTALL]) [AC_REQUIRE([AC_PROG_INSTALL])
dnl We require 2.13 because we rely on SHELL being computed by configure.
AC_PREREQ([2.13])
PACKAGE=[$1] PACKAGE=[$1]
AC_SUBST(PACKAGE) AC_SUBST(PACKAGE)
VERSION=[$2] VERSION=[$2]

View File

@ -30,10 +30,15 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#ifdef QUICK
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#endif
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$Id: apprentice.c,v 1.33 2000/08/05 17:36:47 christos Exp $") FILE_RCSID("@(#)$Id: apprentice.c,v 1.34 2001/03/11 20:29:16 christos Exp $")
#endif /* lint */ #endif /* lint */
#define EATAB {while (isascii((unsigned char) *l) && \ #define EATAB {while (isascii((unsigned char) *l) && \
@ -52,27 +57,94 @@ FILE_RCSID("@(#)$Id: apprentice.c,v 1.33 2000/08/05 17:36:47 christos Exp $")
static int getvalue __P((struct magic *, char **)); static int getvalue __P((struct magic *, char **));
static int hextoint __P((int)); static int hextoint __P((int));
static char *getstr __P((char *, char *, int, int *)); static char *getstr __P((char *, char *, int, int *));
static int parse __P((char *, int *, int)); static int parse __P((struct magic **, uint32 *, char *, int));
static void eatsize __P((char **)); static void eatsize __P((char **));
static int apprentice_1 __P((const char *, int));
static int apprentice_file __P((struct magic **, uint32 *,
const char *, int));
#ifdef QUICK
static void byteswap __P((struct magic *, uint32));
static void bs1 __P((struct magic *));
static uint16 swap2 __P((uint16));
static uint32 swap4 __P((uint32));
static char * mkdbname __P((const char *));
static int apprentice_map __P((struct magic **, uint32 *,
const char *, int));
static int apprentice_compile __P((struct magic **, uint32 *,
const char *, int));
#endif
static int maxmagic = 0; static int maxmagic = 0;
static int apprentice_1 __P((const char *, int)); struct mlist mlist;
/*
* Handle one file.
*/
static int
apprentice_1(fn, action)
const char *fn;
int action;
{
struct magic *magic = NULL;
uint32 nmagic = 0;
struct mlist *ml;
int rv = -1;
#ifdef QUICK
if (action == COMPILE) {
rv = apprentice_file(&magic, &nmagic, fn, action);
if (rv == 0)
return apprentice_compile(&magic, &nmagic, fn, action);
else
return rv;
}
if ((rv = apprentice_map(&magic, &nmagic, fn, action)) != 0)
(void)fprintf(stderr, "%s: Using regular magic file `%s'\n",
progname, fn);
#endif
if (rv != 0)
rv = apprentice_file(&magic, &nmagic, fn, action);
if (rv != 0)
return rv;
if ((ml = malloc(sizeof(*ml))) == NULL) {
(void) fprintf(stderr, "%s: Out of memory.\n", progname);
if (action == CHECK)
return -1;
}
if (magic == NULL || nmagic == 0)
return rv;
ml->magic = magic;
ml->nmagic = nmagic;
mlist.prev->next = ml;
ml->prev = mlist.prev;
ml->next = &mlist;
mlist.prev = ml;
return rv;
}
int int
apprentice(fn, check) apprentice(fn, action)
const char *fn; /* list of magic files */ const char *fn; /* list of magic files */
int check; /* non-zero? checking-only run. */ int action;
{ {
char *p, *mfn; char *p, *mfn;
int file_err, errs = -1; int file_err, errs = -1;
maxmagic = MAXMAGIS; mlist.next = mlist.prev = &mlist;
magic = (struct magic *) calloc(sizeof(struct magic), maxmagic);
mfn = malloc(strlen(fn)+1); mfn = malloc(strlen(fn)+1);
if (magic == NULL || mfn == NULL) { if (mfn == NULL) {
(void) fprintf(stderr, "%s: Out of memory.\n", progname); (void) fprintf(stderr, "%s: Out of memory.\n", progname);
if (check) if (action == CHECK)
return -1; return -1;
else else
exit(1); exit(1);
@ -83,7 +155,7 @@ apprentice(fn, check)
p = strchr(fn, PATHSEP); p = strchr(fn, PATHSEP);
if (p) if (p)
*p++ = '\0'; *p++ = '\0';
file_err = apprentice_1(fn, check); file_err = apprentice_1(fn, action);
if (file_err > errs) if (file_err > errs)
errs = file_err; errs = file_err;
fn = p; fn = p;
@ -91,17 +163,22 @@ apprentice(fn, check)
if (errs == -1) if (errs == -1)
(void) fprintf(stderr, "%s: couldn't find any magic files!\n", (void) fprintf(stderr, "%s: couldn't find any magic files!\n",
progname); progname);
if (!check && errs) if (action == CHECK && errs)
exit(1); exit(1);
free(mfn); free(mfn);
return errs; return errs;
} }
/*
* parse from a file
*/
static int static int
apprentice_1(fn, check) apprentice_file(magicp, nmagicp, fn, action)
struct magic **magicp;
uint32 *nmagicp;
const char *fn; /* name of magic file */ const char *fn; /* name of magic file */
int check; /* non-zero? checking-only run. */ int action;
{ {
static const char hdr[] = static const char hdr[] =
"cont\toffset\ttype\topcode\tmask\tvalue\tdesc"; "cont\toffset\ttype\topcode\tmask\tvalue\tdesc";
@ -118,8 +195,16 @@ apprentice_1(fn, check)
return -1; return -1;
} }
maxmagic = MAXMAGIS;
*magicp = (struct magic *) calloc(sizeof(struct magic), maxmagic);
if (*magicp == NULL) {
(void) fprintf(stderr, "%s: Out of memory.\n", progname);
if (action == CHECK)
return -1;
}
/* parse it */ /* parse it */
if (check) /* print silly verbose header for USG compat. */ if (action == CHECK) /* print silly verbose header for USG compat. */
(void) printf("%s\n", hdr); (void) printf("%s\n", hdr);
for (lineno = 1;fgets(line, BUFSIZ, f) != NULL; lineno++) { for (lineno = 1;fgets(line, BUFSIZ, f) != NULL; lineno++) {
@ -128,11 +213,16 @@ apprentice_1(fn, check)
if (strlen(line) <= (unsigned)1) /* null line, garbage, etc */ if (strlen(line) <= (unsigned)1) /* null line, garbage, etc */
continue; continue;
line[strlen(line)-1] = '\0'; /* delete newline */ line[strlen(line)-1] = '\0'; /* delete newline */
if (parse(line, &nmagic, check) != 0) if (parse(magicp, nmagicp, line, action) != 0)
errs = 1; errs = 1;
} }
(void) fclose(f); (void) fclose(f);
if (errs) {
free(*magicp);
*magicp = NULL;
*nmagicp = 0;
}
return errs; return errs;
} }
@ -181,32 +271,35 @@ signextend(m, v)
* parse one line from magic file, put into magic[index++] if valid * parse one line from magic file, put into magic[index++] if valid
*/ */
static int static int
parse(l, ndx, check) parse(magicp, nmagicp, l, action)
struct magic **magicp;
uint32 *nmagicp;
char *l; char *l;
int *ndx, check; int action;
{ {
int i = 0, nd = *ndx; int i = 0;
struct magic *m; struct magic *m;
char *t, *s; char *t, *s;
#define ALLOC_INCR 200 #define ALLOC_INCR 200
if (nd+1 >= maxmagic){ if (*nmagicp + 1 >= maxmagic){
maxmagic += ALLOC_INCR; maxmagic += ALLOC_INCR;
if ((m = (struct magic *) realloc(magic, sizeof(struct magic) * if ((m = (struct magic *) realloc(*magicp,
maxmagic)) == NULL) { sizeof(struct magic) * maxmagic)) == NULL) {
(void) fprintf(stderr, "%s: Out of memory.\n", (void) fprintf(stderr, "%s: Out of memory.\n",
progname); progname);
if (magic) if (*magicp)
free(magic); free(*magicp);
if (check) if (action == CHECK)
return -1; return -1;
else else
exit(1); exit(1);
} }
magic = m; *magicp = m;
memset(&magic[*ndx], 0, sizeof(struct magic) * ALLOC_INCR); memset(&(*magicp)[*nmagicp], 0, sizeof(struct magic)
* ALLOC_INCR);
} }
m = &magic[*ndx]; m = &(*magicp)[*nmagicp];
m->flag = 0; m->flag = 0;
m->cont_level = 0; m->cont_level = 0;
@ -231,8 +324,8 @@ parse(l, ndx, check)
l = t; l = t;
if (m->flag & INDIR) { if (m->flag & INDIR) {
m->in.type = LONG; m->in_type = LONG;
m->in.offset = 0; m->in_offset = 0;
/* /*
* read [.lbs][+-]nnnnn) * read [.lbs][+-]nnnnn)
*/ */
@ -240,24 +333,24 @@ parse(l, ndx, check)
l++; l++;
switch (*l) { switch (*l) {
case 'l': case 'l':
m->in.type = LELONG; m->in_type = LELONG;
break; break;
case 'L': case 'L':
m->in.type = BELONG; m->in_type = BELONG;
break; break;
case 'h': case 'h':
case 's': case 's':
m->in.type = LESHORT; m->in_type = LESHORT;
break; break;
case 'H': case 'H':
case 'S': case 'S':
m->in.type = BESHORT; m->in_type = BESHORT;
break; break;
case 'c': case 'c':
case 'b': case 'b':
case 'C': case 'C':
case 'B': case 'B':
m->in.type = BYTE; m->in_type = BYTE;
break; break;
default: default:
magwarn("indirect offset type %c invalid", *l); magwarn("indirect offset type %c invalid", *l);
@ -268,8 +361,8 @@ parse(l, ndx, check)
s = l; s = l;
if (*l == '+' || *l == '-') l++; if (*l == '+' || *l == '-') l++;
if (isdigit((unsigned char)*l)) { if (isdigit((unsigned char)*l)) {
m->in.offset = strtoul(l, &t, 0); m->in_offset = strtoul(l, &t, 0);
if (*s == '-') m->in.offset = - m->in.offset; if (*s == '-') m->in_offset = - m->in_offset;
} }
else else
t = l; t = l;
@ -430,10 +523,10 @@ parse(l, ndx, check)
while ((m->desc[i++] = *l++) != '\0' && i<MAXDESC) while ((m->desc[i++] = *l++) != '\0' && i<MAXDESC)
/* NULLBODY */; /* NULLBODY */;
if (check) { if (action == CHECK) {
mdump(m); mdump(m);
} }
++(*ndx); /* make room for next */ ++(*nmagicp); /* make room for next */
return 0; return 0;
} }
@ -670,3 +763,200 @@ eatsize(p)
*p = l; *p = l;
} }
#ifdef QUICK
/*
* handle an mmaped file.
*/
static int
apprentice_map(magicp, nmagicp, fn, action)
struct magic **magicp;
uint32 *nmagicp;
const char *fn;
int action;
{
int fd;
struct stat st;
uint32 *ptr;
uint32 version;
int needsbyteswap;
char *dbname = mkdbname(fn);
if ((fd = open(dbname, O_RDONLY)) == -1)
return -1;
if (fstat(fd, &st) == -1) {
(void)fprintf(stderr, "%s: Cannot stat `%s' (%s)\n",
progname, dbname, strerror(errno));
goto error;
}
if ((*magicp = mmap(0, (size_t)st.st_size, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FILE, fd, (off_t)0)) == MAP_FAILED) {
(void)fprintf(stderr, "%s: Cannot map `%s' (%s)\n",
progname, dbname, strerror(errno));
goto error;
}
(void)close(fd);
ptr = (uint32 *) *magicp;
if (*ptr != MAGICNO) {
if (swap4(*ptr) != MAGICNO) {
(void)fprintf(stderr, "%s: Bad magic in `%s'\n",
progname, dbname);
goto error;
}
needsbyteswap = 1;
} else
needsbyteswap = 0;
if (needsbyteswap)
version = swap4(ptr[1]);
else
version = ptr[1];
if (version != VERSIONNO) {
(void)fprintf(stderr,
"%s: version mismatch (%d != %d) in `%s'\n",
progname, version, VERSION, dbname);
goto error;
}
*nmagicp = (st.st_size / sizeof(struct magic)) - 1;
(*magicp)++;
if (needsbyteswap)
byteswap(*magicp, *nmagicp);
return 0;
error:
if (fd != -1)
(void)close(fd);
if (*magicp)
(void)munmap(*magicp, (size_t)st.st_size);
else {
*magicp = NULL;
*nmagicp = 0;
}
return -1;
}
/*
* handle an mmaped file.
*/
static int
apprentice_compile(magicp, nmagicp, fn, action)
struct magic **magicp;
uint32 *nmagicp;
const char *fn;
int action;
{
int fd;
char *dbname = mkdbname(fn);
static const uint32 ar[] = {
MAGICNO, VERSIONNO
};
if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
(void)fprintf(stderr, "%s: Cannot open `%s' (%s)\n",
progname, dbname, strerror(errno));
return -1;
}
if (write(fd, ar, sizeof(ar)) != sizeof(ar)) {
(void)fprintf(stderr, "%s: error writing `%s' (%s)\n",
progname, dbname, strerror(errno));
return -1;
}
if (lseek(fd, sizeof(struct magic), SEEK_SET) != sizeof(struct magic)) {
(void)fprintf(stderr, "%s: error seeking `%s' (%s)\n",
progname, dbname, strerror(errno));
return -1;
}
if (write(fd, *magicp, sizeof(struct magic) * *nmagicp)
!= sizeof(struct magic) * *nmagicp) {
(void)fprintf(stderr, "%s: error writing `%s' (%s)\n",
progname, dbname, strerror(errno));
return -1;
}
(void)close(fd);
return 0;
}
/*
* make a dbname
*/
char *
mkdbname(fn)
const char *fn;
{
static const char ext[] = ".mgc";
static char *buf = NULL;
size_t len = strlen(fn) + sizeof(ext) + 1;
if (buf == NULL)
buf = malloc(len);
else
buf = realloc(buf, len);
(void)strcpy(buf, fn);
(void)strcat(buf, ext);
return buf;
}
/*
* Byteswap an mmap'ed file if needed
*/
static void
byteswap(magic, nmagic)
struct magic *magic;
uint32 nmagic;
{
uint32 i;
for (i = 0; i < nmagic; i++)
bs1(&magic[i]);
}
/*
* swap a short
*/
static uint16
swap2(sv)
uint16 sv;
{
uint16 rv;
uint8 *s = (uint8 *) &sv;
uint8 *d = (uint8 *) &rv;
d[0] = s[1];
d[1] = s[0];
return rv;
}
/*
* swap an int
*/
static uint32
swap4(sv)
uint32 sv;
{
uint32 rv;
uint8 *s = (uint8 *) &sv;
uint8 *d = (uint8 *) &rv;
d[0] = s[3];
d[1] = s[2];
d[2] = s[1];
d[3] = s[0];
return rv;
}
/*
* byteswap a single magic entry
*/
static
void bs1(m)
struct magic *m;
{
m->cont_level = swap2(m->cont_level);
m->offset = swap4(m->offset);
m->in_offset = swap4(m->in_offset);
if (m->type != STRING)
m->value.l = swap4(m->value.l);
m->mask = swap4(m->mask);
}
#endif

View File

@ -56,7 +56,7 @@
#include "patchlevel.h" #include "patchlevel.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$Id: file.c,v 1.55 2000/08/05 19:00:12 christos Exp $") FILE_RCSID("@(#)$Id: file.c,v 1.56 2001/03/11 20:29:16 christos Exp $")
#endif /* lint */ #endif /* lint */
@ -97,6 +97,7 @@ int lineno; /* line number in the magic file */
static void unwrap __P((char *fn)); static void unwrap __P((char *fn));
static void usage __P((void));
#if 0 #if 0
static int byteconv4 __P((int, int, int)); static int byteconv4 __P((int, int, int));
static short byteconv2 __P((int, int, int)); static short byteconv2 __P((int, int, int));
@ -113,7 +114,7 @@ main(argc, argv)
char *argv[]; char *argv[];
{ {
int c; int c;
int check = 0, didsomefiles = 0, errflg = 0, ret = 0, app = 0; int action = 0, didsomefiles = 0, errflg = 0, ret = 0, app = 0;
char *mime; char *mime;
#ifdef LC_CTYPE #ifdef LC_CTYPE
@ -128,21 +129,24 @@ main(argc, argv)
if (!(magicfile = getenv("MAGIC"))) if (!(magicfile = getenv("MAGIC")))
magicfile = default_magicfile; magicfile = default_magicfile;
while ((c = getopt(argc, argv, "bcdf:ikm:nsvzL")) != EOF) while ((c = getopt(argc, argv, "bcdf:ikm:nsvzCL")) != EOF)
switch (c) { switch (c) {
case 'b': case 'b':
++bflag; ++bflag;
break; break;
case 'c': case 'c':
++check; action = CHECK;
break;
case 'C':
action = COMPILE;
break; break;
case 'd': case 'd':
++debug; ++debug;
break; break;
case 'f': case 'f':
if (!app) { if (!app) {
ret = apprentice(magicfile, check); ret = apprentice(magicfile, action);
if (check) if (action)
exit(ret); exit(ret);
app = 1; app = 1;
} }
@ -190,21 +194,19 @@ main(argc, argv)
} }
if (errflg) { if (errflg) {
(void) fprintf(stderr, USAGE, progname); usage();
exit(2);
} }
if (!app) { if (!app) {
ret = apprentice(magicfile, check); ret = apprentice(magicfile, action);
if (check) if (action)
exit(ret); exit(ret);
app = 1; app = 1;
} }
if (optind == argc) { if (optind == argc) {
if (!didsomefiles) { if (!didsomefiles) {
(void)fprintf(stderr, USAGE, progname); usage();
exit(2);
} }
} }
else { else {
@ -451,3 +453,13 @@ tryit(buf, nb, zflag)
ckfputs("data", stdout); ckfputs("data", stdout);
return '\0'; return '\0';
} }
static void
usage()
{
(void)fprintf(stderr, USAGE, progname);
#ifdef QUICK
(void)fprintf(stderr, "Usage: %s -C [-m magic]\n", progname);
#endif
exit(1);
}

View File

@ -1,6 +1,6 @@
/* /*
* file.h - definitions for file(1) program * file.h - definitions for file(1) program
* @(#)$Id: file.h,v 1.34 2000/11/13 00:30:49 christos Exp $ * @(#)$Id: file.h,v 1.35 2001/03/11 20:29:16 christos Exp $
* *
* Copyright (c) Ian F. Darwin, 1987. * Copyright (c) Ian F. Darwin, 1987.
* Written by Ian F. Darwin. * Written by Ian F. Darwin.
@ -35,6 +35,10 @@
typedef int int32; typedef int int32;
typedef unsigned int uint32; typedef unsigned int uint32;
typedef short int16;
typedef unsigned short uint16;
typedef char int8;
typedef unsigned char uint8;
#ifndef HOWMANY #ifndef HOWMANY
# define HOWMANY 16384 /* how much of the file to look at */ # define HOWMANY 16384 /* how much of the file to look at */
@ -43,20 +47,23 @@ typedef unsigned int uint32;
#define MAXDESC 50 /* max leng of text description */ #define MAXDESC 50 /* max leng of text description */
#define MAXstring 32 /* max leng of "string" types */ #define MAXstring 32 /* max leng of "string" types */
#define MAGICNO 0xF11E041C
#define VERSIONNO 1
#define CHECK 1
#define COMPILE 2
struct magic { struct magic {
short flag; uint16 cont_level;/* level of ">" */
uint8 nospflag; /* supress space character */
uint8 flag;
#define INDIR 1 /* if '>(...)' appears, */ #define INDIR 1 /* if '>(...)' appears, */
#define UNSIGNED 2 /* comparison is unsigned */ #define UNSIGNED 2 /* comparison is unsigned */
#define ADD 4 /* if '>&' appears, */ #define ADD 4 /* if '>&' appears, */
short cont_level; /* level of ">" */ uint8 reln; /* relation (0=eq, '>'=gt, etc) */
struct { uint8 vallen; /* length of string value, if any */
unsigned char type; /* byte short long */ uint8 type; /* int, short, long or string. */
int32 offset; /* offset from indirection */ uint8 in_type; /* type of indirrection */
} in;
int32 offset; /* offset to magic number */
unsigned char reln; /* relation (0=eq, '>'=gt, etc) */
unsigned char type; /* int, short, long or string. */
char vallen; /* length of string value, if any */
#define BYTE 1 #define BYTE 1
#define SHORT 2 #define SHORT 2
#define LONG 4 #define LONG 4
@ -68,16 +75,17 @@ struct magic {
#define LESHORT 10 #define LESHORT 10
#define LELONG 11 #define LELONG 11
#define LEDATE 12 #define LEDATE 12
int32 offset; /* offset to magic number */
int32 in_offset; /* offset from indirection */
union VALUETYPE { union VALUETYPE {
unsigned char b; unsigned char b;
unsigned short h; unsigned short h;
uint32 l; uint32 l;
char s[MAXstring]; char s[MAXstring];
unsigned char hs[2]; /* 2 bytes of a fixed-endian "short" */ unsigned char hs[2]; /* 2 bytes of a fixed-endian "short" */
unsigned char hl[4]; /* 2 bytes of a fixed-endian "long" */ unsigned char hl[4]; /* 4 bytes of a fixed-endian "long" */
} value; /* either number or string */ } value; /* either number or string */
uint32 mask; /* mask before comparison with value */ uint32 mask; /* mask before comparison with value */
char nospflag; /* supress space character */
char desc[MAXDESC]; /* description */ char desc[MAXDESC]; /* description */
}; };
@ -90,6 +98,13 @@ struct magic {
#define CHAR_COMPACT_OPTIONAL_BLANK 'b' #define CHAR_COMPACT_OPTIONAL_BLANK 'b'
/* list of magic entries */
struct mlist {
struct magic *magic; /* array of magic entries */
uint32 nmagic; /* number of entries in array */
struct mlist *next, *prev;
};
#include <stdio.h> /* Include that here, to make sure __P gets defined */ #include <stdio.h> /* Include that here, to make sure __P gets defined */
#include <errno.h> #include <errno.h>
@ -125,9 +140,7 @@ extern char *progname; /* the program name */
extern const char *magicfile; /* name of the magic file */ extern const char *magicfile; /* name of the magic file */
extern int lineno; /* current line number in magic file */ extern int lineno; /* current line number in magic file */
extern struct magic *magic; /* array of magic entries */ extern struct mlist mlist; /* list of arrays of magic entries */
extern int nmagic; /* number of valid magic[]s */
extern int debug; /* enable debugging? */ extern int debug; /* enable debugging? */
extern int zflag; /* process compressed files? */ extern int zflag; /* process compressed files? */

View File

@ -1,5 +1,5 @@
.TH FILE __CSECTION__ "Copyright but distributable" .TH FILE __CSECTION__ "Copyright but distributable"
.\" $Id: file.man,v 1.37 2000/08/07 20:08:55 christos Exp $ .\" $Id: file.man,v 1.38 2001/03/11 20:37:08 christos Exp $
.SH NAME .SH NAME
file file
\- determine file type \- determine file type
@ -15,6 +15,12 @@ namefile ]
.B \-m .B \-m
magicfiles ] magicfiles ]
file ... file ...
.br
.B file
.B -C
[
.B \-m
magicfile ]
.SH DESCRIPTION .SH DESCRIPTION
This manual page documents version __VERSION__ of the This manual page documents version __VERSION__ of the
.B file .B file
@ -85,8 +91,12 @@ 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. The concept of `magic number' has been applied by extension to data files.
Any file with some invariant identifier at a small fixed Any file with some invariant identifier at a small fixed
offset into the file can usually be described in this way. offset into the file can usually be described in this way.
The information identifying these files is read from the magic file The information identifying these files is read from the compiled
.I __MAGIC__. magic file
.I __MAGIC__.mgc ,
or
.I __MAGIC__
if the compile file does not exist.
.PP .PP
If a file does not match any of the entries in the magic file, If a file does not match any of the entries in the magic file,
it is examined to see if it seems to be a text file. it is examined to see if it seems to be a text file.
@ -142,6 +152,9 @@ Do not prepend filenames to output lines (brief mode).
.B \-c .B \-c
Cause a checking printout of the parsed form of the magic file. Cause a checking printout of the parsed form of the magic file.
This is usually used in conjunction with This is usually used in conjunction with
.B \-C
Write a magic.mgc output file that contains a pre-parsed version of
file.
.B \-m .B \-m
to debug a new magic file before installing it. to debug a new magic file before installing it.
.TP 8 .TP 8
@ -210,6 +223,9 @@ to disregard the file size as reported by
.BR stat (2) .BR stat (2)
since on some systems it reports a zero size for raw disk partitions. since on some systems it reports a zero size for raw disk partitions.
.SH FILES .SH FILES
.I __MAGIC__.mgc
\- defaults compiled list of magic numbers
.PP
.I __MAGIC__ .I __MAGIC__
\- default list of magic numbers \- default list of magic numbers
.PP .PP

View File

@ -89,6 +89,7 @@
0 string RIFF audio/unknown 0 string RIFF audio/unknown
# - WAVE format # - WAVE format
>8 string WAVE audio/x-wav >8 string WAVE audio/x-wav
>8 string AVI video/x-msvideo
# #
0 belong 0x2e7261fd application/x-realaudio 0 belong 0x2e7261fd application/x-realaudio
@ -104,6 +105,9 @@
# ideally should go into "images", but entries below would tag XPM as C source # ideally should go into "images", but entries below would tag XPM as C source
0 string /*\ XPM image/x-xpm 7bit 0 string /*\ XPM image/x-xpm 7bit
# 3DS (3d Studio files)
16 beshort 0x3d3d image/x-3ds
# this first will upset you if you're a PL/1 shop... (are there any left?) # this first will upset you if you're a PL/1 shop... (are there any left?)
# in which case rm it; ascmagic will catch real C programs # in which case rm it; ascmagic will catch real C programs
# C or REXX program text # C or REXX program text
@ -463,7 +467,8 @@
# #
# animation formats, originally from vax@ccwf.cc.utexas.edu (VaX#n8) # animation formats, originally from vax@ccwf.cc.utexas.edu (VaX#n8)
# MPEG file # MPEG file
0 string \000\000\001\263 video/mpeg 0 belong 0x000001b3 video/mpeg
0 belong 0x000001ba video/mpeg
# FLI animation format # FLI animation format
0 leshort 0xAF11 video/fli 0 leshort 0xAF11 video/fli
# FLC animation format # FLC animation format

View File

@ -1,11 +1,15 @@
#define FILE_VERSION_MAJOR 3 #define FILE_VERSION_MAJOR 3
#define patchlevel 33 #define patchlevel 34
/* /*
* Patchlevel file for Ian Darwin's MAGIC command. * Patchlevel file for Ian Darwin's MAGIC command.
* $Id: patchlevel.h,v 1.33 2000/11/13 00:30:50 christos Exp $ * $Id: patchlevel.h,v 1.34 2001/03/12 05:05:57 christos Exp $
* *
* $Log: patchlevel.h,v $ * $Log: patchlevel.h,v $
* Revision 1.34 2001/03/12 05:05:57 christos
* - new compiled magic format
* - lots of magic additions
*
* Revision 1.33 2000/11/13 00:30:50 christos * Revision 1.33 2000/11/13 00:30:50 christos
* - wordperfect magic fix: freebsd pr 9388 * - wordperfect magic fix: freebsd pr 9388
* - more msdos fixes from freebsd pr's 20131 and 20812 * - more msdos fixes from freebsd pr's 20131 and 20812

View File

@ -41,7 +41,7 @@
#include <time.h> #include <time.h>
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$Id: print.c,v 1.31 2000/08/05 17:36:49 christos Exp $") FILE_RCSID("@(#)$Id: print.c,v 1.32 2001/03/11 20:29:16 christos Exp $")
#endif /* lint */ #endif /* lint */
#define SZOF(a) (sizeof(a) / sizeof(a[0])) #define SZOF(a) (sizeof(a) / sizeof(a[0]))
@ -61,9 +61,9 @@ mdump(m)
if (m->flag & INDIR) if (m->flag & INDIR)
(void) fprintf(stderr, "(%s,%d),", (void) fprintf(stderr, "(%s,%d),",
/* Note: in.type is unsigned */ /* Note: in.type is unsigned */
(m->in.type < SZOF(typ)) ? (m->in_type < SZOF(typ)) ?
typ[m->in.type] : "*bad*", typ[m->in_type] : "*bad*",
m->in.offset); m->in_offset);
(void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "", (void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "",
/* Note: type is unsigned */ /* Note: type is unsigned */

View File

@ -35,10 +35,10 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$Id: softmagic.c,v 1.42 2000/08/05 17:36:49 christos Exp $") FILE_RCSID("@(#)$Id: softmagic.c,v 1.43 2001/03/11 20:29:16 christos Exp $")
#endif /* lint */ #endif /* lint */
static int match __P((unsigned char *, int)); static int match __P((struct magic *, uint32, unsigned char *, int));
static int mget __P((union VALUETYPE *, static int mget __P((union VALUETYPE *,
unsigned char *, struct magic *, int)); unsigned char *, struct magic *, int));
static int mcheck __P((union VALUETYPE *, struct magic *)); static int mcheck __P((union VALUETYPE *, struct magic *));
@ -57,7 +57,10 @@ softmagic(buf, nbytes)
unsigned char *buf; unsigned char *buf;
int nbytes; int nbytes;
{ {
if (match(buf, nbytes)) struct mlist *ml;
for (ml = mlist.next; ml != &mlist; ml = ml->next)
if (match(ml->magic, ml->nmagic, buf, nbytes))
return 1; return 1;
return 0; return 0;
@ -91,7 +94,9 @@ softmagic(buf, nbytes)
* so that higher-level continuations are processed. * so that higher-level continuations are processed.
*/ */
static int static int
match(s, nbytes) match(magic, nmagic, s, nbytes)
struct magic *magic;
uint32 nmagic;
unsigned char *s; unsigned char *s;
int nbytes; int nbytes;
{ {
@ -105,6 +110,7 @@ match(s, nbytes)
int returnval = 0; /* if a match is found it is set to 1*/ int returnval = 0; /* if a match is found it is set to 1*/
extern int kflag; extern int kflag;
int firstline = 1; /* a flag to print X\n X\n- X */ int firstline = 1; /* a flag to print X\n X\n- X */
struct mlist *ml;
if (tmpoff == NULL) if (tmpoff == NULL)
if ((tmpoff = (int32 *) malloc(tmplen = 20)) == NULL) if ((tmpoff = (int32 *) malloc(tmplen = 20)) == NULL)
@ -153,7 +159,8 @@ match(s, nbytes)
} }
if (magic[magindex].flag & ADD) { if (magic[magindex].flag & ADD) {
oldoff=magic[magindex].offset; oldoff=magic[magindex].offset;
magic[magindex].offset += tmpoff[cont_level-1]; magic[magindex].offset +=
tmpoff[cont_level-1];
} }
if (mget(&p, s, &magic[magindex], nbytes) && if (mget(&p, s, &magic[magindex], nbytes) &&
mcheck(&p, &magic[magindex])) { mcheck(&p, &magic[magindex])) {
@ -172,7 +179,8 @@ match(s, nbytes)
(void) putchar(' '); (void) putchar(' ');
need_separator = 0; need_separator = 0;
} }
tmpoff[cont_level] = mprint(&p, &magic[magindex]); tmpoff[cont_level] =
mprint(&p, &magic[magindex]);
if (magic[magindex].desc[0]) if (magic[magindex].desc[0])
need_separator = 1; need_separator = 1;
@ -361,33 +369,33 @@ mget(p, s, m, nbytes)
if (m->flag & INDIR) { if (m->flag & INDIR) {
switch (m->in.type) { switch (m->in_type) {
case BYTE: case BYTE:
offset = p->b + m->in.offset; offset = p->b + m->in_offset;
break; break;
case BESHORT: case BESHORT:
offset = (short)((p->hs[0]<<8)|(p->hs[1]))+ offset = (short)((p->hs[0]<<8)|(p->hs[1]))+
m->in.offset; m->in_offset;
break; break;
case LESHORT: case LESHORT:
offset = (short)((p->hs[1]<<8)|(p->hs[0]))+ offset = (short)((p->hs[1]<<8)|(p->hs[0]))+
m->in.offset; m->in_offset;
break; break;
case SHORT: case SHORT:
offset = p->h + m->in.offset; offset = p->h + m->in_offset;
break; break;
case BELONG: case BELONG:
offset = (int32)((p->hl[0]<<24)|(p->hl[1]<<16)| offset = (int32)((p->hl[0]<<24)|(p->hl[1]<<16)|
(p->hl[2]<<8)|(p->hl[3]))+ (p->hl[2]<<8)|(p->hl[3]))+
m->in.offset; m->in_offset;
break; break;
case LELONG: case LELONG:
offset = (int32)((p->hl[3]<<24)|(p->hl[2]<<16)| offset = (int32)((p->hl[3]<<24)|(p->hl[2]<<16)|
(p->hl[1]<<8)|(p->hl[0]))+ (p->hl[1]<<8)|(p->hl[0]))+
m->in.offset; m->in_offset;
break; break;
case LONG: case LONG:
offset = p->l + m->in.offset; offset = p->l + m->in_offset;
break; break;
} }