Import file-5.09.
authorPeter Avalos <pavalos@dragonflybsd.org>
Wed, 21 Sep 2011 02:25:31 +0000 (19:25 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Wed, 21 Sep 2011 02:25:31 +0000 (19:25 -0700)
* Don't wait for any subprocess, just the one we forked.
* If the application name is not set in a cdf file, try to see
  if it has a directory with the application name on it.
* Fix ELF lseek(2) madness. Inspired by PR/134 by Jan Kaluza
* Don't use variable string formats.
* Fix detection of Zip files (Mantis #128).
* Make some minor improvements to file(1).
* Rename MIME types for filesystem objects for consistency with
  xdg-utils. Typically this means that application/x-foo becomes
  inode/foo, but some names also change slightly, e.g.
  application/x-character-device becomes inode/chardevice.

33 files changed:
contrib/file/ChangeLog
contrib/file/doc/file.man
contrib/file/doc/libmagic.man
contrib/file/doc/magic.man
contrib/file/magic/Magdir/animation
contrib/file/magic/Magdir/archive
contrib/file/magic/Magdir/audio
contrib/file/magic/Magdir/database
contrib/file/magic/Magdir/fusecompress [new file with mode: 0644]
contrib/file/magic/Magdir/iff
contrib/file/magic/Magdir/macintosh
contrib/file/magic/Magdir/marc21 [new file with mode: 0644]
contrib/file/magic/Magdir/msdos
contrib/file/magic/Magdir/os9
contrib/file/magic/Magdir/printer
contrib/file/magic/Magdir/riff
contrib/file/magic/Magdir/rpm
contrib/file/magic/Magdir/smile [new file with mode: 0644]
contrib/file/magic/Magdir/sniffer
contrib/file/magic/Magdir/xdelta
contrib/file/src/apprentice.c
contrib/file/src/apptype.c
contrib/file/src/cdf.c
contrib/file/src/compress.c
contrib/file/src/elfclass.h
contrib/file/src/file.h
contrib/file/src/fsmagic.c
contrib/file/src/magic.c
contrib/file/src/print.c
contrib/file/src/readcdf.c
contrib/file/src/readelf.c
contrib/file/src/readelf.h
contrib/file/src/softmagic.c

index 5fcd1fa..2755469 100644 (file)
@@ -1,3 +1,33 @@
+2011-09-01  12:12  Christos Zoulas <christos@zoulas.com>
+
+       * Don't wait for any subprocess, just the one we forked.
+
+2011-08-26  16:40  Christos Zoulas <christos@zoulas.com>
+
+       * If the application name is not set in a cdf file, try to see
+         if it has a directory with the application name on it.
+
+2011-08-17  14:32  Christos Zoulas <christos@zoulas.com>
+
+       * Fix ELF lseek(2) madness. Inspired by PR/134 by Jan Kaluza
+
+2011-08-14  09:03  Christos Zoulas <christos@zoulas.com>
+
+       * Don't use variable string formats.
+
+2011-07-12  12:32  Reuben Thomas <rrt@sc3d.org>
+
+       * Fix detection of Zip files (Mantis #128).
+       * Make some minor improvements to file(1).
+       * Rename MIME types for filesystem objects for consistency with
+         xdg-utils. Typically this means that application/x-foo becomes
+         inode/foo, but some names also change slightly, e.g.
+         application/x-character-device becomes inode/chardevice.
+
+2011-05-10  20:57  Christos Zoulas <christos@zoulas.com>
+
+       * fix mingw compilation (Abradoks)
+
 2011-05-10  20:57  Christos Zoulas <christos@zoulas.com>
 
        * remove patchlevel.h
index 6a17b97..5b22438 100644 (file)
@@ -1,4 +1,4 @@
-.\" $File: file.man,v 1.94 2011/04/20 19:08:44 christos Exp $
+.\" $File: file.man,v 1.96 2011/07/12 11:23:38 rrt Exp $
 .Dd April 20, 2011
 .Dt FILE __CSECTION__
 .Os
@@ -9,20 +9,20 @@
 .Nm
 .Bk -words
 .Op Fl bchiklLNnprsvz0
-.Op Fl -apple
-.Op Fl -mime-encoding
-.Op Fl -mime-type
+.Op Fl Fl apple
+.Op Fl Fl mime-encoding
+.Op Fl Fl mime-type
 .Op Fl e Ar testname
 .Op Fl F Ar separator
 .Op Fl f Ar namefile
 .Op Fl m Ar magicfiles
 .Ar
-.Ek -words
+.Ek
 .Nm
 .Fl C
 .Op Fl m Ar magicfiles
 .Nm
-.Op Fl -help
+.Op Fl Fl help
 .Sh DESCRIPTION
 This manual page documents version __VERSION__ of the
 .Nm
@@ -46,12 +46,12 @@ terminal),
 .Em executable
 (the file contains the result of compiling a program
 in a form understandable to some
-.Dv UNIX
+.Tn UNIX
 kernel or another),
 or
 .Em data
 meaning anything else (data is usually
-.Sq binary
+.Dq binary
 or non-printable).
 Exceptions are well-known file formats (core files, tar archives)
 that are known to contain binary data.
@@ -59,12 +59,12 @@ When modifying magic files or the program itself, make sure to
 .Em "preserve these keywords" .
 Users depend on knowing that all the readable files in a directory
 have the word
-.Sq text
+.Dq text
 printed.
 Don't do as Berkeley did and change
-.Sq shell commands text
+.Dq shell commands text
 to
-.Sq shell script .
+.Dq shell script .
 .Pp
 The filesystem tests are based on examining the return from a
 .Xr stat 2
@@ -74,8 +74,7 @@ or if it's some sort of special file.
 Any known file types appropriate to the system you are running on
 (sockets, symbolic links, or named pipes (FIFOs) on those systems that
 implement them)
-are intuited if they are defined in
-the system header file
+are intuited if they are defined in the system header file
 .In sys/stat.h .
 .Pp
 The magic tests are used to check for files with data in
@@ -89,13 +88,14 @@ and possibly
 .In exec.h
 in the standard include directory.
 These files have a
-.Sq "magic number"
+.Dq "magic number"
 stored in a particular place
 near the beginning of the file that tells the
-.Dv UNIX operating system
+.Tn UNIX
+operating system
 that the file is a binary executable, and which of several types thereof.
 The concept of a
-.Sq "magic"
+.Dq "magic"
 has been applied by extension to data files.
 Any file with some invariant identifier at a small fixed
 offset into the file can usually be described in this way.
@@ -122,10 +122,10 @@ in each set.
 If a file passes any of these tests, its character set is reported.
 ASCII, ISO-8859-x, UTF-8, and extended-ASCII files are identified
 as
-.Sq text
+.Dq text
 because they will be mostly readable on nearly any terminal;
 UTF-16 and EBCDIC are only
-.Sq character data
+.Dq character data
 because, while
 they contain text, it is text that will require translation
 before it can be read.
@@ -143,8 +143,8 @@ has determined the character set used in a text-type file,
 it will
 attempt to determine in what language the file is written.
 The language tests look for particular strings (cf.
-.In names.h
-that can appear anywhere in the first few blocks of a file.
+.In names.h )
+that can appear anywhere in the first few blocks of a file.
 For example, the keyword
 .Em .br
 indicates that the file is most likely a
@@ -161,21 +161,21 @@ archives).
 .Pp
 Any file that cannot be identified as having been written
 in any of the character sets listed above is simply said to be
-.Sq data .
+.Dq data .
 .Sh OPTIONS
 .Bl -tag -width indent
-.It Fl b , -brief
+.It Fl b , Fl Fl brief
 Do not prepend filenames to output lines (brief mode).
-.It Fl C , -compile
+.It Fl C , Fl Fl compile
 Write a
 .Pa magic.mgc
 output file that contains a pre-parsed version of the magic file or directory.
-.It Fl c , -checking-printout
+.It Fl c , Fl Fl checking-printout
 Cause a checking printout of the parsed form of the magic file.
 This is usually used in conjunction with the
 .Fl m
 flag to debug a new magic file before installing it.
-.It Fl e , -exclude Ar testname
+.It Fl e , Fl Fl exclude Ar testname
 Exclude the test named in
 .Ar testname
 from the list of tests made to determine the file type.
@@ -185,7 +185,8 @@ Valid test names are:
 .Dv EMX
 application type (only on EMX).
 .It ascii
-Various types of text files (this test will try to guess the text encoding, irrespective of the setting of the
+Various types of text files (this test will try to guess the text
+encoding, irrespective of the setting of the
 .Sq encoding
 option).
 .It encoding
@@ -203,12 +204,12 @@ Consults magic files.
 .It tar
 Examines tar files.
 .El
-.It Fl F , -separator Ar separator
+.It Fl F , Fl Fl separator Ar separator
 Use the specified string as the separator between the filename and the
 file result returned.
 Defaults to
 .Sq \&: .
-.It Fl f , -files-from Ar namefile
+.It Fl f , Fl Fl files-from Ar namefile
 Read the names of the files to be examined from
 .Ar namefile
 (one per line)
@@ -219,73 +220,68 @@ or at least one filename argument must be present;
 to test the standard input, use
 .Sq -
 as a filename argument.
-.It Fl h , -no-dereference
+.It Fl h , Fl Fl no-dereference
 option causes symlinks not to be followed
 (on systems that support symbolic links).
 This is the default if the environment variable
 .Dv POSIXLY_CORRECT
 is not defined.
-.It Fl i , -mime
+.It Fl i , Fl Fl mime
 Causes the file command to output mime type strings rather than the more
 traditional human readable ones.
 Thus it may say
 .Sq text/plain; charset=us-ascii
 rather than
-.Sq 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
-text file types, directories etc), and makes use of an alternative
-.Sq magic
-file.
-(See the FILES section, below).
-.It Fl -mime-type , -mime-encoding
+.Dq ASCII text .
+.It Fl Fl mime-type , Fl Fl mime-encoding
 Like
 .Fl i ,
 but print only the specified element(s).
-.It Fl k , -keep-going
+.It Fl k , Fl Fl keep-going
 Don't stop at the first match, keep going.
 Subsequent matches will be
 have the string
 .Sq "\[rs]012\- "
 prepended.
 (If you want a newline, see the
-.Sq "\-r"
+.Fl r
 option.)
-.It Fl l , -list
+.It Fl l , Fl Fl list
 Print information about the strength of each magic pattern.
-.It Fl L , -dereference
+.It Fl L , Fl Fl dereference
 option causes symlinks to be followed, as the like-named option in
 .Xr ls 1
 (on systems that support symbolic links).
 This is the default if the environment variable
-.Dv POSIXLY_CORRECT
+.Ev POSIXLY_CORRECT
 is defined.
 .It Fl l
 Shows sorted patterns list in the order which is used for the matching.
-.It Fl m , -magic-file Ar magicfiles
+.It Fl m , Fl Fl magic-file Ar magicfiles
 Specify an alternate list of files and directories containing magic.
 This can be a single item, or a colon-separated list.
-If a compiled magic file is found alongside a file or directory, it will be used instead.
-.It Fl N , -no-pad
+If a compiled magic file is found alongside a file or directory,
+it will be used instead.
+.It Fl N , Fl Fl no-pad
 Don't pad filenames so that they align in the output.
-.It Fl n , -no-buffer
+.It Fl n , Fl Fl no-buffer
 Force stdout to be flushed after checking each file.
 This is only useful if checking a list of files.
 It is intended to be used by programs that want filetype output from a pipe.
-.It Fl p , -preserve-date
+.It Fl p , Fl Fl preserve-date
 On systems that support
-.Xr utime 2
+.Xr utime 3
 or
 .Xr utimes 2 ,
 attempt to preserve the access time of files analyzed, to pretend that
 .Nm
 never read them.
-.It Fl r , -raw
+.It Fl r , Fl Fl raw
 Don't translate unprintable characters to \eooo.
 Normally
 .Nm
 translates unprintable characters to their octal representation.
-.It Fl s , -special-files
+.It Fl s , Fl Fl special-files
 Normally,
 .Nm
 only attempts to read and determine the type of argument files which
@@ -305,11 +301,11 @@ This option also causes
 to disregard the file size as reported by
 .Xr stat 2
 since on some systems it reports a zero size for raw disk partitions.
-.It Fl v , -version
+.It Fl v , Fl Fl version
 Print the version of the program and exit.
-.It Fl z , -uncompress
+.It Fl z , Fl Fl uncompress
 Try to look inside compressed files.
-.It Fl 0 , -print0
+.It Fl 0 , Fl Fl print0
 Output a null character
 .Sq \e0
 after the end of the filename.
@@ -329,7 +325,7 @@ Directory containing default magic files.
 .El
 .Sh ENVIRONMENT
 The environment variable
-.Dv MAGIC
+.Ev MAGIC
 can be used to set the default magic file name.
 If that variable is set, then
 .Nm
@@ -337,7 +333,7 @@ will not attempt to open
 .Pa $HOME/.magic .
 .Nm
 adds
-.Sq .mgc
+.Dq Pa .mgc
 to the value of this variable as appropriate.
 However,
 .Pa file
@@ -345,7 +341,7 @@ has to exist in order for
 .Pa file.mime
 to be considered.
 The environment variable
-.Dv POSIXLY_CORRECT
+.Ev POSIXLY_CORRECT
 controls (on systems that support symbolic links), whether
 .Nm
 will attempt to follow symlinks or not.
@@ -359,10 +355,9 @@ and
 options.
 .Sh SEE ALSO
 .Xr magic __FSECTION__ ,
-.Xr strings 1 ,
-.Xr od 1 ,
 .Xr hexdump 1 ,
-.Xr file 1posix
+.Xr od 1 ,
+.Xr strings 1 ,
 .Sh STANDARDS CONFORMANCE
 This program is believed to exceed the System V Interface Definition
 of FILE(CMD), as near as one can determine from the vague language
@@ -378,12 +373,12 @@ 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)
+\*[Gt]10       string  language impress\       (imPRESS data)
 .Ed
 .Pp
 in an existing magic file would have to be changed to
 .Bd -literal -offset indent
