Import file-5.06.
authorPeter Avalos <pavalos@dragonflybsd.org>
Wed, 27 Apr 2011 23:01:23 +0000 (13:01 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Wed, 27 Apr 2011 23:01:23 +0000 (13:01 -1000)
* fixes broken troff files
* add cdf_ctime() that prints a meaningful error when time cannot
  be converted.
* fix CDF bounds checking
* add lrzip support
* Improve file.man
* fix binary tests on magic entries with masks
* Eliminate MAXPATHLEN and use dynamic allocation
* Fix cdf string buffer setting

29 files changed:
contrib/file/ChangeLog
contrib/file/README
contrib/file/README.DELETED
contrib/file/doc/file.man
contrib/file/magic/Magdir/audio
contrib/file/magic/Magdir/compress
contrib/file/magic/Magdir/intel
contrib/file/magic/Magdir/linux
contrib/file/magic/Magdir/mail.news
contrib/file/magic/Magdir/metastore [new file with mode: 0644]
contrib/file/magic/Magdir/msooxml [new file with mode: 0644]
contrib/file/magic/Magdir/oasis [new file with mode: 0644]
contrib/file/magic/Magdir/python
contrib/file/magic/Magdir/riff
contrib/file/magic/Magdir/rinex [new file with mode: 0644]
contrib/file/magic/Magdir/sun
contrib/file/magic/Magdir/tex
contrib/file/magic/Magdir/wsdl [new file with mode: 0644]
contrib/file/src/apprentice.c
contrib/file/src/ascmagic.c
contrib/file/src/cdf.c
contrib/file/src/cdf.h
contrib/file/src/cdf_time.c
contrib/file/src/compress.c
contrib/file/src/file.c
contrib/file/src/file.h
contrib/file/src/funcs.c
contrib/file/src/magic.c
contrib/file/src/readcdf.c

index 0399d91..91f59dc 100644 (file)
@@ -1,3 +1,45 @@
+2011-03-30  15:45  Christos Zoulas <christos@zoulas.com>
+
+       * Fix cdf string buffer setting (Sven Anders)
+
+2011-03-20  16:35  Christos Zoulas <christos@zoulas.com>
+
+       * Eliminate MAXPATHLEN and use dynamic allocation for
+         path and file buffers.
+
+2011-03-15  18:15  Christos Zoulas <christos@zoulas.com>
+
+       * binary tests on magic entries with masks could spuriously
+         get converted to ascii.
+
+2011-03-12  18:06  Reuben Thomas <rrt@sc3d.org>
+
+       * Improve file.man (remove BUGS, present email addresses consistently).
+
+2011-03-07  19:38  Christos Zoulas <christos@zoulas.com>
+
+       * add lrzip support (from Ville Skytta)
+
+2011-02-10  16:36  Christos Zoulas <christos@zoulas.com>
+
+       * fix CDF bounds checking (Guy Helmer)
+
+2011-02-10  12:03  Christos Zoulas <christos@zoulas.com>
+
+       * add cdf_ctime() that prints a meaningful error when time cannot
+         be converted.
+
+2011-02-02  20:40  Christos Zoulas <christos@zoulas.com>
+
+       * help and version output to stdout.
+
+       * When matching softmagic for ascii files, don't just print
+         the softmagic classification, keep going and print the
+         text classification too. This fixes broken troff files when
+         we moved them from keyword recognition to softmagic
+         (they stopped printing "with CRLF" etc.)
+         Reported by Doug McIlroy.
+
 2011-01-16  19:31  Reuben Thomas <rrt@sc3d.org>
 
        * Fix two potential buffer overruns in apprentice_list.
index 62343cc..2b57a70 100644 (file)
@@ -1,5 +1,5 @@
 ** README for file(1) Command **
-@(#) $File: README,v 1.43 2010/11/05 17:25:55 rrt Exp $
+@(#) $File: README,v 1.44 2011/03/24 13:03:39 rrt Exp $
 
 Mailing List: file@mx.gw.com
 Bug tracker: http://bugs.gw.com/
@@ -17,6 +17,10 @@ You can download the latest version of file from:
 
        ftp://ftp.astron.com/pub/file/
 
+A public read-only git repository is available at:
+
+       https://github.com/glensc/file
+
 The major changes for 5.x are CDF file parsing, indirect magic, and
 overhaul in mime and ascii encoding handling.
 
index a564f72..5b47009 100644 (file)
@@ -25,6 +25,7 @@ python/
 src/Makefile.am
 src/Makefile.in
 src/asprintf.c
+src/getline.c
 src/getopt_long.c
 src/strlcat.c
 src/strlcpy.c
index 2b01f74..1333e27 100644 (file)
@@ -1,4 +1,4 @@
-.\" $File: file.man,v 1.87 2010/11/05 20:51:38 christos Exp $
+.\" $File: file.man,v 1.93 2011/03/12 19:01:27 rrt Exp $
 .Dd July 23, 2010
 .Dt FILE __CSECTION__
 .Os
@@ -378,7 +378,7 @@ is that this version treats any white space
 as a delimiter, so that spaces in pattern strings must be escaped.
 For example,
 .Bd -literal -offset indent
->10    string  language impress\       (imPRESS data)
+>10    string  language impress\       (imPRESS data)
 .Ed
 .Pp
 in an existing magic file would have to be changed to
@@ -431,7 +431,7 @@ keep the old magic file around for comparison purposes
 $ file file.c file /dev/{wd0a,hda}
 file.c:   C program text
 file:     ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
-         dynamically linked (uses shared libs), stripped
+          dynamically linked (uses shared libs), stripped
 /dev/wd0a: block special (0/0)
 /dev/hda: block special (3/0)
 
@@ -470,34 +470,44 @@ the external list of magic types.
 This slowed the program down slightly but made it a lot more flexible.
 .Pp
 This program, based on the System V version,
-was written by Ian Darwin <ian@darwinsys.com>
+was written by Ian Darwin
+.Aq ian@darwinsys.com
 without looking at anybody else's source code.
 .Pp
 John Gilmore revised the code extensively, making it better than
 the first version.
 Geoff Collyer found several inadequacies
 and provided some magic file entries.
-Contributions by the `&' operator by Rob McMahon, cudcv@warwick.ac.uk, 1989.
+Contributions by the `&' operator by Rob McMahon
+.Aq cudcv@warwick.ac.uk ,
+1989.
 .Pp
-Guy Harris, guy@netapp.com, made many changes from 1993 to the present.
+Guy Harris
+.Aq guy@netapp.com
+made many changes from 1993 to the present.
 .Pp
 Primary development and maintenance from 1990 to the present by
-Christos Zoulas (christos@astron.com).
+Christos Zoulas
+.Aq christos@astron.com .
 .Pp
-Altered by Chris Lowth, chris@lowth.com, 2000:
-Handle the
+Altered by Chris Lowth
+.Aq chris@lowth.com ,
+2000: handle the
 .Fl i
 option to output mime type strings, using an alternative
 magic file and internal logic.
 .Pp
-Altered by Eric Fischer (enf@pobox.com), July, 2000,
-to identify character codes and attempt to identify the languages
+Altered by Eric Fischer
+.Aq enf@pobox.com
+July, 2000, to identify character codes and attempt to identify the languages
 of non-ASCII files.
 .Pp
-Altered by Reuben Thomas (rrt@sc3d.org), 2007-2009, to improve MIME
-support and merge MIME and non-MIME magic, support directories as well
-as files of magic, apply many bug fixes, update and fix a lot of magic,
-and improve the build system.
+Altered by Reuben Thomas
+.Aq rrt@sc3d.org ,
+2007-2011, to improve MIME support, merge MIME and non-MIME magic,
+support directories as well as files of magic, apply many bug fixes,
+update and fix a lot of magic, improve the build system, improve the
+documentation, and rewrite the Python bindings in pure Python.
 .Pp
 The list of contributors to the
 .Sq magic
@@ -517,55 +527,42 @@ and
 were written by John Gilmore from his public-domain
 .Xr tar 1
 program, and are not covered by the above license.
+.Sh RETURN CODE
+.Nm
+returns 0 on success, and non-zero on error.
 .Sh BUGS
 .Pp
 Please report bugs and send patches to the bug tracker at
 .Pa http://bugs.gw.com/
 or the mailing list at
 .Aq file@mx.gw.com .
+.Sh TODO
 .Pp
-.Nm
-uses several algorithms that favor speed over accuracy,
-thus it can be misled about the contents of
-text
-files.
+Fix output so that tests for MIME and APPLE flags are not needed all
+over the place, and actual output is only done in one place. This
+needs a design. Suggestion: push possible outputs on to a list, then
+pick the last-pushed (most specific, one hopes) value at the end, or
+use a default if the list is empty. This should not slow down evaluation.
 .Pp
-The support for text files (primarily for programming languages)
-is simplistic, inefficient and requires recompilation to update.
+Continue to squash all magic bugs. See Debian BTS for a good source.
 .Pp
-The list of keywords in
-.Dv ascmagic
-probably belongs in the Magic file.
-This could be done by using some keyword like
-.Sq *
-for the offset value.
+Store arbitrarily long strings, for example for %s patterns, so that
+they can be printed out. Fixes Debian bug #271672. Would require more
+complex store/load code in apprentice.
 .Pp
-Complain about conflicts in the magic file entries.
-Make a rule that the magic entries sort based on file offset rather
-than position within the magic file?
+Add syntax for relative offsets after current level (Debian bug #466037).
 .Pp
-The program should provide a way to give an estimate
-of
-.Sq how good
-a guess is.
-We end up removing guesses (e.g.
-.Sq From\
-as first 5 chars of file) because
-they are not as good as other guesses (e.g.
-.Sq Newsgroups:
-versus
-.Sq Return-Path:
-).
-Still, if the others don't pan out, it should be possible to use the
-first guess.
+Make file -ki work, i.e. give multiple MIME types.
 .Pp
-This manual page, and particularly this section, is too long.
-.Sh RETURN CODE
-.Nm
-returns 0 on success, and non-zero on error.
+Add a zip library so we can peek inside Office2007 documents to
+figure out what they are.
+.Pp
+Don't complain when ~/.magic is not compiled.
+.Pp
+Add an option to print URLs for the sources of the file descriptions.
 .Sh AVAILABILITY
 You can obtain the original author's latest version by anonymous FTP
-on
+from
 .Dv ftp.astron.com
 in the directory
 .Dv /pub/file/file-X.YZ.tar.gz
index 483a656..a1be2f9 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: audio,v 1.61 2010/09/20 19:19:16 rrt Exp $
+# $File: audio,v 1.62 2011/04/05 20:27:13 christos Exp $
 # audio:  file(1) magic for sound formats (see also "iff")
 #
 # Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),
 >0x36  string          >\0                     author: "%s"
 >0x56  string          >\0                     copyright: "%s"
 
-# IRCAM <mpruett@sgi.com>
-# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
-0      belong          0x64a30100              IRCAM file (VAX)
-0      belong          0x64a30200              IRCAM file (Sun)
+# IRCAM sound files - Michael Pruett <michael@68k.org>
+# http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/IRCAM/IRCAM.html
+0      belong          0x64a30100              IRCAM file (VAX little-endian)
+0      belong          0x0001a364              IRCAM file (VAX big-endian)
+0      belong          0x64a30200              IRCAM file (Sun big-endian)
+0      belong          0x0002a364              IRCAM file (Sun little-endian)
 0      belong          0x64a30300              IRCAM file (MIPS little-endian)
-0      belong          0x64a30400              IRCAM file (NeXT)
+0      belong          0x0003a364              IRCAM file (MIPS big-endian)
+0      belong          0x64a30400              IRCAM file (NeXT big-endian)
+0      belong          0x64a30400              IRCAM file (NeXT big-endian)
+0      belong          0x0004a364              IRCAM file (NeXT little-endian)
 
 # NIST SPHERE <mpruett@sgi.com>
 0      string          NIST_1A\n\ \ \ 1024\n   NIST SPHERE file
index 7a6e715..98d2e09 100644 (file)
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------
-# $File: compress,v 1.46 2010/09/20 19:19:17 rrt Exp $
+# $File: compress,v 1.47 2011/03/08 00:39:46 christos Exp $
 # compress:  file(1) magic for pure-compression formats (no archives)
 #
 # compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
 0      ustring         \xFD7zXZ\x00            XZ compressed data
 !:mime application/x-xz
 
+# https://github.com/ckolivas/lrzip/blob/master/doc/magic.header.txt
+0      string          LRZI                    LRZIP compressed data
+>4     byte            x                       - version %d
+>5     byte            x                       \b.%d
+!:mime application/x-lrzip
+
 # AFX compressed files (Wolfram Kleff)
 2      string          -afx-           AFX compressed file data
 
 >5     byte            x               \b.%d
 >6     belong          x               (%d bytes)
 
-# Type: XZ
-# URL: http://tukaani.org/xz/
-0      string          \xfd\x37\x7a\x58\x5a\x00        XZ compressed data
-!:mime application/x-xz
-
 0      string          ArC\x01         FreeArc archive <http://freearc.org>
 
 # Type:        DACT compressed files
index 9cd5d7e..47812a0 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: intel,v 1.8 2009/09/19 16:28:10 christos Exp $
+# $File: intel,v 1.10 2011/03/30 19:51:00 christos Exp $
 # intel:  file(1) magic for x86 Unix
 #
 # Various flavors of x86 UNIX executable/object (other than Xenix, which
@@ -46,3 +46,8 @@
 >28      string          Adaptec      Adaptec
 >42      string          PROMISE      Promise
 >2       byte            x            (%d*512)
+
+# Flash descriptors for Intel SPI flash roms.
+# From Dr. Jesus <j@hug.gs>
+0      lelong          0x0ff0a55a      Intel serial flash for ICH/PCH ROM <= 5 or 3400 series A-step
+16     lelong          0x0ff0a55a      Intel serial flash for PCH ROM
index a8ddd0e..cce2b01 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: linux,v 1.37 2010/12/17 14:19:51 christos Exp $
+# $File: linux,v 1.40 2011/03/22 12:54:35 christos Exp $
 # linux:  file(1) magic for Linux files
 #
 # Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
 >0x1e6         belong          0x454c4b53      ELKS Kernel
 >0x1e6         belong          !0x454c4b53     style boot sector
 
+############################################################################
+# Linux S390 kernel image
+# Created by: Jan Kaluza <jkaluza@redhat.com>
+8 string \x02\x00\x00\x18\x60\x00\x00\x50\x02\x00\x00\x68\x60\x00\x00\x50\x40\x40\x40\x40\x40\x40\x40\x40 Linux S390
+>0x00010000 search/b/4096 \x00\x0a\x00\x00\x8b\xad\xcc\xcc
+# 64bit
+>>&0 string \xc1\x00\xef\xe3\xf0\x68\x00\x00 Z10 64bit kernel
+>>&0 string \xc1\x00\xef\xc3\x00\x00\x00\x00 Z9-109 64bit kernel
+>>&0 string \xc0\x00\x20\x00\x00\x00\x00\x00 Z990 64bit kernel
+>>&0 string \x00\x00\x00\x00\x00\x00\x00\x00 Z900 64bit kernel
+# 32bit
+>>&0 string \x81\x00\xc8\x80\x00\x00\x00\x00 Z10 32bit kernel
+>>&0 string \x81\x00\xc8\x80\x00\x00\x00\x00 Z9-109 32bit kernel
+>>&0 string \x80\x00\x20\x00\x00\x00\x00\x00 Z990 32bit kernel
+>>&0 string \x80\x00\x00\x00\x00\x00\x00\x00 Z900 32bit kernel
+
 ############################################################################
 # Linux 8086 executable
 0      lelong&0xFF0000FF 0xC30000E9    Linux-Dev86 executable, headerless
 #
 # 0x200 seems to be the common case
 
-0x218           string LVM2\ 001       LVM2 (Linux Logical Volume Manager)
+0x218           string  LVM2\ 001      LVM2 PV (Linux Logical Volume Manager)
 # read the offset to add to the start of the header, and the header
 # start in 0x200
->(0x214.l+0x200) string        >\0             , UUID: %s
+>&(&-12.l-0x21) byte    x
+# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
+>>&0x0          string  >\x2f          \b, UUID: %.6s
+>>&0x6          string  >\x2f          \b-%.4s
+>>&0xa          string  >\x2f          \b-%.4s
+>>&0xe          string  >\x2f          \b-%.4s
+>>&0x12         string  >\x2f          \b-%.4s
+>>&0x16         string  >\x2f          \b-%.4s
+>>&0x1a         string  >\x2f          \b-%.6s
+>>&0x20         lequad  x              \b, size: %lld
 
-0x018           string LVM2\ 001       LVM2 (Linux Logical Volume Manager)
->(0x014.l)      string >\0             , UUID: %s
+0x018           string  LVM2\ 001      LVM2 PV (Linux Logical Volume Manager)
+>&(&-12.l-0x21) byte    x
+# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
+>>&0x0          string  >\x2f          \b, UUID: %.6s
+>>&0x6          string  >\x2f          \b-%.4s
+>>&0xa          string  >\x2f          \b-%.4s
+>>&0xe          string  >\x2f          \b-%.4s
+>>&0x12         string  >\x2f          \b-%.4s
+>>&0x16         string  >\x2f          \b-%.4s
+>>&0x1a         string  >\x2f          \b-%.6s
+>>&0x20         lequad  x              \b, size: %lld
 
-0x418           string LVM2\ 001       LVM2 (Linux Logical Volume Manager)
->(0x414.l+0x400) string        >\0             , UUID: %s
+0x418           string  LVM2\ 001      LVM2 PV (Linux Logical Volume Manager)
+>&(&-12.l-0x21) byte    x
+# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
+>>&0x0          string  >\x2f          \b, UUID: %.6s
+>>&0x6          string  >\x2f          \b-%.4s
+>>&0xa          string  >\x2f          \b-%.4s
+>>&0xe          string  >\x2f          \b-%.4s
+>>&0x12         string  >\x2f          \b-%.4s
+>>&0x16         string  >\x2f          \b-%.4s
+>>&0x1a         string  >\x2f          \b-%.6s
+>>&0x20         lequad  x              \b, size: %lld
 
-0x618           string LVM2\ 001       LVM2 (Linux Logical Volume Manager)
->(0x614.l+0x600) string        >\0             , UUID: %s
+0x618           string  LVM2\ 001      LVM2 PV (Linux Logical Volume Manager)
+>&(&-12.l-0x21) byte    x              
+# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
+>>&0x0          string  >\x2f          \b, UUID: %.6s
+>>&0x6          string  >\x2f          \b-%.4s
+>>&0xa          string  >\x2f          \b-%.4s
+>>&0xe          string  >\x2f          \b-%.4s
+>>&0x12         string  >\x2f          \b-%.4s
+>>&0x16         string  >\x2f          \b-%.4s
+>>&0x1a         string  >\x2f          \b-%.6s
+>>&0x20         lequad  x              \b, size: %lld
 
 # LVM snapshot
 # from Jason Farrel
index 98ecb4a..205d6c6 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: mail.news,v 1.18 2010/11/25 15:00:12 christos Exp $
+# $File: mail.news,v 1.19 2011/01/25 13:55:57 christos Exp $
 # mail.news:  file(1) magic for mail and news
 #
 # Unfortunately, saved netnews also has From line added in some news software.
 #>4    leshort >0                      (%d messages)
 
 #0     string          \<!--\ MHonArc          text/html; x-type=mhonarc
+
+# Cyrus: file(1) magic for compiled Cyrus sieve scripts
+# URL: http://www.cyrusimap.org/docs/cyrus-imapd/2.4.6/internal/bytecode.php
+# URL: http://git.cyrusimap.org/cyrus-imapd/tree/sieve/bytecode.h?h=master
+# From: Philipp Hahn <hahn@univention.de>
+
+# Compiled Cyrus sieve script
+0       string CyrSBytecode     Cyrus sieve bytecode data,
+>12     belong =1       version 1, big-endian
+>12     lelong =1       version 1, little-endian
+>12     belong x        version %d, network-endian
diff --git a/contrib/file/magic/Magdir/metastore b/contrib/file/magic/Magdir/metastore
new file mode 100644 (file)
index 0000000..285c3cf
--- /dev/null
@@ -0,0 +1,8 @@
+
+#------------------------------------------------------------------------------
+# $File: metastore,v 1.1 2011/04/06 12:37:44 christos Exp $
+# metastore:  file(1) magic for metastore files
+# From: Thomas Wissen
+# see http://david.hardeman.nu/software.php#metastore
+0      string          MeTaSt00r3      Metastore data file, 
+>10    bequad          x               version %0llx
diff --git a/contrib/file/magic/Magdir/msooxml b/contrib/file/magic/Magdir/msooxml
new file mode 100644 (file)
index 0000000..6ccebf6
--- /dev/null
@@ -0,0 +1,33 @@
+
+#------------------------------------------------------------------------------
+# $File: msooxml,v 1.1 2011/01/25 18:36:19 christos Exp $
+# msooxml:  file(1) magic for Microsoft Office XML
+# From: Ralf Brown <ralf.brown@gmail.com>
+
+# .docx, .pptx, and .xlsx are XML plus other files inside a ZIP
+#   archive.  The first member file is normally "[Content_Types].xml".
+# Since MSOOXML doesn't have anything like the uncompressed "mimetype"
+#   file of ePub or OpenDocument, we'll have to scan for a filename
+#   which can distinguish between the three types
+
+# start by checking for ZIP local file header signature
+0               string          PK\003\004
+# make sure the first file is correct
+>0x1E           string          [Content_Types].xml
+# skip to the second local file header
+#   since some documents include a 520-byte extra field following the file
+#   header,  we need to scan for the next header
+>>(18.l+49)     search/2000     PK\003\004
+# now skip to the *third* local file header; again, we need to scan due to a
+#   520-byte extra field following the file header
+>>>&26          search/1000     PK\003\004
+# and check the subdirectory name to determine which type of OOXML
+#   file we have
+>>>>&26         string          word/           Microsoft Word 2007+
+!:mime application/msword
+>>>>&26         string          ppt/            Microsoft PowerPoint 2007+
+!:mime application/vnd.ms-powerpoint
+>>>>&26         string          xl/             Microsoft Excel 2007+
+!:mime application/vnd.ms-excel
+>>>>&26         default         x               Microsoft OOXML
+!:strength +10
diff --git a/contrib/file/magic/Magdir/oasis b/contrib/file/magic/Magdir/oasis
new file mode 100644 (file)
index 0000000..e527185
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# $File: oasis,v 1.1 2011/03/15 02:09:38 christos Exp $
+# OASIS
+# Summary: OASIS stream file
+# Long descripton: Open Artwork System Interchange Standard
+# File extension: .oas
+# Full name:   Ben Cowley (bcowley@broadcom.com)
+#              Philip Dixon (pdixon@broadcom.com)
+# Reference: http://www.wrcad.com/oasis/oasis-3626-042303-draft.pdf
+#              (see page 3)
+0      string  %SEMI-OASIS\r\n         OASIS Stream file
index 8aa1273..68befe1 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: python,v 1.16 2010/12/31 18:15:28 christos Exp $
+# $File: python,v 1.18 2011/02/26 02:33:38 christos Exp $
 # python:  file(1) magic for python
 #
 # From: David Necas <yeti@physics.muni.cz>
@@ -20,6 +20,7 @@
 0      belong          0x03f30d0a      python 2.7 byte-compiled
 0      belong          0x3b0c0d0a      python 3.0 byte-compiled
 0      belong          0x4f0c0d0a      python 3.1 byte-compiled
+0      belong          0x6c0c0d0a      python 3.2 byte-compiled
 
 0      search/1/w      #!\ /usr/bin/python     Python script text executable
 !:mime text/x-python
@@ -32,7 +33,7 @@
 
 
 # from module.submodule import func1, func2
-0      regex/b \^from\\s+(\\w|\\.)+\\s+import.*$       Python script text executable
+0      regex   \^from\\s+(\\w|\\.)+\\s+import.*$       Python script text executable
 !:mime text/x-python
 
 # def __init__ (self, ...):
index 40100b4..3253340 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: riff,v 1.20 2010/09/20 18:55:20 rrt Exp $
+# $File: riff,v 1.21 2011/02/10 01:52:51 christos Exp $
 # riff:  file(1) magic for RIFF format
 # See
 #
 # see EBU \96 TECH 3306 http://tech.ebu.ch/docs/tech/tech3306-2009.pdf
 0      string  RF64\xff\xff\xff\xffWAVEds64            MBWF/RF64 audio
 !:mime audio/x-wav
->52    search/256      fmt\x20         \b
+>40    search/256      fmt\x20         \b
 >>&6   leshort         =1              \b, mono
 >>&6   leshort         =2              \b, stereo
 >>&6   leshort         >2              \b, %d channels
diff --git a/contrib/file/magic/Magdir/rinex b/contrib/file/magic/Magdir/rinex
new file mode 100644 (file)
index 0000000..337f639
--- /dev/null
@@ -0,0 +1,44 @@
+
+#------------------------------------------------------------------------------
+# $File: rinex,v 1.3 2011/04/04 21:12:03 christos Exp $
+# rinex:  file(1) magic for RINEX files
+# http://igscb.jpl.nasa.gov/igscb/data/format/rinex210.txt
+# ftp://cddis.gsfc.nasa.gov/pub/reports/formats/rinex300.pdf
+# data for testing: ftp://cddis.gsfc.nasa.gov/pub/gps/data
+60     string          RINEX
+>80    search/256      XXRINEXB        RINEX Data, GEO SBAS Broadcast
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/broadcast
+>80    search/256      XXRINEXD        RINEX Data, Observation (Hatanaka comp)
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/observation
+>80    search/256      XXRINEXC        RINEX Data, Clock
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/clock
+>80    search/256      XXRINEXH        RINEX Data, GEO SBAS Navigation
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/navigation
+>80    search/256      XXRINEXG        RINEX Data, GLONASS Navigation
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/navigation
+>80    search/256      XXRINEXL        RINEX Data, Galileo Navigation
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/navigation
+>80    search/256      XXRINEXM        RINEX Data, Meteorological
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/meteorological
+>80    search/256      XXRINEXN        RINEX Data, Navigation  
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/navigation
+>80    search/256      XXRINEXO        RINEX Data, Observation
+>>&32  string          x               \b, date %15.15s
+>>5    string          x               \b, version %6.6s
+!:mime rinex/observation
index d61723c..1fd37ed 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: sun,v 1.21 2010/05/05 17:38:18 christos Exp $
+# $File: sun,v 1.22 2011/02/10 01:52:51 christos Exp $
 # sun:  file(1) magic for Sun machines
 #
 # Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
 >12    belong          9               (Unknown)
 
 # Microsoft ICM color profile
-!:mime application/vnd.iccprofile
 36     string          acspMSFT        Microsoft ICM Color Profile
+!:mime application/vnd.iccprofile
 # Sun KCMS
 36     string          acsp            Kodak Color Management System, ICC Profile
 !:mime application/vnd.iccprofile
index 6ac4489..e8d2e87 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: tex,v 1.17 2010/09/20 19:19:17 rrt Exp $
+# $File: tex,v 1.18 2011/02/08 13:45:15 christos Exp $
 # tex:  file(1) magic for TeX files
 #
 # XXX - needs byte-endian stuff (big-endian and little-endian DVI?)
 !:mime text/x-info
 
 # TeX documents, from Daniel Quinlan (quinlan@yggdrasil.com)
-0      search/40     \\input         TeX document text
+0      search/4096     \\input         TeX document text
 !:mime text/x-tex
-0      search/400      \\section       LaTeX document text
+!:strength + 15
+0      search/4096     \\section       LaTeX document text
 !:mime text/x-tex
-0      search/400      \\setlength     LaTeX document text
+!:strength + 18
+0      search/4096     \\setlength     LaTeX document text
 !:mime text/x-tex
-0      search/400      \\documentstyle LaTeX document text
+!:strength + 15
+0      search/4096     \\documentstyle LaTeX document text
 !:mime text/x-tex
-0      search/400      \\chapter       LaTeX document text
+!:strength + 18
+0      search/4096     \\chapter       LaTeX document text
 !:mime text/x-tex
-0      search/400      \\documentclass LaTeX 2e document text
+!:strength + 18
+0      search/4096     \\documentclass LaTeX 2e document text
 !:mime text/x-tex
-0      search/400      \\relax         LaTeX auxiliary file
+!:strength + 15
+0      search/4096     \\relax         LaTeX auxiliary file
 !:mime text/x-tex
-0      search/400      \\contentsline  LaTeX table of contents
+!:strength + 15
+0      search/4096     \\contentsline  LaTeX table of contents
 !:mime text/x-tex
-0      search/400      %\ -*-latex-*-  LaTeX document text
+!:strength + 15
+0      search/4096     %\ -*-latex-*-  LaTeX document text
 !:mime text/x-tex
 
 # Tex document, from Hendrik Scholz <hendrik@scholz.net>
 0      search/1        \\ifx           TeX document text
 
 # Index and glossary files
-0      search/40     \\indexentry    LaTeX raw index file
-0      search/40     \\begin{theindex}       LaTeX sorted index
-0      search/40     \\glossaryentry LaTeX raw glossary
-0      search/40     \\begin{theglossary}    LaTeX sorted glossary
-0      search/40     This\ is\ makeindex     Makeindex log file
+0      search/4096     \\indexentry    LaTeX raw index file
+0      search/4096     \\begin{theindex}       LaTeX sorted index
+0      search/4096     \\glossaryentry LaTeX raw glossary
+0      search/4096     \\begin{theglossary}    LaTeX sorted glossary
+0      search/4096     This\ is\ makeindex     Makeindex log file
 
 # End of TeX
 
diff --git a/contrib/file/magic/Magdir/wsdl b/contrib/file/magic/Magdir/wsdl
new file mode 100644 (file)
index 0000000..63865bd
--- /dev/null
@@ -0,0 +1,23 @@
+
+#------------------------------------------------------------------------------
+# $File: wsdl,v 1.1 2011/01/19 19:34:50 christos Exp $
+# wsdl: PHP WSDL Cache, http://www.php.net/manual/en/book.soap.php
+# Cache format extracted from source:
+# http://svn.php.net/viewvc/php/php-src/trunk/ext/soap/php_sdl.c?revision=HEAD&view=markup
+# Requires file >= 5.05, see http://mx.gw.com/pipermail/file/2010/000683.html
+# By Elan Ruusam√§e <glen@delfi.ee>, Patryk Zawadzki <patrys@pld-linux.org>, 2010-2011
+0              string          wsdl            PHP WSDL cache,
+>4             byte            x               version 0x%02x
+>6             ledate          x               \b, created %s
+
+# uri
+>10            lelong          <0x7fffffff
+>>10           pstring/l       x               \b, uri: "%s"
+
+# source
+>>>&0          lelong          <0x7fffffff
+>>>>&-4                pstring/l       x               \b, source: "%s"
+
+# target_ns
+>>>>>&0                lelong          <0x7fffffff
+>>>>>>&-4      pstring/l       x               \b, target_ns: "%s"
index 49126ac..e12efa3 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: apprentice.c,v 1.165 2011/01/16 19:30:36 rrt Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.168 2011/03/20 20:36:52 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -72,10 +72,6 @@ FILE_RCSID("@(#)$File: apprentice.c,v 1.165 2011/01/16 19:30:36 rrt Exp $")
 #define MAP_FILE 0
 #endif
 
-#ifndef MAXPATHLEN
-#define MAXPATHLEN     1024
-#endif
-
 struct magic_entry {
        struct magic *mp;       
        uint32_t cont_count;
@@ -628,6 +624,8 @@ set_test_type(struct magic *mstart, struct magic *m)
        case FILE_DOUBLE:
        case FILE_BEDOUBLE:
        case FILE_LEDOUBLE:
+               mstart->flag |= BINTEST;
+               break;
        case FILE_STRING:
        case FILE_PSTRING:
        case FILE_BESTRING16:
@@ -674,36 +672,38 @@ private void
 load_1(struct magic_set *ms, int action, const char *fn, int *errs,
    struct magic_entry **marray, uint32_t *marraycount)
 {
-       char line[BUFSIZ];
-       size_t lineno = 0;
+       size_t lineno = 0, llen = 0;
+       char *line = NULL;
+       ssize_t len;
+
        FILE *f = fopen(ms->file = fn, "r");
        if (f == NULL) {
                if (errno != ENOENT)
                        file_error(ms, errno, "cannot read magic file `%s'",
                                   fn);
                (*errs)++;
-       } else {
-               /* read and parse this file */
-               for (ms->line = 1;
-                   fgets(line, CAST(int, sizeof(line)), f) != NULL;
-                   ms->line++) {
-                       size_t len;
-                       len = strlen(line);
-                       if (len == 0) /* null line, garbage, etc */
-                               continue;
-                       if (line[len - 1] == '\n') {
-                               lineno++;
-                               line[len - 1] = '\0'; /* delete newline */
-                       }
-                       if (line[0] == '\0')    /* empty, do not parse */
-                               continue;
-                       if (line[0] == '#')     /* comment, do not parse */
-                               continue;
-                       if (line[0] == '!' && line[1] == ':') {
+               return;
+       }
+
+       /* read and parse this file */
+       for (ms->line = 1; (len = getline(&line, &llen, f)) != -1;
+           ms->line++) {
+               if (len == 0) /* null line, garbage, etc */
+                       continue;
+               if (line[len - 1] == '\n') {
+                       lineno++;
+                       line[len - 1] = '\0'; /* delete newline */
+               }
+               switch (line[0]) {
+               case '\0':      /* empty, do not parse */
+               case '#':       /* comment, do not parse */
+                       continue;
+               case '!':
+                       if (line[1] == ':') {
                                size_t i;
 
                                for (i = 0; bang[i].name != NULL; i++) {
-                                       if (len - 2 > bang[i].len &&
+                                       if ((size_t)(len - 2) > bang[i].len &&
                                            memcmp(bang[i].name, line + 2,
                                            bang[i].len) == 0)
                                                break;
@@ -729,13 +729,17 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs,
                                }
                                continue;
                        }
+                       /*FALLTHROUGH*/
+               default:
                        if (parse(ms, marray, marraycount, line, lineno,
                            action) != 0)
                                (*errs)++;
+                       break;
                }
-
-               (void)fclose(f);
        }
+       if (line)
+               free(line);
+       (void)fclose(f);
 }
 
 /*
@@ -756,7 +760,7 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
        struct magic_entry *marray;
        uint32_t marraycount, i, mentrycount = 0, starttest;
        size_t slen, files = 0, maxfiles = 0;
-       char subfn[MAXPATHLEN], **filearr = NULL, *mfn;
+       char **filearr = NULL, *mfn;
        struct stat st;
        DIR *dir;
        struct dirent *d;
@@ -783,15 +787,16 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
                        goto out;
                }
                while ((d = readdir(dir)) != NULL) {
-                       (void)snprintf(subfn, sizeof(subfn), "%s/%s",
-                           fn, d->d_name);
-                       if (stat(subfn, &st) == -1 || !S_ISREG(st.st_mode))
-                               continue;
-                       if ((mfn = strdup(subfn)) == NULL) {
-                               file_oomem(ms, strlen(subfn));
+                       if (asprintf(&mfn, "%s/%s", fn, d->d_name) < 0) {
+                               file_oomem(ms,
+                                   strlen(fn) + strlen(d->d_name) + 2);
                                errs++;
                                goto out;
                        }
+                       if (stat(mfn, &st) == -1 || !S_ISREG(st.st_mode)) {
+                               free(mfn);
+                               continue;
+                       }
                        if (files >= maxfiles) {
                                size_t mlen;
                                maxfiles = (maxfiles + 1) * 2;
@@ -799,6 +804,7 @@ apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
                                if ((filearr = CAST(char **,
                                    realloc(filearr, mlen))) == NULL) {
                                        file_oomem(ms, mlen);
+                                       free(mfn);
                                        errs++;
                                        goto out;
                                }
index 94db560..279a51a 100644 (file)
@@ -26,8 +26,7 @@
  * SUCH DAMAGE.
  */
 /*
- * ASCII magic -- file types that we know based on keywords
- * that can appear anywhere in the file.
+ * ASCII magic -- try to detect text encoding.
  *
  * Extensively modified by Eric Fischer <enf@pobox.com> in July, 2000,
  * to handle character codes other than ASCII on a unified basis.
@@ -36,7 +35,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: ascmagic.c,v 1.77 2010/11/30 14:58:53 rrt Exp $")
+FILE_RCSID("@(#)$File: ascmagic.c,v 1.81 2011/03/15 22:16:29 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -125,7 +124,7 @@ file_ascmagic_with_encoding(struct magic_set *ms, const unsigned char *buf,
        int n_lf = 0;
        int n_cr = 0;
        int n_nel = 0;
-       int score, curtype;
+       int score, curtype, executable = 0;
 
        size_t last_line_end = (size_t)-1;
        int has_long_lines = 0;
@@ -150,11 +149,12 @@ file_ascmagic_with_encoding(struct magic_set *ms, const unsigned char *buf,
                        file_oomem(ms, mlen);
                        goto done;
                }
-               if ((utf8_end = encode_utf8(utf8_buf, mlen, ubuf, ulen)) == NULL)
-                       goto done;
-               if ((rv = file_softmagic(ms, utf8_buf, (size_t)(utf8_end - utf8_buf),
-                                        TEXTTEST)) != 0)
+               if ((utf8_end = encode_utf8(utf8_buf, mlen, ubuf, ulen))
+                   == NULL)
                        goto done;
+               if ((rv = file_softmagic(ms, utf8_buf,
+                   (size_t)(utf8_end - utf8_buf), TEXTTEST)) != 0)
+                       goto subtype_identified;
                else
                        rv = -1;
        }
@@ -246,7 +246,7 @@ subtype_identified:
                goto done;
        }
        if (mime) {
-               if ((mime & MAGIC_MIME_TYPE) != 0) {
+               if (!file_printedlen(ms) && (mime & MAGIC_MIME_TYPE) != 0) {
                        if (subtype_mime) {
                                if (file_printf(ms, "%s", subtype_mime) == -1)
                                        goto done;
@@ -256,6 +256,28 @@ subtype_identified:
                        }
                }
        } else {
+               if (file_printedlen(ms)) {
+                       switch (file_replace(ms, " text$", ", ")) {
+                       case 0:
+                               switch (file_replace(ms, " text executable$",
+                                   ", ")) {
+                               case 0:
+                                       if (file_printf(ms, ", ") == -1)
+                                               goto done;
+                               case -1:
+                                       goto done;
+                               default:
+                                       executable = 1;
+                                       break;
+                               }
+                               break;
+                       case -1:
+                               goto done;
+                       default:
+                               break;
+                       }
+               }
+
                if (file_printf(ms, "%s", code) == -1)
                        goto done;
 
@@ -267,6 +289,10 @@ subtype_identified:
                if (file_printf(ms, " %s", type) == -1)
                        goto done;
 
+               if (executable)
+                       if (file_printf(ms, " executable") == -1)
+                               goto done;
+
                if (has_long_lines)
                        if (file_printf(ms, ", with very long lines") == -1)
                                goto done;
index 91065d7..3d4d2b2 100644 (file)
@@ -35,7 +35,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.39 2010/07/22 21:59:42 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.43 2011/03/30 19:48:13 christos Exp $")
 #endif
 
 #include <assert.h>
@@ -247,18 +247,18 @@ cdf_unpack_dir(cdf_directory_t *d, char *buf)
 }
 
 static int
-cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail,
-    int line)
+cdf_check_stream_offset(const cdf_stream_t *sst, const cdf_header_t *h,
+    const void *p, size_t tail, int line)
 {
        const char *b = (const char *)sst->sst_tab;
        const char *e = ((const char *)p) + tail;
        (void)&line;
-       if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len)
+       if (e >= b && (size_t)(e - b) < CDF_SEC_SIZE(h) * sst->sst_len)
                return 0;
        DPRINTF(("%d: offset begin %p end %p %" SIZE_T_FORMAT "u"
            " >= %" SIZE_T_FORMAT "u [%" SIZE_T_FORMAT "u %"
            SIZE_T_FORMAT "u]\n", line, b, e, (size_t)(e - b),
-           sst->sst_dirlen * sst->sst_len, sst->sst_dirlen, sst->sst_len));
+           CDF_SEC_SIZE(h) * sst->sst_len, CDF_SEC_SIZE(h), sst->sst_len));
        errno = EFTYPE;
        return -1;
 }
@@ -712,8 +712,8 @@ cdf_read_summary_info(const cdf_info_t *info, const cdf_header_t *h,
 }
 
 int
-cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
-    cdf_property_info_t **info, size_t *count, size_t *maxcount)
+cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
+    uint32_t offs, cdf_property_info_t **info, size_t *count, size_t *maxcount)
 {
        const cdf_section_header_t *shp;
        cdf_section_header_t sh;
@@ -733,7 +733,7 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
        }
        shp = CAST(const cdf_section_header_t *, (const void *)
            ((const char *)sst->sst_tab + offs));
-       if (cdf_check_stream_offset(sst, shp, sizeof(*shp), __LINE__) == -1)
+       if (cdf_check_stream_offset(sst, h, shp, sizeof(*shp), __LINE__) == -1)
                goto out;
        sh.sh_len = CDF_TOLE4(shp->sh_len);
 #define CDF_SHLEN_LIMIT (UINT32_MAX / 8)
@@ -768,7 +768,7 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
            offs + sizeof(sh)));
        e = CAST(const uint8_t *, (const void *)
            (((const char *)(const void *)shp) + sh.sh_len));
-       if (cdf_check_stream_offset(sst, e, 0, __LINE__) == -1)
+       if (cdf_check_stream_offset(sst, h, e, 0, __LINE__) == -1)
                goto out;
        for (i = 0; i < sh.sh_properties; i++) {
                q = (const uint8_t *)(const void *)
@@ -846,8 +846,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
                        for (j = 0; j < nelements; j++, i++) {
                                uint32_t l = CDF_GETUINT32(q, o);
                                inp[i].pi_str.s_len = l;
-                               inp[i].pi_str.s_buf =
-                                   (const char *)(const void *)(&q[o4 + 1]);
+                               inp[i].pi_str.s_buf = (const char *)
+                                   (const void *)(&q[o4 + sizeof(l)]);
                                DPRINTF(("l = %d, r = %d, s = %s\n", l,
                                    CDF_ROUND(l, sizeof(l)),
                                    inp[i].pi_str.s_buf));
@@ -881,8 +881,8 @@ out:
 }
 
 int
-cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi,
-    cdf_property_info_t **info, size_t *count)
+cdf_unpack_summary_info(const cdf_stream_t *sst, const cdf_header_t *h,
+    cdf_summary_info_header_t *ssi, cdf_property_info_t **info, size_t *count)
 {
        size_t i, maxcount;
        const cdf_summary_info_header_t *si =
@@ -891,8 +891,8 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi,
            CAST(const cdf_section_declaration_t *, (const void *)
            ((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET));
 
-       if (cdf_check_stream_offset(sst, si, sizeof(*si), __LINE__) == -1 ||
-           cdf_check_stream_offset(sst, sd, sizeof(*sd), __LINE__) == -1)
+       if (cdf_check_stream_offset(sst, h, si, sizeof(*si), __LINE__) == -1 ||
+           cdf_check_stream_offset(sst, h, sd, sizeof(*sd), __LINE__) == -1)
                return -1;
        ssi->si_byte_order = CDF_TOLE2(si->si_byte_order);
        ssi->si_os_version = CDF_TOLE2(si->si_os_version);
@@ -909,7 +909,7 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi,
                        errno = EFTYPE;
                        return -1;
                }
-               if (cdf_read_property_info(sst, CDF_TOLE4(sd->sd_offset),
+               if (cdf_read_property_info(sst, h, CDF_TOLE4(sd->sd_offset),
                    info, count, &maxcount) == -1)
                        return -1;
        }
@@ -1106,9 +1106,9 @@ cdf_dump_dir(const cdf_info_t *info, const cdf_header_t *h,
                (void)fprintf(stderr, "Right child: %d\n", d->d_right_child);
                (void)fprintf(stderr, "Flags: 0x%x\n", d->d_flags);
                cdf_timestamp_to_timespec(&ts, d->d_created);
-               (void)fprintf(stderr, "Created %s", ctime(&ts.tv_sec));
+               (void)fprintf(stderr, "Created %s", cdf_ctime(&ts.tv_sec));
                cdf_timestamp_to_timespec(&ts, d->d_modified);
-               (void)fprintf(stderr, "Modified %s", ctime(&ts.tv_sec));
+               (void)fprintf(stderr, "Modified %s", cdf_ctime(&ts.tv_sec));
                (void)fprintf(stderr, "Stream %d\n", d->d_stream_first_sector);
                (void)fprintf(stderr, "Size %d\n", d->d_size);
                switch (d->d_type) {
@@ -1180,7 +1180,7 @@ cdf_dump_property_info(const cdf_property_info_t *info, size_t count)
                        } else {
                                cdf_timestamp_to_timespec(&ts, tp);
                                (void)fprintf(stderr, "timestamp %s",
-                                   ctime(&ts.tv_sec));
+                                   cdf_ctime(&ts.tv_sec));
                        }
                        break;
                case CDF_CLIPBOARD:
index a1b998b..7f3126b 100644 (file)
@@ -291,19 +291,20 @@ int cdf_read_ssat(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
     cdf_sat_t *);
 int cdf_read_short_stream(const cdf_info_t *, const cdf_header_t *,
     const cdf_sat_t *, const cdf_dir_t *, cdf_stream_t *);
-int cdf_read_property_info(const cdf_stream_t *, uint32_t,
+int cdf_read_property_info(const cdf_stream_t *, const cdf_header_t *, uint32_t,
     cdf_property_info_t **, size_t *, size_t *);
 int cdf_read_summary_info(const cdf_info_t *, const cdf_header_t *,
     const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
     const cdf_dir_t *, cdf_stream_t *);
-int cdf_unpack_summary_info(const cdf_stream_t *, cdf_summary_info_header_t *,
-    cdf_property_info_t **, size_t *);
+int cdf_unpack_summary_info(const cdf_stream_t *, const cdf_header_t *,
+    cdf_summary_info_header_t *, cdf_property_info_t **, size_t *);
 int cdf_print_classid(char *, size_t, const cdf_classid_t *);
 int cdf_print_property_name(char *, size_t, uint32_t);
 int cdf_print_elapsed_time(char *, size_t, cdf_timestamp_t);
 uint16_t cdf_tole2(uint16_t);
 uint32_t cdf_tole4(uint32_t);
 uint64_t cdf_tole8(uint64_t);
+char *cdf_ctime(const time_t *);
 
 #ifdef CDF_DEBUG
 void cdf_dump_header(const cdf_header_t *);
index 9d0b1df..ee04fb6 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf_time.c,v 1.9 2010/10/02 15:36:15 christos Exp $")
+FILE_RCSID("@(#)$File: cdf_time.c,v 1.10 2011/02/10 17:03:16 christos Exp $")
 #endif
 
 #include <time.h>
@@ -165,6 +165,18 @@ cdf_timespec_to_timestamp(cdf_timestamp_t *t, const struct timespec *ts)
        return 0;
 }
 
+char *
+cdf_ctime(const time_t *sec)
+{
+       static char ctbuf[26];
+       char *ptr = ctime(sec);
+       if (ptr != NULL)
+               return ptr;
+       (void)snprintf(ctbuf, sizeof(ctbuf), "*Bad* 0x%16.16llx\n",
+           (long long)*sec);
+       return ctbuf;
+}
+
 
 #ifdef TEST
 int
@@ -176,7 +188,7 @@ main(int argc, char *argv[])
        char *p, *q;
 
        cdf_timestamp_to_timespec(&ts, tst);
-       p = ctime(&ts.tv_sec);
+       p = cdf_ctime(&ts.tv_sec);
        if ((q = strchr(p, '\n')) != NULL)
                *q = '\0';
        if (strcmp(ref, p) != 0)
index 9040695..de1ca01 100644 (file)
@@ -35,7 +35,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.65 2010/07/21 16:47:17 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.66 2011/03/08 00:39:47 christos Exp $")
 #endif
 
 #include "magic.h"
@@ -79,6 +79,7 @@ private const struct {
        { "BZh",      3, { "bzip2", "-cd", NULL }, 1 },         /* bzip2-ed */
        { "LZIP",     4, { "lzip", "-cdq", NULL }, 1 },
        { "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 },            /* XZ Utils */
+       { "LRZI",     4, { "lrzip", "-dqo-", NULL }, 1 },       /* LRZIP */
 };
 
 #define NODATA ((size_t)~0)
index 89769f5..2536735 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: file.c,v 1.140 2010/11/30 14:58:53 rrt Exp $")
+FILE_RCSID("@(#)$File: file.c,v 1.143 2011/03/20 20:36:52 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -86,10 +86,6 @@ int getopt_long(int argc, char * const *argv, const char *optstring, const struc
     "       %s -C [-m magicfiles]\n" \
     "       %s [--help]\n"
 
-#ifndef MAXPATHLEN
-#define        MAXPATHLEN      1024
-#endif
-
 private int            /* Global command-line options          */
        bflag = 0,      /* brief output format                  */
        nopad = 0,      /* Don't pad output                     */
@@ -255,9 +251,9 @@ main(int argc, char *argv[])
                case 'v':
                        if (magicfile == NULL)
                                magicfile = magic_getpath(magicfile, action);
-                       (void)fprintf(stderr, "%s-%d.%.2d\n", progname,
+                       (void)fprintf(stdout, "%s-%d.%.2d\n", progname,
                                       FILE_VERSION_MAJOR, patchlevel);
-                       (void)fprintf(stderr, "magic file from %s\n",
+                       (void)fprintf(stdout, "magic file from %s\n",
                                       magicfile);
                        return 1;
                case 'z':
@@ -375,8 +371,10 @@ load(const char *magicfile, int flags)
 private int
 unwrap(struct magic_set *ms, const char *fn)
 {
-       char buf[MAXPATHLEN];
        FILE *f;
+       ssize_t len;
+       char *line = NULL;
+       size_t llen = 0;
        int wid = 0, cwid;
        int e = 0;
 
@@ -390,9 +388,10 @@ unwrap(struct magic_set *ms, const char *fn)
                        return 1;
                }
 
-               while (fgets(buf, sizeof(buf), f) != NULL) {
-                       buf[strcspn(buf, "\n")] = '\0';
-                       cwid = file_mbswidth(buf);
+               while ((len = getline(&line, &llen, f)) > 0) {
+                       if (line[len - 1] == '\n')
+                               line[len - 1] = '\0';
+                       cwid = file_mbswidth(line);
                        if (cwid > wid)
                                wid = cwid;
                }
@@ -400,13 +399,15 @@ unwrap(struct magic_set *ms, const char *fn)
                rewind(f);
        }
 
-       while (fgets(buf, sizeof(buf), f) != NULL) {
-               buf[strcspn(buf, "\n")] = '\0';
-               e |= process(ms, buf, wid);
+       while ((len = getline(&line, &llen, f)) > 0) {
+               if (line[len - 1] == '\n')
+                       line[len - 1] = '\0';
+               e |= process(ms, line, wid);
                if(nobuffer)
                        (void)fflush(stdout);
        }
 
+       free(line);
        (void)fclose(f);
        return e;
 }
@@ -486,13 +487,14 @@ help(void)
        (void)fputs(
 "Usage: file [OPTION...] [FILE...]\n"
 "Determine type of FILEs.\n"
-"\n", stderr);
+"\n", stdout);
 #define OPT(shortname, longname, opt, doc)      \
-       fprintf(stderr, "  -%c, --" longname doc, shortname);
+       fprintf(stdout, "  -%c, --" longname doc, shortname);
 #define OPT_LONGONLY(longname, opt, doc)        \
-       fprintf(stderr, "      --" longname doc);
+       fprintf(stdout, "      --" longname doc);
 #include "file_opts.h"
 #undef OPT
 #undef OPT_LONGONLY
+       fprintf(stdout, "\nReport bugs to http://bugs.gw.com/\n");
        exit(0);
 }
index 9f2b7ff..683dffc 100644 (file)
@@ -27,7 +27,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.130 2011/01/04 19:29:32 rrt Exp $
+ * @(#)$File: file.h,v 1.132 2011/03/20 20:36:52 christos Exp $
  */
 
 #ifndef __file_h__
@@ -386,6 +386,8 @@ protected int file_buffer(struct magic_set *, int, const char *, const void *,
 protected int file_fsmagic(struct magic_set *, const char *, struct stat *);
 protected int file_pipe2file(struct magic_set *, int, const void *, size_t);
 protected int file_vprintf(struct magic_set *, const char *, va_list);
+protected size_t file_printedlen(const struct magic_set *);
+protected int file_replace(struct magic_set *, const char *, const char *);
 protected int file_printf(struct magic_set *, const char *, ...)
     __attribute__((__format__(__printf__, 2, 3)));
 protected int file_reset(struct magic_set *);
@@ -464,6 +466,10 @@ size_t strlcpy(char *dst, const char *src, size_t siz);
 #ifndef HAVE_STRLCAT
 size_t strlcat(char *dst, const char *src, size_t siz);
 #endif
+#ifndef HAVE_GETLINE
+ssize_t getline(char **dst, size_t *len, FILE *fp);
+ssize_t getdelim(char **dst, size_t *len, int delimiter, FILE *fp);
+#endif
 
 #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
 #define QUICK
index e23a72a..0e7ff95 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.55 2010/07/21 16:47:17 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.56 2011/02/03 01:43:33 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -425,3 +425,36 @@ file_check_mem(struct magic_set *ms, unsigned int level)
 #endif /* ENABLE_CONDITIONALS */
        return 0;
 }
+
+protected size_t
+file_printedlen(const struct magic_set *ms)
+{
+       return ms->o.buf == NULL ? 0 : strlen(ms->o.buf);
+}
+
+protected int
+file_replace(struct magic_set *ms, const char *pat, const char *rep)
+{
+       regex_t rx;
+       int rc;
+
+       rc = regcomp(&rx, pat, REG_EXTENDED);
+       if (rc) {
+               char errmsg[512];
+               (void)regerror(rc, &rx, errmsg, sizeof(errmsg));
+               file_magerror(ms, "regex error %d, (%s)", rc, errmsg);
+               return -1;
+       } else {
+               regmatch_t rm;
+               int nm = 0;
+               while (regexec(&rx, ms->o.buf, 1, &rm, 0) == 0) {
+                       ms->o.buf[rm.rm_so] = '\0';
+                       if (file_printf(ms, "%s%s", rep,
+                           rm.rm_eo != 0 ? ms->o.buf + rm.rm_eo : "") == -1)
+                               return -1;
+                       nm++;
+               }
+               regfree(&rx);
+               return nm;
+       }
+}
index bcb7000..06d1239 100644 (file)
@@ -33,7 +33,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: magic.c,v 1.69 2010/09/20 14:14:49 christos Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.72 2011/03/20 20:36:52 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -108,49 +108,82 @@ private const char *
 get_default_magic(void)
 {
        static const char hmagic[] = "/.magic/magic.mgc";
-       static char default_magic[2 * MAXPATHLEN + 2];
-       char *home;
-       char hmagicpath[MAXPATHLEN + 1] = { 0 };
+       static char *default_magic;
+       char *home, *hmagicpath;
 
 #ifndef WIN32
+       struct stat st;
+
+       if (default_magic) {
+               free(default_magic);
+               default_magic = NULL;
+       }
        if ((home = getenv("HOME")) == NULL)
                return MAGIC;
 
-       (void)snprintf(hmagicpath, sizeof(hmagicpath), "%s%s", home, hmagic);
-
-       if (access(hmagicpath, R_OK) == -1)
+       if (asprintf(&hmagicpath, "%s/.magic", home) < 0)
                return MAGIC;
+       if (stat(hmagicpath, &st) == -1)
+               goto out;
+       if (S_ISDIR(st.st_mode)) {
+               free(hmagicpath);
+               if (asprintf(&hmagicpath, "%s/%s", home, hmagic) < 0)
+                       return MAGIC;
+               if (access(hmagicpath, R_OK) == -1)
+                       goto out;
+       }
 
-       (void)snprintf(default_magic, sizeof(default_magic), "%s:%s",
-           hmagicpath, MAGIC);
+       if (asprintf(&default_magic, "%s:%s", hmagicpath, MAGIC) < 0)
+               goto out;
+       free(hmagicpath);
+       return default_magic;
+out:
+       default_magic = NULL;
+       free(hmagicpath);
+       return MAGIC;
 #else
        char *hmagicp = hmagicpath;
-       char tmppath[MAXPATHLEN + 1] = { 0 };
-       char *hmagicend = &hmagicpath[sizeof(hmagicpath) - 1];
-       static const char pathsep[] = { PATHSEP, '\0' };
+       char *tmppath = NULL;
 
 #define APPENDPATH() \
-       if (access(tmppath, R_OK) != -1)
-               hmagicp += snprintf(hmagicp, hmagicend - hmagicp, \
-                   "%s%s", hmagicp == hmagicpath ? "" : pathsep, tmppath)
+       do { \
+               if (tmppath && access(tmppath, R_OK) != -1) { \
+                       if (hmagicpath == NULL) { \
+                               hmagicpath = tmppath; \
+                               tmppath = NULL; \
+                       } else { \
+                               free(tmppath); \
+                               if (asprintf(&hmagicp, "%s%c%s", hmagicpath, \
+                                   PATHSEP, tmppath) >= 0) { \
+                                       free(hmagicpath); \
+                                       hmagicpath = hmagicp; \
+                               } \
+                       } \
+       } while (/*CONSTCOND*/0)
+                               
+       if (default_magic) {
+               free(default_magic);
+               default_magic = NULL;
+       }
+
        /* First, try to get user-specific magic file */
        if ((home = getenv("LOCALAPPDATA")) == NULL) {
                if ((home = getenv("USERPROFILE")) != NULL)
-                       (void)snprintf(tmppath, sizeof(tmppath),
+                       if (asprintf(&tmppath,
                            "%s/Local Settings/Application Data%s", home,
-                           hmagic);
+                           hmagic) < 0)
+                               tmppath = NULL;
        } else {
-               (void)snprintf(tmppath, sizeof(tmppath), "%s%s",
-                   home, hmagic);
-       }
-       if (tmppath[0] != '\0') {
-               APPENDPATH();
+               if (asprintf(&tmppath, "%s%s", home, hmagic) < 0)
+                       tmppath = NULL;
        }
 
+       APPENDPATH();
+
        /* Second, try to get a magic file from Common Files */
        if ((home = getenv("COMMONPROGRAMFILES")) != NULL) {
-               (void)snprintf(tmppath, sizeof(tmppath), "%s%s", home, hmagic);
-               APPENDPATH();
+               if (asprintf(&tmppath, "%s%s", home, hmagic) >= 0)
+                       APPENDPATH();
        }
 
 
@@ -158,27 +191,24 @@ get_default_magic(void)
        if (dllpath[0] != 0) {
                if (strlen(dllpath) > 3 &&
                    stricmp(&dllpath[strlen(dllpath) - 3], "bin") == 0) {
-                       (void)snprintf(tmppath, sizeof(tmppath),
-                           "%s/../share/misc/magic.mgc", dllpath);
-                       APPENDPATH();
+                       if (asprintf(&tmppath,
+                           "%s/../share/misc/magic.mgc", dllpath) >= 0)
+                               APPENDPATH();
                } else {
-                       (void)snprintf(tmppath, sizeof(tmppath),
-                           "%s/share/misc/magic.mgc", dllpath);
-                       APPENDPATH()
-                       else {
-                               (void)snprintf(tmppath, sizeof(tmppath),
-                                   "%s/magic.mgc", dllpath);
+                       if (asprintf(&tmppath,
+                           "%s/share/misc/magic.mgc", dllpath) >= 0)
+                               APPENDPATH();
+                       else if (asprintf(&tmppath,
+                           "%s/magic.mgc", dllpath) >= 0)
                                APPENDPATH();
-                       }
                }
        }
 
        /* Don't put MAGIC constant - it likely points to a file within MSys
        tree */
-       (void)strlcpy(default_magic, hmagicpath, sizeof(default_magic));
-#endif
-
+       default_magic = hmagicpath;
        return default_magic;
+#endif
 }
 
 public const char *
index b69276a..eb5d71e 100644 (file)
@@ -26,7 +26,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readcdf.c,v 1.23 2010/02/20 15:19:53 rrt Exp $")
+FILE_RCSID("@(#)$File: readcdf.c,v 1.25 2011/02/10 21:35:05 christos Exp $")
 #endif
 
 #include <stdlib.h>
@@ -125,7 +125,7 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
                                 } else {
                                         char *c, *ec;
                                         cdf_timestamp_to_timespec(&ts, tp);
-                                        c = ctime(&ts.tv_sec);
+                                        c = cdf_ctime(&ts.tv_sec);
                                         if ((ec = strchr(c, '\n')) != NULL)
                                                 *ec = '\0';
 
@@ -149,14 +149,15 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
 }
 
 private int
-cdf_file_summary_info(struct magic_set *ms, const cdf_stream_t *sst)
+cdf_file_summary_info(struct magic_set *ms, const cdf_header_t *h,
+    const cdf_stream_t *sst)
 {
         cdf_summary_info_header_t si;
         cdf_property_info_t *info;
         size_t count;
         int m;
 
-        if (cdf_unpack_summary_info(sst, &si, &info, &count) == -1)
+        if (cdf_unpack_summary_info(sst, h, &si, &info, &count) == -1)
                 return -1;
 
         if (NOTMIME(ms)) {
@@ -260,7 +261,7 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf,
 #ifdef CDF_DEBUG
         cdf_dump_summary_info(&h, &scn);
 #endif
-        if ((i = cdf_file_summary_info(ms, &scn)) == -1)
+        if ((i = cdf_file_summary_info(ms, &h, &scn)) == -1)
                 expn = "Can't expand summary_info";
         free(scn.sst_tab);
 out4: