This commit was generated by cvs2svn to compensate for changes in r169942,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
David E. O'Brien 2007-05-24 16:12:23 +00:00
commit bb5e144237
49 changed files with 2066 additions and 1880 deletions

View File

@ -1,3 +1,89 @@
2006-12-11 16:49 Christos Zoulas <christos@zoulas.com>
* fix byteswapping issue
* report the number of bytes we tried to
allocate when allocation fails
* add a few missed cases in the strength routine
2006-12-08 16:32 Christos Zoulas <christos@zoulas.com>
* store and print the line number of the magic
entry for debugging.
* if the magic entry did not print anything,
don't treat it as a match
* change the magic strength algorithm to take
into account the relationship op.
* fix a bug in search where we could accidentally
return a match.
* propagate the error return from match to
file_softmagic.
2006-11-25 13:35 Christos Zoulas <christos@zoulas.com>
* Don't store the current offset in the magic
struct, because it needs to be restored and
it was not done properly all the time. Bug
found by: Arkadiusz Miskiewicz
* Fix problem in the '\0' separator; and don't
print it as an additional separator; print
it as the only separator.
2006-11-17 10:51 Christos Zoulas <christos@zoulas.com>
* Added a -0 option to print a '\0' separator
Etienne Buira <etienne.buira@free.fr>
2006-10-31 15:14 Christos Zoulas <christos@zoulas.com>
* Check offset before copying (Mike Frysinger)
* merge duplicated code
* add quad date support
* make sure that we nul terminate desc (Ryoji Kanai)
* don't process elf notes multiple times
* allow -z to report empty compressed files
* use calloc to initialize the ascii buffers (Jos van den Oever)
2006-06-08 11:11 Christos Zoulas <christos@zoulas.com>
* QNX fixes (Mike Gorchak)
* Add quad support.
* FIFO checks (Dr. Werner Fink)
* Linux ELF fixes (Dr. Werner Fink)
* Magic format checks (Dr. Werner Fink)
* Magic format function improvent (Karl Chen)
2006-05-03 11:11 Christos Zoulas <christos@zoulas.com>
* Pick up some elf changes and some constant fixes from SUSE
* Identify gnu tar vs. posix tar
* When keep going, don't print spurious newlines (Radek Vokál)
2006-04-01 12:02 Christos Zoulas <christos@zoulas.com>
* Use calloc instead of malloc (Mike Frysinger)
* Fix configure script to detect wctypes.h (Mike Frysinger)
2006-03-02 16:06 Christos Zoulas <christos@zoulas.com>
* Print empty if the file is (Mike Frysinger)

View File

@ -1,7 +1,7 @@
$Id: LEGAL.NOTICE,v 1.14 2004/09/11 19:15:56 christos Exp $
$Id: LEGAL.NOTICE,v 1.15 2006/05/03 18:48:33 christos Exp $
Copyright (c) Ian F. Darwin 1986, 1987, 1989, 1990, 1991, 1992, 1994, 1995.
Software written by Ian F. Darwin and others;
maintained 1994-2004 Christos Zoulas.
maintained 1994- Christos Zoulas.
This software is not subject to any export provision of the United States
Department of Commerce, and may be exported to any country or planet.

View File

@ -1,4 +1,4 @@
$Id: MAINT,v 1.5 2003/03/23 04:36:37 christos Exp $
$Id: MAINT,v 1.7 2006/06/01 18:19:41 ian Exp $
Maintenance notes:
@ -18,16 +18,38 @@ short.
- Do not distribute changed versions.
People trying to be helpful occasionally put up their hacked versions
of the file command for FTP, then the "archie" server finds and publishes
the hacked version, and people all over the world get copies of it.
Within a day or two I am getting email from around the world
asking me why "my" file command won't compile!!! Needless to say this
detracts from the limited time I have available to work on the actual
software. Therefore I ask you again to please NOT distribute
your changed version.
of the file command for anonymous FTP, and people all over the
world get copies of the hacked versions. Within a day or two I am
getting email from around the world asking me why "my" file command
won't compile!!! Needless to say this detracts from the limited
time I have available to work on the actual software. Therefore I
ask you again to please NOT distribute your changed version. If
you need to make changes, please add a patch file next to the
distribution tar, and a README file that clearly explains what you
are trying to fix.
Thank you for your assistance and cooperation.
Code Overview
This is a rough idea of the control flow from the main program:
file.c main()
file.c process (called for each file)
printf file name
magic.c magic_file()
fsmagic.c file_fsmagic()
(handles statbuf modes for DEV)
(handles statbuf modes for executable &c.
reads data from file.
funcs.c: file_buffer()
compress.c file_zmagic()
is_tar.c file_is_tar()
softmagic.c file_softmagic()
match() - looks for match against main magic database
ascmagic.c file_ascmagic()
readelf.c file_tryelf()
"unknown"
Christos Zoulas
christos@astron.com

View File

@ -509,6 +509,12 @@
# RAR archiver (Greg Roelofs, newt@uchicago.edu)
0 string Rar! RAR archive data,
>44 byte x v%0x,
>10 byte >0 flags:
>>10 byte &0x01 Archive volume,
>>10 byte &0x02 Commented,
>>10 byte &0x04 Locked,
>>10 byte &0x08 Solid,
>>10 byte &0x20 Authenticated,
>35 byte 0 os: MS-DOS
>35 byte 1 os: OS/2
>35 byte 2 os: Win32
@ -530,6 +536,8 @@
>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
>0x161 string WINZIP Zip archive data, WinZIP self-extracting
# OpenOffice.org / KOffice / StarOffice documents
# From: Abel Cheung <abel@oaka.org>
@ -700,3 +708,18 @@
# EET archive
# From: Tilman Sauerbeck <tilman@code-monkey.de>
0 belong 0x1ee7ff00 EET archive
# rzip archives
0 string RZIP rzip compressed data
>4 byte x - version %d
>5 byte x \b.%d
>6 belong x (%d bytes)
# From: "Robert Dale" <robdale@gmail.com>
0 belong 123 dar archive,
>4 belong x label "%.8x
>>8 belong x %.8x
>>>12 beshort x %.4x"
>14 byte 0x54 end slice
>14 beshort 0x4e4e multi-part
>14 beshort 0x4e53 multi-part, with -S

View File

@ -25,7 +25,7 @@
>12 belong 19 16-bit linear compressed,
>12 belong 20 16-bit linear with emphasis and compression,
>12 belong 21 Music kit DSP commands,
>12 belong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
>12 belong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),
>12 belong 24 compressed (8-bit CCITT G.722 ADPCM)
>12 belong 25 compressed (3-bit CCITT G.723.3 ADPCM),
>12 belong 26 compressed (5-bit CCITT G.723.5 ADPCM),
@ -55,7 +55,7 @@
>12 belong 19 16-bit linear compressed,
>12 belong 20 16-bit linear with emphasis and compression,
>12 belong 21 Music kit DSP commands,
>12 lelong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
>12 lelong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),
>12 belong 24 compressed (8-bit CCITT G.722 ADPCM)
>12 belong 25 compressed (3-bit CCITT G.723.3 ADPCM),
>12 belong 26 compressed (5-bit CCITT G.723.5 ADPCM),
@ -221,9 +221,41 @@
# SGI SoundTrack <mpruett@sgi.com>
0 string _SGI_SoundTrack SGI SoundTrack project file
# ID3 version 2 tags <waschk@informatik.uni-rostock.de>
0 string ID3 MP3 file with ID3 version 2.
0 string ID3 Audio file with ID3 version 2
>3 ubyte <0xff \b%d.
>4 ubyte <0xff \b%d tag
>2584 string fLaC \b, FLAC encoding
>>2588 byte&0x7f >0 \b, unknown version
>>2588 byte&0x7f 0 \b
# some common bits/sample values
>>>2600 beshort&0x1f0 0x030 \b, 4 bit
>>>2600 beshort&0x1f0 0x050 \b, 6 bit
>>>2600 beshort&0x1f0 0x070 \b, 8 bit
>>>2600 beshort&0x1f0 0x0b0 \b, 12 bit
>>>2600 beshort&0x1f0 0x0f0 \b, 16 bit
>>>2600 beshort&0x1f0 0x170 \b, 24 bit
>>>2600 byte&0xe 0x0 \b, mono
>>>2600 byte&0xe 0x2 \b, stereo
>>>2600 byte&0xe 0x4 \b, 3 channels
>>>2600 byte&0xe 0x6 \b, 4 channels
>>>2600 byte&0xe 0x8 \b, 5 channels
>>>2600 byte&0xe 0xa \b, 6 channels
>>>2600 byte&0xe 0xc \b, 7 channels
>>>2600 byte&0xe 0xe \b, 8 channels
# some common sample rates
>>>2597 belong&0xfffff0 0x0ac440 \b, 44.1 kHz
>>>2597 belong&0xfffff0 0x0bb800 \b, 48 kHz
>>>2597 belong&0xfffff0 0x07d000 \b, 32 kHz
>>>2597 belong&0xfffff0 0x056220 \b, 22.05 kHz
>>>2597 belong&0xfffff0 0x05dc00 \b, 24 kHz
>>>2597 belong&0xfffff0 0x03e800 \b, 16 kHz
>>>2597 belong&0xfffff0 0x02b110 \b, 11.025 kHz
>>>2597 belong&0xfffff0 0x02ee00 \b, 12 kHz
>>>2597 belong&0xfffff0 0x01f400 \b, 8 kHz
>>>2597 belong&0xfffff0 0x177000 \b, 96 kHz
>>>2597 belong&0xfffff0 0x0fa000 \b, 64 kHz
>>>2601 byte&0xf >0 \b, >4G samples
>2584 string !fLaC \b, MP3 encoding
# NSF (NES sound file) magic
0 string NESM\x1a NES Sound File
@ -443,10 +475,6 @@
# From: Emanuel Haupt <ehaupt@critical.ch>
0 string ZXAYEMUL Spectrum 128 tune
# From: Alex Beregszaszi <alex@fsn.hu>
0 string MP+ Musepack
>3 byte&0x0f x SV%d
0 string \0BONK BONK,
#>5 byte x version %d
>14 byte x %d channel(s),
@ -479,3 +507,41 @@
0 string \[playlist\] PLS playlist
# licq.conf
1 string \[licq\] LICQ configuration file
# Atari ST audio files by Dirk Jagdmann <doj@cubic.org>
0 string ICE! SNDH Atari ST music
0 string SC68\ Music-file\ /\ (c)\ (BeN)jami sc68 Atari ST music
# musepak support From: "Jiri Pejchal" <jiri.pejchal@gmail.com>
0 string MP+ Musepack audio
>3 byte 255 \b, SV pre8
>3 byte&0xF 0x6 \b, SV 6
>3 byte&0xF 0x8 \b, SV 8
>3 byte&0xF 0x7 \b, SV 7
>>3 byte&0xF0 0x0 \b.0
>>3 byte&0xF0 0x10 \b.1
>>3 byte&0xF0 240 \b.15
>>10 byte&0xF0 0x0 \b, no profile
>>10 byte&0xF0 0x10 \b, profile 'Unstable/Experimental'
>>10 byte&0xF0 0x50 \b, quality 0
>>10 byte&0xF0 0x60 \b, quality 1
>>10 byte&0xF0 0x70 \b, quality 2 (Telephone)
>>10 byte&0xF0 0x80 \b, quality 3 (Thumb)
>>10 byte&0xF0 0x90 \b, quality 4 (Radio)
>>10 byte&0xF0 0xA0 \b, quality 5 (Standard)
>>10 byte&0xF0 0xB0 \b, quality 6 (Xtreme)
>>10 byte&0xF0 0xC0 \b, quality 7 (Insane)
>>10 byte&0xF0 0xD0 \b, quality 8 (BrainDead)
>>10 byte&0xF0 0xE0 \b, quality 9
>>10 byte&0xF0 0xF0 \b, quality 10
>>27 byte 0x0 \b, Buschmann 1.7.0-9, Klemm 0.90-1.05
>>27 byte 102 \b, Beta 1.02
>>27 byte 104 \b, Beta 1.04
>>27 byte 105 \b, Alpha 1.05
>>27 byte 106 \b, Beta 1.06
>>27 byte 110 \b, Release 1.1
>>27 byte 111 \b, Alpha 1.11
>>27 byte 112 \b, Beta 1.12
>>27 byte 113 \b, Alpha 1.13
>>27 byte 114 \b, Beta 1.14
>>27 byte 115 \b, Alpha 1.15

View File

@ -35,6 +35,7 @@
>>30 string \120\104 DGNFile
>>30 string \172\104 DGNFile
>>30 string \172\105 DGNFile
>>30 string \172\106 DGNFile
>>30 string \234\106 DGNFile
>>30 string \273\105 DGNFile
>>30 string \306\106 DGNFile
@ -52,3 +53,17 @@
0 string AC1012 AutoCad (release 12)
0 string AC1013 AutoCad (release 13)
0 string AC1014 AutoCad (release 14)
# CAD: file(1) magic for computer aided design files
# Phillip Griffith <phillip dot griffith at gmail dot com>
# AutoCAD magic taken from the Open Design Alliance's OpenDWG specifications.
#
0 belong 0x08051700 Bentley/Intergraph MicroStation DGN cell library
0 belong 0x0809fe02 Bentley/Intergraph MicroStation DGN vector CAD
0 belong 0xc809fe02 Bentley/Intergraph MicroStation DGN vector CAD
0 beshort 0x0809 Bentley/Intergraph MicroStation
>0x02 byte 0xfe
>>0x04 beshort 0x1800 CIT raster CAD
0 string AC1012 AutoDesk AutoCAD R13
0 string AC1014 AutoDesk AutoCAD R14
0 string AC1015 AutoDesk AutoCAD R2000

View File

@ -0,0 +1,21 @@
#------------------------------------------------------------------------------
# Cafe Babes unite!
#
# Since Java bytecode and Mach-O fat-files have the same magic number, the test
# must be performed in the same "magic" sequence to get both right. The long
# at offset 4 in a mach-O fat file tells the number of architectures; the short at
# offset 4 in a Java bytecode file is the JVM minor version and the
# short at offset 6 is the JVM major version. Since there are only
# only 18 labeled Mach-O architectures at current, and the first released
# Java class format was version 43.0, we can safely choose any number
# between 18 and 39 to test the number of architectures against
# (and use as a hack). Let's not use 18, because the Mach-O people
# might add another one or two as time goes by...
#
0 belong 0xcafebabe
>4 belong >30 compiled Java class data,
>>6 beshort x version %d.
>>4 beshort x \b%d
>4 belong 1 Mach-O fat file with 1 architecture
>4 belong >1
>>4 belong <20 Mach-O fat file with %ld architectures

View File

@ -52,3 +52,5 @@
0 string/b #!\ /usr/bin/php PHP script text executable
0 string Zend\x00 PHP script Zend Optimizer data
0 string \$! DCL command file

View File

@ -11,3 +11,6 @@
# Vi IMproved Encrypted file
# by David Necas <yeti@physics.muni.cz>
0 string VimCrypt~ Vim encrypted file data
# Vi IMproved Swap file
# by Sven Wegener <swegener@gentoo.org>
0 string b0VIM\ Vim swap file, version %s

View File

@ -84,21 +84,22 @@
>>18 leshort 40 ARM,
>>18 leshort 41 Alpha,
>>18 leshort 0xa390 IBM S/390 (obsolete),
>>18 leshort 42 Hitachi SH,
>>18 leshort 42 Renesas SH,
>>18 leshort 43 SPARC V9 - invalid byte order,
>>18 leshort 44 Siemens Tricore Embedded Processor,
>>18 leshort 45 Argonaut RISC Core, Argonaut Technologies Inc.,
>>18 leshort 46 Hitachi H8/300,
>>18 leshort 47 Hitachi H8/300H,
>>18 leshort 48 Hitachi H8S,
>>18 leshort 49 Hitachi H8/500,
>>18 leshort 46 Renesas H8/300,
>>18 leshort 47 Renesas H8/300H,
>>18 leshort 48 Renesas H8S,
>>18 leshort 49 Renesas H8/500,
>>18 leshort 50 IA-64,
>>18 leshort 51 Stanford MIPS-X,
>>18 leshort 52 Motorola Coldfire,
>>18 leshort 53 Motorola M68HC12,
>>18 leshort 62 AMD x86-64,
>>18 leshort 62 x86-64,
>>18 leshort 75 Digital VAX,
>>18 leshort 88 Renesas M32R,
>>18 leshort 94 Tensilica Xtensa,
>>18 leshort 97 NatSemi 32k,
>>18 leshort 0x9026 Alpha (unofficial),
>>20 lelong 0 invalid version
@ -176,14 +177,14 @@
>>18 beshort 39 Motorola RCE,
>>18 beshort 40 ARM,
>>18 beshort 41 Alpha,
>>18 beshort 42 Hitachi SH,
>>18 beshort 42 Renesas SH,
>>18 beshort 43 SPARC V9,
>>18 beshort 44 Siemens Tricore Embedded Processor,
>>18 beshort 45 Argonaut RISC Core, Argonaut Technologies Inc.,
>>18 beshort 46 Hitachi H8/300,
>>18 beshort 47 Hitachi H8/300H,
>>18 beshort 48 Hitachi H8S,
>>18 beshort 49 Hitachi H8/500,
>>18 beshort 46 Renesas H8/300,
>>18 beshort 47 Renesas H8/300H,
>>18 beshort 48 Renesas H8S,
>>18 beshort 49 Renesas H8/500,
>>18 beshort 50 IA-64,
>>18 beshort 51 Stanford MIPS-X,
>>18 beshort 52 Motorola Coldfire,
@ -191,6 +192,7 @@
>>18 beshort 73 Cray NV1,
>>18 beshort 75 Digital VAX,
>>18 beshort 88 Renesas M32R,
>>18 beshort 94 Tensilica Xtensa,
>>18 beshort 97 NatSemi 32k,
>>18 beshort 0x9026 Alpha (unofficial),
>>18 beshort 0xa390 IBM S/390 (obsolete),
@ -215,5 +217,8 @@
>>7 byte 10 (Tru64)
>>7 byte 11 (Novell Modesto)
>>7 byte 12 (OpenBSD)
# VMS Itanium added by gerardo.cacciari@gmail.com
>8 string \2
>>7 byte 13 (OpenVMS)
>>7 byte 97 (ARM)
>>7 byte 255 (embedded)

View File

@ -658,7 +658,7 @@
0x18b string OS/2 OS/2 Boot Manager
9564 lelong 0x00011954 Unix Fast File system (little-endian),
9564 lelong 0x00011954 Unix Fast File system [v1] (little-endian),
>8404 string x last mounted on %s,
#>9504 ledate x last checked at %s,
>8224 ledate x last written at %s,
@ -674,8 +674,48 @@
>8320 lelong 0 TIME optimization
>8320 lelong 1 SPACE optimization
9564 belong 0x00011954 Unix Fast File system (big-endian),
>7168 long 0x4c41424c Apple UFS Volume
42332 lelong 0x19540119 Unix Fast File system [v2] (little-endian)
>&-1164 string x last mounted on %s,
>&-696 string >\0 volume name %s,
>&-304 leqldate x last written at %s,
>&-1167 byte x clean flag %d,
>&-1168 byte x readonly flag %d,
>&-296 lequad x number of blocks %lld,
>&-288 lequad x number of data blocks %lld,
>&-1332 lelong x number of cylinder groups %d,
>&-1328 lelong x block size %d,
>&-1324 lelong x fragment size %d,
>&-180 lelong x average file size %d,
>&-176 lelong x average number of files in dir %d,
>&-272 lequad x pending blocks to free %lld,
>&-264 lelong x pending inodes to free %ld,
>&-664 lequad x system-wide uuid %0llx,
>&-1316 lelong x minimum percentage of free blocks %d,
>&-1248 lelong 0 TIME optimization
>&-1248 lelong 1 SPACE optimization
66908 lelong 0x19540119 Unix Fast File system [v2] (little-endian)
>&-1164 string x last mounted on %s,
>&-696 string >\0 volume name %s,
>&-304 leqldate x last written at %s,
>&-1167 byte x clean flag %d,
>&-1168 byte x readonly flag %d,
>&-296 lequad x number of blocks %lld,
>&-288 lequad x number of data blocks %lld,
>&-1332 lelong x number of cylinder groups %d,
>&-1328 lelong x block size %d,
>&-1324 lelong x fragment size %d,
>&-180 lelong x average file size %d,
>&-176 lelong x average number of files in dir %d,
>&-272 lequad x pending blocks to free %lld,
>&-264 lelong x pending inodes to free %ld,
>&-664 lequad x system-wide uuid %0llx,
>&-1316 lelong x minimum percentage of free blocks %d,
>&-1248 lelong 0 TIME optimization
>&-1248 lelong 1 SPACE optimization
9564 belong 0x00011954 Unix Fast File system [v1] (big-endian),
>7168 belong 0x4c41424c Apple UFS Volume
>>7186 string x named %s,
>>7176 belong x volume label version %d,
>>7180 bedate x created on %s,
@ -694,6 +734,46 @@
>8320 belong 0 TIME optimization
>8320 belong 1 SPACE optimization
42332 belong 0x19540119 Unix Fast File system [v2] (big-endian)
>&-1164 string x last mounted on %s,
>&-696 string >\0 volume name %s,
>&-304 beqldate x last written at %s,
>&-1167 byte x clean flag %d,
>&-1168 byte x readonly flag %d,
>&-296 bequad x number of blocks %lld,
>&-288 bequad x number of data blocks %lld,
>&-1332 belong x number of cylinder groups %d,
>&-1328 belong x block size %d,
>&-1324 belong x fragment size %d,
>&-180 belong x average file size %d,
>&-176 belong x average number of files in dir %d,
>&-272 bequad x pending blocks to free %lld,
>&-264 belong x pending inodes to free %ld,
>&-664 bequad x system-wide uuid %0llx,
>&-1316 belong x minimum percentage of free blocks %d,
>&-1248 belong 0 TIME optimization
>&-1248 belong 1 SPACE optimization
66908 belong 0x19540119 Unix Fast File system [v2] (big-endian)
>&-1164 string x last mounted on %s,
>&-696 string >\0 volume name %s,
>&-304 beqldate x last written at %s,
>&-1167 byte x clean flag %d,
>&-1168 byte x readonly flag %d,
>&-296 bequad x number of blocks %lld,
>&-288 bequad x number of data blocks %lld,
>&-1332 belong x number of cylinder groups %d,
>&-1328 belong x block size %d,
>&-1324 belong x fragment size %d,
>&-180 belong x average file size %d,
>&-176 belong x average number of files in dir %d,
>&-272 bequad x pending blocks to free %lld,
>&-264 belong x pending inodes to free %ld,
>&-664 bequad x system-wide uuid %0llx,
>&-1316 belong x minimum percentage of free blocks %d,
>&-1248 belong 0 TIME optimization
>&-1248 belong 1 SPACE optimization
# ext2/ext3 filesystems - Andreas Dilger <adilger@turbolabs.com>
0x438 leshort 0xEF53 Linux
>0x44c lelong x rev %d
@ -783,7 +863,16 @@
#
# CDROM Filesystems
32769 string CD001 ISO 9660 CD-ROM filesystem data
# Modified for UDF by gerardo.cacciari@gmail.com
32769 string CD001
>38913 string !NSR0 ISO 9660 CD-ROM filesystem data
>38913 string NSR01 UDF filesystem data (version 1.0)
>38913 string NSR02 UDF filesystem data (version 1.5)
>38913 string NSR03 UDF filesystem data (version 2.0)
>38913 string >NSR03 UDF filesystem data (unknown version,
>>38917 byte x id 'NSR0%c')
>38913 string <NSR01 UDF filesystem data (unknown version,
>>38917 byte x id 'NSR0%c')
# "application id" which appears to be used as a volume label
>32808 string >\0 '%s'
>34816 string \000CD001\001EL\ TORITO\ SPECIFICATION (bootable)
@ -834,21 +923,25 @@
0 string VoIP\ Startup\ and Aculab VoIP firmware
>35 string x format %s
# PPCBoot image file
# u-boot/PPCBoot image file
# From: Mark Brown <broonie@sirena.org.uk>
0 belong 0x27051956 PPCBoot image
0 belong 0x27051956 u-boot/PPCBoot image
>4 string PPCBoot
>>12 string x version %s
# JFFS2 file system
0 leshort 0x1984 Linux old jffs2 filesystem data little endian
0 lelong 0xe0011985 Linux jffs2 filesystem data little endian
0 leshort 0x1985 Linux jffs2 filesystem data little endian
# Squashfs
0 string sqsh Squashfs filesystem, big endian,
>28 beshort x version %d.
>30 beshort x \b%d,
>8 belong x %d bytes,
>28 beshort <3
>>8 belong x %d bytes,
>28 beshort >2
>>63 bequad x %lld bytes,
#>>67 belong x %d bytes,
>4 belong x %d inodes,
>28 beshort <2
>>32 beshort x blocksize: %d bytes,
@ -858,7 +951,11 @@
0 string hsqs Squashfs filesystem, little endian,
>28 leshort x version %d.
>30 leshort x \b%d,
>8 lelong x %d bytes,
>28 leshort <3
>>8 lelong x %d bytes,
>28 leshort >2
>>63 lequad x %lld bytes,
#>>63 lelong x %d bytes,
>4 lelong x %d inodes,
>28 leshort <2
>>32 leshort x blocksize: %d bytes,
@ -866,6 +963,8 @@
>>51 lelong x blocksize: %d bytes,
>39 ledate x created: %s
0 string td\000 floppy image data (TeleDisk)
# AFS Dump Magic
# From: Ty Sarna <tsarna@sarna.org>
0 string \x01\xb3\xa1\x13\x22 AFS Dump
@ -879,3 +978,11 @@
>>>>>>>>&4 bedate x on: %s
>>>>>>>>&0 bedate =0 full dump
>>>>>>>>&0 bedate !0 incremental since: %s
# VMS backup savesets - gerardo.cacciari@gmail.com
# had to comment out GEM Image and G3 raw data entries due to conflict
#0 byte x
#>(0.s+16) string \x01\x01
#>>&(&0.b+8) byte 0x42 OpenVMS backup saveset data
#>>>40 lelong x (block size %d
#>>>49 string >\0 original name '%s')

View File

@ -267,9 +267,6 @@
#
0 beshort 0x1010 PEX Binary Archive
# Visio drawings
03000 string Visio\ (TM)\ Drawing %s
# Tgif files
0 string \%TGIF\ x Tgif file version %s
@ -526,3 +523,8 @@
# specifications at http://hdf.ncsa.uiuc.edu/
0 belong 0x0e031301 Hierarchical Data Format (version 4) data
0 string \211HDF\r\n\032 Hierarchical Data Format (version 5) data
# From: Tobias Burnus <burnus@net-b.de>
# Xara (for a while: Corel Xara) is a graphic package, see
# http://www.xara.com/ for Windows and as GPL application for
0 string XARA\243\243 Xara graphics file

View File

@ -1,10 +1,7 @@
#------------------------------------------------------------
# Java ByteCode
# From Larry Schwimmer (schwim@cs.stanford.edu)
# Handled in Mach now
#0 belong 0xcafebabe compiled Java class data,
#>6 beshort x version %d.
#>4 beshort x \b%d
# Java ByteCode and Mach-O binaries (e.g., Mac OS X) use the
# same magic number, 0xcafebabe, so they are both handled
# in the entry called "cafebabe".
#------------------------------------------------------------
# Java serialization
# From Martin Pool (m.pool@pharos.com.au)

View File

@ -229,3 +229,10 @@
0x618 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
>(0x614.l+0x600) string >\0 , UUID: %s
# SE Linux policy database
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

View File

@ -1,26 +1,9 @@
#------------------------------------------------------------------------------
# mach file description
#
# Since Java bytecode and Mach-O fat-files have the same magic number the test
# must be preformed in the same "magic" sequence to get both right. The long
# at offset 4 in a fat file tells the number of architectures. The short at
# offset 4 in a Java bytecode file is the compiler minor version and the
# short at offset 6 is the compiler major version. Since there are only
# only 18 labeled Mach-O architectures at current, and the first released
# Java class format was version 43.0, we can safely choose any number
# between 18 and 39 to test the number of architectures against
# (and use as a hack).
#
0 belong 0xcafebabe
>4 belong >19 compiled Java class data,
>>6 beshort x version %d.
>>4 beshort x \b%d
>4 belong 1 Mach-O fat file with 1 architecture
>4 belong >1
# The following is necessary to support java class files.
>>4 belong <20 Mach-O fat file with %ld architectures
#>>4 belong <0xffff Mach-O fat file with %ld architectures
#
#------------------------------------------------------------
# Mach has two magic numbers, 0xcafebabe and 0xfeedface.
# Unfortunately the first, cafebabe, is shared with
# Java ByteCode, so they are both handled in the file "cafebabe".
# The "feedface" ones are handled herein.
#------------------------------------------------------------
0 lelong&0xfeffffff 0xfeedface Mach-O
>0 byte 0xcf 64-bit
>12 lelong 1 object

View File

@ -8,3 +8,6 @@
# From: Alex Beregszaszi <alex@fsn.hu>
4 string gtktalog GNOME Catalogue (gtktalog)
>13 string >\0 version %s
# From: Tomasz Trojanowski <tomek@uninet.com.pl>
0 search/80 .la\ -\ a\ libtool\ library\ file libtool library file

View File