->10    string  language\e impress      (imPRESS data)
+\*[Gt]10       string  language\e impress      (imPRESS data)
 .Ed
 .Pp
 In addition, in this version, if a pattern string contains a backslash,
@@ -401,13 +396,13 @@ in an existing magic file would have to be changed to
 SunOS releases 3.2 and later from Sun Microsystems include a
 .Nm
 command derived from the System V one, but with some extensions.
-My version differs from Sun's only in minor ways.
+This version differs from Sun's only in minor ways.
 It includes the extension of the
-.Sq &
+.Sq \*[Am]
 operator, used as,
 for example,
 .Bd -literal -offset indent
->16    long&0x7fffffff >0              not stripped
+\*[Gt]16       long\*[Am]0x7fffffff    \*[Gt]0         not stripped
 .Ed
 .Sh MAGIC DIRECTORY
 The magic file entries have been collected from various sources,
@@ -425,7 +420,7 @@ If your old
 command uses a magic file,
 keep the old magic file around for comparison purposes
 (rename it to
-.Pa __MAGIC__.orig ).
+.Pa __MAGIC__.orig ) .
 .Sh EXAMPLES
 .Bd -literal -offset indent
 $ file file.c file /dev/{wd0a,hda}
@@ -478,13 +473,16 @@ 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
+Contributions by the
+.Sq \*[Am]
+operator by Rob McMahon, 
 .Aq cudcv@warwick.ac.uk ,
 1989.
 .Pp
-Guy Harris
-.Aq guy@netapp.com
+Guy Harris
+.Aq guy@netapp.com ,
 made many changes from 1993 to the present.
+1989.
 .Pp
 Primary development and maintenance from 1990 to the present by
 Christos Zoulas
@@ -498,8 +496,9 @@ option to output mime type strings, using an alternative
 magic file and internal logic.
 .Pp
 Altered by Eric Fischer
-.Aq enf@pobox.com
-July, 2000, to identify character codes and attempt to identify the languages
+.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
@@ -521,9 +520,9 @@ Covered by the standard Berkeley Software Distribution copyright; see the file
 COPYING in the source distribution.
 .Pp
 The files
-.Dv tar.h
+.Pa tar.h
 and
-.Dv is_tar.c
+.Pa is_tar.c
 were written by John Gilmore from his public-domain
 .Xr tar 1
 program, and are not covered by the above license.
@@ -557,12 +556,10 @@ Make file -ki work, i.e. give multiple MIME types.
 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
-from
-.Dv ftp.astron.com
+on
+.Pa ftp.astron.com
 in the directory
-.Dv /pub/file/file-X.YZ.tar.gz
+.Pa /pub/file/file-X.YZ.tar.gz .
index 32daf33..2f218db 100644 (file)
@@ -1,4 +1,4 @@
-.\" $File: libmagic.man,v 1.23 2011/01/14 21:59:17 rrt Exp $
+.\" $File: libmagic.man,v 1.24 2011/05/13 22:11:44 christos Exp $
 .\"
 .\" Copyright (c) Christos Zoulas 2003.
 .\" All Rights Reserved.
@@ -38,7 +38,7 @@
 .Nm magic_check ,
 .Nm magic_compile ,
 .Nm magic_load
-.Nd Magic number recognition library.
+.Nd Magic number recognition library
 .Sh LIBRARY
 .Lb libmagic
 .Sh SYNOPSIS
 .Ft const char *
 .Fn magic_file "magic_t cookie, const char *filename"
 .Ft const char *
-.Fn magic_buffer "magic_t cookie, const void *buffer, size_t length"
+.Fn magic_buffer "magic_t cookie" "const void *buffer" "size_t length"
 .Ft int
-.Fn magic_setflags "magic_t cookieint flags"
+.Fn magic_setflags "magic_t cookie" "int flags"
 .Ft int
-.Fn magic_check "magic_t cookieconst char *filename"
+.Fn magic_check "magic_t cookie" "const char *filename"
 .Ft int
-.Fn magic_compile "magic_t cookieconst char *filename"
+.Fn magic_compile "magic_t cookie" "const char *filename"
 .Ft int
-.Fn magic_load "magic_t cookieconst char *filename"
+.Fn magic_load "magic_t cookie" "const char *filename"
 .Sh DESCRIPTION
 These functions
 operate on the magic database file
@@ -74,8 +74,11 @@ in
 .Pp
 The function
 .Fn magic_open
-creates a magic cookie pointer and returns it. It returns NULL if
-there was an error allocating the magic cookie. The
+creates a magic cookie pointer and returns it.
+It returns
+.Dv NULL
+if there was an error allocating the magic cookie.
+The
 .Ar flags
 argument specifies how the other magic functions should behave:
 .Bl -tag -width MAGIC_COMPRESS
@@ -102,7 +105,7 @@ Return all matches, not just the first.
 Check the magic database for consistency and print warnings to stderr.
 .It Dv MAGIC_PRESERVE_ATIME
 On systems that support
-.Xr utime 2
+.Xr utime 3
 or
 .Xr utimes 2 ,
 attempt to preserve the access time of files analysed.
@@ -143,8 +146,9 @@ database and deallocates any resources used.
 .Pp
 The
 .Fn magic_error
-function returns a textual explanation of the last error, or NULL if there was
-no error.
+function returns a textual explanation of the last error, or
+.Dv NULL
+if there was no error.
 .Pp
 The
 .Fn magic_errno
@@ -156,16 +160,22 @@ The
 .Fn magic_file
 function returns a textual description of the contents of the
 .Ar filename
-argument, or NULL if an error occurred.
+argument, or
+.Dv NULL
+if an error occurred.
 If the
 .Ar filename
-is NULL, then stdin is used.
+is
+.Dv NULL ,
+then stdin is used.
 .Pp
 The
 .Fn magic_descriptor
 function returns a textual description of the contents of the
 .Ar fd
-argument, or NULL if an error occurred.
+argument, or
+.Dv NULL
+if an error occurred.
 .Pp
 The
 .Fn magic_buffer
@@ -179,7 +189,8 @@ The
 .Fn magic_setflags
 function sets the
 .Ar flags
-described above. Note that using both MIME flags together can also
+described above.
+Note that using both MIME flags together can also
 return extra information on the charset.
 .Pp
 The
@@ -187,16 +198,21 @@ The
 function can be used to check the validity of entries in the colon
 separated database files passed in as
 .Ar filename ,
-or NULL for the default database. It returns 0 on success and -1 on
-failure.
+or
+.Dv NULL
+for the default database.
+It returns 0 on success and \-1 on failure.
 .Pp
 The
 .Fn magic_compile
 function can be used to compile the the colon
 separated list of database files passed in as
 .Ar filename ,
