Browse Source

Import upstream version 4.17

Christos Zoulas 18 years ago
parent
commit
5091a0e236

+ 39 - 0
ChangeLog

@@ -1,3 +1,42 @@
+2006-03-02 16:06 Christos Zoulas <christos@zoulas.com>
+
+	* Print empty if the file is (Mike Frysinger)
+
+	* Don't try to read past the end of the buffer (Mike Frysinger)
+
+	* Sort magic entries by strength [experimental]
+
+2005-11-29 13:26 Christos Zoulas <christos@zoulas.com>
+
+	* Use iswprint() to convert the output string.
+	    (Bastien Nocera)
+
+2005-10-31 8:54 Christos Zoulas <christos@zoulas.com>
+
+	* Fix regression where the core info was not completely processed
+	    (Radek Vokál)
+
+2005-10-20 11:15 Christos Zoulas <christos@zoulas.com>
+
+	* Middle Endian magic (Diomidis Spinellis)
+
+2005-10-17 11:15 Christos Zoulas <christos@zoulas.com>
+
+	* Open with O_BINARY for CYGWIN (Corinna Vinschen)
+
+	* Don't close stdin (Arkadiusz Miskiewicz)
+
+	* Look for note sections in non executables.
+
+2005-09-20 13:33 Christos Zoulas <christos@zoulas.com>
+	
+	* Don't print SVR4 Style in core files multiple times
+	    (Radek Vokál)
+
+2005-08-27 04:09 Christos Zoulas <christos@zoulas.com>
+
+	* Cygwin changes Corinna Vinschen
+
 2005-08-18 09:53 Christos Zoulas <christos@zoulas.com>
 2005-08-18 09:53 Christos Zoulas <christos@zoulas.com>
 
 
 	* Remove erroreous mention of /etc/magic in the file man page
 	* Remove erroreous mention of /etc/magic in the file man page

+ 1 - 1
Makefile.in

@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
 # @configure_input@
 # @configure_input@
 
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,

+ 2 - 2
aclocal.m4

@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.9.5 -*- Autoconf -*-
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
 
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 # 2005  Free Software Foundation, Inc.
 # 2005  Free Software Foundation, Inc.
@@ -6176,7 +6176,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
 # Call AM_AUTOMAKE_VERSION so it can be traced.
 # Call AM_AUTOMAKE_VERSION so it can be traced.
 # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
 # This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-	 [AM_AUTOMAKE_VERSION([1.9.5])])
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
 
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
 

+ 1 - 1
configure

@@ -1808,7 +1808,7 @@ fi
 
 
 # Define the identity of the package.
 # Define the identity of the package.
  PACKAGE=file
  PACKAGE=file
- VERSION=4.15
+ VERSION=4.17
 
 
 
 
 cat >>confdefs.h <<_ACEOF
 cat >>confdefs.h <<_ACEOF

+ 1 - 1
configure.in

@@ -1,7 +1,7 @@
 dnl Process this file with autoconf to produce a configure script.
 dnl Process this file with autoconf to produce a configure script.
 AC_INIT
 AC_INIT
 AC_CONFIG_SRCDIR([src/file.c])
 AC_CONFIG_SRCDIR([src/file.c])
-AM_INIT_AUTOMAKE(file, 4.15)
+AM_INIT_AUTOMAKE(file, 4.17)
 AM_CONFIG_HEADER([config.h])
 AM_CONFIG_HEADER([config.h])
 AM_MAINTAINER_MODE
 AM_MAINTAINER_MODE
 
 

+ 1 - 1
doc/Makefile.in

@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
 # @configure_input@
 # @configure_input@
 
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,

+ 34 - 7
doc/magic.man

@@ -54,6 +54,9 @@ Finally the ``c'' flag, specifies case insensitive matching: lowercase
 characters in the magic match both lower and upper case characters in the
 characters in the magic match both lower and upper case characters in the
 targer, whereas upper case characters in the magic, only much uppercase
 targer, whereas upper case characters in the magic, only much uppercase
 characters in the target.
 characters in the target.
+.IP pstring
+A pascal style string where the first byte is interpreted as the an
+unsigned length. The string is not NUL terminated.
 .IP date
 .IP date
 A four-byte value interpreted as a UNIX date.
 A four-byte value interpreted as a UNIX date.
 .IP ldate
 .IP ldate
@@ -66,6 +69,12 @@ A four-byte value (on most systems) in big-endian byte order.
 .IP bedate
 .IP bedate
 A four-byte value (on most systems) in big-endian byte order,
 A four-byte value (on most systems) in big-endian byte order,
 interpreted as a Unix date.
 interpreted as a Unix date.
+.IP beldate
+A four-byte value (on most systems) in big-endian byte order,
+interpreted as a UNIX-style date, but interpreted as local time rather
+than UTC.
+.IP bestring16
+A two-byte unicode (UCS16) string in big-endian byte order.
 .IP leshort
 .IP leshort
 A two-byte value (on most systems) in little-endian byte order.
 A two-byte value (on most systems) in little-endian byte order.
 .IP lelong
 .IP lelong
@@ -77,6 +86,17 @@ interpreted as a UNIX date.
 A four-byte value (on most systems) in little-endian byte order,
 A four-byte value (on most systems) in little-endian byte order,
 interpreted as a UNIX-style date, but interpreted as local time rather
 interpreted as a UNIX-style date, but interpreted as local time rather
 than UTC.
 than UTC.
+.IP lestring16
+A two-byte unicode (UCS16) string in little-endian byte order.
+.IP melong
+A four-byte value (on most systems) in middle-endian (PDP-11) byte order.
+.IP medate
+A four-byte value (on most systems) in middle-endian (PDP-11) byte order,
+interpreted as a UNIX date.
+.IP meldate
+A four-byte value (on most systems) in middle-endian (PDP-11) byte order,
+interpreted as a UNIX-style date, but interpreted as local time rather
+than UTC.
 .IP regex
 .IP regex
 A regular expression match in extended POSIX regular expression syntax
 A regular expression match in extended POSIX regular expression syntax
 (much like egrep).
 (much like egrep).
@@ -137,6 +157,8 @@ that are set in the specified value,
 .BR ^ ,
 .BR ^ ,
 to specify that the value from the file must have clear any of the bits
 to specify that the value from the file must have clear any of the bits
 that are set in the specified value, or
 that are set in the specified value, or
+.BR ~ ,
+the value specified after is negated before tested.
 .BR x ,
 .BR x ,
 to specify that any value will match.
 to specify that any value will match.
 If the character is omitted, it is assumed to be
 If the character is omitted, it is assumed to be
@@ -228,11 +250,14 @@ The value of
 .I x
 .I x
 is used as an offset in the file. A byte, short or long is read at that offset
 is used as an offset in the file. A byte, short or long is read at that offset
 depending on the
 depending on the
-.B [bslBSL]
+.B [bslBSLm]
 type specifier.
 type specifier.
 The capitalized types interpret the number as a big endian
 The capitalized types interpret the number as a big endian
 value, whereas the small letter versions interpret the number as a little
 value, whereas the small letter versions interpret the number as a little
-endian value.
+endian value;
+the
+.B m
+type interprets the number as a middle endian (PDP-11) value.
 To that number the value of
 To that number the value of
 .I y
 .I y
 is added and the result is used as an offset in the file.
 is added and the result is used as an offset in the file.
@@ -340,20 +365,22 @@ The formats
 .IR long ,
 .IR long ,
 .IR belong ,
 .IR belong ,
 .IR lelong ,
 .IR lelong ,
+.IR melong ,
 .IR short ,
 .IR short ,
 .IR beshort ,
 .IR beshort ,
 .IR leshort ,
 .IR leshort ,
 .IR date ,
 .IR date ,
 .IR bedate ,
 .IR bedate ,
+.IR medate ,
+.IR ledate ,
+.IR beldate ,
+.IR leldate ,
 and
 and
-.I ledate
+.I meldate
 are system-dependent; perhaps they should be specified as a number
 are system-dependent; perhaps they should be specified as a number
 of bytes (2B, 4B, etc),
 of bytes (2B, 4B, etc),
 since the files being recognized typically come from
 since the files being recognized typically come from
 a system on which the lengths are invariant.
 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
 .SH SEE ALSO
 .BR file (__CSECTION__)
 .BR file (__CSECTION__)
 \- the command that reads this file.
 \- the command that reads this file.
@@ -370,4 +397,4 @@ indirect offsets.
 .\" the changes I posted to the S5R2 version.
 .\" the changes I posted to the S5R2 version.
 .\"
 .\"
 .\" Modified for Ian Darwin's version of the file command.
 .\" Modified for Ian Darwin's version of the file command.
-.\" @(#)$Id: magic.man,v 1.28 2005/03/17 17:34:15 christos Exp $
+.\" @(#)$Id: magic.man,v 1.30 2006/02/19 18:16:03 christos Exp $

+ 3 - 0
magic/Magdir/amigaos

@@ -42,6 +42,9 @@
 0	beshort		0x0f03		AmigaOS outline font
 0	beshort		0x0f03		AmigaOS outline font
 0	belong		0x80001001	AmigaOS outline tag
 0	belong		0x80001001	AmigaOS outline tag
 0	string		##\ version	catalog translation
 0	string		##\ version	catalog translation
+0	string		EMOD\0		Amiga E module
+8	string		ECXM\0		ECX module
+0	string/c	@database	AmigaGuide file
 
 
 # Amiga disk types
 # Amiga disk types
 # 
 # 

+ 26 - 22
magic/Magdir/animation

@@ -320,31 +320,35 @@
 #>3     byte&0x03       3              \b, NR: CCIT J.17
 #>3     byte&0x03       3              \b, NR: CCIT J.17
 
 
 # MPA, M1A
 # MPA, M1A
-0       beshort&0xFFFE  0xFFFE         MPEG ADTS, layer I, v1
+# modified by Joerg Jenderek
+# GRR the original test are too common for many DOS files, so test 32 <= kbits <= 448
+0	beshort&0xFFFE		0xFFFE	
+>2	byte&0xF0	>0x0F		
+>>2	byte&0xF0	<0xE1		MPEG ADTS, layer I, v1
 # rate
 # rate
->2      byte&0xF0       0x10           \b,  32 kBits
->2      byte&0xF0       0x20           \b,  64 kBits
->2      byte&0xF0       0x30           \b,  96 kBits
->2      byte&0xF0       0x40           \b, 128 kBits
->2      byte&0xF0       0x50           \b, 160 kBits
->2      byte&0xF0       0x60           \b, 192 kBits
->2      byte&0xF0       0x70           \b, 224 kBits
->2      byte&0xF0       0x80           \b, 256 kBits
->2      byte&0xF0       0x90           \b, 288 kBits
->2      byte&0xF0       0xA0           \b, 320 kBits
->2      byte&0xF0       0xB0           \b, 352 kBits
->2      byte&0xF0       0xC0           \b, 384 kBits
->2      byte&0xF0       0xD0           \b, 416 kBits
->2      byte&0xF0       0xE0           \b, 448 kBits
+>>>2      byte&0xF0       0x10           \b,  32 kBits
+>>>2      byte&0xF0       0x20           \b,  64 kBits
+>>>2      byte&0xF0       0x30           \b,  96 kBits
+>>>2      byte&0xF0       0x40           \b, 128 kBits
+>>>2      byte&0xF0       0x50           \b, 160 kBits
+>>>2      byte&0xF0       0x60           \b, 192 kBits
+>>>2      byte&0xF0       0x70           \b, 224 kBits
+>>>2      byte&0xF0       0x80           \b, 256 kBits
+>>>2      byte&0xF0       0x90           \b, 288 kBits
+>>>2      byte&0xF0       0xA0           \b, 320 kBits
+>>>2      byte&0xF0       0xB0           \b, 352 kBits
+>>>2      byte&0xF0       0xC0           \b, 384 kBits
+>>>2      byte&0xF0       0xD0           \b, 416 kBits
+>>>2      byte&0xF0       0xE0           \b, 448 kBits
 # timing
 # timing
->2      byte&0x0C       0x00           \b, 44.1 kHz
->2      byte&0x0C       0x04           \b, 48 kHz
->2      byte&0x0C       0x08           \b, 32 kHz
+>>>2      byte&0x0C       0x00           \b, 44.1 kHz
+>>>2      byte&0x0C       0x04           \b, 48 kHz
+>>>2      byte&0x0C       0x08           \b, 32 kHz
 # channels/options
 # channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
+>>>3      byte&0xC0       0x00           \b, Stereo
+>>>3      byte&0xC0       0x40           \b, JntStereo
+>>>3      byte&0xC0       0x80           \b, 2x Monaural
+>>>3      byte&0xC0       0xC0           \b, Monaural
 #>1     byte            ^0x01          \b, Data Verify
 #>1     byte            ^0x01          \b, Data Verify
 #>2     byte            &0x02          \b, Packet Pad
 #>2     byte            &0x02          \b, Packet Pad
 #>2     byte            &0x01          \b, Custom Flag
 #>2     byte            &0x01          \b, Custom Flag

+ 38 - 0
magic/Magdir/apple

@@ -151,3 +151,41 @@
 
 
 # From: Toby Peterson <toby@apple.com>
 # From: Toby Peterson <toby@apple.com>
 0	string	bplist00	Apple binary property list
 0	string	bplist00	Apple binary property list
+
+# Apple binary property list (bplist)
+#  Assumes version bytes are hex.
+#  Provides content hints for version 0 files. Assumes that the root
+#  object is the first object (true for CoreFoundation implementation).
+# From: David Remahl <dremahl@apple.com>
+0		string	bplist
+>6		byte	x	\bCoreFoundation binary property list data, version 0x%c
+>>7		byte	x	\b%c
+>6		string		00		\b
+>>8		byte&0xF0	0x00	\b
+>>>8	byte&0x0F	0x00	\b, root type: null
+>>>8	byte&0x0F	0x08	\b, root type: false boolean
+>>>8	byte&0x0F	0x09	\b, root type: true boolean
+>>8		byte&0xF0	0x10	\b, root type: integer
+>>8		byte&0xF0	0x20	\b, root type: real
+>>8		byte&0xF0	0x30	\b, root type: date
+>>8		byte&0xF0	0x40    \b, root type: data
+>>8		byte&0xF0	0x50	\b, root type: ascii string
+>>8		byte&0xF0	0x60	\b, root type: unicode string
+>>8		byte&0xF0	0x80	\b, root type: uid (CORRUPT)
+>>8		byte&0xF0	0xa0	\b, root type: array
+>>8		byte&0xF0	0xd0	\b, root type: dictionary
+
+# Apple/NeXT typedstream data
+#  Serialization format used by NeXT and Apple for various
+#  purposes in YellowStep/Cocoa, including some nib files.
+# From: David Remahl <dremahl@apple.com>
+2		string		typedstream	NeXT/Apple typedstream data, big endian
+>0		byte		x		\b, version %hhd
+>0		byte		<5		\b
+>>13	byte		0x81	\b
+>>>14	ubeshort	x		\b, system %hd
+2		string		streamtyped NeXT/Apple typedstream data, little endian
+>0		byte		x		\b, version %hhd
+>0		byte		<5		\b
+>>13	byte		0x81	\b
+>>>14	uleshort	x		\b, system %hd

+ 80 - 14
magic/Magdir/archive

@@ -33,8 +33,13 @@
 >8	string		debian-split	part of multipart Debian package
 >8	string		debian-split	part of multipart Debian package
 >8	string		debian-binary	Debian binary package
 >8	string		debian-binary	Debian binary package
 >68	string		>\0		(format %s)
 >68	string		>\0		(format %s)
->81	string		bz2		\b, uses bzip2 compression
->84	string		gz		\b, uses gzip compression
+# These next two lines do not work, because a bzip2 Debian archive
+# still uses gzip for the control.tar (first in the archive).  Only
+# data.tar varies, and the location of its filename varies too.
+# file/libmagic does not current have support for ascii-string based
+# (offsets) as of 2005-09-15.
+#>81	string		bz2		\b, uses bzip2 compression
+#>84	string		gz		\b, uses gzip compression
 #>136	ledate		x		created: %s
 #>136	ledate		x		created: %s
 
 
 # other archives
 # other archives
@@ -130,10 +135,8 @@
 # I can't create either SPARK or ArcFS archives so I have not tested this stuff
 # I can't create either SPARK or ArcFS archives so I have not tested this stuff
 # [GRR:  the original entries collide with ARC, above; replaced with combined
 # [GRR:  the original entries collide with ARC, above; replaced with combined
 #  version (not tested)]
 #  version (not tested)]
-#0	byte		0x1a		RISC OS archive
-#>1	string		archive		(ArcFS format)
-#0	string		\032archive	RISC OS archive (ArcFS format)
-0       string          \032            RISC OS archive (spark format)
+#0	byte		0x1a		RISC OS archive (spark format)
+0	string		\032archive	RISC OS archive (ArcFS format)
 0       string          Archive\000     RISC OS archive (ArcFS format)
 0       string          Archive\000     RISC OS archive (ArcFS format)
 
 
 # All these were taken from idarc, many could not be verified. Unfortunately,
 # All these were taken from idarc, many could not be verified. Unfortunately,
@@ -223,6 +226,14 @@
 0	string	PPMZ PPMZ archive data
 0	string	PPMZ PPMZ archive data
 # MS Compress
 # MS Compress
 4	string	\x88\xf0\x27 MS Compress archive data
 4	string	\x88\xf0\x27 MS Compress archive data
+# updated by Joerg Jenderek
+>9	string	\0		
+>>0	string	KWAJ		
+>>>7	string	\321\003	MS Compress archive data
+>>>>14	ulong	>0		\b, original size: %ld bytes
+>>>>18		ubyte	>0x65  	
+>>>>>18		string	x    	\b, was %.8s
+>>>>>(10.b-4)	string	x    	\b.%.3s
 # MP3 (archiver, not lossy audio compression)
 # MP3 (archiver, not lossy audio compression)
 0	string	MP3\x1a MP3-Archiver archive data
 0	string	MP3\x1a MP3-Archiver archive data
 # ZET
 # ZET
@@ -513,11 +524,66 @@
 0	string		UC2\x1a		UC2 archive data
 0	string		UC2\x1a		UC2 archive data
 
 
 # ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
 # ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
-0	string		PK\003\004	Zip archive data
->4	byte		0x09		\b, at least v0.9 to extract
->4	byte		0x0a		\b, at least v1.0 to extract
->4	byte		0x0b		\b, at least v1.1 to extract
->4	byte		0x14		\b, at least v2.0 to extract
+0	string		PK\003\004
+>4	byte		0x09		Zip archive data, at least v0.9 to extract
+>4	byte		0x0a		Zip archive data, at least v1.0 to extract
+>4	byte		0x0b		Zip archive data, at least v1.1 to extract
+>4	byte		0x14
+>>30	ubelong		!0x6d696d65	Zip archive data, at least v2.0 to extract
+
+# OpenOffice.org / KOffice / StarOffice documents
+# From: Abel Cheung <abel@oaka.org>
+# Listed here because they are basically zip files
+>>30	string		mimetype
+
+# KOffice (1.2 or above) formats
+>>>50	string	vnd.kde.		KOffice (>=1.2)
+>>>>58	string	karbon			Karbon document
+>>>>58	string	kchart			KChart document
+>>>>58	string	kformula		KFormula document
+>>>>58	string	kivio			Kivio document
+>>>>58	string	kontour			Kontour document
+>>>>58	string	kpresenter		KPresenter document
+>>>>58	string	kspread			KSpread document
+>>>>58	string	kword			KWord document
+
+# OpenOffice formats (for OpenOffice 1.x / StarOffice 6/7)
+>>>50	string	vnd.sun.xml.		OpenOffice.org 1.x
+>>>>62	string	writer			Writer
+>>>>>68	byte	!0x2e			document
+>>>>>68	string	.template		template
+>>>>>68	string	.global			global document
+>>>>62	string	calc			Calc
+>>>>>66	byte	!0x2e			spreadsheet
+>>>>>66	string	.template		template
+>>>>62	string	draw			Draw
+>>>>>66	byte	!0x2e			document
+>>>>>66	string	.template		template
+>>>>62	string	impress			Impress
+>>>>>69	byte	!0x2e			presentation
+>>>>>69	string	.template		template
+>>>>62	string	math			Math document
+
+# OpenDocument formats (for OpenOffice 2.x / StarOffice >= 8)
+# http://lists.oasis-open.org/archives/office/200505/msg00006.html
+>>>50	string	vnd.oasis.opendocument.	OpenDocument
+>>>>73	string	text
+>>>>>77	byte	!0x2d			Text
+>>>>>77	string	-template		Text Template
+>>>>>77	string	-web			HTML Document Template
+>>>>>77	string	-master			Master Document
+>>>>73	string	graphics		Drawing
+>>>>>81	string	-template		Template
+>>>>73	string	presentation		Presentation
+>>>>>85	string	-template		Template
+>>>>73	string	spreadsheet		Spreadsheet
+>>>>>84	string	-template		Template
+>>>>73	string	chart			Chart
+>>>>>78	string	-template		Template
+>>>>73	string	formula			Formula
+>>>>>80	string	-template		Template
+>>>>73	string	database		Database
+>>>>73	string	image			Image
 
 
 # Zoo archiver
 # Zoo archiver
 20	lelong		0xfdc4a7dc	Zoo archive data
 20	lelong		0xfdc4a7dc	Zoo archive data
@@ -613,7 +679,7 @@
 >5	leshort	&0x0400		\b, small dictionary
 >5	leshort	&0x0400		\b, small dictionary
 >5	leshort	&0x0800		\b, multi-volume
 >5	leshort	&0x0800		\b, multi-volume
 >5	leshort	&0x1000		\b, contains AV-String
 >5	leshort	&0x1000		\b, contains AV-String
->>30	string\x16*UNREGISTERED\x20VERSION*	(unregistered)
+>>30	string	\x16*UNREGISTERED\x20VERSION*	(unregistered)
 >5	leshort &0x2000		\b, with recovery record
 >5	leshort &0x2000		\b, with recovery record
 >5	leshort &0x4000		\b, locked
 >5	leshort &0x4000		\b, locked
 >5	leshort &0x8000		\b, solid
 >5	leshort &0x8000		\b, solid
@@ -628,8 +694,8 @@
 >>0x2A	string	>\0		: %s
 >>0x2A	string	>\0		: %s
 
 
 # DR-DOS 7.03 Packed File *.??_
 # DR-DOS 7.03 Packed File *.??_
-0	string	Packed\ File\  Personal		NetWare Packed File
->12	string	x    				\b, was "%.12s"
+0	string	Packed\ File\ 	Personal NetWare Packed File
+>12	string	x    		\b, was "%.12s"
 
 
 # EET archive
 # EET archive
 # From: Tilman Sauerbeck <tilman@code-monkey.de>
 # From: Tilman Sauerbeck <tilman@code-monkey.de>

+ 46 - 9
magic/Magdir/audio

@@ -236,7 +236,7 @@
 >122	byte&0x1	=1		PAL
 >122	byte&0x1	=1		PAL
 >122	byte&0x1	=0		NTSC
 >122	byte&0x1	=0		NTSC
 
 
-# Impuse tracker module (audio/x-it)
+# Impulse tracker module (audio/x-it)
 0	string		IMPM		Impulse Tracker module sound data -
 0	string		IMPM		Impulse Tracker module sound data -
 >4	string		>\0		"%s"
 >4	string		>\0		"%s"
 >40	leshort		!0		compatible w/ITv%x
 >40	leshort		!0		compatible w/ITv%x
@@ -399,15 +399,28 @@
 # From "Simon Hosie
 # From "Simon Hosie
 0       string  TFMX-SONG       TFMX module sound data
 0       string  TFMX-SONG       TFMX module sound data
 
 
+# Monkey's Audio compressed audio format (.ape)
 # From danny.milo@gmx.net (Danny Milosavljevic)
 # From danny.milo@gmx.net (Danny Milosavljevic)
-# monkeysaudio for magic.mime
-0	string	MAC\	X/Monkey audio,
->4	leshort >0	version %d,
->6	leshort >0	compression level %d,
->8	leshort >0	flags %x,
->10	leshort >0	channels %d,
->12	lelong	>0	samplerate %d,
->24	lelong	>0	frames %d
+# New version from Abel Cheung <abel (@) oaka.org>
+0		string		MAC\040		Monkey's Audio compressed format
+>4		uleshort	>0x0F8B		version %d
+>>(0x08.l)	uleshort	=1000		with fast compression
+>>(0x08.l)	uleshort	=2000		with normal compression
+>>(0x08.l)	uleshort	=3000		with high compression
+>>(0x08.l)	uleshort	=4000		with extra high compression
+>>(0x08.l)	uleshort	=5000		with insane compression
+>>(0x08.l+18)	uleshort	=1		\b, mono
+>>(0x08.l+18)	uleshort	=2		\b, stereo
+>>(0x08.l+20)	ulelong		x		\b, sample rate %d
+>4		uleshort	<0x0F8C		version %d
+>>6		uleshort	=1000		with fast compression
+>>6		uleshort	=2000		with normal compression
+>>6		uleshort	=3000		with high compression
+>>6		uleshort	=4000		with extra high compression
+>>6		uleshort	=5000		with insane compression
+>>10		uleshort	=1		\b, mono
+>>10		uleshort	=2		\b, stereo
+>>12		ulelong		x		\b, sample rate %d
 
 
 # adlib sound files
 # adlib sound files
 # From Gürkan Sengün <gurkan@linuks.mine.nu>, http://www.linuks.mine.nu
 # From Gürkan Sengün <gurkan@linuks.mine.nu>, http://www.linuks.mine.nu
@@ -442,3 +455,27 @@
 >16	byte		x		mid-side
 >16	byte		x		mid-side
 
 
 384	string		LockStream	LockStream Embedded file (mostly MP3 on old Nokia phones)
 384	string		LockStream	LockStream Embedded file (mostly MP3 on old Nokia phones)
+
+# format VQF (proprietary codec for sound)
+# some infos on the header file available at :
+# http://www.twinvq.org/english/technology_format.html
+0	string		TWIN97012000	VQF data
+>27	short		0		\b, Mono
+>27	short		1		\b, Stereo
+>31	short 		>0		\b, %d kbit/s
+>35	short 		>0		\b, %d kHz
+
+# Nelson A. de Oliveira (naoliv@gmail.com)
+# .eqf
+0	string	Winamp\ EQ\ library\ file	%s
+# it will match only versions like v<digit>.<digit>
+# Since I saw only eqf files with version v1.1 I think that it's OK
+>23	string	x	\b%.4s
+# .preset
+0	string	\[Equalizer\ preset\]	XMMS equalizer preset
+# .m3u
+0	string	\#EXTM3U	M3U playlist
+# .pls
+0	string	\[playlist\]	PLS playlist
+# licq.conf
+1	string	\[licq\]	LICQ configuration file

+ 16 - 0
magic/Magdir/basis

@@ -0,0 +1,16 @@
+#----------------------------------------------------------------
+# basis: file(1) magic for BBx/Pro5-files
+#      Oliver Dammer <dammer@olida.de>	 2005/11/07
+# http://www.basis.com business-basic-files.
+#
+0	string		\074\074bbx\076\076	BBx
+>7	string		\000			indexed file
+>7	string		\001			serial file
+>7	string		\002			keyed file
+>>13	short		0			(sort)
+>7	string		\004			program
+>>18	byte		x			(LEVEL %d)
+>>>23	string		>\000			psaved
+>7	string		\006			mkeyed file
+>>13	short		0			(sort)
+>>8	string		\000			(mkey)

magic/Magdir/bFLT → magic/Magdir/bflt


+ 11 - 0
magic/Magdir/btsnoop

@@ -0,0 +1,11 @@
+#------------------------------------------------------------------------------
+# BTSnoop:  file(1) magic for BTSnoop files
+#
+# From <marcel@holtmann.org>
+0	string		btsnoop\0		BTSnoop
+>8	belong		x			version %d,
+>12	belong		1001			Unencapsulated HCI
+>12	belong		1002			HCI UART (H4)
+>12	belong		1003			HCI BCSP
+>12	belong		1004			HCI Serial (H5)
+>>12	belong		x			type %d

+ 0 - 7
magic/Magdir/chi

@@ -1,7 +0,0 @@
-
-#------------------------------------------------------------------------------
-# chi:  file(1) magic for ChiWriter files
-#
-0       string          \\1cw\          ChiWriter file
->5      string          >\0             version %s
-0       string          \\1cw           ChiWriter file

+ 2 - 1
magic/Magdir/commands

@@ -27,7 +27,8 @@
 #
 #
 0	string/b	#!\ /bin/awk		awk script text executable
 0	string/b	#!\ /bin/awk		awk script text executable
 0	string/b	#!\ /usr/bin/awk	awk script text executable
 0	string/b	#!\ /usr/bin/awk	awk script text executable
