Merge from vendor branch FILE:
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 19 Jan 2008 23:36:48 +0000 (23:36 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 19 Jan 2008 23:36:48 +0000 (23:36 +0000)
Import file-4.23.

40 files changed:
contrib/file-4/ChangeLog
contrib/file-4/doc/file.man
contrib/file-4/doc/libmagic.man
contrib/file-4/doc/magic.man
contrib/file-4/magic/Magdir/acorn
contrib/file-4/magic/Magdir/animation
contrib/file-4/magic/Magdir/apple
contrib/file-4/magic/Magdir/archive
contrib/file-4/magic/Magdir/audio
contrib/file-4/magic/Magdir/blender
contrib/file-4/magic/Magdir/commands
contrib/file-4/magic/Magdir/console
contrib/file-4/magic/Magdir/database
contrib/file-4/magic/Magdir/efi [new file with mode: 0644]
contrib/file-4/magic/Magdir/elf
contrib/file-4/magic/Magdir/filesystems
contrib/file-4/magic/Magdir/fortran [new file with mode: 0644]
contrib/file-4/magic/Magdir/java
contrib/file-4/magic/Magdir/macintosh
contrib/file-4/magic/Magdir/msdos
contrib/file-4/magic/Magdir/pdf
contrib/file-4/magic/Magdir/sgi
contrib/file-4/magic/magic.mime
contrib/file-4/src/apprentice.c
contrib/file-4/src/ascmagic.c
contrib/file-4/src/compress.c
contrib/file-4/src/file.c
contrib/file-4/src/file.h
contrib/file-4/src/file_opts.h [new file with mode: 0644]
contrib/file-4/src/fsmagic.c
contrib/file-4/src/funcs.c
contrib/file-4/src/is_tar.c
contrib/file-4/src/magic.c
contrib/file-4/src/magic.h
contrib/file-4/src/names.h
contrib/file-4/src/patchlevel.h
contrib/file-4/src/print.c
contrib/file-4/src/readelf.c
contrib/file-4/src/readelf.h
contrib/file-4/src/softmagic.c

index e2c8418..2beffb0 100644 (file)
@@ -1,3 +1,84 @@
+2007-12-28 15:06 Christos Zoulas <christos@zoulas.com>
+
+       * strtof detection
+
+       * remove bogus regex magic that could cause a DoS
+
+       * better mismatch version message
+
+2007-12-27 11:35 Christos Zoulas <christos@zoulas.com>
+
+       * bring back some fixes from OpenBSD
+
+       * treat ELF dynamic objects as executables
+
+       * fix gcc warnings
+
+2007-12-01 19:55 Christos Zoulas <christos@zoulas.com>
+
+       * make sure we have zlib.h and libz to compile the builtin
+         decompress code
+
+2007-10-28 20:48 Christos Zoulas <christos@zoulas.com>
+
+       * float and double magic support (Behan Webster) 
+
+2007-10-28 20:48 Christos Zoulas <christos@zoulas.com>
+
+       * Convert fortran to a soft test (Reuben Thomas)
+
+2007-10-23  5:25 Christos Zoulas <christos@zoulas.com>
+
+       * Add --with-filename, and --no-filename (Reuben Thomas)
+
+2007-10-23  3:59 Christos Zoulas <christos@zoulas.com>
+
+       * Rest of the mime split (Reuben Thomas)
+
+       * Make usage message generated from the flags so that
+         they stay consistent (Reuben Thomas)
+
+2007-10-20  3:06 Christos Zoulas <christos@zoulas.com>
+
+       * typo in comment, missing ifdef QUICK, remove unneeded code
+               (Charles Longeau)
+
+2007-10-17  3:33 Christos Zoulas <christos@zoulas.com>
+
+       * Fix problem printing -\012 in some entries
+
+       * Separate magic type and encoding flags (Reuben Thomas)
+
+2007-10-09  3:55 Christos Zoulas <christos@zoulas.com>
+
+       * configure fix for int64 and strndup (Reuben Thomas)
+
+2007-09-26  4:45 Christos Zoulas <christos@zoulas.com>
+
+       * Add magic_descriptor() function.
+
+       * Fix regression in elf reading code where the core name was
+         not being printed.
+
+       * Don't convert NUL's to spaces in {l,b}estring16 (Daniel Dawson)
+
+2007-08-19  6:30 Christos Zoulas <christos@zoulas.com>
+
+       * Make mime format consistent so that it can
+         be easily parsed:
+             mimetype [charset=character-set] [encoding=encoding-mime-type]
+
+         Remove spurious extra text from some MIME type printouts 
+         (mostly in is_tar).
+
+         Fix one case where -i produced nothing at all (for a 1-byte file,
+         which is now classed as application/octet-stream).
+
+         Remove 7/8bit classifications, since they were arbitrary
+         and not based on the file data.
+
+         This work was done by Reuben Thomas
+
 2007-05-24 10:00 Christos Zoulas <christos@zoulas.com>
 
        * Fix another integer overflow (Colin Percival)
index f096104..05bf9e7 100644 (file)
@@ -1,4 +1,4 @@
-.\" $File: file.man,v 1.65 2007/01/25 21:05:46 christos Exp $
+.\" $File: file.man,v 1.66 2007/10/23 19:58:59 christos Exp $
 .Dd January 8, 2007
 .Dt FILE __CSECTION__
 .Os
@@ -8,6 +8,8 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl bchikLnNprsvz
+.Op Fl mime-type
+.Op Fl mime-encoding
 .Op Fl f Ar namefile
 .Op Fl F Ar separator
 .Op Fl m Ar magicfiles
@@ -226,9 +228,8 @@ is not defined.
 .It Fl i , -mime
 Causes the file command to output mime type strings rather than the more
 traditional human readable ones. Thus it may say
-.Dq text/plain; charset=us-ascii
-rather
-than
+.Dq text/plain charset=us-ascii
+rather than
 .Dq ASCII text .
 In order for this option to work, file changes the way
 it handles files recognized by the command itself (such as many of the
@@ -238,6 +239,10 @@ file.
 (See
 .Dq FILES
 section, below).
+.It Fl -mime-type ,  -mime-encoding
+Like
+.Fl i ,
+but print only the specified element(s).
 .It Fl k , -keep-going
 Don't stop at the first match, keep going.
 .It Fl L , -dereference
@@ -251,8 +256,9 @@ is defined.
 Specify an alternate list of files containing magic numbers.
 This can be a single file, or a colon-separated list of files.
 If a compiled magic file is found alongside, it will be used instead.
-With the 
-.Fl i or 
+With the
+.Fl i
+or 
 .Fl "mime"
 option, the program adds
 .Dq .mime
@@ -447,8 +453,7 @@ $ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
 
 $ file -i file.c file /dev/{wd0a,hda}
 file.c:      text/x-c
-file:        application/x-executable, dynamically linked (uses shared libs),
-            not stripped
+file:        application/x-executable
 /dev/hda:    application/x-not-regular-file
 /dev/wd0a:   application/x-not-regular-file
 
index eafa226..61e8f27 100644 (file)
@@ -87,8 +87,10 @@ If the file is compressed, unpack it and look at the contents.
 .It Dv MAGIC_DEVICES
 If the file is a block or character special device, then open the device
 and try to look in its contents.
-.It Dv MAGIC_MIME
-Return a mime string, instead of a textual description.
+.It Dv MAGIC_MIME_TYPE
+Return a MIME type string, instead of a textual description.
+.It Dv MAGIC_MIME_ENCODING
+Return a MIME encoding, instead of a textual description.
 .It Dv MAGIC_CONTINUE
 Return all matches, not just the first.
 .It Dv MAGIC_CHECK
@@ -164,7 +166,8 @@ The
 .Fn magic_setflags
 function, sets the 
 .Ar flags
-described above.
+described above. Note that using both MIME flags together can also
+return extra information on the charset.
 .Pp
 The
 .Fn magic_check
index e98f915..3842b64 100644 (file)
@@ -1,4 +1,4 @@
-.\" $File: magic.man,v 1.38 2007/01/27 00:52:08 ljt Exp $
+.\" $File: magic.man,v 1.39 2007/11/08 00:31:37 christos Exp $
 .Dd January 10, 2007
 .Dt MAGIC __FSECTION__
 .Os
@@ -45,6 +45,10 @@ A two-byte value (on most systems) in this machine's native byte order.
 A four-byte value (on most systems) in this machine's native byte order.
 .It Dv quad
 An eight-byte value (on most systems) in this machine's native byte order.
+.It Dv float
+A 32-bit (on most systems) single precision IEEE floating point number in this machine's native byte order.
+.It Dv double
+A 64-bit (on most systems) double precision IEEE floating point number in this machine's native byte order.
 .It Dv string
 A string of bytes.
 The string type specification can be optionally followed
@@ -87,6 +91,10 @@ A two-byte value (on most systems) in big-endian byte order.
 A four-byte value (on most systems) in big-endian byte order.
 .It Dv bequad
 An eight-byte value (on most systems) in big-endian byte order.
+.It Dv befloat
+A 32-bit (on most systems) single precision IEEE floating point number in big-endian byte order.
+.It Dv bedouble
+A 64-bit (on most systems) double precision IEEE floating point number in big-endian byte order.
 .It Dv bedate
 A four-byte value (on most systems) in big-endian byte order,
 interpreted as a Unix date.
@@ -109,6 +117,10 @@ A two-byte value (on most systems) in little-endian byte order.
 A four-byte value (on most systems) in little-endian byte order.
 .It Dv lequad
 An eight-byte value (on most systems) in little-endian byte order.
+.It Dv lefloat
+A 32-bit (on most systems) single precision IEEE floating point number in little-endian byte order.
+.It Dv ledouble
+A 64-bit (on most systems) double precision IEEE floating point number in little-endian byte order.
 .It Dv ledate
 A four-byte value (on most systems) in little-endian byte order,
 interpreted as a UNIX date.
@@ -214,6 +226,12 @@ the value specified after is negated before tested.
 to specify that any value will match.
 If the character is omitted, it is assumed to be
 .Dv = .
+Operators
+.Dv \*[Am] ,
+.Dv ^ ,
+and
+.Dv ~
+don't work with floats and doubles.
 For all tests except
 .Em string
 and
@@ -450,4 +468,4 @@ a system on which the lengths are invariant.
 .\" the changes I posted to the S5R2 version.
 .\"
 .\" Modified for Ian Darwin's version of the file command.
-.\" @(#)$Id: magic.man,v 1.38 2007/01/27 00:52:08 ljt Exp $
+.\" @(#)$Id: magic.man,v 1.39 2007/11/08 00:31:37 christos Exp $
index ad89cc6..5acb31e 100644 (file)
 0      string          Maestro\r       RISC OS music file
 >8     byte            x               version %d
 
+>8     byte            x               type %d
+
+# Digital Symphony data files
+# From: Bernard Jungen (bern8817@euphonynet.be)
+0              string  \x02\x01\x13\x13\x13\x01\x0d\x10        Digital Symphony sound sample (RISC OS),
+>8             byte    x       version %d,
+>9             pstring x       named "%s",
+>(9.b+19)      byte    =0      8-bit logarithmic
+>(9.b+19)      byte    =1      LZW-compressed linear
+>(9.b+19)      byte    =2      8-bit linear signed
+>(9.b+19)      byte    =3      16-bit linear signed
+>(9.b+19)      byte    =4      SigmaDelta-compressed linear
+>(9.b+19)      byte    =5      SigmaDelta-compressed logarithmic
+>(9.b+19)      byte    >5      unknown format
+
+0      string  \x02\x01\x13\x13\x14\x12\x01\x0b        Digital Symphony song (RISC OS),
+>8     byte    x       version %d,
+>9     byte    =1      1 voice,
+>9     byte    !1      %d voices,
+>10    leshort =1      1 track,
+>10    leshort !1      %d tracks,
+>12    leshort =1      1 pattern
+>12    leshort !1      %d patterns
+
+0      string  \x02\x01\x13\x13\x10\x14\x12\x0e
+>9     byte    =0      Digital Symphony sequence (RISC OS),
+>>8    byte    x       version %d,
+>>10   byte    =1      1 line,
+>>10   byte    !1      %d lines,
+>>11   leshort =1      1 position
+>>11   leshort !1      %d positions
+>9     byte    =1      Digital Symphony pattern data (RISC OS),
+>>8    byte    x       version %d,
+>>10   leshort =1      1 pattern
+>>10   leshort !1      %d patterns
index b2cdd74..6392f85 100644 (file)
 >0x21  byte            x               v%x
 0      string          DVDVIDEO-VMG    Video manager,
 >0x21  byte            x               v%x
+
+# From: Behan Webster <behanw@websterwood.com>
+# NuppelVideo used by Mythtv (*.nuv)
+0      regex           NuppelVideo|MythTVVideo MythTV NuppelVideo
+>12    string          x               v%s
+>20    lelong          x               (%d
+>24    lelong          x               \bx%d),
+>36    string          P               \bprogressive,
+>36    string          I               \binterlaced,
+>40    ledouble        x               \baspect:%.2f,
+>48    ledouble        x               \bfps:%.2f
index 6d2a07b..4a593ea 100644 (file)
 >0             byte            <5              \b
 >>13   byte            0x81    \b
 >>>14  uleshort        x               \b, system %hd
+
+#------------------------------------------------------------------------------
+# CAF: Apple CoreAudio File Format
+#
+# Container format for high-end audio purposes.
+# From: David Remahl <dremahl@apple.com>
+#
+0      string          caff            CoreAudio Format audio file
+>4     beshort         <10             version %d
+>6     beshort         x
+
+
+#------------------------------------------------------------------------------
+# Keychain database files
+0      string          kych            Mac OS X Keychain File
+
+#------------------------------------------------------------------------------
+# Code Signing related file types
+0      belong          0xfade0c00      Mac OS X Code Requirement
+>8     belong          1                       (opExpr)
+>4     belong          x                       - %d bytes
+
+0      belong          0xfade0c01      Mac OS X Code Requirement Set
+>8     belong          >1                      containing %d items
+>4     belong          x                       - %d bytes
+
+0      belong          0xfade0c02      Mac OS X Code Directory
+>8     belong          x                       version %x
+>12    belong          >0                      flags 0x%x
+>4     belong          x                       - %d bytes
+
+0      belong          0xfade0cc0      Mac OS X Detached Code Signature (non-executable)
+>4     belong          x                       - %d bytes
+
+0      belong          0xfade0cc1      Mac OS X Detached Code Signature
+>8     belong          >1                      (%d elements)
+>4     belong          x                       - %d bytes
+
+# From: "Nelson A. de Oliveira" <naoliv@gmail.com>
+# .vdi
+4      string innotek\ VirtualBox\ Disk\ Image %s
index 6aed3c8..0b3a9ba 100644 (file)
 
 # ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
 0      string          PK\003\004
+>4     byte            0x00            Zip archive data
 >4     byte            0x09            Zip archive data, at least v0.9 to extract
 >4     byte            0x0a            Zip archive data, at least v1.0 to extract
 >4     byte            0x0b            Zip archive data, at least v1.1 to extract
 >4     lelong  0x1000006D      (EPOC release 3/4/5)
 >4     lelong  0x10003A12      (EPOC release 6)
 0      lelong  0x10201A7A      Symbian installation file (Symbian OS 9.x)
+
+# Pack200 Java archives, http://jcp.org/en/jsr/detail?id=200
+0      belong  0xcafed00d      Pack200 Java archive
+
+# From "Nelson A. de Oliveira" <naoliv@gmail.com>
+0      string  MPQ\032         MoPaQ (MPQ) archive
+
+# From: Dirk Jagdmann <doj@cubic.org>
+# xar archive format: http://code.google.com/p/xar/
+0      string  xar!            xar archive
+>6     beshort x               - version %ld
+
+# From: "Nelson A. de Oliveira" <naoliv@gmail.com>
+# .kgb
+0      string KGB_arch         KGB Archiver file
+>10    string x                with compression level %.1s
index e199988..511da1d 100644 (file)
 # From: Matthew Flaschen <matthew.flaschen@gatech.edu>
 0      string  #EXTM3U         M3U playlist text
 
+# From: "Mateus Caruccio" <mateus@caruccio.com>
+# guitar pro v3,4,5 from http://filext.com/file-extension/gp3
+0      string  \030FICHIER\ GUITAR\ PRO\ v3.   Guitar Pro Ver. 3 Tablature
+
+# From: "Leslie P. Polzer" <leslie.polzer@gmx.net>
+60     string  SONG            SoundFX Module sound file
+
index 01d4e54..6ef7950 100644 (file)
@@ -1,17 +1,37 @@
 #------------------------------------------------------------------------------
-# blender: file(1) magic for Blender 3D data files
+# blender: file(1) magic for Blender 3D related files
 #
-# Coded by Guillermo S. Romero <gsromero@alumnos.euitt.upm.es> using the
-# data from Ton Roosendaal <ton@blender.nl>. Ton or his company do not
-# support the rule, so mail GSR if problems with it. Rule version: 1.1.
-# You can get latest version with comments and details about the format
-# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender
+# Native format rule v1.2. For questions use the developers list 
+# http://lists.blender.org/mailman/listinfo/bf-committers
+# GLOB chunk was moved near start and provides subversion info since 2.42 
 
-0      string  =BLENDER        Blender3D,
->7     string  =_              saved as 32-bits
->7      string =-              saved as 64-bits
->8     string  =v              little endian
->8     string  =V              big endian
->9     byte    x               with version %c.
->10    byte    x               \b%c
->11    byte    x               \b%c
+0              string  =BLENDER        Blender3D,
+>7             string  =_              saved as 32-bits
+>>8            string  =v              little endian
+>>>9           byte    x               with version %c.
+>>>10          byte    x               \b%c
+>>>11          byte    x               \b%c
+>>>0x40                string  =GLOB           \b.
+>>>>0x58       leshort x               \b%.4d
+>>8            string  =V              big endian
+>>>9           byte    x               with version %c.
+>>>10          byte    x               \b%c
+>>>11          byte    x               \b%c
+>>>0x40                string  =GLOB           \b.
+>>>>0x58       beshort x               \b%.4d
+>7             string  =-              saved as 64-bits
+>>8            string  =v              little endian
+>>9            byte    x               with version %c.
+>>10           byte    x               \b%c
+>>11           byte    x               \b%c
+>>0x44         string  =GLOB           \b.
+>>>0x60                leshort x               \b%.4d
+>>8            string  =V              big endian
+>>>9           byte    x               with version %c.
+>>>10          byte    x               \b%c
+>>>11          byte    x               \b%c
+>>>0x44                string  =GLOB           \b.
+>>>>0x60       beshort x               \b%.4d
+
+# Scripts that run in the embeded Python interpreter
+0              string  #!BPY           Blender3D BPython script
index 288d3cd..599c190 100644 (file)
@@ -28,7 +28,8 @@
 0      string/b        #!\ /bin/awk            awk script text executable
 0      string/b        #!\ /usr/bin/awk        awk script text executable
 # update to distinguish from *.vcf files
-0      regex           BEGIN[[:space:]]*[{]    awk script text
+# this is broken because postscript has /EBEGIN{ for example.
+#0     regex           BEGIN[[:space:]]*[{]    awk script text
 
 # AT&T Bell Labs' Plan 9 shell
 0      string/b        #!\ /bin/rc     Plan 9 rc shell script text executable
index 40a3c2e..775472d 100644 (file)
 0      string  PPF10                   Playstation Patch File version 1.0
 >5     byte    0                       \b, Simple Encoding
 >6     string  x                       \b, description: %s
+
+# From: Daniel Dawson <ddawson@icehouse.net>
+# SNES9x .smv "movie" file format.
+0              string          SMV\x1A SNES9x input recording
+>0x4           lelong          x       \b, version %d
+# version 4 is latest so far 
+>0x4           lelong          <5
+>>0x8          ledate          x       \b, recorded at %s
+>>0xc          lelong          >0      \b, rerecorded %d times
+>>0x10         lelong          x       \b, %d frames long
+>>0x14         byte            >0      \b, data for controller(s):
+>>>0x14                byte            &0x1    #1
+>>>0x14                byte            &0x2    #2
+>>>0x14                byte            &0x4    #3
+>>>0x14                byte            &0x8    #4
+>>>0x14                byte            &0x10   #5
+>>0x15         byte            ^0x1    \b, begins from snapshot
+>>0x15         byte            &0x1    \b, begins from reset
+>>0x15         byte            ^0x2    \b, NTSC standard
+>>0x15         byte            &0x2    \b, PAL standard
+>>0x17         byte            &0x1    \b, settings:
+# WIP1Timing not used as of version 4
+>>>0x4         lelong          <4
+>>>>0x17       byte            &0x2    WIP1Timing
+>>>0x17                byte            &0x4    Left+Right
+>>>0x17                byte            &0x8    VolumeEnvX
+>>>0x17                byte            &0x10   FakeMute
+>>>0x17                byte            &0x20   SyncSound
+# New flag as of version 4
+>>>0x4         lelong          >3
+>>>>0x17       byte            &0x80   NoCPUShutdown
+>>0x4          lelong          <4
+>>>0x18                lelong          >0x23
+>>>>0x20       leshort         !0
+>>>>>0x20      lestring16      x       \b, metadata: "%s"
+>>0x4          lelong          >3
+>>>0x24                byte            >0      \b, port 1:
+>>>>0x24       byte            1       joypad
+>>>>0x24       byte            2       mouse
+>>>>0x24       byte            3       SuperScope
+>>>>0x24       byte            4       Justifier
+>>>>0x24       byte            5       multitap
+>>>0x24                byte            >0      \b, port 2:
+>>>>0x25       byte            1       joypad
+>>>>0x25       byte            2       mouse
+>>>>0x25       byte            3       SuperScope
+>>>>0x25       byte            4       Justifier
+>>>>0x25       byte            5       multitap
+>>>0x18                lelong          >0x43
+>>>>0x40       leshort         !0
+>>>>>0x40      lestring16      x       \b, metadata: "%s"
+>>0x17         byte            &0x40   \b, ROM:
+>>>(0x18.l-26) lelong          x       CRC32 0x%08x
+>>>(0x18.l-23) string          x       "%s"
+
+# From: "Nelson A. de Oliveira" <naoliv@gmail.com>
+# .w3g
+0      string Warcraft\ III\ recorded\ game    %s
+# .w3m
+0      string HM3W                             Warcraft III map file
+
index aef8469..8f2fc0a 100644 (file)
 16     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
 17     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
 18     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+
+# From: Maxime Henrion <mux@FreeBSD.org>
+# PostgreSQL's custom dump format, Maxime Henrion <mux@FreeBSD.org>
+0      string          PGDMP           PostgreSQL custom database dump
+>5     byte            x               - v%d
+>6     byte            x               \b.%d
+>5     beshort         <=0x100         \b-0
+>5     beshort         >0x100
+>>7    byte            x               \b-%d
+
diff --git a/contrib/file-4/magic/Magdir/efi b/contrib/file-4/magic/Magdir/efi
new file mode 100644 (file)
index 0000000..4eec2eb
--- /dev/null
@@ -0,0 +1,14 @@
+
+#------------------------------------------------------------------------------
+# efi:  file(1) magic for Universal EFI binaries
+
+0      lelong  0x0ef1fab9
+>4     lelong  1               Universal EFI binary with 1 architecture
+>>&0   lelong  7               \b, i386
+>>&0   lelong  0x01000007      \b, x86_64
+>4     lelong  2               Universal EFI binary with 2 architectures
+>>&0   lelong  7               \b, i386
+>>&0   lelong  0x01000007      \b, x86_64
+>>&20  lelong  7               \b, i386
+>>&20  lelong  0x01000007      \b, x86_64
+>4     lelong  >2              Universal EFI binary with %ld architectures
index 52b5e4c..464b436 100644 (file)
 >>>>36  lelong&0xf0000000      0x20000000      MIPS-III
 >>>>36  lelong&0xf0000000      0x30000000      MIPS-IV
 >>>>36  lelong&0xf0000000      0x40000000      MIPS-V
->>>>36  lelong&0xf0000000      0x60000000      MIPS32
->>>>36  lelong&0xf0000000      0x70000000      MIPS64
->>>>36  lelong&0xf0000000      0x80000000      MIPS32 rel2
->>>>36  lelong&0xf0000000      0x90000000      MIPS64 rel2
+>>>>36  lelong&0xf0000000      0x50000000      MIPS32
+>>>>36  lelong&0xf0000000      0x60000000      MIPS64
+>>>>36  lelong&0xf0000000      0x70000000      MIPS32 rel2
+>>>>36  lelong&0xf0000000      0x80000000      MIPS64 rel2
 # only for 64-bit
 >>>4   byte            2
 >>>>48  lelong&0xf0000000      0x00000000      MIPS-I
 >>>>48  lelong&0xf0000000      0x20000000      MIPS-III
 >>>>48  lelong&0xf0000000      0x30000000      MIPS-IV
 >>>>48  lelong&0xf0000000      0x40000000      MIPS-V
->>>>48  lelong&0xf0000000      0x60000000      MIPS32
->>>>48  lelong&0xf0000000      0x70000000      MIPS64 
->>>>48  lelong&0xf0000000      0x80000000      MIPS32 rel2
->>>>48  lelong&0xf0000000      0x90000000      MIPS64 rel2
+>>>>48  lelong&0xf0000000      0x50000000      MIPS32
+>>>>48  lelong&0xf0000000      0x60000000      MIPS64
+>>>>48  lelong&0xf0000000      0x70000000      MIPS32 rel2
+>>>>48  lelong&0xf0000000      0x80000000      MIPS64 rel2
 >>18   leshort         9               Amdahl - invalid byte order,
 >>18   leshort         10              MIPS (deprecated),
 >>18   leshort         11              RS6000 - invalid byte order,
 >>>>36  belong&0xf0000000      0x20000000      MIPS-III
 >>>>36  belong&0xf0000000      0x30000000      MIPS-IV
 >>>>36  belong&0xf0000000      0x40000000      MIPS-V
->>>>36  belong&0xf0000000      0x60000000      MIPS32
->>>>36  belong&0xf0000000      0x70000000      MIPS64
->>>>36  belong&0xf0000000      0x80000000      MIPS32 rel2
->>>>36  belong&0xf0000000      0x90000000      MIPS64 rel2
+>>>>36  belong&0xf0000000      0x50000000      MIPS32
+>>>>36  belong&0xf0000000      0x60000000      MIPS64
+>>>>36  belong&0xf0000000      0x70000000      MIPS32 rel2
+>>>>36  belong&0xf0000000      0x80000000      MIPS64 rel2
 # only for 64-bit
 >>>4   byte            2
 >>>>48 belong&0xf0000000       0x00000000      MIPS-I
 >>>>48 belong&0xf0000000       0x20000000      MIPS-III
 >>>>48 belong&0xf0000000       0x30000000      MIPS-IV
 >>>>48 belong&0xf0000000       0x40000000      MIPS-V
->>>>48 belong&0xf0000000       0x60000000      MIPS32
->>>>48 belong&0xf0000000       0x70000000      MIPS64 
->>>>48 belong&0xf0000000       0x80000000      MIPS32 rel2
->>>>48 belong&0xf0000000       0x90000000      MIPS64 rel2
+>>>>48 belong&0xf0000000       0x50000000      MIPS32
+>>>>48 belong&0xf0000000       0x60000000      MIPS64
+>>>>48 belong&0xf0000000       0x70000000      MIPS32 rel2
+>>>>48 belong&0xf0000000       0x80000000      MIPS64 rel2
 >>18   beshort         9               Amdahl,
 >>18   beshort         10              MIPS (deprecated),
 >>18   beshort         11              RS6000,
 >>18   beshort         88              Renesas M32R,
 >>18   beshort         94              Tensilica Xtensa,
 >>18   beshort         97              NatSemi 32k,
+>>18   beshort         0x18ad          AVR32 (unofficial),
 >>18   beshort         0x9026          Alpha (unofficial),
 >>18   beshort         0xa390          IBM S/390 (obsolete),
 >>20   belong          0               invalid version
index eadfeb3..20b257b 100644 (file)
 >>>>11 ulelong >0              \b, %d sectors/track
 >>>>15 ulelong >0              \b, %d cylinders
 
+# updated by Joerg Jenderek at Sep 2007
+# only for sector sizes with 512 or more Bytes
 0x1FE  leshort 0xAA55                  x86 boot sector
+# to do also for sectors < than 512 Bytes and some other files, GRR
+#30    search/481      \x55\xAA        x86 boot sector
+# not for BeOS floppy 1440k, MBRs
+#(11.s-2) uleshort     0xAA55          x86 boot sector
 >2     string  OSBS                    \b, OS/BS MBR
 # J\xf6rg Jenderek <joerg dot jenderek at web dot de>
 >0x8C  string  Invalid\ partition\ table       \b, MS-DOS MBR
 >>498  string  BCDL\ \ \ \ BIN                 \b, Bootable CD Loader (1.50Z)
 # mbr partion table entries
 # OEM-ID not Microsoft,SYSLINUX,or MTOOLs
->3                     string          !MS     
+>3                     string          !MS
 >>3                    string          !SYSLINUX
 >>>3                   string          !MTOOL
 # not FAT (32 bit)
 >>>>82                 string          !FAT32  
 #not IO.SYS
 >>>>>472               string          !IO\ \ \ \ \ \ SYS
+>>>>>>480              string          !IO\ \ \ \ \ \ SYS
 #not Linux kernel
->>>>>>514              string          !HdrS           
+>>>>>>>514             string          !HdrS
+#not BeOS
+>>>>>>>>422            string          !Be\ Boot\ Loader
 # active flag 0 or 0x80 and type > 0
->>>>>>>446             ubyte           <0x81   
->>>>>>>>446            ubyte&0x7F      0       
+>>>>>>>>>446           ubyte           <0x81   
+>>>>>>>>>>446          ubyte&0x7F      0       
 >>>>>>>>>>>450         ubyte           >0      \b; partition 1: ID=0x%x
->>>>>>>>>>446          ubyte           0x80    \b, active
->>>>>>>>>>447          ubyte           x       \b, starthead %u
-#>>>>>>>>>>448         ubyte           x       \b, start C_S: 0x%x
-#>>>>>>>>>>448         ubeshort&1023   x       \b, startcylinder? %d
->>>>>>>>>>454          ulelong         x       \b, startsector %u
->>>>>>>>>>458          ulelong         x       \b, %u sectors
+>>>>>>>>>>>>446                ubyte           0x80    \b, active
+>>>>>>>>>>>>447                ubyte           x       \b, starthead %u
+#>>>>>>>>>>>>448               ubyte           x       \b, start C_S: 0x%x
+#>>>>>>>>>>>>448               ubeshort&1023   x       \b, startcylinder? %d
+>>>>>>>>>>>>454                ulelong         x       \b, startsector %u
+>>>>>>>>>>>>458                ulelong         x       \b, %u sectors
 #
->>>>>>>462             ubyte           <0x81   
->>>>>>>>462            ubyte&0x7F      0               
->>>>>>>>>466           ubyte           >0      \b; partition 2: ID=0x%x
->>>>>>>>>>462          ubyte           0x80    \b, active
->>>>>>>>>>463          ubyte           x       \b, starthead %u
-#>>>>>>>>>>464         ubyte           x       \b, start C_S: 0x%x
-#>>>>>>>>>>464         ubeshort&1023   x       \b, startcylinder? %d
->>>>>>>>>>470          ulelong         x       \b, startsector %u
->>>>>>>>>>474          ulelong         x       \b, %u sectors
+>>>>>>>>>462           ubyte           <0x81   
+>>>>>>>>>>462          ubyte&0x7F      0               
+>>>>>>>>>>>466         ubyte           >0      \b; partition 2: ID=0x%x
+>>>>>>>>>>>>462                ubyte           0x80    \b, active
+>>>>>>>>>>>>463                ubyte           x       \b, starthead %u
+#>>>>>>>>>>>>464               ubyte           x       \b, start C_S: 0x%x
+#>>>>>>>>>>>>464               ubeshort&1023   x       \b, startcylinder? %d
+>>>>>>>>>>>>470                ulelong         x       \b, startsector %u
+>>>>>>>>>>>>474                ulelong         x       \b, %u sectors
 #
->>>>>>>478             ubyte           <0x81           
->>>>>>>>478            ubyte&0x7F      0               
->>>>>>>>>482           ubyte           >0      \b; partition 3: ID=0x%x
->>>>>>>>>>478          ubyte           0x80    \b, active
->>>>>>>>>>479          ubyte           x       \b, starthead %u
-#>>>>>>>>>>480         ubyte           x       \b, start C_S: 0x%x
-#>>>>>>>>>>481         ubyte           x       \b, start C2S: 0x%x
-#>>>>>>>>>>480         ubeshort&1023   x       \b, startcylinder? %d
->>>>>>>>>>486          ulelong         x       \b, startsector %u
->>>>>>>>>>490          ulelong         x       \b, %u sectors
+>>>>>>>>>478           ubyte           <0x81           
+>>>>>>>>>>478          ubyte&0x7F      0               
+>>>>>>>>>>>482         ubyte           >0      \b; partition 3: ID=0x%x
+>>>>>>>>>>>>478                ubyte           0x80    \b, active
+>>>>>>>>>>>>479                ubyte           x       \b, starthead %u
+#>>>>>>>>>>>>480               ubyte           x       \b, start C_S: 0x%x
+#>>>>>>>>>>>>481               ubyte           x       \b, start C2S: 0x%x
+#>>>>>>>>>>>>480               ubeshort&1023   x       \b, startcylinder? %d
+>>>>>>>>>>>>486                ulelong         x       \b, startsector %u
+>>>>>>>>>>>>490                ulelong         x       \b, %u sectors
 #
->>>>>>>494             ubyte           <0x81   
->>>>>>>>494            ubyte&0x7F      0               
->>>>>>>>>498           ubyte           >0      \b; partition 4: ID=0x%x
->>>>>>>>>>494          ubyte           0x80    \b, active
->>>>>>>>>>495          ubyte           x       \b, starthead %u
-#>>>>>>>>>>496         ubyte           x       \b, start C_S: 0x%x
-#>>>>>>>>>>496         ubeshort&1023   x       \b, startcylinder? %d
->>>>>>>>>>502          ulelong         x       \b, startsector %u
->>>>>>>>>>506          ulelong         x       \b, %u sectors
+>>>>>>>>>494           ubyte           <0x81   
+>>>>>>>>>>494          ubyte&0x7F      0               
+>>>>>>>>>>>498         ubyte           >0      \b; partition 4: ID=0x%x
+>>>>>>>>>>>>494                ubyte           0x80    \b, active
+>>>>>>>>>>>>495                ubyte           x       \b, starthead %u
+#>>>>>>>>>>>>496               ubyte           x       \b, start C_S: 0x%x
+#>>>>>>>>>>>>496               ubeshort&1023   x       \b, startcylinder? %d
+>>>>>>>>>>>>502                ulelong         x       \b, startsector %u
+>>>>>>>>>>>>506                ulelong         x       \b, %u sectors
 # mbr partion table entries end
 # http://www.acronis.de/
 #FAT label=ACRONIS\ SZ
 >>>>>>>498     ubyte&0xDF      >0                      
 >>>>>>>>498    string          x                       \b.%-.3s
 #
->486   ubyte&0xDF      >0
->>416  string  Non-System\ disk\ or\                   
->>>435 string  disk\ error\r                           
->>>>447        string  Replace\ and\ press\ any\ key\          
->>>>>473 string        when\ ready\r                           \b, Microsoft DOS Bootloader
->480   ubyte&0xDF      >0                      
->>393  string  Non-System\ disk\ or\                   
->>>412 string  disk\ error\r                           
->>>>424        string  Replace\ and\ press\ any\ key\          
->>>>>450 string        when\ ready\r                           \b, Microsoft DOS bootloader
-#IO.SYS
->>>>>480       string          x                       \b %-.2s
->>>>>>482      ubyte&0xDF      >0                      
->>>>>>>48      string          x                       \b%-.6s
->>>>>488       ubyte&0xDF      >0                      
->>>>>>488      string          x                       \b.%-.3s
-#MSDOS.SYS
->>>>>>491      ubyte&0xDF      >0                      \b+
->>>>>>>491     string          x                       \b%-.5s
->>>>>>>>496    ubyte&0xDF      >0                      
->>>>>>>>>496   string          x                       \b%-.3s
->>>>>>>499     ubyte&0xDF      >0                      
->>>>>>>>499    string          x                       \b.%-.3s
+>376   search/41       Non-System\ disk\ or\           
+>>395  search/41       disk\ error\r                   
+>>>407 search/41       Replace\ and\                   
+>>>>419        search/41       press\                          \b,
+>>>>419        search/41       strike\                         \b, old
+>>>>426        search/41       any\ key\ when\ ready\r         MS or PC-DOS bootloader
+#449                   Disk\ Boot\ failure\r           MS 3.21
+#466                   Boot\ Failure\r                 MS 3.30
+>>>>>468 search/18     \0                              
+#IO.SYS,IBMBIO.COM
+>>>>>>&0       string          x                       \b %-.2s
+>>>>>>>&-20    ubyte&0xDF      >0                      
+>>>>>>>>&-1    string          x                       \b%-.4s
+>>>>>>>>>&-16  ubyte&0xDF      >0                      
+>>>>>>>>>>&-1  string          x                       \b%-.2s
+>>>>>>&8       ubyte&0xDF      >0                      \b.
+>>>>>>>&-1     string          x                       \b%-.3s
+#MSDOS.SYS,IBMDOS.COM
+>>>>>>&11      ubyte&0xDF      >0                      \b+
+>>>>>>>&-1     string          x                       \b%-.5s
+>>>>>>>>&-6    ubyte&0xDF      >0                      
+>>>>>>>>>&-1   string          x                       \b%-.1s
+>>>>>>>>>>&-5  ubyte&0xDF      >0                      
+>>>>>>>>>>>&-1 string          x                       \b%-.2s
+>>>>>>>&7      ubyte&0xDF      >0                      \b.
+>>>>>>>>&-1    string          x                       \b%-.3s
+>441   string  Cannot\ load\ from\ harddisk.\n\r
+>>469  string  Insert\ Systemdisk\                     
+>>>487 string  and\ press\ any\ key.\n\r               \b, MS (2.11) DOS bootloader
 #>43   string  \224R-LOADER\ \ SYS                     =label                                  
 >54    string  SYS
 >>324  string  VASKK
 >>>495 string  NEWLDR\0                                \b, DR-DOS Bootloader (LOADER.SYS)
 #
+>98    string  Press\ a\ key\ to\ retry\0\r            
+>>120  string  Cannot\ find\ file\ \0\r                
+>>>139 string  Disk\ read\ error\0\r                   
+>>>>156        string  Loading\ ...\0                          \b, DR-DOS (3.41) Bootloader
+#DRBIOS.SYS
+>>>>>44                ubyte&0xDF      >0                      
+>>>>>>44       string          x                       \b %-.6s
+>>>>>>>50      ubyte&0xDF      >0                      
+>>>>>>>>50     string          x                       \b%-.2s
+>>>>>>52       ubyte&0xDF      >0                      
+>>>>>>>52      string          x                       \b.%-.3s
+#
 >70    string  IBMBIO\ \ COM                           
 >>472  string  Cannot\ load\ DOS!\                     
 >>>489 string  Any\ key\ to\ retry                     \b, DR-DOS Bootloader
 #it also hangs with another message ("NF").
 >>>>>492               string          RENF            \b, FAT (12 bit)
 >>>>>495               string          RENF            \b, FAT (16 bit)
+# added by Joerg Jenderek
+# http://syslinux.zytor.com/iso.php
+0      ulelong 0x7c40eafa              isolinux Loader
+# http://syslinux.zytor.com/pxe.php
+0      ulelong 0x007c05ea              pxelinux Loader
+0      ulelong 0x60669c66              pxelinux Loader
 # loader end
-# Joerg Jenderek
->446   ubyte   0                       
->>450  ubyte   >0                      
->>>482 ubyte   0                       
->>>>498        ubyte   0                       
->>>>466        ubyte   0x05                    \b, extended partition table
->>>>466        ubyte   0x0F                    \b, extended partition table (LBA)
->>>>466        ubyte   0x0                     \b, extended partition table (last)     
+# updated by Joerg Jenderek at Sep 2007
+>3     ubyte   0                       
+#no active flag
+>>446  ubyte   0                       
+# partition 1 not empty
+>>>450 ubyte   >0                      
+# partitions 3,4 empty
+>>>>482                ubyte   0                       
+>>>>>498       ubyte   0                       
+# partition 2 ID=0,5,15
+>>>>>>466      ubyte   <0x10                   
+>>>>>>>466     ubyte   0x05                    \b, extended partition table
+>>>>>>>466     ubyte   0x0F                    \b, extended partition table (LBA)
+>>>>>>>466     ubyte   0x0                     \b, extended partition table (last)     
 # JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
-# older drives may use E9 xx xx
+# http://mirror.href.com/thestarman/asm/2bytejumps.htmm#FWD
+# older drives may use Near JuMP instruction E9 xx xx
 >0             lelong&0x009000EB       0x009000EB 
 >0             lelong&0x000000E9       0x000000E9 
->>1            ubyte                   >37     \b, code offset 0x%x
+# maximal short forward jump is 07fx
+>1             ubyte                   <0xff   \b, code offset 0x%x
 # mtools-3.9.8/msdos.h
 # usual values are marked with comments to get only informations of strange FAT systems
-# valid sectorsize are from 32 to 2048
->>>11          uleshort        <2049   
->>>>11         uleshort        >31     
+# valid sectorsize must be a power of 2 from 32 to 32768
+>>11           uleshort&0x000f x               
+>>>11          uleshort        <32769          
+>>>>11         uleshort        >31             
 >>>>>3         string          >\0             \b, OEM-ID "%8.8s"
+#http://mirror.href.com/thestarman/asm/debug/debug2.htm#IHC
+>>>>>>8                string          IHC             \b cached by Windows 9M
 >>>>>11                uleshort        >512            \b, Bytes/sector %u
 #>>>>>11       uleshort        =512            \b, Bytes/sector %u=512 (usual)
 >>>>>11                uleshort        <512            \b, Bytes/sector %u
 >>>>>26                ubyte           >2              \b, heads %u
 #>>>>>26       ubyte           =2              \b, heads %u (usual floppy)
 >>>>>26                ubyte           =1              \b, heads %u
->>>>>28                ulelong         >0              \b, hidden sectors %u
-#>>>>>28       ulelong         =0              \b, hidden sectors %u (usual floppy)
->>>>>32                ulelong         >0              \b, sectors %u (volumes > 32 MB) 
-#>>>>>32       ulelong         =0              \b, sectors %u (volumes > 32 MB) 
+#skip for Digital Research DOS (version 3.41) 1440 kB Bootdisk
+>>>>>38                ubyte           !0x70           
+>>>>>>28       ulelong         >0              \b, hidden sectors %u
+#>>>>>>28      ulelong         =0              \b, hidden sectors %u (usual floppy)
+>>>>>>32       ulelong         >0              \b, sectors %u (volumes > 32 MB) 
+#>>>>>>32      ulelong         =0              \b, sectors %u (volumes > 32 MB)
 # FAT<32 specific 
-# NOT le FAT3=NOT 3TAF=0xCCABBEB9
->>>>>82                ulelong&0xCCABBEB9      >0
->>>>>>36       ubyte           >0x80           \b, physical drive 0x%x
-#>>>>>>36      ubyte           =0x80           \b, physical drive 0x%x=0x80 (usual harddisk)
->>>>>>36       ubyte&0x7F      >0              \b, physical drive 0x%x
-#>>>>>>36      ubyte           =0              \b, physical drive 0x%x=0 (usual floppy)
+>>>>>82                string          !FAT32
+#>>>>>>36      ubyte           0x80            \b, physical drive 0x%x=0x80 (usual harddisk)
+#>>>>>>36      ubyte           0               \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>36       ubyte           !0x80           
+>>>>>>>36      ubyte           !0              \b, physical drive 0x%x
 >>>>>>37       ubyte           >0              \b, reserved 0x%x
 #>>>>>>37      ubyte           =0              \b, reserved 0x%x
 >>>>>>38       ubyte           >0x29           \b, dos < 4.0 BootSector (0x%x)
 # 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')
+>38913   string    NSR0      UDF filesystem data
+>>38917  string    1         (version 1.0)
+>>38917  string    2         (version 1.5)
+>>38917  string    3         (version 2.0)
+>>38917  byte     >0x33      (unknown version, ID 0x%X)
+>>38917  byte     <0x31      (unknown version, ID 0x%X)
 # "application id" which appears to be used as a volume label
 >32808  string    >\0       '%s'
 >34816  string    \000CD001\001EL\ TORITO\ SPECIFICATION    (bootable)
 >525    byte            x               Level %d
 >525    byte            x               (ODS-%d OpenVMS file system),
 >984    string          x               volume label is '%-12.12s'
+
+# From: Thomas Klausner <wiz@NetBSD.org>
+# http://filext.com/file-extension/DAA
+# describes the daa file format. The magic would be:
+0      string          DAA\x0\x0\x0\x0\x0      PowerISO Direct-Access-Archive
diff --git a/contrib/file-4/magic/Magdir/fortran b/contrib/file-4/magic/Magdir/fortran
new file mode 100644 (file)
index 0000000..ce004ad
--- /dev/null
@@ -0,0 +1,2 @@
+# FORTRAN source
+0      string/c        c\              FORTRAN program
index 7aa22a6..971b72c 100644 (file)
@@ -7,3 +7,17 @@
 # From Martin Pool (m.pool@pharos.com.au)
 0      beshort         0xaced          Java serialization data
 >2     beshort         >0x0004         \b, version %d
+
+0      belong          0xfeedfeed      Java KeyStore
+
+0      belong          0xcececece      Java JCE KeyStore
+
+# Dalvik .dex format. http://retrodev.com/android/dexformat.html
+# From <mkf@google.com> "Mike Fleming"
+0      string  dex\n
+>0     regex   dex\n[0-9][0-9][0-9]\0  Dalvik dex file
+>4     string  >000                    version %s
+0      string  dey\n
+>0     regex   dey\n[0-9][0-9][0-9]\0  Dalvik dex file (optimized for host)
+>4     string  >000                    version %s
+
index 5d96376..4acd5c8 100644 (file)
 >>>>0xa54      belong          x               number of blocks: %d
 
 # From: Remi Mommsen <mommsen@slac.stanford.edu>
-0              string          BOMStore        Mac OS X bill of materials (BOM) fil
+0              string          BOMStore        Mac OS X bill of materials (BOM) file
index 6143a26..10ce8ae 100644 (file)
 100    regex/c =^[\ \t]{0,10}call[\ \t]{1,10}rxfunc OS/2 REXX batch file text
 100    regex/c =^[\ \t]{0,10}say\ ['"]      OS/2 REXX batch file text
 
-
-100 regex/c =^\\s*call\\s+rxfuncadd.*sysloadfu OS/2 REXX batch file text
-100 regex/c =^\\s*say\ ['"] OS/2 REXX batch file text
-
 0      leshort         0x14c   MS Windows COFF Intel 80386 object file
 #>4    ledate          x       stamp %s
 0      leshort         0x166   MS Windows COFF MIPS R4000 object file
 >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)
 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,
->24    belong  x               size %d +
->28    belong  x               %d
+#--------------------------------------------------------------------
+# Qemu Emulator Images
+# Lines written by Friedrich Schwittay (f.schwittay@yousable.de)
+# Made by reading sources and doing trial and error on existing
+# qcow files
+0       string  QFI     Qemu Image, Format: Qcow
+
+# Uncomment the following line to display Magic (only used for debugging
+# this magic number)
+#>0     string  x       , Magic: %s
+
+# There are currently 2 Versions: "1" and "2"
+# I do not use Version 2 and therefor branch here
+# but can assure: it works (tested on both versions)
+# Also my Qemu 0.9.0 which uses this Version 2 refuses
+# to start in its bios
+>0x04   belong  2       , Version: 2
+>0x04   belong  1       , Version: 1
+
+# Using the existence of the Backing File Offset to Branch or not
+# to read Backing File Information
+>>0xc    belong  >0      , Backing File( Offset: %d
+>>>(0xc.L)       string >\0     , Path: %s
+
+# Didnt got the Trick here how qemu stores the "Size" at this Position
+# There is actually something stored but nothing makes sense
+# The header in the sources talks about it
+#>>>16   lelong  x       , Size: %d
+
+# Modification time of the Backing File
+# Really usefull if you want to know if your backing
+# file is still usable together with this image
+>>>20    bedate x       , Mtime: %s )
+
+# Dont know how to calculate in Magicfiles
+# Also: this Information is not reliably
+#       stored in image-files
+>>24     lelong  x       , Disk Size could be: %d * 256 bytes
 
 0      string  QEVM            QEMU's suspend to disk image
 
 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
+# 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
 0      string  \320\317\021\340\241\261\032\341        Microsoft Office Document
+
+# From: "Nelson A. de Oliveira" <naoliv@gmail.com>
+# Magic type for Dell's BIOS .hdr files
+# Dell's .hdr
+0      string $RBU
+>23    string Dell                     %s system BIOS
+>48    string x                        version %.3s
+
index a1aef13..e90214e 100644 (file)
@@ -5,3 +5,9 @@
 0      string          %PDF-           PDF document
 >5     byte            x               \b, version %c
 >7     byte            x               \b.%c
+
+# From: Nick Schmalenberger <nick@schmalenberger.us>
+# Forms Data Format
+0       string          %FDF-           FDF text
+>5      byte            x               \b, version %c
+>7      byte            x               \b.%c
index 43cb63f..f7de138 100644 (file)
 >20    lelong  0                               log volume #0
 >20    lelong  >0                              log volume #%ld
 >24    string  >\0                             host: %s
-0      string  PCPFolio                        PCP 
+0      string  PCPFolio                        PCP
 >9     string  Version:                        Archive Folio
 >18    string  >\0                             (V.%s)
 0      string  #pmchart                        PCP pmchart view
 >9     string  Version
 >17    string  >\0                             (V%-3.3s)
+0      string  #kmchart                        PCP kmchart view
+>9     string  Version
+>17    string  >\0                             (V.%s)
 0      string  pmview                          PCP pmview config
 >7     string  Version
 >15    string  >\0                             (V%-3.3s)
 0      string  #pmlogger                       PCP pmlogger config
 >10    string  Version
 >18    string  >\0                             (V%1.1s)
-0      string  PcPh                            PCP Help 
+0      string  PcPh                            PCP Help
 >4     string  1                               Index
 >4     string  2                               Text
 >5     string  >\0                             (V.%1.1s)
index 787a6c8..dfa62de 100644 (file)
@@ -1,5 +1,25 @@
 # Magic data for KMimeMagic (originally for file(1) command)
 #
+# Note on adding additional MIME types:
+#
+# [RFC2045,RFC2046] specifies that Content Types, Content Subtypes, Character
+# Sets, Access Types, and conversion values for MIME mail will be assigned and
+# listed by the IANA.
+# http://www.iana.org/assignments/media-types/
+#
+# Any unregistered file type should be listed with a preceding x-, as in
+# application/x-foo (RFC2045 5.1), or a x., as in application/x.foo (RFC4288
+# 4.3).  Any non x-prefixed type should be registered with IANA and listed at
+# the above address.  Any other behavior is a MIME standards violation!
+#
+# It is preferred that when a registered MIME type exists, that
+# the registered Content-Type and Subtype be used to refer to a file of
+# that type, so don't use application/x-zip when application/zip is
+# registered.
+#
+# If an active RFC suggests that a MIME registration for a new type is in
+# progress, make a note of it pointing to that RFC.
+#
 # The format is 4-5 columns:
 #    Column #1: byte number to begin checking from, ">" indicates continuation
 #    Column #2: type of data to match
 
 38     string          \<\!DOCTYPE\040svg      image/svg+xml
 
+0      belong          0xfeedfeed      application/x-java-keystore
+
+0      belong          0xcececece      application/x-java-jce-keystore
+
 
 # xml
 0      string          \<?xml                  text/xml
 # Java
 
 0      beshort         0xcafe
->2     beshort         0xbabe          application/java
+>2     beshort         0xbabe          application/x-java-applet
+>2     beshort         0xd00d          application/x-java-pack200
 
 #------------------------------------------------------------------------------
 # audio:  file(1) magic for sound formats
 
 # Creative Labs AUDIO stuff
 #                                      Standard MIDI data
-0      string  MThd                    audio/unknown
+0      string  MThd                    audio/x-midi
 #>9    byte    >0                      (format %d)
 #>11   byte    >1                      using %d channels
 #                                      Creative Music (CMF) data
-0      string  CTMF                    audio/unknown
+0      string  CTMF                    audio/x-unknown
 #                                      SoundBlaster instrument data
-0      string  SBI                     audio/unknown
+0      string  SBI                     audio/x-unknown
 #                                      Creative Labs voice data
-0      string  Creative\ Voice\ File   audio/unknown
+0      string  Creative\ Voice\ File   audio/x-unknown
 ## is this next line right?  it came this way...
 #>19   byte    0x1A
 #>23   byte    >0                      - version %d
 
 # XPM icons (Greg Roelofs, newt@uchicago.edu)
 # ideally should go into "images", but entries below would tag XPM as C source
-0      string          /*\ XPM         image/x-xpmi 7bit
+0      string          /*\ XPM         image/x-xpmi
 
 # 3DS (3d Studio files) Conflicts with diff output 0x3d '='
 #16    beshort         0x3d3d          image/x-3ds
 0       string          #!/usr/bin/awk          application/x-awk
 0       string          #!\ /usr/bin/awk        application/x-awk
 # update to distinguish from *.vcf files by Joerg Jenderek: joerg dot jenderek at web dot de
-0      regex           BEGIN[[:space:]]*[{]    application/x-awk
+# Too general, \EBEGIN matches in postscript
+#0     regex           BEGIN[[:space:]]*[{]    application/x-awk
 
 # For Larry Wall's perl language.  The ``eval'' line recognizes an
 # outrageously clever hack for USG systems.
 # gzip (GNU zip, not to be confused with [Info-ZIP/PKWARE] zip archiver)
 0       string          \037\213        application/x-gzip
 
-0              string                  PK\003\004              application/x-zip
+0              string                  PK\003\004              application/zip
 
 # RAR archiver (Greg Roelofs, newt@uchicago.edu)
 0      string          Rar!            application/x-rar
 # This stuff came on a FrameMaker demo tape, most of which is
 # copyright, but this file is "published" as witness the following:
 #
-0      string          \<MakerFile     application/x-frame
-0      string          \<MIFFile       application/x-frame
-0      string          \<MakerDictionary       application/x-frame
-0      string          \<MakerScreenFon        application/x-frame
-0      string          \<MML           application/x-frame
-0      string          \<Book          application/x-frame
-0      string          \<Maker         application/x-frame
+# Note that this is the Framemaker Maker Interchange Format, not the
+# Normal format which would be application/vnd.framemaker.
+#
+0      string          \<MakerFile     application/x-mif
+0      string          \<MIFFile       application/x-mif
+0      string          \<MakerDictionary       application/x-mif
+0      string          \<MakerScreenFon        application/x-mif
+0      string          \<MML           application/x-mif
+0      string          \<Book          application/x-mif
+0      string          \<Maker         application/x-mif
 
 #------------------------------------------------------------------------------
 # html:  file(1) magic for HTML (HyperText Markup Language) docs
 
 # PBMPLUS
 #                                      PBM file
-0      string          P1              image/x-portable-bitmap 7bit
+0      string          P1              image/x-portable-bitmap
 #                                      PGM file
-0      string          P2              image/x-portable-greymap        7bit
+0      string          P2              image/x-portable-greymap
 #                                      PPM file
-0      string          P3              image/x-portable-pixmap 7bit
+0      string          P3              image/x-portable-pixmap
 #                                      PBM "rawbits" file
 0      string          P4              image/x-portable-bitmap
 #                                      PGM "rawbits" file
 #
 # GRR 950115:  this was mine ("Zip GIF"):
 #                                      ZIF image (GIF+deflate alpha)
-0      string          GIF94z          image/unknown
+0      string          GIF94z          image/x-unknown
 #
 # GRR 950115:  this is Jeremy Wohl's Free Graphics Format (better):
 #                                      FGF image (GIF+deflate beta)
-0      string          FGF95a          image/unknown
+0      string          FGF95a          image/x-unknown
 #
 # GRR 950115:  this is Thomas Boutell's Portable Bitmap Format proposal
 # (best; not yet implemented):
 #                                      PBF image (deflate compression)
-0      string          PBF             image/unknown
+0      string          PBF             image/x-unknown
 
 # GIF
 0      string          GIF             image/gif
 #0     string          BA              bitmap array
 
 # CDROM Filesystems
-32769    string    CD001     application/x-iso9660
+32769    string    CD001     application/x-iso9660-image
 
 # Newer StuffIt archives (grant@netbsd.org)
 0      string          StuffIt                 application/x-stuffit
 # lisp:  file(1) magic for lisp programs
 #
 # various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
-0      string  ;;                      text/plain      8bit
+0      string  ;;                      text/plain
 # Emacs 18 - this is always correct, but not very magical.
 0      string  \012(                   application/x-elc
 # Emacs 19
 # mail.news:  file(1) magic for mail and news
 #
 # There are tests to ascmagic.c to cope with mail and news.
-0      string          Relay-Version:  message/rfc822  7bit
-0      string          #!\ rnews       message/rfc822  7bit
-0      string          N#!\ rnews      message/rfc822  7bit
-0      string          Forward\ to     message/rfc822  7bit
-0      string          Pipe\ to        message/rfc822  7bit
-0      string          Return-Path:    message/rfc822  7bit
+0      string          Relay-Version:  message/rfc822
+0      string          #!\ rnews       message/rfc822
+0      string          N#!\ rnews      message/rfc822
+0      string          Forward\ to     message/rfc822
+0      string          Pipe\ to        message/rfc822
+0      string          Return-Path:    message/rfc822
 0      string          Received:       message/rfc822
-0      string          Path:           message/news    8bit
-0      string          Xref:           message/news    8bit
-0      string          From:           message/rfc822  7bit
-0      string          Article         message/news    8bit
+0      string          Path:           message/news
+0      string          Xref:           message/news
+0      string          From:           message/rfc822
+0      string          Article         message/news
 #------------------------------------------------------------------------------
 # msword: file(1) magic for MS Word files
 #
 >4      byte&0x1F         0x07           video/h264
 
 # FLI animation format
-0      leshort         0xAF11                          video/fli
+0      leshort         0xAF11                          video/x-fli
 # FLC animation format
-0      leshort         0xAF12                          video/flc
+0      leshort         0xAF12                          video/x-flc
 #
 # SGI and Apple formats
 # Added ISO mimes
-0      string          MOVI          video/sgi
+0      string          MOVI          video/x-sgi-movie
 4      string          moov          video/quicktime
 4      string          mdat          video/quicktime
 4      string          wide          video/quicktime
 4      string          free          video/quicktime
 4      string          idsc          image/x-quicktime
 4      string          idat          image/x-quicktime
-4      string          pckg          application/x-quicktime
+4      string          pckg          application/x-quicktime-player
 4      string/B        jP            image/jp2
 4      string          ftyp
 >8     string          isom          video/mp4
 # 255 (hex FF)! DL format SUCKS BIG ROCKS.
 #
 #                                              DL file version 1 , medium format (160x100, 4 images/screen)
-0      byte            1                       video/unknown
-0      byte            2                       video/unknown
+0      byte            1                       video/x-unknown
+0      byte            2                       video/x-unknown
 #
 # Databases
 #
 0              string  [KDE\ Desktop\ Entry]   application/x-kdelnk
 0              string  #\ KDE\ Config\ File    application/x-kdelnk
 # xmcd database file for kscd
-0              string  #\ xmcd                text/xmcd
+0              string  #\ xmcd                text/x-xmcd
 
 #------------------------------------------------------------------------------
 # pkgadd:  file(1) magic for SysV R4 PKG Datastreams
 0      string          \211HDF\r\n\032 Hierarchical Data Format (version 5) data
 
 # Adobe Photoshop
-0      string          8BPS                    image/x-photoshop
+0      string          8BPS                    image/vnd.adobe.photoshop
 
 # Felix von Leitner <felix-file@fefe.de>
 0      string          d8:announce             application/x-bittorrent
 0      belong  0x00000200      application/x-123
 
 # MS Access database
-4      string  Standard\ Jet\ DB       application/msaccess
+4      string  Standard\ Jet\ DB       application/x-msaccess
 
 ## magic for XBase files
 #0      byte       0x02
 # Debian has entries for the old PGP formats:
 # pgp:  file(1) magic for Pretty Good Privacy
 # see http://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html
-0       beshort         0x9900                  text/PGP key public ring
-0       beshort         0x9501                  text/PGP key security ring
-0       beshort         0x9500                  text/PGP key security ring
-0       beshort         0xa600                  text/PGP encrypted data
+0       beshort         0x9900                  application/x-pgp-keyring
+0       beshort         0x9501                  application/x-pgp-keyring
+0       beshort         0x9500                  application/x-pgp-keyring
+0       beshort         0xa600                  application/pgp-encrypted
 0       string          -----BEGIN\040PGP       text/PGP armored data
 >15     string          PUBLIC\040KEY\040BLOCK- public key block
 >15     string          MESSAGE-                message
 #
 # GnuPG Magic:
 #
-0       beshort         0x9901                  text/GnuPG key public ring
+0       beshort         0x9901                  application/x-gnupg-keyring
 0       beshort         0x8501                  text/OpenPGP data
 
 # flash:        file(1) magic for Macromedia Flash file format
 #
 0      string          FWS
 >3     byte            x                       application/x-shockwave-flash
+# Flash Video
+0      string          FLV                     video/x-flv
+
 
 # The following paramaters are created for Namazu.
 # <http://www.namazu.org/>
 #
 
 0      string          DOC
->43    byte            0x14            application/ichitaro4
->144   string  JDASH           application/ichitaro4
+>43    byte            0x14            application/x-ichitaro4
+>144   string  JDASH           application/x-ichitaro4
 
 0      string          DOC
->43    byte            0x15            application/ichitaro5
+>43    byte            0x15            application/x-ichitaro5
 
 0      string          DOC
->43    byte            0x16            application/ichitaro6
+>43    byte            0x16            application/x-ichitaro6
 
 #------------------------------------------------------------------------------
 # office97: file(1) magic for MicroSoft Office files
 #0       string          \320\317\021\340\241\261\032\341
 #>48     byte            0x1B            application/excel
 
-2080   string  Microsoft\ Excel\ 5.0\ Worksheet        application/excel
-2114   string  Biff5                                   application/excel
+2080   string  Microsoft\ Excel\ 5.0\ Worksheet        application/vnd.ms-excel
+2114   string  Biff5                                   application/vnd.ms-excel
 
 0       string \224\246\056            application/msword
 
 >24            string  @               application/octet-stream
 
 0              string  MZ
->30            string  Copyright\ 1989-1990\ PKWARE\ Inc.      application/x-zip
+>30            string  Copyright\ 1989-1990\ PKWARE\ Inc.      application/zip
 
 0              string  MZ
->30            string  PKLITE\ Copr.   application/x-zip
+>30            string  PKLITE\ Copr.   application/zip
 
 0              string  MZ
 >36            string  LHa's\ SFX      application/x-lha
 0              lelong&0x8080ffff       0x0000061a      application/x-arc
 
 # Microsoft Outlook's Transport Neutral Encapsulation Format (TNEF)
-0              lelong  0x223e9f78      application/ms-tnef
+0              lelong  0x223e9f78      application/vnd.ms-tnef
 
 # From: stephane.loeuillet@tiscali.f
 # http://www.djvuzone.org/
-0      string          AT&TFORM        image/x.djvu
+0      string          AT&TFORM        image/vnd.djvu
 
 # Danny Milosavljevic <danny.milo@gmx.net>
 # this are adrift (adventure game standard) game files, extension .taf
 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
+0      string          CPC\262         image/x-cpi
 
 # 
 128    string          DICM            application/dicom
 # Symbian installation files
 8      lelong  0x10000419      application/vnd.symbian.install
 0      lelong  0x10201A7A      x-epoc/x-sisx-app
+# FORTRAN source
+0      string/c        c\              text/x-fortran
index d5a5bec..162acfe 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "file.h"
 #include "magic.h"
+#include "patchlevel.h"
 #include <stdlib.h>
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
@@ -46,7 +47,7 @@
 #endif
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: apprentice.c,v 1.105 2007/05/16 20:51:40 christos Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.109 2007/12/27 20:52:36 christos Exp $")
 #endif /* lint */
 
 #define        EATAB {while (isascii((unsigned char) *l) && \
@@ -110,6 +111,7 @@ 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 int get_op(char);
 
 private size_t maxmagic = 0;
 private size_t magicsize = sizeof(struct magic);
@@ -188,6 +190,12 @@ static const struct type_tbl_s {
        { XX("qldate"),         FILE_QLDATE,            FILE_FMT_STR },
        { XX("leqldate"),       FILE_LEQLDATE,          FILE_FMT_STR },
        { XX("beqldate"),       FILE_BEQLDATE,          FILE_FMT_STR },
+       { XX("float"),          FILE_FLOAT,             FILE_FMT_FLOAT },
+       { XX("befloat"),        FILE_BEFLOAT,           FILE_FMT_FLOAT },
+       { XX("lefloat"),        FILE_LEFLOAT,           FILE_FMT_FLOAT },
+       { XX("double"),         FILE_DOUBLE,            FILE_FMT_DOUBLE },
+       { XX("bedouble"),       FILE_BEDOUBLE,          FILE_FMT_DOUBLE },
+       { XX("ledouble"),       FILE_LEDOUBLE,          FILE_FMT_DOUBLE },
        { XX_NULL,              FILE_INVALID,           FILE_FMT_NONE },
 # undef XX
 # undef XX_NULL
@@ -261,7 +269,6 @@ apprentice_1(struct magic_set *ms, const char *fn, int action,
                rv = apprentice_file(ms, &magic, &nmagic, fn, action);
                if (rv != 0)
                        return -1;
-               mapped = 0;
        }
 
        mapped = rv;
@@ -296,10 +303,12 @@ file_delmagic(struct magic *p, int type, size_t entries)
        if (p == NULL)
                return;
        switch (type) {
+#ifdef QUICK
        case 2:
                p--;
                (void)munmap((void *)p, sizeof(*p) * (entries + 1));
                break;
+#endif
        case 1:
                p--;
                /*FALLTHROUGH*/
@@ -431,6 +440,9 @@ apprentice_magic_strength(const struct magic *m)
        case FILE_LELDATE:
        case FILE_BELDATE:
        case FILE_MELDATE:
+       case FILE_FLOAT:
+       case FILE_BEFLOAT:
+       case FILE_LEFLOAT:
                val += 4 * MULT;
                break;
 
@@ -443,6 +455,9 @@ apprentice_magic_strength(const struct magic *m)
        case FILE_QLDATE:
        case FILE_LEQLDATE:
        case FILE_BEQLDATE:
+       case FILE_DOUBLE:
+       case FILE_BEDOUBLE:
+       case FILE_LEDOUBLE:
                val += 8 * MULT;
                break;
 
@@ -512,7 +527,7 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
        private const char hdr[] =
                "cont\toffset\ttype\topcode\tmask\tvalue\tdesc";
        FILE *f;
-       char line[BUFSIZ+1];
+       char line[BUFSIZ];
        int errs = 0;
        struct magic_entry *marray;
        uint32_t marraycount, i, mentrycount = 0;
@@ -541,7 +556,7 @@ apprentice_file(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
                (void)fprintf(stderr, "%s\n", hdr);
 
        /* read and parse this file */
-       for (ms->line = 1; fgets(line, BUFSIZ, f) != NULL; ms->line++) {
+       for (ms->line = 1; fgets(line, sizeof(line), f) != NULL; ms->line++) {
                size_t len;
                len = strlen(line);
                if (len == 0) /* null line, garbage, etc */
@@ -646,6 +661,9 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
                case FILE_BELONG:
                case FILE_LELONG:
                case FILE_MELONG:
+               case FILE_FLOAT:
+               case FILE_BEFLOAT:
+               case FILE_LEFLOAT:
                        v = (int32_t) v;
                        break;
                case FILE_QUAD:
@@ -657,6 +675,9 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
                case FILE_BEQLDATE:
                case FILE_LEQDATE:
                case FILE_LEQLDATE:
+               case FILE_DOUBLE:
+               case FILE_BEDOUBLE:
+               case FILE_LEDOUBLE:
                        v = (int64_t) v;
                        break;
                case FILE_STRING:
@@ -959,6 +980,16 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
                        case 'B':
                                m->in_type = FILE_BYTE;
                                break;
+                       case 'e':
+                       case 'f':
+                       case 'g':
+                               m->in_type = FILE_LEDOUBLE;
+                               break;
+                       case 'E':
+                       case 'F':
+                       case 'G':
+                               m->in_type = FILE_BEDOUBLE;
+                               break;
                        default:
                                if (ms->flags & MAGIC_CHECK)
                                        file_magwarn(ms,
@@ -1252,6 +1283,31 @@ check_format_type(const char *ptr, int type)
                        return -1;
                }
                
+       case FILE_FMT_FLOAT:
+       case FILE_FMT_DOUBLE:
+               if (*ptr == '-')
+                       ptr++;
+               if (*ptr == '.')
+                       ptr++;
+               while (isdigit((unsigned char)*ptr)) ptr++;
+               if (*ptr == '.')
+                       ptr++;
+               while (isdigit((unsigned char)*ptr)) ptr++;
+       
+               switch (*ptr++) {
+               case 'e':
+               case 'E':
+               case 'f':
+               case 'F':
+               case 'g':
+               case 'G':
+                       return 0;
+                       
+               default:
+                       return -1;
+               }
+               
+
        case FILE_FMT_STR:
                if (*ptr == '-')
                        ptr++;
@@ -1358,6 +1414,28 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
                }
                m->vallen = slen;
                return 0;
+       case FILE_FLOAT:
+       case FILE_BEFLOAT:
+       case FILE_LEFLOAT:
+               if (m->reln != 'x') {
+                       char *ep;
+#ifdef HAVE_STRTOF
+                       m->value.f = strtof(*p, &ep);
+#else
+                       m->value.f = (float)strtod(*p, &ep);
+#endif
+                       *p = ep;
+               }
+               return 0;
+       case FILE_DOUBLE:
+       case FILE_BEDOUBLE:
+       case FILE_LEDOUBLE:
+               if (m->reln != 'x') {
+                       char *ep;
+                       m->value.d = strtod(*p, &ep);
+                       *p = ep;
+               }
+               return 0;
        default:
                if (m->reln != 'x') {
                        char *ep;
@@ -1685,8 +1763,9 @@ apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
        else
                version = ptr[1];
        if (version != VERSIONNO) {
-               file_error(ms, 0, "version mismatch (%d != %d) in `%s'",
-                   version, VERSIONNO, dbname);
+               file_error(ms, 0, "File %d.%d supports only %d version magic "
+                   "files. `%s' is version %d", FILE_VERSION_MAJOR, patchlevel,
+                   VERSIONNO, dbname, version);
                goto error;
        }
        *nmagicp = (uint32_t)(st.st_size / sizeof(struct magic)) - 1;
index 564556d..8d2d9a7 100644 (file)
@@ -49,7 +49,7 @@
 #include "names.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: ascmagic.c,v 1.50 2007/03/15 14:51:00 christos Exp $")
+FILE_RCSID("@(#)$File: ascmagic.c,v 1.53 2007/10/29 00:54:08 christos Exp $")
 #endif /* lint */
 
 typedef unsigned long unichar;
@@ -76,6 +76,7 @@ file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
        size_t ulen;
        struct names *p;
        int rv = -1;
+       int mime = ms->flags & MAGIC_MIME;
 
        const char *code = NULL;
        const char *code_mime = NULL;
@@ -184,13 +185,6 @@ file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
                }
        }
 
-       if ((ms->flags & MAGIC_NO_CHECK_FORTRAN) == 0 &&
-           (*buf == 'c' || *buf == 'C') && ISSPC(buf[1])) {
-               subtype_mime = "text/fortran";
-               subtype = "fortran program";
-               goto subtype_identified;
-       }
-
        /* look for tokens from names.h - this is expensive! */
 
        if ((ms->flags & MAGIC_NO_CHECK_TOKENS) != 0)
@@ -271,21 +265,27 @@ subtype_identified:
        if (seen_cr && nbytes < HOWMANY)
                n_cr++;
 
-       if ((ms->flags & MAGIC_MIME)) {
-               if (subtype_mime) {
-                       if (file_printf(ms, subtype_mime) == -1)
-                               goto done;
-               } else {
-                       if (file_printf(ms, "text/plain") == -1)
-                               goto done;
+       if (mime) {
+               if (mime & MAGIC_MIME_TYPE) {
+                       if (subtype_mime) {
+                               if (file_printf(ms, subtype_mime) == -1)
+                                       goto done;
+                       } else {
+                               if (file_printf(ms, "text/plain") == -1)
+                                       goto done;
+                       }
                }
 
-               if (code_mime) {
-                       if (file_printf(ms, "; charset=") == -1)
+               if ((mime == 0 || mime == MAGIC_MIME) && code_mime) {
+                       if ((mime & MAGIC_MIME_TYPE) &&
+                           file_printf(ms, " charset=") == -1)
                                goto done;
                        if (file_printf(ms, code_mime) == -1)
                                goto done;
                }
+
+               if (mime == MAGIC_MIME_ENCODING)
+                       file_printf(ms, "binary");
        } else {
                if (file_printf(ms, code) == -1)
                        goto done;
index 2ccbef6..487b1b7 100644 (file)
 #if defined(HAVE_SYS_TIME_H)
 #include <sys/time.h>
 #endif
-#ifdef HAVE_LIBZ
+#if defined(HAVE_ZLIB_H) && defined(HAVE_LIBZ)
+#define BUILTIN_DECOMPRESS
 #include <zlib.h>
 #endif
 
 
 #ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.51 2007/03/05 02:41:29 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.54 2007/12/02 00:28:10 christos Exp $")
 #endif
 
 private struct {
@@ -86,7 +87,7 @@ private size_t ncompr = sizeof(compr) / sizeof(compr[0]);
 private ssize_t swrite(int, const void *, size_t);
 private size_t uncompressbuf(struct magic_set *, int, size_t,
     const unsigned char *, unsigned char **, size_t);
-#ifdef HAVE_LIBZ
+#ifdef BUILTIN_DECOMPRESS
 private size_t uncompressgzipped(struct magic_set *, const unsigned char *,
     unsigned char **, size_t);
 #endif
@@ -98,6 +99,7 @@ file_zmagic(struct magic_set *ms, int fd, const char *name,
        unsigned char *newbuf = NULL;
        size_t i, nsz;
        int rv = 0;
+       int mime = ms->flags & MAGIC_MIME;
 
        if ((ms->flags & MAGIC_COMPRESS) == 0)
                return 0;
@@ -112,11 +114,18 @@ file_zmagic(struct magic_set *ms, int fd, const char *name,
                        rv = -1;
                        if (file_buffer(ms, -1, name, newbuf, nsz) == -1)
                                goto error;
-                       if (file_printf(ms, " (") == -1)
-                               goto error;
-                       if (file_buffer(ms, -1, NULL, buf, nbytes) == -1)
+
+                       if (mime == MAGIC_MIME || mime == 0) {
+                               if (file_printf(ms, mime ?
+                                   " compressed-encoding=" : " (") == -1)
+                                       goto error;
+                       }
+
+                       if ((mime == 0 || mime & MAGIC_MIME_ENCODING) &&
+                           file_buffer(ms, -1, NULL, buf, nbytes) == -1)
                                goto error;
-                       if (file_printf(ms, ")") == -1)
+
+                       if (!mime && file_printf(ms, ")") == -1)
                                goto error;
                        rv = 1;
                        break;
@@ -285,7 +294,7 @@ file_pipe2file(struct magic_set *ms, int fd, const void *startbuf,
        return fd;
 }
 
-#ifdef HAVE_LIBZ
+#ifdef BUILTIN_DECOMPRESS
 
 #define FHCRC          (1 << 1)
 #define FEXTRA         (1 << 2)
@@ -364,7 +373,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
        int fdin[2], fdout[2];
        int r;
 
-#ifdef HAVE_LIBZ
+#ifdef BUILTIN_DECOMPRESS
        if (method == 2)
                return uncompressgzipped(ms, old, newch, n);
 #endif
index 0cd55ff..575b951 100644 (file)
@@ -71,7 +71,7 @@
 #include "patchlevel.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: file.c,v 1.111 2007/05/08 14:44:18 christos Exp $")
+FILE_RCSID("@(#)$File: file.c,v 1.117 2007/12/27 16:35:58 christos Exp $")
 #endif /* lint */
 
 
@@ -122,7 +122,8 @@ private void load(const char *, int);
 int
 main(int argc, char *argv[])
 {
-       int c, i;
+       int c;
+       size_t i;
        int action = 0, didsomefiles = 0, errflg = 0;
        int flags = 0;
        char *home, *usermagic;
@@ -133,33 +134,15 @@ main(int argc, char *argv[])
        int longindex;
        static const struct option long_options[] =
        {
-               {"version", 0, 0, 'v'},
-               {"help", 0, 0, 0},
-               {"brief", 0, 0, 'b'},
-               {"checking-printout", 0, 0, 'c'},
-               {"debug", 0, 0, 'd'},
-               {"exclude", 1, 0, 'e' },
-               {"files-from", 1, 0, 'f'},
-               {"separator", 1, 0, 'F'},
-               {"mime", 0, 0, 'i'},
-               {"keep-going", 0, 0, 'k'},
-#ifdef S_IFLNK
-               {"dereference", 0, 0, 'L'},
-               {"no-dereference", 0, 0, 'h'},
-#endif
-               {"magic-file", 1, 0, 'm'},
-#if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
-               {"preserve-date", 0, 0, 'p'},
-#endif
-               {"uncompress", 0, 0, 'z'},
-               {"raw", 0, 0, 'r'},
-               {"no-buffer", 0, 0, 'n'},
-               {"no-pad", 0, 0, 'N'},
-               {"special-files", 0, 0, 's'},
-               {"compile", 0, 0, 'C'},
-               {"print0", 0, 0, '0'},
-               {0, 0, 0, 0},
-       };
+#define OPT(shortname, longname, opt, doc)      \
+    {longname, opt, NULL, shortname},
+#define OPT_LONGONLY(longname, opt, doc)        \
+    {longname, opt, NULL, 0},
+#include "file_opts.h"
+#undef OPT
+#undef OPT_LONGONLY
+    {0, 0, NULL, 0}
+};
 #endif
 
        static const struct {
@@ -170,7 +153,6 @@ main(int argc, char *argv[])
                { "ascii",      MAGIC_NO_CHECK_ASCII },
                { "compress",   MAGIC_NO_CHECK_COMPRESS },
                { "elf",        MAGIC_NO_CHECK_ELF },
-               { "fortran",    MAGIC_NO_CHECK_FORTRAN },
                { "soft",       MAGIC_NO_CHECK_SOFT },
                { "tar",        MAGIC_NO_CHECK_TAR },
                { "tokens",     MAGIC_NO_CHECK_TOKENS },
@@ -220,15 +202,24 @@ main(int argc, char *argv[])
                switch (c) {
 #ifdef HAVE_GETOPT_LONG
                case 0 :
-                       if (longindex == 1)
+                       switch (longindex) {
+                       case 0:
                                help();
+                               break;
+                       case 10:
+                               flags |= MAGIC_MIME_TYPE;
+                               break;
+                       case 11:
+                               flags |= MAGIC_MIME_ENCODING;
+                               break;
+                       }
                        break;
 #endif
                case '0':
                        nulsep = 1;
                        break;
                case 'b':
-                       ++bflag;
+                       bflag++;
                        break;
                case 'c':
                        action = FILE_CHECK;
@@ -287,9 +278,9 @@ main(int argc, char *argv[])
                        flags |= MAGIC_DEVICES;
                        break;
                case 'v':
-                       (void)fprintf(stdout, "%s-%d.%.2d\n", progname,
+                       (void)fprintf(stderr, "%s-%d.%.2d\n", progname,
                                       FILE_VERSION_MAJOR, patchlevel);
-                       (void)fprintf(stdout, "magic file from %s\n",
+                       (void)fprintf(stderr, "magic file from %s\n",
                                       magicfile);
                        return 1;
                case 'z':
@@ -341,12 +332,19 @@ main(int argc, char *argv[])
                }
        }
        else {
-               int i, wid, nw;
-               for (wid = 0, i = optind; i < argc; i++) {
-                       nw = file_mbswidth(argv[i]);
+               size_t j, wid, nw;
+               for (wid = 0, j = (size_t)optind; j < (size_t)argc; j++) {
+                       nw = file_mbswidth(argv[j]);
                        if (nw > wid)
                                wid = nw;
                }
+               /*
+                * If bflag is only set twice, set it depending on
+                * number of files [this is undocumented, and subject to change]
+                */
+               if (bflag == 2) {
+                       bflag = optind >= argc - 1;
+               }
                for (; optind < argc; optind++)
                        process(argv[optind], wid);
        }
@@ -383,7 +381,6 @@ unwrap(char *fn)
        char buf[MAXPATHLEN];
        FILE *f;
        int wid = 0, cwid;
-       size_t len;
 
        if (strcmp("-", fn) == 0) {
                f = stdin;
@@ -396,9 +393,7 @@ unwrap(char *fn)
                }
 
                while (fgets(buf, MAXPATHLEN, f) != NULL) {
-                       len = strlen(buf);
-                       if (len > 0 && buf[len - 1] == '\n')
-                               buf[len - 1] = '\0';
+                       buf[strcspn(buf, "\n")] = '\0';
                        cwid = file_mbswidth(buf);
                        if (cwid > wid)
                                wid = cwid;
@@ -407,10 +402,8 @@ unwrap(char *fn)
                rewind(f);
        }
 
-       while (fgets(buf, MAXPATHLEN, f) != NULL) {
-               len = strlen(buf);
-               if (len > 0 && buf[len - 1] == '\n')
-                       buf[len - 1] = '\0';
+       while (fgets(buf, sizeof(buf), f) != NULL) {
+               buf[strcspn(buf, "\n")] = '\0';
                process(buf, wid);
                if(nobuffer)
                        (void)fflush(stdout);
@@ -551,38 +544,17 @@ usage(void)
 private void
 help(void)
 {
-       (void)puts(
-"Usage: file [OPTION]... [FILE]...\n"
-"Determine file type of FILEs.\n"
-"\n"
-"  -m, --magic-file LIST      use LIST as a colon-separated list of magic\n"
-"                               number files\n"
-"  -z, --uncompress           try to look inside compressed files\n"
-"  -b, --brief                do not prepend filenames to output lines\n"
-"  -c, --checking-printout    print the parsed form of the magic file, use in\n"
-"                               conjunction with -m to debug a new magic file\n"
-"                               before installing it\n"
-"  -e, --exclude              exclude test from the list of test to be\n"
-"                               performed for file. Valid tests are:\n"
-"                               ascii, apptype, elf, compress, soft, tar\n"
-"  -f, --files-from FILE      read the filenames to be examined from FILE\n"
-"  -F, --separator string     use string as separator instead of `:'\n"
-"  -i, --mime                 output mime type strings\n"
-"  -k, --keep-going           don't stop at the first match\n"
-"  -L, --dereference          causes symlinks to be followed\n"
-"  -n, --no-buffer            do not buffer output\n"
-"  -N, --no-pad               do not pad output\n"
-"  -p, --preserve-date        preserve access times on files\n"
-"  -r, --raw                  don't translate unprintable chars to \\ooo\n"
-"  -s, --special-files        treat special (block/char devices) files as\n"
-"                             ordinary ones\n"
-"or\n"
-"      --help                 display this help and exit\n"
-"or\n"
-"      --version              output version information and exit\n"
-"or\n"
-"  -C, --compile              compile file specified by -m\n"
-);
+       (void)fputs(
+"Usage: file [OPTION...] [FILE...]\n"
+"Determine type of FILEs.\n"
+"\n", stderr);
+#define OPT(shortname, longname, opt, doc)      \
+        fprintf(stderr, "  -%c, --" longname doc, shortname);
+#define OPT_LONGONLY(longname, opt, doc)        \
+        fprintf(stderr, "      --" longname doc);
+#include "file_opts.h"
+#undef OPT
+#undef OPT_LONGONLY
        exit(0);
 }
 #endif
index cc8b4d2..ce0f4e2 100644 (file)
@@ -27,7 +27,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.91 2007/03/25 03:13:47 christos Exp $
+ * @(#)$File: file.h,v 1.92 2007/11/08 00:31:37 christos Exp $
  */
 
 #ifndef __file_h__
@@ -146,7 +146,13 @@ struct magic {
 #define                                FILE_QLDATE     30
 #define                                FILE_LEQLDATE   31
 #define                                FILE_BEQLDATE   32
-#define                                FILE_NAMES_SIZE 33/* size of array to contain all names */
+#define                                FILE_FLOAT      33
+#define                                FILE_BEFLOAT    34
+#define                                FILE_LEFLOAT    35
+#define                                FILE_DOUBLE     36
+#define                                FILE_BEDOUBLE   37
+#define                                FILE_LEDOUBLE   38
+#define                                FILE_NAMES_SIZE 39/* size of array to contain all names */
 
 #define IS_STRING(t) \
        ((t) == FILE_STRING || \
@@ -161,6 +167,8 @@ struct magic {
 #define FILE_FMT_NUM  1 /* "cduxXi" */
 #define FILE_FMT_STR  2 /* "s" */
 #define FILE_FMT_QUAD 3 /* "ll" */
+#define FILE_FMT_FLOAT 4 /* "eEfFgG" */
+#define FILE_FMT_DOUBLE 5 /* "eEfFgG" */
 
        /* Word 3 */
        uint8_t in_op;          /* operator for indirection */
@@ -224,6 +232,8 @@ struct magic {
                uint8_t hl[4];  /* 4 bytes of a fixed-endian "long" */
                uint8_t hq[8];  /* 8 bytes of a fixed-endian "quad" */
                char s[MAXstring];      /* the search string or regex pattern */
+               float f;
+               double d;
        } value;                /* either number or string */
        /* Words 17..31 */
        char desc[MAXDESC];     /* description */
diff --git a/contrib/file-4/src/file_opts.h b/contrib/file-4/src/file_opts.h
new file mode 100644 (file)
index 0000000..46bc08a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Table of command-line options
+ *
+ * The first column specifies the short name, if any, or 0 if none.
+ * The second column specifies the long name.
+ * The third column specifies whether it takes a parameter.
+ * The fourth column is the documentation.
+ *
+ * N.B. The long options' order must correspond to the code in file.c,
+ * and OPTSTRING must be kept up-to-date with the short options.
+ * Pay particular attention to the numbers of long-only options in the
+ * switch statement!
+ */
+
+OPT_LONGONLY("help", 0, "                 display this help and exit\n")
+OPT('v', "version", 0, "              output version information and exit\n")
+OPT('m', "magic-file", 1, " LIST      use LIST as a colon-separated list of magic\n"
+    "                               number files\n")
+OPT('z', "uncompress", 0, "           try to look inside compressed files\n")
+OPT('b', "brief", 0, "                do not prepend filenames to output lines\n")
+OPT('c', "checking-printout", 0, "    print the parsed form of the magic file, use in\n"
+    "                               conjunction with -m to debug a new magic file\n"
+    "                               before installing it\n")
+OPT('e', "exclude", 1, " TEST         exclude TEST from the list of test to be\n"
+    "                               performed for file. Valid tests are:\n"
+    "                               ascii, apptype, compress, elf, soft, tar, tokens, troff\n")
+OPT('f', "files-from", 1, " FILE      read the filenames to be examined from FILE\n")
+OPT('F', "separator", 1, " STRING     use string as separator instead of `:'\n")
+OPT('i', "mime", 0, "                 output MIME type strings (--mime-type and\n"
+    "                               --mime-encoding)\n")
+OPT_LONGONLY("mime-type", 0, "            output the MIME type\n")
+OPT_LONGONLY("mime-encoding", 0, "        output the MIME encoding\n")
+OPT('k', "keep-going", 0, "           don't stop at the first match\n")
+#ifdef S_IFLNK
+OPT('L', "dereference", 0, "          follow symlinks (default)\n")
+OPT('h', "no-dereference", 0, "       don't follow symlinks\n")
+#endif
+OPT('n', "no-buffer", 0, "            do not buffer output\n")
+OPT('N', "no-pad", 0, "               do not pad output\n")
+OPT('0', "print0", 0, "               terminate filenames with ASCII NUL\n")
+#if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
+OPT('p', "preserve-date", 0, "        preserve access times on files\n")
+#endif
+OPT('r', "raw", 0, "                  don't translate unprintable chars to \\ooo\n")
+OPT('s', "special-files", 0, "        treat special (block/char devices) files as\n"
+    "                             ordinary ones\n")
+OPT('C', "compile", 0, "              compile file specified by -m\n")
+OPT('d', "debug", 0, "                print debugging messages\n")
index aa3e509..e04f598 100644 (file)
 #undef HAVE_MAJOR
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: fsmagic.c,v 1.47 2007/01/12 17:38:28 christos Exp $")
+FILE_RCSID("@(#)$File: fsmagic.c,v 1.48 2007/10/17 19:33:31 christos Exp $")
 #endif /* lint */
 
 protected int
 file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
 {
        int ret = 0;
+       int mime = ms->flags & MAGIC_MIME;
 #ifdef S_IFLNK
        char buf[BUFSIZ+4];
        int nch;
@@ -95,11 +96,12 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
                return 1;
        }
 
-       if ((ms->flags & MAGIC_MIME) != 0) {
+       if (mime) {
                if ((sb->st_mode & S_IFMT) != S_IFREG) {
-                       if (file_printf(ms, "application/x-not-regular-file")
+                       if ((mime & MAGIC_MIME_TYPE) &&
+                           file_printf(ms, "application/x-not-regular-file")
                            == -1)
-                               return -1;
+                                   return -1;
                        return 1;
                }
        }
@@ -303,8 +305,9 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
         * when we read the file.)
         */
        if ((ms->flags & MAGIC_DEVICES) == 0 && sb->st_size == 0) {
-               if (file_printf(ms, (ms->flags & MAGIC_MIME) ?
-                   "application/x-empty" : "empty") == -1)
+               if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
+                   file_printf(ms, mime ? "application/x-empty" :
+                   "empty") == -1)
                        return -1;
                return 1;
        }
index 47f0e4f..5cf1181 100644 (file)
 #endif
 #ifndef SIZE_T_MAX
 #ifdef __LP64__
-#define SIZE_T_MAX (size_t)0xfffffffffffffffffU
+#define SIZE_T_MAX (size_t)0xffffffffffffffffU
 #else
 #define SIZE_T_MAX (size_t)0xffffffffU
 #endif
 #endif
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.32 2007/05/24 17:22:27 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.35 2007/12/27 16:35:59 christos Exp $")
 #endif /* lint */
 
 #ifndef HAVE_VSNPRINTF
@@ -62,12 +62,16 @@ protected int
 file_printf(struct magic_set *ms, const char *fmt, ...)
 {
        va_list ap;
-       size_t len, size;
+       size_t size;
+       ssize_t len;
        char *buf;
 
        va_start(ap, fmt);
 
-       if ((len = vsnprintf(ms->o.ptr, ms->o.left, fmt, ap)) >= ms->o.left) {
+       len = vsnprintf(ms->o.ptr, ms->o.left, fmt, ap);
+       if (len == -1)
+               goto out;
+       if (len >= (ssize_t)ms->o.left) {
                long diff;      /* XXX: really ptrdiff_t */
 
                va_end(ap);
@@ -84,11 +88,16 @@ file_printf(struct magic_set *ms, const char *fmt, ...)
 
                va_start(ap, fmt);
                len = vsnprintf(ms->o.ptr, ms->o.left, fmt, ap);
+               if (len == -1)
+                       goto out;
        }
        va_end(ap);
        ms->o.ptr += len;
        ms->o.left -= len;
        return 0;
+out:
+       file_error(ms, errno, "vsnprintf failed");
+       return -1;
 }
 
 /*
@@ -164,59 +173,73 @@ protected int
 file_buffer(struct magic_set *ms, int fd, const char *inname, const void *buf,
     size_t nb)
 {
-    int m;
+       int m;
+       int mime = ms->flags & MAGIC_MIME;
+
+       if (nb == 0) {
+               if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
+                   file_printf(ms, mime ? "application/x-empty" :
+                   "empty") == -1)
+                       return -1;
+               return 1;
+       } else if (nb == 1) {
+               if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
+                   file_printf(ms, mime ?  "application/octet-stream" :
+                   "very short file (no magic)") == -1)
+                       return -1;
+               return 1;
+       }
 
 #ifdef __EMX__
-    if ((ms->flags & MAGIC_NO_CHECK_APPTYPE) == 0 && inname) {
-       switch (file_os2_apptype(ms, inname, buf, nb)) {
-       case -1:
-           return -1;
-       case 0:
-           break;
-       default:
-           return 1;
+       if ((ms->flags & MAGIC_NO_CHECK_APPTYPE) == 0 && inname) {
+               switch (file_os2_apptype(ms, inname, buf, nb)) {
+               case -1:
+                       return -1;
+               case 0:
+                       break;
+               default:
+                       return 1;
+               }
        }
-    }
 #endif
 
-    /* try compression stuff */
-    if ((ms->flags & MAGIC_NO_CHECK_COMPRESS) != 0 ||
-        (m = file_zmagic(ms, fd, inname, buf, nb)) == 0) {
-       /* Check if we have a tar file */
-       if ((ms->flags & MAGIC_NO_CHECK_TAR) != 0 ||
-           (m = file_is_tar(ms, buf, nb)) == 0) {
-           /* try tests in /etc/magic (or surrogate magic file) */
-           if ((ms->flags & MAGIC_NO_CHECK_SOFT) != 0 ||
-               (m = file_softmagic(ms, buf, nb)) == 0) {
-               /* try known keywords, check whether it is ASCII */
-               if ((ms->flags & MAGIC_NO_CHECK_ASCII) != 0 ||
-                   (m = file_ascmagic(ms, buf, nb)) == 0) {
-                   /* abandon hope, all ye who remain here */
-                   if (file_printf(ms, ms->flags & MAGIC_MIME ?
-                       (nb ? "application/octet-stream" :
-                           "application/empty") :
-                       (nb ? "data" :
-                           "empty")) == -1)
-                           return -1;
-                   m = 1;
+       /* try compression stuff */
+       if ((ms->flags & MAGIC_NO_CHECK_COMPRESS) != 0 ||
+           (m = file_zmagic(ms, fd, inname, buf, nb)) == 0) {
+           /* Check if we have a tar file */
+           if ((ms->flags & MAGIC_NO_CHECK_TAR) != 0 ||
+               (m = file_is_tar(ms, buf, nb)) == 0) {
+               /* try tests in /etc/magic (or surrogate magic file) */
+               if ((ms->flags & MAGIC_NO_CHECK_SOFT) != 0 ||
+                   (m = file_softmagic(ms, buf, nb)) == 0) {
+                   /* try known keywords, check whether it is ASCII */
+                   if ((ms->flags & MAGIC_NO_CHECK_ASCII) != 0 ||
+                       (m = file_ascmagic(ms, buf, nb)) == 0) {
+                       /* abandon hope, all ye who remain here */
+                       if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
+                           file_printf(ms, mime ?  "application/octet-stream" :
+                               "data") == -1)
+                               return -1;
+                       m = 1;
+                   }
                }
            }
        }
-    }
 #ifdef BUILTIN_ELF
-    if ((ms->flags & MAGIC_NO_CHECK_ELF) == 0 && m == 1 && nb > 5 && fd != -1) {
-       /*
-        * We matched something in the file, so this *might*
-        * be an ELF file, and the file is at least 5 bytes
-        * long, so if it's an ELF file it has at least one
-        * byte past the ELF magic number - try extracting
-        * information from the ELF headers that cannot easily
-        * be extracted with rules in the magic file.
-        */
-       (void)file_tryelf(ms, fd, buf, nb);
-    }
+       if ((ms->flags & MAGIC_NO_CHECK_ELF) == 0 && m == 1 &&
+           nb > 5 && fd != -1) {
+               /*
+                * We matched something in the file, so this *might*
+                * be an ELF file, and the file is at least 5 bytes
+                * long, so if it's an ELF file it has at least one
+                * byte past the ELF magic number - try extracting
+                * information from the ELF headers that cannot easily
+                * be extracted with rules in the magic file.
+                */
+               (void)file_tryelf(ms, fd, buf, nb);
+       }
 #endif
-    return m;
+       return m;
 }
 #endif
 
index c7d4d4d..142b487 100644 (file)
@@ -45,7 +45,7 @@
 #include "tar.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: is_tar.c,v 1.27 2007/01/12 17:38:28 christos Exp $")
+FILE_RCSID("@(#)$File: is_tar.c,v 1.29 2007/10/17 19:33:31 christos Exp $")
 #endif
 
 #define        isodigit(c)     ( ((c) >= '0') && ((c) <= '7') )
@@ -53,6 +53,12 @@ FILE_RCSID("@(#)$File: is_tar.c,v 1.27 2007/01/12 17:38:28 christos Exp $")
 private int is_tar(const unsigned char *, size_t);
 private int from_oct(int, const char *);       /* Decode octal number */
 
+static const char *tartype[] = {
+       "tar archive",
+       "POSIX tar archive",
+       "POSIX tar archive (GNU)",
+};
+
 protected int
 file_is_tar(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
 {
@@ -60,26 +66,19 @@ file_is_tar(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
         * Do the tar test first, because if the first file in the tar
         * archive starts with a dot, we can confuse it with an nroff file.
         */
-       switch (is_tar(buf, nbytes)) {
-       case 1:
-               if (file_printf(ms, (ms->flags & MAGIC_MIME) ?
-                   "application/x-tar" : "tar archive") == -1)
-                       return -1;
-               return 1;
-       case 2:
-               if (file_printf(ms, (ms->flags & MAGIC_MIME) ?
-                   "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:
+       int tar = is_tar(buf, nbytes);
+       int mime = ms->flags & MAGIC_MIME;
+
+       if (tar < 1 || tar > 3)
                return 0;
-       }
+
+       if (mime == MAGIC_MIME_ENCODING)
+               return 0;
+
+       if (file_printf(ms, mime ? "application/x-tar" :
+           tartype[tar - 1]) == -1)
+               return -1;
+       return 1;
 }
 
 /*
index 54db48b..84d7c95 100644 (file)
@@ -63,7 +63,7 @@
 #include "patchlevel.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: magic.c,v 1.41 2007/03/26 17:59:50 christos Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.45 2007/12/27 16:35:59 christos Exp $")
 #endif /* lint */
 
 #ifdef __EMX__
@@ -76,6 +76,9 @@ 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 COMPILE_ONLY
+private const char *file_or_fd(struct magic_set *, const char *, int);
+#endif
 
 #ifndef        STDIN_FILENO
 #define        STDIN_FILENO    0
@@ -230,13 +233,28 @@ close_and_restore(const struct magic_set *ms, const char *name, int fd,
 }
 
 #ifndef COMPILE_ONLY
+
+/*
+ * find type of descriptor
+ */
+public const char *
+magic_descriptor(struct magic_set *ms, int fd)
+{
+       return file_or_fd(ms, NULL, fd);
+}
+
 /*
  * find type of named file
  */
 public const char *
 magic_file(struct magic_set *ms, const char *inname)
 {
-       int     fd = 0;
+       return file_or_fd(ms, inname, STDIN_FILENO);
+}
+
+private const char *
+file_or_fd(struct magic_set *ms, const char *inname, int fd)
+{
        int     rv = -1;
        unsigned char *buf;
        struct stat     sb;
@@ -265,7 +283,6 @@ magic_file(struct magic_set *ms, const char *inname)
        }
 
        if (inname == NULL) {
-               fd = STDIN_FILENO;
                if (fstat(fd, &sb) == 0 && S_ISFIFO(sb.st_mode))
                        ispipe = 1;
        } else {
@@ -279,16 +296,16 @@ magic_file(struct magic_set *ms, const char *inname)
                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, flags)) < 0) {
+                       char *tmp = alloca(strlen(inname) + 5);
+                       (void)strcat(strcpy(tmp, inname), ".exe");
+                       if ((fd = open(tmp, flags)) < 0) {
 #endif
-                       if (info_from_stat(ms, sb.st_mode) == -1)
-                           goto done;
-                       rv = 0;
-                       goto done;
+                               if (info_from_stat(ms, sb.st_mode) == -1)
+                                       goto done;
+                               rv = 0;
+                               goto done;
 #ifdef __CYGWIN__
-                   }
+                       }
 #endif
                }
 #ifdef O_NONBLOCK
@@ -326,18 +343,9 @@ magic_file(struct magic_set *ms, const char *inname)
                }
        }
 
-       if (nbytes == 0) {
-               if (file_printf(ms, (ms->flags & MAGIC_MIME) ?
-                   "application/x-empty" : "empty") == -1)
-                       goto done;
-       } else if (nbytes == 1) {
-               if (file_printf(ms, "very short file (no magic)") == -1)
-                       goto done;
-       } else {
-               (void)memset(buf + nbytes, 0, SLOP); /* NUL terminate */
-               if (file_buffer(ms, fd, inname, buf, (size_t)nbytes) == -1)
-                       goto done;
-       }
+       (void)memset(buf + nbytes, 0, SLOP); /* NUL terminate */
+       if (file_buffer(ms, fd, inname, buf, (size_t)nbytes) == -1)
+               goto done;
        rv = 0;
 done:
        free(buf);
index 39fa2e1..6041f54 100644 (file)
 #define        MAGIC_SYMLINK           0x000002 /* Follow symlinks */
 #define        MAGIC_COMPRESS          0x000004 /* Check inside compressed files */
 #define        MAGIC_DEVICES           0x000008 /* Look at the contents of devices */
-#define        MAGIC_MIME              0x000010 /* Return a mime string */
+#define        MAGIC_MIME_TYPE         0x000010 /* Return only the MIME type */
 #define        MAGIC_CONTINUE          0x000020 /* Return all matches */
 #define        MAGIC_CHECK             0x000040 /* Print warnings to stderr */
 #define        MAGIC_PRESERVE_ATIME    0x000080 /* Restore access time on exit */
-#define        MAGIC_RAW               0x000100 /* Don't translate unprintable chars */
+#define        MAGIC_RAW               0x000100 /* Don't translate unprint chars */
 #define        MAGIC_ERROR             0x000200 /* Handle ENOENT etc as real errors */
-#define MAGIC_NO_CHECK_COMPRESS        0x001000 /* Don't check for compressed files */
-#define MAGIC_NO_CHECK_TAR     0x002000 /* Don't check for tar files */
-#define MAGIC_NO_CHECK_SOFT    0x004000 /* Don't check magic entries */
-#define MAGIC_NO_CHECK_APPTYPE 0x008000 /* Don't check application type */
-#define MAGIC_NO_CHECK_ELF     0x010000 /* Don't check for elf details */
-#define MAGIC_NO_CHECK_ASCII   0x020000 /* Don't check for ascii files */
-#define MAGIC_NO_CHECK_TROFF   0x040000 /* Don't check ascii/troff */
-#define MAGIC_NO_CHECK_FORTRAN 0x080000 /* Don't check ascii/fortran */
-#define MAGIC_NO_CHECK_TOKENS  0x100000 /* Don't check ascii/tokens */
+#define        MAGIC_MIME_ENCODING     0x000400 /* Return only the MIME encoding */
+#define MAGIC_MIME             (MAGIC_MIME_TYPE|MAGIC_MIME_ENCODING)
+#define        MAGIC_NO_CHECK_COMPRESS 0x001000 /* Don't check for compressed files */
+#define        MAGIC_NO_CHECK_TAR      0x002000 /* Don't check for tar files */
+#define        MAGIC_NO_CHECK_SOFT     0x004000 /* Don't check magic entries */
+#define        MAGIC_NO_CHECK_APPTYPE  0x008000 /* Don't check application type */
+#define        MAGIC_NO_CHECK_ELF      0x010000 /* Don't check for elf details */
+#define        MAGIC_NO_CHECK_ASCII    0x020000 /* Don't check for ascii files */
+#define        MAGIC_NO_CHECK_TROFF    0x040000 /* Don't check ascii/troff */
+#define        MAGIC_NO_CHECK_TOKENS   0x100000 /* Don't check ascii/tokens */
+
+/* Defined for backwards compatibility; does nothing */
+#define        MAGIC_NO_CHECK_FORTRAN  0x000000 /* Don't check ascii/fortran */
 
 #ifdef __cplusplus
 extern "C" {
@@ -59,6 +63,7 @@ magic_t magic_open(int);
 void magic_close(magic_t);
 
 const char *magic_file(magic_t, const char *);
+const char *magic_descriptor(magic_t, int);
 const char *magic_buffer(magic_t, const void *, size_t);
 
 const char *magic_error(magic_t);
index f06be17..509d2a2 100644 (file)
@@ -32,7 +32,7 @@
  * appear at fixed offsets into the file. Don't make HOWMANY
  * too high unless you have a very fast CPU.
  *
- * $File: names.h,v 1.27 2007/05/08 16:47:03 christos Exp $
+ * $File: names.h,v 1.29 2007/12/27 20:30:35 christos Exp $
  */
 
 /*
 /* these types are used to index the table 'types': keep em in sync! */
 #define        L_C     0               /* first and foremost on UNIX */
 #define        L_CC    1               /* Bjarne's postincrement */
-#define        L_FORT  2               /* the oldest one */
-#define        L_MAKE  3               /* Makefiles */
-#define        L_PLI   4               /* PL/1 */
-#define        L_MACH  5               /* some kinda assembler */
-#define        L_ENG   6               /* English */
-#define        L_PAS   7               /* Pascal */
-#define        L_MAIL  8               /* Electronic mail */
-#define        L_NEWS  9               /* Usenet Netnews */
-#define        L_JAVA  10              /* Java code */
-#define        L_HTML  11              /* HTML */
-#define        L_BCPL  12              /* BCPL */
-#define        L_M4    13              /* M4 */
-#define        L_PO    14              /* PO */
+#define        L_MAKE  2               /* Makefiles */
+#define        L_PLI   3               /* PL/1 */
+#define        L_MACH  4               /* some kinda assembler */
+#define        L_ENG   5               /* English */
+#define        L_PAS   6               /* Pascal */
+#define        L_MAIL  7               /* Electronic mail */
+#define        L_NEWS  8               /* Usenet Netnews */
+#define        L_JAVA  9               /* Java code */
+#define        L_HTML  10              /* HTML */
+#define        L_BCPL  11              /* BCPL */
+#define        L_M4    12              /* M4 */
+#define        L_PO    13              /* PO */
 
 static const struct {
        const char *human;
@@ -63,7 +62,6 @@ static const struct {
 } types[] = {
        { "C program",                                  "text/x-c", },
        { "C++ program",                                "text/x-c++" },
-       { "FORTRAN program",                            "text/x-fortran" },
        { "make commands",                              "text/x-makefile" },
        { "PL/1 program",                               "text/x-pl1" },
        { "assembler program",                          "text/x-asm" },
index e46a920..10a506b 100644 (file)
@@ -1,11 +1,17 @@
 #define        FILE_VERSION_MAJOR      4
-#define        patchlevel              21
+#define        patchlevel              23
 
 /*
  * Patchlevel file for Ian Darwin's MAGIC command.
- * $File: patchlevel.h,v 1.65 2007/05/24 17:22:27 christos Exp $
+ * $File: patchlevel.h,v 1.67 2007/12/28 20:08:40 christos Exp $
  *
  * $Log: patchlevel.h,v $
+ * Revision 1.67  2007/12/28 20:08:40  christos
+ * welcome to 4.23.
+ *
+ * Revision 1.66  2007/12/27 16:38:24  christos
+ * welcome to 4.22
+ *
  * Revision 1.65  2007/05/24 17:22:27  christos
  * Welcome to 4.21
  *
index d1d1ec1..c28ee2e 100644 (file)
@@ -41,7 +41,7 @@
 #include <time.h>
 
 #ifndef lint
-FILE_RCSID("@(#)$File: print.c,v 1.59 2007/03/05 02:41:29 christos Exp $")
+FILE_RCSID("@(#)$File: print.c,v 1.61 2007/12/27 16:35:59 christos Exp $")
 #endif  /* lint */
 
 #define SZOF(a)        (sizeof(a) / sizeof(a[0]))
@@ -157,6 +157,16 @@ file_mdump(struct magic *m)
                        (void)fprintf(stderr, "%s,",
                            file_fmttime((uint32_t)m->value.q, 0));
                        break;
+               case FILE_FLOAT:
+               case FILE_BEFLOAT:
+               case FILE_LEFLOAT:
+                       (void) fprintf(stderr, "%G", m->value.f);
+                       break;
+               case FILE_DOUBLE:
+               case FILE_BEDOUBLE:
+               case FILE_LEDOUBLE:
+                       (void) fprintf(stderr, "%G", m->value.d);
+                       break;
                case FILE_DEFAULT:
                        /* XXX - do anything here? */
                        break;
@@ -189,7 +199,7 @@ file_magwarn(struct magic_set *ms, const char *f, ...)
 protected const char *
 file_fmttime(uint32_t v, int local)
 {
-       char *pp, *rt;
+       char *pp;
        time_t t = (time_t)v;
        struct tm *tm;
 
@@ -219,7 +229,6 @@ file_fmttime(uint32_t v, int local)
                pp = asctime(tm);
        }
 
-       if ((rt = strchr(pp, '\n')) != NULL)
-               *rt = '\0';
+       pp[strcspn(pp, "\n")] = '\0';
        return pp;
 }
index dd9004b..3c7472b 100644 (file)
@@ -37,7 +37,7 @@
 #include "readelf.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readelf.c,v 1.63 2007/01/16 14:56:45 ljt Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.68 2007/12/27 16:13:26 christos Exp $")
 #endif
 
 #ifdef ELFCORE
@@ -191,15 +191,15 @@ getu64(int swap, uint64_t value)
 #ifdef ELFCORE
 size_t prpsoffsets32[] = {
        8,              /* FreeBSD */
-       28,             /* Linux 2.0.36 (short name) */
        44,             /* Linux (path name) */
+       28,             /* Linux 2.0.36 (short name) */
        84,             /* SunOS 5.x */
 };
 
 size_t prpsoffsets64[] = {
        16,             /* FreeBSD, 64-bit */
-       40,             /* Linux (tested on core from 2.4.x, short name) */
        56,             /* Linux (path name) */
+       40,             /* Linux (tested on core from 2.4.x, short name) */
        120,            /* SunOS 5.x, 64-bit */
 };
 
@@ -241,6 +241,7 @@ private const char *os_style_names[] = {
 
 #define FLAGS_DID_CORE         1
 #define FLAGS_DID_NOTE         2
+#define FLAGS_DID_CORE_STYLE   4
 
 private int
 dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
@@ -587,10 +588,11 @@ core:
        if ((*flags & FLAGS_DID_CORE) != 0)
                return size;
 
-       if (os_style != -1) {
+       if (os_style != -1 && (*flags & FLAGS_DID_CORE_STYLE) == 0) {
                if (file_printf(ms, ", %s-style", os_style_names[os_style])
                    == -1)
                        return size;
+               *flags |= FLAGS_DID_CORE_STYLE;
        }
 
        switch (os_style) {
@@ -615,6 +617,7 @@ core:
                        if (file_printf(ms, " (signal %u)",
                            getu32(swap, signo)) == -1)
                                return size;
+                       *flags |= FLAGS_DID_CORE;
                        return size;
                }
                break;
@@ -629,11 +632,12 @@ core:
                         * is in SunOS 5.x and Linux).
                         *
                         * Unfortunately, it's at a different offset
-                        * in varous OSes, so try multiple offsets.
+                        * in various OSes, so try multiple offsets.
                         * If the characters aren't all printable,
                         * reject it.
                         */
                        for (i = 0; i < NOFFSETS; i++) {
+                               unsigned char *cname, *cp;
                                size_t reloffset = prpsoffsets(i);
                                size_t noffset = doff + reloffset;
                                for (j = 0; j < 16; j++, noffset++,
@@ -681,9 +685,16 @@ core:
                                /*
                                 * Well, that worked.
                                 */
-                               if (file_printf(ms, ", from '%.16s'",
-                                   &nbuf[doff + prpsoffsets(i)]) == -1)
+                               cname = (unsigned char *)
+                                   &nbuf[doff + prpsoffsets(i)];
+                               for (cp = cname; *cp && isprint(*cp); cp++)
+                                       continue;
+                               if (cp > cname)
+                                       cp--;
+                               if (file_printf(ms, ", from '%.*s'",
+                                   (int)(cp - cname), cname) == -1)
                                        return size;
+                               *flags |= FLAGS_DID_CORE;
                                return size;
 
                        tryanother:
@@ -693,7 +704,6 @@ core:
                break;
        }
 #endif
-       *flags |= FLAGS_DID_CORE;
        return offset;
 }
 
@@ -884,6 +894,8 @@ dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
                                return -1;
                        }
                        break;
+               default:
+                       break;
                }
        }
        if (file_printf(ms, ", %s linked%s", linking_style, shared_libraries)
@@ -935,6 +947,8 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
 
        if (class == ELFCLASS32) {
                Elf32_Ehdr elfhdr;
+               uint16_t type;
+
                if (nbytes <= sizeof (Elf32_Ehdr))
                        return 0;
 
@@ -943,33 +957,36 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
                (void) memcpy(&elfhdr, buf, sizeof elfhdr);
                swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[EI_DATA];
 
-               if (getu16(swap, elfhdr.e_type) == ET_CORE) {
+               type = getu16(swap, elfhdr.e_type);
+               switch (type) {
 #ifdef ELFCORE
+               case ET_CORE:
                        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),
                            fsize, &flags) == -1)
                                return -1;
-#else
-                       ;
+                       break;
 #endif
-               } else {
-                       if (getu16(swap, elfhdr.e_type) == ET_EXEC) {
-                               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),
-                                   fsize, &flags)
-                                   == -1)
-                                       return -1;
-                       }
+               case ET_EXEC:
+               case ET_DYN:
+                       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),
+                           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),
                            &flags) == -1)
                                return -1;
+                       break;
+
+               default:
+                       break;
                }
                return 1;
        }
index 20a4d0f..610c310 100644 (file)
@@ -97,6 +97,7 @@ typedef struct {
 
 /* e_type */
 #define ET_EXEC                2
+#define ET_DYN         3
 #define ET_CORE                4
 
 /* sh_type */
@@ -190,12 +191,6 @@ typedef struct {
     Elf64_Off  sh_entsize;
 } Elf64_Shdr;
 
-/* Notes used in ET_CORE */
-#define NT_PRSTATUS    1
-#define NT_PRFPREG     2
-#define NT_PRPSINFO    3
-#define NT_TASKSTRUCT  4
-
 #define        NT_NETBSD_CORE_PROCINFO         1
 
 /* Note header in a PT_NOTE section */
@@ -211,10 +206,12 @@ typedef struct {
     Elf64_Word n_type;
 } Elf64_Nhdr;
 
+/* Notes used in ET_CORE */
 #define        NT_PRSTATUS     1
 #define        NT_PRFPREG      2
 #define        NT_PRPSINFO     3
 #define        NT_PRXREG       4
+#define NT_TASKSTRUCT  4
 #define        NT_PLATFORM     5
 #define        NT_AUXV         6
 
index e37517c..21a0148 100644 (file)
@@ -38,7 +38,7 @@
 
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.99 2007/05/08 14:44:18 christos Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.103 2007/12/27 16:35:59 christos Exp $")
 #endif /* lint */
 
 private int match(struct magic_set *, struct magic *, uint32_t,
@@ -254,9 +254,10 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                                break;
                        }
                }
-               firstline = 0;
-               if (printed_something)
+               if (printed_something) {
+                       firstline = 0;
                        returnval = 1;
+               }
                if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) {
                        return 1; /* don't keep searching */
                }                       
@@ -310,6 +311,8 @@ private int32_t
 mprint(struct magic_set *ms, struct magic *m)
 {
        uint64_t v;
+       float vf;
+       double vd;
        int64_t t = 0;
        char buf[512];
        union VALUETYPE *p = &ms->ms_value;
@@ -398,11 +401,8 @@ mprint(struct magic_set *ms, struct magic *m)
                        t = ms->offset + m->vallen;
                }
                else {
-                       if (*m->value.s == '\0') {
-                               char *cp = strchr(p->s,'\n');
-                               if (cp)
-                                       *cp = '\0';
-                       }
+                       if (*m->value.s == '\0')
+                               p->s[strcspn(p->s, "\n")] = '\0';
                        if (file_printf(ms, m->desc, p->s) == -1)
                                return -1;
                        t = ms->offset + strlen(p->s);
@@ -445,6 +445,48 @@ mprint(struct magic_set *ms, struct magic *m)
                t = ms->offset + sizeof(uint64_t);
                break;
 
+       case FILE_FLOAT:
+       case FILE_BEFLOAT:
+       case FILE_LEFLOAT:
+               vf = p->f;
+               switch (check_fmt(ms, m)) {
+               case -1:
+                       return -1;
+               case 1:
+                       if (snprintf(buf, sizeof(buf), "%g", vf) < 0)
+                               return -1;
+                       if (file_printf(ms, m->desc, buf) == -1)
+                               return -1;
+                       break;
+               default:
+                       if (file_printf(ms, m->desc, vf) == -1)
+                               return -1;
+                       break;
+               }
+               t = ms->offset + sizeof(float);
+               break;
+
+       case FILE_DOUBLE:
+       case FILE_BEDOUBLE:
+       case FILE_LEDOUBLE:
+               vd = p->d;
+               switch (check_fmt(ms, m)) {
+               case -1:
+                       return -1;
+               case 1:
+                       if (snprintf(buf, sizeof(buf), "%g", vd) < 0)
+                               return -1;
+                       if (file_printf(ms, m->desc, buf) == -1)
+                               return -1;
+                       break;
+               default:
+                       if (file_printf(ms, m->desc, vd) == -1)
+                               return -1;
+                       break;
+               }
+               t = ms->offset + sizeof(double);
+               break;
+
        case FILE_REGEX: {
                char *cp;
                int rval;
@@ -545,6 +587,35 @@ cvt_64(union VALUETYPE *p, const struct magic *m)
        DO_CVT(q, (uint64_t));
 }
 
+#define DO_CVT2(fld, cast) \
+       if (m->num_mask) \
+               switch (m->mask_op & FILE_OPS_MASK) { \
+               case FILE_OPADD: \
+                       p->fld += cast m->num_mask; \
+                       break; \
+               case FILE_OPMINUS: \
+                       p->fld -= cast m->num_mask; \
+                       break; \
+               case FILE_OPMULTIPLY: \
+                       p->fld *= cast m->num_mask; \
+                       break; \
+               case FILE_OPDIVIDE: \
+                       p->fld /= cast m->num_mask; \
+                       break; \
+               } \
+
+private void
+cvt_float(union VALUETYPE *p, const struct magic *m)
+{
+       DO_CVT2(f, (float));
+}
+
+private void
+cvt_double(union VALUETYPE *p, const struct magic *m)
+{
+       DO_CVT2(d, (double));
+}
+
 /*
  * Convert the byte order of the data we are looking at
  * While we're here, let's apply the mask operation
@@ -644,6 +715,36 @@ mconvert(struct magic_set *ms, struct magic *m)
                    ((p->hl[1]<<24)|(p->hl[0]<<16)|(p->hl[3]<<8)|(p->hl[2]));
                cvt_32(p, m);
                return 1;
+       case FILE_FLOAT:
+               cvt_float(p, m);
+               return 1;
+       case FILE_BEFLOAT:
+               p->l =  ((uint32_t)p->hl[0]<<24)|((uint32_t)p->hl[1]<<16)|
+                       ((uint32_t)p->hl[2]<<8) |((uint32_t)p->hl[3]);
+               cvt_float(p, m);
+               return 1;
+       case FILE_LEFLOAT:
+               p->l =  ((uint32_t)p->hl[3]<<24)|((uint32_t)p->hl[2]<<16)|
+                       ((uint32_t)p->hl[1]<<8) |((uint32_t)p->hl[0]);
+               cvt_float(p, m);
+               return 1;
+       case FILE_DOUBLE:
+               cvt_double(p, m);
+               return 1;
+       case FILE_BEDOUBLE:
+               p->q =  ((uint64_t)p->hq[0]<<56)|((uint64_t)p->hq[1]<<48)|
+                       ((uint64_t)p->hq[2]<<40)|((uint64_t)p->hq[3]<<32)|
+                       ((uint64_t)p->hq[4]<<24)|((uint64_t)p->hq[5]<<16)|
+                       ((uint64_t)p->hq[6]<<8) |((uint64_t)p->hq[7]);
+               cvt_double(p, m);
+               return 1;
+       case FILE_LEDOUBLE:
+               p->q =  ((uint64_t)p->hq[7]<<56)|((uint64_t)p->hq[6]<<48)|
+                       ((uint64_t)p->hq[5]<<40)|((uint64_t)p->hq[4]<<32)|
+                       ((uint64_t)p->hq[3]<<24)|((uint64_t)p->hq[2]<<16)|
+                       ((uint64_t)p->hq[1]<<8) |((uint64_t)p->hq[0]);
+               cvt_double(p, m);
+               return 1;
        case FILE_REGEX:
        case FILE_SEARCH:
        case FILE_DEFAULT:
@@ -730,13 +831,17 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
                                    offset);
                                return -1;
                        }
-                       for (/*EMPTY*/; src < esrc; src++, dst++) {
+                       for (/*EMPTY*/; src < esrc; src += 2, dst++) {
                                if (dst < edst)
-                                       *dst = *src++;
+                                       *dst = *src;
                                else
                                        break;
-                               if (*dst == '\0')
-                                       *dst = ' ';
+                               if (*dst == '\0') {
+                                       if (type == FILE_BESTRING16 ?
+                                           *(src - 1) != '\0' :
+                                           *(src + 1) != '\0')
+                                               *dst = ' ';
+                               }
                        }
                        *edst = '\0';
                        return 0;
@@ -1289,10 +1394,20 @@ mget(struct magic_set *ms, const unsigned char *s,
        case FILE_BELDATE:
        case FILE_LELDATE:
        case FILE_MELDATE:
+       case FILE_FLOAT:
+       case FILE_BEFLOAT:
+       case FILE_LEFLOAT:
                if (nbytes < (offset + 4))
                        return 0;
                break;
                
+       case FILE_DOUBLE:
+       case FILE_BEDOUBLE:
+       case FILE_LEDOUBLE:
+               if (nbytes < (offset + 8))
+                       return 0;
+               break;
+
        case FILE_STRING:
        case FILE_PSTRING:
        case FILE_SEARCH:
@@ -1395,6 +1510,8 @@ magiccheck(struct magic_set *ms, struct magic *m)
 {
        uint64_t l = m->value.q;
        uint64_t v;
+       float fl, fv;
+       double dl, dv;
        int matched;
        union VALUETYPE *p = &ms->ms_value;
 
@@ -1436,6 +1553,72 @@ magiccheck(struct magic_set *ms, struct magic *m)
                v = p->q;
                break;
 
+       case FILE_FLOAT:
+       case FILE_BEFLOAT:
+       case FILE_LEFLOAT:
+               fl = m->value.f;
+               fv = p->f;
+               switch (m->reln) {
+               case 'x':
+                       matched = 1;
+                       break;
+       
+               case '!':
+                       matched = fv != fl;
+                       break;
+       
+               case '=':
+                       matched = fv == fl;
+                       break;
+       
+               case '>':
+                       matched = fv > fl;
+                       break;
+       
+               case '<':
+                       matched = fv < fl;
+                       break;
+       
+               default:
+                       matched = 0;
+                       file_magerror(ms, "cannot happen with float: invalid relation `%c'", m->reln);
+                       return -1;
+               }
+               return matched;
+
+       case FILE_DOUBLE:
+       case FILE_BEDOUBLE:
+       case FILE_LEDOUBLE:
+               dl = m->value.d;
+               dv = p->d;
+               switch (m->reln) {
+               case 'x':
+                       matched = 1;
+                       break;
+       
+               case '!':
+                       matched = dv != dl;
+                       break;
+       
+               case '=':
+                       matched = dv == dl;
+                       break;
+       
+               case '>':
+                       matched = dv > dl;
+                       break;
+       
+               case '<':
+                       matched = dv < dl;
+                       break;
+       
+               default:
+                       matched = 0;
+                       file_magerror(ms, "cannot happen with double: invalid relation `%c'", m->reln);
+                       return -1;
+               }
+               return matched;
+
        case FILE_DEFAULT:
                l = 0;
                v = 0;