-or NULL for the default database. It returns 0 on success and -1 on
-failure. The compiled files created are named from the
+or
+.Dv NULL
+for the default database.
+It returns 0 on success and \-1 on failure.
+The compiled files created are named from the
 .Xr basename 1
 of each file argument with
 .Dq .mgc
@@ -207,11 +223,12 @@ The
 function must be used to load the the colon
 separated list of database files passed in as
 .Ar filename ,
-or NULL for the default database file
-before any magic queries can performed.
+or
+.Dv NULL
+for the default database file before any magic queries can performed.
 .Pp
-The default database file is named by the MAGIC environment variable.  If
-that variable is not set, the default database file name is __MAGIC__.
+The default database file is named by the MAGIC environment variable.
+If that variable is not set, the default database file name is __MAGIC__.
 .Fn magic_load
 adds
 .Dq .mgc
@@ -219,27 +236,35 @@ to the database filename as appropriate.
 .Sh RETURN VALUES
 The function
 .Fn magic_open
-returns a magic cookie on success and NULL on failure setting errno to
-an appropriate value. It will set errno to EINVAL if an unsupported
-value for flags was given.
+returns a magic cookie on success and
+.Dv NULL
+on failure setting errno to an appropriate value.
+It will set errno to
+.Er EINVAL
+if an unsupported value for flags was given.
 The
 .Fn magic_load ,
 .Fn magic_compile ,
 and
 .Fn magic_check
-functions return 0 on success and -1 on failure.
+functions return 0 on success and \-1 on failure.
 The
 .Fn magic_file ,
 and
 .Fn magic_buffer
-functions return a string on success and NULL on failure. The
+functions return a string on success and
+.Dv NULL
+on failure.
+The
 .Fn magic_error
 function returns a textual description of the errors of the above
-functions, or NULL if there was no error.
+functions, or
+.Dv NULL
+if there was no error.
 Finally,
 .Fn magic_setflags
-returns -1 on systems that don't support
-.Xr utime 2 ,
+returns \-1 on systems that don't support
+.Xr utime 3 ,
 or
 .Xr utimes 2
 when
@@ -256,7 +281,7 @@ The compiled default magic database.
 .Xr file __CSECTION__ ,
 .Xr magic __FSECTION__
 .Sh AUTHORS