-0	string		BEGIN			awk script text
+# update to distinguish from *.vcf files
+0	regex		BEGIN[[:space:]]*[{]	awk script text
 
 
 # AT&T Bell Labs' Plan 9 shell
 # AT&T Bell Labs' Plan 9 shell
 0	string/b	#!\ /bin/rc	Plan 9 rc shell script text executable
 0	string/b	#!\ /bin/rc	Plan 9 rc shell script text executable

+ 23 - 6
magic/Magdir/compress

@@ -22,22 +22,28 @@
 >2	byte		<8		\b, reserved method
 >2	byte		<8		\b, reserved method
 >2	byte		>8		\b, unknown method
 >2	byte		>8		\b, unknown method
 >3	byte		&0x01		\b, ASCII
 >3	byte		&0x01		\b, ASCII
->3	byte		&0x02		\b, continuation
+>3	byte		&0x02		\b, has CRC
 >3	byte		&0x04		\b, extra field
 >3	byte		&0x04		\b, extra field
 >3	byte&0xC	=0x08
 >3	byte&0xC	=0x08
 >>10	string		x		\b, was "%s"
 >>10	string		x		\b, was "%s"
->9	byte		=0x00		\b, from MS-DOS
+>3	byte		&0x10		\b, has comment
+>9	byte		=0x00		\b, from FAT filesystem (MS-DOS, OS/2, NT)
 >9	byte		=0x01		\b, from Amiga
 >9	byte		=0x01		\b, from Amiga
 >9	byte		=0x02		\b, from VMS
 >9	byte		=0x02		\b, from VMS
 >9	byte		=0x03		\b, from Unix
 >9	byte		=0x03		\b, from Unix
+>9	byte		=0x04		\b, from VM/CMS
 >9	byte		=0x05		\b, from Atari
 >9	byte		=0x05		\b, from Atari
->9	byte		=0x06		\b, from OS/2
+>9	byte		=0x06		\b, from HPFS filesystem (OS/2, NT)
 >9	byte		=0x07		\b, from MacOS
 >9	byte		=0x07		\b, from MacOS
->9	byte		=0x0A		\b, from Tops/20
->9	byte		=0x0B		\b, from Win/32
+>9	byte		=0x08		\b, from Z-System
+>9	byte		=0x09		\b, from CP/M
+>9	byte		=0x0A		\b, from TOPS/20
+>9	byte		=0x0B		\b, from NTFS filesystem (NT)
+>9	byte		=0x0C		\b, from QDOS
+>9	byte		=0x0D		\b, from Acorn RISCOS
 >3	byte		&0x10		\b, comment
 >3	byte		&0x10		\b, comment
 >3	byte		&0x20		\b, encrypted
 >3	byte		&0x20		\b, encrypted
-### >4	ledate		x		last modified: %s,
+>4	ledate		>0		\b, last modified: %s
 >8	byte		2		\b, max compression
 >8	byte		2		\b, max compression
 >8	byte		4		\b, max speed
 >8	byte		4		\b, max speed
 
 
@@ -170,3 +176,14 @@
 
 
 # AFX compressed files (Wolfram Kleff)
 # AFX compressed files (Wolfram Kleff)
 2	string		-afx-		AFX compressed file data
 2	string		-afx-		AFX compressed file data
+
+# Supplementary magic data for the file(1) command to support
+# rzip(1).  The format is described in magic(5).
+#
+# Copyright (C) 2003 by Andrew Tridgell.  You may do whatever you want with
+# this file.
+#
+0	string		RZIP		rzip compressed data
+>4	byte		x		- version %d
+>5	byte		x		\b.%d
+>6	belong		x		(%d bytes)

+ 2 - 2
magic/Magdir/cracklib

@@ -8,6 +8,6 @@
 >>8	long	>-1		(%i words)
 >>8	long	>-1		(%i words)
 0	belong	0x70775631	Cracklib password index, big endian
 0	belong	0x70775631	Cracklib password index, big endian
 >4	belong	>-1		(%i words)
 >4	belong	>-1		(%i words)
-0	long	0
->4	belong	0x70775631	Cracklib password index, big endian ("64-bit")
+# really bellong 0x0000000070775631
+4	belong	0x70775631	Cracklib password index, big endian ("64-bit")
 >12	belong	>0		(%i words)
 >12	belong	>0		(%i words)

+ 4 - 0
magic/Magdir/database

@@ -210,3 +210,7 @@
 16	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
 16	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
 17	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
 17	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
 18	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
 18	string		MIT-MAGIC-COOKIE-1	X11 Xauthority data
+
+# SQLite (Ty Sarna)
+0	string	**\ This\ file\ contains\ an\ SQLite	SQLite Database
+>&1	regex	[^\ ]+					Version %s

+ 12 - 0
magic/Magdir/dump

@@ -79,3 +79,15 @@
 >760	string	>\0		Device %s,
 >760	string	>\0		Device %s,
 >824	string	>\0		Host %s,
 >824	string	>\0		Host %s,
 >888	lelong	>0		Flags %x
 >888	lelong	>0		Flags %x
+
+18	leshort	60011		old-fs dump file (16-bit, assuming PDP-11 endianness),
+>2	medate	x		Previous dump %s,
+>6	medate	x		This dump %s,
+>10	leshort	>0		Volume %ld,
+>0	leshort	1		tape header.
+>0	leshort	2		beginning of file record.
+>0	leshort	3		map of inodes on tape.
+>0	leshort	4		continuation of file record.
+>0	leshort	5		end of volume.
+>0	leshort	6		map of inodes deleted.
+>0	leshort	7		end of medium (for floppy).

+ 342 - 64
magic/Magdir/filesystems

@@ -23,12 +23,35 @@
 >0770	long		x		%ld blocks
 >0770	long		x		%ld blocks
 # Is there a boot block written 1 sector in?
 # Is there a boot block written 1 sector in?
 >512    belong&077777777	0600407	\b, boot block present
 >512    belong&077777777	0600407	\b, boot block present
-# DOS Emulator image is 128 byte header + harddisc image
+# Joerg Jenderek: Smart Boot Manager backup file is 41 byte header + first sectors of disc
+# (http://btmgr.sourceforge.net/docs/user-guide-3.html)
+0		string	SBMBAKUP_	Smart Boot Manager backup file
+>9		string	x		\b, version %-5.5s
+>>14		string	=_		
+>>>15		string	x		%-.1s
+>>>>16		string	=_		\b.
+>>>>>17		string	x		\b%-.1s
+>>>>>>18	string	=_		\b.
+>>>>>>>19	string	x		\b%-.1s
+>>>22		ubyte	0		
+>>>>21		ubyte	x		\b, from drive 0x%x
+>>>22		ubyte	>0		
+>>>>21		string	x		\b, from drive %s
+
+# Joerg Jenderek
+# DOS Emulator image is 128 byte, null right padded header + harddisc image
 0	string	DOSEMU\0			
 0	string	DOSEMU\0			
->0x27E	leshort	0xAA55			DOS Emulator image
+>0x27E	leshort	0xAA55			
+#offset is 128
+>>19	ubyte	128			
+>>>(19.b-1)	ubyte	0x0	DOS Emulator image
+>>>>7	ulelong	>0		\b, %u heads
+>>>>11	ulelong	>0		\b, %d sectors/track
+>>>>15	ulelong	>0		\b, %d cylinders
+
 0x1FE	leshort	0xAA55			x86 boot sector
 0x1FE	leshort	0xAA55			x86 boot sector
 >2	string	OSBS			\b, OS/BS MBR
 >2	string	OSBS			\b, OS/BS MBR
-# J\xf6rg Jenderek <joerg.jenderek@gmx.net>
+# J\xf6rg Jenderek <joerg dot jenderek at web dot de>
 >0x8C	string	Invalid\ partition\ table	\b, MS-DOS MBR
 >0x8C	string	Invalid\ partition\ table	\b, MS-DOS MBR
 # dr-dos with some upper-, lowercase variants
 # dr-dos with some upper-, lowercase variants
 >0x9D	string	Invalid\ partition\ table$	
 >0x9D	string	Invalid\ partition\ table$	
@@ -49,39 +72,103 @@
 >>>>>>>387	string	Copyright\ (c)\ 1984,1998	
 >>>>>>>387	string	Copyright\ (c)\ 1984,1998	
 >>>>>>>>411	string	Caldera\ Inc.\0		\b, DR-DOS MBR (IBMBIO.LDR)
 >>>>>>>>411	string	Caldera\ Inc.\0		\b, DR-DOS MBR (IBMBIO.LDR)
 >0x10F	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
 >0x10F	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
+>>0x1B8	ubelong	>0				\b, Serial 0x%-.4x
 >0x8B	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 5.00 to 4.00.950
 >0x8B	string	Ung\201ltige\ Partitionstabelle	\b, MS-DOS MBR, german version 5.00 to 4.00.950
+>271	string	Invalid\ partition\ table\0		
+>>295	string	Error\ loading\ operating\ system\0	
+>>>326	string	Missing\ operating\ system\0		\b, mbr
+#
+>139	string	Invalid\ partition\ table\0		
+>>163	string	Error\ loading\ operating\ system\0	
+>>>194	string	Missing\ operating\ system\0		\b, Microsoft Windows XP mbr
+# http://www.heise.de/ct/05/09/006/ page 184
+#HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices\?:=Serial4Bytes+8Bytes
+>>>>0x1B8	ulelong	>0				\b,Serial 0x%-.4x
 >300	string	Invalid\ partition\ table\0	
 >300	string	Invalid\ partition\ table\0	
 >>324	string	Error\ loading\ operating\ system\0
 >>324	string	Error\ loading\ operating\ system\0
 >>>355	string	Missing\ operating\ system\0		\b, Microsoft Windows XP MBR
 >>>355	string	Missing\ operating\ system\0		\b, Microsoft Windows XP MBR
 #??>>>389	string	Invalid\ system\ disk		
 #??>>>389	string	Invalid\ system\ disk		
+>>>>0x1B8	ulelong	>0				\b, Serial 0x%-.4x
 >300	string	Ung\201ltige\ Partitionstabelle
 >300	string	Ung\201ltige\ Partitionstabelle
 #split string to avoid error: String too long
 #split string to avoid error: String too long
 >>328	string	Fehler\ beim\ Laden\ 	
 >>328	string	Fehler\ beim\ Laden\ 	
 >>>346	string	des\ Betriebssystems	
 >>>346	string	des\ Betriebssystems	
 >>>>366	string	Betriebssystem\ nicht\ vorhanden	\b, Microsoft Windows XP MBR (german)
 >>>>366	string	Betriebssystem\ nicht\ vorhanden	\b, Microsoft Windows XP MBR (german)
+>>>>>0x1B8	ulelong	>0				\b, Serial 0x%-.4x
 >0x145	string	Default:\ F				\b, FREE-DOS MBR
 >0x145	string	Default:\ F				\b, FREE-DOS MBR
 >64	string	no\ active\ partition\ found	
 >64	string	no\ active\ partition\ found	
->>96	string	read\ error\ while\ reading\ drive	\b, FREE-DOS Beta9 MBR
+>>96	string	read\ error\ while\ reading\ drive	\b, FREE-DOS Beta 0.9 MBR
+>271	string	Operating\ system\ loading 		
+>>296	string	error\r					\b, SYSLINUX MBR (2.10)
 # bootloader, bootmanager
 # bootloader, bootmanager
 >43	string	SMART\ BTMGRFAT12\ \ \ 		
 >43	string	SMART\ BTMGRFAT12\ \ \ 		
 >>430	string	SBMK\ Bad!\r			
 >>430	string	SBMK\ Bad!\r			
 >>>3	string	SBM				\b, Smart Boot Manager
 >>>3	string	SBM				\b, Smart Boot Manager
 >>>>6	string	>\0                             \b, version %s
 >>>>6	string	>\0                             \b, version %s
->382	string	XOSLLOADXCF			\b, EXtended Operating System Loader
+>382	string	XOSLLOADXCF			\b, eXtended Operating System Loader
 >6	string	LILO				\b, LInux i386 boot LOader
 >6	string	LILO				\b, LInux i386 boot LOader
 >>120	string	LILO				\b, version 22.3.4 SuSe
 >>120	string	LILO				\b, version 22.3.4 SuSe
 >>172	string	LILO				\b, version 22.5.8 Debian
 >>172	string	LILO				\b, version 22.5.8 Debian
 >402	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >402	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >>394	string	stage1				\b, GRand Unified Bootloader (0.5.95)
 >>394	string	stage1				\b, GRand Unified Bootloader (0.5.95)
+>343	string	Geom\0Read\0\ Error\0		
+>>321	string	Loading\ stage1.5		\b, Grand Unified Bootloader
 >380	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >380	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >>374	string	GRUB\ \0			\b, GRand Unified Bootloader
 >>374	string	GRUB\ \0			\b, GRand Unified Bootloader
 >382	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >382	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >>376	string	GRUB\ \0			\b, GRand Unified Bootloader (0.93)
 >>376	string	GRUB\ \0			\b, GRand Unified Bootloader (0.93)
 >383	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >383	string	Geom\0Hard\ Disk\0Read\0\ Error\0
 >>377	string	GRUB\ \0			\b, GRand Unified Bootloader (0.94)
 >>377	string	GRUB\ \0			\b, GRand Unified Bootloader (0.94)
+>385	string	Geom\0Hard\ Disk\0Read\0\ Error\0
+>>379	string	GRUB\ \0			\b, GRand Unified Bootloader (0.95)
 >480	string	Boot\ failed\r			
 >480	string	Boot\ failed\r			
 >>495	string	LDLINUX\ SYS			\b, SYSLINUX bootloader (2.06)
 >>495	string	LDLINUX\ SYS			\b, SYSLINUX bootloader (2.06)
 >395	string	chksum\0\ ERROR!\0		\b, Gujin bootloader
 >395	string	chksum\0\ ERROR!\0		\b, Gujin bootloader
+# mbr partion table entries, if not fat boot secor, activ flag 0 or 0x80 and type > 0
+>3			string		!MS	
+>>3			string		!SYSLINUX
+>>>82			string		!FAT32	
+>>>>446			ubyte		<0x81	
+>>>>>446		ubyte&0x7F	0	
+>>>>>>450		ubyte		>0	\b; partition 1: ID=0x%x
+>>>>>>>446		ubyte		0x80	\b, active
+>>>>>>>447		ubyte		x	\b, starthead %u
+#>>>>>>>448		ubyte		x	\b, start C_S: 0x%x
+#>>>>>>448		ubeshort&1023	x	\b, startcylinder? %d
+>>>>>>>454		ulelong		x	\b, startsector %u
+>>>>>>>458		ulelong		x	\b, %u sectors
+#
+>>>>462			ubyte		<0x81	
+>>>>>462		ubyte&0x7F	0		
+>>>>>>466		ubyte		>0	\b; partition 2: ID=0x%x
+>>>>>>>462		ubyte		0x80	\b, active
+>>>>>>>463		ubyte		x	\b, starthead %u
+#>>>>>>>464		ubyte		x	\b, start C_S: 0x%x
+#>>>>>>>464		ubeshort&1023	x	\b, startcylinder? %d
+>>>>>>>470		ulelong		x	\b, startsector %u
+>>>>>>>474		ulelong		x	\b, %u sectors
+#
+>>>>478			ubyte		<0x81		
+>>>>>478		ubyte&0x7F	0		
+>>>>>>482		ubyte		>0	\b; partition 3: ID=0x%x
+>>>>>>>478		ubyte		0x80	\b, active
+>>>>>>>479		ubyte		x	\b, starthead %u
+#>>>>>>>480		ubyte		x	\b, start C_S: 0x%x
+#>>>>>>>481		ubyte		x	\b, start C2S: 0x%x
+#>>>>>>>480		ubeshort&1023	x	\b, startcylinder? %d
+>>>>>>>486		ulelong		x	\b, startsector %u
+>>>>>>>490		ulelong		x	\b, %u sectors
+#
+>>>>494			ubyte		<0x81	
+>>>>>494		ubyte&0x7F	0		
+>>>>>>498		ubyte		>0	\b; partition 4: ID=0x%x
+>>>>>>>494		ubyte		0x80	\b, active
+>>>>>>>495		ubyte		x	\b, starthead %u
+#>>>>>>>496		ubyte		x	\b, start C_S: 0x%x
+#>>>>>>>496		ubeshort&1023	x	\b, startcylinder? %d
+>>>>>>>502		ulelong		x	\b, startsector %u
+>>>>>>>506		ulelong		x	\b, %u sectors
+# mbr partion table entries end
 >185	string	FDBOOT\ Version\ 			
 >185	string	FDBOOT\ Version\ 			
 >>204	string	\rNo\ Systemdisk.\ 			
 >>204	string	\rNo\ Systemdisk.\ 			
 >>>220	string	Booting\ from\ harddisk.\n\r		
 >>>220	string	Booting\ from\ harddisk.\n\r		
@@ -108,69 +195,115 @@
 >>>>>>>>>(1.b+11)	ubyte	0xb			
 >>>>>>>>>(1.b+11)	ubyte	0xb			
 >>>>>>>>>>(1.b+12)	ubyte	0x56			
 >>>>>>>>>>(1.b+12)	ubyte	0x56			
 >>>>>>>>>>(1.b+13)	ubyte	0xb4			\b, mkdosfs boot message display
 >>>>>>>>>>(1.b+13)	ubyte	0xb4			\b, mkdosfs boot message display
+>103	string	This\ is\ not\ a\ bootable\ disk.\ 	
+>>132	string	Please\ insert\ a\ bootable\ 		
+>>>157	string	floppy\ and\r\n				
+>>>>169	string	press\ any\ key\ to\ try\ again...\r	\b, FREE-DOS message display
+#
+>66	string	Solaris\ Boot\ Sector    		
+>>99	string	Incomplete\ MDBoot\ load.		
+>>>89	string	Version 				\b, Sun Solaris Bootloader
+>>>>97	byte	x					version %c
+#
+>408	string	OS/2\ !!\ SYS01475\r\0			
+>>429	string	OS/2\ !!\ SYS02025\r\0			
+>>>450	string	OS/2\ !!\ SYS02027\r\0			
+>>>469	string	OS2BOOT\ \ \ \ 				\b, IBM OS/2 Warp bootloader
+#
+>409	string	OS/2\ !!\ SYS01475\r\0			
+>>430	string	OS/2\ !!\ SYS02025\r\0			
+>>>451	string	OS/2\ !!\ SYS02027\r\0			
+>>>470	string	OS2BOOT\ \ \ \ 				\b, IBM OS/2 Warp Bootloader
+>112		string	This\ disk\ is\ not\ bootable\r			
+>>142		string	If\ you\ wish\ to\ make\ it\ bootable		
+>>>176		string	run\ the\ DOS\ program\ SYS\  			
+>>>200		string	after\ the\r					
+>>>>216		string	system\ has\ been\ loaded\r\n			
+>>>>>242	string	Please\ insert\ a\ DOS\ diskette\ 		
+>>>>>271	string	into\r\n\ the\ drive\ and\ 			
+>>>>>>292	string	strike\ any\ key...\0		\b, IBM OS/2 Warp message display
 # XP
 # XP
 >430	string	NTLDR\ is\ missing\xFF\r\n		
 >430	string	NTLDR\ is\ missing\xFF\r\n		
 >>449	string	Disk\ error\xFF\r\n			
 >>449	string	Disk\ error\xFF\r\n			
 >>>462	string	Press\ any\ key\ to\ restart\r		\b, Microsoft Windows XP Bootloader
 >>>462	string	Press\ any\ key\ to\ restart\r		\b, Microsoft Windows XP Bootloader
 # DOS names like NTLDR,CMLDR,$LDR$ are 8 right space padded bytes+3 bytes
 # DOS names like NTLDR,CMLDR,$LDR$ are 8 right space padded bytes+3 bytes
->>>>417		ubyte		<0x7E 			
->>>>>417	string		>\ 			%-.5s
->>>>>>422	ubyte		<0x7E 			
->>>>>>>422	string		>\ 			\b%-.3s
+>>>>417		ubyte&0xDF	>0			
+>>>>>417	string		x			%-.5s
+>>>>>>422	ubyte&0xDF	>0			
+>>>>>>>422	string		x 			\b%-.3s
+>>>>>425	ubyte&0xDF	>0			
 >>>>>>425	string		>\ 			\b.%-.3s
 >>>>>>425	string		>\ 			\b.%-.3s
 #
 #
->>>>368		ubyte		<0x7E 			
->>>>>368	string		>\ 			%-.5s
->>>>>>373	ubyte		<0x7E			
->>>>>>>373	string		>\ 			\b%-.3s
->>>>>>376	string		>\ 			\b.%-.3s
+>>>>371		ubyte		>0x20			
+>>>>>368	ubyte&0xDF	>0			
+>>>>>>368	string		x 			%-.5s
+>>>>>>>373	ubyte&0xDF	>0			
+>>>>>>>>373	string		x 			\b%-.3s
+>>>>>>376	ubyte&0xDF	>0			
+>>>>>>>376	string		x 			\b.%-.3s
 #
 #
 >430	string	NTLDR\ nicht\ gefunden\xFF\r\n		
 >430	string	NTLDR\ nicht\ gefunden\xFF\r\n		
 >>453	string	Datentr\204gerfehler\xFF\r\n		
 >>453	string	Datentr\204gerfehler\xFF\r\n		
 >>>473	string	Neustart\ mit\ beliebiger\ Taste\r	\b, Microsoft Windows XP Bootloader (german)
 >>>473	string	Neustart\ mit\ beliebiger\ Taste\r	\b, Microsoft Windows XP Bootloader (german)
->>>>417		ubyte		<0x7E 			
->>>>>417	string		>\ 			%-.5s
->>>>>>422	ubyte		<0x7E 			
->>>>>>>422	string		>\ 			\b%-.3s
+>>>>417		ubyte&0xDF	>0			
+>>>>>417	string		x			%-.5s
+>>>>>>422	ubyte&0xDF	>0			
+>>>>>>>422	string		x 			\b%-.3s
+>>>>>425	ubyte&0xDF	>0			
 >>>>>>425	string		>\ 			\b.%-.3s
 >>>>>>425	string		>\ 			\b.%-.3s
 #
 #
->>>>368		ubyte		<0x7E 			
->>>>>368	string		>\ 			%-.5s
->>>>>>373	ubyte		<0x7E 			
->>>>>>>373	string		>\ 			\b%-.3s
->>>>>>376	string		>\ 			\b.%-.3s
+>>>>368		ubyte&0xDF	>0			
+>>>>>368	string		x 			%-.5s
+>>>>>>373	ubyte&0xDF	>0			
+>>>>>>>373	string		x 			\b%-.3s
+>>>>>376	ubyte&0xDF	>0			
+>>>>>>376	string		x 			\b.%-.3s
 #
 #
 >430	string	NTLDR\ fehlt\xFF\r\n			
 >430	string	NTLDR\ fehlt\xFF\r\n			
 >>444	string	Datentr\204gerfehler\xFF\r\n		
 >>444	string	Datentr\204gerfehler\xFF\r\n		
 >>>464	string	Neustart\ mit\ beliebiger\ Taste\r	\b, Microsoft Windows XP Bootloader (2.german)
 >>>464	string	Neustart\ mit\ beliebiger\ Taste\r	\b, Microsoft Windows XP Bootloader (2.german)
->>>>417		ubyte		<0x7E 			
->>>>>417	string		>\ 			%-.5s
->>>>>>422	ubyte		<0x7E 			
->>>>>>>422	string		>\ 			\b%-.3s
+>>>>417		ubyte&0xDF	>0			
+>>>>>417	string		x			%-.5s
+>>>>>>422	ubyte&0xDF	>0			
+>>>>>>>422	string		x 			\b%-.3s
+>>>>>425	ubyte&0xDF	>0			
 >>>>>>425	string		>\ 			\b.%-.3s
 >>>>>>425	string		>\ 			\b.%-.3s
+# variant
+>>>>371		ubyte		>0x20			
+>>>>>368	ubyte&0xDF	>0			
+>>>>>>368	string		x 			%-.5s
+>>>>>>>373	ubyte&0xDF	>0			
+>>>>>>>>373	string		x 			\b%-.3s
+>>>>>>376	ubyte&0xDF	>0			
+>>>>>>>376	string		x 			\b.%-.3s
 #
 #
 >430	string	NTLDR\ fehlt\xFF\r\n			
 >430	string	NTLDR\ fehlt\xFF\r\n			
 >>444	string	Medienfehler\xFF\r\n			
 >>444	string	Medienfehler\xFF\r\n			
 >>>459	string	Neustart:\ Taste\ dr\201cken\r		\b, Microsoft Windows XP Bootloader (3.german)
 >>>459	string	Neustart:\ Taste\ dr\201cken\r		\b, Microsoft Windows XP Bootloader (3.german)
->>>>368		ubyte		<0x7E 			
->>>>>368	string		>\ 			%-.5s
->>>>>>373	ubyte		<0x7E			
->>>>>>>373	string		>\ 			\b%-.3s
->>>>>>376	string		>\ 			\b.%-.3s
->>>>417		ubyte		<0x7E 			
->>>>>417	string		>\ 			%-.5s
->>>>>>422	ubyte		<0x7E 			
->>>>>>>422	string		>\ 			\b%-.3s
+>>>>371		ubyte		>0x20			
+>>>>>368	ubyte&0xDF	>0			
+>>>>>>368	string		x 			%-.5s
+>>>>>>>373	ubyte&0xDF	>0			
+>>>>>>>>373	string		x 			\b%-.3s
+>>>>>>376	ubyte&0xDF	>0			
+>>>>>>>376	string		x 			\b.%-.3s
+# variant
+>>>>417		ubyte&0xDF	>0			
+>>>>>417	string		x			%-.5s
+>>>>>>422	ubyte&0xDF	>0			
+>>>>>>>422	string		x 			\b%-.3s
+>>>>>425	ubyte&0xDF	>0			
 >>>>>>425	string		>\ 			\b.%-.3s
 >>>>>>425	string		>\ 			\b.%-.3s
 #
 #
 >430	string	Datentr\204ger\ entfernen\xFF\r\n	
 >430	string	Datentr\204ger\ entfernen\xFF\r\n	
 >>454	string	Medienfehler\xFF\r\n			
 >>454	string	Medienfehler\xFF\r\n			
 >>>469	string	Neustart:\ Taste\ dr\201cken\r		\b, Microsoft Windows XP Bootloader (4.german)
 >>>469	string	Neustart:\ Taste\ dr\201cken\r		\b, Microsoft Windows XP Bootloader (4.german)
->>>>368		ubyte		<0x7E 			
->>>>>368	string		>\ 			%-.5s
->>>>>>373	ubyte		<0x7E			
->>>>>>>373	string		>\ 			\b%-.3s
->>>>>>376	string		>\ 			\b.%-.3s
+>>>>368		ubyte&0xDF	>0			
+>>>>>368	string		x 			%-.5s
+>>>>>>373	ubyte&0xDF	>0			
+>>>>>>>373	string		x 			\b%-.3s
+>>>>>376	ubyte&0xDF	>0			
+>>>>>>376	string		x 			\b.%-.3s
 #>3	string	NTFS\ \ \ \ 				
 #>3	string	NTFS\ \ \ \ 				
 >389	string	Fehler\ beim\ Lesen\ 
 >389	string	Fehler\ beim\ Lesen\ 
 >>407	string	des\ Datentr\204gers
 >>407	string	des\ Datentr\204gers
@@ -185,12 +318,27 @@
 >>>>>429 string	Insert\ a\ system\ diskette\ 	
 >>>>>429 string	Insert\ a\ system\ diskette\ 	
 >>>>>>454 string and\ restart\r\nthe\ system.\r		\b, Microsoft Windows XP Bootloader NTFS
 >>>>>>454 string and\ restart\r\nthe\ system.\r		\b, Microsoft Windows XP Bootloader NTFS
 # DOS loader variants different languages,offsets
 # DOS loader variants different languages,offsets
->472	string	IO\ \ \ \ \ \ SYSMSDOS\ \ \ SYS		
->>497	string	WINBOOT\ SYS				
+>472	ubyte&0xDF	>0
 >>389	string	Invalid\ system\ disk\xFF\r\n		
 >>389	string	Invalid\ system\ disk\xFF\r\n		
 >>>411	string	Disk\ I/O\ error			
 >>>411	string	Disk\ I/O\ error			
 >>>>428	string	Replace\ the\ disk,\ and\ 		
 >>>>428	string	Replace\ the\ disk,\ and\ 		
 >>>>>455 string	press\ any\ key				\b, Microsoft Windows 98 Bootloader
 >>>>>455 string	press\ any\ key				\b, Microsoft Windows 98 Bootloader
+#IO.SYS
+>>>>>>472	ubyte&0xDF	>0			
+>>>>>>>472	string		x 			\b %-.2s
+>>>>>>>>474	ubyte&0xDF	>0			
+>>>>>>>>>474	string		x 			\b%-.5s
+>>>>>>>>>>479	ubyte&0xDF	>0			
+>>>>>>>>>>>479 string		x 			\b%-.1s
+>>>>>>>480	ubyte&0xDF	>0			
+>>>>>>>>480	string		x 			\b.%-.3s
+#MSDOS.SYS
+>>>>>>>483	ubyte&0xDF	>0			\b+
+>>>>>>>>483	string		x 			\b%-.5s
+>>>>>>>>>488	ubyte&0xDF	>0			
+>>>>>>>>>>488	string		x 			\b%-.3s
+>>>>>>>>491	ubyte&0xDF	>0			
+>>>>>>>>>491	string		x 			\b.%-.3s
 #
 #
 >>390	string	Invalid\ system\ disk\xFF\r\n		
 >>390	string	Invalid\ system\ disk\xFF\r\n		
 >>>412	string	Disk\ I/O\ error\xFF\r\n		
 >>>412	string	Disk\ I/O\ error\xFF\r\n		
@@ -200,30 +348,121 @@
 >>>410	string	E/A-Fehler\ \ \ \ \xFF\r\n		
 >>>410	string	E/A-Fehler\ \ \ \ \xFF\r\n		
 >>>>427	string	Datentraeger\ wechseln\ und\ 		
 >>>>427	string	Datentraeger\ wechseln\ und\ 		
 >>>>>453 string	Taste\ druecken\r			\b, Microsoft Windows 95/98/ME Bootloader (german)
 >>>>>453 string	Taste\ druecken\r			\b, Microsoft Windows 95/98/ME Bootloader (german)
+#WINBOOT.SYS only not spaces (0xDF)
+>>>>>>497	ubyte&0xDF	>0			
+>>>>>>>497	string		x 			%-.5s
+>>>>>>>>502	ubyte&0xDF	>0			
+>>>>>>>>>502	string		x 			\b%-.1s
+>>>>>>>>>>503	ubyte&0xDF	>0			
+>>>>>>>>>>>503	string		x 			\b%-.1s
+>>>>>>>>>>>>504	ubyte&0xDF	>0			
+>>>>>>>>>>>>>504 string		x 			\b%-.1s
+>>>>>>505	ubyte&0xDF	>0			
+>>>>>>>505	string		x 			\b.%-.3s
+#IO.SYS
+>>>>>>472	ubyte&0xDF	>0			or
+>>>>>>>472	string		x 			\b %-.2s
+>>>>>>>>474	ubyte&0xDF	>0			
+>>>>>>>>>474	string		x 			\b%-.5s
+>>>>>>>>>>479	ubyte&0xDF	>0			
+>>>>>>>>>>>479 string		x 			\b%-.1s
+>>>>>>>480	ubyte&0xDF	>0			
+>>>>>>>>480	string		x 			\b.%-.3s
+#MSDOS.SYS
+>>>>>>>483	ubyte&0xDF	>0			\b+
+>>>>>>>>483	string		x 			\b%-.5s
+>>>>>>>>>488	ubyte&0xDF	>0			
+>>>>>>>>>>488	string		x 			\b%-.3s
+>>>>>>>>491	ubyte&0xDF	>0			
+>>>>>>>>>491	string		x 			\b.%-.3s
 #
 #
 >>390	string	Ungueltiges\ System\ \xFF\r\n		
 >>390	string	Ungueltiges\ System\ \xFF\r\n		
 >>>412	string	E/A-Fehler\ \ \ \ \xFF\r\n		
 >>>412	string	E/A-Fehler\ \ \ \ \xFF\r\n		
 >>>>429	string	Datentraeger\ wechseln\ und\ 		
 >>>>429	string	Datentraeger\ wechseln\ und\ 		
 >>>>>455 string	Taste\ druecken\r			\b, Microsoft Windows 95/98/ME Bootloader (German)
 >>>>>455 string	Taste\ druecken\r			\b, Microsoft Windows 95/98/ME Bootloader (German)
+#WINBOOT.SYS only not spaces (0xDF)
+>>>>>>497	ubyte&0xDF	>0			
+>>>>>>>497	string		x 			%-.7s
+>>>>>>>>504	ubyte&0xDF	>0			
+>>>>>>>>>504	string		x 			\b%-.1s
+>>>>>>505	ubyte&0xDF	>0			
+>>>>>>>505	string		x 			\b.%-.3s
+#IO.SYS
+>>>>>>472	ubyte&0xDF	>0			or
+>>>>>>>472	string		x 			\b %-.2s
+>>>>>>>>474	ubyte&0xDF	>0			
+>>>>>>>>>474	string		x 			\b%-.6s
+>>>>>>>480	ubyte&0xDF	>0			
+>>>>>>>>480	string		x 			\b.%-.3s
+#MSDOS.SYS
+>>>>>>>483	ubyte&0xDF	>0			\b+
+>>>>>>>>483	string		x 			\b%-.5s
+>>>>>>>>>488	ubyte&0xDF	>0			
+>>>>>>>>>>488	string		x 			\b%-.3s
+>>>>>>>>491	ubyte&0xDF	>0			
+>>>>>>>>>491	string		x 			\b.%-.3s
 #
 #
 >>389	string	Ungueltiges\ System\ \xFF\r\n		
 >>389	string	Ungueltiges\ System\ \xFF\r\n		
 >>>411	string	E/A-Fehler\ \ \ \ \xFF\r\n		
 >>>411	string	E/A-Fehler\ \ \ \ \xFF\r\n		
 >>>>428	string	Datentraeger\ wechseln\ und\ 		
 >>>>428	string	Datentraeger\ wechseln\ und\ 		
 >>>>>454 string	Taste\ druecken\r			\b, Microsoft Windows 95/98/ME Bootloader (GERMAN)
 >>>>>454 string	Taste\ druecken\r			\b, Microsoft Windows 95/98/ME Bootloader (GERMAN)
->479	string	IO\ \ \ \ \ \ SYSMSDOS\ \ \ SYS		
+# DOS names like IO.SYS,WINBOOT.SYS,MSDOS.SYS,WINBOOT.INI are 8 right space padded bytes+3 bytes
+>>>>>>472	string		x 			%-.2s
+>>>>>>>474	ubyte&0xDF	>0			
+>>>>>>>>474	string		x 			\b%-.5s
+>>>>>>>>479	ubyte&0xDF	>0			
+>>>>>>>>>479	string		x 			\b%-.1s
+>>>>>>480	ubyte&0xDF	>0			
+>>>>>>>480	string		x 			\b.%-.3s
+>>>>>>483	ubyte&0xDF	>0			\b+
+>>>>>>>483	string		x 			\b%-.5s
+>>>>>>>488	ubyte&0xDF	>0			
+>>>>>>>>488	string		x 			\b%-.2s
+>>>>>>>>490	ubyte&0xDF	>0			
+>>>>>>>>>490	string		x 			\b%-.1s
+>>>>>>>491	ubyte&0xDF	>0			
+>>>>>>>>491	string		x 			\b.%-.3s
+>479	ubyte&0xDF	>0
 >>416	string	Kein\ System\ oder\ 			
 >>416	string	Kein\ System\ oder\ 			
 >>>433	string	Laufwerksfehler				
 >>>433	string	Laufwerksfehler				
 >>>>450	string	Wechseln\ und\ Taste\ dr\201cken	\b, Microsoft DOS Bootloader (german)
 >>>>450	string	Wechseln\ und\ Taste\ dr\201cken	\b, Microsoft DOS Bootloader (german)
->486	string	IO\ \ \ \ \ \ SYSMSDOS\ \ \ SYS		
+#IO.SYS
+>>>>>479	string		x 			\b %-.2s
+>>>>>>481	ubyte&0xDF	>0			
+>>>>>>>481	string		x 			\b%-.6s
+>>>>>487	ubyte&0xDF	>0			
+>>>>>>487	string		x 			\b.%-.3s
+#MSDOS.SYS
+>>>>>>490	ubyte&0xDF	>0			\b+
+>>>>>>>490	string		x 			\b%-.5s
+>>>>>>>>495	ubyte&0xDF	>0			
+>>>>>>>>>495	string		x 			\b%-.3s
+>>>>>>>498	ubyte&0xDF	>0			
+>>>>>>>>498	string		x 			\b.%-.3s
+#
+>486	ubyte&0xDF	>0
 >>416	string	Non-System\ disk\ or\ 			
 >>416	string	Non-System\ disk\ or\ 			
 >>>435	string	disk\ error\r				
 >>>435	string	disk\ error\r				
 >>>>447	string	Replace\ and\ press\ any\ key\ 		
 >>>>447	string	Replace\ and\ press\ any\ key\ 		
 >>>>>473 string	when\ ready\r				\b, Microsoft DOS Bootloader
 >>>>>473 string	when\ ready\r				\b, Microsoft DOS Bootloader
->480	string	IO\ \ \ \ \ \ SYSMSDOS\ \ \ SYS		
+>480	ubyte&0xDF	>0			
 >>393	string	Non-System\ disk\ or\ 			
 >>393	string	Non-System\ disk\ or\ 			
 >>>412	string	disk\ error\r				
 >>>412	string	disk\ error\r				
 >>>>424	string	Replace\ and\ press\ any\ key\ 		
 >>>>424	string	Replace\ and\ press\ any\ key\ 		
 >>>>>450 string	when\ ready\r				\b, Microsoft DOS bootloader
 >>>>>450 string	when\ ready\r				\b, Microsoft DOS bootloader
+#IO.SYS
+>>>>>480	string		x 			\b %-.2s
+>>>>>>482	ubyte&0xDF	>0			
+>>>>>>>48	string		x 			\b%-.6s
+>>>>>488	ubyte&0xDF	>0			
+>>>>>>488	string		x 			\b.%-.3s
+#MSDOS.SYS
+>>>>>>491	ubyte&0xDF	>0			\b+
+>>>>>>>491	string		x 			\b%-.5s
+>>>>>>>>496	ubyte&0xDF	>0			
+>>>>>>>>>496	string		x 			\b%-.3s
+>>>>>>>499	ubyte&0xDF	>0			
+>>>>>>>>499	string		x 			\b.%-.3s
 #>43	string	\224R-LOADER\ \ SYS			=label					
 #>43	string	\224R-LOADER\ \ SYS			=label					
 >54	string	SYS
 >54	string	SYS
 >>324	string	VASKK
 >>324	string	VASKK
@@ -239,26 +478,65 @@
 >499	string	KERNEL\ \ SYS				
 >499	string	KERNEL\ \ SYS				
 >>305	string	BOOT\ err!\0				\b, Free-DOS Bootloader
 >>305	string	BOOT\ err!\0				\b, Free-DOS Bootloader
 >449	string	KERNEL\ \ SYS				
 >449	string	KERNEL\ \ SYS				
->>319	string	BOOT\ error!				\b, FREE-DOS 5.0 Bootloader
+>>319	string	BOOT\ error!				\b, FREE-DOS 0.5 Bootloader
+>125	string	Loading\ FreeDOS...\r			
+>>311	string	BOOT\ error!\r				\b, FREE-DOS bootloader
+>>>441		ubyte&0xDF	>0			
+>>>>441		string		x 			\b %-.6s
+>>>>>447	ubyte&0xDF	>0			
+>>>>>>447	string		x 			\b%-.1s
+>>>>>>>448	ubyte&0xDF	>0			
+>>>>>>>>448	string		x 			\b%-.1s
+>>>>449		ubyte&0xDF	>0			
+>>>>>449	string		x 			\b.%-.3s
 >124	string	FreeDOS\0				
 >124	string	FreeDOS\0				
->>331	string	\ err\0					\b, FREE-DOS BETa 9 Bootloader
+>>331	string	\ err\0					\b, FREE-DOS BETa 0.9 Bootloader
 # DOS names like KERNEL.SYS,KERNEL16.SYS,KERNEL32.SYS,METAKERN.SYS are 8 right space padded bytes+3 bytes
 # DOS names like KERNEL.SYS,KERNEL16.SYS,KERNEL32.SYS,METAKERN.SYS are 8 right space padded bytes+3 bytes
->>>497		string		>\ 			%-.6s
->>>>503		string		>\ 			\b%-.1s
->>>>504		string		>\ 			\b%-.1s
->>>505		string		>\ 			\b.%-.3s
->>333	string	\ err\0					\b, FREE-DOS BEta 9 Bootloader
->>>497		string		>\ 			%-.6s
->>>>503		string		>\ 			\b%-.1s
->>>>504		string		>\ 			\b%-.1s
->>>505		string		>\ 			\b.%-.3s
->>334	string	\ err\0					\b, FREE-DOS Beta 9 Bootloader
->>>497		string		>\ 			%-.6s
->>>>503		string		>\ 			\b%-.1s
->>>>504		string		>\ 			\b%-.1s
->>>505		string		>\ 			\b.%-.3s
+>>>497		ubyte&0xDF	>0			
+>>>>497		string		x 			\b %-.6s
+>>>>>503	ubyte&0xDF	>0			
+>>>>>>503	string		x 			\b%-.1s
+>>>>>>>504	ubyte&0xDF	>0			
+>>>>>>>>504	string		x 			\b%-.1s
+>>>>505		ubyte&0xDF	>0			
+>>>>>505	string		x 			\b.%-.3s
+>>333	string	\ err\0					\b, FREE-DOS BEta 0.9 Bootloader
+>>>497		ubyte&0xDF	>0			
+>>>>497		string		x 			\b %-.6s
+>>>>>503	ubyte&0xDF	>0			
+>>>>>>503	string		x 			\b%-.1s
+>>>>>>>504	ubyte&0xDF	>0			
+>>>>>>>>504	string		x 			\b%-.1s
+>>>>505		ubyte&0xDF	>0			
+>>>>>505	string		x 			\b.%-.3s
+>>334	string	\ err\0					\b, FREE-DOS Beta 0.9 Bootloader
+>>>497		ubyte&0xDF	>0			
+>>>>497		string		x 			\b %-.6s
+>>>>>503	ubyte&0xDF	>0			
+>>>>>>503	string		x 			\b%-.1s
+>>>>>>>504	ubyte&0xDF	>0			
+>>>>>>>>504	string		x 			\b%-.1s
+>>>>505		ubyte&0xDF	>0			
+>>>>>505	string		x 			\b.%-.3s
+>336	string	Error!\ 				
+>>343	string	Hit\ a\ key\ to\ reboot.		\b, FREE-DOS Beta 0.9sr1 Bootloader
+>>>497		ubyte&0xDF	>0			
+>>>>497		string		x 			\b %-.6s
+>>>>>503	ubyte&0xDF	>0			
+>>>>>>503	string		x 			\b%-.1s
+>>>>>>>504	ubyte&0xDF	>0			
+>>>>>>>>504	string		x 			\b%-.1s
+>>>>505		ubyte&0xDF	>0			
+>>>>>505	string		x 			\b.%-.3s
 # loader end
 # loader end
->0	string	\0\0\0\0		\b, extended partition table
+# Joerg Jenderek
+>446	ubyte	0			
+>>450	ubyte	>0			
+>>>482	ubyte	0			
+>>>>498	ubyte	0			
+>>>>466	ubyte	0x05			\b, extended partition table
+>>>>466	ubyte	0x0F			\b, extended partition table (LBA)
+>>>>466	ubyte	0x0			\b, extended partition table (last)	
 # JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
 # JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
 # older drives may use E9 xx xx
 # older drives may use E9 xx xx
 >0		lelong&0x009000EB	0x009000EB 
 >0		lelong&0x009000EB	0x009000EB 
@@ -316,7 +594,7 @@
 >>>>>>>43	string		<NO\ NAME	\b, label: "%11.11s"
 >>>>>>>43	string		<NO\ NAME	\b, label: "%11.11s"
 >>>>>>>43	string		>NO\ NAME	\b, label: "%11.11s"
 >>>>>>>43	string		>NO\ NAME	\b, label: "%11.11s"
 >>>>>>>43	string		=NO\ NAME	\b, unlabeled
 >>>>>>>43	string		=NO\ NAME	\b, unlabeled
->>>>>>54	string		FAT1		\b, FAT
+>>>>>>54	string		FAT		\b, FAT
 >>>>>>>54	string		FAT12		\b (12 bit)
 >>>>>>>54	string		FAT12		\b (12 bit)
 >>>>>>>54	string		FAT16		\b (16 bit)
 >>>>>>>54	string		FAT16		\b (16 bit)
 # FAT32 specific
 # FAT32 specific

+ 52 - 19
magic/Magdir/fsav

@@ -2,26 +2,59 @@
 #------------------------------------------------------------------------------
 #------------------------------------------------------------------------------
 # fsav:  file(1) magic for datafellows fsav virus definition files
 # fsav:  file(1) magic for datafellows fsav virus definition files
 # Anthon van der Neut (anthon@mnt.org)
 # Anthon van der Neut (anthon@mnt.org)
-0	beshort		0x1575		fsav (linux) macro virus
+
+# ftp://ftp.f-prot.com/pub/{macrdef2.zip,nomacro.def}
+0	beshort		0x1575		fsav macro virus signatures
 >8	leshort		>0		(%d-
 >8	leshort		>0		(%d-
 >11	byte		>0		\b%02d-
 >11	byte		>0		\b%02d-
 >10	byte		>0		\b%02d)
 >10	byte		>0		\b%02d)
+# ftp://ftp.f-prot.com/pub/sign.zip
+#10	ubyte		<12
+#>9	ubyte		<32
+#>>8	ubyte		0x0a
+#>>>12	ubyte		0x07
+#>>>>11	uleshort	>0		fsav DOS/Windows virus signatures (%d-
+#>>>>10	byte		0		\b01-
+#>>>>10	byte		1		\b02-
+#>>>>10	byte		2		\b03-
+#>>>>10	byte		3		\b04-
+#>>>>10	byte		4		\b05-
+#>>>>10	byte		5		\b06-
+#>>>>10	byte		6		\b07-
+#>>>>10	byte		7		\b08-
+#>>>>10	byte		8		\b09-
+#>>>>10	byte		9		\b10-
+#>>>>10	byte		10		\b11-
+#>>>>10	byte		11		\b12-
+#>>>>9	ubyte		>0		\b%02d)
+# ftp://ftp.f-prot.com/pub/sign2.zip
+#0	ubyte		0x62		
+#>1	ubyte		0xF5		
+#>>2	ubyte		0x1		
+#>>>3	ubyte		0x1		
+#>>>>4	ubyte		0x0e		
+#>>>>>13		ubyte	>0		fsav virus signatures
+#>>>>>>11	ubyte	x		size 0x%02x
+#>>>>>>12	ubyte	x		\b%02x
+#>>>>>>13	ubyte	x		\b%02x bytes
 
 
-# comment this out for now because it regognizes every file where
-# the eighth character is \n
-#8	byte		0x0a
-#>12	byte		0x07
-#>11	leshort		>0		fsav (linux) virus (%d-
-#>10	byte		0		\b01-
-#>10	byte		1		\b02-
-#>10	byte		2		\b03-
-#>10	byte		3		\b04-
-#>10	byte		4		\b05-
-#>10	byte		5		\b06-
-#>10	byte		6		\b07-
-#>10	byte		7		\b08-
-#>10	byte		8		\b08-
-#>10	byte		9		\b10-
-#>10	byte		10		\b11-
-#>10	byte		11		\b12-
-#>9	byte		>0		\b%02d)
+# Joerg Jenderek: joerg dot jenderek at web dot de
+# http://www.clamav.net/doc/latest/html/node45.html
+# .cvd files start with a 512 bytes colon separated header
+# ClamAV-VDB:buildDate:version:signaturesNumbers:functionalityLevelRequired:MD5:Signature:builder:buildTime
+# + gzipped tarball files
+0	string		ClamAV-VDB:	
+>11	string		>\0		Clam AntiVirus database %-.23s
+>>34	string		:		
+>>>35	regex		[^:]+		\b, version 
+>>>>35		string		x 	\b%-.1s
+>>>>>36		string 		!:	
+>>>>>>36	string		x 	\b%-.1s
+>>>>>>>37	string		!:	
+>>>>>>>>37	string		x 	\b%-.1s
+>>>>>>>>>38	string		!:	
+>>>>>>>>>>38	string		x 	\b%-.1s
+>>>>512	string		\037\213	\b, gzipped
+>>>>769	string		ustar\0		\b, tared
+>512	string		\037\213	\b, gzipped
+>769	string		ustar\0		\b, tared

+ 20 - 2
magic/Magdir/iff

@@ -15,21 +15,39 @@
 >8	string		AIFF		\b, AIFF audio
 >8	string		AIFF		\b, AIFF audio
 >8	string		AIFC		\b, AIFF-C compressed audio
 >8	string		AIFC		\b, AIFF-C compressed audio
 >8	string		8SVX		\b, 8SVX 8-bit sampled sound voice
 >8	string		8SVX		\b, 8SVX 8-bit sampled sound voice
+>8	string		16SV		\b, 16SV 16-bit sampled sound voice
 >8	string		SAMP		\b, SAMP sampled audio
 >8	string		SAMP		\b, SAMP sampled audio
->8	string		DTYP		\b, DTYP datatype description
->8	string		PTCH		\b, PTCH binary patch
+>8	string		MAUD		\b, MAUD MacroSystem audio
+>8	string		SMUS		\b, SMUS simple music
+>8	string		CMUS		\b, CMUS complex music
 # image formats
 # image formats
 >8	string		ILBMBMHD	\b, ILBM interleaved image
 >8	string		ILBMBMHD	\b, ILBM interleaved image
 >>20	beshort		x		\b, %d x
 >>20	beshort		x		\b, %d x
 >>22	beshort		x		%d
 >>22	beshort		x		%d
 >8	string		RGBN		\b, RGBN 12-bit RGB image
 >8	string		RGBN		\b, RGBN 12-bit RGB image
 >8	string		RGB8		\b, RGB8 24-bit RGB image
 >8	string		RGB8		\b, RGB8 24-bit RGB image
+>8	string		DEEP		\b, DEEP TVPaint/XiPaint image
 >8	string		DR2D		\b, DR2D 2-D object
 >8	string		DR2D		\b, DR2D 2-D object
 >8	string		TDDD		\b, TDDD 3-D rendering
 >8	string		TDDD		\b, TDDD 3-D rendering
+>8	string		LWOB		\b, LWOB 3-D object
+>8	string		LWO2		\b, LWO2 3-D object, v2
+>8	string		LWLO		\b, LWLO 3-D layered object
+>8	string		REAL		\b, REAL Real3D rendering
+>8	string		MC4D		\b, MC4D MaxonCinema4D rendering
+>8	string		ANIM		\b, ANIM animation
+>8	string		YAFA		\b, YAFA animation
+>8	string		SSA\ 		\b, SSA super smooth animation
+>8	string		ACBM		\b, ACBM continuous image
+>8	string		FAXX		\b, FAXX fax image
 # other formats
 # other formats
 >8	string		FTXT		\b, FTXT formatted text
 >8	string		FTXT		\b, FTXT formatted text
 >8	string		CTLG		\b, CTLG message catalog
 >8	string		CTLG		\b, CTLG message catalog
 >8	string		PREF		\b, PREF preferences
 >8	string		PREF		\b, PREF preferences
+>8	string		DTYP		\b, DTYP datatype description
+>8	string		PTCH		\b, PTCH binary patch
+>8	string		AMFF		\b, AMFF AmigaMetaFile format
+>8	string		WZRD		\b, WZRD StormWIZARD resource
+>8	string		DOC\ 		\b, DOC desktop publishing document
 
 
 # These go at the end of the iff rules
 # These go at the end of the iff rules
 #
 #

+ 45 - 1
magic/Magdir/linux

@@ -60,6 +60,8 @@
 4086	string		SWAPSPACE2	Linux/i386 swap file (new style)
 4086	string		SWAPSPACE2	Linux/i386 swap file (new style)
 >0x400	long		x		%d (4K pages)
 >0x400	long		x		%d (4K pages)
 >0x404	long		x		size %d pages
 >0x404	long		x		size %d pages
+>>4086	string		SWAPSPACE2	
+>>>1052	string		>\0		Label %s
 # ECOFF magic for OSF/1 and Linux (only tested under Linux though)
 # ECOFF magic for OSF/1 and Linux (only tested under Linux though)
 #
 #
 #	from Erik Troan (ewt@redhat.com) examining od dumps, so this
 #	from Erik Troan (ewt@redhat.com) examining od dumps, so this
@@ -82,7 +84,7 @@
 # Linux kernel boot images (i386 arch) (Wolfram Kleff)
 # Linux kernel boot images (i386 arch) (Wolfram Kleff)
 514	string		HdrS		Linux kernel
 514	string		HdrS		Linux kernel
 >510	leshort		0xAA55		x86 boot executable
 >510	leshort		0xAA55		x86 boot executable
->>518	leshort		>=3D0x200
+>>518	leshort		>=0x200
 >>529	byte		0		zImage,
 >>529	byte		0		zImage,
 >>>529	byte		1		bzImage,
 >>>529	byte		1		bzImage,
 >>>(526.s+0x200) string	>\0		version %s,
 >>>(526.s+0x200) string	>\0		version %s,
@@ -185,3 +187,45 @@
 0	string	OOOM			User-Mode-Linux's Copy-On-Write disk image
 0	string	OOOM			User-Mode-Linux's Copy-On-Write disk image
 >4	belong	x			version %d
 >4	belong	x			version %d
 
 
+# SE Linux policy database
+# From: Mike Frysinger <vapier@gentoo.org>
+0	lelong	0xf97cff8c		SE Linux policy
+>16	lelong	x			v%d
+>20	lelong	1			MLS
+>24	lelong	x			%d symbols
+>28	lelong	x			%d ocons
+
+# Linux Logical Volume Manager (LVM) 
+# Emmanuel VARAGNAT <emmanuel.varagnat@guzu.net>
+#
+# System ID, UUID and volume group name are 128 bytes long
+# but they should never be full and initialized with zeros...
+#
+# LVM1
+#
+0x0	string	HM\001		LVM1 (Linux Logical Volume Manager), version 1
+>0x12c	string	>\0		, System ID: %s
+
+0x0	string	HM\002		LVM1 (Linux Logical Volume Manager), version 2
+>0x12c	string	>\0		, System ID: %s
+
+#  LVM2
+#
+# It seems that the label header can be in one the four first sector
+# of the disk... (from _find_labeller in lib/label/label.c of LVM2)
+#
+# 0x200 seems to be the common case
+
+0x218		 string	LVM2\ 001	LVM2 (Linux Logical Volume Manager)
+# read the offset to add to the start of the header, and the header
+# start in 0x200
+>(0x214.l+0x200) string	>\0		, UUID: %s
+
+0x018		 string	LVM2\ 001	LVM2 (Linux Logical Volume Manager)
+>(0x014.l)	 string	>\0		, UUID: %s
+
+0x418		 string	LVM2\ 001	LVM2 (Linux Logical Volume Manager)
+>(0x414.l+0x400) string	>\0		, UUID: %s
+
+0x618		 string	LVM2\ 001	LVM2 (Linux Logical Volume Manager)
+>(0x614.l+0x600) string	>\0		, UUID: %s

+ 12 - 2
magic/Magdir/lisp

@@ -4,8 +4,18 @@
 #
 #
 # various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
 # various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
 
 
-# This is a guess, but a good one.
-0	string	;;			Lisp/Scheme program text
+# updated by Joerg Jenderek
+0	string	;;			
+# windows INF files often begin with semicolon and use CRLF as line end
+# lisp files are mainly created on unix system with LF as line end
+>2	search/2048	!\r		Lisp/Scheme program text
+>2	search/2048	\r		Windows INF file
+0	string	(			
+>1	string	if\ 			Lisp/Scheme program text
+>1	string	setq\ 			Lisp/Scheme program text
+>1	string	defvar\ 		Lisp/Scheme program text
+>1	string	autoload\ 		Lisp/Scheme program text
+>1	string	custom-set-variables	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(			Emacs v18 byte-compiled Lisp data
 0	string	\012(			Emacs v18 byte-compiled Lisp data

+ 0 - 1
magic/Magdir/maple

@@ -32,7 +32,6 @@
 # that is {VERSION major_version miunor_version computer_type version_string}
 # that is {VERSION major_version miunor_version computer_type version_string}
 0	string	{VERSION\ 	Maple worksheet
 0	string	{VERSION\ 	Maple worksheet
 >9	string	>\0	version %.1s.
 >9	string	>\0	version %.1s.
->>10	string
 >>>11	string	>\0	%.1s
 >>>11	string	>\0	%.1s
 
 
 # .mps
 # .mps

+ 1 - 0
magic/Magdir/misctools

@@ -3,6 +3,7 @@
 #
 #
 0	string	%%!!			X-Post-It-Note text
 0	string	%%!!			X-Post-It-Note text
 0	string	BEGIN:VCALENDAR		vCalendar calendar file
 0	string	BEGIN:VCALENDAR		vCalendar calendar file
+0	string	BEGIN:VCARD		vCard visiting card
 
 
 # From: Alex Beregszaszi <alex@fsn.hu>
 # From: Alex Beregszaszi <alex@fsn.hu>
 4	string	gtktalog		GNOME Catalogue (gtktalog)
 4	string	gtktalog		GNOME Catalogue (gtktalog)

+ 91 - 24
magic/Magdir/msdos

@@ -4,7 +4,13 @@
 #
 #
 
 
 # .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)
 # .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)
-0	string/c	@echo\ off	MS-DOS batch file text
+# updated by Joerg Jenderek
+0	string	@			
+>1	string/cB	\ echo\ off	MS-DOS batch file text
+>1	string/cB	echo\ off	MS-DOS batch file text
+>1	string/cB	rem\ 		MS-DOS batch file text
+>1	string/cB	set\ 		MS-DOS batch file text
+
 
 
 # OS/2 batch files are REXX. the second regex is a bit generic, oh well
 # OS/2 batch files are REXX. the second regex is a bit generic, oh well
 # the matched commands seem to be common in REXX and uncommon elsewhere
 # the matched commands seem to be common in REXX and uncommon elsewhere
@@ -39,8 +45,8 @@
 #
 #
 # many of the compressed formats were extraced from IDARC 1.23 source code
 # many of the compressed formats were extraced from IDARC 1.23 source code
 #
 #
-0	string	MZ
->0 string MZ\0\0\0\0\0\0\0\0\0\0PE\0\0 PE executable for MS Windows
+0	string	MZ		MS-DOS executable
+>0 string MZ\0\0\0\0\0\0\0\0\0\0PE\0\0 \b, PE for MS Windows
 >>&18	leshort&0x2000	>0	(DLL)
 >>&18	leshort&0x2000	>0	(DLL)
 >>&88	leshort		0	(unknown subsystem)
 >>&88	leshort		0	(unknown subsystem)
 >>&88	leshort		1	(native)
 >>&88	leshort		1	(native)
@@ -60,7 +66,7 @@
 >>>(&0.l+(4)) string MSCF \b, WinHKI CAB self-extracting archive
 >>>(&0.l+(4)) string MSCF \b, WinHKI CAB self-extracting archive
 
 
 >0x18  leshort >0x3f
 >0x18  leshort >0x3f
->>(0x3c.l) string PE\0\0 PE executable
+>>(0x3c.l) string PE\0\0 PE 
 # hooray, there's a DOS extender using the PE format, with a valid PE
 # hooray, there's a DOS extender using the PE format, with a valid PE
 # executable inside (which just prints a message and exits if run in win)
 # executable inside (which just prints a message and exits if run in win)
 >>>(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender
 >>>(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender
@@ -108,7 +114,7 @@
 >>>>&(0x3c.l+0xf8)	search/0x100	SharedD \b, Microsoft Installer self-extracting archive
 >>>>&(0x3c.l+0xf8)	search/0x100	SharedD \b, Microsoft Installer self-extracting archive
 >>>>0x30		string		Inno \b, InnoSetup self-extracting archive
 >>>>0x30		string		Inno \b, InnoSetup self-extracting archive
 
 
->>(0x3c.l)		string		NE NE executable
+>>(0x3c.l)		string		NE \b, NE
 >>>(0x3c.l+0x36)	byte		0 (unknown OS)
 >>>(0x3c.l+0x36)	byte		0 (unknown OS)
 >>>(0x3c.l+0x36)	byte		1 for OS/2 1.x
 >>>(0x3c.l+0x36)	byte		1 for OS/2 1.x
 >>>(0x3c.l+0x36)	byte		2 for MS Windows 3.x
 >>>(0x3c.l+0x36)	byte		2 for MS Windows 3.x
@@ -120,7 +126,7 @@
 >>>&(&0x24.s-1)		string		ARJSFX \b, ARJ self-extracting archive
 >>>&(&0x24.s-1)		string		ARJSFX \b, ARJ self-extracting archive
 >>>(0x3c.l+0x70)	search/0x80	WinZip(R)\ Self-Extractor \b, ZIP self-extracting archive (WinZip)
 >>>(0x3c.l+0x70)	search/0x80	WinZip(R)\ Self-Extractor \b, ZIP self-extracting archive (WinZip)
 
 
->>(0x3c.l)		string		LX\0\0 LX executable
+>>(0x3c.l)		string		LX\0\0 \b, LX
 >>>(0x3c.l+0x0a)	leshort		<1 (unknown OS)
 >>>(0x3c.l+0x0a)	leshort		<1 (unknown OS)
 >>>(0x3c.l+0x0a)	leshort		1 for OS/2
 >>>(0x3c.l+0x0a)	leshort		1 for OS/2
 >>>(0x3c.l+0x0a)	leshort		2 for MS Windows
 >>>(0x3c.l+0x0a)	leshort		2 for MS Windows
@@ -138,9 +144,9 @@
 >>>&(&0x54.l-3)		string		arjsfx \b, ARJ self-extracting archive
 >>>&(&0x54.l-3)		string		arjsfx \b, ARJ self-extracting archive
 
 
 # MS Windows system file, supposedly a collection of LE executables
 # MS Windows system file, supposedly a collection of LE executables
->>(0x3c.l)		string		W3 W3 executable for MS Windows
+>>(0x3c.l)		string		W3 \b, W3 for MS Windows
 
 
->>(0x3c.l)		string		LE\0\0 LE executable
+>>(0x3c.l)		string		LE\0\0 \b, LE executable
 >>>(0x3c.l+0x0a)	leshort		1
 >>>(0x3c.l+0x0a)	leshort		1
 # some DOS extenders use LE files with OS/2 header
 # some DOS extenders use LE files with OS/2 header
 >>>>0x240		search/0x100	DOS/4G for MS-DOS, DOS4GW DOS extender
 >>>>0x240		search/0x100	DOS/4G for MS-DOS, DOS4GW DOS extender
@@ -158,7 +164,7 @@
 #>>>>(0x3c.l+0x1c)	lelong		>0x10000 for OS/2
 #>>>>(0x3c.l+0x1c)	lelong		>0x10000 for OS/2
 # fails with DOS-Extenders.
 # fails with DOS-Extenders.
 >>>(0x3c.l+0x0a)	leshort		2 for MS Windows
 >>>(0x3c.l+0x0a)	leshort		2 for MS Windows
->>>(0x3c.l+0x0a)	leshort		3 for MS-DOS
+>>>(0x3c.l+0x0a)	leshort		3 for DOS
 >>>(0x3c.l+0x0a)	leshort		4 for MS Windows (VxD)
 >>>(0x3c.l+0x0a)	leshort		4 for MS Windows (VxD)
 >>>(&0x7c.l+0x26)	string		UPX \b, UPX compressed
 >>>(&0x7c.l+0x26)	string		UPX \b, UPX compressed
 >>>&(&0x54.l-3)		string		UNACE \b, ACE self-extracting archive
 >>>&(&0x54.l-3)		string		UNACE \b, ACE self-extracting archive
@@ -166,25 +172,25 @@
 # looks like ASCII, probably some embedded copyright message.
 # looks like ASCII, probably some embedded copyright message.
 # and definitely not NE/LE/LX/PE
 # and definitely not NE/LE/LX/PE
 >>0x3c		lelong	>0x20000000
 >>0x3c		lelong	>0x20000000
->>>(4.s*512)	leshort !0x014c MZ executable for MS-DOS
+>>>(4.s*512)	leshort !0x014c \b, MZ for MS-DOS
 # header data too small for extended executable
 # header data too small for extended executable
 >2		long	!0
 >2		long	!0
 >>0x18		leshort	<0x40
 >>0x18		leshort	<0x40
 >>>(4.s*512)	leshort !0x014c
 >>>(4.s*512)	leshort !0x014c
 
 
 >>>>&(2.s-514)	string	!LE
 >>>>&(2.s-514)	string	!LE
->>>>>&-2	string	!BW MZ executable for MS-DOS
->>>>&(2.s-514)	string	LE LE executable
+>>>>>&-2	string	!BW \b, MZ for MS-DOS
+>>>>&(2.s-514)	string	LE \b, LE
 >>>>>0x240	search/0x100	DOS/4G for MS-DOS, DOS4GW DOS extender
 >>>>>0x240	search/0x100	DOS/4G for MS-DOS, DOS4GW DOS extender
 # educated guess since indirection is still not capable enough for complex offset
 # educated guess since indirection is still not capable enough for complex offset
 # calculations (next embedded executable would be at &(&2*512+&0-2)
 # calculations (next embedded executable would be at &(&2*512+&0-2)
 # I suspect there are only LE executables in these multi-exe files
 # I suspect there are only LE executables in these multi-exe files
 >>>>&(2.s-514)	string	BW
 >>>>&(2.s-514)	string	BW
->>>>>0x240	search/0x100	DOS/4G LE executable for MS-DOS, DOS4GW DOS extender (embedded)
->>>>>0x240	search/0x100	!DOS/4G BW executable collection for MS-DOS
+>>>>>0x240	search/0x100	DOS/4G ,\b LE for MS-DOS, DOS4GW DOS extender (embedded)
+>>>>>0x240	search/0x100	!DOS/4G ,\b BW collection for MS-DOS
 
 
 # This sequence skips to the first COFF segment, usually .text
 # This sequence skips to the first COFF segment, usually .text
->(4.s*512)	leshort		0x014c COFF executable
+>(4.s*512)	leshort		0x014c \b, COFF
 >>(8.s*16)	string		go32stub for MS-DOS, DJGPP go32 DOS extender
 >>(8.s*16)	string		go32stub for MS-DOS, DJGPP go32 DOS extender
 >>(8.s*16)	string		emx
 >>(8.s*16)	string		emx
 >>>&1		string		x for DOS, Win or OS/2, emx %s
 >>>&1		string		x for DOS, Win or OS/2, emx %s
@@ -255,18 +261,76 @@
 # Uncommenting only the first two lines will cover about 2/3 of COM files,
 # Uncommenting only the first two lines will cover about 2/3 of COM files,
 # but it isn't feasible to match all COM files since there must be at least
 # but it isn't feasible to match all COM files since there must be at least
 # two dozen different one-byte "magics".
 # two dozen different one-byte "magics".
-0	byte		0xe9		MS-DOS executable (COM)
+0	byte		0xe9		DOS executable (COM)
+>0x1FE	leshort		0xAA55		\b, boot code
 >6	string		SFX\ of\ LHarc	(%s)
 >6	string		SFX\ of\ LHarc	(%s)
-0	byte		0x8c		MS-DOS executable (COM)
+0	belong	0xffffffff		DOS executable (device driver)
+#CMD640X2.SYS
+>10	string	>\x23			
+>>10	string	!\x2e			
+>>>17	string	<\x5B			
+>>>>10	string	x			\b, name: %.8s
+#UDMA.SYS KEYB.SYS CMD640X2.SYS
+>10	string	<\x41			
+>>12	string	>\x40			
+>>>10	string	!$			
+>>>>12	string	x			\b, name: %.8s
+#BTCDROM.SYS ASPICD.SYS
+>22	string	>\x40			
+>>22	string	<\x5B			
+>>>23	string	<\x5B			
+>>>>22	string	x			\b, name: %.8s
+#ATAPICD.SYS
+>76	string	\0			
+>>77	string	>\x40			
+>>>77	string	<\x5B			
+>>>>77	string	x			\b, name: %.8s
+0	byte		0x8c		DOS executable (COM)
 # 0xeb conflicts with "sequent" magic
 # 0xeb conflicts with "sequent" magic
-0	byte		0xeb		MS-DOS executable (COM)
+0	byte		0xeb		DOS executable (COM)
+>0x1FE	leshort		0xAA55		\b, boot code
+>85	string		UPX		\b, UPX compressed
 >4	string		\ $ARX		\b, ARX self-extracting archive
 >4	string		\ $ARX		\b, ARX self-extracting archive
 >4	string		\ $LHarc	\b, LHarc self-extracting archive
 >4	string		\ $LHarc	\b, LHarc self-extracting archive
 >0x20e	string		SFX\ by\ LARC	\b, LARC self-extracting archive
 >0x20e	string		SFX\ by\ LARC	\b, LARC self-extracting archive
-0	byte		0xb8		COM executable for MS-DOS
+0	byte		0xb8		COM executable
+# modified by Joerg Jenderek
+>1	lelong          !0x21cd4cff	for DOS
+# http://syslinux.zytor.com/comboot.php
+# (32-bit COMBOOT) programs *.C32 contain 32-bit code and run in flat-memory 32-bit protected mode
+# start with assembler instructions mov eax,21cd4cffh
+>1	lelong          0x21cd4cff	(32-bit COMBOOT)
+0	string	\x81\xfc		
+>4	string	\x77\x02\xcd\x20\xb9	
+>>36	string	UPX! 			FREE-DOS executable (COM), UPX compressed
+252	string Must\ have\ DOS\ version	DR-DOS executable (COM)
+# GRR search is not working
+#2	search/28	\xcd\x21	COM executable for MS-DOS
+#WHICHFAT.cOM
+2	string	\xcd\x21		COM executable for DOS
+#DELTREE.cOM DELTREE2.cOM
+4	string	\xcd\x21		COM executable for DOS
+#IFMEMDSK.cOM ASSIGN.cOM COMP.cOM
+5	string	\xcd\x21		COM executable for DOS
+#DELTMP.COm HASFAT32.cOM
+7	string	\xcd\x21		
+>0	byte	!0xb8			COM executable for DOS
+#COMP.cOM MORE.COm
+10	string	\xcd\x21		
+>5	string	!\xcd\x21		COM executable for DOS
+#comecho.com
+13	string	\xcd\x21		COM executable for DOS
+#HELP.COm EDIT.coM
+18	string	\xcd\x21		COM executable for MS-DOS
+#NWRPLTRM.COm
+23	string	\xcd\x21		COM executable for MS-DOS
+#LOADFIX.cOm LOADFIX.cOm
+30	string	\xcd\x21		COM executable for MS-DOS
+#syslinux.com 3.11
+70	string	\xcd\x21		COM executable for DOS
 # many compressed/converted COMs start with a copy loop instead of a jump
 # many compressed/converted COMs start with a copy loop instead of a jump
 0x6	search/0xa	\xfc\x57\xf3\xa5\xc3	COM executable for MS-DOS
 0x6	search/0xa	\xfc\x57\xf3\xa5\xc3	COM executable for MS-DOS
-0x6	search/0xa	\xfc\x57\xf3\xa4\xc3	COM executable for MS-DOS
+0x6	search/0xa	\xfc\x57\xf3\xa4\xc3	COM executable for DOS
 >0x18	search/0x10	\x50\xa4\xff\xd5\x73	\b, aPack compressed
 >0x18	search/0x10	\x50\xa4\xff\xd5\x73	\b, aPack compressed
 0x3c	string		W\ Collis\0\0		COM executable for MS-DOS, Compack compressed
 0x3c	string		W\ Collis\0\0		COM executable for MS-DOS, Compack compressed
 # FIXME: missing diet .com compression
 # FIXME: missing diet .com compression
@@ -278,9 +342,10 @@
 
 
 #
 #
 # Windows Registry files.
 # Windows Registry files.
-#
-0	string		regf		Windows NT registry file
-0	string		CREG		Windows 95 registry file
+# updated by Joerg Jenderek
+0	string		regf		Windows NT/XP registry file
+0	string		CREG		Windows 95/98/ME registry file
+0	string		SHCC3		Windows 3.1 registry file
 
 
 
 
 # AAF files:
 # AAF files:
@@ -340,7 +405,9 @@
 >15	string	1.0\ --\ HyperTerminal\ data\ file	MS-windows Hyperterminal
 >15	string	1.0\ --\ HyperTerminal\ data\ file	MS-windows Hyperterminal
 
 
 # Windows Metafont .WMF
 # Windows Metafont .WMF
-0	string	\327\315\306\232\000\000\000\000\000\000	ms-windows metafont .wmf
+0       string  \327\315\306\232        ms-windows metafont .wmf
+0       string  \002\000\011\000        ms-windows metafont .wmf
+0       string  \001\000\011\000        ms-windows metafont .wmf
 
 
 #tz3 files whatever that is (MS Works files)
 #tz3 files whatever that is (MS Works files)
 0	string	\003\001\001\004\070\001\000\000	tz3 ms-works file
 0	string	\003\001\001\004\070\001\000\000	tz3 ms-works file

+ 2 - 2
magic/Magdir/ncr

@@ -34,14 +34,14 @@
 0	beshort		000640	Tower32/800 68020
 0	beshort		000640	Tower32/800 68020
 >18	   beshort		&020000	w/68881 object
 >18	   beshort		&020000	w/68881 object
 >18	   beshort		&040000	compatible object
 >18	   beshort		&040000	compatible object
->18	   beshort		&~060000	object
+>18	   beshort		&060000	object
 >20	   beshort		0407	executable
 >20	   beshort		0407	executable
 >20	   beshort		0413	pure executable
 >20	   beshort		0413	pure executable
 >12	   belong		>0	not stripped
 >12	   belong		>0	not stripped
 >22	   beshort		>0	- version %ld
 >22	   beshort		>0	- version %ld
 0	beshort		000645	Tower32/800 68010
 0	beshort		000645	Tower32/800 68010
 >18	   beshort		&040000	compatible object
 >18	   beshort		&040000	compatible object
->18	   beshort		&~060000 object
+>18	   beshort		&060000 object
 >20	   beshort		0407	executable
 >20	   beshort		0407	executable
 >20	   beshort		0413	pure executable
 >20	   beshort		0413	pure executable
 >12	   belong		>0	not stripped
 >12	   belong		>0	not stripped

+ 3 - 3
magic/Magdir/psion

@@ -8,7 +8,7 @@
 >4	lelong		0x1000003A	printer driver
 >4	lelong		0x1000003A	printer driver
 >4	lelong		0x1000003B	clipboard
 >4	lelong		0x1000003B	clipboard
 >4	lelong		0x10000042	multi-bitmap image
 >4	lelong		0x10000042	multi-bitmap image
->4	lelong		0x1000006A	application infomation file
+>4	lelong		0x1000006A	application information file
 >4	lelong		0x1000006D
 >4	lelong		0x1000006D
 >>8	lelong		0x1000007D	sketch image
 >>8	lelong		0x1000007D	sketch image
 >>8	lelong		0x1000007E	voice note
 >>8	lelong		0x1000007E	voice note
@@ -37,7 +37,7 @@
 >4	lelong		0x100000AD	physical device driver
 >4	lelong		0x100000AD	physical device driver
 >4	lelong		0x100000E5	file transfer protocol
 >4	lelong		0x100000E5	file transfer protocol
 >4	lelong		0x100000E5	file transfer protocol
 >4	lelong		0x100000E5	file transfer protocol
->4	lelong		0x10000140	printer defintion
->4	lelong		0x10000141	printer defintion
+>4	lelong		0x10000140	printer definition
+>4	lelong		0x10000141	printer definition
 
 
 0	lelong		0x1000007A	Psion Series 5 executable
 0	lelong		0x1000007A	Psion Series 5 executable

+ 4 - 0
magic/Magdir/python

@@ -12,3 +12,7 @@
 0	belong		0x2aeb0d0a	python 2.1 byte-compiled
 0	belong		0x2aeb0d0a	python 2.1 byte-compiled
 0	belong		0x2ded0d0a	python 2.2 byte-compiled
 0	belong		0x2ded0d0a	python 2.2 byte-compiled
 0	belong		0x3bf20d0a	python 2.3 byte-compiled
 0	belong		0x3bf20d0a	python 2.3 byte-compiled
+0	belong		0x6df20d0a	python 2.4 byte-compiled
+
+0	string/b  #!\ /usr/bin/python	python script text executable
+

+ 7 - 1
magic/Magdir/wordprocessors

@@ -106,6 +106,12 @@
 # Hangul (Korean) Word Processor File
 # Hangul (Korean) Word Processor File
 0	string	HWP\ Document\ File	Hangul (Korean) Word Processor File
 0	string	HWP\ Document\ File	Hangul (Korean) Word Processor File
 
 
-# CosmicBook, from Benoît Rouits
+# CosmicBook, from Benoît Rouits
 0       string  CSBK    Ted Neslson's CosmicBook hypertext file
 0       string  CSBK    Ted Neslson's CosmicBook hypertext file
 
 
+2       string  EYWR    AmigaWriter file
+
+# chi:  file(1) magic for ChiWriter files
+0       string          \\1cw\          ChiWriter file
+>5      string          >\0             version %s
+0       string          \\1cw           ChiWriter file

+ 3 - 2
magic/Makefile.am

@@ -44,16 +44,17 @@ Magdir/archive \
 Magdir/asterix \
 Magdir/asterix \
 Magdir/att3b \
 Magdir/att3b \
 Magdir/audio \
 Magdir/audio \
-Magdir/bFLT \
+Magdir/basis \
+Magdir/bflt \
 Magdir/blender \
 Magdir/blender \
 Magdir/blit \
 Magdir/blit \
 Magdir/bout \
 Magdir/bout \
 Magdir/bsdi \
 Magdir/bsdi \
+Magdir/btsnoop \
 Magdir/cad \
 Magdir/cad \
 Magdir/c-lang \
 Magdir/c-lang \
 Magdir/c64 \
 Magdir/c64 \
 Magdir/cddb \
 Magdir/cddb \
-Magdir/chi \
 Magdir/chord \
 Magdir/chord \
 Magdir/cisco \
 Magdir/cisco \
 Magdir/citrus \
 Magdir/citrus \

+ 4 - 3
magic/Makefile.in

@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
 # @configure_input@
 # @configure_input@
 
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -184,16 +184,17 @@ Magdir/archive \
 Magdir/asterix \
 Magdir/asterix \
 Magdir/att3b \
 Magdir/att3b \
 Magdir/audio \
 Magdir/audio \
-Magdir/bFLT \
+Magdir/basis \
+Magdir/bflt \
 Magdir/blender \
 Magdir/blender \
 Magdir/blit \
 Magdir/blit \
 Magdir/bout \
 Magdir/bout \
 Magdir/bsdi \
 Magdir/bsdi \
+Magdir/btsnoop \
 Magdir/cad \
 Magdir/cad \
 Magdir/c-lang \
 Magdir/c-lang \
 Magdir/c64 \
 Magdir/c64 \
 Magdir/cddb \
 Magdir/cddb \
-Magdir/chi \
 Magdir/chord \
 Magdir/chord \
 Magdir/cisco \
 Magdir/cisco \
 Magdir/citrus \
 Magdir/citrus \

+ 6 - 1
magic/magic.mime

@@ -269,7 +269,8 @@
 0       string          #!\ /bin/awk            application/x-awk
 0       string          #!\ /bin/awk            application/x-awk
 0       string          #!/usr/bin/awk          application/x-awk
 0       string          #!/usr/bin/awk          application/x-awk
 0       string          #!\ /usr/bin/awk        application/x-awk
 0       string          #!\ /usr/bin/awk        application/x-awk
-0       string          BEGIN                   application/x-awk
+# update to distinguish from *.vcf files by Joerg Jenderek: joerg dot jenderek at web dot de
+0	regex		BEGIN[[:space:]]*[{]	application/x-awk
 
 
 # For Larry Wall's perl language.  The ``eval'' line recognizes an
 # For Larry Wall's perl language.  The ``eval'' line recognizes an
 # outrageously clever hack for USG systems.
 # outrageously clever hack for USG systems.
@@ -919,3 +920,7 @@
 # EET archive
 # EET archive
 # From: Tilman Sauerbeck <tilman@code-monkey.de>
 # From: Tilman Sauerbeck <tilman@code-monkey.de>
 0	belong	0x1ee7ff00	application/x-eet
 0	belong	0x1ee7ff00	application/x-eet
+
+# From: Denis Knauf, via gentoo.
+0	string	fLaC		audio/x-flac
+0	string	CWS		application/x-shockwave-flash

+ 2 - 2
magic/magic2mime

@@ -1,6 +1,6 @@
-#! /usr/local/bin/perl
+#! /usr/bin/env perl
 # -*- PERL -*-
 # -*- PERL -*-
-# $Id: magic2mime,v 1.2 2003/03/23 04:17:27 christos Exp $
+# $Id: magic2mime,v 1.3 2006/03/02 22:10:26 christos Exp $
 # Copyright (c) 1996, 1997 vax@linkdead.paranoia.com (VaX#n8)
 # Copyright (c) 1996, 1997 vax@linkdead.paranoia.com (VaX#n8)
 #
 #
 # Usage: echo 'your-file-output-here' | file_to_ctype.pl
 # Usage: echo 'your-file-output-here' | file_to_ctype.pl

+ 1 - 1
python/Makefile.in

@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
 # @configure_input@
 # @configure_input@
 
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,

+ 1 - 1
src/Makefile.am

@@ -10,7 +10,7 @@ AM_CPPFLAGS = -DMAGIC='"$(MAGIC)"'
 libmagic_la_SOURCES = magic.c apprentice.c softmagic.c ascmagic.c \
 libmagic_la_SOURCES = magic.c apprentice.c softmagic.c ascmagic.c \
 	compress.c is_tar.c readelf.c print.c fsmagic.c \
 	compress.c is_tar.c readelf.c print.c fsmagic.c \
 	funcs.c file.h names.h patchlevel.h readelf.h tar.h apptype.c
 	funcs.c file.h names.h patchlevel.h readelf.h tar.h apptype.c
-libmagic_la_LDFLAGS = -version-info 1:0:0
+libmagic_la_LDFLAGS = -no-undefined -version-info 1:0:0
 
 
 file_SOURCES = file.c
 file_SOURCES = file.c
 file_LDADD = libmagic.la
 file_LDADD = libmagic.la

+ 2 - 4
src/Makefile.in

@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
 # @configure_input@
 # @configure_input@
 
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -16,8 +16,6 @@
 
 
 
 
 
 
-SOURCES = $(libmagic_la_SOURCES) $(file_SOURCES)
-
 srcdir = @srcdir@
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
 top_srcdir = @top_srcdir@
 VPATH = @srcdir@
 VPATH = @srcdir@
@@ -203,7 +201,7 @@ libmagic_la_SOURCES = magic.c apprentice.c softmagic.c ascmagic.c \
 	compress.c is_tar.c readelf.c print.c fsmagic.c \
 	compress.c is_tar.c readelf.c print.c fsmagic.c \
 	funcs.c file.h names.h patchlevel.h readelf.h tar.h apptype.c
 	funcs.c file.h names.h patchlevel.h readelf.h tar.h apptype.c
 
 
-libmagic_la_LDFLAGS = -version-info 1:0:0
+libmagic_la_LDFLAGS = -no-undefined -version-info 1:0:0
 file_SOURCES = file.c
 file_SOURCES = file.c
 file_LDADD = libmagic.la
 file_LDADD = libmagic.la
 all: all-am
 all: all-am

+ 212 - 50
src/apprentice.c

@@ -45,7 +45,7 @@
 #endif
 #endif
 
 
 #ifndef	lint
 #ifndef	lint
-FILE_RCSID("@(#)$Id: apprentice.c,v 1.84 2005/03/25 18:03:18 christos Exp $")
+FILE_RCSID("@(#)$Id: apprentice.c,v 1.87 2006/03/02 22:08:57 christos Exp $")
 #endif	/* lint */
 #endif	/* lint */
 
 
 #define	EATAB {while (isascii((unsigned char) *l) && \
 #define	EATAB {while (isascii((unsigned char) *l) && \
@@ -80,12 +80,22 @@ FILE_RCSID("@(#)$Id: apprentice.c,v 1.84 2005/03/25 18:03:18 christos Exp $")
 #define IS_STRING(t) (IS_PLAINSTRING(t) || (t) == FILE_REGEX || \
 #define IS_STRING(t) (IS_PLAINSTRING(t) || (t) == FILE_REGEX || \
     (t) == FILE_SEARCH)
     (t) == FILE_SEARCH)
 
 
-private int getvalue(struct magic_set *ms, struct magic *, char **);
+struct magic_entry {
+	struct magic *mp;	
+	uint32_t cont_count;
+	uint32_t max_count;
+};
+
+private int getvalue(struct magic_set *ms, struct magic *, const char **);
 private int hextoint(int);
 private int hextoint(int);
-private char *getstr(struct magic_set *, char *, char *, int, int *);
-private int parse(struct magic_set *, struct magic **, uint32_t *, char *, int);
-private void eatsize(char **);
+private const char *getstr(struct magic_set *, const char *, char *, int,
+    int *);
+private int parse(struct magic_set *, struct magic_entry **, uint32_t *,
+    const char *, int);
+private void eatsize(const char **);
 private int apprentice_1(struct magic_set *, const char *, int, struct mlist *);
 private int apprentice_1(struct magic_set *, const char *, int, struct mlist *);
+private size_t apprentice_magic_strength(const struct magic *);
+private int apprentice_sort(const void *, const void *);
 private int apprentice_file(struct magic_set *, struct magic **, uint32_t *,
 private int apprentice_file(struct magic_set *, struct magic **, uint32_t *,
     const char *, int);
     const char *, int);
 private void byteswap(struct magic *, uint32_t);
 private void byteswap(struct magic *, uint32_t);
@@ -102,6 +112,7 @@ private int check_format(struct magic_set *, struct magic *);
 private size_t maxmagic = 0;
 private size_t maxmagic = 0;
 private size_t magicsize = sizeof(struct magic);
 private size_t magicsize = sizeof(struct magic);
 
 
+
 #ifdef COMPILE_ONLY
 #ifdef COMPILE_ONLY
 
 
 int main(int, char *[]);
 int main(int, char *[]);
@@ -164,6 +175,7 @@ apprentice_1(struct magic_set *ms, const char *fn, int action,
 		free(magic);
 		free(magic);
 		return rv;
 		return rv;
 	}
 	}
+
 #ifndef COMPILE_ONLY
 #ifndef COMPILE_ONLY
 	if ((rv = apprentice_map(ms, &magic, &nmagic, fn)) == -1) {
 	if ((rv = apprentice_map(ms, &magic, &nmagic, fn)) == -1) {
 		if (ms->flags & MAGIC_CHECK)
 		if (ms->flags & MAGIC_CHECK)
@@ -286,6 +298,64 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
 	return mlist;
 	return mlist;
 }
 }
 
 
+private size_t
+apprentice_magic_strength(const struct magic *m)
+{
+	switch (m->type) {
+	case FILE_BYTE:
+		return 1;
+
+	case FILE_SHORT:
+	case FILE_LESHORT:
+	case FILE_BESHORT:
+		return 2;
+
+	case FILE_LONG:
+	case FILE_LELONG:
+	case FILE_BELONG:
+	case FILE_MELONG:
+		return 4;
+
+	case FILE_PSTRING:
+	case FILE_STRING:
+	case FILE_REGEX:
+	case FILE_BESTRING16:
+	case FILE_LESTRING16:
+	case FILE_SEARCH:
+		return m->vallen;
+
+	case FILE_DATE:
+	case FILE_LEDATE:
+	case FILE_BEDATE:
+	case FILE_MEDATE:
+		return 4;
+
+	case FILE_LDATE:
+	case FILE_LELDATE:
+	case FILE_BELDATE:
+	case FILE_MELDATE:
+		return 8;
+
+	default:
+		return 0;
+	}
+}
+
+private int
+apprentice_sort(const void *a, const void *b)
+{
+	const struct magic_entry *ma = a;
+	const struct magic_entry *mb = b;
+	size_t sa = apprentice_magic_strength(ma->mp);
+	size_t sb = apprentice_magic_strength(mb->mp);
+	if (sa == sb)
+		return 0;
+	else if (sa > sb)
+		return -1;
+	else
+		return 1;
+}
+
 /*
 /*
  * parse from a file
  * parse from a file
  * const char *fn: name of magic file
  * const char *fn: name of magic file
@@ -299,6 +369,8 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
 	FILE *f;
 	FILE *f;
 	char line[BUFSIZ+1];
 	char line[BUFSIZ+1];
 	int errs = 0;
 	int errs = 0;
+	struct magic_entry *marray;
+	uint32_t marraycount, i, mentrycount;
 
 
 	f = fopen(ms->file = fn, "r");
 	f = fopen(ms->file = fn, "r");
 	if (f == NULL) {
 	if (f == NULL) {
@@ -309,12 +381,12 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
 	}
 	}
 
 
         maxmagic = MAXMAGIS;
         maxmagic = MAXMAGIS;
-	*magicp = (struct magic *) calloc(maxmagic, sizeof(struct magic));
-	if (*magicp == NULL) {
+	if ((marray = malloc(maxmagic * sizeof(*marray))) == NULL) {
 		(void)fclose(f);
 		(void)fclose(f);
 		file_oomem(ms);
 		file_oomem(ms);
 		return -1;
 		return -1;
 	}
 	}
+	marraycount = 0;
 
 
 	/* print silly verbose header for USG compat. */
 	/* print silly verbose header for USG compat. */
 	if (action == FILE_CHECK)
 	if (action == FILE_CHECK)
@@ -323,23 +395,53 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
 	/* parse it */
 	/* parse it */
 	for (ms->line = 1; fgets(line, BUFSIZ, f) != NULL; ms->line++) {
 	for (ms->line = 1; fgets(line, BUFSIZ, f) != NULL; ms->line++) {
 		size_t len;
 		size_t len;
-		if (line[0]=='#')	/* comment, do not parse */
+		if (line[0] == '#')	/* comment, do not parse */
 			continue;
 			continue;
 		len = strlen(line);
 		len = strlen(line);
 		if (len < 2) /* null line, garbage, etc */
 		if (len < 2) /* null line, garbage, etc */
 			continue;
 			continue;
-		line[len - 1] = '\0'; /* delete newline */
-		if (parse(ms, magicp, nmagicp, line, action) != 0)
-			errs = 1;
+		if (line[len - 1] == '\n')
+			line[len - 1] = '\0'; /* delete newline */
+		if (parse(ms, &marray, &marraycount, line, action) != 0)
+			errs++;
 	}
 	}
 
 
 	(void)fclose(f);
 	(void)fclose(f);
+	if (errs)
+		goto out;
+
+#ifndef NOORDER
+	qsort(marray, marraycount, sizeof(*marray), apprentice_sort);
+#endif
+
+	for (i = 0, mentrycount = 0; i < marraycount; i++)
+		mentrycount += marray[i].cont_count;
+
+	if ((*magicp = malloc(sizeof(**magicp) * mentrycount)) == NULL) {
+		file_oomem(ms);
+		errs++;
+		goto out;
+	}
+
+	mentrycount = 0;
+	for (i = 0; i < marraycount; i++) {
+		(void)memcpy(*magicp + mentrycount, marray[i].mp,
+		    marray[i].cont_count * sizeof(**magicp));
+		mentrycount += marray[i].cont_count;
+	}
+out:
+	for (i = 0; i < marraycount; i++)
+		free(marray[i].mp);
+	free(marray);
 	if (errs) {
 	if (errs) {
-		free(*magicp);
 		*magicp = NULL;
 		*magicp = NULL;
 		*nmagicp = 0;
 		*nmagicp = 0;
+		return errs;
+	} else {
+		*nmagicp = mentrycount;
+		return 0;
 	}
 	}
-	return errs;
+
 }
 }
 
 
 /*
 /*
@@ -366,12 +468,15 @@ file_signextend(struct magic_set *ms, struct magic *m, uint32_t v)
 		case FILE_DATE:
 		case FILE_DATE:
 		case FILE_BEDATE:
 		case FILE_BEDATE:
 		case FILE_LEDATE:
 		case FILE_LEDATE:
+		case FILE_MEDATE:
 		case FILE_LDATE:
 		case FILE_LDATE:
 		case FILE_BELDATE:
 		case FILE_BELDATE:
 		case FILE_LELDATE:
 		case FILE_LELDATE:
+		case FILE_MELDATE:
 		case FILE_LONG:
 		case FILE_LONG:
 		case FILE_BELONG:
 		case FILE_BELONG:
 		case FILE_LELONG:
 		case FILE_LELONG:
+		case FILE_MELONG:
 			v = (int32_t) v;
 			v = (int32_t) v;
 			break;
 			break;
 		case FILE_STRING:
 		case FILE_STRING:
@@ -394,36 +499,74 @@ file_signextend(struct magic_set *ms, struct magic *m, uint32_t 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
  */
  */
 private int
 private int
-parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
-    int action)
+parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp, 
+    const char *line, int action)
 {
 {
 	int i = 0;
 	int i = 0;
+	struct magic_entry *me;
 	struct magic *m;
 	struct magic *m;
+	const char *l = line;
 	char *t;
 	char *t;
 	private const char *fops = FILE_OPS;
 	private const char *fops = FILE_OPS;
 	uint32_t val;
 	uint32_t val;
+	uint32_t cont_level, cont_count;
 
 
-#define ALLOC_INCR	200
-	if (*nmagicp + 1 >= maxmagic){
-		maxmagic += ALLOC_INCR;
-		if ((m = (struct magic *) realloc(*magicp,
-		    sizeof(struct magic) * maxmagic)) == NULL) {
-			file_oomem(ms);
-			if (*magicp)
-				free(*magicp);
-			return -1;
-		}
-		*magicp = m;
-		memset(&(*magicp)[*nmagicp], 0, sizeof(struct magic)
-		    * ALLOC_INCR);
-	}
-	m = &(*magicp)[*nmagicp];
-	m->flag = 0;
-	m->cont_level = 0;
+	cont_level = 0;
 
 
 	while (*l == '>') {
 	while (*l == '>') {
 		++l;		/* step over */
 		++l;		/* step over */
-		m->cont_level++; 
+		cont_level++; 
+	}
+
+#define ALLOC_CHUNK	(size_t)10
+#define ALLOC_INCR	(size_t)200
+
+	if (cont_level != 0) {
+		if (*nmentryp == 0) {
+			file_error(ms, 0, "No current entry for continuation");
+			return -1;
+		}
+		me = &(*mentryp)[*nmentryp - 1];
+		if (me->cont_count == me->max_count) {
+			struct magic *nm;
+			size_t cnt = me->max_count + ALLOC_CHUNK;
+			if ((nm = realloc(me->mp, sizeof(*nm) * cnt)) == NULL) {
+				file_oomem(ms);
+				return -1;
+			}
+			me->mp = m = nm;
+			me->max_count = cnt;
+		}
+		m = &me->mp[me->cont_count++];
+		memset(m, 0, sizeof(*m));
+		m->cont_level = cont_level;
+	} else {
+		if (*nmentryp == maxmagic) {
+			struct magic_entry *mp;
+
+			maxmagic += ALLOC_INCR;
+			if ((mp = realloc(*mentryp, sizeof(*mp) * maxmagic)) ==
+			    NULL) {
+				file_oomem(ms);
+				return -1;
+			}
+			(void)memset(&mp[*nmentryp], 0, sizeof(*mp) *
+			    ALLOC_INCR);
+			*mentryp = mp;
+		}
+		me = &(*mentryp)[*nmentryp];
+		if (me->mp == NULL) {
+			if ((m = malloc(sizeof(*m) * ALLOC_CHUNK)) == NULL) {
+				file_oomem(ms);
+				return -1;
+			}
+			me->mp = m;
+			me->max_count = ALLOC_CHUNK;
+		} else
+			m = me->mp;
+		memset(m, 0, sizeof(*m));
+		m->cont_level = 0;
+		me->cont_count = 1;
 	}
 	}
 
 
 	if (m->cont_level != 0 && *l == '&') {
 	if (m->cont_level != 0 && *l == '&') {
@@ -463,6 +606,9 @@ parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
 			case 'L':
 			case 'L':
 				m->in_type = FILE_BELONG;
 				m->in_type = FILE_BELONG;
 				break;
 				break;
+			case 'm':
+				m->in_type = FILE_MELONG;
+				break;
 			case 'h':
 			case 'h':
 			case 's':
 			case 's':
 				m->in_type = FILE_LESHORT;
 				m->in_type = FILE_LESHORT;
@@ -528,16 +674,15 @@ parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
 			m->in_op |= FILE_OPINDIRECT;
 			m->in_op |= FILE_OPINDIRECT;
 			l++;
 			l++;
 		}
 		}
-		if (isdigit((unsigned char)*l) || *l == '-') 
+		if (isdigit((unsigned char)*l) || *l == '-') {
 			m->in_offset = (int32_t)strtol(l, &t, 0);
 			m->in_offset = (int32_t)strtol(l, &t, 0);
-		else
-			t = l;
-		if (*t++ != ')' ||
-		    ((m->in_op & FILE_OPINDIRECT) && *t++ != ')')) 
+			l = t;
+		}
+		if (*l++ != ')' || 
+		    ((m->in_op & FILE_OPINDIRECT) && *l++ != ')'))
 			if (ms->flags & MAGIC_CHECK)
 			if (ms->flags & MAGIC_CHECK)
 				file_magwarn(ms,
 				file_magwarn(ms,
 				    "missing ')' in indirect offset");
 				    "missing ')' in indirect offset");
-		l = t;
 	}
 	}
 
 
 
 
@@ -555,11 +700,14 @@ parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
 #define NBEDATE		6
 #define NBEDATE		6
 #define NLESHORT	7
 #define NLESHORT	7
 #define NLELONG		6
 #define NLELONG		6
+#define NMELONG		6
 #define NLEDATE		6
 #define NLEDATE		6
+#define NMEDATE		6
 #define NPSTRING	7
 #define NPSTRING	7
 #define NLDATE		5
 #define NLDATE		5
 #define NBELDATE	7
 #define NBELDATE	7
 #define NLELDATE	7
 #define NLELDATE	7
+#define NMELDATE	7
 #define NREGEX		5
 #define NREGEX		5
 #define NBESTRING16	10
 #define NBESTRING16	10
 #define NLESTRING16	10
 #define NLESTRING16	10
@@ -604,9 +752,15 @@ parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
 	} else if (strncmp(l, "lelong", NLELONG)==0) {
 	} else if (strncmp(l, "lelong", NLELONG)==0) {
 		m->type = FILE_LELONG;
 		m->type = FILE_LELONG;
 		l += NLELONG;
 		l += NLELONG;
+	} else if (strncmp(l, "melong", NMELONG)==0) {
+		m->type = FILE_MELONG;
+		l += NMELONG;
 	} else if (strncmp(l, "ledate", NLEDATE)==0) {
 	} else if (strncmp(l, "ledate", NLEDATE)==0) {
 		m->type = FILE_LEDATE;
 		m->type = FILE_LEDATE;
 		l += NLEDATE;
 		l += NLEDATE;
+	} else if (strncmp(l, "medate", NMEDATE)==0) {
+		m->type = FILE_MEDATE;
+		l += NMEDATE;
 	} else if (strncmp(l, "pstring", NPSTRING)==0) {
 	} else if (strncmp(l, "pstring", NPSTRING)==0) {
 		m->type = FILE_PSTRING;
 		m->type = FILE_PSTRING;
 		l += NPSTRING;
 		l += NPSTRING;
@@ -619,6 +773,9 @@ parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
 	} else if (strncmp(l, "leldate", NLELDATE)==0) {
 	} else if (strncmp(l, "leldate", NLELDATE)==0) {
 		m->type = FILE_LELDATE;
 		m->type = FILE_LELDATE;
 		l += NLELDATE;
 		l += NLELDATE;
+	} else if (strncmp(l, "meldate", NMELDATE)==0) {
+		m->type = FILE_MELDATE;
+		l += NMELDATE;
 	} else if (strncmp(l, "regex", NREGEX)==0) {
 	} else if (strncmp(l, "regex", NREGEX)==0) {
 		m->type = FILE_REGEX;
 		m->type = FILE_REGEX;
 		l += NREGEX;
 		l += NREGEX;
@@ -648,7 +805,8 @@ parse(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp, char *l,
 		if (op != FILE_OPDIVIDE || !IS_PLAINSTRING(m->type)) {
 		if (op != FILE_OPDIVIDE || !IS_PLAINSTRING(m->type)) {
 			++l;
 			++l;
 			m->mask_op |= op;
 			m->mask_op |= op;
-			val = (uint32_t)strtoul(l, &l, 0);
+			val = (uint32_t)strtoul(l, &t, 0);
+			l = t;
 			m->mask = file_signextend(ms, m, val);
 			m->mask = file_signextend(ms, m, val);
 			eatsize(&l);
 			eatsize(&l);
 		} else {
 		} else {
@@ -746,7 +904,8 @@ GetDesc:
 		file_mdump(m);
 		file_mdump(m);
 	}
 	}
 #endif
 #endif
-	++(*nmagicp);		/* make room for next */
+	if (m->cont_level == 0)
+		++(*nmentryp);		/* make room for next */
 	return 0;
 	return 0;
 }
 }
 
 
@@ -807,7 +966,7 @@ check_format(struct magic_set *ms, struct magic *m)
  * just after the number read.  Return 0 for success, non-zero for failure.
  * just after the number read.  Return 0 for success, non-zero for failure.
  */
  */
 private int
 private int
-getvalue(struct magic_set *ms, struct magic *m, char **p)
+getvalue(struct magic_set *ms, struct magic *m, const char **p)
 {
 {
 	int slen;
 	int slen;
 
 
@@ -829,8 +988,10 @@ getvalue(struct magic_set *ms, struct magic *m, char **p)
 		return 0;
 		return 0;
 	default:
 	default:
 		if (m->reln != 'x') {
 		if (m->reln != 'x') {
+			char *ep;
 			m->value.l = file_signextend(ms, m,
 			m->value.l = file_signextend(ms, m,
-			    (uint32_t)strtoul(*p, p, 0));
+			    (uint32_t)strtoul(*p, &ep, 0));
+			*p = ep;
 			eatsize(p);
 			eatsize(p);
 		}
 		}
 		return 0;
 		return 0;
@@ -843,10 +1004,11 @@ getvalue(struct magic_set *ms, struct magic *m, char **p)
  * Copy the converted version to "p", returning its length in *slen.
  * Copy the converted version to "p", returning its length in *slen.
  * Return updated scan pointer as function result.
  * Return updated scan pointer as function result.
  */
  */
-private char *
-getstr(struct magic_set *ms, char *s, char *p, int plen, int *slen)
+private const char *
+getstr(struct magic_set *ms, const char *s, char *p, int plen, int *slen)
 {
 {
-	char	*origs = s, *origp = p;
+	const char *origs = s;
+	char 	*origp = p;
 	char	*pmax = p + plen - 1;
 	char	*pmax = p + plen - 1;
 	int	c;
 	int	c;
 	int	val;
 	int	val;
@@ -1018,9 +1180,9 @@ file_showstr(FILE *fp, const char *s, size_t len)
  * eatsize(): Eat the size spec from a number [eg. 10UL]
  * eatsize(): Eat the size spec from a number [eg. 10UL]
  */
  */
 private void
 private void
-eatsize(char **p)
+eatsize(const char **p)
 {
 {
-	char *l = *p;
+	const char *l = *p;
 
 
 	if (LOWCASE(*l) == 'u') 
 	if (LOWCASE(*l) == 'u') 
 		l++;
 		l++;
@@ -1059,7 +1221,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
 	if (dbname == NULL)
 	if (dbname == NULL)
 		return -1;
 		return -1;
 
 
-	if ((fd = open(dbname, O_RDONLY)) == -1)
+	if ((fd = open(dbname, O_RDONLY|O_BINARY)) == -1)
 		return -1;
 		return -1;
 
 
 	if (fstat(fd, &st) == -1) {
 	if (fstat(fd, &st) == -1) {
@@ -1149,7 +1311,7 @@ apprentice_compile(struct magic_set *ms, struct magic **magicp,
 	if (dbname == NULL) 
 	if (dbname == NULL) 
 		return -1;
 		return -1;
 
 
-	if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
+	if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644)) == -1) {
 		file_error(ms, errno, "cannot open `%s'", dbname);
 		file_error(ms, errno, "cannot open `%s'", dbname);
 		return -1;
 		return -1;
 	}
 	}

+ 6 - 1
src/ascmagic.c

@@ -49,7 +49,7 @@
 #include "names.h"
 #include "names.h"
 
 
 #ifndef	lint
 #ifndef	lint
-FILE_RCSID("@(#)$Id: ascmagic.c,v 1.43 2005/06/25 15:52:14 christos Exp $")
+FILE_RCSID("@(#)$Id: ascmagic.c,v 1.45 2006/03/12 22:09:33 christos Exp $")
 #endif	/* lint */
 #endif	/* lint */
 
 
 typedef unsigned long unichar;
 typedef unsigned long unichar;
@@ -154,6 +154,11 @@ file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
 		}
 		}
 	}
 	}
 
 
+	if (nbytes <= 1) {
+		rv = 0;
+		goto done;
+	}
+
 	/*
 	/*
 	 * for troff, look for . + letter + letter or .\";
 	 * for troff, look for . + letter + letter or .\";
 	 * this must be done to disambiguate tar archives' ./file
 	 * this must be done to disambiguate tar archives' ./file

+ 20 - 13
src/file.c

@@ -39,7 +39,6 @@
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/param.h>	/* for MAXPATHLEN */
 #include <sys/param.h>	/* for MAXPATHLEN */
 #include <sys/stat.h>
 #include <sys/stat.h>
-#include <fcntl.h>	/* for open() */
 #ifdef RESTORE_TIME
 #ifdef RESTORE_TIME
 # if (__COHERENT__ >= 0x420)
 # if (__COHERENT__ >= 0x420)
 #  include <sys/utime.h>
 #  include <sys/utime.h>
@@ -72,7 +71,7 @@
 #include "patchlevel.h"
 #include "patchlevel.h"
 
 
 #ifndef	lint
 #ifndef	lint
-FILE_RCSID("@(#)$Id: file.c,v 1.97 2005/08/12 14:19:33 christos Exp $")
+FILE_RCSID("@(#)$Id: file.c,v 1.100 2005/10/17 18:41:44 christos Exp $")
 #endif	/* lint */
 #endif	/* lint */
 
 
 
 
@@ -160,7 +159,8 @@ main(int argc, char *argv[])
 #endif
 #endif
 
 
 #ifdef LC_CTYPE
 #ifdef LC_CTYPE
-	setlocale(LC_CTYPE, ""); /* makes islower etc work for other langs */
+	/* makes islower etc work for other langs */
+	(void)setlocale(LC_CTYPE, "");
 #endif
 #endif
 
 
 #ifdef __EMX__
 #ifdef __EMX__
@@ -253,9 +253,9 @@ main(int argc, char *argv[])
 			flags |= MAGIC_DEVICES;
 			flags |= MAGIC_DEVICES;
 			break;
 			break;
 		case 'v':
 		case 'v':
-			(void) fprintf(stdout, "%s-%d.%.2d\n", progname,
+			(void)fprintf(stdout, "%s-%d.%.2d\n", progname,
 				       FILE_VERSION_MAJOR, patchlevel);
 				       FILE_VERSION_MAJOR, patchlevel);
-			(void) fprintf(stdout, "magic file from %s\n",
+			(void)fprintf(stdout, "magic file from %s\n",
 				       magicfile);
 				       magicfile);
 			return 1;
 			return 1;
 		case 'z':
 		case 'z':
@@ -323,6 +323,7 @@ main(int argc, char *argv[])
 
 
 
 
 private void
 private void
+/*ARGSUSED*/
 load(const char *m, int flags)
 load(const char *m, int flags)
 {
 {
 	if (magic)
 	if (magic)
@@ -348,6 +349,7 @@ unwrap(char *fn)
 	char buf[MAXPATHLEN];
 	char buf[MAXPATHLEN];
 	FILE *f;
 	FILE *f;
 	int wid = 0, cwid;
 	int wid = 0, cwid;
+	size_t len;
 
 
 	if (strcmp("-", fn) == 0) {
 	if (strcmp("-", fn) == 0) {
 		f = stdin;
 		f = stdin;
@@ -360,7 +362,10 @@ unwrap(char *fn)
 		}
 		}
 
 
 		while (fgets(buf, MAXPATHLEN, f) != NULL) {
 		while (fgets(buf, MAXPATHLEN, f) != NULL) {
-			cwid = file_mbswidth(buf) - 1;
+			len = strlen(buf);
+			if (len > 0 && buf[len - 1] == '\n')
+				buf[len - 1] = '\0';
+			cwid = file_mbswidth(buf);
 			if (cwid > wid)
 			if (cwid > wid)
 				wid = cwid;
 				wid = cwid;
 		}
 		}
@@ -369,13 +374,15 @@ unwrap(char *fn)
 	}
 	}
 
 
 	while (fgets(buf, MAXPATHLEN, f) != NULL) {
 	while (fgets(buf, MAXPATHLEN, f) != NULL) {
-		buf[file_mbswidth(buf)-1] = '\0';
+		len = strlen(buf);
+		if (len > 0 && buf[len - 1] == '\n')
+			buf[len - 1] = '\0';
 		process(buf, wid);
 		process(buf, wid);
 		if(nobuffer)
 		if(nobuffer)
-			(void) fflush(stdout);
+			(void)fflush(stdout);
 	}
 	}
 
 
-	(void) fclose(f);
+	(void)fclose(f);
 }
 }
 
 
 private void
 private void