@ -86,6 +86,7 @@
>>>>(0x3c.l+4) leshort 0x290 PA-RISC
>>>>(0x3c.l+22) leshort&0x0100 >0 32-bit
>>>>(0x3c.l+22) leshort&0x1000 >0 system file
>>>>(0x3c.l+232) lelong >0 Mono/.Net assembly
>>>>(0x3c.l+0xf8) string UPX0 \b, UPX compressed
>>>>(0x3c.l+0xf8) search/0x140 PEC2 \b, PECompact2 compressed
@ -358,6 +359,8 @@
>30 byte 12 (4kB sectors)
# Popular applications
# False positive with PPT
#0 string \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF Microsoft Installer
2080 string Microsoft\ Word\ 6.0\ Document %s
2080 string Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Word)
@ -368,7 +371,6 @@
0 string PO^Q` Microsoft Word 6.0 Document
#
0 string \376\067\0\043 Microsoft Office Document
0 string \320\317\021\340\241\261\032\341 Microsoft Office Document
0 string \333\245-\0\0\0 Microsoft Office Document
#
2080 string Microsoft\ Excel\ 5.0\ Worksheet %s
@ -590,10 +592,16 @@
>>(64.l) lestring16 >0 Description: %15.15s
# From: Alex Beregszaszi <alex@fsn.hu>
0 string COWD VMWare3 disk image
>12 belong x %d bytes
0 string COWD VMWare3
>4 byte 3 disk image
>>32 lelong x (%d/
>>36 lelong x \b%d/
>>40 lelong x \b%d)
>4 byte 2 undoable disk image
>>32 string >\0 (%s)
0 string VMDK VMware4 disk image
0 string KDMV VMware4 disk image
0 belong 0x514649fb QEMU Copy-On-Write disk image
>4 belong x version %d,
@ -607,3 +615,7 @@
>48 string x subtype %s
0 lelong 0x02468ace Bochs Sparse disk image
# from http://filext.com by Derek M Jones <derek@knosof.co.uk>
0 string \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF Microsoft Installer
0 string \320\317\021\340\241\261\032\341 Microsoft Office Document

32
contrib/file/Magdir/os400 Normal file
View File

@ -0,0 +1,32 @@
#------------------------------------------------------------------------------
# os400: file(1) magic for IBM OS/400 files
# IBM OS/400 (i5/OS) Save file (SAVF) - gerardo.cacciari@gmail.com
# In spite of its quite variable format (due to internal memory page
# length differences between CISC and RISC versions of the OS) the
# SAVF structure hasn't suitable offsets to identify the catalog
# header in the first descriptor where there are some useful infos,
# so we must search in a somewhat large area for a particular string
# that represents the EBCDIC encoding of 'QSRDSSPC' (save/restore
# descriptor space) preceded by a two byte constant.
40 string @@@@@@@@
>1089 search/7394 \x19\xDB\xD8\xE2\xD9\xC4\xE2\xE2\xD7\xC3 IBM OS/400 save file data
>>&212 byte 0x01 \b, created with SAVOBJ
>>&212 byte 0x02 \b, created with SAVLIB
>>&212 byte 0x07 \b, created with SAVCFG
>>&212 byte 0x0B \b, created with SAVDLO
>>&213 byte 0x43 \b, at least V5R3 to open
>>&213 byte 0x42 \b, at least V5R2 to open
>>&213 byte 0x41 \b, at least V5R1 to open
>>&213 byte 0x40 \b, at least V4R5 to open
>>&213 byte 0x3F \b, at least V4R4 to open
>>&213 byte 0x3E \b, at least V4R3 to open
>>&213 byte 0x3C \b, at least V4R2 to open
>>&213 byte 0x3D \b, at least V4R1M4 to open
>>&213 byte 0x3B \b, at least V4R1 to open
>>&213 byte 0x3A \b, at least V3R7 to open
>>&213 byte 0x35 \b, at least V3R6 to open
>>&213 byte 0x36 \b, at least V3R2 to open
>>&213 byte 0x34 \b, at least V3R1 to open
>>&213 byte 0x31 \b, at least V3R0M5 to open
>>&213 byte 0x30 \b, at least V2R3 to open

View File

@ -13,6 +13,7 @@
0 belong 0x2ded0d0a python 2.2 byte-compiled
0 belong 0x3bf20d0a python 2.3 byte-compiled
0 belong 0x6df20d0a python 2.4 byte-compiled
0 belong 0xb3f20d0a python 2.5 byte-compiled
0 string/b #!\ /usr/bin/python python script text executable

View File

@ -29,6 +29,8 @@
>8 string RMID \b, MIDI
# RIFF Multimedia Movie File format
>8 string RMMP \b, multimedia movie
# RIFF wrapper for MP3
>8 string RMP3 \b, MPEG Layer 3 audio
# Microsoft WAVE format (*.wav)
>8 string WAVE \b, WAVE audio
>>20 leshort 1 \b, Microsoft PCM
@ -120,6 +122,7 @@
>>>>>>>(104.l+132) string/c iv50 Indeo 5.0
>>>>>>>(104.l+132) string/c mp42 Microsoft MPEG-4 v2
>>>>>>>(104.l+132) string/c mp43 Microsoft MPEG-4 v3
>>>>>>>(104.l+132) string/c fmp4 FFMpeg MPEG-4
>>>>>>>(104.l+132) string/c mjpg Motion JPEG
>>>>>>>(104.l+132) string/c div3 DivX 3
>>>>>>>>112 string/c div3 Low-Motion
@ -127,6 +130,7 @@
>>>>>>>(104.l+132) string/c divx DivX 4
>>>>>>>(104.l+132) string/c dx50 DivX 5
>>>>>>>(104.l+132) string/c xvid XviD
>>>>>>>(104.l+132) string/c wmv3 Windows Media Video 9
>>>>>>>(104.l+132) string/c h264 X.264
>>>>>>>(104.l+132) lelong 0
##>>>>>>>(104.l+132) string x (%.4s)
@ -138,6 +142,9 @@
>>>>>>>(92.l+172) string strf
>>>>>>>>(92.l+180) leshort 0x0001 uncompressed PCM
>>>>>>>>(92.l+180) leshort 0x0002 ADPCM
>>>>>>>>(92.l+180) leshort 0x0006 aLaw
>>>>>>>>(92.l+180) leshort 0x0007 uLaw
>>>>>>>>(92.l+180) leshort 0x0050 MPEG-1 Layer 1 or 2
>>>>>>>>(92.l+180) leshort 0x0055 MPEG-1 Layer 3
>>>>>>>>(92.l+180) leshort 0x2000 Dolby AC3
>>>>>>>>(92.l+180) leshort 0x0161 DivX

View File

@ -12,10 +12,12 @@
>>20 belong >4096 dynamically linked executable
>0 byte ^0x80 executable
>16 belong >0 not stripped
0 belong&077777777 0600410 sparc pure
>0 byte &0x80 dynamically linked executable
>0 byte ^0x80 executable
>16 belong >0 not stripped
0 belong&077777777 0600407 sparc
>0 byte &0x80 dynamically linked executable
>0 byte ^0x80 executable
@ -26,11 +28,14 @@
>>20 belong <4096 shared library
>>20 belong =4096 dynamically linked executable
>>20 belong >4096 dynamically linked executable
>0 byte ^0x80 executable
>16 belong >0 not stripped
0 belong&077777777 0400410 mc68020 pure
>0 byte &0x80 dynamically linked executable
>0 byte ^0x80 executable
>16 belong >0 not stripped
0 belong&077777777 0400407 mc68020
>0 byte &0x80 dynamically linked executable
>0 byte ^0x80 executable
@ -41,11 +46,14 @@
>>20 belong <4096 shared library
>>20 belong =4096 dynamically linked executable
>>20 belong >4096 dynamically linked executable
>0 byte ^0x80 executable
>16 belong >0 not stripped
0 belong&077777777 0200410 mc68010 pure
>0 byte &0x80 dynamically linked executable
>0 byte ^0x80 executable
>16 belong >0 not stripped
0 belong&077777777 0200407 mc68010
>0 byte &0x80 dynamically linked executable
>0 byte ^0x80 executable

View File

@ -11,7 +11,28 @@
>1 byte 0x04 Moog
>1 byte 0x05 Passport
>1 byte 0x06 Lexicon
>1 byte 0x07 Kurzweil
>1 byte 0x07 Kurzweil/Future Retro
>>3 byte 0x77 777
>>4 byte 0x00 Bank
>>4 byte 0x01 Song
>>5 byte 0x0f 16
>>5 byte 0x0e 15
>>5 byte 0x0d 14
>>5 byte 0x0c 13
>>5 byte 0x0b 12
>>5 byte 0x0a 11
>>5 byte 0x09 10
>>5 byte 0x08 9
>>5 byte 0x07 8
>>5 byte 0x06 7
>>5 byte 0x05 6
>>5 byte 0x04 5
>>5 byte 0x03 4
>>5 byte 0x02 3
>>5 byte 0x01 2
>>5 byte 0x00 1
>>5 byte 0x10 (ALL)
>>2 byte x \b, Channel %d
>1 byte 0x08 Fender
>1 byte 0x09 Gulbransen
>1 byte 0x0a AKG
@ -21,6 +42,12 @@
>1 byte 0x0e Garfield
>1 byte 0x0f Ensoniq
>1 byte 0x10 Oberheim
>>2 byte 0x06 Matrix 6 series
>>3 byte 0x0A Dump (All)
>>3 byte 0x01 Dump (Bank)
>>4 belong 0x0002040E Matrix 1000
>>>11 byte <2 User bank %d
>>>11 byte >1 Preset bank %d
>1 byte 0x11 Apple
>1 byte 0x12 GreyMatter
>1 byte 0x14 PalmTree
@ -52,11 +79,107 @@
>>3 byte 0x09 EK-44
>1 byte 0x30 Dynacord
>1 byte 0x31 Jomox
>1 byte 0x33 Clavia
>1 byte 0x39 Soundcraft
# Some Waldorf info from http://Stromeko.Synth.net/Downloads#WaldorfDocs
>1 byte 0x3e Waldorf
>>2 byte 0x00 microWave
>>2 byte 0x0E microwave2 / XT
>>2 byte 0x0F Q / Q+
>>3 byte =0 (default id)
>>3 byte >0 (
>>>3 byte <0x7F \bdevice %d)
>>>3 byte =0x7F \bbroadcast id)
>>3 byte 0x7f Microwave I
>>>4 byte 0x00 SNDR (Sound Request)
>>>4 byte 0x10 SNDD (Sound Dump)
>>>4 byte 0x20 SNDP (Sound Parameter Change)
>>>4 byte 0x30 SNDQ (Sound Parameter Inquiry)
>>>4 byte 0x70 BOOT (Sound Reserved)
>>>4 byte 0x01 MULR (Multi Request)
>>>4 byte 0x11 MULD (Multi Dump)
>>>4 byte 0x21 MULP (Multi Parameter Change)
>>>4 byte 0x31 MULQ (Multi Parameter Inquiry)
>>>4 byte 0x71 OS (Multi Reserved)
>>>4 byte 0x02 DRMR (Drum Map Request)
>>>4 byte 0x12 DRMD (Drum Map Dump)
>>>4 byte 0x22 DRMP (Drum Map Parameter Change)
>>>4 byte 0x32 DRMQ (Drum Map Parameter Inquiry)
>>>4 byte 0x72 BIN (Drum Map Reserved)
>>>4 byte 0x03 PATR (Sequencer Pattern Request)
>>>4 byte 0x13 PATD (Sequencer Pattern Dump)
>>>4 byte 0x23 PATP (Sequencer Pattern Parameter Change)
>>>4 byte 0x33 PATQ (Sequencer Pattern Parameter Inquiry)
>>>4 byte 0x73 AFM (Sequencer Pattern Reserved)
>>>4 byte 0x04 GLBR (Global Parameter Request)
>>>4 byte 0x14 GLBD (Global Parameter Dump)
>>>4 byte 0x24 GLBP (Global Parameter Parameter Change)
>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry)
>>>4 byte 0x07 MODR (Mode Parameter Request)
>>>4 byte 0x17 MODD (Mode Parameter Dump)
>>>4 byte 0x27 MODP (Mode Parameter Parameter Change)
>>>4 byte 0x37 MODQ (Mode Parameter Parameter Inquiry)
>>2 byte 0x10 microQ
>>>4 byte 0x00 SNDR (Sound Request)
>>>4 byte 0x10 SNDD (Sound Dump)
>>>4 byte 0x20 SNDP (Sound Parameter Change)
>>>4 byte 0x30 SNDQ (Sound Parameter Inquiry)
>>>4 byte 0x70 (Sound Reserved)
>>>4 byte 0x01 MULR (Multi Request)
>>>4 byte 0x11 MULD (Multi Dump)
>>>4 byte 0x21 MULP (Multi Parameter Change)
>>>4 byte 0x31 MULQ (Multi Parameter Inquiry)
>>>4 byte 0x71 OS (Multi Reserved)
>>>4 byte 0x02 DRMR (Drum Map Request)
>>>4 byte 0x12 DRMD (Drum Map Dump)
>>>4 byte 0x22 DRMP (Drum Map Parameter Change)
>>>4 byte 0x32 DRMQ (Drum Map Parameter Inquiry)
>>>4 byte 0x72 BIN (Drum Map Reserved)
>>>4 byte 0x04 GLBR (Global Parameter Request)
>>>4 byte 0x14 GLBD (Global Parameter Dump)
>>>4 byte 0x24 GLBP (Global Parameter Parameter Change)
>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry)
>>2 byte 0x11 rackAttack
>>>4 byte 0x00 SNDR (Sound Parameter Request)
>>>4 byte 0x10 SNDD (Sound Parameter Dump)
>>>4 byte 0x20 SNDP (Sound Parameter Parameter Change)
>>>4 byte 0x30 SNDQ (Sound Parameter Parameter Inquiry)
>>>4 byte 0x01 PRGR (Program Parameter Request)
>>>4 byte 0x11 PRGD (Program Parameter Dump)
>>>4 byte 0x21 PRGP (Program Parameter Parameter Change)
>>>4 byte 0x31 PRGQ (Program Parameter Parameter Inquiry)
>>>4 byte 0x71 OS (Program Parameter Reserved)
>>>4 byte 0x03 PATR (Pattern Parameter Request)
>>>4 byte 0x13 PATD (Pattern Parameter Dump)
>>>4 byte 0x23 PATP (Pattern Parameter Parameter Change)
>>>4 byte 0x33 PATQ (Pattern Parameter Parameter Inquiry)
>>>4 byte 0x04 GLBR (Global Parameter Request)
>>>4 byte 0x14 GLBD (Global Parameter Dump)
>>>4 byte 0x24 GLBP (Global Parameter Parameter Change)
>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry)
>>>4 byte 0x05 EFXR (FX Parameter Request)
>>>4 byte 0x15 EFXD (FX Parameter Dump)
>>>4 byte 0x25 EFXP (FX Parameter Parameter Change)
>>>4 byte 0x35 EFXQ (FX Parameter Parameter Inquiry)
>>>4 byte 0x07 MODR (Mode Command Request)
>>>4 byte 0x17 MODD (Mode Command Dump)
>>>4 byte 0x27 MODP (Mode Command Parameter Change)
>>>4 byte 0x37 MODQ (Mode Command Parameter Inquiry)
>>2 byte 0x03 Wave
>>>4 byte 0x00 SBPR (Soundprogram)
>>>4 byte 0x01 SAPR (Performance)
>>>4 byte 0x02 SWAVE (Wave)
>>>4 byte 0x03 SWTBL (Wave control table)
>>>4 byte 0x04 SVT (Velocity Curve)
>>>4 byte 0x05 STT (Tuning Table)
>>>4 byte 0x06 SGLB (Global Parameters)
>>>4 byte 0x07 SARRMAP (Performance Program Change Map)
>>>4 byte 0x08 SBPRMAP (Sound Program Change Map)
>>>4 byte 0x09 SBPRPAR (Sound Parameter)
>>>4 byte 0x0A SARRPAR (Performance Parameter)
>>>4 byte 0x0B SINSPAR (Instrument/External Parameter)
>>>4 byte 0x0F SBULK (Bulk Switch on/off)
# Japanese Group
>1 byte 0x40 Kawai

View File

@ -0,0 +1,15 @@
#---------------------------------------------------------------------------
# Unicode: BOM prefixed text files - Adrian Havill <havill@turbolinux.co.jp>
#
0 string +/v8 Unicode text, UTF-7
0 string +/v9 Unicode text, UTF-7
0 string +/v+ Unicode text, UTF-7
0 string +/v/ Unicode text, UTF-7
0 string \357\273\277 Unicode text, UTF-8
0 string \335\163\146\163 Unicode text, UTF-8-EBCDIC
0 string \376\377\000\000 Unicode text, UTF-32, big-endian
0 string \377\376\000\000 Unicode text, UTF-32, little-endian
0 string \376\377 Unicode text, UTF-16, big-endian
0 string \377\376 Unicode text, UTF-16, little-endian
0 string \016\376\377 Unicode text, SCSU (Standard Compression Scheme for Unicode)

View File

@ -3,10 +3,3 @@
# VMware specific files (deducted from version 1.1 and log file entries)
# Anthon van der Neut (anthon@mnt.org)
0 belong 0x4d52564e VMware nvram
0 belong 0x434f5744 VMware
>4 byte 3 virtual disk
>>32 lelong x (%d/
>>36 lelong x \b%d/
>>40 lelong x \b%d)
>4 byte 2 undoable disk
>>32 string >\0 (%s)

View File

@ -104,7 +104,9 @@
#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
# 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 3.0
# From: Won-Kyu Park <wkpark@kldp.org>
512 string R\0o\0o\0t\0 Hangul (Korean) Word Processor File 2000
# CosmicBook, from Benoît Rouits
0 string CSBK Ted Neslson's CosmicBook hypertext file
@ -115,3 +117,20 @@
0 string \\1cw\ ChiWriter file
>5 string >\0 version %s
0 string \\1cw ChiWriter file
# Quark Express from http://www.garykessler.net/library/file_sigs.html
2 string IIXPR3 Intel Quark Express Document (English)
2 string IIXPRa Intel Quark Express Document (Korean)
2 string MMXPR3 Motorola Quark Express Document (English)
2 string MMXPRa Motorola Quark Express Document (Korean)
# adobe indesign (document, whatever...) from querkan
0 belong 0x0606edf5 Adobe InDesign
>16 string DOCUMENT Document
# From: Michael Piefel <piefel@debian.org>
# sqtroff intermediate language (replacement for ditroff int. lang.)
0 string X\ 495 SoftQuad troff Context intermediate for AT&T 495 laser printer
0 string X\ hp SoftQuad troff Context intermediate for HP LaserJet
0 string X\ impr SoftQuad troff Context intermediate for IMAGEN imPRESS
0 string X\ ps SoftQuad troff Context intermediate for PostScript

View File

@ -13,7 +13,7 @@
# xfsdump archive
0 string xFSdump0 xfsdump archive
>8 long x (version %d)
>8 belong x (version %d)
# Jaleo XFS files
0 long 395726 Jaleo XFS file

View File

@ -52,6 +52,7 @@ Magdir/bout \
Magdir/bsdi \
Magdir/btsnoop \
Magdir/cad \
Magdir/cafebabe \
Magdir/c-lang \
Magdir/c64 \
Magdir/cddb \
@ -143,6 +144,7 @@ Magdir/ocaml \
Magdir/octave \
Magdir/olf \
Magdir/os2 \
Magdir/os400 \
Magdir/os9 \
Magdir/osf1 \
Magdir/palm \
@ -194,6 +196,7 @@ Magdir/troff \
Magdir/tuxedo \
Magdir/typeset \
Magdir/unknown \
Magdir/unicode \
Magdir/uuencode \
Magdir/varied.out \
Magdir/varied.script \

View File

@ -192,6 +192,7 @@ Magdir/bout \
Magdir/bsdi \
Magdir/btsnoop \
Magdir/cad \
Magdir/cafebabe \
Magdir/c-lang \
Magdir/c64 \
Magdir/cddb \
@ -283,6 +284,7 @@ Magdir/ocaml \
Magdir/octave \
Magdir/olf \
Magdir/os2 \
Magdir/os400 \
Magdir/os9 \
Magdir/osf1 \
Magdir/palm \
@ -334,6 +336,7 @@ Magdir/troff \
Magdir/tuxedo \
Magdir/typeset \
Magdir/unknown \
Magdir/unicode \
Magdir/uuencode \
Magdir/varied.out \
Magdir/varied.script \

View File

@ -1,5 +1,5 @@
** README for file(1) Command **
@(#) $Id: README,v 1.33 2003/05/23 21:31:56 christos Exp $
@(#) $Id: README,v 1.34 2006/05/03 18:48:33 christos Exp $
This is Release 4.x of Ian Darwin's (copyright but distributable)
file(1) command. This version is the standard "file" command for Linux,
@ -96,7 +96,8 @@ and does not exist any longer.
From: Kees Zeelenberg
An MS-Windows (Win32) port of File-3.36 is available from
An MS-Windows (Win32) port of File-4.17 is available from
http://gnuwin32.sourceforge.net/
File is an implementation of the Unix File(1) command.
It knows the 'magic number' of several thousands of file types.

View File

@ -36,6 +36,7 @@
#include <unistd.h>
#endif
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>
@ -45,7 +46,7 @@
#endif
#ifndef lint
FILE_RCSID("@(#)$Id: apprentice.c,v 1.87 2006/03/02 22:08:57 christos Exp $")
FILE_RCSID("@(#)$Id: apprentice.c,v 1.100 2006/12/11 21:48:49 christos Exp $")
#endif /* lint */
#define EATAB {while (isascii((unsigned char) *l) && \
@ -86,12 +87,17 @@ struct magic_entry {
uint32_t max_count;
};
const int file_formats[] = { FILE_FORMAT_STRING };
const size_t file_nformats = sizeof(file_formats) / sizeof(file_formats[0]);
const char *file_names[] = { FILE_FORMAT_NAME };
const size_t file_nnames = sizeof(file_names) / sizeof(file_names[0]);
private int getvalue(struct magic_set *ms, struct magic *, const char **);
private int hextoint(int);
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);
const char *, size_t, int);
private void eatsize(const char **);
private int apprentice_1(struct magic_set *, const char *, int, struct mlist *);
private size_t apprentice_magic_strength(const struct magic *);
@ -102,11 +108,13 @@ private void byteswap(struct magic *, uint32_t);
private void bs1(struct magic *);
private uint16_t swap2(uint16_t);
private uint32_t swap4(uint32_t);
private uint64_t swap8(uint64_t);
private char *mkdbname(const char *, char *, size_t, int);
private int apprentice_map(struct magic_set *, struct magic **, uint32_t *,
const char *);
private int apprentice_compile(struct magic_set *, struct magic **, uint32_t *,
const char *);
private int check_format_type(const char *, int);
private int check_format(struct magic_set *, struct magic *);
private size_t maxmagic = 0;
@ -186,8 +194,6 @@ apprentice_1(struct magic_set *ms, const char *fn, int action,
mapped = 0;
}
if (rv == -1)
return rv;
mapped = rv;
if (magic == NULL || nmagic == 0) {
@ -197,7 +203,7 @@ apprentice_1(struct magic_set *ms, const char *fn, int action,
if ((ml = malloc(sizeof(*ml))) == NULL) {
file_delmagic(magic, mapped, nmagic);
file_oomem(ms);
file_oomem(ms, sizeof(*ml));
return -1;
}
@ -243,6 +249,7 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
char *p, *mfn, *afn = NULL;
int file_err, errs = -1;
struct mlist *mlist;
static const char mime[] = ".mime";
if (fn == NULL)
fn = getenv("MAGIC");
@ -250,13 +257,13 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
fn = MAGIC;
if ((fn = mfn = strdup(fn)) == NULL) {
file_oomem(ms);
file_oomem(ms, strlen(fn));
return NULL;
}
if ((mlist = malloc(sizeof(*mlist))) == NULL) {
free(mfn);
file_oomem(ms);
file_oomem(ms, sizeof(*mlist));
return NULL;
}
mlist->next = mlist->prev = mlist;
@ -268,14 +275,15 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
if (*fn == '\0')
break;
if (ms->flags & MAGIC_MIME) {
if ((afn = malloc(strlen(fn) + 5 + 1)) == NULL) {
size_t len = strlen(fn) + sizeof(mime);
if ((afn = malloc(len)) == NULL) {
free(mfn);
free(mlist);
file_oomem(ms);
file_oomem(ms, len);
return NULL;
}
(void)strcpy(afn, fn);
(void)strcat(afn, ".mime");
(void)strcat(afn, mime);
fn = afn;
}
file_err = apprentice_1(ms, fn, action, mlist);
@ -298,49 +306,107 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
return mlist;
}
/*
* Get weight of this magic entry, for sorting purposes.
*/
private size_t
apprentice_magic_strength(const struct magic *m)
{
#define MULT 10
size_t val = 2 * MULT; /* baseline strength */
switch (m->type) {
case FILE_BYTE:
return 1;
val += 1 * MULT;
break;
case FILE_SHORT:
case FILE_LESHORT:
case FILE_BESHORT:
return 2;
val += 2 * MULT;
break;
case FILE_LONG:
case FILE_LELONG:
case FILE_BELONG:
case FILE_MELONG:
return 4;
val += 4 * MULT;
break;
case FILE_PSTRING:
case FILE_STRING:
case FILE_REGEX:
val += m->vallen * MULT;
break;
case FILE_BESTRING16:
case FILE_LESTRING16:
val += m->vallen * MULT / 2;
break;
case FILE_SEARCH:
return m->vallen;
case FILE_REGEX:
val += m->vallen;
break;
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;
val += 4 * MULT;
break;
case FILE_QUAD:
case FILE_BEQUAD:
case FILE_LEQUAD:
case FILE_QDATE:
case FILE_LEQDATE:
case FILE_BEQDATE:
case FILE_QLDATE:
case FILE_LEQLDATE:
case FILE_BEQLDATE:
val += 8 * MULT;
break;
default:
return 0;
val = 0;
(void)fprintf(stderr, "Bad type %d\n", m->type);
abort();
}
switch (m->reln) {
case 'x': /* matches anything penalize */
val = 0;
break;
case '!':
case '=': /* Exact match, prefer */
val += MULT;
break;
case '>':
case '<': /* comparison match reduce strength */
val -= 2 * MULT;
break;
case '^':
case '&': /* masking bits, we could count them too */
val -= MULT;
break;
default:
(void)fprintf(stderr, "Bad relation %c\n", m->reln);
abort();
}
return val;
}
/*
* Sort callback for sorting entries by "strength" (basically length)
*/
private int
apprentice_sort(const void *a, const void *b)
{
@ -370,7 +436,10 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
char line[BUFSIZ+1];
int errs = 0;
struct magic_entry *marray;
uint32_t marraycount, i, mentrycount;
uint32_t marraycount, i, mentrycount = 0;
size_t lineno = 0;
ms->flags |= MAGIC_CHECK; /* Enable checks for parsed files */
f = fopen(ms->file = fn, "r");
if (f == NULL) {
@ -383,7 +452,7 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
maxmagic = MAXMAGIS;
if ((marray = calloc(maxmagic, sizeof(*marray))) == NULL) {
(void)fclose(f);
file_oomem(ms);
file_oomem(ms, maxmagic * sizeof(*marray));
return -1;
}
marraycount = 0;
@ -392,17 +461,21 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
if (action == FILE_CHECK)
(void)fprintf(stderr, "%s\n", hdr);
/* parse it */
/* read and parse this file */
for (ms->line = 1; fgets(line, BUFSIZ, f) != NULL; ms->line++) {
size_t len;
len = strlen(line);
if (len == 0) /* null line, garbage, etc */
continue;
if (line[len - 1] == '\n') {
lineno++;
line[len - 1] = '\0'; /* delete newline */
}
if (line[0] == '\0') /* empty, do not parse */
continue;
if (line[0] == '#') /* comment, do not parse */
continue;
len = strlen(line);
if (len < 2) /* null line, garbage, etc */
continue;
if (line[len - 1] == '\n')
line[len - 1] = '\0'; /* delete newline */
if (parse(ms, &marray, &marraycount, line, action) != 0)
if (parse(ms, &marray, &marraycount, line, lineno, action) != 0)
errs++;
}
@ -414,11 +487,11 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
qsort(marray, marraycount, sizeof(*marray), apprentice_sort);
#endif
for (i = 0, mentrycount = 0; i < marraycount; i++)
for (i = 0; i < marraycount; i++)
mentrycount += marray[i].cont_count;
if ((*magicp = malloc(sizeof(**magicp) * mentrycount)) == NULL) {
file_oomem(ms);
file_oomem(ms, sizeof(**magicp) * mentrycount);
errs++;
goto out;
}
@ -447,8 +520,8 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
/*
* extend the sign bit if the comparison is to be signed
*/
protected uint32_t
file_signextend(struct magic_set *ms, struct magic *m, uint32_t v)
protected uint64_t
file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
{
if (!(m->flag & UNSIGNED))
switch(m->type) {
@ -479,6 +552,17 @@ file_signextend(struct magic_set *ms, struct magic *m, uint32_t v)
case FILE_MELONG:
v = (int32_t) v;
break;
case FILE_QUAD:
case FILE_BEQUAD:
case FILE_LEQUAD:
case FILE_QDATE:
case FILE_QLDATE:
case FILE_BEQDATE:
case FILE_BEQLDATE:
case FILE_LEQDATE:
case FILE_LEQLDATE:
v = (int64_t) v;
break;
case FILE_STRING:
case FILE_PSTRING:
case FILE_BESTRING16:
@ -500,15 +584,15 @@ file_signextend(struct magic_set *ms, struct magic *m, uint32_t v)
*/
private int
parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
const char *line, int action)
const char *line, size_t lineno, int action)
{
int i = 0;
size_t i;
struct magic_entry *me;
struct magic *m;
const char *l = line;
char *t;
private const char *fops = FILE_OPS;
uint32_t val;
uint64_t val;
uint32_t cont_level;
cont_level = 0;
@ -531,7 +615,7 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
struct magic *nm;
size_t cnt = me->max_count + ALLOC_CHUNK;
if ((nm = realloc(me->mp, sizeof(*nm) * cnt)) == NULL) {
file_oomem(ms);
file_oomem(ms, sizeof(*nm) * cnt);
return -1;
}
me->mp = m = nm;
@ -547,7 +631,7 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
maxmagic += ALLOC_INCR;
if ((mp = realloc(*mentryp, sizeof(*mp) * maxmagic)) ==
NULL) {
file_oomem(ms);
file_oomem(ms, sizeof(*mp) * maxmagic);
return -1;
}
(void)memset(&mp[*nmentryp], 0, sizeof(*mp) *
@ -557,7 +641,7 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
me = &(*mentryp)[*nmentryp];
if (me->mp == NULL) {
if ((m = malloc(sizeof(*m) * ALLOC_CHUNK)) == NULL) {
file_oomem(ms);
file_oomem(ms, sizeof(*m) * ALLOC_CHUNK);
return -1;
}
me->mp = m;
@ -568,6 +652,7 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
m->cont_level = 0;
me->cont_count = 1;
}
m->lineno = lineno;
if (m->cont_level != 0 && *l == '&') {
++l; /* step over */
@ -690,105 +775,21 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
++l;
EATAB;
#define NBYTE 4
#define NSHORT 5
#define NLONG 4
#define NSTRING 6
#define NDATE 4
#define NBESHORT 7
#define NBELONG 6
#define NBEDATE 6
#define NLESHORT 7
#define NLELONG 6
#define NMELONG 6
#define NLEDATE 6
#define NMEDATE 6
#define NPSTRING 7
#define NLDATE 5
#define NBELDATE 7
#define NLELDATE 7
#define NMELDATE 7
#define NREGEX 5
#define NBESTRING16 10
#define NLESTRING16 10
#define NSEARCH 6
if (*l == 'u') {
++l;
m->flag |= UNSIGNED;
}
/* get type, skip it */
if (strncmp(l, "char", NBYTE)==0) { /* HP/UX compat */
m->type = FILE_BYTE;
l += NBYTE;
} else if (strncmp(l, "byte", NBYTE)==0) {
m->type = FILE_BYTE;
l += NBYTE;
} else if (strncmp(l, "short", NSHORT)==0) {
m->type = FILE_SHORT;
l += NSHORT;
} else if (strncmp(l, "long", NLONG)==0) {
m->type = FILE_LONG;
l += NLONG;
} else if (strncmp(l, "string", NSTRING)==0) {
m->type = FILE_STRING;
l += NSTRING;
} else if (strncmp(l, "date", NDATE)==0) {
m->type = FILE_DATE;
l += NDATE;
} else if (strncmp(l, "beshort", NBESHORT)==0) {
m->type = FILE_BESHORT;
l += NBESHORT;
} else if (strncmp(l, "belong", NBELONG)==0) {
m->type = FILE_BELONG;
l += NBELONG;
} else if (strncmp(l, "bedate", NBEDATE)==0) {
m->type = FILE_BEDATE;
l += NBEDATE;
} else if (strncmp(l, "leshort", NLESHORT)==0) {
m->type = FILE_LESHORT;
l += NLESHORT;
} else if (strncmp(l, "lelong", NLELONG)==0) {
m->type = FILE_LELONG;
l += NLELONG;
} else if (strncmp(l, "melong", NMELONG)==0) {
m->type = FILE_MELONG;
l += NMELONG;
} else if (strncmp(l, "ledate", NLEDATE)==0) {
m->type = FILE_LEDATE;
l += NLEDATE;
} else if (strncmp(l, "medate", NMEDATE)==0) {
m->type = FILE_MEDATE;
l += NMEDATE;
} else if (strncmp(l, "pstring", NPSTRING)==0) {
m->type = FILE_PSTRING;
l += NPSTRING;
} else if (strncmp(l, "ldate", NLDATE)==0) {
m->type = FILE_LDATE;
l += NLDATE;
} else if (strncmp(l, "beldate", NBELDATE)==0) {
m->type = FILE_BELDATE;
l += NBELDATE;
} else if (strncmp(l, "leldate", NLELDATE)==0) {
m->type = FILE_LELDATE;
l += NLELDATE;
} else if (strncmp(l, "meldate", NMELDATE)==0) {
m->type = FILE_MELDATE;
l += NMELDATE;
} else if (strncmp(l, "regex", NREGEX)==0) {
m->type = FILE_REGEX;
l += NREGEX;
} else if (strncmp(l, "bestring16", NBESTRING16)==0) {
m->type = FILE_BESTRING16;
l += NBESTRING16;
} else if (strncmp(l, "lestring16", NLESTRING16)==0) {
m->type = FILE_LESTRING16;
l += NLESTRING16;
} else if (strncmp(l, "search", NSEARCH)==0) {
m->type = FILE_SEARCH;
l += NSEARCH;
} else {
for (i = 0; i < file_nnames; i++) {
size_t len = strlen(file_names[i]);
if (strncmp(l, file_names[i], len) == 0) {
m->type = i;
l+= len;
break;
}
}
if (i == file_nnames) {
if (ms->flags & MAGIC_CHECK)
file_magwarn(ms, "type `%s' invalid", l);
return -1;
@ -805,7 +806,7 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
if (op != FILE_OPDIVIDE || !IS_PLAINSTRING(m->type)) {
++l;
m->mask_op |= op;
val = (uint32_t)strtoul(l, &t, 0);
val = (uint64_t)strtoull(l, &t, 0);
l = t;
m->mask = file_signextend(ms, m, val);
eatsize(&l);
@ -892,11 +893,20 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
m->nospflag = 1;
} else
m->nospflag = 0;
while ((m->desc[i++] = *l++) != '\0' && i < MAXDESC)
/* NULLBODY */;
for (i = 0; (m->desc[i++] = *l++) != '\0' && i < sizeof(m->desc); )
continue;
if (i == sizeof(m->desc)) {
m->desc[sizeof(m->desc) - 1] = '\0';
if (ms->flags & MAGIC_CHECK)
file_magwarn(ms, "description `%s' truncated", m->desc);
}
/*
* We only do this check while compiling, or if any of the magic
* files were not compiled.
*/
if (ms->flags & MAGIC_CHECK) {
if (!check_format(ms, m))
if (check_format(ms, m) == -1)
return -1;
}
#ifndef COMPILE_ONLY
@ -909,6 +919,105 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
return 0;
}
private int
check_format_type(const char *ptr, int type)
{
int quad = 0;
if (*ptr == '\0') {
/* Missing format string; bad */
return -1;
}
switch (type) {
case FILE_FMT_QUAD:
quad = 1;
/*FALLTHROUGH*/
case FILE_FMT_NUM:
if (*ptr == '-')
ptr++;
if (*ptr == '.')
ptr++;
while (isdigit((unsigned char)*ptr)) ptr++;
if (*ptr == '.')
ptr++;
while (isdigit((unsigned char)*ptr)) ptr++;
if (quad) {
if (*ptr++ != 'l')
return -1;
if (*ptr++ != 'l')
return -1;
}
switch (*ptr++) {
case 'l':
switch (*ptr++) {
case 'i':
case 'd':
case 'u':
case 'x':
case 'X':
return 0;
default:
return -1;
}
case 'h':
switch (*ptr++) {
case 'h':
switch (*ptr++) {
case 'i':
case 'd':
case 'u':
case 'x':
case 'X':
return 0;
default:
return -1;
}
case 'd':
return 0;
default:
return -1;
}
case 'i':
case 'c':
case 'd':
case 'u':
case 'x':
case 'X':
return 0;
default:
return -1;
}
case FILE_FMT_STR:
if (*ptr == '-')
ptr++;
while (isdigit((unsigned char )*ptr))
ptr++;
if (*ptr == '.') {
ptr++;
while (isdigit((unsigned char )*ptr))
ptr++;
}
switch (*ptr++) {
case 's':
return 0;
default:
return -1;
}
default:
/* internal error */
abort();
}
/*NOTREACHED*/
return -1;
}
/*
* Check that the optional printf format in description matches
* the type of the magic.
@ -916,8 +1025,6 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
private int
check_format(struct magic_set *ms, struct magic *m)
{
static const char *formats[] = { FILE_FORMAT_STRING };
static const char *names[] = { FILE_FORMAT_NAME };
char *ptr;
for (ptr = m->desc; *ptr; ptr++)
@ -927,37 +1034,42 @@ check_format(struct magic_set *ms, struct magic *m)
/* No format string; ok */
return 1;
}
if (m->type >= sizeof(formats)/sizeof(formats[0])) {
file_magwarn(ms, "Internal error inconsistency between m->type"
" and format strings");
return 0;
assert(file_nformats == file_nnames);
if (m->type >= file_nformats) {
file_error(ms, 0, "Internal error inconsistency between "
"m->type and format strings");
return -1;
}
if (formats[m->type] == NULL) {
file_magwarn(ms, "No format string for `%s' with description "
"`%s'", m->desc, names[m->type]);
return 0;
if (file_formats[m->type] == FILE_FMT_NONE) {
file_error(ms, 0, "No format string for `%s' with description "
"`%s'", m->desc, file_names[m->type]);
return -1;
}
ptr++;
if (check_format_type(ptr, file_formats[m->type]) == -1) {
/*
* TODO: this error message is unhelpful if the format
* string is not one character long
*/
file_error(ms, 0, "Printf format `%c' is not valid for type "
" `%s' in description `%s'", *ptr,
file_names[m->type], m->desc);
return -1;
}
for (; *ptr; ptr++) {
if (*ptr == 'l' || *ptr == 'h') {
/* XXX: we should really fix this one day */
continue;
if (*ptr == '%') {
file_error(ms, 0,
"Too many format strings (should have at most one) "
"for `%s' with description `%s'",
file_names[m->type], m->desc);
return -1;
}
if (islower((unsigned char)*ptr) || *ptr == 'X')
break;
}
if (*ptr == '\0') {
/* Missing format string; bad */
file_magwarn(ms, "Invalid format `%s' for type `%s'",
m->desc, names[m->type]);
return 0;
}
if (strchr(formats[m->type], *ptr) == NULL) {
file_magwarn(ms, "Printf format `%c' is not valid for type `%s'"
" in description `%s'",
*ptr, names[m->type], m->desc);
return 0;
}
return 1;
}
/*
@ -989,8 +1101,8 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p)
default:
if (m->reln != 'x') {
char *ep;
m->value.l = file_signextend(ms, m,
(uint32_t)strtoul(*p, &ep, 0));
m->value.q = file_signextend(ms, m,
(uint64_t)strtoull(*p, &ep, 0));
*p = ep;
eatsize(p);
}
@ -1242,7 +1354,7 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
#define RET 2
#else
if ((mm = malloc((size_t)st.st_size)) == NULL) {
file_oomem(ms);
file_oomem(ms, (size_t)st.st_size);
goto error;
}
if (read(fd, mm, (size_t)st.st_size) != (size_t)st.st_size) {
@ -1395,6 +1507,26 @@ swap4(uint32_t sv)
return rv;
}
/*
* swap a quad
*/
private uint64_t
swap8(uint64_t sv)
{
uint32_t rv;
uint8_t *s = (uint8_t *)(void *)&sv;
uint8_t *d = (uint8_t *)(void *)&rv;
d[0] = s[3];
d[1] = s[2];
d[2] = s[1];
d[3] = s[0];
d[4] = s[7];
d[5] = s[6];
d[6] = s[5];
d[7] = s[4];
return rv;
}
/*
* byteswap a single magic entry
*/
@ -1405,6 +1537,6 @@ bs1(struct magic *m)
m->offset = swap4((uint32_t)m->offset);
m->in_offset = swap4((uint32_t)m->in_offset);
if (!IS_STRING(m->type))
m->value.l = swap4(m->value.l);
m->mask = swap4(m->mask);
m->value.q = swap8(m->value.q);
m->mask = swap8(m->mask);
}

View File

@ -49,7 +49,7 @@
#include "names.h"
#ifndef lint
FILE_RCSID("@(#)$Id: ascmagic.c,v 1.45 2006/03/12 22:09:33 christos Exp $")
FILE_RCSID("@(#)$Id: ascmagic.c,v 1.46 2006/10/20 21:04:15 christos Exp $")
#endif /* lint */
typedef unsigned long unichar;
@ -102,9 +102,9 @@ file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
while (nbytes > 1 && buf[nbytes - 1] == '\0')
nbytes--;
if ((nbuf = malloc((nbytes + 1) * sizeof(nbuf[0]))) == NULL)
if ((nbuf = calloc(1, (nbytes + 1) * sizeof(nbuf[0]))) == NULL)
goto done;
if ((ubuf = malloc((nbytes + 1) * sizeof(ubuf[0]))) == NULL)
if ((ubuf = calloc(1, (nbytes + 1) * sizeof(ubuf[0]))) == NULL)
goto done;
/*

View File

@ -42,6 +42,7 @@
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif
@ -50,10 +51,9 @@
#endif
#ifndef lint
FILE_RCSID("@(#)$Id: compress.c,v 1.42 2005/03/06 05:58:22 christos Exp $")
FILE_RCSID("@(#)$Id: compress.c,v 1.45 2006/10/31 19:37:17 christos Exp $")
#endif
private struct {
const char *magic;
size_t maglen;
@ -76,9 +76,10 @@ private struct {
private int ncompr = sizeof(compr) / sizeof(compr[0]);
#define NODATA ((size_t)~0)
private ssize_t swrite(int, const void *, size_t);
private ssize_t sread(int, void *, size_t);
private size_t uncompressbuf(struct magic_set *, int, size_t,
const unsigned char *, unsigned char **, size_t);
#ifdef HAVE_LIBZ
@ -102,7 +103,7 @@ file_zmagic(struct magic_set *ms, int fd, const unsigned char *buf,
continue;
if (memcmp(buf, compr[i].magic, compr[i].maglen) == 0 &&
(nsz = uncompressbuf(ms, fd, i, buf, &newbuf,
nbytes)) != 0) {
nbytes)) != NODATA) {
ms->flags &= ~MAGIC_COMPRESS;
rv = -1;
if (file_buffer(ms, -1, newbuf, nsz) == -1)
@ -152,14 +153,52 @@ swrite(int fd, const void *buf, size_t n)
/*
* `safe' read for sockets and pipes.
*/
private ssize_t
protected ssize_t
sread(int fd, void *buf, size_t n)
{
int rv;
#ifdef FIONREAD
int t = 0;
#endif
size_t rn = n;
if (fd == STDIN_FILENO)
goto nocheck;
#ifdef FIONREAD
if ((ioctl(fd, FIONREAD, &t) < 0) || (t == 0)) {
#ifdef FD_ZERO
for (;;) {
fd_set check;
struct timeval tout = {0, 100 * 1000};
FD_ZERO(&check);
FD_SET(fd, &check);
/*
* Avoid soft deadlock: do not read if there
* is nothing to read from sockets and pipes.
*/
if (select(fd + 1, &check, NULL, NULL, &tout) <= 0) {
if (errno == EINTR || errno == EAGAIN)
continue;
return 0;
}
break;
}
#endif
(void)ioctl(fd, FIONREAD, &t);
}
if (t > 0 && (size_t)t < n) {
n = t;
rn = n;
}
#endif
nocheck:
do
switch (rv = read(fd, buf, n)) {
switch ((rv = read(fd, buf, n))) {
case -1:
if (errno == EINTR)
continue;
@ -305,7 +344,7 @@ uncompressgzipped(struct magic_set *ms, const unsigned char *old,
inflateEnd(&z);
/* let's keep the nul-terminate tradition */
(*newch)[n++] = '\0';
(*newch)[n] = '\0';
return n;
}
@ -327,7 +366,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
if ((fd != -1 && pipe(fdin) == -1) || pipe(fdout) == -1) {
file_error(ms, errno, "cannot create pipe");
return 0;
return NODATA;
}
switch (fork()) {
case 0: /* child */
@ -360,7 +399,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
/*NOTREACHED*/
case -1:
file_error(ms, errno, "could not fork");
return 0;
return NODATA;
default: /* parent */
(void) close(fdout[1]);
@ -420,7 +459,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
n = r;
}
/* NUL terminate, as every buffer is handled here. */
(*newch)[n++] = '\0';
(*newch)[n] = '\0';
err:
if (fdin[1] != -1)
(void) close(fdin[1]);

View File

@ -118,6 +118,9 @@
/* Define to 1 if you have the <wchar.h> header file. */
#undef HAVE_WCHAR_H
/* Define to 1 if you have the <wctype.h> header file. */
#undef HAVE_WCTYPE_H
/* Define to 1 if you have the `wcwidth' function. */
#undef HAVE_WCWIDTH

910
contrib/file/configure vendored
View File

@ -1808,7 +1808,7 @@ fi
# Define the identity of the package.
PACKAGE=file
VERSION=4.17
VERSION=4.19
cat >>confdefs.h <<_ACEOF
@ -20514,7 +20514,11 @@ done
for ac_header in fcntl.h locale.h
for ac_header in fcntl.h locale.h stdint.h inttypes.h unistd.h getopt.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
@ -20666,7 +20670,7 @@ done
for ac_header in sys/mman.h sys/stat.h sys/types.h
for ac_header in utime.h wchar.h wctype.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
@ -20817,907 +20821,9 @@ done
for ac_header in stdint.h inttypes.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in getopt.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in locale.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in utime.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in sys/utime.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
# Is the header compilable?
echo "$as_me:$LINENO: checking $ac_header usability" >&5
echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_header_compiler=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_compiler=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
echo "${ECHO_T}$ac_header_compiler" >&6
# Is the header present?
echo "$as_me:$LINENO: checking $ac_header presence" >&5
echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
else
ac_cpp_err=
fi
else
ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
ac_header_preproc=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
echo "${ECHO_T}$ac_header_preproc" >&6
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
yes:no: )
{ echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
ac_header_preproc=yes
;;
no:yes:* )
{ echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
{ echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
(
cat <<\_ASBOX
## ------------------------------------------ ##
## Report this to the AC_PACKAGE_NAME lists. ##
## ------------------------------------------ ##
_ASBOX
) |
sed "s/^/$as_me: WARNING: /" >&2
;;
esac
echo "$as_me:$LINENO: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
eval "$as_ac_Header=\$ac_header_preproc"
fi
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
fi
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
for ac_header in wchar.h
for ac_header in sys/mman.h sys/stat.h sys/types.h sys/utime.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then

View File

@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT
AC_CONFIG_SRCDIR([src/file.c])
AM_INIT_AUTOMAKE(file, 4.17)
AM_INIT_AUTOMAKE(file, 4.19)
AM_CONFIG_HEADER([config.h])
AM_MAINTAINER_MODE
@ -79,15 +79,9 @@ AC_HEADER_STDC
AC_HEADER_MAJOR
AC_HEADER_SYS_WAIT
AC_HEADER_STDINT
AC_CHECK_HEADERS(fcntl.h locale.h)
AC_CHECK_HEADERS(sys/mman.h sys/stat.h sys/types.h)
AC_CHECK_HEADERS(stdint.h inttypes.h)
AC_CHECK_HEADERS(unistd.h)
AC_CHECK_HEADERS(getopt.h)
AC_CHECK_HEADERS(locale.h)
AC_CHECK_HEADERS(utime.h)
AC_CHECK_HEADERS(sys/utime.h)
AC_CHECK_HEADERS(wchar.h)
AC_CHECK_HEADERS(fcntl.h locale.h stdint.h inttypes.h unistd.h getopt.h)
AC_CHECK_HEADERS(utime.h wchar.h wctype.h)
AC_CHECK_HEADERS(sys/mman.h sys/stat.h sys/types.h sys/utime.h)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST

View File

@ -71,7 +71,7 @@
#include "patchlevel.h"
#ifndef lint
FILE_RCSID("@(#)$Id: file.c,v 1.100 2005/10/17 18:41:44 christos Exp $")
FILE_RCSID("@(#)$Id: file.c,v 1.104 2006/11/25 17:28:54 christos Exp $")
#endif /* lint */
@ -81,7 +81,7 @@ FILE_RCSID("@(#)$Id: file.c,v 1.100 2005/10/17 18:41:44 christos Exp $")
#define SYMLINKFLAG ""
#endif
# define USAGE "Usage: %s [-bcik" SYMLINKFLAG "nNsvz] [-f namefile] [-F separator] [-m magicfiles] file...\n %s -C -m magicfiles\n"
# define USAGE "Usage: %s [-bcik" SYMLINKFLAG "nNrsvz0] [-f namefile] [-F separator] [-m magicfiles] file...\n %s -C -m magicfiles\n"
#ifndef MAXPATHLEN
#define MAXPATHLEN 512
@ -90,7 +90,8 @@ FILE_RCSID("@(#)$Id: file.c,v 1.100 2005/10/17 18:41:44 christos Exp $")
private int /* Global command-line options */
bflag = 0, /* brief output format */
nopad = 0, /* Don't pad output */
nobuffer = 0; /* Do not buffer stdout */
nobuffer = 0, /* Do not buffer stdout */
nulsep = 0; /* Append '\0' to the separator */
private const char *magicfile = 0; /* where the magic is */
private const char *default_magicfile = MAGIC;
@ -126,10 +127,11 @@ main(int argc, char *argv[])
int flags = 0;
char *home, *usermagic;
struct stat sb;
#define OPTSTRING "bcCdf:F:hikLm:nNprsvz"
static const char hmagic[] = "/.magic";
#define OPTSTRING "bcCdf:F:hikLm:nNprsvz0"
#ifdef HAVE_GETOPT_LONG
int longindex;
private struct option long_options[] =
static const struct option long_options[] =
{
{"version", 0, 0, 'v'},
{"help", 0, 0, 0},
@ -154,6 +156,7 @@ main(int argc, char *argv[])
{"no-pad", 0, 0, 'N'},
{"special-files", 0, 0, 's'},
{"compile", 0, 0, 'C'},
{"print0", 0, 0, '0'},
{0, 0, 0, 0},
};
#endif
@ -178,9 +181,10 @@ main(int argc, char *argv[])
magicfile = usermagic;
else
if ((home = getenv("HOME")) != NULL) {
if ((usermagic = malloc(strlen(home) + 8)) != NULL) {
if ((usermagic = malloc(strlen(home)
+ sizeof(hmagic))) != NULL) {
(void)strcpy(usermagic, home);
(void)strcat(usermagic, "/.magic");
(void)strcat(usermagic, hmagic);
if (stat(usermagic, &sb)<0)
free(usermagic);
else
@ -204,6 +208,9 @@ main(int argc, char *argv[])
help();
break;
#endif
case '0':
nulsep = 1;
break;
case 'b':
++bflag;
break;
@ -385,15 +392,24 @@ unwrap(char *fn)
(void)fclose(f);
}
/*
* Called for each input file on the command line (or in a list of files)
*/
private void
process(const char *inname, int wid)
{
const char *type;
int std_in = strcmp(inname, "-") == 0;
if (wid > 0 && !bflag)
(void)printf("%s%s%*s ", std_in ? "/dev/stdin" : inname,
separator, (int) (nopad ? 0 : (wid - file_mbswidth(inname))), "");
if (wid > 0 && !bflag) {
(void)printf("%s", std_in ? "/dev/stdin" : inname);
if (nulsep)
(void)puts('\0');
else
(void)printf("%s", separator);
(void)printf("%*s ",
(int) (nopad ? 0 : (wid - file_mbswidth(inname))), "");
}
type = magic_file(magic, std_in ? NULL : inname);
if (type == NULL)

View File

@ -27,7 +27,7 @@
*/
/*
* file.h - definitions for file(1) program
* @(#)$Id: file.h,v 1.73 2005/10/20 14:59:01 christos Exp $
* @(#)$Id: file.h,v 1.83 2006/12/11 21:48:49 christos Exp $
*/
#ifndef __file_h__
@ -46,6 +46,7 @@
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#include <sys/types.h>
/* Do this here and now, because struct stat gets re-defined on solaris */
#include <sys/stat.h>
@ -73,7 +74,7 @@
#define MAXstring 32 /* max leng of "string" types */
#define MAGICNO 0xF11E041C
#define VERSIONNO 2
#define VERSIONNO 3
#define FILE_MAGICSIZE (32 * 4)
#define FILE_LOAD 0
@ -116,6 +117,15 @@ struct magic {
#define FILE_MEDATE 21
#define FILE_MELDATE 22
#define FILE_MELONG 23
#define FILE_QUAD 24
#define FILE_LEQUAD 25
#define FILE_BEQUAD 26
#define FILE_QDATE 27
#define FILE_LEQDATE 28
#define FILE_BEQDATE 29
#define FILE_QLDATE 30
#define FILE_LEQLDATE 31
#define FILE_BEQLDATE 32
#define FILE_FORMAT_NAME \
/* 0 */ "invalid 0", \
@ -141,16 +151,28 @@ struct magic {
/* 20 */ "search", \
/* 21 */ "medate", \
/* 22 */ "meldate", \
/* 23 */ "melong",
/* 23 */ "melong", \
/* 24 */ "quad", \
/* 25 */ "lequad", \
/* 26 */ "bequad", \
/* 27 */ "qdate", \
/* 28 */ "leqdate", \
/* 29 */ "beqdate", \
/* 30 */ "qldate", \
/* 31 */ "leqldate", \
/* 32 */ "beqldate",
#define FILE_FMT_NUM "cduxXi"
#define FILE_FMT_STR "s"
#define FILE_FMT_NONE 0
#define FILE_FMT_NUM 1 /* "cduxXi" */
#define FILE_FMT_STR 2 /* "s" */
#define FILE_FMT_QUAD 3 /* "ll" */
#define FILE_FORMAT_STRING \
/* 0 */ NULL, \
/* 0 */ FILE_FMT_NONE, \
/* 1 */ FILE_FMT_NUM, \
/* 2 */ FILE_FMT_NUM, \
/* 3 */ NULL, \
/* 3 */ FILE_FMT_NONE, \
/* 4 */ FILE_FMT_NUM, \
/* 5 */ FILE_FMT_STR, \
/* 6 */ FILE_FMT_STR, \
@ -170,7 +192,17 @@ struct magic {
/* 20 */ FILE_FMT_STR, \
/* 21 */ FILE_FMT_STR, \
/* 22 */ FILE_FMT_STR, \
/* 23 */ FILE_FMT_NUM,
/* 23 */ FILE_FMT_NUM, \
/* 24 */ FILE_FMT_QUAD, \
/* 25 */ FILE_FMT_QUAD, \
/* 26 */ FILE_FMT_QUAD, \
/* 27 */ FILE_FMT_STR, \
/* 28 */ FILE_FMT_STR, \
/* 29 */ FILE_FMT_STR, \
/* 30 */ FILE_FMT_STR, \
/* 31 */ FILE_FMT_STR, \
/* 32 */ FILE_FMT_STR,
/* Word 3 */
uint8_t in_op; /* operator for indirection */
@ -193,16 +225,15 @@ struct magic {
/* Word 5 */
int32_t in_offset; /* offset from indirection */
/* Word 6 */
uint32_t mask; /* mask before comparison with value */
/* Word 7 */
uint32_t dummy3;
/* Word 8 */
uint32_t dummp4;
uint32_t lineno; /* line number in magic file */
/* Word 7,8 */
uint64_t mask; /* mask before comparison with value */
/* Words 9-16 */
union VALUETYPE {
uint8_t b;
uint16_t h;
uint32_t l;
uint64_t q;
char s[MAXstring];
struct {
char *buf;
@ -210,6 +241,7 @@ struct magic {
} search;
uint8_t hs[2]; /* 2 bytes of a fixed-endian "short" */
uint8_t hl[4]; /* 4 bytes of a fixed-endian "long" */
uint8_t hq[8]; /* 8 bytes of a fixed-endian "quad" */
} value; /* either number or string */
/* Words 17..31 */
char desc[MAXDESC]; /* description */
@ -250,6 +282,7 @@ struct magic_set {
char *pbuf;
size_t psize;
} o;
uint32_t offset;
int error;
int flags;
int haderr;
@ -270,17 +303,23 @@ protected int file_ascmagic(struct magic_set *, const unsigned char *, size_t);
protected int file_is_tar(struct magic_set *, const unsigned char *, size_t);
protected int file_softmagic(struct magic_set *, const unsigned char *, size_t);
protected struct mlist *file_apprentice(struct magic_set *, const char *, int);
protected uint32_t file_signextend(struct magic_set *, struct magic *, uint32_t);
protected uint64_t file_signextend(struct magic_set *, struct magic *, uint64_t);
protected void file_delmagic(struct magic *, int type, size_t entries);
protected void file_badread(struct magic_set *);
protected void file_badseek(struct magic_set *);
protected void file_oomem(struct magic_set *);
protected void file_oomem(struct magic_set *, size_t);
protected void file_error(struct magic_set *, int, const char *, ...);
protected void file_magwarn(struct magic_set *, const char *, ...);
protected void file_mdump(struct magic *);
protected void file_showstr(FILE *, const char *, size_t);
protected size_t file_mbswidth(const char *);
protected const char *file_getbuffer(struct magic_set *);
protected ssize_t sread(int, void *, size_t);
#ifndef COMPILE_ONLY
extern const char *file_names[];
extern const size_t file_nnames;
#endif
#ifndef HAVE_STRERROR
extern int sys_nerr;
@ -309,6 +348,5 @@ int snprintf(char *, size_t, const char *, ...);
static const char *rcsid(const char *p) { \
return rcsid(p = id); \
}
#else
#endif /* __file_h__ */

View File

@ -33,9 +33,12 @@
#if defined(HAVE_WCHAR_H)
#include <wchar.h>
#endif
#if defined(HAVE_WCTYPE_H)
#include <wctype.h>
#endif
#ifndef lint
FILE_RCSID("@(#)$Id: funcs.c,v 1.19 2006/03/02 22:10:26 christos Exp $")
FILE_RCSID("@(#)$Id: funcs.c,v 1.23 2006/12/11 21:48:49 christos Exp $")
#endif /* lint */
#ifndef HAVE_VSNPRINTF
@ -57,7 +60,7 @@ file_printf(struct magic_set *ms, const char *fmt, ...)
if ((len = vsnprintf(ms->o.ptr, ms->o.len, fmt, ap)) >= ms->o.len) {
va_end(ap);
if ((buf = realloc(ms->o.buf, len + 1024)) == NULL) {
file_oomem(ms);
file_oomem(ms, len + 1024);
return -1;
}
ms->o.ptr = buf + (ms->o.ptr - ms->o.buf);
@ -99,9 +102,9 @@ file_error(struct magic_set *ms, int error, const char *f, ...)
protected void
file_oomem(struct magic_set *ms)
file_oomem(struct magic_set *ms, size_t len)
{
file_error(ms, errno, "cannot allocate memory");
file_error(ms, errno, "cannot allocate %zu bytes", len);
}
protected void
@ -159,11 +162,12 @@ file_reset(struct magic_set *ms)
}
#define OCTALIFY(n, o) \
*(n)++ = '\\', \
/*LINTED*/ \
(void)(*(n)++ = '\\', \
*(n)++ = (((uint32_t)*(o) >> 6) & 3) + '0', \
*(n)++ = (((uint32_t)*(o) >> 3) & 7) + '0', \
*(n)++ = (((uint32_t)*(o) >> 0) & 7) + '0', \
(o)++
(o)++)
protected const char *
file_getbuffer(struct magic_set *ms)
@ -180,7 +184,7 @@ file_getbuffer(struct magic_set *ms)
nsize = ms->o.len * 4 + 1;
if (ms->o.psize < nsize) {
if ((nbuf = realloc(ms->o.pbuf, nsize)) == NULL) {
file_oomem(ms);
file_oomem(ms, nsize);
return NULL;
}
ms->o.psize = nsize;
@ -201,15 +205,15 @@ file_getbuffer(struct magic_set *ms)
eop = op + strlen(ms->o.buf);
while (op < eop) {
bytesconsumed = mbrtowc(&nextchar, op, eop - op,
&state);
bytesconsumed = mbrtowc(&nextchar, op,
(size_t)(eop - op), &state);
if (bytesconsumed == (size_t)(-1) ||
bytesconsumed == (size_t)(-2)) {
mb_conv = 0;
break;
}
if (iswprint(nextchar) ) {
if (iswprint(nextchar)) {
(void)memcpy(np, op, bytesconsumed);
op += bytesconsumed;
np += bytesconsumed;
@ -238,8 +242,8 @@ file_getbuffer(struct magic_set *ms)
}
/*
* Yes these suffer from buffer overflows, but if your OS does not have
* these functions, then maybe you should consider replacing your OS?
* Yes these wrappers suffer from buffer overflows, but if your OS does not have
* the real functions, maybe you should consider replacing your OS?
*/
#ifndef HAVE_VSNPRINTF
int

View File

@ -1,19 +1,38 @@
#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
scriptversion=2005-05-14.22
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
# following copyright and license.
#
# Copyright 1991 by the Massachusetts Institute of Technology
# Copyright (C) 1994 X Consortium
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name of the X Consortium shall not
# be used in advertising or otherwise to promote the sale, use or other deal-
# ings in this Software without prior written authorization from the X Consor-
# tium.
#
#
# FSF changes to this file are in the public domain.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
@ -23,13 +42,11 @@
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
@ -41,29 +58,59 @@ stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
transformbasename=""
transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=""
chgrpcmd=""
stripcmd=""
chowncmd=
chgrpcmd=
stripcmd=
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""
src=
dst=
dir_arg=
dstarg=
no_target_directory=
while [ x"$1" != x ]; do
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
or: $0 [OPTION]... SRCFILES... DIRECTORY
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
or: $0 [OPTION]... -d DIRECTORIES...
In the 1st form, copy SRCFILE to DSTFILE.
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
In the 4th, create DIRECTORIES.
Options:
-c (ignored)
-d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER.
-s $stripprog installed files.
-t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory.
--help display this help and exit.
--version display version info and exit.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
"
while test -n "$1"; do
case $1 in
-c) instcmd="$cpprog"
shift
-c) shift
continue;;
-d) dir_arg=true
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
--help) echo "$usage"; exit $?;;
-m) chmodcmd="$chmodprog $2"
shift
shift
@ -74,178 +121,203 @@ while [ x"$1" != x ]; do
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
-s) stripcmd=$stripprog
shift
continue;;
-t) dstarg=$2
shift
shift
continue;;
-s) stripcmd="$stripprog"
-T) no_target_directory=true
shift
continue;;
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
shift
continue;;
--version) echo "$0 $scriptversion"; exit $?;;
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
shift
continue;;
*) if [ x"$src" = x ]
then
src=$1
else
# this colon is to work around a 386BSD /bin/sh bug
:
dst=$1
*) # When -d is used, all remaining arguments are directories to create.
# When -t is used, the destination is already specified.
test -n "$dir_arg$dstarg" && break
# Otherwise, the last argument is the destination. Remove it from $@.
for arg
do
if test -n "$dstarg"; then
# $@ is not empty: it contains at least $arg.
set fnord "$@" "$dstarg"
shift # fnord
fi
shift
continue;;
shift # arg
dstarg=$arg
done
break;;
esac
done
if [ x"$src" = x ]
then
echo "install: no input file specified"
if test -z "$1"; then
if test -z "$dir_arg"; then
echo "$0: no input file specified." >&2
exit 1
else
:
fi
# It's OK to call `install-sh -d' without argument.
# This can happen when creating conditional directories.
exit 0
fi
if [ x"$dir_arg" != x ]; then
for src
do
# Protect names starting with `-'.
case $src in
-*) src=./$src ;;
esac
if test -n "$dir_arg"; then
dst=$src
src=""
src=
if [ -d $dst ]; then
instcmd=:
chmodcmd=""
if test -d "$dst"; then
mkdircmd=:
chmodcmd=
else
instcmd=$mkdirprog
mkdircmd=$mkdirprog
fi
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f "$src" ] || [ -d "$src" ]
then
:
else
echo "install: $src does not exist"
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if test ! -f "$src" && test ! -d "$src"; then
echo "$0: $src does not exist." >&2
exit 1
fi
if [ x"$dst" = x ]
then
echo "install: no destination specified"
if test -z "$dstarg"; then
echo "$0: no destination specified." >&2
exit 1
else
:
fi
# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic
dst=$dstarg
# Protect names starting with `-'.
case $dst in
-*) dst=./$dst ;;
esac
if [ -d $dst ]
then
dst="$dst"/`basename $src`
else
:
# If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored.
if test -d "$dst"; then
if test -n "$no_target_directory"; then
echo "$0: $dstarg: Is a directory" >&2
exit 1
fi
dst=$dst/`basename "$src"`
fi
fi
fi
## this sed command emulates the dirname command
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
# This sed command emulates the dirname command.
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# this part is taken from Noah Friedman's mkinstalldirs script
# Make sure that the destination directory exists.
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
defaultIFS='
# Skip lots of stat calls in the usual case.
if test ! -d "$dstdir"; then
defaultIFS='
'
IFS="${IFS-${defaultIFS}}"
IFS="${IFS-$defaultIFS}"
oIFS="${IFS}"
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS="${oIFS}"
pathcomp=''
while [ $# -ne 0 ] ; do
pathcomp="${pathcomp}${1}"
oIFS=$IFS
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
shift
IFS=$oIFS
if [ ! -d "${pathcomp}" ] ;
then
$mkdirprog "${pathcomp}"
pathcomp=
while test $# -ne 0 ; do
pathcomp=$pathcomp$1
shift
if test ! -d "$pathcomp"; then
$mkdirprog "$pathcomp"
# mkdir can fail with a `File exist' error in case several
# install-sh are creating the directory concurrently. This
# is OK.
test -d "$pathcomp" || exit
fi
pathcomp=$pathcomp/
done
fi
if test -n "$dir_arg"; then
$doit $mkdircmd "$dst" \
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
else
dstfile=`basename "$dst"`
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_
rmtmp=$dstdir/_rm.$$_
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
trap '(exit $?); exit' 1 2 13 15
# Copy the file name to the temp name.
$doit $cpprog "$src" "$dsttmp" &&
# and set any options; do chmod last to preserve setuid bits.
#
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $cpprog $src $dsttmp" command.
#
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
# Now rename the file to the real destination.
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|| {
# The rename failed, perhaps because mv can't rename something else
# to itself, or perhaps because mv is so ancient that it does not
# support -f.
# Now remove or move aside any old file at destination location.
# We try this two ways since rm can't unlink itself on some
# systems and the destination file might be busy for other
# reasons. In this case, the final cleanup might fail but the new
# file should still install successfully.
{
if test -f "$dstdir/$dstfile"; then
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|| {
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
(exit 1); exit 1
}
else
:
fi
} &&
pathcomp="${pathcomp}/"
# Now rename the file to the real destination.
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
}
}
fi || { (exit 1); exit 1; }
done
fi
if [ x"$dir_arg" != x ]
then
$doit $instcmd $dst &&
# The final little trick to "correctly" pass the exit status to the exit trap.
{
(exit 0); exit 0
}
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
else
# If we're going to rename the final executable, determine the name now.
if [ x"$transformarg" = x ]
then
dstfile=`basename $dst`
else
dstfile=`basename $dst $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
if [ x"$dstfile" = x ]
then
dstfile=`basename $dst`
else
:
fi
# Make a temp file name in the proper directory.
dsttmp=$dstdir/#inst.$$#
# Move or copy the file name to the temp name
$doit $instcmd $src $dsttmp &&
trap "rm -f ${dsttmp}" 0 &&
# and set any options; do chmod last to preserve setuid bits
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
# Now rename the file to the real destination.
$doit $rmcmd -f $dstdir/$dstfile &&
$doit $mvcmd $dsttmp $dstdir/$dstfile
fi &&
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:

View File

@ -45,7 +45,7 @@
#include "tar.h"
#ifndef lint
FILE_RCSID("@(#)$Id: is_tar.c,v 1.25 2004/09/11 19:15:57 christos Exp $")
FILE_RCSID("@(#)$Id: is_tar.c,v 1.26 2006/05/03 15:19:25 christos Exp $")
#endif
#define isodigit(c) ( ((c) >= '0') && ((c) <= '7') )
@ -71,6 +71,12 @@ file_is_tar(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
"application/x-tar, POSIX" : "POSIX tar archive") == -1)
return -1;
return 1;
case 3:
if (file_printf(ms, (ms->flags & MAGIC_MIME) ?
"application/x-tar, POSIX (GNU)" :
"POSIX tar archive (GNU)") == -1)
return -1;
return 1;
default:
return 0;
}
@ -113,7 +119,9 @@ is_tar(const unsigned char *buf, size_t nbytes)
if (sum != recsum)
return 0; /* Not a tar archive */
if (0==strcmp(header->header.magic, TMAGIC))
if (strcmp(header->header.magic, GNUTMAGIC) == 0)
return 3; /* GNU Unix Standard tar archive */
if (strcmp(header->header.magic, TMAGIC) == 0)
return 2; /* Unix Standard tar archive */
return 1; /* Old fashioned tar archive */

View File

@ -38,6 +38,7 @@
#ifdef QUICK
#include <sys/mman.h>
#endif
#include <limits.h> /* for PIPE_BUF */
#if defined(HAVE_UTIMES)
# include <sys/time.h>
@ -62,7 +63,7 @@
#include "patchlevel.h"
#ifndef lint
FILE_RCSID("@(#)$Id: magic.c,v 1.32 2005/10/17 15:31:10 christos Exp $")
FILE_RCSID("@(#)$Id: magic.c,v 1.35 2006/10/31 19:37:17 christos Exp $")
#endif /* lint */
#ifdef __EMX__
@ -74,6 +75,7 @@ protected int file_os2_apptype(struct magic_set *ms, const char *fn,
private void free_mlist(struct mlist *);
private void close_and_restore(const struct magic_set *, const char *, int,
const struct stat *);
private int info_from_stat(struct magic_set *, mode_t);
#ifndef STDIN_FILENO
#define STDIN_FILENO 0
@ -136,9 +138,26 @@ free_mlist(struct mlist *mlist)
free(ml);
}
private int
info_from_stat(struct magic_set *ms, mode_t md)
{
/* We cannot open it, but we were able to stat it. */
if (md & 0222)
if (file_printf(ms, "writable, ") == -1)
return -1;
if (md & 0111)
if (file_printf(ms, "executable, ") == -1)
return -1;
if (S_ISREG(md))
if (file_printf(ms, "regular file, ") == -1)
return -1;
if (file_printf(ms, "no read permission") == -1)
return -1;
return 0;
}
public void
magic_close(ms)
struct magic_set *ms;
magic_close(struct magic_set *ms)
{
free_mlist(ms->mlist);
free(ms->o.pbuf);
@ -221,6 +240,7 @@ magic_file(struct magic_set *ms, const char *inname)
unsigned char *buf;
struct stat sb;
ssize_t nbytes = 0; /* number of bytes read from a datafile */
int ispipe = 0;
/*
* one extra for terminating '\0', and
@ -234,49 +254,76 @@ magic_file(struct magic_set *ms, const char *inname)
goto done;
switch (file_fsmagic(ms, inname, &sb)) {
case -1:
case -1: /* error */
goto done;
case 0:
case 0: /* nothing found */
break;
default:
default: /* matched it and printed type */
rv = 0;
goto done;
}
if (inname == NULL)
if (inname == NULL) {
fd = STDIN_FILENO;
else if ((fd = open(inname, O_RDONLY|O_BINARY)) < 0) {
if (fstat(fd, &sb) == 0 && S_ISFIFO(sb.st_mode))
ispipe = 1;
} else {
int flags = O_RDONLY|O_BINARY;
if (stat(inname, &sb) == 0 && S_ISFIFO(sb.st_mode)) {
flags |= O_NONBLOCK;
ispipe = 1;
}
errno = 0;
if ((fd = open(inname, flags)) < 0) {
#ifdef __CYGWIN__
char *tmp = alloca(strlen(inname) + 5);
(void)strcat(strcpy(tmp, inname), ".exe");
if ((fd = open(tmp, O_RDONLY|O_BINARY)) < 0) {
if ((fd = open(tmp, flags)) < 0) {
#endif
/* We cannot open it, but we were able to stat it. */
if (sb.st_mode & 0222)
if (file_printf(ms, "writable, ") == -1)
goto done;
if (sb.st_mode & 0111)
if (file_printf(ms, "executable, ") == -1)
goto done;
if (S_ISREG(sb.st_mode))
if (file_printf(ms, "regular file, ") == -1)
goto done;
if (file_printf(ms, "no read permission") == -1)
if (info_from_stat(ms, sb.st_mode) == -1)
goto done;
rv = 0;
goto done;
#ifdef __CYGWIN__
}
#endif
}
#ifdef O_NONBLOCK
if ((flags = fcntl(fd, F_GETFL)) != -1) {
flags &= ~O_NONBLOCK;
(void)fcntl(fd, F_SETFL, flags);
}
#endif
}
/*
* try looking at the first HOWMANY bytes
*/
if (ispipe) {
ssize_t r = 0;
while ((r = sread(fd, (void *)&buf[nbytes],
(size_t)(HOWMANY - nbytes))) > 0) {
nbytes += r;
if (r < PIPE_BUF) break;
}
if (nbytes == 0) {
/* We can not read it, but we were able to stat it. */
if (info_from_stat(ms, sb.st_mode) == -1)
goto done;
rv = 0;
goto done;
}
} else {
if ((nbytes = read(fd, (char *)buf, HOWMANY)) == -1) {
file_error(ms, errno, "cannot read `%s'", inname);
goto done;
}
}
if (nbytes == 0) {
if (file_printf(ms, (ms->flags & MAGIC_MIME) ?

View File

@ -99,9 +99,7 @@
# svg
0 string \<?xml
# text/xml
>38 string \<\!DOCTYPE\040svg image/svg+xml
38 string \<\!DOCTYPE\040svg image/svg+xml
# xml
@ -111,8 +109,8 @@
#------------------------------------------------------------------------------
# Java
0 short 0xcafe
>2 short 0xbabe application/java
0 beshort 0xcafe
>2 beshort 0xbabe application/java
#------------------------------------------------------------------------------
# audio: file(1) magic for sound formats
@ -209,8 +207,8 @@
# ideally should go into "images", but entries below would tag XPM as C source
0 string /*\ XPM image/x-xpmi 7bit
# 3DS (3d Studio files)
16 beshort 0x3d3d image/x-3ds
# 3DS (3d Studio files) Conflicts with diff output 0x3d '='
#16 beshort 0x3d3d image/x-3ds
# this first will upset you if you're a PL/1 shop... (are there any left?)
# in which case rm it; ascmagic will catch real C programs
@ -408,10 +406,7 @@
0 string \<!-- text/html
0 string \<h1 text/html
0 string \<H1 text/html
0 string \<!doctype\ HTML text/html
0 string \<!DOCTYPE\ HTML text/html
0 string \<!doctype\ html text/html
0 string \<!doctype\ HTML text/html
0 string/c \<!doctype\ html text/html
#------------------------------------------------------------------------------
# images: file(1) magic for image formats (see also "c-lang" for XPM bitmaps)
@ -530,7 +525,11 @@
#
0 string \376\067\0\043 application/msword
0 string \320\317\021\340\241\261 application/msword
# disable this one because it applies also to other
# Office/OLE documents for which msword is not correct. See PR#2608.
# from magic file of the apache
#0 string \320\317\021\340\241\261 application/msword
512 string \354\245\301 application/msword
0 string \333\245-\0\0\0 application/msword
@ -603,7 +602,7 @@
0 belong 0x000001B3 video/mpv
0 belong&0xFF5FFF1F 0x47400010 video/mp2t
0 belong 0x00000001
>4 byte&1F 0x07 video/h264
>4 byte&0x1F 0x07 video/h264
# FLI animation format
0 leshort 0xAF11 video/fli
@ -924,3 +923,16 @@
# From: Denis Knauf, via gentoo.
0 string fLaC audio/x-flac
0 string CWS application/x-shockwave-flash
# Hangul Document Files:
# Reversed-engineered HWP magic numbers
# From: Won-Kyu Park <wkpark@kldp.org>
512 string R\0o\0o\0t\0 application/x-hwp
0 string/c BEGIN:VCARD text/x-vcard
0 string WordPro\0 application/vnd.lotus-wordpro
0 string WordPro\r\373 application/vnd.lotus-wordpro
0 string CPC\262 image/cpi
#
128 string DICM application/dicom

View File

@ -1,6 +1,6 @@
#! /usr/bin/env perl
# -*- PERL -*-
# $Id: magic2mime,v 1.3 2006/03/02 22:10:26 christos Exp $
# $Id: magic2mime,v 1.4 2006/11/25 18:36:10 christos Exp $
# Copyright (c) 1996, 1997 vax@linkdead.paranoia.com (VaX#n8)
#
# Usage: echo 'your-file-output-here' | file_to_ctype.pl
@ -42,6 +42,7 @@
'^Sun/NeXT audio data', 'audio/basic',
'^MPEG', 'video/mpeg',
'^Apple QuickTime movie', 'video/quicktime',
'^DICOM medical imaging data', 'application/dicom',
# made up by me
'^bitmap', 'image/x-bitmap',
'^PC bitmap data, Windows 3.x format', 'image/x-msw3bmp',

View File

@ -1,28 +1,55 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
scriptversion=2005-06-29.22
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain
# Public domain.
#
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
errstatus=0
dirmode=""
dirmode=
usage="\
Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
Create each directory DIR (with mode MODE, if specified), including all
leading file name components.
Report bugs to <bug-automake@gnu.org>."
# process command line arguments
while test $# -gt 0 ; do
case "${1}" in
-h | --help | --h* ) # -h for help
echo "${usage}" 1>&2; exit 0 ;;
-m ) # -m PERM arg
case $1 in
-h | --help | --h*) # -h for help
echo "$usage"
exit $?
;;
-m) # -m PERM arg
shift
test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
dirmode="${1}"
shift ;;
-- ) shift; break ;; # stop option processing
-* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option
* ) break ;; # first non-opt arg
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
dirmode=$1
shift
;;
--version)
echo "$0 $scriptversion"
exit $?
;;
--) # stop option processing
shift
break
;;
-*) # unknown option
echo "$usage" 1>&2
exit 1
;;
*) # first non-opt arg
break
;;
esac
done
@ -36,33 +63,63 @@ do
done
case $# in
0) exit 0 ;;
0) exit 0 ;;
esac
# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
# mkdir -p a/c at the same time, both will detect that a is missing,
# one will create a, then the other will try to create a and die with
# a "File exists" error. This is a problem when calling mkinstalldirs
# from a parallel make. We use --version in the probe to restrict
# ourselves to GNU mkdir, which is thread-safe.
case $dirmode in
'')
if mkdir -p -- . 2>/dev/null; then
'')
if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
fi ;;
*)
if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
else
# On NextStep and OpenStep, the `mkdir' command does not
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
test -d ./-p && rmdir ./-p
test -d ./--version && rmdir ./--version
fi
;;
*)
if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
test ! -d ./--version; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
fi ;;
else
# Clean up after NextStep and OpenStep mkdir.
for d in ./-m ./-p ./--version "./$dirmode";
do
test -d $d && rmdir $d
done
fi
;;
esac
for file
do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
case $file in
/*) pathcomp=/ ;;
*) pathcomp= ;;
esac
oIFS=$IFS
IFS=/
set fnord $file
shift
IFS=$oIFS
pathcomp=
for d
do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
test "x$d" = x && continue
pathcomp=$pathcomp$d
case $pathcomp in
-*) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
@ -75,8 +132,7 @@ do
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
lasterr=""
lasterr=
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
@ -86,7 +142,7 @@ do
fi
fi
pathcomp="$pathcomp/"
pathcomp=$pathcomp/
done
done
@ -94,6 +150,9 @@ exit $errstatus
# Local Variables:
# mode: shell-script
# sh-indentation: 3
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:
# mkinstalldirs ends here

View File

@ -1,11 +1,17 @@
#define FILE_VERSION_MAJOR 4
#define patchlevel 17
#define patchlevel 19
/*
* Patchlevel file for Ian Darwin's MAGIC command.
* $Id: patchlevel.h,v 1.60 2006/03/02 22:15:12 christos Exp $
* $Id: patchlevel.h,v 1.62 2006/12/11 21:49:58 christos Exp $
*
* $Log: patchlevel.h,v $
* Revision 1.62 2006/12/11 21:49:58 christos
* time for 4.19
*
* Revision 1.61 2006/10/31 21:18:09 christos
* bump
*
* Revision 1.60 2006/03/02 22:15:12 christos
* welcome to 4.17
*

View File

@ -41,7 +41,7 @@
#include <time.h>
#ifndef lint
FILE_RCSID("@(#)$Id: print.c,v 1.50 2006/03/02 22:07:53 christos Exp $")
FILE_RCSID("@(#)$Id: print.c,v 1.56 2006/12/08 20:31:07 christos Exp $")
#endif /* lint */
#define SZOF(a) (sizeof(a) / sizeof(a[0]))
@ -50,18 +50,17 @@ FILE_RCSID("@(#)$Id: print.c,v 1.50 2006/03/02 22:07:53 christos Exp $")
protected void
file_mdump(struct magic *m)
{
private const char *typ[] = { FILE_FORMAT_NAME };
private const char optyp[] = { FILE_OPS };
(void) fputc('[', stderr);
(void) fprintf(stderr, "[%zu", m->lineno);
(void) fprintf(stderr, ">>>>>>>> %d" + 8 - (m->cont_level & 7),
m->offset);
if (m->flag & INDIR) {
(void) fprintf(stderr, "(%s,",
/* Note: type is unsigned */
(m->in_type < SZOF(typ)) ?
typ[m->in_type] : "*bad*");
(m->in_type < file_nnames) ?
file_names[m->in_type] : "*bad*");
if (m->in_op & FILE_OPINVERSE)
(void) fputc('~', stderr);
(void) fprintf(stderr, "%c%d),",
@ -71,7 +70,7 @@ file_mdump(struct magic *m)
}
(void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "",
/* Note: type is unsigned */
(m->type < SZOF(typ)) ? typ[m->type] : "*bad*");
(m->type < file_nnames) ? file_names[m->type] : "*bad*");
if (m->mask_op & FILE_OPINVERSE)
(void) fputc('~', stderr);
if (m->mask) {
@ -80,7 +79,8 @@ file_mdump(struct magic *m)
else
fputc('?', stderr);
if (FILE_STRING != m->type || FILE_PSTRING != m->type)
(void) fprintf(stderr, "%.8x", m->mask);
(void) fprintf(stderr, "%.8llx",
(unsigned long long)m->mask);
else {
if (m->mask & STRING_IGNORE_LOWERCASE)
(void) fputc(CHAR_IGNORE_LOWERCASE, stderr);
@ -106,13 +106,19 @@ file_mdump(struct magic *m)
case FILE_BELONG:
(void) fprintf(stderr, "%d", m->value.l);
break;
case FILE_BEQUAD:
case FILE_LEQUAD:
case FILE_QUAD:
(void) fprintf(stderr, "%lld",
(unsigned long long)m->value.q);
break;
case FILE_PSTRING:
case FILE_STRING:
case FILE_REGEX:
case FILE_BESTRING16:
case FILE_LESTRING16:
case FILE_SEARCH:
file_showstr(stderr, m->value.s, m->vallen);
file_showstr(stderr, m->value.s, (size_t)m->vallen);
break;
case FILE_DATE:
case FILE_LEDATE:
@ -128,6 +134,18 @@ file_mdump(struct magic *m)
(void)fprintf(stderr, "%s,",
file_fmttime(m->value.l, 0));
break;
case FILE_QDATE:
case FILE_LEQDATE:
case FILE_BEQDATE:
(void)fprintf(stderr, "%s,",
file_fmttime((uint32_t)m->value.q, 1));
break;
case FILE_QLDATE:
case FILE_LEQLDATE:
case FILE_BEQLDATE:
(void)fprintf(stderr, "%s,",
file_fmttime((uint32_t)m->value.q, 0));
break;
default:
(void) fputs("*bad*", stderr);
break;

View File

@ -37,14 +37,16 @@
#include "readelf.h"
#ifndef lint
FILE_RCSID("@(#)$Id: readelf.c,v 1.54 2006/01/13 00:45:21 christos Exp $")
FILE_RCSID("@(#)$Id: readelf.c,v 1.61 2006/11/15 15:53:23 christos Exp $")
#endif
#ifdef ELFCORE
private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t);
private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t,
off_t, int *);
#endif
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 dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t,
off_t, int *);
private int doshn(struct magic_set *, int, int, int, off_t, int, size_t, int *);
private size_t donote(struct magic_set *, unsigned char *, size_t, size_t, int,
int, size_t, int *);
@ -189,14 +191,15 @@ getu64(int swap, uint64_t value)
#ifdef ELFCORE
size_t prpsoffsets32[] = {
8, /* FreeBSD */
28, /* Linux 2.0.36 */
32, /* Linux (I forget which kernel version) */
28, /* Linux 2.0.36 (short name) */
44, /* Linux (path name) */
84, /* SunOS 5.x */
};
size_t prpsoffsets64[] = {
16, /* FreeBSD, 64-bit */
40, /* Linux (tested on core from 2.4.x) */
40, /* Linux (tested on core from 2.4.x, short name) */
56, /* Linux (path name) */
120, /* SunOS 5.x, 64-bit */
};
@ -237,17 +240,24 @@ private const char *os_style_names[] = {
};
#define FLAGS_DID_CORE 1
#define FLAGS_DID_NOTE 2
private int
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, off_t fsize, int *flags)
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
size_t offset;
unsigned char nbuf[BUFSIZ];
ssize_t bufsize;
int flags = 0;
off_t savedoffset;
struct stat st;
if (fstat(fd, &st) < 0) {
file_badread(ms);
return -1;
}
if (size != xph_sizeof) {
if (file_printf(ms, ", corrupted program header size") == -1)
@ -259,7 +269,7 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
* Loop through all the program headers.
*/
for ( ; num; num--) {
if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
if ((savedoffset = lseek(fd, off, SEEK_SET)) == (off_t)-1) {
file_badseek(ms);
return -1;
}
@ -267,6 +277,14 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
file_badread(ms);
return -1;
}
if (xph_offset > fsize) {
if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
}
continue;
}
off += size;
if (xph_type != PT_NOTE)
continue;
@ -290,7 +308,7 @@ dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
if (offset >= (size_t)bufsize)
break;
offset = donote(ms, nbuf, offset, (size_t)bufsize,
class, swap, 4, &flags);
class, swap, 4, flags);
if (offset == 0)
break;
@ -321,7 +339,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
/*
* We're out of note headers.
*/
return offset;
return (offset >= size) ? offset : size;
}
if (namesz & 0x80000000) {
@ -349,9 +367,15 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
offset = ELF_ALIGN(doff + descsz);
if (doff + descsz > size) {
return offset;
/*
* We're past the end of the buffer.
*/
return (offset >= size) ? offset : size;
}
if (*flags & FLAGS_DID_NOTE)
goto core;
if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
xnh_type == NT_GNU_VERSION && descsz == 16) {
uint32_t desc[4];
@ -379,6 +403,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
if (file_printf(ms, " %d.%d.%d", getu32(swap, desc[1]),
getu32(swap, desc[2]), getu32(swap, desc[3])) == -1)
return size;
*flags |= FLAGS_DID_NOTE;
return size;
}
@ -403,10 +428,10 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
* p = patchlevel
*/
if (desc > 100000000U) {
u_int ver_patch = (desc / 100) % 100;
u_int ver_rel = (desc / 10000) % 100;
u_int ver_min = (desc / 1000000) % 100;
u_int ver_maj = desc / 100000000;
uint32_t ver_patch = (desc / 100) % 100;
uint32_t ver_rel = (desc / 10000) % 100;
uint32_t ver_min = (desc / 1000000) % 100;
uint32_t ver_maj = desc / 100000000;
if (file_printf(ms, " %u.%u", ver_maj, ver_min) == -1)
return size;
@ -415,12 +440,16 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
return size;
} else if (ver_rel != 0) {
while (ver_rel > 26) {
file_printf(ms, "Z");
if (file_printf(ms, "Z") == -1)
return size;
ver_rel -= 26;
}
file_printf(ms, "%c", 'A' + ver_rel - 1);
if (file_printf(ms, "%c", 'A' + ver_rel - 1)
== -1)
return size;
}
}
*flags |= FLAGS_DID_NOTE;
return size;
}
@ -498,6 +527,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
return size;
}
}
*flags |= FLAGS_DID_NOTE;
return size;
}
@ -506,6 +536,7 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
if (file_printf(ms, ", for OpenBSD") == -1)
return size;
/* Content of note is always 0 */
*flags |= FLAGS_DID_NOTE;
return size;
}
@ -519,9 +550,11 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
if (file_printf(ms, " %d.%d.%d", desc / 100000,
desc / 10000 % 10, desc % 10000) == -1)
return size;
*flags |= FLAGS_DID_NOTE;
return size;
}
core:
/*
* Sigh. The 2.0.36 kernel in Debian 2.1, at
* least, doesn't correctly implement name
@ -551,13 +584,13 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
}
#ifdef ELFCORE
if (os_style != -1) {
if ((*flags & FLAGS_DID_CORE) == 0) {
if (file_printf(ms, ", %s-style",
os_style_names[os_style]) == -1)
if ((*flags & FLAGS_DID_CORE) != 0)
return size;
if (os_style != -1) {
if (file_printf(ms, ", %s-style", os_style_names[os_style])
== -1)
return size;
*flags |= FLAGS_DID_CORE;
}
}
switch (os_style) {
@ -660,17 +693,17 @@ donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
break;
}
#endif
*flags |= FLAGS_DID_CORE;
return offset;
}
private int
doshn(struct magic_set *ms, int class, int swap, int fd, off_t off, int num,
size_t size)
size_t size, int *flags)
{
Elf32_Shdr sh32;
Elf64_Shdr sh64;
int stripped = 1;
int flags = 0;
void *nbuf;
off_t noff;
@ -727,7 +760,7 @@ doshn(struct magic_set *ms, int class, int swap, int fd, off_t off, int num,
break;
noff = donote(ms, nbuf, (size_t)noff,
(size_t)xsh_size, class, swap, 4,
&flags);
flags);
if (noff == 0)
break;
}
@ -752,7 +785,7 @@ doshn(struct magic_set *ms, int class, int swap, int fd, off_t off, int num,
*/
private int
dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
int num, size_t size)
int num, size_t size, off_t fsize, int *flags)
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
@ -761,14 +794,20 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
unsigned char nbuf[BUFSIZ];
int bufsize;
size_t offset, align;
off_t savedoffset;
int flags = 0;
off_t savedoffset = (off_t)-1;
struct stat st;
if (fstat(fd, &st) < 0) {
file_badread(ms);
return -1;
}
if (size != xph_sizeof) {
if (file_printf(ms, ", corrupted program header size") == -1)
return -1;
return 0;
}
if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
@ -779,11 +818,27 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
file_badread(ms);
return -1;
}
if (xph_offset > st.st_size && savedoffset != (off_t)-1) {
if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
}
continue;
}
if ((savedoffset = lseek(fd, (off_t)0, SEEK_CUR)) == (off_t)-1) {
file_badseek(ms);
return -1;
}
if (xph_offset > fsize) {
if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
}
continue;
}
switch (xph_type) {
case PT_DYNAMIC:
linking_style = "dynamically";
@ -820,7 +875,7 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
break;
offset = donote(ms, nbuf, offset,
(size_t)bufsize, class, swap, align,
&flags);
flags);
if (offset == 0)
break;
}
@ -848,6 +903,9 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
} u;
int class;
int swap;
struct stat st;
off_t fsize;
int flags = 0;
/*
* If we cannot seek, it must be a pipe, socket or fifo.
@ -855,6 +913,12 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
if((lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) && (errno == ESPIPE))
fd = file_pipe2file(ms, fd, buf, nbytes);
if (fstat(fd, &st) == -1) {
file_badread(ms);
return -1;
}
fsize = st.st_size;
/*
* ELF executables have multiple section headers in arbitrary
* file locations and thus file(1) cannot determine it from easily.
@ -867,7 +931,7 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
return 0;
class = buf[4];
class = buf[EI_CLASS];
if (class == ELFCLASS32) {
Elf32_Ehdr elfhdr;
@ -877,14 +941,15 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
u.l = 1;
(void) memcpy(&elfhdr, buf, sizeof elfhdr);
swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[5];
swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[EI_DATA];
if (getu16(swap, elfhdr.e_type) == ET_CORE) {
#ifdef ELFCORE
if (dophn_core(ms, class, swap, fd,
(off_t)getu32(swap, elfhdr.e_phoff),
getu16(swap, elfhdr.e_phnum),
(size_t)getu16(swap, elfhdr.e_phentsize)) == -1)
(size_t)getu16(swap, elfhdr.e_phentsize),
fsize, &flags) == -1)
return -1;
#else
;
@ -894,14 +959,16 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
if (dophn_exec(ms, class, swap,
fd, (off_t)getu32(swap, elfhdr.e_phoff),
getu16(swap, elfhdr.e_phnum),
(size_t)getu16(swap, elfhdr.e_phentsize))
(size_t)getu16(swap, elfhdr.e_phentsize),
fsize, &flags)
== -1)
return -1;
}
if (doshn(ms, class, swap, fd,
(off_t)getu32(swap, elfhdr.e_shoff),
getu16(swap, elfhdr.e_shnum),
(size_t)getu16(swap, elfhdr.e_shentsize)) == -1)
(size_t)getu16(swap, elfhdr.e_shentsize),
&flags) == -1)
return -1;
}
return 1;
@ -915,14 +982,15 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
u.l = 1;
(void) memcpy(&elfhdr, buf, sizeof elfhdr);
swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[5];
swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[EI_DATA];
if (getu16(swap, elfhdr.e_type) == ET_CORE) {
#ifdef ELFCORE
if (dophn_core(ms, class, swap, fd,
(off_t)elf_getu64(swap, elfhdr.e_phoff),
getu16(swap, elfhdr.e_phnum),
(size_t)getu16(swap, elfhdr.e_phentsize)) == -1)
(size_t)getu16(swap, elfhdr.e_phentsize),
fsize, &flags) == -1)
return -1;
#else
;
@ -932,14 +1000,15 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
if (dophn_exec(ms, class, swap, fd,
(off_t)elf_getu64(swap, elfhdr.e_phoff),
getu16(swap, elfhdr.e_phnum),
(size_t)getu16(swap, elfhdr.e_phentsize))
== -1)
(size_t)getu16(swap, elfhdr.e_phentsize),
fsize, &flags) == -1)
return -1;
}
if (doshn(ms, class, swap, fd,
(off_t)elf_getu64(swap, elfhdr.e_shoff),
getu16(swap, elfhdr.e_shnum),
(size_t)getu16(swap, elfhdr.e_shentsize)) == -1)
(size_t)getu16(swap, elfhdr.e_shentsize), &flags)
== -1)
return -1;
}
return 1;

View File

@ -39,24 +39,28 @@
#ifndef lint
FILE_RCSID("@(#)$Id: softmagic.c,v 1.78 2006/03/12 22:09:33 christos Exp $")
FILE_RCSID("@(#)$Id: softmagic.c,v 1.87 2006/12/11 21:48:49 christos Exp $")
#endif /* lint */
private int match(struct magic_set *, struct magic *, uint32_t,
const unsigned char *, size_t);
private int mget(struct magic_set *, union VALUETYPE *, const unsigned char *,
struct magic *, size_t, unsigned int);
private int mcheck(struct magic_set *, union VALUETYPE *, struct magic *);
private int magiccheck(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 int mcopy(struct magic_set *, union VALUETYPE *, int, int,
const unsigned char *, size_t, size_t);
const unsigned char *, uint32_t, size_t);
private int mconvert(struct magic_set *, union VALUETYPE *, struct magic *);
private int check_mem(struct magic_set *, unsigned int);
private int print_sep(struct magic_set *, int);
private void cvt_8(union VALUETYPE *, const struct magic *);
private void cvt_16(union VALUETYPE *, const struct magic *);
private void cvt_32(union VALUETYPE *, const struct magic *);
private void cvt_64(union VALUETYPE *, const struct magic *);
/*
* softmagic - lookup one file in database
* (already read from MAGIC by apprentice.c).
* softmagic - lookup one file in parsed, in-memory copy of database
* Passed the name and FILE * of one file to be typed.
*/
/*ARGSUSED1*/ /* nbytes passed for regularity, maybe need later */
@ -64,9 +68,10 @@ protected int
file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
{
struct mlist *ml;
int rv;
for (ml = ms->mlist->next; ml != ms->mlist; ml = ml->next)
if (match(ms, ml->magic, ml->nmagic, buf, nbytes))
return 1;
if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes)) != 0)
return rv;
return 0;
}
@ -109,18 +114,21 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
int32_t oldoff = 0;
int returnval = 0; /* if a match is found it is set to 1*/
int firstline = 1; /* a flag to print X\n X\n- X */
int printed_something = 0;
if (check_mem(ms, cont_level) == -1)
return -1;
for (magindex = 0; magindex < nmagic; magindex++) {
/* if main entry matches, print it... */
ms->offset = magic[magindex].offset;
int flush = !mget(ms, &p, s, &magic[magindex], nbytes,
cont_level);
if (flush) {
if (magic[magindex].reln == '!') flush = 0;
if (magic[magindex].reln == '!')
flush = 0;
} else {
switch (mcheck(ms, &p, &magic[magindex])) {
switch (magiccheck(ms, &p, &magic[magindex])) {
case -1:
return -1;
case 0:
@ -141,21 +149,21 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
continue;
}
if (!firstline) { /* we found another match */
/* put a newline and '-' to do some simple formatting*/
if (file_printf(ms, "\n- ") == -1)
/*
* If we are going to print something, we'll need to print
* a blank before we print something else.
*/
if (magic[magindex].desc[0]) {
need_separator = 1;
printed_something = 1;
if (print_sep(ms, firstline) == -1)
return -1;
}
if ((ms->c.off[cont_level] = mprint(ms, &p, &magic[magindex]))
== -1)
return -1;
/*
* If we printed something, we'll need to print
* a blank before we print something else.
*/
if (magic[magindex].desc[0])
need_separator = 1;
/* and any continuations that match */
if (check_mem(ms, ++cont_level) == -1)
return -1;
@ -171,23 +179,32 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
*/
cont_level = magic[magindex].cont_level;
}
oldoff = magic[magindex].offset;
ms->offset = magic[magindex].offset;
if (magic[magindex].flag & OFFADD) {
magic[magindex].offset +=
ms->offset +=
ms->c.off[cont_level - 1];
}
flush = !mget(ms, &p, s, &magic[magindex], nbytes,
cont_level);
if (flush && magic[magindex].reln != '!')
goto done;
continue;
switch (flush ? 1 : mcheck(ms, &p, &magic[magindex])) {
switch (flush ? 1 : magiccheck(ms, &p, &magic[magindex])) {
case -1:
return -1;
case 0:
break;
default:
/*
* If we are going to print something,
* make sure that we have a separator first.
*/
if (magic[magindex].desc[0]) {
printed_something = 1;
if (print_sep(ms, firstline) == -1)
return -1;
}
/*
* This continuation matched.
* Print its message, with
@ -217,12 +234,11 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
if (check_mem(ms, ++cont_level) == -1)
return -1;
}
done:
magic[magindex].offset = oldoff;
}
firstline = 0;
if (printed_something)
returnval = 1;
if ((ms->flags & MAGIC_CONTINUE) == 0) {
if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) {
return 1; /* don't keep searching */
}
}
@ -241,44 +257,113 @@ check_mem(struct magic_set *ms, unsigned int level)
ms->c.off = (ms->c.off == NULL) ? malloc(len) : realloc(ms->c.off, len);
if (ms->c.off != NULL)
return 0;
file_oomem(ms);
file_oomem(ms, len);
return -1;
}
private int
check_fmt(struct magic_set *ms, struct magic *m)
{
regex_t rx;
int rc;
if (strchr(m->desc, '%') == NULL)
return 0;
rc = regcomp(&rx, "%[-0-9\\.]*s", REG_EXTENDED|REG_NOSUB);
if (rc) {
char errmsg[512];
regerror(rc, &rx, errmsg, sizeof(errmsg));
file_error(ms, 0, "regex error %d, (%s)", rc, errmsg);
return -1;
} else {
rc = regexec(&rx, m->desc, 0, 0, 0);
regfree(&rx);
return !rc;
}
}
private int32_t
mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
{
uint32_t v;
int32_t t=0 ;
uint64_t v;
int32_t t = 0;
char buf[512];
switch (m->type) {
case FILE_BYTE:
v = file_signextend(ms, m, (size_t)p->b);
v = file_signextend(ms, m, (uint64_t)p->b);
switch (check_fmt(ms, m)) {
case -1:
return -1;
case 1:
if (snprintf(buf, sizeof(buf), "%c",
(unsigned char)v) < 0)
return -1;
if (file_printf(ms, m->desc, buf) == -1)
return -1;
break;
default:
if (file_printf(ms, m->desc, (unsigned char) v) == -1)
return -1;
t = m->offset + sizeof(char);
break;
}
t = ms->offset + sizeof(char);
break;
case FILE_SHORT:
case FILE_BESHORT:
case FILE_LESHORT:
v = file_signextend(ms, m, (size_t)p->h);
v = file_signextend(ms, m, (uint64_t)p->h);
switch (check_fmt(ms, m)) {
case -1:
return -1;
case 1:
if (snprintf(buf, sizeof(buf), "%hu",
(unsigned short)v) < 0)
return -1;
if (file_printf(ms, m->desc, buf) == -1)
return -1;
break;
default:
if (file_printf(ms, m->desc, (unsigned short) v) == -1)
return -1;
t = m->offset + sizeof(short);
break;
}
t = ms->offset + sizeof(short);
break;
case FILE_LONG:
case FILE_BELONG:
case FILE_LELONG:
case FILE_MELONG:
v = file_signextend(ms, m, p->l);
v = file_signextend(ms, m, (uint64_t)p->l);
switch (check_fmt(ms, m)) {
case -1:
return -1;
case 1:
if (snprintf(buf, sizeof(buf), "%u", (uint32_t)v) < 0)
return -1;
if (file_printf(ms, m->desc, buf) == -1)
return -1;
break;
default:
if (file_printf(ms, m->desc, (uint32_t) v) == -1)
return -1;
t = m->offset + sizeof(int32_t);
break;
}
t = ms->offset + sizeof(int32_t);
break;
case FILE_QUAD:
case FILE_BEQUAD:
case FILE_LEQUAD:
v = file_signextend(ms, m, p->q);
if (file_printf(ms, m->desc, (uint64_t) v) == -1)
return -1;
t = ms->offset + sizeof(int64_t);
break;
case FILE_STRING:
case FILE_PSTRING:
case FILE_BESTRING16:
@ -286,7 +371,7 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
if (m->reln == '=' || m->reln == '!') {
if (file_printf(ms, m->desc, m->value.s) == -1)
return -1;
t = m->offset + m->vallen;
t = ms->offset + m->vallen;
}
else {
if (*m->value.s == '\0') {
@ -296,7 +381,7 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
}
if (file_printf(ms, m->desc, p->s) == -1)
return -1;
t = m->offset + strlen(p->s);
t = ms->offset + strlen(p->s);
}
break;
@ -306,7 +391,7 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
case FILE_MEDATE:
if (file_printf(ms, m->desc, file_fmttime(p->l, 1)) == -1)
return -1;
t = m->offset + sizeof(time_t);
t = ms->offset + sizeof(time_t);
break;
case FILE_LDATE:
@ -315,17 +400,37 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
case FILE_MELDATE:
if (file_printf(ms, m->desc, file_fmttime(p->l, 0)) == -1)
return -1;
t = m->offset + sizeof(time_t);
t = ms->offset + sizeof(time_t);
break;
case FILE_QDATE:
case FILE_BEQDATE:
case FILE_LEQDATE:
if (file_printf(ms, m->desc, file_fmttime((uint32_t)p->q, 1))
== -1)
return -1;
t = ms->offset + sizeof(uint64_t);
break;
case FILE_QLDATE:
case FILE_BEQLDATE:
case FILE_LEQLDATE:
if (file_printf(ms, m->desc, file_fmttime((uint32_t)p->q, 0))
== -1)
return -1;
t = ms->offset + sizeof(uint64_t);
break;
case FILE_REGEX:
if (file_printf(ms, m->desc, p->s) == -1)
return -1;
t = m->offset + strlen(p->s);
t = ms->offset + strlen(p->s);
break;
case FILE_SEARCH:
if (file_printf(ms, m->desc, m->value.s) == -1)
return -1;
t = m->offset + m->vallen;
t = ms->offset + m->vallen;
break;
default:
@ -335,6 +440,62 @@ mprint(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
return(t);
}
#define DO_CVT(fld, cast) \
if (m->mask) \
switch (m->mask_op & 0x7F) { \
case FILE_OPAND: \
p->fld &= cast m->mask; \
break; \
case FILE_OPOR: \
p->fld |= cast m->mask; \
break; \
case FILE_OPXOR: \
p->fld ^= cast m->mask; \
break; \
case FILE_OPADD: \
p->fld += cast m->mask; \
break; \
case FILE_OPMINUS: \
p->fld -= cast m->mask; \
break; \
case FILE_OPMULTIPLY: \
p->fld *= cast m->mask; \
break; \
case FILE_OPDIVIDE: \
p->fld /= cast m->mask; \
break; \
case FILE_OPMODULO: \
p->fld %= cast m->mask; \
break; \
} \
if (m->mask_op & FILE_OPINVERSE) \
p->fld = ~p->fld \
private void
cvt_8(union VALUETYPE *p, const struct magic *m)
{
DO_CVT(b, (uint8_t));
}
private void
cvt_16(union VALUETYPE *p, const struct magic *m)
{
DO_CVT(h, (uint16_t));
}
private void
cvt_32(union VALUETYPE *p, const struct magic *m)
{
DO_CVT(l, (uint32_t));
}
private void
cvt_64(union VALUETYPE *p, const struct magic *m)
{
DO_CVT(q, (uint64_t));
}
/*
* Convert the byte order of the data we are looking at
* While we're here, let's apply the mask operation
@ -345,99 +506,20 @@ mconvert(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
{
switch (m->type) {
case FILE_BYTE:
if (m->mask)
switch (m->mask_op & 0x7F) {
case FILE_OPAND:
p->b &= m->mask;
break;
case FILE_OPOR:
p->b |= m->mask;
break;
case FILE_OPXOR:
p->b ^= m->mask;
break;
case FILE_OPADD:
p->b += m->mask;
break;
case FILE_OPMINUS:
p->b -= m->mask;
break;
case FILE_OPMULTIPLY:
p->b *= m->mask;
break;
case FILE_OPDIVIDE:
p->b /= m->mask;
break;
case FILE_OPMODULO:
p->b %= m->mask;
break;
}
if (m->mask_op & FILE_OPINVERSE)
p->b = ~p->b;
cvt_8(p, m);
return 1;
case FILE_SHORT:
if (m->mask)
switch (m->mask_op & 0x7F) {
case FILE_OPAND:
p->h &= m->mask;
break;
case FILE_OPOR:
p->h |= m->mask;
break;
case FILE_OPXOR:
p->h ^= m->mask;
break;
case FILE_OPADD:
p->h += m->mask;
break;
case FILE_OPMINUS:
p->h -= m->mask;
break;
case FILE_OPMULTIPLY:
p->h *= m->mask;
break;
case FILE_OPDIVIDE:
p->h /= m->mask;
break;
case FILE_OPMODULO:
p->h %= m->mask;
break;
}
if (m->mask_op & FILE_OPINVERSE)
p->h = ~p->h;
cvt_16(p, m);
return 1;
case FILE_LONG:
case FILE_DATE:
case FILE_LDATE:
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;
cvt_32(p, m);
return 1;
case FILE_QUAD:
case FILE_QDATE:
case FILE_QLDATE:
cvt_64(p, m);
return 1;
case FILE_STRING:
case FILE_BESTRING16:
@ -468,172 +550,50 @@ mconvert(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
}
case FILE_BESHORT:
p->h = (short)((p->hs[0]<<8)|(p->hs[1]));
if (m->mask)
switch (m->mask_op&0x7F) {
case FILE_OPAND:
p->h &= m->mask;
break;
case FILE_OPOR:
p->h |= m->mask;
break;
case FILE_OPXOR:
p->h ^= m->mask;
break;
case FILE_OPADD:
p->h += m->mask;
break;
case FILE_OPMINUS:
p->h -= m->mask;
break;
case FILE_OPMULTIPLY:
p->h *= m->mask;
break;
case FILE_OPDIVIDE:
p->h /= m->mask;
break;
case FILE_OPMODULO:
p->h %= m->mask;
break;
}
if (m->mask_op & FILE_OPINVERSE)
p->h = ~p->h;
cvt_16(p, m);
return 1;
case FILE_BELONG:
case FILE_BEDATE:
case FILE_BELDATE:
p->l = (int32_t)
((p->hl[0]<<24)|(p->hl[1]<<16)|(p->hl[2]<<8)|(p->hl[3]));
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;
cvt_32(p, m);
return 1;
case FILE_BEQUAD:
case FILE_BEQDATE:
case FILE_BEQLDATE:
p->q = (int64_t)
(((int64_t)p->hq[0]<<56)|((int64_t)p->hq[1]<<48)|
((int64_t)p->hq[2]<<40)|((int64_t)p->hq[3]<<32)|
(p->hq[4]<<24)|(p->hq[5]<<16)|(p->hq[6]<<8)|(p->hq[7]));
cvt_64(p, m);
return 1;
case FILE_LESHORT:
p->h = (short)((p->hs[1]<<8)|(p->hs[0]));
if (m->mask)
switch (m->mask_op&0x7F) {
case FILE_OPAND:
p->h &= m->mask;
break;
case FILE_OPOR:
p->h |= m->mask;
break;
case FILE_OPXOR:
p->h ^= m->mask;
break;
case FILE_OPADD:
p->h += m->mask;
break;
case FILE_OPMINUS:
p->h -= m->mask;
break;
case FILE_OPMULTIPLY:
p->h *= m->mask;
break;
case FILE_OPDIVIDE:
p->h /= m->mask;
break;
case FILE_OPMODULO:
p->h %= m->mask;
break;
}
if (m->mask_op & FILE_OPINVERSE)
p->h = ~p->h;
cvt_16(p, m);
return 1;
case FILE_LELONG:
case FILE_LEDATE:
case FILE_LELDATE:
p->l = (int32_t)
((p->hl[3]<<24)|(p->hl[2]<<16)|(p->hl[1]<<8)|(p->hl[0]));
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;
cvt_32(p, m);
return 1;
case FILE_LEQUAD:
case FILE_LEQDATE:
case FILE_LEQLDATE:
p->q = (int64_t)
(((int64_t)p->hq[7]<<56)|((int64_t)p->hq[6]<<48)|
((int64_t)p->hq[5]<<40)|((int64_t)p->hq[4]<<32)|
(p->hq[3]<<24)|(p->hq[2]<<16)|(p->hq[1]<<8)|(p->hq[0]));
cvt_64(p, m);
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;
cvt_32(p, m);
return 1;
case FILE_REGEX:
case FILE_SEARCH:
@ -656,7 +616,7 @@ mdebug(uint32_t offset, const char *str, size_t len)
private int
mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
const unsigned char *s, size_t offset, size_t nbytes)
const unsigned char *s, uint32_t offset, size_t nbytes)
{
if (type == FILE_REGEX && indir == 0) {
/*
@ -670,7 +630,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
return 0;
}
if ((p->search.buf = strdup((const char *)s)) == NULL) {
file_oomem(ms);
file_oomem(ms, strlen((const char *)s));
return -1;
}
for (b = p->search.buf; offset &&
@ -694,6 +654,13 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
if (type == FILE_BESTRING16)
src++;
/* check for pointer overflow */
if (src < s) {
file_error(ms, 0, "invalid offset %zu in mcopy()",
offset);
return -1;
}
for (;src < esrc; src++, dst++) {
if (dst < edst)
*dst = *src++;
@ -731,7 +698,7 @@ private int
mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
struct magic *m, size_t nbytes, unsigned int cont_level)
{
uint32_t offset = m->offset;
uint32_t offset = ms->offset;
if (mcopy(ms, p, m->type, m->flag & INDIR, s, offset, nbytes) == -1)
return -1;
@ -1208,7 +1175,7 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
if (m->flag & INDIROFFADD) offset += ms->c.off[cont_level-1];
if (mcopy(ms, p, m->type, 0, s, offset, nbytes) == -1)
return -1;
m->offset = offset;
ms->offset = offset;
if ((ms->flags & MAGIC_DEBUG) != 0) {
mdebug(offset, (char *)(void *)p,
@ -1257,7 +1224,7 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
}
if (m->type == FILE_SEARCH) {
size_t mlen = m->mask + m->vallen;
size_t mlen = (size_t)(m->mask + m->vallen);
size_t flen = nbytes - offset;
if (flen < mlen)
mlen = flen;
@ -1276,10 +1243,10 @@ mget(struct magic_set *ms, union VALUETYPE *p, const unsigned char *s,
}
private int
mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
magiccheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
{
uint32_t l = m->value.l;
uint32_t v;
uint64_t l = m->value.q;
uint64_t v;
int matched;
if ( (m->value.s[0] == 'x') && (m->value.s[1] == '\0') ) {
@ -1313,6 +1280,18 @@ mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
v = p->l;
break;
case FILE_QUAD:
case FILE_LEQUAD:
case FILE_BEQUAD:
case FILE_QDATE:
case FILE_BEQDATE:
case FILE_LEQDATE:
case FILE_QLDATE:
case FILE_BEQLDATE:
case FILE_LEQLDATE:
v = p->q;
break;
case FILE_STRING:
case FILE_BESTRING16:
case FILE_LESTRING16:
@ -1408,21 +1387,25 @@ mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
while (len-- > 0 && (v = *b++ - *a++) == 0)
continue;
if (!v) {
m->offset += range - 1;
ms->offset += range - 1;
break;
}
if (range + slen >= p->search.buflen)
if (range + slen >= p->search.buflen) {
v = 1;
break;
}
len = slen;
a = (unsigned char*)m->value.s;
b = (unsigned char*)p->search.buf + range;
}
free(p->search.buf);
p->search.buf = NULL;
if (v)
return 0;
break;
}
default:
file_error(ms, 0, "invalid type %d in mcheck()", m->type);
file_error(ms, 0, "invalid type %d in magiccheck()", m->type);
return -1;
}
@ -1432,36 +1415,40 @@ mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
switch (m->reln) {
case 'x':
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%u == *any* = 1\n", v);
(void) fprintf(stderr, "%llu == *any* = 1\n",
(unsigned long long)v);
matched = 1;
break;
case '!':
matched = v != l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%u != %u = %d\n",
v, l, matched);
(void) fprintf(stderr, "%llu != %llu = %d\n",
(unsigned long long)v, (unsigned long long)l,
matched);
break;
case '=':
matched = v == l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%u == %u = %d\n",
v, l, matched);
(void) fprintf(stderr, "%llu == %llu = %d\n",
(unsigned long long)v, (unsigned long long)l,
matched);
break;
case '>':
if (m->flag & UNSIGNED) {
matched = v > l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%u > %u = %d\n",
v, l, matched);
(void) fprintf(stderr, "%llu > %llu = %d\n",
(unsigned long long)v,
(unsigned long long)l, matched);
}
else {
matched = (int32_t) v > (int32_t) l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%d > %d = %d\n",
v, l, matched);
(void) fprintf(stderr, "%lld > %lld = %d\n",
(long long)v, (long long)l, matched);
}
break;
@ -1469,29 +1456,32 @@ mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
if (m->flag & UNSIGNED) {
matched = v < l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%u < %u = %d\n",
v, l, matched);
(void) fprintf(stderr, "%llu < %llu = %d\n",
(unsigned long long)v,
(unsigned long long)l, matched);
}
else {
matched = (int32_t) v < (int32_t) l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "%d < %d = %d\n",
v, l, matched);
(void) fprintf(stderr, "%lld < %lld = %d\n",
(long long)v, (long long)l, matched);
}
break;
case '&':
matched = (v & l) == l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "((%x & %x) == %x) = %d\n",
v, l, l, matched);
(void) fprintf(stderr, "((%llx & %llx) == %llx) = %d\n",
(unsigned long long)v, (unsigned long long)l,
(unsigned long long)l, matched);
break;
case '^':
matched = (v & l) != l;
if ((ms->flags & MAGIC_DEBUG) != 0)
(void) fprintf(stderr, "((%x & %x) != %x) = %d\n",
v, l, l, matched);
(void) fprintf(stderr, "((%llx & %llx) != %llx) = %d\n",
(unsigned long long)v, (unsigned long long)l,
(unsigned long long)l, matched);
break;
default:
@ -1503,3 +1493,15 @@ mcheck(struct magic_set *ms, union VALUETYPE *p, struct magic *m)
return matched;
}
private int
print_sep(struct magic_set *ms, int firstline)
{
if (firstline)
return 0;
/*
* we found another match
* put a newline and '-' to do some simple formatting
*/
return file_printf(ms, "\n- ");
}

View File

@ -32,7 +32,7 @@
*
* Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
*
* $Id: tar.h,v 1.8 2004/09/11 19:15:58 christos Exp $ # checkin only
* $Id: tar.h,v 1.9 2006/05/03 15:19:25 christos Exp $ # checkin only
*/
/*
@ -82,7 +82,8 @@ union record {
#define CHKBLANKS " " /* 8 blanks, no null */
/* The magic field is filled with this if uname and gname are valid. */
#define TMAGIC "ustar " /* 7 chars and a null */
#define TMAGIC "ustar" /* 5 chars and a null */
#define GNUTMAGIC "ustar " /* 7 chars and a null */
/* The linkflag defines the type of file */
#define LF_OLDNORMAL '\0' /* Normal disk file, Unix compat */