-Måns Rullgård Initial libmagic implementation,
-and configuration.
-.br
-Christos Zoulas API cleanup, error code and allocation handling.
+.An M\(oans Rullg\(oard
+Initial libmagic implementation, and configuration.
+.An Christos Zoulas
+API cleanup, error code and allocation handling.
index 1033d53..c648ba7 100644 (file)
@@ -1,4 +1,4 @@
-.\" $File: magic.man,v 1.68 2011/04/20 19:08:44 christos Exp $
+.\" $File: magic.man,v 1.69 2011/05/13 22:11:44 christos Exp $
 .Dd April 20, 2011
 .Dt MAGIC __FSECTION__
 .Os
@@ -190,11 +190,12 @@ than UTC.
 Starting at the given offset, consult the magic database again.
 .It Dv regex
 A regular expression match in extended POSIX regular expression syntax
-(like egrep). Regular expressions can take exponential time to
-process, and their performance is hard to predict, so their use is
-discouraged. When used in production environments, their performance
-should be carefully checked. The type specification can be optionally
-followed by
+(like egrep).
+Regular expressions can take exponential time to process, and their
+performance is hard to predict, so their use is discouraged.
+When used in production environments, their performance
+should be carefully checked.
+The type specification can be optionally followed by
 .Dv /[c][s] .
 The
 .Dq c
@@ -213,15 +214,17 @@ and
 match the beginning and end of individual lines, respectively,
 not beginning and end of file.
 .It Dv search
-A literal string search starting at the given offset. The same
-modifier flags can be used as for string patterns. The modifier flags
-(if any) must be followed by
+A literal string search starting at the given offset.
+The same modifier flags can be used as for string patterns.
+The modifier flags (if any) must be followed by
 .Dv /number
 the range, that is, the number of positions at which the match will be
-attempted, starting from the start offset. This is suitable for
+attempted, starting from the start offset.
+This is suitable for
 searching larger binary expressions with variable offsets, using
 .Dv \e
-escapes for special characters. The offset works as for regex.
+escapes for special characters.
+The offset works as for regex.
 .It Dv default
 This is intended to be used with the test
 .Em x
@@ -230,14 +233,18 @@ no other matches.
 .El
 .Pp
 Each top-level magic pattern (see below for an explanation of levels)
-is classified as text or binary according to the types used. Types
+is classified as text or binary according to the types used.
+Types
 .Dq regex
 and
 .Dq search
 are classified as text tests, unless non-printable characters are used
-in the pattern. All other tests are classified as binary. A top-level
+in the pattern.
+All other tests are classified as binary.
+A top-level
 pattern is considered to be a test text when all its patterns are text
-patterns; otherwise, it is considered to be a binary pattern. When
+patterns; otherwise, it is considered to be a binary pattern.
+When
 matching a file, binary patterns are tried first; if no match is
 found, and the file looks like text, then its encoding is determined
 and the text patterns are tried.
index e583696..c09a26a 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: animation,v 1.44 2010/11/25 15:00:12 christos Exp $
+# $File: animation,v 1.45 2011/09/06 11:00:06 christos Exp $
 # animation:  file(1) magic for animation/movie formats
 #
 # animation formats
 # URL: http://wiki.multimedia.cx/index.php?title=NUT
 # From:        Adam Buchbinder <adam.buchbinder@gmail.com>
 0      string  nut/multimedia\ container\0     NUT multimedia container
+
+# Type: Nullsoft Video (NSV)
+# URL:  http://wiki.multimedia.cx/index.php?title=Nullsoft_Video
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  NSVf    Nullsoft Video
+
+# Type: REDCode Video
+# URL:  http://www.red.com/ ; http://wiki.multimedia.cx/index.php?title=REDCode
+# From: Mike Melanson <mike@multimedia.cx>
+4      string  RED1    REDCode Video
+
+# Type: MTV Multimedia File
+# URL:  http://wiki.multimedia.cx/index.php?title=MTV
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  AMVS    MTV Multimedia File
+
+# Type: ARMovie
+# URL:  http://wiki.multimedia.cx/index.php?title=ARMovie
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  ARMovie\012     ARMovie
+
+# Type: Interplay MVE Movie
+# URL:  http://wiki.multimedia.cx/index.php?title=Interplay_MVE
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  Interplay\040MVE\040File\032    Interplay MVE Movie
+
+# Type: Windows Television DVR File
+# URL:  http://wiki.multimedia.cx/index.php?title=WTV
+# From: Mike Melanson <mike@mutlimedia.cx>
+# This takes the form of a Windows-style GUID
+0      bequad  0xB7D800203749DA11
+>8     bequad  0xA64E0007E95EAD8D      Windows Television DVR Media
+
+# Type: Sega FILM/CPK Multimedia
+# URL:  http://wiki.multimedia.cx/index.php?title=Sega_FILM
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  FILM    Sega FILM/CPK Multimedia,
+>32    belong  x       %d x
+>28    belong  x       %d
+
+# Type: Nintendo THP Multimedia
+# URL:  http://wiki.multimedia.cx/index.php?title=THP
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  THP\0   Nintendo THP Multimedia
+
+# Type: BBC Dirac Video
+# URL:  http://wiki.multimedia.cx/index.php?title=Dirac
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  BBCD    BBC Dirac Video
+
+# Type: RAD Game Tools Smacker Multimedia
+# URL:  http://wiki.multimedia.cx/index.php?title=Smacker
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  SMK     RAD Game Tools Smacker Multimedia
+>3     byte    x       version %c,
+>4     lelong  x       %d x
+>8     lelong  x       %d,
+>12    lelong  x       %d frames
index a66f2ac..45ccfd7 100644 (file)
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------
-# $File: archive,v 1.63 2011/04/23 15:02:48 christos Exp $
+# $File: archive,v 1.68 2011/09/07 15:47:51 christos Exp $
 # archive:  file(1) magic for archive formats (see also "msdos" for self-
 #           extracting compressed archives)
 #
 >>>>78 string  -template               Template
 !:mime application/vnd.oasis.opendocument.image-template
 
-# StarView Metafile
-# From Pierre Ducroquet <pinaraf@pinaraf.info>
-0      string  VCLMTF  StarView MetaFile
->6     beshort x       \b, version %d
->8     belong  x       \b, size %d
-
 #  EPUB (OEBPS) books using OCF (OEBPS Container Format)
 #    From: Adam Buchbinder <adam.buchbinder@gmail.com>
 #    http://www.idpf.org/ocf/ocf1.0/download/ocf10.htm, section 4.
 >>4    byte            0x09            \b, at least v0.9 to extract
 >>4    byte            0x0a            \b, at least v1.0 to extract
 >>4    byte            0x0b            \b, at least v1.1 to extract
->>0x161        string          WINZIP          \b, WinZIP self-extracting
 >>4    byte            0x14            \b, at least v2.0 to extract
+>>4    byte            0x2d            \b, at least v3.0 to extract
+>>0x161        string          WINZIP          \b, WinZIP self-extracting
+
+# StarView Metafile
+# From Pierre Ducroquet <pinaraf@pinaraf.info>
+0      string  VCLMTF  StarView MetaFile
+>6     beshort x       \b, version %d
+>8     belong  x       \b, size %d
 
 # Zoo archiver
 20     lelong          0xfdc4a7dc      Zoo archive data
 # ZPAQ: http://mattmahoney.net/dc/zpaq.html
 0      string  zPQ     ZPAQ stream
 >3     byte    x       \b, level %d
+
+# BBeB ebook, unencrypted (LRF format)
+# URL: http://www.sven.de/librie/Librie/LrfFormat
+# From: Adam Buchbinder <adam.buchbinder@gmail.com>
+0      string  L\0R\0F\0\0\0   BBeB ebook data, unencrypted
+>8     beshort x               \b, version %d
+>36    byte    1               \b, front-to-back
+>36    byte    16              \b, back-to-front
+>42    beshort x               \b, (%dx,
+>44    beshort x               %d)
index a1be2f9..328a12c 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: audio,v 1.62 2011/04/05 20:27:13 christos Exp $
+# $File: audio,v 1.63 2011/09/06 11:00:06 christos Exp $
 # audio:  file(1) magic for sound formats (see also "iff")
 #
 # Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),
 # From: Mario Lang <mlang@debian.org>
 0      string  SCgf    SuperCollider3 Synth Definition file,
 >4     belong  x       version %d
+
+# Type: True Audio Lossless Audio
+# URL:  http://wiki.multimedia.cx/index.php?title=True_Audio
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  TTA1    True Audio Lossless Audio
+
+# Type: WavPack Lossless Audio
+# URL:  http://wiki.multimedia.cx/index.php?title=WavPack
+# From: Mike Melanson <mike@multimedia.cx>
+0      string  wvpk    WavPack Lossless Audio
index 0239974..956a53b 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: database,v 1.26 2010/12/26 23:10:59 christos Exp $
+# $File: database,v 1.28 2011/09/16 19:40:40 christos Exp $
 # database:  file(1) magic for various databases
 #
 # extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
 # From:        Benoit Sibaud <bsibaud@april.org>
 0      string          ToKyO\ CaBiNeT\n        TokyoCabinet database
 >14    string          x                       (version %s)
+
+# From:  Stéphane Blondon http://www.yaal.fr
+# Database file for Zope (done by FileStorage)
+0      string          FS21    Zope Object Database File Storage (data)
+# Cache file for the database of Zope (done by ClientStorage)
+0      string          ZEC3    Zope Object Database Client Cache File (data)
diff --git a/contrib/file/magic/Magdir/fusecompress b/contrib/file/magic/Magdir/fusecompress
new file mode 100644 (file)
index 0000000..165cf3c
--- /dev/null
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# $File: fusecompress,v 1.2 2011/08/08 09:05:55 christos Exp $
+# fusecompress:   file(1) magic for fusecompress
+0      string  \037\135\211    FuseCompress(ed) data
+>3     byte    0x00    (none format)
+>3     byte    0x01    (bz2 format)
+>3     byte    0x02    (gz format)
+>3     byte    0x03    (lzo format)
+>3     byte    0x04    (xor format)
+>3     byte    >0x04   (unknown format)
+>4     long    x       uncompressed size: %d
index bde16b1..b991ab7 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: iff,v 1.12 2009/09/19 16:28:09 christos Exp $
+# $File: iff,v 1.13 2011/09/06 11:00:06 christos Exp $
 # iff: file(1) magic for Interchange File Format (see also "audio" & "images")
 #
 # Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic
 >8     string          AMFF            \b, AMFF AmigaMetaFile format
 >8     string          WZRD            \b, WZRD StormWIZARD resource
 >8     string          DOC\            \b, DOC desktop publishing document
+>8     string          WVQA            \b, Westwood Studios VQA Multimedia,
+>>24   leshort         x               %d video frames,
+>>26   leshort         x               %d x
+>>28   leshort         x               %d
+>8     string          MOVE            \b, Wing Commander III Video
+>>12   string          _PC_            \b, PC version
+>>12   string          3DO_            \b, 3DO version
 
 # These go at the end of the iff rules
 #
index b8ee463..b9933b1 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: macintosh,v 1.21 2010/09/20 19:19:17 rrt Exp $
+# $File: macintosh,v 1.22 2011/05/17 17:40:31 rrt Exp $
 # macintosh description
 #
 # BinHex is the Macintosh ASCII-encoded file format (see also "apple")
 >0x412 beshort                 x               number of blocks: %d,
 >0x424 pstring                 x               volume name: %s
 
-# "BD" is has many false positives
+# "BD" gives many false positives
 #0x400 beshort                 0x4244          Macintosh HFS data
 #>0    beshort                 0x4C4B          (bootable)
 #>0x40a        beshort                 &0x8000         (locked)
diff --git a/contrib/file/magic/Magdir/marc21 b/contrib/file/magic/Magdir/marc21
new file mode 100644 (file)
index 0000000..83f7959
--- /dev/null
@@ -0,0 +1,28 @@
+#--------------------------------------------
+# marc21: file(1) magic for MARC 21 Format
+#
+# Kevin Ford (kefo@loc.gov)
+# 
+# MARC21 formats are for the representation and communication
+# of bibliographic and related information in machine-readable
+# form.  For more info, see http://www.loc.gov/marc/
+
+
+# leader position 20-21 must be 45
+20     string  45      
+
+# leader starts with 5 digits, followed by codes specific to MARC format
+>0     regex/1 (^[0-9]{5})[acdnp][^bhlnqsu-z]  MARC21 Bibliographic
+!:mime application/marc
+>0     regex/1 (^[0-9]{5})[acdnosx][z] MARC21 Authority
+!:mime application/marc
+>0     regex/1 (^[0-9]{5})[cdn][uvxy]  MARC21 Holdings
+!:mime application/marc
+0      regex/1 (^[0-9]{5})[acdn][w]    MARC21 Classification
+!:mime application/marc
+>0     regex/1 (^[0-9]{5})[cdn][q]     MARC21 Community
+!:mime application/marc
+
+# leader position 22-23, should be "00" but is it?
+>0     regex/1 (^.{21})([^0]{2})       (non-conforming)
+!:mime application/marc
index 7a79fbf..716e266 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: msdos,v 1.72 2011/05/08 01:21:41 christos Exp $
+# $File: msdos,v 1.75 2011/08/08 08:56:17 christos Exp $
 # msdos:  file(1) magic for MS-DOS files
 #
 
 >>4    uleshort&0x4842                 >0                      \bsupport
 >0     ubyte                           x                       \b)
 # DOS driver cmd640x.sys has 0x12 instead of 0xffffffff for pointer field to next device header 
-0      ulequad&0x000007a0ffffffed      0x0000000000000000      DOS-executable (
->4     uleshort&0x8000                 0x8000                  \bcharacter device driver
->>10   string                          x                       %-.8s
->4     uleshort&0x4000                 0x4000                  \b,control strings-support)
+# Too weak, matches files that only contain 0's
+#0     ulequad&0x000007a0ffffffed      0x0000000000000000      DOS-executable (
+#>4    uleshort&0x8000                 0x8000                  \bcharacter device driver
+#>>10  string                          x                       %-.8s
+#>4    uleshort&0x4000                 0x4000                  \b,control strings-support)
 
 # test too generic ?
 0      byte            0x8c            DOS executable (COM)
 0      lelong          0x08084b50      TurboC Font file
 
 # WARNING: below line conflicts with Infocom game data Z-machine 3
-0      byte            0x03            DBase 3 data file
->0x04  lelong          0               (no records)
->0x04  lelong          >0              (%ld records)
-0      byte            0x83            DBase 3 data file with memo(s)
->0x04  lelong          0               (no records)
->0x04  lelong          >0              (%ld records)
+0      byte            0x03
+>0x02  byte            <0x13           DBase 3 data file
+>>0x04 lelong          0               (no records)
+>>0x04 lelong          >0              (%ld records)
+0      byte            0x83
+>0x02  byte            <0x13           DBase 3 data file with memo(s)
+>>0x04 lelong          0               (no records)
+>>0x04 lelong          >0              (%ld records)
 0      leshort         0x0006          DBase 3 index file
 0      string          PMCC            Windows 3.x .GRP file
 1      string          RDC-meg         MegaDots 
 # Dell's .hdr
 0      string $RBU
 >23    string Dell                     %s system BIOS
->48    string x                        version %.3s
+>5     byte   2
+>>48   byte   x                        version %d.
+>>49   byte   x                        \b%d.
+>>50   byte   x                        \b%d
+>5     byte   <2
+>>48   string x                        version %.3s
 
 # Type: Microsoft DirectDraw Surface
 # URL: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/DDSFileReference/ddsfileformat.asp
index f311a89..52b04be 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: os9,v 1.6 2009/09/19 16:28:11 christos Exp $
+# $File: os9,v 1.7 2011/05/13 22:15:54 christos Exp $
 #
 # Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
 #
 # 2. Redistributions in binary form must reproduce the above copyright
 #    notice, this list of conditions and the following disclaimer in the
 #    documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-#    must display the following acknowledgement:
-#      This product includes software developed by Ignatios Souvatzis for
-#      the NetBSD project.
-# 4. The name of the author may not be used to endorse or promote products
-#    derived from this software without specific prior written permission.
-#
 #
 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
index e2b0b76..d9d39ee 100644 (file)
@@ -1,11 +1,11 @@
 
 #------------------------------------------------------------------------------
-# $File: printer,v 1.24 2011/05/08 16:34:51 christos Exp $
+# $File: printer,v 1.25 2011/05/20 23:31:46 christos Exp $
 # printer:  file(1) magic for printer-formatted files
 #
 
 # PostScript, updated by Daniel Quinlan (quinlan@yggdrasil.com)
-0      string/t                %!              PostScript document text
+0      string          %!              PostScript document text
 !:mime application/postscript
 !:apple        ASPSTEXT
 >2     string          PS-Adobe-       conforming
index 3253340..4fffafa 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: riff,v 1.21 2011/02/10 01:52:51 christos Exp $
+# $File: riff,v 1.22 2011/09/06 11:00:06 christos Exp $
 # riff:  file(1) magic for RIFF format
 # See
 #
 # MPEG-1 wrapped in a RIFF, apparently
 >8      string          CDXA            \b, wrapped MPEG-1 (CDXA)
 >8     string          4XMV            \b, 4X Movie file 
+# AMV-type AVI file: http://wiki.multimedia.cx/index.php?title=AMV
+>8     string          AMV\040         \b, AMV 
 
 #
 # XXX - some of the below may only appear in little-endian form.
index c273795..85232c6 100644 (file)
@@ -1,26 +1,34 @@
 
 #------------------------------------------------------------------------------
-# $File: rpm,v 1.10 2010/09/20 19:19:17 rrt Exp $
+# $File: rpm,v 1.11 2011/06/14 12:47:41 christos Exp $
 #
 # RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt@redhat.com)
 #
-0      beshort         0xedab
->2     beshort         0xeedb          RPM
+0      belong          0xedabeedb      RPM
 !:mime application/x-rpm
->>4    byte            x               v%d
->>5    byte            x               \b.%d
->>6    beshort         1               src
->>6    beshort         0               bin
->>>8   beshort         1               i386/x86_64
->>>8   beshort         2               Alpha/Sparc64
->>>8   beshort         3               Sparc
->>>8   beshort         4               MIPS
->>>8   beshort         5               PowerPC
->>>8   beshort         6               68000
->>>8   beshort         7               SGI
->>>8   beshort         8               RS6000
->>>8   beshort         9               IA64
->>>8   beshort         10              Sparc64
+>4     byte            x               v%d
+>5     byte            x               \b.%d
+>6     beshort         1               src
+>6     beshort         0               bin
+>>8    beshort         1               i386/x86_64
+>>8    beshort         2               Alpha/Sparc64
+>>8    beshort         3               Sparc
+>>8    beshort         4               MIPS
+>>8    beshort         5               PowerPC
+>>8    beshort         6               68000
+>>8    beshort         7               SGI
+>>8    beshort         8               RS6000
+>>8    beshort         9               IA64
+>>8    beshort         10              Sparc64
+>>8    beshort         11              MIPSel
+>>8    beshort         12              ARM
+>>8    beshort         13              MiNT
+>>8    beshort         14              S/390
+>>8    beshort         15              S/390x
+>>8    beshort         16              PowerPC64
+>>8    beshort         17              SuperH
+>>8    beshort         18              Xtensa
+>>8    beshort         255             noarch
 
 #delta RPM    Daniel Novotny (dnovotny@redhat.com)
 0      string  drpm    Delta RPM
diff --git a/contrib/file/magic/Magdir/smile b/contrib/file/magic/Magdir/smile
new file mode 100644 (file)
index 0000000..d196de5
--- /dev/null
@@ -0,0 +1,34 @@
+
+#------------------------------------------------------------------------------
+# $File: smile,v 1.1 2011/08/17 17:37:18 christos Exp $
+# smile:  file(1) magic for Smile serialization
+#
+# The Smile serialization format uses a 4-byte header:
+#
+#   Constant byte #0: 0x3A (ASCII ':')
+#   Constant byte #1: 0x29 (ASCII ')')
+#   Constant byte #2: 0x0A (ASCII linefeed, '\n')
+#   Variable byte #3, consisting of bits:
+#     Bits 4-7 (4 MSB): 4-bit version number
+#     Bits 3: Reserved
+#     Bit 2 (mask 0x04): Whether raw binary (unescaped 8-bit) values may be present in content
+#     Bit 1 (mask 0x02): Whether shared String value checking was enabled during encoding, default false
+#     Bit 0 (mask 0x01): Whether shared property name checking was enabled during encoding, default true
+#
+# Reference: http://wiki.fasterxml.com/SmileFormatSpec
+# Created by: Pierre-Alexandre Meyer <pierre@mouraf.org>
+
+# Detection
+0      string          :)\n    Smile binary data
+
+# Versioning
+>3     byte&0xF0       x               version %d:
+
+# Properties
+>3     byte&0x04       0x04            binary raw,
+>3     byte&0x04       0x00            binary encoded,
+>3     byte&0x02       0x02            shared String values enabled,
+>3     byte&0x02       0x00            shared String values disabled,
+>3     byte&0x01       0x01            shared field names enabled
+>3     byte&0x01       0x00            shared field names disabled
+
index 26eee39..47f5798 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: sniffer,v 1.14 2009/09/19 16:28:12 christos Exp $
+# $File: sniffer,v 1.18 2011/08/08 08:49:27 christos Exp $
 # sniffer:  file(1) magic for packet capture files
 #
 # From: guy@alum.mit.edu (Guy Harris)