@@ -385,14 +392,14 @@ process(const char *inname, int wid)
 	int std_in = strcmp(inname, "-") == 0;
 	int std_in = strcmp(inname, "-") == 0;
 
 
 	if (wid > 0 && !bflag)
 	if (wid > 0 && !bflag)
-		(void) printf("%s%s%*s ", std_in ? "/dev/stdin" : inname,
+		(void)printf("%s%s%*s ", std_in ? "/dev/stdin" : inname,
 		    separator, (int) (nopad ? 0 : (wid - file_mbswidth(inname))), "");
 		    separator, (int) (nopad ? 0 : (wid - file_mbswidth(inname))), "");
 
 
 	type = magic_file(magic, std_in ? NULL : inname);
 	type = magic_file(magic, std_in ? NULL : inname);
 	if (type == NULL)
 	if (type == NULL)
-		printf("ERROR: %s\n", magic_error(magic));
+		(void)printf("ERROR: %s\n", magic_error(magic));
 	else
 	else
-		printf("%s\n", type);
+		(void)printf("%s\n", type);
 }
 }
 
 
 
 
@@ -501,7 +508,7 @@ usage(void)
 private void
 private void
 help(void)
 help(void)
 {
 {
-	puts(
+	(void)puts(
 "Usage: file [OPTION]... [FILE]...\n"
 "Usage: file [OPTION]... [FILE]...\n"
 "Determine file type of FILEs.\n"
 "Determine file type of FILEs.\n"
 "\n"
 "\n"

+ 17 - 3
src/file.h

@@ -27,7 +27,7 @@
  */
  */
 /*
 /*
  * file.h - definitions for file(1) program
  * file.h - definitions for file(1) program
- * @(#)$Id: file.h,v 1.70 2005/07/29 17:57:20 christos Exp $
+ * @(#)$Id: file.h,v 1.73 2005/10/20 14:59:01 christos Exp $
  */
  */
 
 
 #ifndef __file_h__
 #ifndef __file_h__
@@ -39,6 +39,7 @@
 
 
 #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>
+#include <fcntl.h>	/* For open and flags */
 #ifdef HAVE_STDINT_H
 #ifdef HAVE_STDINT_H
 #include <stdint.h>
 #include <stdint.h>
 #endif
 #endif
@@ -112,6 +113,9 @@ struct magic {
 #define				FILE_BESTRING16	18
 #define				FILE_BESTRING16	18
 #define				FILE_LESTRING16	19
 #define				FILE_LESTRING16	19
 #define				FILE_SEARCH	20
 #define				FILE_SEARCH	20
+#define				FILE_MEDATE	21
+#define				FILE_MELDATE	22
+#define				FILE_MELONG	23
 
 
 #define				FILE_FORMAT_NAME	\
 #define				FILE_FORMAT_NAME	\
 /* 0 */ 			"invalid 0",		\
 /* 0 */ 			"invalid 0",		\
@@ -134,7 +138,10 @@ struct magic {
 /* 17 */ 			"regex",		\
 /* 17 */ 			"regex",		\
 /* 18 */			"bestring16",		\
 /* 18 */			"bestring16",		\
 /* 19 */			"lestring16",		\
 /* 19 */			"lestring16",		\
-/* 20 */ 			"search",
+/* 20 */ 			"search",		\
+/* 21 */ 			"medate",		\
+/* 22 */ 			"meldate",		\
+/* 23 */ 			"melong",
 
 
 #define	FILE_FMT_NUM	"cduxXi"
 #define	FILE_FMT_NUM	"cduxXi"
 #define FILE_FMT_STR	"s"	
 #define FILE_FMT_STR	"s"	
@@ -160,7 +167,10 @@ struct magic {
 /* 17 */ 			FILE_FMT_STR,		\
 /* 17 */ 			FILE_FMT_STR,		\
 /* 18 */			FILE_FMT_STR,		\
 /* 18 */			FILE_FMT_STR,		\
 /* 19 */			FILE_FMT_STR,		\
 /* 19 */			FILE_FMT_STR,		\
-/* 20 */			FILE_FMT_STR,
+/* 20 */			FILE_FMT_STR,		\
+/* 21 */			FILE_FMT_STR,		\
+/* 22 */			FILE_FMT_STR,		\
+/* 23 */			FILE_FMT_NUM,
 
 
 	/* Word 3 */
 	/* Word 3 */
 	uint8_t in_op;		/* operator for indirection */
 	uint8_t in_op;		/* operator for indirection */
@@ -291,6 +301,10 @@ int snprintf(char *, size_t, const char *, ...);
 #define QUICK
 #define QUICK
 #endif
 #endif
 
 
+#ifndef O_BINARY
+#define O_BINARY	0
+#endif
+
 #define FILE_RCSID(id) \
 #define FILE_RCSID(id) \
 static const char *rcsid(const char *p) { \
 static const char *rcsid(const char *p) { \
 	return rcsid(p = id); \
 	return rcsid(p = id); \

+ 59 - 8
src/funcs.c

@@ -30,9 +30,12 @@
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
 #include <ctype.h>
 #include <ctype.h>
+#if defined(HAVE_WCHAR_H)
+#include <wchar.h>
+#endif
 
 
 #ifndef	lint
 #ifndef	lint
-FILE_RCSID("@(#)$Id: funcs.c,v 1.15 2005/07/12 20:05:38 christos Exp $")
+FILE_RCSID("@(#)$Id: funcs.c,v 1.19 2006/03/02 22:10:26 christos Exp $")
 #endif	/* lint */
 #endif	/* lint */
 
 
 #ifndef HAVE_VSNPRINTF
 #ifndef HAVE_VSNPRINTF
@@ -128,7 +131,10 @@ file_buffer(struct magic_set *ms, int fd, const void *buf, size_t nb)
 		if ((m = file_ascmagic(ms, buf, nb)) == 0) {
 		if ((m = file_ascmagic(ms, buf, nb)) == 0) {
 		    /* abandon hope, all ye who remain here */
 		    /* abandon hope, all ye who remain here */
 		    if (file_printf(ms, ms->flags & MAGIC_MIME ?
 		    if (file_printf(ms, ms->flags & MAGIC_MIME ?
-			"application/octet-stream" : "data") == -1)
+			(nb ? "application/octet-stream" :
+			    "application/empty") :
+			(nb ? "data" :
+			    "empty")) == -1)
 			    return -1;
 			    return -1;
 		    m = 1;
 		    m = 1;
 		}
 		}
@@ -152,6 +158,13 @@ file_reset(struct magic_set *ms)
 	return 0;
 	return 0;
 }
 }
 
 
+#define OCTALIFY(n, o)	\
+	*(n)++ = '\\', \
+	*(n)++ = (((uint32_t)*(o) >> 6) & 3) + '0', \
+	*(n)++ = (((uint32_t)*(o) >> 3) & 7) + '0', \
+	*(n)++ = (((uint32_t)*(o) >> 0) & 7) + '0', \
+	(o)++
+
 protected const char *
 protected const char *
 file_getbuffer(struct magic_set *ms)
 file_getbuffer(struct magic_set *ms)
 {
 {
@@ -174,14 +187,50 @@ file_getbuffer(struct magic_set *ms)
 		ms->o.pbuf = nbuf;
 		ms->o.pbuf = nbuf;
 	}
 	}
 
 
+#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH)
+	{
+		mbstate_t state;
+		wchar_t nextchar;
+		int mb_conv = 1;
+		size_t bytesconsumed;
+		char *eop;
+		(void)memset(&state, 0, sizeof(mbstate_t));
+
+		np = ms->o.pbuf;
+		op = ms->o.buf;
+		eop = op + strlen(ms->o.buf);
+
+		while (op < eop) {
+			bytesconsumed = mbrtowc(&nextchar, op, eop - op,
+			    &state);
+			if (bytesconsumed == (size_t)(-1) ||
+			    bytesconsumed == (size_t)(-2)) {
+				mb_conv = 0;
+				break;
+			}
+
+			if (iswprint(nextchar) ) {
+				(void)memcpy(np, op, bytesconsumed);
+				op += bytesconsumed;
+				np += bytesconsumed;
+			} else {
+				while (bytesconsumed-- > 0)
+					OCTALIFY(np, op);
+			}
+		}
+		*np = '\0';
+
+		/* Parsing succeeded as a multi-byte sequence */
+		if (mb_conv != 0)
+			return ms->o.pbuf;
+	}
+#endif
+
 	for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) {
 	for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) {
 		if (isprint((unsigned char)*op)) {
 		if (isprint((unsigned char)*op)) {
 			*np++ = *op;	
 			*np++ = *op;	
 		} else {
 		} else {
-			*np++ = '\\';
-			*np++ = ((*op >> 6) & 3) + '0';
-			*np++ = ((*op >> 3) & 7) + '0';
-			*np++ = ((*op >> 0) & 7) + '0';
+			OCTALIFY(np, op);
 		}
 		}
 	}
 	}
 	*np = '\0';
 	*np = '\0';
@@ -196,7 +245,7 @@ file_getbuffer(struct magic_set *ms)
 int
 int
 vsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
 vsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
 {
 {
-	vsprintf(buf, fmt, ap);
+	return vsprintf(buf, fmt, ap);
 }
 }
 #endif
 #endif
 
 
@@ -205,9 +254,11 @@ vsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
 int
 int
 snprintf(char *buf, size_t len, const char *fmt, ...)
 snprintf(char *buf, size_t len, const char *fmt, ...)
 {
 {
+	int rv;
 	va_list ap;
 	va_list ap;
 	va_start(ap, fmt);
 	va_start(ap, fmt);
-	vsprintf(buf, fmt, ap);
+	rv = vsprintf(buf, fmt, ap);
 	va_end(ap);
 	va_end(ap);
+	return rv;
 }
 }
 #endif
 #endif

+ 18 - 7
src/magic.c

@@ -35,7 +35,6 @@
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/param.h>	/* for MAXPATHLEN */
 #include <sys/param.h>	/* for MAXPATHLEN */
 #include <sys/stat.h>
 #include <sys/stat.h>
-#include <fcntl.h>	/* for open() */
 #ifdef QUICK
 #ifdef QUICK
 #include <sys/mman.h>
 #include <sys/mman.h>
 #endif
 #endif
@@ -63,7 +62,7 @@
 #include "patchlevel.h"
 #include "patchlevel.h"
 
 
 #ifndef	lint
 #ifndef	lint
-FILE_RCSID("@(#)$Id: magic.c,v 1.28 2005/06/25 15:52:14 christos Exp $")
+FILE_RCSID("@(#)$Id: magic.c,v 1.32 2005/10/17 15:31:10 christos Exp $")
 #endif	/* lint */
 #endif	/* lint */
 
 
 #ifdef __EMX__
 #ifdef __EMX__
@@ -76,6 +75,10 @@ private void free_mlist(struct mlist *);
 private void close_and_restore(const struct magic_set *, const char *, int,
 private void close_and_restore(const struct magic_set *, const char *, int,
     const struct stat *);
     const struct stat *);
 
 
+#ifndef	STDIN_FILENO
+#define	STDIN_FILENO	0
+#endif
+
 public struct magic_set *
 public struct magic_set *
 magic_open(int flags)
 magic_open(int flags)
 {
 {
@@ -179,8 +182,11 @@ private void
 close_and_restore(const struct magic_set *ms, const char *name, int fd,
 close_and_restore(const struct magic_set *ms, const char *name, int fd,
     const struct stat *sb)
     const struct stat *sb)
 {
 {
+	if (fd == STDIN_FILENO)
+		return;
 	(void) close(fd);
 	(void) close(fd);
-	if (fd != STDIN_FILENO && (ms->flags & MAGIC_PRESERVE_ATIME) != 0) {
+
+	if ((ms->flags & MAGIC_PRESERVE_ATIME) != 0) {
 		/*
 		/*
 		 * Try to restore access, modification times if read it.
 		 * Try to restore access, modification times if read it.
 		 * This is really *bad* because it will modify the status
 		 * This is really *bad* because it will modify the status
@@ -237,12 +243,14 @@ magic_file(struct magic_set *ms, const char *inname)
 		goto done;
 		goto done;
 	}
 	}
 
 
-#ifndef	STDIN_FILENO
-#define	STDIN_FILENO	0
-#endif
 	if (inname == NULL)
 	if (inname == NULL)
 		fd = STDIN_FILENO;
 		fd = STDIN_FILENO;
-	else if ((fd = open(inname, O_RDONLY)) < 0) {
+	else if ((fd = open(inname, O_RDONLY|O_BINARY)) < 0) {
+#ifdef __CYGWIN__
+	    char *tmp = alloca(strlen(inname) + 5);
+	    (void)strcat(strcpy(tmp, inname), ".exe");
+	    if ((fd = open(tmp, O_RDONLY|O_BINARY)) < 0) {
+#endif
 		/* We cannot open it, but we were able to stat it. */
 		/* We cannot open it, but we were able to stat it. */
 		if (sb.st_mode & 0222)
 		if (sb.st_mode & 0222)
 			if (file_printf(ms, "writable, ") == -1)
 			if (file_printf(ms, "writable, ") == -1)
@@ -257,6 +265,9 @@ magic_file(struct magic_set *ms, const char *inname)
 			goto done;
 			goto done;
 		rv = 0;
 		rv = 0;
 		goto done;
 		goto done;
+#ifdef __CYGWIN__
+	    }
+#endif
 	}
 	}
 
 
 	/*
 	/*

+ 9 - 3
src/patchlevel.h

@@ -1,13 +1,19 @@
 #define	FILE_VERSION_MAJOR	4
 #define	FILE_VERSION_MAJOR	4
-#define	patchlevel		15
+#define	patchlevel		17
 
 
 /*
 /*
  * Patchlevel file for Ian Darwin's MAGIC command.
  * Patchlevel file for Ian Darwin's MAGIC command.
- * $Id: patchlevel.h,v 1.58 2005/08/18 15:52:56 christos Exp $
+ * $Id: patchlevel.h,v 1.60 2006/03/02 22:15:12 christos Exp $
  *
  *
  * $Log: patchlevel.h,v $
  * $Log: patchlevel.h,v $
+ * Revision 1.60  2006/03/02 22:15:12  christos
+ * welcome to 4.17
+ *
+ * Revision 1.59  2005/10/17 17:15:21  christos
+ * welcome to 4.16
+ *
  * Revision 1.58  2005/08/18 15:52:56  christos
  * Revision 1.58  2005/08/18 15:52:56  christos
- * welcome to 5.15
+ * welcome to 4.15
  *
  *
  * Revision 1.57  2005/06/25 15:52:14  christos
  * Revision 1.57  2005/06/25 15:52:14  christos
  * Welcome to 4.14
  * Welcome to 4.14

+ 13 - 11
src/print.c

@@ -41,7 +41,7 @@
 #include <time.h>
 #include <time.h>
 
 
 #ifndef lint
 #ifndef lint
-FILE_RCSID("@(#)$Id: print.c,v 1.47 2005/03/14 16:56:25 christos Exp $")
+FILE_RCSID("@(#)$Id: print.c,v 1.50 2006/03/02 22:07:53 christos Exp $")
 #endif  /* lint */
 #endif  /* lint */
 
 
 #define SZOF(a)	(sizeof(a) / sizeof(a[0]))
 #define SZOF(a)	(sizeof(a) / sizeof(a[0]))
@@ -50,13 +50,9 @@ FILE_RCSID("@(#)$Id: print.c,v 1.47 2005/03/14 16:56:25 christos Exp $")
 protected void
 protected void
 file_mdump(struct magic *m)
 file_mdump(struct magic *m)
 {
 {
-	private const char *typ[] = { "invalid", "byte", "short", "invalid",
-				     "long", "string", "date", "beshort",
-				     "belong", "bedate", "leshort", "lelong",
-				     "ledate", "pstring", "ldate", "beldate",
-				     "leldate", "regex" };
-	private const char optyp[] = { '@', '&', '|', '^', '+', '-', 
-				      '*', '/', '%' };
+	private const char *typ[] = { FILE_FORMAT_NAME };
+	private const char optyp[] = { FILE_OPS };
+
 	(void) fputc('[', stderr);
 	(void) fputc('[', stderr);
 	(void) fprintf(stderr, ">>>>>>>> %d" + 8 - (m->cont_level & 7),
 	(void) fprintf(stderr, ">>>>>>>> %d" + 8 - (m->cont_level & 7),
 		       m->offset);
 		       m->offset);
@@ -83,7 +79,7 @@ file_mdump(struct magic *m)
 			fputc(optyp[m->mask_op&0x7F], stderr);
 			fputc(optyp[m->mask_op&0x7F], stderr);
 		else
 		else
 			fputc('?', stderr);
 			fputc('?', stderr);
-		if(FILE_STRING != m->type || FILE_PSTRING != m->type)
+		if (FILE_STRING != m->type || FILE_PSTRING != m->type)
 			(void) fprintf(stderr, "%.8x", m->mask);
 			(void) fprintf(stderr, "%.8x", m->mask);
 		else {
 		else {
 			if (m->mask & STRING_IGNORE_LOWERCASE) 
 			if (m->mask & STRING_IGNORE_LOWERCASE) 
@@ -105,24 +101,30 @@ file_mdump(struct magic *m)
 		case FILE_LONG:
 		case FILE_LONG:
 		case FILE_LESHORT:
 		case FILE_LESHORT:
 		case FILE_LELONG:
 		case FILE_LELONG:
+		case FILE_MELONG:
 		case FILE_BESHORT:
 		case FILE_BESHORT:
 		case FILE_BELONG:
 		case FILE_BELONG:
 			(void) fprintf(stderr, "%d", m->value.l);
 			(void) fprintf(stderr, "%d", m->value.l);
 			break;
 			break;
-		case FILE_STRING:
 		case FILE_PSTRING:
 		case FILE_PSTRING:
+		case FILE_STRING:
 		case FILE_REGEX:
 		case FILE_REGEX:
-			file_showstr(stderr, m->value.s, ~0U);
+		case FILE_BESTRING16:
+		case FILE_LESTRING16:
+		case FILE_SEARCH:
+			file_showstr(stderr, m->value.s, m->vallen);
 			break;
 			break;
 		case FILE_DATE:
 		case FILE_DATE:
 		case FILE_LEDATE:
 		case FILE_LEDATE:
 		case FILE_BEDATE:
 		case FILE_BEDATE:
+		case FILE_MEDATE:
 			(void)fprintf(stderr, "%s,",
 			(void)fprintf(stderr, "%s,",
 			    file_fmttime(m->value.l, 1));
 			    file_fmttime(m->value.l, 1));
 			break;
 			break;
 		case FILE_LDATE:
 		case FILE_LDATE:
 		case FILE_LELDATE:
 		case FILE_LELDATE:
 		case FILE_BELDATE:
 		case FILE_BELDATE:
+		case FILE_MELDATE:
 			(void)fprintf(stderr, "%s,",
 			(void)fprintf(stderr, "%s,",
 			    file_fmttime(m->value.l, 0));
 			    file_fmttime(m->value.l, 0));
 			break;
 			break;

+ 216 - 145
src/readelf.c

@@ -37,7 +37,7 @@
 #include "readelf.h"
 #include "readelf.h"
 
 
 #ifndef lint
 #ifndef lint
-FILE_RCSID("@(#)$Id: readelf.c,v 1.49 2005/07/14 02:22:25 christos Exp $")
+FILE_RCSID("@(#)$Id: readelf.c,v 1.54 2006/01/13 00:45:21 christos Exp $")
 #endif
 #endif
 
 
 #ifdef	ELFCORE
 #ifdef	ELFCORE
@@ -46,10 +46,12 @@ private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t);
 private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t);
 private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t);
 private int doshn(struct magic_set *, int, int, int, off_t, int, size_t);
 private int doshn(struct magic_set *, int, int, int, off_t, int, size_t);
 private size_t donote(struct magic_set *, unsigned char *, size_t, size_t, int,
 private size_t donote(struct magic_set *, unsigned char *, size_t, size_t, int,
-    int, size_t);
+    int, size_t, int *);
 
 
 #define	ELF_ALIGN(a)	((((a) + align - 1) / align) * align)
 #define	ELF_ALIGN(a)	((((a) + align - 1) / align) * align)
 
 
+#define isquote(c) (strchr("'\"`", (c)) != NULL)
+
 private uint16_t getu16(int, uint16_t);
 private uint16_t getu16(int, uint16_t);
 private uint32_t getu32(int, uint32_t);
 private uint32_t getu32(int, uint32_t);
 private uint64_t getu64(int, uint64_t);
 private uint64_t getu64(int, uint64_t);
@@ -119,48 +121,65 @@ getu64(int swap, uint64_t value)
 		return value;
 		return value;
 }
 }
 
 
-#define sh_addr		(class == ELFCLASS32		\
+#ifdef USE_ARRAY_FOR_64BIT_TYPES
+# define elf_getu64(swap, array) \
+	((swap ? ((uint64_t)getu32(swap, array[0])) << 32 : getu32(swap, array[0])) + \
+	 (swap ? getu32(swap, array[1]) : ((uint64_t)getu32(swap, array[1]) << 32)))
+#else
+# define elf_getu64(swap, value) getu64(swap, value)
+#endif
+
+#define xsh_addr	(class == ELFCLASS32		\
 			 ? (void *) &sh32		\
 			 ? (void *) &sh32		\
 			 : (void *) &sh64)
 			 : (void *) &sh64)
-#define sh_size		(class == ELFCLASS32		\
+#define xsh_sizeof	(class == ELFCLASS32		\
 			 ? sizeof sh32			\
 			 ? sizeof sh32			\
 			 : sizeof sh64)
 			 : sizeof sh64)
-#define shs_type	(class == ELFCLASS32		\
+#define xsh_size	(class == ELFCLASS32		\
+			 ? getu32(swap, sh32.sh_size)	\
+			 : getu64(swap, sh64.sh_size))
+#define xsh_offset	(class == ELFCLASS32		\
+			 ? getu32(swap, sh32.sh_offset)	\
+			 : getu64(swap, sh64.sh_offset))
+#define xsh_type	(class == ELFCLASS32		\
 			 ? getu32(swap, sh32.sh_type)	\
 			 ? getu32(swap, sh32.sh_type)	\
 			 : getu32(swap, sh64.sh_type))
 			 : getu32(swap, sh64.sh_type))
