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:
commit
bb5e144237
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
21
contrib/file/Magdir/cafebabe
Normal file
21
contrib/file/Magdir/cafebabe
Normal 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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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')
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
32
contrib/file/Magdir/os400
Normal 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
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
15
contrib/file/Magdir/unicode
Normal file
15
contrib/file/Magdir/unicode
Normal 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)
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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 \
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
@ -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]);
|
||||
|
@ -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
910
contrib/file/configure
vendored
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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__ */
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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 */
|
||||
|
@ -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) ?
|
||||
|
@ -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
|
||||
|
@ -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',
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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- ");
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user