@@ -74,6 +74,7 @@
 # that use "libpcap", or that use the same capture file format.)
 #
 0      ubelong         0xa1b2c3d4      tcpdump capture file (big-endian)
+!:mime application/vnd.tcpdump.pcap
 >4     beshort         x               - version %d
 >6     beshort         x               \b.%d
 >20    belong          0               (No link-layer encapsulation
 >20    belong          163             (802.11 with AVS header
 >16    belong          x               \b, capture length %d)
 0      ulelong         0xa1b2c3d4      tcpdump capture file (little-endian)
+!:mime application/vnd.tcpdump.pcap
 >4     leshort         x               - version %d
 >6     leshort         x               \b.%d
 >20    lelong          0               (No link-layer encapsulation
 >20    lelong          14              (BSD/OS PPP
 >16    lelong          x               \b, capture length %d)
 
+#
+# "pcap-ng" capture files.
+# http://www.winpcap.org/ntar/draft/PCAP-DumpFileFormat.html
+# Pcap-ng files can contain multiple sections. Printing the endianness,
+# snaplen, or other information from the first SHB may be misleading.
+#
+0      ubelong         0x0a0d0d0a
+>8     ubelong         0x1a2b3c4d      pcap-ng capture file
+>>12   beshort         x               - version %d
+>>14   beshort         x               \b.%d
+0      ulelong         0x0a0d0d0a
+>8     ulelong         0x1a2b3c4d      pcap-ng capture file
+>>12   leshort         x               - version %d
+>>14   leshort         x               \b.%d
+
 #
 # AIX "iptrace" capture files.
 #
index 1177521..fde1d26 100644 (file)
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: xdelta,v 1.4 2009/09/19 16:28:13 christos Exp $
+# $File: xdelta,v 1.5 2011/08/08 09:01:05 christos Exp $
 # file(1) magic(5) data for xdelta  Josh MacDonald <jmacd@CS.Berkeley.EDU>
 #
 0      string  %XDELTA%        XDelta binary patch file 0.14
@@ -9,3 +9,5 @@
 0      string  %XDZ002%        XDelta binary patch file 1.0
 0      string  %XDZ003%        XDelta binary patch file 1.0.4
 0      string  %XDZ004%        XDelta binary patch file 1.1
+
+0      string \xD6\xC3\xC4\x00 VCDIFF binary diff
index b531485..ef76a34 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: apprentice.c,v 1.169 2011/05/10 17:08:13 christos Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.171 2011/09/16 21:04:59 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -1451,8 +1451,8 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
                                                goto bad;
                                        m->str_flags |= PSTRING_LENGTH_INCLUDES_ITSELF;
                                        break;
-                               bad:
                                default:
+                               bad:
                                        if (ms->flags & MAGIC_CHECK)
                                                file_magwarn(ms,
                                                    "string extension `%c' "
@@ -2085,7 +2085,7 @@ out:
        *p = '\0';
        m->vallen = CAST(unsigned char, (p - origp));
        if (m->type == FILE_PSTRING)
-               m->vallen += file_pstring_length_size(m);
+               m->vallen += (unsigned char)file_pstring_length_size(m);
        return s;
 }
 
@@ -2466,8 +2466,6 @@ bs1(struct magic *m)
        m->in_offset = swap4((uint32_t)m->in_offset);
        m->lineno = swap4((uint32_t)m->lineno);
        if (IS_STRING(m->type)) {
-               if (m->type == FILE_PSTRING)
-                       printf("flags! %d\n", m->str_flags);
                m->str_range = swap4(m->str_range);
                m->str_flags = swap4(m->str_flags);
        }
index 31b8095..fcd764e 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $")
+FILE_RCSID("@(#)$File: apptype.c,v 1.13 2011/09/07 21:57:15 christos Exp $")
 #endif /* lint */
 
 #include <stdlib.h>
@@ -72,6 +72,7 @@ file_os2_apptype(struct magic_set *ms, const char *fn, const void *buf,
                if (fwrite(buf, 1, nb, fp) != nb) {
                        file_error(ms, errno, "cannot write tmp file `%s'",
                            path);
+                       (void)fclose(fp);
                        return -1;
                }
                (void)fclose(fp);
index 3d4d2b2..ceb61f8 100644 (file)
@@ -35,7 +35,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.43 2011/03/30 19:48:13 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.46 2011/09/16 21:23:59 christos Exp $")
 #endif
 
 #include <assert.h>
@@ -57,10 +57,6 @@ FILE_RCSID("@(#)$File: cdf.c,v 1.43 2011/03/30 19:48:13 christos Exp $")
 
 #include "cdf.h"
 
-#ifndef __arraycount
-#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
 #ifdef CDF_DEBUG
 #define DPRINTF(a) printf a, fflush(stdout)
 #else
@@ -74,28 +70,16 @@ static union {
 
 #define NEED_SWAP      (cdf_bo.u == (uint32_t)0x01020304)
 
-#define CDF_TOLE8(x)   ((uint64_t)(NEED_SWAP ? cdf_tole8(x) : (uint64_t)(x)))
-#define CDF_TOLE4(x)   ((uint32_t)(NEED_SWAP ? cdf_tole4(x) : (uint32_t)(x)))
-#define CDF_TOLE2(x)   ((uint16_t)(NEED_SWAP ? cdf_tole2(x) : (uint16_t)(x)))
+#define CDF_TOLE8(x)   ((uint64_t)(NEED_SWAP ? _cdf_tole8(x) : (uint64_t)(x)))
+#define CDF_TOLE4(x)   ((uint32_t)(NEED_SWAP ? _cdf_tole4(x) : (uint32_t)(x)))
+#define CDF_TOLE2(x)   ((uint16_t)(NEED_SWAP ? _cdf_tole2(x) : (uint16_t)(x)))
 #define CDF_GETUINT32(x, y)    cdf_getuint32(x, y)
 
-/*
- * grab a uint32_t from a possibly unaligned address, and return it in
- * the native host order.
- */
-static uint32_t
-cdf_getuint32(const uint8_t *p, size_t offs)
-{
-       uint32_t rv;
-       (void)memcpy(&rv, p + offs * sizeof(uint32_t), sizeof(rv));
-       return CDF_TOLE4(rv);
-}
-
 /*
  * swap a short
  */
-uint16_t
-cdf_tole2(uint16_t sv)
+static uint16_t
+_cdf_tole2(uint16_t sv)
 {
        uint16_t rv;
        uint8_t *s = (uint8_t *)(void *)&sv;
@@ -108,8 +92,8 @@ cdf_tole2(uint16_t sv)
 /*
  * swap an int
  */
-uint32_t
-cdf_tole4(uint32_t sv)
+static uint32_t
+_cdf_tole4(uint32_t sv)
 {
        uint32_t rv;
        uint8_t *s = (uint8_t *)(void *)&sv;
@@ -124,8 +108,8 @@ cdf_tole4(uint32_t sv)
 /*
  * swap a quad
  */
-uint64_t
-cdf_tole8(uint64_t sv)
+static uint64_t
+_cdf_tole8(uint64_t sv)
 {
        uint64_t rv;
        uint8_t *s = (uint8_t *)(void *)&sv;
@@ -141,11 +125,41 @@ cdf_tole8(uint64_t sv)
        return rv;
 }
 
+/*
+ * grab a uint32_t from a possibly unaligned address, and return it in
+ * the native host order.
+ */
+static uint32_t
+cdf_getuint32(const uint8_t *p, size_t offs)
+{
+       uint32_t rv;
+       (void)memcpy(&rv, p + offs * sizeof(uint32_t), sizeof(rv));
+       return CDF_TOLE4(rv);
+}
+
 #define CDF_UNPACK(a)  \
     (void)memcpy(&(a), &buf[len], sizeof(a)), len += sizeof(a)
 #define CDF_UNPACKA(a) \
     (void)memcpy((a), &buf[len], sizeof(a)), len += sizeof(a)
 
+uint16_t
+cdf_tole2(uint16_t sv)
+{
+       return CDF_TOLE2(sv);
+}
+
+uint32_t
+cdf_tole4(uint32_t sv)
+{
+       return CDF_TOLE4(sv);
+}
+
+uint64_t
+cdf_tole8(uint64_t sv)
+{
+       return CDF_TOLE8(sv);
+}
+
 void
 cdf_swap_header(cdf_header_t *h)
 {
@@ -358,7 +372,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
                        break;
 
 #define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss))
-       if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec ||
+       if ((nsatpersec > 0 &&
+           h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec) ||
            i > CDF_SEC_LIMIT) {
                DPRINTF(("Number of sectors in master SAT too big %u %"
                    SIZE_T_FORMAT "u\n", h->h_num_sectors_in_master_sat, i));
@@ -1204,7 +1219,7 @@ cdf_dump_summary_info(const cdf_header_t *h, const cdf_stream_t *sst)
        size_t count;
 
        (void)&h;
-       if (cdf_unpack_summary_info(sst, &ssi, &info, &count) == -1)
+       if (cdf_unpack_summary_info(sst, h, &ssi, &info, &count) == -1)
                return;
        (void)fprintf(stderr, "Endian: %x\n", ssi.si_byte_order);
        (void)fprintf(stderr, "Os Version %d.%d\n", ssi.si_os_version & 0xff,
index de1ca01..b82ab7b 100644 (file)
@@ -35,7 +35,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.66 2011/03/08 00:39:47 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.67 2011/09/01 12:12:37 christos Exp $")
 #endif
 
 #include "magic.h"
@@ -382,6 +382,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
 {
        int fdin[2], fdout[2];
        ssize_t r;
+       pid_t pid;
 
 #ifdef BUILTIN_DECOMPRESS
         /* FIXME: This doesn't cope with bzip2 */
@@ -395,7 +396,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
                file_error(ms, errno, "cannot create pipe");    
                return NODATA;
        }
-       switch (fork()) {
+       switch (pid = fork()) {
        case 0: /* child */
                (void) close(0);
                if (fd != -1) {
@@ -492,7 +493,7 @@ err:
                        (void) close(fdin[1]);
                (void) close(fdout[0]);
 #ifdef WNOHANG
-               while (waitpid(-1, NULL, WNOHANG) != -1)
+               while (waitpid(pid, NULL, WNOHANG) != -1)
                        continue;
 #else
                (void)wait(NULL);
index 7f3da86..2e7741b 100644 (file)
@@ -59,8 +59,7 @@
                    (off_t)elf_getu(swap, elfhdr.e_shoff),
                    elf_getu16(swap, elfhdr.e_shnum),
                    (size_t)elf_getu16(swap, elfhdr.e_shentsize),
-                   &flags,
-                   elf_getu16(swap, elfhdr.e_machine)) == -1)
+                   fsize, &flags, elf_getu16(swap, elfhdr.e_machine)) == -1)
                        return -1;
                break;
 
index 683dffc..8a3c343 100644 (file)
@@ -27,7 +27,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.132 2011/03/20 20:36:52 christos Exp $
+ * @(#)$File: file.h,v 1.134 2011/09/16 21:23:59 christos Exp $
  */
 
 #ifndef __file_h__
 #endif
 #define public
 
+#ifndef __arraycount
+#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
+#endif
+
 #ifndef __GNUC_PREREQ__
 #ifdef __GNUC__
 #define        __GNUC_PREREQ__(x, y)                                           \
@@ -333,8 +337,10 @@ struct mlist {
 
 #ifdef __cplusplus
 #define CAST(T, b)     static_cast<T>(b)
+#define RCAST(T, b)    reinterpret_cast<T>(b)
 #else
 #define CAST(T, b)     (T)(b)
+#define RCAST(T, b)    (T)(b)
 #endif
 
 struct level_info {
index b80d74a..7200271 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: fsmagic.c,v 1.62 2010/09/20 20:16:08 rrt Exp $")
+FILE_RCSID("@(#)$File: fsmagic.c,v 1.64 2011/08/14 09:03:12 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -63,22 +63,18 @@ FILE_RCSID("@(#)$File: fsmagic.c,v 1.62 2010/09/20 20:16:08 rrt Exp $")
 private int
 bad_link(struct magic_set *ms, int err, char *buf)
 {
-       const char *errfmt;
        int mime = ms->flags & MAGIC_MIME;
        if ((mime & MAGIC_MIME_TYPE) &&
-           file_printf(ms, "application/x-symlink")
+           file_printf(ms, "inode/symlink")
            == -1)
                return -1;
        else if (!mime) {
-               if (err == ELOOP)
-                       errfmt = "symbolic link in a loop";
-               else
-                       errfmt = "broken symbolic link to `%s'";
                if (ms->flags & MAGIC_ERROR) {
-                       file_error(ms, err, errfmt, buf);
+                       file_error(ms, err,
+                                  "broken symbolic link to `%s'", buf);
                        return -1;
                } 
-               if (file_printf(ms, errfmt, buf) == -1)
+               if (file_printf(ms, "broken symbolic link to `%s'", buf) == -1)
                        return -1;
        }
        return 1;
@@ -88,7 +84,7 @@ private int
 handle_mime(struct magic_set *ms, int mime, const char *str)
 {
        if ((mime & MAGIC_MIME_TYPE)) {
-               if (file_printf(ms, "application/%s", str) == -1)
+               if (file_printf(ms, "inode/%s", str) == -1)
                        return -1;
                if ((mime & MAGIC_MIME_ENCODING) && file_printf(ms,
                    "; charset=") == -1)
@@ -159,7 +155,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
        switch (sb->st_mode & S_IFMT) {
        case S_IFDIR:
                if (mime) {
-                       if (handle_mime(ms, mime, "x-directory") == -1)
+                       if (handle_mime(ms, mime, "directory") == -1)
                                return -1;
                } else if (file_printf(ms, "directory") == -1)
                        return -1;
@@ -174,7 +170,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
                if ((ms->flags & MAGIC_DEVICES) != 0)
                        break;
                if (mime) {
-                       if (handle_mime(ms, mime, "x-character-device") == -1)
+                       if (handle_mime(ms, mime, "chardevice") == -1)
                                return -1;
                } else {
 #ifdef HAVE_STAT_ST_RDEV
@@ -206,7 +202,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
                if ((ms->flags & MAGIC_DEVICES) != 0)
                        break;
                if (mime) {
-                       if (handle_mime(ms, mime, "x-block-device") == -1)
+                       if (handle_mime(ms, mime, "blockdevice") == -1)
                                return -1;
                } else {
 #ifdef HAVE_STAT_ST_RDEV
@@ -233,7 +229,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
                if((ms->flags & MAGIC_DEVICES) != 0)
                        break;
                if (mime) {
-                       if (handle_mime(ms, mime, "x-fifo") == -1)
+                       if (handle_mime(ms, mime, "fifo") == -1)
                                return -1;
                } else if (file_printf(ms, "fifo (named pipe)") == -1)
                        return -1;
@@ -242,7 +238,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
 #ifdef S_IFDOOR
        case S_IFDOOR:
                if (mime) {
-                       if (handle_mime(ms, mime, "x-door") == -1)
+                       if (handle_mime(ms, mime, "door") == -1)
                                return -1;
                } else if (file_printf(ms, "door") == -1)
                        return -1;
@@ -257,7 +253,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
                            return -1;
                        }
                        if (mime) {
-                               if (handle_mime(ms, mime, "x-symlink") == -1)
+                               if (handle_mime(ms, mime, "symlink") == -1)
                                        return -1;
                        } else if (file_printf(ms,
                            "unreadable symlink `%s' (%s)", fn,
@@ -313,7 +309,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
                        return p != NULL ? 1 : -1;
                } else { /* just print what it points to */
                        if (mime) {
-                               if (handle_mime(ms, mime, "x-symlink") == -1)
+                               if (handle_mime(ms, mime, "symlink") == -1)
                                        return -1;
                        } else if (file_printf(ms, "symbolic link to `%s'",
                            buf) == -1)
@@ -325,7 +321,7 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
 #ifndef __COHERENT__
        case S_IFSOCK:
                if (mime) {
-                       if (handle_mime(ms, mime, "x-socket") == -1)
+                       if (handle_mime(ms, mime, "socket") == -1)
                                return -1;
                } else if (file_printf(ms, "socket") == -1)
                        return -1;
index a7f04bb..5403951 100644 (file)
@@ -33,7 +33,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: magic.c,v 1.73 2011/05/10 17:08:14 christos Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.74 2011/05/26 01:27:59 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -84,24 +84,6 @@ private const char *file_or_fd(struct magic_set *, const char *, int);
 #define        STDIN_FILENO    0
 #endif
 
-#ifdef WIN32
-BOOL WINAPI DllMain(HINSTANCE hinstDLL,
-    DWORD fdwReason __attribute__((__unused__)),
-    LPVOID lpvReserved __attribute__((__unused__)));
-
-CHAR dllpath[MAX_PATH + 1] = { 0 };
-
-BOOL WINAPI DllMain(HINSTANCE hinstDLL,
-    DWORD fdwReason __attribute__((__unused__)),
-    LPVOID lpvReserved __attribute__((__unused__)))
-{
-       if (dllpath[0] == 0 &&
-           GetModuleFileNameA(hinstDLL, dllpath, MAX_PATH) != 0)
-               PathRemoveFileSpecA(dllpath);
-       return TRUE;
-}
-#endif
-
 private const char *
 get_default_magic(void)
 {
@@ -146,17 +128,18 @@ out:
 #define APPENDPATH() \
        do { \
                if (tmppath && access(tmppath, R_OK) != -1) { \
-                       if (hmagicpath == NULL) \
+                       if (hmagicpath == NULL) \
                                hmagicpath = tmppath; \
-                               tmppath = NULL; \
-                       } else { \
-                               free(tmppath); \
+                       else { \
                                if (asprintf(&hmagicp, "%s%c%s", hmagicpath, \
                                    PATHSEP, tmppath) >= 0) { \
                                        free(hmagicpath); \
                                        hmagicpath = hmagicp; \
                                } \
+                               free(tmppath); \
                        } \
+                       tmppath = NULL; \
+               } \
        } while (/*CONSTCOND*/0)
                                
        if (default_magic) {
@@ -184,9 +167,11 @@ out:
                        APPENDPATH();
        }
 
-
        /* Third, try to get magic file relative to dll location */
-       if (dllpath[0] != 0) {
+       LPTSTR dllpath = malloc(sizeof(*dllpath) * (MAX_PATH + 1));
+       dllpath[MAX_PATH] = 0;  /* just in case long path gets truncated and not null terminated */
+       if (GetModuleFileNameA(NULL, dllpath, MAX_PATH)){
+               PathRemoveFileSpecA(dllpath);
                if (strlen(dllpath) > 3 &&
                    stricmp(&dllpath[strlen(dllpath) - 3], "bin") == 0) {
                        if (asprintf(&tmppath,
index 5be8c76..3bc4d85 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: print.c,v 1.69 2010/07/21 16:47:18 christos Exp $")
+FILE_RCSID("@(#)$File: print.c,v 1.70 2011/08/14 09:03:12 christos Exp $")
 #endif  /* lint */
 
 #include <string.h>
@@ -51,8 +51,7 @@ file_mdump(struct magic *m)
 {
        private const char optyp[] = { FILE_OPS };
 
-       (void) fprintf(stderr, "[%u", m->lineno);
-       (void) fprintf(stderr, ">>>>>>>> %u" + 8 - (m->cont_level & 7),
+       (void) fprintf(stderr, "%.*s %u", (m->cont_level & 7) + 1, ">>>>>>>>",
                       m->offset);
 
        if (m->flag & INDIR) {
index eb5d71e..0bcc116 100644 (file)
@@ -26,7 +26,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readcdf.c,v 1.25 2011/02/10 21:35:05 christos Exp $")
+FILE_RCSID("@(#)$File: readcdf.c,v 1.26 2011/08/26 13:38:28 christos Exp $")
 #endif
 
 #include <stdlib.h>
@@ -48,7 +48,7 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
         cdf_timestamp_t tp;
         struct timespec ts;
         char buf[64];
-        const char *str = "vnd.ms-office";
+        const char *str = NULL;
         const char *s;
         int len;
 
@@ -142,8 +142,8 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
                 }
         }
         if (!NOTMIME(ms)) {
-                if (file_printf(ms, "application/%s", str) == -1)
-                        return -1;
+               if (str == NULL)
+                       return 0;
         }
         return 1;
 }
@@ -263,6 +263,24 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf,
 #endif
         if ((i = cdf_file_summary_info(ms, &h, &scn)) == -1)
                 expn = "Can't expand summary_info";
+       if (i == 0) {
+               const char *str = "vnd.ms-office";
+               cdf_directory_t *d;
+               char name[__arraycount(d->d_name)];
+               size_t j, k;
+               for (j = 0; j < dir.dir_len; j++) {
+                   d = &dir.dir_tab[j];
+                   for (k = 0; k < sizeof(name); k++)
+                       name[k] = (char)cdf_tole2(d->d_name[k]);
+                   if (strstr(name, "WordDocument") == 0) {
+                       str = "msword";
+                       break;
+                   }
+               }
+                if (file_printf(ms, "application/%s", str) == -1)
+                        return -1;
+               i = 1;
+       }
         free(scn.sst_tab);
 out4:
         free(sst.sst_tab);
index ceb657d..8b141e1 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readelf.c,v 1.86 2010/07/21 16:47:18 christos Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.90 2011/08/23 08:01:12 christos Exp $")
 #endif
 
 #ifdef BUILTIN_ELF
@@ -47,8 +47,8 @@ private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t,
 #endif
 private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t,
     off_t, int *, int);
-private int doshn(struct magic_set *, int, int, int, off_t, int, size_t, int *,
-    int);
+private int doshn(struct magic_set *, int, int, int, off_t, int, size_t,
+    off_t, int *, int);
 private size_t donote(struct magic_set *, void *, size_t, size_t, int,
     int, size_t, int *);
 
@@ -144,7 +144,7 @@ getu64(int swap, uint64_t value)
 #define xsh_size       (clazz == ELFCLASS32                    \
                         ? elf_getu32(swap, sh32.sh_size)       \
                         : elf_getu64(swap, sh64.sh_size))
-#define xsh_offset     (clazz == ELFCLASS32                    \
+#define xsh_offset     (off_t)(clazz == ELFCLASS32             \
                         ? elf_getu32(swap, sh32.sh_offset)     \
                         : elf_getu64(swap, sh64.sh_offset))
 #define xsh_type       (clazz == ELFCLASS32                    \
@@ -283,10 +283,11 @@ private const char os_style_names[][8] = {
        "NetBSD",
 };
 
-#define FLAGS_DID_CORE         1
-#define FLAGS_DID_NOTE         2
-#define FLAGS_DID_CORE_STYLE   4
-#define FLAGS_IS_CORE          8
+#define FLAGS_DID_CORE         0x01
+#define FLAGS_DID_NOTE         0x02
+#define FLAGS_DID_BUILD_ID     0x04
+#define FLAGS_DID_CORE_STYLE   0x08
+#define FLAGS_IS_CORE          0x10
 
 private int
 dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
@@ -297,13 +298,6 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
        size_t offset;
        unsigned char nbuf[BUFSIZ];
        ssize_t bufsize;
-       off_t savedoffset;
-       struct stat st;
-
-       if (fstat(fd, &st) < 0) {
-               file_badread(ms);
-               return -1;
-       }
 
        if (size != xph_sizeof) {
                if (file_printf(ms, ", corrupted program header size") == -1)
@@ -315,7 +309,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
         * Loop through all the program headers.
         */
        for ( ; num; num--) {
-               if ((savedoffset = lseek(fd, off, SEEK_SET)) == (off_t)-1) {
+               if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
                        file_badseek(ms);
                        return -1;
                }
@@ -323,15 +317,13 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
                        file_badread(ms);
                        return -1;
                }
+               off += size;
+
                if (xph_offset > fsize) {
-                       if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
-                               file_badseek(ms);
-                               return -1;
-                       }
+                       /* Perhaps warn here */
                        continue;
                }
 
-               off += size;
                if (xph_type != PT_NOTE)
                        continue;
 
@@ -420,7 +412,8 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
                return (offset >= size) ? offset : size;
        }
 
-       if (*flags & FLAGS_DID_NOTE)
+       if ((*flags & (FLAGS_DID_NOTE|FLAGS_DID_BUILD_ID)) ==
+           (FLAGS_DID_NOTE|FLAGS_DID_BUILD_ID))
                goto core;
 
        if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
@@ -462,6 +455,19 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
                return size;
        }
 
+       if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
+           xnh_type == NT_GNU_BUILD_ID && (descsz == 16 || descsz == 20)) {
+           uint32_t desc[5], i;
+           if (file_printf(ms, ", BuildID[%s]=0x", descsz == 16 ? "md5/uuid" :
+               "sha1") == -1)
+                   return size;
+           (void)memcpy(desc, &nbuf[doff], descsz);
+           for (i = 0; i < descsz >> 2; i++)
+               if (file_printf(ms, "%.8x", desc[i]) == -1)
+                   return size;
+           *flags |= FLAGS_DID_BUILD_ID;
+       }
+
        if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0 &&
            xnh_type == NT_NETBSD_VERSION && descsz == 4) {
                uint32_t desc;
@@ -694,6 +700,7 @@ core:
                                unsigned char *cname, *cp;
                                size_t reloffset = prpsoffsets(i);
                                size_t noffset = doff + reloffset;
+                               size_t k;
                                for (j = 0; j < 16; j++, noffset++,
                                    reloffset++) {
                                        /*
@@ -744,12 +751,11 @@ core:
                                 * Try next offsets, in case this match is
                                 * in the middle of a string.
                                 */
-                               size_t k;
                                for (k = i + 1 ; k < NOFFSETS ; k++) {
-                                       if (prpsoffsets(k) >= prpsoffsets(i))
-                                               continue;
                                        size_t no;
                                        int adjust = 1;
+                                       if (prpsoffsets(k) >= prpsoffsets(i))
+                                               continue;
                                        for (no = doff + prpsoffsets(k);
                                             no < doff + prpsoffsets(i); no++)
                                                adjust = adjust
@@ -836,13 +842,13 @@ static const cap_desc_t cap_desc_386[] = {
 
 private int
 doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
-    size_t size, int *flags, int mach)
+    size_t size, off_t fsize, int *flags, int mach)
 {
        Elf32_Shdr sh32;
        Elf64_Shdr sh64;
        int stripped = 1;
        void *nbuf;
-       off_t noff;
+       off_t noff, coff;
        uint64_t cap_hw1 = 0;   /* SunOS 5.x hardware capabilites */
        uint64_t cap_sf1 = 0;   /* SunOS 5.x software capabilites */
 
@@ -852,16 +858,18 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
                return 0;
        }
 
-       if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
-               file_badseek(ms);
-               return -1;
-       }
-
        for ( ; num; num--) {
+               if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
+                       file_badseek(ms);
+                       return -1;
+               }
                if (read(fd, xsh_addr, xsh_sizeof) == -1) {
                        file_badread(ms);
                        return -1;
                }
+               off += size;
+
+               /* Things we can determine before we seek */
                switch (xsh_type) {
                case SHT_SYMTAB:
 #if 0
@@ -869,12 +877,17 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
 #endif
                        stripped = 0;
                        break;
-               case SHT_NOTE:
-                       if ((off = lseek(fd, (off_t)0, SEEK_CUR)) ==
-                           (off_t)-1) {
-                               file_badread(ms);
-                               return -1;
+               default:
+                       if (xsh_offset > fsize) {
+                               /* Perhaps warn here */
+                               continue;
                        }
+                       break;
+               }
+
+               /* Things we can determine when we seek */
+               switch (xsh_type) {
+               case SHT_NOTE:
                        if ((nbuf = malloc((size_t)xsh_size)) == NULL) {
                                file_error(ms, errno, "Cannot allocate memory"
                                    " for note");
@@ -903,24 +916,12 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
                                if (noff == 0)
                                        break;
                        }
-                       if ((lseek(fd, off, SEEK_SET)) == (off_t)-1) {
-                               free(nbuf);
-                               file_badread(ms);
-                               return -1;
-                       }
                        free(nbuf);
                        break;
                case SHT_SUNW_cap:
-                   {
-                       off_t coff;
-                       if ((off = lseek(fd, (off_t)0, SEEK_CUR)) ==
-                           (off_t)-1) {
-                               file_badread(ms);
-                               return -1;
-                       }
                        if (lseek(fd, (off_t)xsh_offset, SEEK_SET) ==
                            (off_t)-1) {
-                               file_badread(ms);
+                               file_badseek(ms);
                                return -1;
                        }
                        coff = 0;
@@ -957,12 +958,10 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
                                        break;
                                }
                        }
-                       if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
-                               file_badread(ms);
-                               return -1;
-                       }
                        break;
-                   }
+
+               default:
+                       break;
                }
        }
        if (file_printf(ms, ", %sstripped", stripped ? "" : "not ") == -1)
@@ -1044,13 +1043,6 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
        unsigned char nbuf[BUFSIZ];
        ssize_t bufsize;
        size_t offset, align;
-       off_t savedoffset = (off_t)-1;
-       struct stat st;
-
-       if (fstat(fd, &st) < 0) {
-               file_badread(ms);
-               return -1;
-       }
        
        if (size != xph_sizeof) {
                if (file_printf(ms, ", corrupted program header size") == -1)
@@ -1058,37 +1050,20 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
                return 0;
        }
 
-       if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
-               file_badseek(ms);
-               return -1;
-       }
-
        for ( ; num; num--) {
-               if (read(fd, xph_addr, xph_sizeof) == -1) {
-                       file_badread(ms);
+               if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
+                       file_badseek(ms);
                        return -1;
                }
-               if (xph_offset > st.st_size && savedoffset != (off_t)-1) {
-                       if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
-                               file_badseek(ms);
-                               return -1;
-                       }
-                       continue;
-               }
 
-               if ((savedoffset = lseek(fd, (off_t)0, SEEK_CUR)) == (off_t)-1) {
-                       file_badseek(ms);
+               if (read(fd, xph_addr, xph_sizeof) == -1) {
+                       file_badread(ms);
                        return -1;
                }
 
-               if (xph_offset > fsize) {
-                       if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
-                               file_badseek(ms);
-                               return -1;
-                       }
-                       continue;
-               }
+               off += size;
 
+               /* Things we can determine before we seek */
                switch (xph_type) {
                case PT_DYNAMIC:
                        linking_style = "dynamically";
@@ -1096,6 +1071,16 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
                case PT_INTERP:
                        shared_libraries = " (uses shared libs)";
                        break;
+               default:
+                       if (xph_offset > fsize) {
+                               /* Maybe warn here? */
+                               continue;
+                       }
+                       break;
+               }
+
+               /* Things we can determine when we seek */
+               switch (xph_type) {
                case PT_NOTE:
                        if ((align = xph_align) & 0x80000000UL) {
                                if (file_printf(ms, 
@@ -1110,8 +1095,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
                         * This is a PT_NOTE section; loop through all the notes
                         * in the section.
                         */
-                       if (lseek(fd, xph_offset, SEEK_SET)
-                           == (off_t)-1) {
+                       if (lseek(fd, xph_offset, SEEK_SET) == (off_t)-1) {
                                file_badseek(ms);
                                return -1;
                        }
@@ -1131,10 +1115,6 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
                                if (offset == 0)
                                        break;
                        }
-                       if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
-                               file_badseek(ms);
-                               return -1;
-                       }
                        break;
                default:
                        break;
index ab4b5d1..4308e6a 100644 (file)
@@ -32,7 +32,7 @@
  * Note: cobbled from the linux header file, with modifications
  */
 #ifndef __fake_elf_h__
-#define __fake_elf_h__
+#define        __fake_elf_h__
 
 #if HAVE_STDINT_H
 #include <stdint.h>
@@ -45,7 +45,7 @@ typedef uint32_t      Elf32_Word;
 typedef uint8_t                Elf32_Char;
 
 #if SIZEOF_LONG_LONG != 8
-#define USE_ARRAY_FOR_64BIT_TYPES
+#define        USE_ARRAY_FOR_64BIT_TYPES
 typedef        uint32_t        Elf64_Addr[2];
 typedef        uint32_t        Elf64_Off[2];
 typedef uint32_t       Elf64_Xword[2];
@@ -59,7 +59,7 @@ typedef uint16_t      Elf64_Half;
 typedef uint32_t       Elf64_Word;
 typedef uint8_t                Elf64_Char;
 
-#define EI_NIDENT      16
+#define        EI_NIDENT       16
 
 typedef struct {
     Elf32_Char e_ident[EI_NIDENT];
@@ -96,10 +96,10 @@ typedef struct {
 } Elf64_Ehdr;
 
 /* e_type */
-#define ET_REL         1
-#define ET_EXEC                2
-#define ET_DYN         3
-#define ET_CORE                4
+#define        ET_REL          1
+#define        ET_EXEC         2
+#define        ET_DYN          3
+#define        ET_CORE         4
 
 /* e_machine (used only for SunOS 5.x hardware capabilities) */
 #define        EM_SPARC        2
@@ -110,20 +110,20 @@ typedef struct {
 #define        EM_AMD64        62
 
 /* sh_type */
-#define SHT_SYMTAB     2
-#define SHT_NOTE       7
-#define SHT_DYNSYM     11
-#define SHT_SUNW_cap   0x6ffffff5      /* SunOS 5.x hw/sw capabilites */
+#define        SHT_SYMTAB      2
+#define        SHT_NOTE        7
+#define        SHT_DYNSYM      11
+#define        SHT_SUNW_cap    0x6ffffff5      /* SunOS 5.x hw/sw capabilites */
 
 /* elf type */
-#define ELFDATANONE    0               /* e_ident[EI_DATA] */
-#define ELFDATA2LSB    1
-#define ELFDATA2MSB    2
+#define        ELFDATANONE     0               /* e_ident[EI_DATA] */
+#define        ELFDATA2LSB     1
+#define        ELFDATA2MSB     2
 
 /* elf class */
-#define ELFCLASSNONE   0
-#define ELFCLASS32     1
-#define ELFCLASS64     2
+#define        ELFCLASSNONE    0
+#define        ELFCLASS32      1
+#define        ELFCLASS64      2
 
 /* magic number */
 #define        EI_MAG0         0               /* e_ident[] indexes */
@@ -221,26 +221,47 @@ typedef struct {
 #define        NT_PRFPREG      2
 #define        NT_PRPSINFO     3
 #define        NT_PRXREG       4
-#define NT_TASKSTRUCT  4
+#define        NT_TASKSTRUCT   4
 #define        NT_PLATFORM     5
 #define        NT_AUXV         6
 
 /* Note types used in executables */
 /* NetBSD executables (name = "NetBSD") */
-#define NT_NETBSD_VERSION      1
-#define NT_NETBSD_EMULATION    2
-#define NT_FREEBSD_VERSION     1
-#define NT_OPENBSD_VERSION     1
-#define NT_DRAGONFLY_VERSION   1
-/* GNU executables (name = "GNU") */
-#define NT_GNU_VERSION         1
+#define        NT_NETBSD_VERSION       1
+#define        NT_NETBSD_EMULATION     2
+#define        NT_FREEBSD_VERSION      1
+#define        NT_OPENBSD_VERSION      1
+#define        NT_DRAGONFLY_VERSION    1
+/*
+ * GNU executables (name = "GNU")
+ * word[0]: GNU OS tags
+ * word[1]: major version
+ * word[2]: minor version
+ * word[3]: tiny version
+ */
+#define        NT_GNU_VERSION          1
 
 /* GNU OS tags */
-#define GNU_OS_LINUX   0
-#define GNU_OS_HURD    1
-#define GNU_OS_SOLARIS 2
-#define GNU_OS_KFREEBSD        3
-#define GNU_OS_KNETBSD 4
+#define        GNU_OS_LINUX    0
+#define        GNU_OS_HURD     1
+#define        GNU_OS_SOLARIS  2
+#define        GNU_OS_KFREEBSD 3
+#define        GNU_OS_KNETBSD  4
+
+/*
+ * GNU Hardware capability information 
+ * word[0]: Number of entries
+ * word[1]: Bitmask of enabled entries
+ * Followed by a byte id, and a NUL terminated string per entry
+ */
+#define        NT_GNU_HWCAP            2
+
+/*
+ * GNU Build ID generated by ld
+ * 160 bit SHA1 [default] 
+ * 128 bit md5 or uuid
+ */
+#define        NT_GNU_BUILD_ID         3
 
 /* SunOS 5.x hardware/software capabilities */
 typedef struct {
index 99a7b52..89cb269 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.144 2011/01/07 23:22:28 rrt Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.145 2011/05/13 22:15:40 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -912,7 +912,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
        if (indir == 0) {
                switch (type) {
                case FILE_SEARCH:
-                       ms->search.s = (const char *)s + offset;
+                       ms->search.s = RCAST(const char *, s) + offset;
                        ms->search.s_len = nbytes - offset;
                        ms->search.offset = offset;
                        return 0;
@@ -930,8 +930,8 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
                                ms->search.s = NULL;
                                return 0;
                        }
-                       buf = (const char *)s + offset;
-                       end = last = (const char *)s + nbytes;
+                       buf = RCAST(const char *, s) + offset;
+                       end = last = RCAST(const char *, s) + nbytes;
                        /* mget() guarantees buf <= last */
                        for (lines = linecnt, b = buf; lines && b < end &&
                             ((b = CAST(const char *,
@@ -944,7 +944,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
                                        b++;
                        }
                        if (lines)
-                               last = (const char *)s + nbytes;
+                               last = RCAST(const char *, s) + nbytes;
 
                        ms->search.s = buf;
                        ms->search.s_len = last - buf;