-#define ph_addr		(class == ELFCLASS32		\
+#define xph_addr	(class == ELFCLASS32		\
 			 ? (void *) &ph32		\
 			 ? (void *) &ph32		\
 			 : (void *) &ph64)
 			 : (void *) &ph64)
-#define ph_size		(class == ELFCLASS32		\
+#define xph_sizeof	(class == ELFCLASS32		\
 			 ? sizeof ph32			\
 			 ? sizeof ph32			\
 			 : sizeof ph64)
 			 : sizeof ph64)
-#define ph_type		(class == ELFCLASS32		\
+#define xph_type	(class == ELFCLASS32		\
 			 ? getu32(swap, ph32.p_type)	\
 			 ? getu32(swap, ph32.p_type)	\
 			 : getu32(swap, ph64.p_type))
 			 : getu32(swap, ph64.p_type))
-#define ph_offset	(class == ELFCLASS32		\
+#define xph_offset	(class == ELFCLASS32		\
 			 ? getu32(swap, ph32.p_offset)	\
 			 ? getu32(swap, ph32.p_offset)	\
 			 : getu64(swap, ph64.p_offset))
 			 : getu64(swap, ph64.p_offset))
-#define ph_align	(size_t)((class == ELFCLASS32	\
+#define xph_align	(size_t)((class == ELFCLASS32	\
 			 ? (off_t) (ph32.p_align ? 	\
 			 ? (off_t) (ph32.p_align ? 	\
 			    getu32(swap, ph32.p_align) : 4) \
 			    getu32(swap, ph32.p_align) : 4) \
 			 : (off_t) (ph64.p_align ?	\
 			 : (off_t) (ph64.p_align ?	\
 			    getu64(swap, ph64.p_align) : 4)))
 			    getu64(swap, ph64.p_align) : 4)))
-#define ph_filesz	(size_t)((class == ELFCLASS32	\
+#define xph_filesz	(size_t)((class == ELFCLASS32	\
 			 ? getu32(swap, ph32.p_filesz)	\
 			 ? getu32(swap, ph32.p_filesz)	\
 			 : getu64(swap, ph64.p_filesz)))
 			 : getu64(swap, ph64.p_filesz)))
-#define ph_memsz	(size_t)((class == ELFCLASS32	\
+#define xnh_addr	(class == ELFCLASS32		\
+			 ? (void *) &nh32		\
+			 : (void *) &nh64)
+#define xph_memsz	(size_t)((class == ELFCLASS32	\
 			 ? getu32(swap, ph32.p_memsz)	\
 			 ? getu32(swap, ph32.p_memsz)	\
 			 : getu64(swap, ph64.p_memsz)))
 			 : getu64(swap, ph64.p_memsz)))
-#define nh_size		(class == ELFCLASS32		\
+#define xnh_sizeof	(class == ELFCLASS32		\
 			 ? sizeof nh32			\
 			 ? sizeof nh32			\
 			 : sizeof nh64)
 			 : sizeof nh64)
-#define nh_type		(class == ELFCLASS32		\
+#define xnh_type	(class == ELFCLASS32		\
 			 ? getu32(swap, nh32.n_type)	\
 			 ? getu32(swap, nh32.n_type)	\
 			 : getu32(swap, nh64.n_type))
 			 : getu32(swap, nh64.n_type))
-#define nh_namesz	(class == ELFCLASS32		\
+#define xnh_namesz	(class == ELFCLASS32		\
 			 ? getu32(swap, nh32.n_namesz)	\
 			 ? getu32(swap, nh32.n_namesz)	\
 			 : getu32(swap, nh64.n_namesz))
 			 : getu32(swap, nh64.n_namesz))
-#define nh_descsz	(class == ELFCLASS32		\
+#define xnh_descsz	(class == ELFCLASS32		\
 			 ? getu32(swap, nh32.n_descsz)	\
 			 ? getu32(swap, nh32.n_descsz)	\
 			 : getu32(swap, nh64.n_descsz))
 			 : getu32(swap, nh64.n_descsz))
 #define prpsoffsets(i)	(class == ELFCLASS32		\
 #define prpsoffsets(i)	(class == ELFCLASS32		\
@@ -217,6 +236,8 @@ private const char *os_style_names[] = {
 	"NetBSD",
 	"NetBSD",
 };
 };
 
 
+#define FLAGS_DID_CORE		1
+
 private int
 private int
 dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
 dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
     int num, size_t size)
     int num, size_t size)
@@ -226,12 +247,14 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
 	size_t offset;
 	size_t offset;
 	unsigned char nbuf[BUFSIZ];
 	unsigned char nbuf[BUFSIZ];
 	ssize_t bufsize;
 	ssize_t bufsize;
+	int flags = 0;
 
 
-	if (size != ph_size) {
+	if (size != xph_sizeof) {
 		if (file_printf(ms, ", corrupted program header size") == -1)
 		if (file_printf(ms, ", corrupted program header size") == -1)
 			return -1;
 			return -1;
 		return 0;
 		return 0;
 	}
 	}
+
 	/*
 	/*
 	 * Loop through all the program headers.
 	 * Loop through all the program headers.
 	 */
 	 */
@@ -240,24 +263,24 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
 			file_badseek(ms);
 			file_badseek(ms);
 			return -1;
 			return -1;
 		}
 		}
-		if (read(fd, ph_addr, ph_size) == -1) {
+		if (read(fd, xph_addr, xph_sizeof) == -1) {
 			file_badread(ms);
 			file_badread(ms);
 			return -1;
 			return -1;
 		}
 		}
 		off += size;
 		off += size;
-		if (ph_type != PT_NOTE)
+		if (xph_type != PT_NOTE)
 			continue;
 			continue;
 
 
 		/*
 		/*
 		 * This is a PT_NOTE section; loop through all the notes
 		 * This is a PT_NOTE section; loop through all the notes
 		 * in the section.
 		 * in the section.
 		 */
 		 */
-		if (lseek(fd, (off_t) ph_offset, SEEK_SET) == (off_t)-1) {
+		if (lseek(fd, (off_t)xph_offset, SEEK_SET) == (off_t)-1) {
 			file_badseek(ms);
 			file_badseek(ms);
 			return -1;
 			return -1;
 		}
 		}
 		bufsize = read(fd, nbuf,
 		bufsize = read(fd, nbuf,
-		    ((ph_filesz < sizeof(nbuf)) ? ph_filesz : sizeof(nbuf)));
+		    ((xph_filesz < sizeof(nbuf)) ? xph_filesz : sizeof(nbuf)));
 		if (bufsize == -1) {
 		if (bufsize == -1) {
 			file_badread(ms);
 			file_badread(ms);
 			return -1;
 			return -1;
@@ -267,7 +290,7 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
 			if (offset >= (size_t)bufsize)
 			if (offset >= (size_t)bufsize)
 				break;
 				break;
 			offset = donote(ms, nbuf, offset, (size_t)bufsize,
 			offset = donote(ms, nbuf, offset, (size_t)bufsize,
-			    class, swap, 4);
+			    class, swap, 4, &flags);
 			if (offset == 0)
 			if (offset == 0)
 				break;
 				break;
 
 
@@ -279,7 +302,7 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
 
 
 private size_t
 private size_t
 donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
-    int class, int swap, size_t align)
+    int class, int swap, size_t align, int *flags)
 {
 {
 	Elf32_Nhdr nh32;
 	Elf32_Nhdr nh32;
 	Elf64_Nhdr nh64;
 	Elf64_Nhdr nh64;
@@ -289,14 +312,11 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 #endif
 #endif
 	uint32_t namesz, descsz;
 	uint32_t namesz, descsz;
 
 
-	if (class == ELFCLASS32)
-		memcpy(&nh32, &nbuf[offset], sizeof(nh32));
-	else
-		memcpy(&nh64, &nbuf[offset], sizeof(nh64));
-	offset += nh_size;
+	(void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
+	offset += xnh_sizeof;
 
 
-	namesz = nh_namesz;
-	descsz = nh_descsz;
+	namesz = xnh_namesz;
+	descsz = xnh_descsz;
 	if ((namesz == 0) && (descsz == 0)) {
 	if ((namesz == 0) && (descsz == 0)) {
 		/*
 		/*
 		 * We're out of note headers.
 		 * We're out of note headers.
@@ -333,7 +353,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 	}
 	}
 
 
 	if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
 	if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
-	    nh_type == NT_GNU_VERSION && descsz == 16) {
+	    xnh_type == NT_GNU_VERSION && descsz == 16) {
 		uint32_t desc[4];
 		uint32_t desc[4];
 		(void)memcpy(desc, &nbuf[doff], sizeof(desc));
 		(void)memcpy(desc, &nbuf[doff], sizeof(desc));
 
 
@@ -363,7 +383,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 	}
 	}
 
 
 	if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0 &&
 	if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0 &&
-	    nh_type == NT_NETBSD_VERSION && descsz == 4) {
+	    xnh_type == NT_NETBSD_VERSION && descsz == 4) {
 		uint32_t desc;
 		uint32_t desc;
 		(void)memcpy(&desc, &nbuf[doff], sizeof(desc));
 		(void)memcpy(&desc, &nbuf[doff], sizeof(desc));
 		desc = getu32(swap, desc);
 		desc = getu32(swap, desc);
@@ -405,7 +425,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 	}
 	}
 
 
 	if (namesz == 8 && strcmp((char *)&nbuf[noff], "FreeBSD") == 0 &&
 	if (namesz == 8 && strcmp((char *)&nbuf[noff], "FreeBSD") == 0 &&
-	    nh_type == NT_FREEBSD_VERSION && descsz == 4) {
+	    xnh_type == NT_FREEBSD_VERSION && descsz == 4) {
 		uint32_t desc;
 		uint32_t desc;
 		(void)memcpy(&desc, &nbuf[doff], sizeof(desc));
 		(void)memcpy(&desc, &nbuf[doff], sizeof(desc));
 		desc = getu32(swap, desc);
 		desc = getu32(swap, desc);
@@ -482,7 +502,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 	}
 	}
 
 
 	if (namesz == 8 && strcmp((char *)&nbuf[noff], "OpenBSD") == 0 &&
 	if (namesz == 8 && strcmp((char *)&nbuf[noff], "OpenBSD") == 0 &&
-	    nh_type == NT_OPENBSD_VERSION && descsz == 4) {
+	    xnh_type == NT_OPENBSD_VERSION && descsz == 4) {
 		if (file_printf(ms, ", for OpenBSD") == -1)
 		if (file_printf(ms, ", for OpenBSD") == -1)
 			return size;
 			return size;
 		/* Content of note is always 0 */
 		/* Content of note is always 0 */
@@ -490,7 +510,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 	}
 	}
 
 
 	if (namesz == 10 && strcmp((char *)&nbuf[noff], "DragonFly") == 0 &&
 	if (namesz == 10 && strcmp((char *)&nbuf[noff], "DragonFly") == 0 &&
-	    nh_type == NT_DRAGONFLY_VERSION && descsz == 4) {
+	    xnh_type == NT_DRAGONFLY_VERSION && descsz == 4) {
 		uint32_t desc;
 		uint32_t desc;
 		if (file_printf(ms, ", for DragonFly") == -1)
 		if (file_printf(ms, ", for DragonFly") == -1)
 			return size;
 			return size;
@@ -531,100 +551,113 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
 	}
 	}
 
 
 #ifdef ELFCORE
 #ifdef ELFCORE
-	if (os_style != -1)
-		if (file_printf(ms, ", %s-style", os_style_names[os_style]) == -1)
-			return size;
+	if (os_style != -1) {
+		if ((*flags & FLAGS_DID_CORE) == 0) {
+			if (file_printf(ms, ", %s-style",
+			    os_style_names[os_style]) == -1)
+				return size;
+			*flags |= FLAGS_DID_CORE;
+		}
+	}
 
 
-	if (os_style == OS_STYLE_NETBSD && nh_type == NT_NETBSD_CORE_PROCINFO) {
-		uint32_t signo;
-		/*
-		 * Extract the program name.  It is at
-		 * offset 0x7c, and is up to 32-bytes,
-		 * including the terminating NUL.
-		 */
-		if (file_printf(ms, ", from '%.31s'", &nbuf[doff + 0x7c]) == -1)
-			return size;
-		
-		/*
-		 * Extract the signal number.  It is at
-		 * offset 0x08.
-		 */
-		memcpy(&signo, &nbuf[doff + 0x08],
-		    sizeof(signo));
-		if (file_printf(ms, " (signal %u)", getu32(swap, signo)) == -1)
+	switch (os_style) {
+	case OS_STYLE_NETBSD:
+		if (xnh_type == NT_NETBSD_CORE_PROCINFO) {
+			uint32_t signo;
+			/*
+			 * Extract the program name.  It is at
+			 * offset 0x7c, and is up to 32-bytes,
+			 * including the terminating NUL.
+			 */
+			if (file_printf(ms, ", from '%.31s'",
+			    &nbuf[doff + 0x7c]) == -1)
+				return size;
+			
+			/*
+			 * Extract the signal number.  It is at
+			 * offset 0x08.
+			 */
+			(void)memcpy(&signo, &nbuf[doff + 0x08],
+			    sizeof(signo));
+			if (file_printf(ms, " (signal %u)",
+			    getu32(swap, signo)) == -1)
+				return size;
 			return size;
 			return size;
-		return size;
-	} else if (os_style != OS_STYLE_NETBSD && nh_type == NT_PRPSINFO) {
-		size_t i, j;
-		unsigned char c;
-		/*
-		 * Extract the program name.  We assume
-		 * it to be 16 characters (that's what it
-		 * is in SunOS 5.x and Linux).
-		 *
-		 * Unfortunately, it's at a different offset
-		 * in varous OSes, so try multiple offsets.
-		 * If the characters aren't all printable,
-		 * reject it.
-		 */
-		for (i = 0; i < NOFFSETS; i++) {
-			size_t reloffset = prpsoffsets(i);
-			size_t noffset = doff + reloffset;
-			for (j = 0; j < 16; j++, noffset++, reloffset++) {
-				/*
-				 * Make sure we're not past
-				 * the end of the buffer; if
-				 * we are, just give up.
-				 */
-				if (noffset >= size)
-					goto tryanother;
-
-				/*
-				 * Make sure we're not past
-				 * the end of the contents;
-				 * if we are, this obviously
-				 * isn't the right offset.
-				 */
-				if (reloffset >= descsz)
-					goto tryanother;
+		}
+		break;
 
 
-				c = nbuf[noffset];
-				if (c == '\0') {
+	default:
+		if (xnh_type == NT_PRPSINFO) {
+			size_t i, j;
+			unsigned char c;
+			/*
+			 * Extract the program name.  We assume
+			 * it to be 16 characters (that's what it
+			 * is in SunOS 5.x and Linux).
+			 *
+			 * Unfortunately, it's at a different offset
+			 * in varous OSes, so try multiple offsets.
+			 * If the characters aren't all printable,
+			 * reject it.
+			 */
+			for (i = 0; i < NOFFSETS; i++) {
+				size_t reloffset = prpsoffsets(i);
+				size_t noffset = doff + reloffset;
+				for (j = 0; j < 16; j++, noffset++,
+				    reloffset++) {
 					/*
 					/*
-					 * A '\0' at the
-					 * beginning is
-					 * obviously wrong.
-					 * Any other '\0'
-					 * means we're done.
+					 * Make sure we're not past
+					 * the end of the buffer; if
+					 * we are, just give up.
 					 */
 					 */
-					if (j == 0)
+					if (noffset >= size)
 						goto tryanother;
 						goto tryanother;
-					else
-						break;
-				} else {
+
 					/*
 					/*
-					 * A nonprintable
-					 * character is also
-					 * wrong.
+					 * Make sure we're not past
+					 * the end of the contents;
+					 * if we are, this obviously
+					 * isn't the right offset.
 					 */
 					 */
-#define isquote(c) (strchr("'\"`", (c)) != NULL)
-					if (!isprint(c) || isquote(c))
+					if (reloffset >= descsz)
 						goto tryanother;
 						goto tryanother;
-				}
-			}
 
 
-			/*
-			 * Well, that worked.
-			 */
-			if (file_printf(ms, ", from '%.16s'",
-			    &nbuf[doff + prpsoffsets(i)]) == -1)
+					c = nbuf[noffset];
+					if (c == '\0') {
+						/*
+						 * A '\0' at the
+						 * beginning is
+						 * obviously wrong.
+						 * Any other '\0'
+						 * means we're done.
+						 */
+						if (j == 0)
+							goto tryanother;
+						else
+							break;
+					} else {
+						/*
+						 * A nonprintable
+						 * character is also
+						 * wrong.
+						 */
+						if (!isprint(c) || isquote(c))
+							goto tryanother;
+					}
+				}
+				/*
+				 * Well, that worked.
+				 */
+				if (file_printf(ms, ", from '%.16s'",
+				    &nbuf[doff + prpsoffsets(i)]) == -1)
+					return size;
 				return size;
 				return size;
-			return size;
 
 
-		tryanother:
-			;
+			tryanother:
+				;
+			}
 		}
 		}
-		return offset;
+		break;
 	}
 	}
 #endif
 #endif
 	return offset;
 	return offset;
@@ -636,8 +669,12 @@ doshn(struct magic_set *ms, int class, int swap, int fd, off_t off, int num,
 {
 {
 	Elf32_Shdr sh32;
 	Elf32_Shdr sh32;
 	Elf64_Shdr sh64;
 	Elf64_Shdr sh64;
+	int stripped = 1;
+	int flags = 0;
+	void *nbuf;
+	off_t noff;
 
 
-	if (size != sh_size) {
+	if (size != xsh_sizeof) {
 		if (file_printf(ms, ", corrupted section header size") == -1)
 		if (file_printf(ms, ", corrupted section header size") == -1)
 			return -1;
 			return -1;
 		return 0;
 		return 0;
@@ -649,17 +686,61 @@ doshn(struct magic_set *ms, int class, int swap, int fd, off_t off, int num,
 	}
 	}
 
 
 	for ( ; num; num--) {
 	for ( ; num; num--) {
-		if (read(fd, sh_addr, sh_size) == -1) {
+		if (read(fd, xsh_addr, xsh_sizeof) == -1) {
 			file_badread(ms);
 			file_badread(ms);
 			return -1;
 			return -1;
 		}
 		}
-		if (shs_type == SHT_SYMTAB /* || shs_type == SHT_DYNSYM */) {
-			if (file_printf(ms, ", not stripped") == -1)
+		switch (xsh_type) {
+		case SHT_SYMTAB:
+#if 0
+		case SHT_DYNSYM:
+#endif
+			stripped = 0;
+			break;
+		case SHT_NOTE:
+			if ((off = lseek(fd, (off_t)0, SEEK_CUR)) ==
+			    (off_t)-1) {
+				file_badread(ms);
 				return -1;
 				return -1;
-			return 0;
+			}
+			if ((nbuf = malloc((size_t)xsh_size)) == NULL) {
+				file_error(ms, errno, "Cannot allocate memory"
+				    " for note");
+				return -1;
+			}
+			if ((noff = lseek(fd, (off_t)xsh_offset, SEEK_SET)) ==
+			    (off_t)-1) {
+				file_badread(ms);
+				free(nbuf);
+				return -1;
+			}
+			if (read(fd, nbuf, (size_t)xsh_size) !=
+			    (ssize_t)xsh_size) {
+				free(nbuf);
+				file_badread(ms);
+				return -1;
+			}
+
+			noff = 0;
+			for (;;) {
+				if (noff >= (size_t)xsh_size)
+					break;
+				noff = donote(ms, nbuf, (size_t)noff,
+				    (size_t)xsh_size, class, swap, 4,
+				    &flags);
+				if (noff == 0)
+					break;
+			}
+			if ((lseek(fd, off, SEEK_SET)) == (off_t)-1) {
+				free(nbuf);
+				file_badread(ms);
+				return -1;
+			}
+			free(nbuf);
+			break;
 		}
 		}
 	}
 	}
-	if (file_printf(ms, ", stripped") == -1)
+	if (file_printf(ms, ", %sstripped", stripped ? "" : "not ") == -1)
 		return -1;
 		return -1;
 	return 0;
 	return 0;
 }
 }
@@ -681,8 +762,9 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
 	int bufsize;
 	int bufsize;
 	size_t offset, align;
 	size_t offset, align;
 	off_t savedoffset;
 	off_t savedoffset;
+	int flags = 0;
 
 
-	if (size != ph_size) {
+	if (size != xph_sizeof) {
 		if (file_printf(ms, ", corrupted program header size") == -1)
 		if (file_printf(ms, ", corrupted program header size") == -1)
 		    return -1;
 		    return -1;
 		return 0;
 		return 0;
@@ -693,7 +775,7 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
 	}
 	}
 
 
   	for ( ; num; num--) {
   	for ( ; num; num--) {
-  		if (read(fd, ph_addr, ph_size) == -1) {
+  		if (read(fd, xph_addr, xph_sizeof) == -1) {
   			file_badread(ms);
   			file_badread(ms);
 			return -1;
 			return -1;
 		}
 		}
@@ -702,7 +784,7 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
 			return -1;
 			return -1;
 		}
 		}
 
 
-		switch (ph_type) {
+		switch (xph_type) {
 		case PT_DYNAMIC:
 		case PT_DYNAMIC:
 			linking_style = "dynamically";
 			linking_style = "dynamically";
 			break;
 			break;
@@ -710,7 +792,7 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
 			shared_libraries = " (uses shared libs)";
 			shared_libraries = " (uses shared libs)";
 			break;
 			break;
 		case PT_NOTE:
 		case PT_NOTE:
-			if ((align = ph_align) & 0x80000000) {
+			if ((align = xph_align) & 0x80000000) {
 				if (file_printf(ms, 
 				if (file_printf(ms, 
 				    ", invalid note alignment 0x%lx",
 				    ", invalid note alignment 0x%lx",
 				    (unsigned long)align) == -1)
 				    (unsigned long)align) == -1)
@@ -721,13 +803,13 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
 			 * This is a PT_NOTE section; loop through all the notes
 			 * This is a PT_NOTE section; loop through all the notes
 			 * in the section.
 			 * in the section.
 			 */
 			 */
-			if (lseek(fd, (off_t) ph_offset, SEEK_SET)
+			if (lseek(fd, (off_t)xph_offset, SEEK_SET)
 			    == (off_t)-1) {
 			    == (off_t)-1) {
 				file_badseek(ms);
 				file_badseek(ms);
 				return -1;
 				return -1;
 			}
 			}
-			bufsize = read(fd, nbuf, ((ph_filesz < sizeof(nbuf)) ?
-			    ph_filesz : sizeof(nbuf)));
+			bufsize = read(fd, nbuf, ((xph_filesz < sizeof(nbuf)) ?
+			    xph_filesz : sizeof(nbuf)));
 			if (bufsize == -1) {
 			if (bufsize == -1) {
 				file_badread(ms);
 				file_badread(ms);
 				return -1;
 				return -1;
@@ -737,7 +819,8 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
 				if (offset >= (size_t)bufsize)
 				if (offset >= (size_t)bufsize)
 					break;
 					break;
 				offset = donote(ms, nbuf, offset,
 				offset = donote(ms, nbuf, offset,
-				    (size_t)bufsize, class, swap, align);
+				    (size_t)bufsize, class, swap, align,
+				    &flags);
 				if (offset == 0)
 				if (offset == 0)
 					break;
 					break;
 			}
 			}
@@ -837,11 +920,7 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
 		if (getu16(swap, elfhdr.e_type) == ET_CORE) {
 		if (getu16(swap, elfhdr.e_type) == ET_CORE) {
 #ifdef ELFCORE
 #ifdef ELFCORE
 			if (dophn_core(ms, class, swap, fd,
 			if (dophn_core(ms, class, swap, fd,
-#ifdef USE_ARRAY_FOR_64BIT_TYPES
-			    (off_t)getu32(swap, elfhdr.e_phoff[1]),
-#else
-			    (off_t)getu64(swap, elfhdr.e_phoff),
-#endif
+			    (off_t)elf_getu64(swap, elfhdr.e_phoff),
 			    getu16(swap, elfhdr.e_phnum), 
 			    getu16(swap, elfhdr.e_phnum), 
 			    (size_t)getu16(swap, elfhdr.e_phentsize)) == -1)
 			    (size_t)getu16(swap, elfhdr.e_phentsize)) == -1)
 				return -1;
 				return -1;
@@ -851,22 +930,14 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
 		} else {
 		} else {
 			if (getu16(swap, elfhdr.e_type) == ET_EXEC) {
 			if (getu16(swap, elfhdr.e_type) == ET_EXEC) {
 				if (dophn_exec(ms, class, swap, fd,
 				if (dophn_exec(ms, class, swap, fd,
-#ifdef USE_ARRAY_FOR_64BIT_TYPES
-				    (off_t)getu32(swap, elfhdr.e_phoff[1]),
-#else
-				    (off_t)getu64(swap, elfhdr.e_phoff),
-#endif
+				    (off_t)elf_getu64(swap, elfhdr.e_phoff),
 				    getu16(swap, elfhdr.e_phnum), 
 				    getu16(swap, elfhdr.e_phnum), 
 				    (size_t)getu16(swap, elfhdr.e_phentsize))
 				    (size_t)getu16(swap, elfhdr.e_phentsize))
 				    == -1)
 				    == -1)
 					return -1;
 					return -1;
 			}
 			}
 			if (doshn(ms, class, swap, fd,
 			if (doshn(ms, class, swap, fd,
-#ifdef USE_ARRAY_FOR_64BIT_TYPES
-			    (off_t)getu32(swap, elfhdr.e_shoff[1]),
-#else
-			    (off_t)getu64(swap, elfhdr.e_shoff),
-#endif
+			    (off_t)elf_getu64(swap, elfhdr.e_shoff),
 			    getu16(swap, elfhdr.e_shnum),
 			    getu16(swap, elfhdr.e_shnum),
 			    (size_t)getu16(swap, elfhdr.e_shentsize)) == -1)
 			    (size_t)getu16(swap, elfhdr.e_shentsize)) == -1)
 				return -1;
 				return -1;

+ 1 - 0
src/readelf.h

@@ -50,6 +50,7 @@ typedef	uint32_t 	Elf64_Addr[2];
 typedef	uint32_t 	Elf64_Off[2];
 typedef	uint32_t 	Elf64_Off[2];
 typedef uint32_t 	Elf64_Xword[2];
 typedef uint32_t 	Elf64_Xword[2];
 #else
 #else
+#undef USE_ARRAY_FOR_64BIT_TYPES
 typedef	uint64_t 	Elf64_Addr;
 typedef	uint64_t 	Elf64_Addr;
 typedef	uint64_t 	Elf64_Off;
 typedef	uint64_t 	Elf64_Off;
 typedef uint64_t 	Elf64_Xword;
 typedef uint64_t 	Elf64_Xword;

+ 131 - 7
src/softmagic.c

@@ -39,13 +39,13 @@
 
 
 
 
 #ifndef	lint
 #ifndef	lint
-FILE_RCSID("@(#)$Id: softmagic.c,v 1.74 2005/07/29 17:57:20 christos Exp $")
+FILE_RCSID("@(#)$Id: softmagic.c,v 1.78 2006/03/12 22:09:33 christos Exp $")
 #endif	/* lint */
 #endif	/* lint */
 
 
 private int match(struct magic_set *, struct magic *, uint32_t,
 private int match(struct magic_set *, struct magic *, uint32_t,
     const unsigned char *, size_t);
     const unsigned char *, size_t);
 private int mget(struct magic_set *, union VALUETYPE *, const unsigned char *,
 private int mget(struct magic_set *, union VALUETYPE *, const unsigned char *,
-    struct magic *, size_t, int);
+    struct magic *, size_t, unsigned int);
 private int mcheck(struct magic_set *, union VALUETYPE *, struct magic *);
 private int mcheck(struct magic_set *, union VALUETYPE *, struct magic *);
 private int32_t mprint(struct magic_set *, union VALUETYPE *, struct magic *);
 private int32_t mprint(struct magic_set *, union VALUETYPE *, struct magic *);
 private void mdebug(uint32_t, const char *, size_t);
 private void mdebug(uint32_t, const char *, size_t);
@@ -272,6 +272,7 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
   	case FILE_LONG:
   	case FILE_LONG:
   	case FILE_BELONG:
   	case FILE_BELONG:
   	case FILE_LELONG:
   	case FILE_LELONG:
+  	case FILE_MELONG:
 		v = file_signextend(ms, m, p->l);
 		v = file_signextend(ms, m, p->l);
 		if (file_printf(ms, m->desc, (uint32_t) v) == -1)
 		if (file_printf(ms, m->desc, (uint32_t) v) == -1)
 			return -1;
 			return -1;
@@ -302,6 +303,7 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
 	case FILE_DATE:
 	case FILE_DATE:
 	case FILE_BEDATE:
 	case FILE_BEDATE:
 	case FILE_LEDATE:
 	case FILE_LEDATE:
+	case FILE_MEDATE:
 		if (file_printf(ms, m->desc, file_fmttime(p->l, 1)) == -1)
 		if (file_printf(ms, m->desc, file_fmttime(p->l, 1)) == -1)
 			return -1;
 			return -1;
 		t = m->offset + sizeof(time_t);
 		t = m->offset + sizeof(time_t);
@@ -310,6 +312,7 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
 	case FILE_LDATE:
 	case FILE_LDATE:
 	case FILE_BELDATE:
 	case FILE_BELDATE:
 	case FILE_LELDATE:
 	case FILE_LELDATE:
+	case FILE_MELDATE:
 		if (file_printf(ms, m->desc, file_fmttime(p->l, 0)) == -1)
 		if (file_printf(ms, m->desc, file_fmttime(p->l, 0)) == -1)
 			return -1;
 			return -1;
 		t = m->offset + sizeof(time_t);
 		t = m->offset + sizeof(time_t);
@@ -597,6 +600,41 @@ mconvert(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
 		if (m->mask_op & FILE_OPINVERSE)
 		if (m->mask_op & FILE_OPINVERSE)
 			p->l = ~p->l;
 			p->l = ~p->l;
 		return 1;
 		return 1;
+	case FILE_MELONG:
+	case FILE_MEDATE:
+	case FILE_MELDATE:
+		p->l = (int32_t)
+		    ((p->hl[1]<<24)|(p->hl[0]<<16)|(p->hl[3]<<8)|(p->hl[2]));
+		if (m->mask)
+			switch (m->mask_op&0x7F) {
+			case FILE_OPAND:
+				p->l &= m->mask;
+				break;
+			case FILE_OPOR:
+				p->l |= m->mask;
+				break;
+			case FILE_OPXOR:
+				p->l ^= m->mask;
+				break;
+			case FILE_OPADD:
+				p->l += m->mask;
+				break;
+			case FILE_OPMINUS:
+				p->l -= m->mask;
+				break;
+			case FILE_OPMULTIPLY:
+				p->l *= m->mask;
+				break;
+			case FILE_OPDIVIDE:
+				p->l /= m->mask;
+				break;
+			case FILE_OPMODULO:
+				p->l %= m->mask;
+				break;
+			}
+		if (m->mask_op & FILE_OPINVERSE)
+			p->l = ~p->l;
+		return 1;
 	case FILE_REGEX:
 	case FILE_REGEX:
 	case FILE_SEARCH:
 	case FILE_SEARCH:
 		return 1;
 		return 1;
@@ -626,6 +664,11 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
 		 * (starting at 1), not as bytes-from start-of-file
 		 * (starting at 1), not as bytes-from start-of-file
 		 */
 		 */
 		char *b, *c, *last = NULL;
 		char *b, *c, *last = NULL;
+		if (s == NULL) {
+			p->search.buflen = 0;
+			p->search.buf = NULL;
+			return 0;
+		}
 		if ((p->search.buf = strdup((const char *)s)) == NULL) {
 		if ((p->search.buf = strdup((const char *)s)) == NULL) {
 			file_oomem(ms);
 			file_oomem(ms);
 			return -1;
 			return -1;
@@ -644,8 +687,8 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
 
 
 	if (indir == 0 && (type == FILE_BESTRING16 || type == FILE_LESTRING16))
 	if (indir == 0 && (type == FILE_BESTRING16 || type == FILE_LESTRING16))
 	{
 	{
-		const char *src = s + offset;
-		const char *esrc = s + nbytes;
+		const unsigned char *src = s + offset;
+		const unsigned char *esrc = s + nbytes;
 		char *dst = p->s, *edst = &p->s[sizeof(p->s) - 1];
 		char *dst = p->s, *edst = &p->s[sizeof(p->s) - 1];
 
 
 		if (type == FILE_BESTRING16)
 		if (type == FILE_BESTRING16)
@@ -679,13 +722,14 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
 	 * might even cause problems
 	 * might even cause problems
 	 */
 	 */
 	if (nbytes < sizeof(*p))
 	if (nbytes < sizeof(*p))
-		(void)memset(((char *)p) + nbytes, '\0', sizeof(*p) - nbytes);
+		(void)memset(((char *)(void *)p) + nbytes, '\0',
+		    sizeof(*p) - nbytes);
 	return 0;
 	return 0;
 }
 }
 
 
 private int
 private int
 mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
 mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
-    struct magic *m, size_t nbytes, int cont_level)
+    struct magic *m, size_t nbytes, unsigned int cont_level)
 {
 {
 	uint32_t offset = m->offset;
 	uint32_t offset = m->offset;
 
 
@@ -701,7 +745,7 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
 		int off = m->in_offset;
 		int off = m->in_offset;
 		if (m->in_op & FILE_OPINDIRECT) {
 		if (m->in_op & FILE_OPINDIRECT) {
 			const union VALUETYPE *q =
 			const union VALUETYPE *q =
-			    ((const union VALUETYPE *)(s + offset + off));
+			    ((const void *)(s + offset + off));
 			switch (m->in_type) {
 			switch (m->in_type) {
 			case FILE_BYTE:
 			case FILE_BYTE:
 				off = q->b;
 				off = q->b;
@@ -726,6 +770,10 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
 				off = (int32_t)((q->hl[3]<<24)|(q->hl[2]<<16)|
 				off = (int32_t)((q->hl[3]<<24)|(q->hl[2]<<16)|
 						 (q->hl[1]<<8)|(q->hl[0]));
 						 (q->hl[1]<<8)|(q->hl[0]));
 				break;
 				break;
+			case FILE_MELONG:
+				off = (int32_t)((q->hl[1]<<24)|(q->hl[0]<<16)|
+						 (q->hl[3]<<8)|(q->hl[2]));
+				break;
 			}
 			}
 		}
 		}
 		switch (m->in_type) {
 		switch (m->in_type) {
@@ -1043,6 +1091,76 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
 			if (m->in_op & FILE_OPINVERSE)
 			if (m->in_op & FILE_OPINVERSE)
 				offset = ~offset;
 				offset = ~offset;
 			break;
 			break;
+		case FILE_MELONG:
+			if (nbytes < (offset + 4))
+				return 0;
+			if (off) {
+				switch (m->in_op & 0x7F) {
+				case FILE_OPAND:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) &
+						 off;
+					break;
+				case FILE_OPOR:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) |
+						 off;
+					break;
+				case FILE_OPXOR:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) ^
+						 off;
+					break;
+				case FILE_OPADD:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) +
+						 off;
+					break;
+				case FILE_OPMINUS:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) -
+						 off;
+					break;
+				case FILE_OPMULTIPLY:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) *
+						 off;
+					break;
+				case FILE_OPDIVIDE:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) /
+						 off;
+					break;
+				case FILE_OPMODULO:
+					offset = (int32_t)((p->hl[1]<<24)|
+							 (p->hl[0]<<16)|
+							 (p->hl[3]<<8)|
+							 (p->hl[2])) %
+						 off;
+					break;
+				}
+			} else
+				offset = (int32_t)((p->hl[1]<<24)|
+						 (p->hl[0]<<16)|
+						 (p->hl[3]<<8)|
+						 (p->hl[2]));
+			if (m->in_op & FILE_OPINVERSE)
+				offset = ~offset;
+			break;
 		case FILE_LONG:
 		case FILE_LONG:
 			if (nbytes < (offset + 4))
 			if (nbytes < (offset + 4))
 				return 0;
 				return 0;
@@ -1116,12 +1234,15 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
 		case FILE_LONG:
 		case FILE_LONG:
 		case FILE_BELONG:
 		case FILE_BELONG:
 		case FILE_LELONG:
 		case FILE_LELONG:
+		case FILE_MELONG:
 		case FILE_DATE:
 		case FILE_DATE:
 		case FILE_BEDATE:
 		case FILE_BEDATE:
 		case FILE_LEDATE:
 		case FILE_LEDATE:
+		case FILE_MEDATE:
 		case FILE_LDATE:
 		case FILE_LDATE:
 		case FILE_BELDATE:
 		case FILE_BELDATE:
 		case FILE_LELDATE:
 		case FILE_LELDATE:
+		case FILE_MELDATE:
 			if (nbytes < (offset + 4))
 			if (nbytes < (offset + 4))
 				return 0;
 				return 0;
 			break;
 			break;
@@ -1180,12 +1301,15 @@ mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
 	case FILE_LONG:
 	case FILE_LONG:
 	case FILE_BELONG:
 	case FILE_BELONG:
 	case FILE_LELONG:
 	case FILE_LELONG:
+	case FILE_MELONG:
 	case FILE_DATE:
 	case FILE_DATE:
 	case FILE_BEDATE:
 	case FILE_BEDATE:
 	case FILE_LEDATE:
 	case FILE_LEDATE:
+	case FILE_MEDATE:
 	case FILE_LDATE:
 	case FILE_LDATE:
 	case FILE_BELDATE:
 	case FILE_BELDATE:
 	case FILE_LELDATE:
 	case FILE_LELDATE:
+	case FILE_MELDATE:
 		v = p->l;
 		v = p->l;
 		break;
 		break;