aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2022-01-03 01:44:41 +0000
committerXin LI <delphij@FreeBSD.org>2022-01-03 01:44:41 +0000
commit048bd4094ff308722af59e857c54819c9313875a (patch)
treeb9e408b4bcc6134b4111262b2c80c2fc96cc84cc
parent2d24dbcf45a851fa5c7960160b7b4a28ff373558 (diff)
downloadsrc-vendor/file/5.41.tar.gz
src-vendor/file/5.41.zip
Vendor import of file 5.41.vendor/file/5.41
-rw-r--r--ChangeLog78
-rw-r--r--Makefile.am2
-rw-r--r--Makefile.in7
-rw-r--r--README159
-rw-r--r--README.DEVELOPER49
-rw-r--r--RELEASE-PROCEDURE29
-rw-r--r--acinclude.m435
-rw-r--r--aclocal.m479
-rw-r--r--config.h.in3
-rwxr-xr-xconfigure608
-rw-r--r--configure.ac7
-rw-r--r--doc/Makefile.in3
-rw-r--r--doc/file.man61
-rw-r--r--doc/magic.man9
-rw-r--r--[-rwxr-xr-x]ltmain.sh0
-rw-r--r--m4/visibility.m477
-rw-r--r--magic/Magdir/acorn10
-rw-r--r--magic/Magdir/aes29
-rw-r--r--magic/Magdir/algol6842
-rw-r--r--magic/Magdir/amigaos147
-rw-r--r--magic/Magdir/android33
-rw-r--r--magic/Magdir/animation163
-rw-r--r--magic/Magdir/apple10
-rw-r--r--magic/Magdir/archive207
-rw-r--r--magic/Magdir/arm41
-rw-r--r--magic/Magdir/asf6
-rw-r--r--magic/Magdir/audio64
-rw-r--r--magic/Magdir/avm33
-rw-r--r--magic/Magdir/biosig2
-rw-r--r--magic/Magdir/blit6
-rw-r--r--magic/Magdir/bm10
-rw-r--r--magic/Magdir/bsi7
-rw-r--r--magic/Magdir/bytecode30
-rw-r--r--magic/Magdir/c-lang7
-rw-r--r--magic/Magdir/c6413
-rw-r--r--magic/Magdir/cad109
-rw-r--r--magic/Magdir/cafebabe61
-rw-r--r--magic/Magdir/citrus6
-rw-r--r--magic/Magdir/clipper6
-rw-r--r--magic/Magdir/coff78
-rw-r--r--magic/Magdir/commands100
-rw-r--r--magic/Magdir/compress9
-rw-r--r--magic/Magdir/console62
-rw-r--r--magic/Magdir/coverage4
-rw-r--r--magic/Magdir/crypto5
-rw-r--r--magic/Magdir/database212
-rw-r--r--magic/Magdir/der7
-rw-r--r--magic/Magdir/diff15
-rw-r--r--magic/Magdir/digital3
-rw-r--r--magic/Magdir/editors6
-rw-r--r--magic/Magdir/elf48
-rw-r--r--magic/Magdir/espressif4
-rw-r--r--magic/Magdir/filesystems297
-rw-r--r--magic/Magdir/fonts33
-rw-r--r--magic/Magdir/forth46
-rw-r--r--magic/Magdir/fsav12
-rw-r--r--magic/Magdir/games215
-rw-r--r--magic/Magdir/git8
-rw-r--r--magic/Magdir/gnome6
-rw-r--r--magic/Magdir/gnu42
-rw-r--r--magic/Magdir/gpt4
-rw-r--r--magic/Magdir/gpu10
-rw-r--r--magic/Magdir/guile13
-rw-r--r--magic/Magdir/hitachi-sh6
-rw-r--r--magic/Magdir/human68k4
-rw-r--r--magic/Magdir/ibm3706
-rw-r--r--magic/Magdir/ibm60004
-rw-r--r--magic/Magdir/icc26
-rw-r--r--magic/Magdir/iff10
-rw-r--r--magic/Magdir/images736
-rw-r--r--magic/Magdir/intel6
-rw-r--r--magic/Magdir/jpeg25
-rw-r--r--magic/Magdir/lammps64
-rw-r--r--magic/Magdir/lif45
-rw-r--r--magic/Magdir/linux79
-rw-r--r--magic/Magdir/lisp5
-rw-r--r--magic/Magdir/locoscript12
-rw-r--r--magic/Magdir/lua11
-rw-r--r--magic/Magdir/mach140
-rw-r--r--magic/Magdir/macintosh18
-rw-r--r--magic/Magdir/mail.news11
-rw-r--r--magic/Magdir/map112
-rw-r--r--magic/Magdir/maple58
-rw-r--r--magic/Magdir/mathematica95
-rw-r--r--magic/Magdir/measure7
-rw-r--r--magic/Magdir/misctools35
-rw-r--r--magic/Magdir/modem4
-rw-r--r--magic/Magdir/motorola4
-rw-r--r--magic/Magdir/mozilla6
-rw-r--r--magic/Magdir/msdos313
-rw-r--r--magic/Magdir/msooxml23
-rw-r--r--magic/Magdir/msx68
-rw-r--r--magic/Magdir/neko12
-rw-r--r--magic/Magdir/netware6
-rw-r--r--magic/Magdir/nim-lang29
-rw-r--r--magic/Magdir/ole2compounddocs71
-rw-r--r--magic/Magdir/os2137
-rw-r--r--magic/Magdir/pcjr8
-rw-r--r--magic/Magdir/pdf11
-rw-r--r--magic/Magdir/pgf6
-rw-r--r--magic/Magdir/pgp59
-rw-r--r--magic/Magdir/pgp-binary-keys388
-rw-r--r--magic/Magdir/plan911
-rw-r--r--magic/Magdir/pmem18
-rw-r--r--magic/Magdir/puzzle17
-rw-r--r--magic/Magdir/python208
-rw-r--r--magic/Magdir/riff364
-rw-r--r--magic/Magdir/rtf4
-rw-r--r--magic/Magdir/sccs12
-rw-r--r--magic/Magdir/sgi20
-rw-r--r--magic/Magdir/sgml4
-rw-r--r--magic/Magdir/sinclair4
-rw-r--r--magic/Magdir/sniffer8
-rw-r--r--magic/Magdir/sosi4
-rw-r--r--magic/Magdir/spectrum4
-rw-r--r--magic/Magdir/sql110
-rw-r--r--magic/Magdir/statistics45
-rw-r--r--magic/Magdir/terminfo4
-rw-r--r--magic/Magdir/timezone22
-rw-r--r--magic/Magdir/tplink26
-rw-r--r--magic/Magdir/uf272
-rw-r--r--magic/Magdir/virtual84
-rw-r--r--magic/Magdir/vorbis8
-rw-r--r--magic/Magdir/windows213
-rw-r--r--magic/Magdir/wordprocessors31
-rw-r--r--magic/Magdir/wsdl4
-rw-r--r--magic/Magdir/xenix26
-rw-r--r--magic/Magdir/xilinx4
-rw-r--r--magic/Magdir/xwindows10
-rw-r--r--magic/Magdir/yara4
-rw-r--r--magic/Magdir/zfs4
-rw-r--r--magic/Magdir/zip14
-rw-r--r--magic/Makefile.am29
-rw-r--r--magic/Makefile.in31
-rwxr-xr-xmagic/scripts/create_filemagic_flac71
-rw-r--r--python/CHANGELOG.md5
-rw-r--r--python/Makefile.am2
-rw-r--r--python/Makefile.in5
-rw-r--r--python/file_magic/__init__.py1
-rw-r--r--python/magic.py75
-rw-r--r--src/BNF151
-rw-r--r--src/Makefile.am2
-rw-r--r--src/Makefile.in5
-rw-r--r--src/apprentice.c86
-rw-r--r--src/ascmagic.c76
-rw-r--r--src/cdf.c29
-rw-r--r--src/cdf.mk3
-rw-r--r--src/compress.c27
-rw-r--r--src/der.c3
-rw-r--r--src/encoding.c225
-rw-r--r--src/file.c43
-rw-r--r--src/file.h46
-rw-r--r--src/file_opts.h2
-rw-r--r--src/funcs.c76
-rw-r--r--src/is_csv.c7
-rw-r--r--src/magic.c15
-rw-r--r--src/magic.h.in1
-rw-r--r--src/memtest.c143
-rw-r--r--src/print.c14
-rw-r--r--src/readelf.c141
-rw-r--r--src/seccomp.c16
-rw-r--r--src/softmagic.c276
-rw-r--r--src/vasprintf.c12
-rw-r--r--tests/JW07022A.mp3.result2
-rw-r--r--tests/Makefile.am94
-rw-r--r--tests/Makefile.in97
-rw-r--r--tests/android-vdex-1.result1
-rw-r--r--tests/android-vdex-1.testfilebin0 -> 20 bytes
-rw-r--r--tests/android-vdex-2.result1
-rw-r--r--tests/android-vdex-2.testfilebin0 -> 20 bytes
-rw-r--r--tests/bcachefs.result1
-rw-r--r--tests/bcachefs.testfilebin0 -> 8192 bytes
-rw-r--r--tests/cl8m8ocofedso.result1
-rw-r--r--tests/cl8m8ocofedso.testfilebin0 -> 27777 bytes
-rw-r--r--tests/ext4.result1
-rw-r--r--tests/ext4.testfilebin0 -> 2048 bytes
-rw-r--r--tests/matilde.arm.result1
-rw-r--r--tests/matilde.arm.testfilebin0 -> 14790 bytes
-rw-r--r--tests/pcjr.result1
-rw-r--r--tests/pcjr.testfilebin0 -> 514 bytes
-rw-r--r--tests/pgp-binary-key-v2-phil.result1
-rw-r--r--tests/pgp-binary-key-v2-phil.testfilebin0 -> 975 bytes
-rw-r--r--tests/pgp-binary-key-v3-lutz.result1
-rw-r--r--tests/pgp-binary-key-v3-lutz.testfilebin0 -> 11722 bytes
-rw-r--r--tests/pgp-binary-key-v4-dsa.result1
-rw-r--r--tests/pgp-binary-key-v4-dsa.testfilebin0 -> 1677 bytes
-rw-r--r--tests/pgp-binary-key-v4-ecc-no-userid-secret.result1
-rw-r--r--tests/pgp-binary-key-v4-ecc-no-userid-secret.testfilebin0 -> 794 bytes
-rw-r--r--tests/pgp-binary-key-v4-ecc-secret-key.result1
-rw-r--r--tests/pgp-binary-key-v4-ecc-secret-key.testfilebin0 -> 494 bytes
-rw-r--r--tests/pgp-binary-key-v4-rsa-key.result1
-rw-r--r--tests/pgp-binary-key-v4-rsa-key.testfilebin0 -> 3695 bytes
-rw-r--r--tests/pgp-binary-key-v4-rsa-no-userid-secret.result1
-rw-r--r--tests/pgp-binary-key-v4-rsa-no-userid-secret.testfilebin0 -> 5907 bytes
-rw-r--r--tests/pgp-binary-key-v4-rsa-secret-key.result1
-rw-r--r--tests/pgp-binary-key-v4-rsa-secret-key.testfilebin0 -> 3695 bytes
-rw-r--r--tests/test.c90
-rw-r--r--tests/uf2.result1
-rw-r--r--tests/uf2.testfilebin0 -> 512 bytes
199 files changed, 6713 insertions, 2710 deletions
diff --git a/ChangeLog b/ChangeLog
index f877ad22da6a..0bb334c9fd88 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,81 @@
+2021-10-18 11:57 Christos Zoulas <christos@zoulas.com>
+
+ * release 5.41
+
+2021-09-23 03:51 Christos Zoulas <christos@zoulas.com>
+
+ * Avinash Sonawane: Fix tzname detection
+
+2021-09-03 09:17 Christos Zoulas <christos@zoulas.com>
+
+ * Fix relationship tests with "search" magic, don't short circuit
+ logic
+
+2021-07-13 01:06 Christos Zoulas <christos@zoulas.com>
+
+ * Fix memory leak in compile mode
+
+2021-07-01 03:51 Christos Zoulas <christos@zoulas.com>
+
+ * PR/272: kiefermat: Only set returnval = 1 when we printed something
+ (in all cases print or !print). This simplifies the logic and fixes
+ the issue in the PR with -k and --mime-type there was no continuation
+ printed before the default case.
+
+2021-06-30 13:07 Christos Zoulas <christos@zoulas.com>
+
+ * PR/270: Don't translate unprintable characters in %s magic formats
+ when -r
+ * PR/269: Avoid undefined behavior with clang (adding offset to NULL)
+
+2021-05-09 18:38 Christos Zoulas <christos@zoulas.com>
+
+ * Add a new flag (f) that requires that the match is a full word,
+ not a partial word match.
+ * Add varint types (unused)
+
+2021-04-19 17:17 Christos Zoulas <christos@zoulas.com>
+
+ * PR/256: mutableVoid: If the file is less than 3 bytes, use the file
+ length to determine type
+ * PR/259: aleksandr.v.novichkov: mime printing through indirect magic
+ is not taken into account, use match directly so that it does.
+
+2021-04-04 17:02 Christos Zoulas <christos@zoulas.com>
+
+ * count the total bytes found not the total byte positions
+ in order to determine encoding (Anatol Belski)
+
+2021-03-30 20:21 Christos Zoulas <christos@zoulas.com>
+
+ * release 5.40
+
+2021-02-05 16:31 Christos Zoulas <christos@zoulas.com>
+
+ * PR/234: Add limit to the number of bytes to scan for encoding
+ * PR/230: Fix /T (trim flag) for regex
+
+2021-02-01 12:31 Christos Zoulas <christos@zoulas.com>
+ * PR/77: Trim trailing separator.
+
+2020-12-17 15:44 Christos Zoulas <christos@zoulas.com>
+
+ * PR/211: Convert system read errors from corrupt ELF
+ files into human readable error messages
+
+2020-12-08 16:24 Christos Zoulas <christos@zoulas.com>
+
+ * fix multithreaded decompression file descriptor issue
+ by using close-on-exec (Denys Vlasenko)
+
+2020-06-27 11:58 Christos Zoulas <christos@zoulas.com>
+
+ * Exclude surrogate pairs from utf-8 detection (Michael Liu)
+
+2020-06-25 12:53 Christos Zoulas <christos@zoulas.com>
+
+ * Include # to the list of ignored format chars (Werner Fink)
+
2020-06-14 20:02 Christos Zoulas <christos@zoulas.com>
* release 5.39
diff --git a/Makefile.am b/Makefile.am
index 2ab67ed7bae5..b10b1cb14daa 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
ACLOCAL_AMFLAGS = -I m4
-EXTRA_DIST = MAINT
+EXTRA_DIST = MAINT RELEASE-PROCEDURE README.DEVELOPER m4/visibility.m4
SUBDIRS = src magic tests doc python
diff --git a/Makefile.in b/Makefile.in
index e19b15e1bfdc..79e1d05b5d73 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -92,7 +92,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
@@ -191,7 +192,7 @@ CSCOPE = cscope
DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(srcdir)/libmagic.pc.in AUTHORS COPYING ChangeLog INSTALL \
- NEWS README TODO compile config.guess config.sub install-sh \
+ NEWS TODO compile config.guess config.sub depcomp install-sh \
ltmain.sh missing
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
@@ -357,7 +358,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I m4
-EXTRA_DIST = MAINT
+EXTRA_DIST = MAINT RELEASE-PROCEDURE README.DEVELOPER m4/visibility.m4
SUBDIRS = src magic tests doc python
# This variable must have 'exec' in its name, in order to be installed
diff --git a/README b/README
deleted file mode 100644
index f69dc43e0fb1..000000000000
--- a/README
+++ /dev/null
@@ -1,159 +0,0 @@
-## README for file(1) Command and the libmagic(3) library ##
-
- @(#) $File: README,v 1.59 2019/09/19 01:04:01 christos Exp $
-
-Mailing List: file@astron.com
-Mailing List archives: http://mailman.astron.com/pipermail/file/
-Bug tracker: http://bugs.astron.com/
-E-mail: christos@astron.com
-Build Status: https://travis-ci.org/file/file
-
-Phone: Do not even think of telephoning me about this program. Send cash first!
-
-This is Release 5.x of Ian Darwin's (copyright but distributable)
-file(1) command, an implementation of the Unix File(1) command.
-It knows the 'magic number' of several thousands of file types.
-This version is the standard "file" command for Linux,
-*BSD, and other systems. (See "patchlevel.h" for the exact release number).
-
-You can download the latest version of the original sources for file from:
-
- ftp://ftp.astron.com/pub/file/
-
-A public read-only git repository of the same sources is available at:
-
- https://github.com/file/file
-
-We are continuously being fuzzed by OSS-FUZZ:
-
- https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:file
-
-The major changes for 5.x are CDF file parsing, indirect magic, name/use
-(recursion) and overhaul in mime and ascii encoding handling.
-
-The major feature of 4.x is the refactoring of the code into a library,
-and the re-write of the file command in terms of that library. The library
-itself, libmagic can be used by 3rd party programs that wish to identify
-file types without having to fork() and exec() file. The prime contributor
-for 4.0 was Mans Rullgard.
-
-UNIX is a trademark of UNIX System Laboratories.
-
-The prime contributor to Release 3.8 was Guy Harris, who put in megachanges
-including byte-order independence.
-
-The prime contributor to Release 3.0 was Christos Zoulas, who put
-in hundreds of lines of source code changes, including his own
-ANSIfication of the code (I liked my own ANSIfication better, but
-his (__P()) is the "Berkeley standard" way of doing it, and I wanted UCB
-to include the code...), his HP-like "indirection" (a feature of
-the HP file command, I think), and his mods that finally got the
-uncompress (-z) mode finished and working.
-
-This release has compiled in numerous environments; see PORTING
-for a list and problems.
-
-This fine freeware file(1) follows the USG (System V) model of the file
-command, rather than the Research (V7) version or the V7-derived 4.[23]
-Berkeley one. That is, the file /etc/magic contains much of the ritual
-information that is the source of this program's power. My version
-knows a little more magic (including tar archives) than System V; the
-/etc/magic parsing seems to be compatible with the (poorly documented)
-System V /etc/magic format (with one exception; see the man page).
-
-In addition, the /etc/magic file is built from a subdirectory
-for easier(?) maintenance. I will act as a clearinghouse for
-magic numbers assigned to all sorts of data files that
-are in reasonable circulation. Send your magic numbers,
-in magic(5) format please, to the maintainer, Christos Zoulas.
-
-COPYING - read this first.
-README - read this second (you are currently reading this file).
-INSTALL - read on how to install
-src/apprentice.c - parses /etc/magic to learn magic
-src/apptype.c - used for OS/2 specific application type magic
-src/ascmagic.c - third & last set of tests, based on hardwired assumptions.
-src/asctime_r.c - replacement for OS's that don't have it.
-src/asprintf.c - replacement for OS's that don't have it.
-src/asctime_r.c - replacement for OS's that don't have it.
-src/asprintf.c - replacement for OS's that don't have it.
-src/buffer.c - buffer handling functions.
-src/cdf.[ch] - parser for Microsoft Compound Document Files
-src/cdf_time.c - time converter for CDF.
-src/compress.c - handles decompressing files to look inside.
-src/ctime_r.c - replacement for OS's that don't have it.
-src/der.[ch] - parser for Distinguished Encoding Rules
-src/dprintf.c - replacement for OS's that don't have it.
-src/elfclass.h - common code for elf 32/64.
-src/encoding.c - handles unicode encodings
-src/file.c - the main program
-src/file.h - header file
-src/file_opts.h - list of options
-src/fmtcheck.c - replacement for OS's that don't have it.
-src/fsmagic.c - first set of tests the program runs, based on filesystem info
-src/funcs.c - utilility functions
-src/getline.c - replacement for OS's that don't have it.
-src/getopt_long.c - replacement for OS's that don't have it.
-src/gmtime_r.c - replacement for OS's that don't have it.
-src/is_csv.c - knows about Comma Separated Value file format (RFC 4180).
-src/is_json.c - knows about JavaScript Object Notation format (RFC 8259).
-src/is_tar.c, tar.h - knows about Tape ARchive format (courtesy John Gilmore).
-src/localtime_r.c - replacement for OS's that don't have it.
-src/magic.h.in - source file for magic.h
-src/mygetopt.h - replacement for OS's that don't have it.
-src/magic.c - the libmagic api
-src/names.h - header file for ascmagic.c
-src/pread.c - replacement for OS's that don't have it.
-src/print.c - print results, errors, warnings.
-src/readcdf.c - CDF wrapper.
-src/readelf.[ch] - Stand-alone elf parsing code.
-src/softmagic.c - 2nd set of tests, based on /etc/magic
-src/mygetopt.h - replacement for OS's that don't have it.
-src/strcasestr.c - replacement for OS's that don't have it.
-src/strlcat.c - replacement for OS's that don't have it.
-src/strlcpy.c - replacement for OS's that don't have it.
-src/strndup.c - replacement for OS's that don't have it.
-src/tar.h - tar file definitions
-src/vasprintf.c - for systems that don't have it.
-doc/file.man - man page for the command
-doc/magic.man - man page for the magic file, courtesy Guy Harris.
- Install as magic.4 on USG and magic.5 on V7 or Berkeley; cf Makefile.
-
-Magdir - directory of /etc/magic pieces
-------------------------------------------------------------------------------
-
-If you submit a new magic entry please make sure you read the following
-guidelines:
-
-- Initial match is preferably at least 32 bits long, and is a _unique_ match
-- If this is not feasible, use additional check
-- Match of <= 16 bits are not accepted
-- Delay printing string as much as possible, don't print output too early
-- Avoid printf arbitrary byte as string, which can be a source of
- crash and buffer overflow
-
-- Provide complete information with entry:
- * One line short summary
- * Optional long description
- * File extension, if applicable
- * Full name and contact method (for discussion when entry has problem)
- * Further reference, such as documentation of format
-
-------------------------------------------------------------------------------
-
-gpg for dummies:
-
-$ gpg --verify file-X.YY.tar.gz.asc file-X.YY.tar.gz
-gpg: assuming signed data in `file-X.YY.tar.gz'
-gpg: Signature made WWW MMM DD HH:MM:SS YYYY ZZZ using DSA key ID KKKKKKKK
-
-To download the key:
-
-$ gpg --keyserver hkp://keys.gnupg.net --recv-keys KKKKKKKK
-
-------------------------------------------------------------------------------
-
-
-Parts of this software were developed at SoftQuad Inc., developers
-of SGML/HTML/XML publishing software, in Toronto, Canada.
-SoftQuad was swallowed up by Corel in 2002 and does not exist any longer.
diff --git a/README.DEVELOPER b/README.DEVELOPER
new file mode 100644
index 000000000000..dfe27b973e8e
--- /dev/null
+++ b/README.DEVELOPER
@@ -0,0 +1,49 @@
+# How to get started developing
+
+@(#) $File: README.DEVELOPER,v 1.9 2021/09/20 14:04:39 christos Exp $
+
+## Auto files
+
+After checking out the source, run the following:
+
+ autoreconf -f -i
+ make distclean # this can fail if you have not built before
+ ./configure --disable-silent-rules
+ make -j4
+ make -C tests check
+
+If you see errors, make sure you have the latest libtool and autoconf
+This has been tested with autoconf-2.69 and libtool-2.4.2
+
+## Installing dependencies
+
+If your platform doesn't have the above tools, install the following
+packages first.
+
+### Debian
+
+ apt-get install \
+ automake \
+ gcc \
+ libtool \
+ make \
+ python \
+ zlib1g-dev \
+
+See also `.travis.yml`.
+
+### Mac OS X (MacPorts)
+
+ port install \
+ autoconf \
+ automake \
+ libtool \
+
+### Mac OS X (HomeBrew)
+
+ brew install autoconf automake libtool
+
+Tested with:
+ autoconf 2.69
+ automake 1.16.1
+ libtool 2.4.6
diff --git a/RELEASE-PROCEDURE b/RELEASE-PROCEDURE
new file mode 100644
index 000000000000..af6ed0fe2b0f
--- /dev/null
+++ b/RELEASE-PROCEDURE
@@ -0,0 +1,29 @@
+# HOW TO RELEASE FILE
+
+@(#) $File: RELEASE-PROCEDURE,v 1.7 2021/10/18 16:38:25 christos Exp $
+
+1) Update version number in configure.ac
+2) Note the new version in ChangeLog
+3) Update README.md if applicable
+4) Commit changes into CVS
+5) Rebuild and run tests (see README.DEVELOPER)
+6) Tag the release with FILEx_yy
+7) Create the source tarball: make distcheck
+7a) Sign the source tarball.
+ gpg --armor --detach-sign mysoftware-0.4.tar.gz
+8) Make the source tarball available on ftp
+9) Add the new version to bugs.astron.com:
+ - Click: Manage > Manage Projects > file
+ - Scroll down to "Versions"
+ - Click on "Edit" next to the HEAD version
+ - Change the "Version" from HEAD to the newly released version
+ - Change the "Date Order" to the current time
+ - Check the "Released" box
+ - Click on "Update Version"
+ - Type HEAD into the box at the bottom of the version list and
+ click on "Add and Edit Version"
+ - Set the "Date Order" to 2030-01-01 (i.e. far in the future)
+ - Click on "Update Version"
+10) Mail an announcement to file@astron.com containing a summary of the
+ ChangeLog changes. Historically we don't mention magic changes in the
+ ChangeLog or the mail message, only source changes.
diff --git a/acinclude.m4 b/acinclude.m4
index dcbf92f50308..77b63ff5cb7b 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -3,8 +3,9 @@ dnl from autoconf 2.13 acspecific.m4, with changes to check for daylight
AC_DEFUN([AC_STRUCT_TIMEZONE_DAYLIGHT],
[AC_REQUIRE([AC_STRUCT_TM])dnl
AC_CACHE_CHECK([for tm_zone in struct tm], ac_cv_struct_tm_zone,
-[AC_TRY_COMPILE([#include <sys/types.h>
-#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_zone;],
+[AC_COMPILE_IFELSE(
+[AC_LANG_PROGRAM([#include <sys/types.h>
+#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_zone;])],
ac_cv_struct_tm_zone=yes, ac_cv_struct_tm_zone=no)])
if test "$ac_cv_struct_tm_zone" = yes; then
AC_DEFINE(HAVE_TM_ZONE,1,[HAVE_TM_ZONE])
@@ -14,19 +15,20 @@ fi
# consider it declared and we won't give our own extern.
AC_CHECK_DECLS([tzname], , , [#include <time.h>])
AC_CACHE_CHECK(for tzname, ac_cv_var_tzname,
-[AC_TRY_LINK(
-[#include <time.h>
-#if !HAVE_DECL_TZNAME
+[AC_LINK_IFELSE(
+[AC_LANG_PROGRAM([#include <time.h>],
+[[#if !HAVE_DECL_TZNAME
extern char *tzname[];
-#endif],
-[return tzname[0][0];], [ac_cv_var_tzname=yes], [ac_cv_var_tzname=no])])
+#endif
+return tzname[0][0];]])], [ac_cv_var_tzname=yes], [ac_cv_var_tzname=no])])
if test $ac_cv_var_tzname = yes; then
AC_DEFINE(HAVE_TZNAME,1,[HAVE_TZNAME])
fi
AC_CACHE_CHECK([for tm_isdst in struct tm], ac_cv_struct_tm_isdst,
-[AC_TRY_COMPILE([#include <sys/types.h>
-#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_isdst;],
+[AC_COMPILE_IFELSE(
+[AC_LANG_PROGRAM([#include <sys/types.h>
+#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_isdst;])],
ac_cv_struct_tm_isdst=yes, ac_cv_struct_tm_isdst=no)])
if test "$ac_cv_struct_tm_isdst" = yes; then
AC_DEFINE(HAVE_TM_ISDST,1,[HAVE_TM_ISDST])
@@ -35,14 +37,12 @@ fi
AC_CHECK_DECLS([daylight], , , [#include <time.h>])
AC_CACHE_CHECK(for daylight, ac_cv_var_daylight,
-[AC_TRY_LINK(
-changequote(<<, >>)dnl
-<<#include <time.h>
-#if !HAVE_DECL_DAYLIGHT
+[AC_LINK_IFELSE(
+[AC_LANG_PROGRAM([#include <time.h>],
+[#if !HAVE_DECL_DAYLIGHT
extern int daylight;
-#endif>>,
-changequote([, ])dnl
-[atoi(daylight);], ac_cv_var_daylight=yes, ac_cv_var_daylight=no)])
+#endif
+atoi(daylight);])], ac_cv_var_daylight=yes, ac_cv_var_daylight=no)])
if test $ac_cv_var_daylight = yes; then
AC_DEFINE(HAVE_DAYLIGHT,1,[HAVE_DAYLIGHT])
fi
@@ -50,7 +50,8 @@ changequote([, ])dnl
AC_DEFUN([AC_STRUCT_OPTION_GETOPT_H],
[AC_CACHE_CHECK([for struct option in getopt], ac_cv_struct_option_getopt_h,
-[AC_TRY_COMPILE([#include <getopt.h>], [struct option op; op.name;],
+[AC_COMPILE_IFELSE(
+[AC_LANG_PROGRAM([#include <getopt.h>], [struct option op; op.name;])],
ac_cv_struct_option_getopt_h=yes, ac_cv_struct_option_getopt_h=no)])
if test "$ac_cv_struct_option_getopt_h" = yes; then
AC_DEFINE(HAVE_STRUCT_OPTION,1,[HAVE_STRUCT_OPTION])
diff --git a/aclocal.m4 b/aclocal.m4
index 08b67b8e7771..41732229cdad 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -20,84 +20,6 @@ You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# visibility.m4 serial 6
-dnl Copyright (C) 2005, 2008, 2010-2019 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-dnl Tests whether the compiler supports the command-line option
-dnl -fvisibility=hidden and the function and variable attributes
-dnl __attribute__((__visibility__("hidden"))) and
-dnl __attribute__((__visibility__("default"))).
-dnl Does *not* test for __visibility__("protected") - which has tricky
-dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
-dnl Mac OS X.
-dnl Does *not* test for __visibility__("internal") - which has processor
-dnl dependent semantics.
-dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
-dnl "really only recommended for legacy code".
-dnl Set the variable CFLAG_VISIBILITY.
-dnl Defines and sets the variable HAVE_VISIBILITY.
-
-AC_DEFUN([gl_VISIBILITY],
-[
- AC_REQUIRE([AC_PROG_CC])
- CFLAG_VISIBILITY=
- HAVE_VISIBILITY=0
- if test -n "$GCC"; then
- dnl First, check whether -Werror can be added to the command line, or
- dnl whether it leads to an error because of some other option that the
- dnl user has put into $CC $CFLAGS $CPPFLAGS.
- AC_CACHE_CHECK([whether the -Werror option is usable],
- [gl_cv_cc_vis_werror],
- [gl_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -Werror"
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM([[]], [[]])],
- [gl_cv_cc_vis_werror=yes],
- [gl_cv_cc_vis_werror=no])
- CFLAGS="$gl_save_CFLAGS"
- ])
- dnl Now check whether visibility declarations are supported.
- AC_CACHE_CHECK([for simple visibility declarations],
- [gl_cv_cc_visibility],
- [gl_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fvisibility=hidden"
- dnl We use the option -Werror and a function dummyfunc, because on some
- dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
- dnl "visibility attribute not supported in this configuration; ignored"
- dnl at the first function definition in every compilation unit, and we
- dnl don't want to use the option in this case.
- if test $gl_cv_cc_vis_werror = yes; then
- CFLAGS="$CFLAGS -Werror"
- fi
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
- extern __attribute__((__visibility__("default"))) int exportedvar;
- extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
- extern __attribute__((__visibility__("default"))) int exportedfunc (void);
- void dummyfunc (void) {}
- ]],
- [[]])],
- [gl_cv_cc_visibility=yes],
- [gl_cv_cc_visibility=no])
- CFLAGS="$gl_save_CFLAGS"
- ])
- if test $gl_cv_cc_visibility = yes; then
- CFLAG_VISIBILITY="-fvisibility=hidden"
- HAVE_VISIBILITY=1
- fi
- fi
- AC_SUBST([CFLAG_VISIBILITY])
- AC_SUBST([HAVE_VISIBILITY])
- AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
- [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
-])
-
# Copyright (C) 2002-2018 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
@@ -1216,4 +1138,5 @@ m4_include([m4/ltoptions.m4])
m4_include([m4/ltsugar.m4])
m4_include([m4/ltversion.m4])
m4_include([m4/lt~obsolete.m4])
+m4_include([m4/visibility.m4])
m4_include([acinclude.m4])
diff --git a/config.h.in b/config.h.in
index 05dcc8ad6462..ec46e2d8fb99 100644
--- a/config.h.in
+++ b/config.h.in
@@ -125,6 +125,9 @@
/* Define to 1 if you have the `newlocale' function. */
#undef HAVE_NEWLOCALE
+/* Define to 1 if you have the `pipe2' function. */
+#undef HAVE_PIPE2
+
/* Define to 1 if you have the `pread' function. */
#undef HAVE_PREAD
diff --git a/configure b/configure
index 24fd1847b279..d6a18d038f4a 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for file 5.39.
+# Generated by GNU Autoconf 2.69 for file 5.41.
#
# Report bugs to <christos@astron.com>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='file'
PACKAGE_TARNAME='file'
-PACKAGE_VERSION='5.39'
-PACKAGE_STRING='file 5.39'
+PACKAGE_VERSION='5.41'
+PACKAGE_STRING='file 5.41'
PACKAGE_BUGREPORT='christos@astron.com'
PACKAGE_URL=''
@@ -1334,7 +1334,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures file 5.39 to adapt to many kinds of systems.
+\`configure' configures file 5.41 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1404,7 +1404,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of file 5.39:";;
+ short | recursive ) echo "Configuration of file 5.41:";;
esac
cat <<\_ACEOF
@@ -1524,7 +1524,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-file configure 5.39
+file configure 5.41
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2180,7 +2180,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by file $as_me 5.39, which was
+It was created by file $as_me 5.41, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3046,7 +3046,7 @@ fi
# Define the identity of the package.
PACKAGE='file'
- VERSION='5.39'
+ VERSION='5.41'
cat >>confdefs.h <<_ACEOF
@@ -3401,69 +3401,6 @@ fi
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
-$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
-cat > confinc.mk << 'END'
-am__doit:
- @echo this is the am__doit target >confinc.out
-.PHONY: am__doit
-END
-am__include="#"
-am__quote=
-# BSD make does it like this.
-echo '.include "confinc.mk" # ignored' > confmf.BSD
-# Other make implementations (GNU, Solaris 10, AIX) do it like this.
-echo 'include confinc.mk # ignored' > confmf.GNU
-_am_result=no
-for s in GNU BSD; do
- { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
- (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
- case $?:`cat confinc.out 2>/dev/null` in #(
- '0:this is the am__doit target') :
- case $s in #(
- BSD) :
- am__include='.include' am__quote='"' ;; #(
- *) :
- am__include='include' am__quote='' ;;
-esac ;; #(
- *) :
- ;;
-esac
- if test "$am__include" != "#"; then
- _am_result="yes ($s style)"
- break
- fi
-done
-rm -f confinc.* confmf.*
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
-$as_echo "${_am_result}" >&6; }
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
- enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
- am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
- AMDEP_TRUE=
- AMDEP_FALSE='#'
-else
- AMDEP_TRUE='#'
- AMDEP_FALSE=
-fi
-
-
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -4311,6 +4248,69 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
depcc="$CC" am_compiler_list=
@@ -4440,298 +4440,6 @@ else
fi
- case $ac_cv_prog_cc_stdc in #(
- no) :
- ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #(
- *) :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
-$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
-if ${ac_cv_prog_cc_c99+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c99=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdio.h>
-
-// Check varargs macros. These examples are taken from C99 6.10.3.5.
-#define debug(...) fprintf (stderr, __VA_ARGS__)
-#define showlist(...) puts (#__VA_ARGS__)
-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
-static void
-test_varargs_macros (void)
-{
- int x = 1234;
- int y = 5678;
- debug ("Flag");
- debug ("X = %d\n", x);
- showlist (The first, second, and third items.);
- report (x>y, "x is %d but y is %d", x, y);
-}
-
-// Check long long types.
-#define BIG64 18446744073709551615ull
-#define BIG32 4294967295ul
-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
-#if !BIG_OK
- your preprocessor is broken;
-#endif
-#if BIG_OK
-#else
- your preprocessor is broken;
-#endif
-static long long int bignum = -9223372036854775807LL;
-static unsigned long long int ubignum = BIG64;
-
-struct incomplete_array
-{
- int datasize;
- double data[];
-};
-
-struct named_init {
- int number;
- const wchar_t *name;
- double average;
-};
-
-typedef const char *ccp;
-
-static inline int
-test_restrict (ccp restrict text)
-{
- // See if C++-style comments work.
- // Iterate through items via the restricted pointer.
- // Also check for declarations in for loops.
- for (unsigned int i = 0; *(text+i) != '\0'; ++i)
- continue;
- return 0;
-}
-
-// Check varargs and va_copy.
-static void
-test_varargs (const char *format, ...)
-{
- va_list args;
- va_start (args, format);
- va_list args_copy;
- va_copy (args_copy, args);
-
- const char *str;
- int number;
- float fnumber;
-
- while (*format)
- {
- switch (*format++)
- {
- case 's': // string
- str = va_arg (args_copy, const char *);
- break;
- case 'd': // int
- number = va_arg (args_copy, int);
- break;
- case 'f': // float
- fnumber = va_arg (args_copy, double);
- break;
- default:
- break;
- }
- }
- va_end (args_copy);
- va_end (args);
-}
-
-int
-main ()
-{
-
- // Check bool.
- _Bool success = false;
-
- // Check restrict.
- if (test_restrict ("String literal") == 0)
- success = true;
- char *restrict newvar = "Another string";
-
- // Check varargs.
- test_varargs ("s, d' f .", "string", 65, 34.234);
- test_varargs_macros ();
-
- // Check flexible array members.
- struct incomplete_array *ia =
- malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
- ia->datasize = 10;
- for (int i = 0; i < ia->datasize; ++i)
- ia->data[i] = i * 1.234;
-
- // Check named initializers.
- struct named_init ni = {
- .number = 34,
- .name = L"Test wide string",
- .average = 543.34343,
- };
-
- ni.number = 58;
-
- int dynamic_array[ni.number];
- dynamic_array[ni.number - 1] = 543;
-
- // work around unused variable warnings
- return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
- || dynamic_array[ni.number - 1] != 543);
-
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c99=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c99" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c99" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c99"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
-$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c99" != xno; then :
- ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
- ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
-else
- ac_cv_prog_cc_stdc=no
-fi
-
-fi
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5
-$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; }
- if ${ac_cv_prog_cc_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-
- case $ac_cv_prog_cc_stdc in #(
- no) :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;; #(
- '') :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;; #(
- *) :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5
-$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;;
-esac
-
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@@ -13022,12 +12730,13 @@ CC=$lt_save_CC
if test -n "$GCC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
$as_echo_n "checking whether the -Werror option is usable... " >&6; }
-if ${gl_cv_cc_vis_werror+:} false; then :
+ if ${gl_cv_cc_vis_werror+:} false; then :
$as_echo_n "(cached) " >&6
else
- gl_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -Werror"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -13044,28 +12753,29 @@ else
gl_cv_cc_vis_werror=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$gl_save_CFLAGS"
-
+ CFLAGS="$gl_save_CFLAGS"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
$as_echo "$gl_cv_cc_vis_werror" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
$as_echo_n "checking for simple visibility declarations... " >&6; }
-if ${gl_cv_cc_visibility+:} false; then :
+ if ${gl_cv_cc_visibility+:} false; then :
$as_echo_n "(cached) " >&6
else
- gl_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fvisibility=hidden"
- if test $gl_cv_cc_vis_werror = yes; then
- CFLAGS="$CFLAGS -Werror"
- fi
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ if test $gl_cv_cc_vis_werror = yes; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
- extern __attribute__((__visibility__("default"))) int exportedvar;
- extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
- extern __attribute__((__visibility__("default"))) int exportedfunc (void);
- void dummyfunc (void) {}
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ void dummyfunc (void) {}
int
main ()
@@ -13081,10 +12791,10 @@ else
gl_cv_cc_visibility=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$gl_save_CFLAGS"
-
+ CFLAGS="$gl_save_CFLAGS"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
$as_echo "$gl_cv_cc_visibility" >&6; }
if test $gl_cv_cc_visibility = yes; then
CFLAG_VISIBILITY="-fvisibility=hidden"
@@ -13099,118 +12809,6 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines makedev" >&5
$as_echo_n "checking whether sys/types.h defines makedev... " >&6; }
if ${ac_cv_header_sys_types_h_makedev+:} false; then :
@@ -13605,12 +13203,12 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <time.h>
-#if !HAVE_DECL_TZNAME
-extern char *tzname[];
-#endif
int
main ()
{
+#if !HAVE_DECL_TZNAME
+extern char *tzname[];
+#endif
return tzname[0][0];
;
return 0;
@@ -13685,12 +13283,12 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <time.h>
-#if !HAVE_DECL_DAYLIGHT
-extern int daylight;
-#endif
int
main ()
{
+#if !HAVE_DECL_DAYLIGHT
+extern int daylight;
+#endif
atoi(daylight);
;
return 0;
@@ -14692,7 +14290,7 @@ fi
fi
-for ac_func in strndup mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale memmem
+for ac_func in strndup mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale memmem pipe2
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -15712,7 +15310,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by file $as_me 5.39, which was
+This file was extended by file $as_me 5.41, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -15778,7 +15376,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-file config.status 5.39
+file config.status 5.41
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 64c9f42e3c98..ccc57e13343d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT([file],[5.39],[christos@astron.com])
+AC_INIT([file],[5.41],[christos@astron.com])
AM_INIT_AUTOMAKE([subdir-objects foreign])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -88,7 +88,7 @@ AM_CONDITIONAL(FSECT5, test x$fsect = x5)
AC_SUBST(WARNINGS)
dnl Checks for programs.
-AC_PROG_CC_STDC
+AC_PROG_CC
AC_USE_SYSTEM_EXTENSIONS
AM_PROG_CC_C_O
AC_C_BIGENDIAN
@@ -97,7 +97,6 @@ AC_PROG_LN_S
LT_INIT([disable-static pic-only])
gl_VISIBILITY
dnl Checks for headers
-AC_HEADER_STDC
AC_HEADER_MAJOR
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(stdint.h fcntl.h inttypes.h unistd.h)
@@ -166,7 +165,7 @@ else
fi])
dnl Checks for functions
-AC_CHECK_FUNCS(strndup mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale memmem)
+AC_CHECK_FUNCS(strndup mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale memmem pipe2)
dnl Provide implementation of some required functions if necessary
AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline ctime_r asctime_r localtime_r gmtime_r pread strcasestr fmtcheck dprintf)
diff --git a/doc/Makefile.in b/doc/Makefile.in
index ce52b6812914..9f8eb471371c 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -91,7 +91,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
diff --git a/doc/file.man b/doc/file.man
index afba71e6692b..0fbe2bad9b89 100644
--- a/doc/file.man
+++ b/doc/file.man
@@ -1,5 +1,5 @@
-.\" $File: file.man,v 1.140 2020/06/07 17:41:07 christos Exp $
-.Dd June 7, 2020
+.\" $File: file.man,v 1.144 2021/02/05 22:08:31 christos Exp $
+.Dd February 5, 2021
.Dt FILE __CSECTION__
.Os
.Sh NAME
@@ -59,7 +59,7 @@ or non-printable).
Exceptions are well-known file formats (core files, tar archives)
that are known to contain binary data.
When modifying magic files or the program itself, make sure to
-.Em "preserve these keywords" .
+.Em preserve these keywords .
Users depend on knowing that all the readable files in a directory
have the word
.Dq text
@@ -91,14 +91,14 @@ and possibly
.In exec.h
in the standard include directory.
These files have a
-.Dq "magic number"
+.Dq magic number
stored in a particular place
near the beginning of the file that tells the
.Tn UNIX
operating system
that the file is a binary executable, and which of several types thereof.
The concept of a
-.Dq "magic"
+.Dq magic number
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.
@@ -168,7 +168,9 @@ in any of the character sets listed above is simply said to be
.Sh OPTIONS
.Bl -tag -width indent
.It Fl Fl apple
-Causes the file command to output the file type and creator code as
+Causes the
+.Nm
+command to output the file type and creator code as
used by older MacOS versions.
The code consists of eight letters,
the first describing the file type, the latter the creator.
@@ -184,7 +186,7 @@ output file that contains a pre-parsed version of the magic file or directory.
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.
+option to debug a new magic file before installing it.
.It Fl d
Prints internal debugging information to stderr.
.It Fl E
@@ -236,7 +238,7 @@ Like
but ignore tests that
.Nm
does not know about.
-This is intended for compatilibity with older versions of
+This is intended for compatibility with older versions of
.Nm .
.It Fl Fl extension
Print a slash-separated list of valid extensions for the file type found.
@@ -270,13 +272,15 @@ the list of files, like:
instead of:
.Dq Fl f Ar namefile Fl F Ar @ .
.It Fl h , Fl Fl no-dereference
-option causes symlinks not to be followed
+This 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 , Fl Fl mime
-Causes the file command to output mime type strings rather than the more
+Causes the
+.Nm
+command to output mime type strings rather than the more
traditional human readable ones.
Thus it may say
.Sq text/plain; charset=us-ascii
@@ -306,7 +310,7 @@ which is used for the matching (see also the
.Fl k
option).
.It Fl L , Fl Fl dereference
-option causes symlinks to be followed, as the like-named option in
+This 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
@@ -339,6 +343,7 @@ Set various parameter limits.
.It Li elf_notes Ta 256 Ta max ELF notes processed
.It Li elf_phnum Ta 2048 Ta max ELF program sections processed
.It Li elf_shnum Ta 32768 Ta max ELF sections processed
+.It Li encoding Ta 65536 Ta max number of bytes to scan for encoding evaluation
.It Li indir Ta 50 Ta recursion limit for indirect magic
.It Li name Ta 50 Ta use count limit for name/use magic
.It Li regex Ta 8192 Ta length limit for regex searches
@@ -373,11 +378,13 @@ On systems where libseccomp
.Pa ( https://github.com/seccomp/libseccomp )
is available, the
.Fl S
-flag disables sandboxing which is enabled by default.
-This option is needed for file to execute external decompressing programs,
+option disables sandboxing which is enabled by default.
+This option is needed for
+.Nm
+to execute external decompressing programs,
i.e. when the
.Fl z
-flag is specified and the built-in decompressors are not available.
+option is specified and the built-in decompressors are not available.
On systems where sandboxing is not available, this option has no effect.
.It Fl v , Fl Fl version
Print the version of the program and exit.
@@ -456,9 +463,9 @@ The file type cannot be determined
.Sh EXAMPLES
.Bd -literal -offset indent
$ 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
+file.c: C program text
+file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
+ dynamically linked (uses shared libs), stripped
/dev/wd0a: block special (0/0)
/dev/hda: block special (3/0)
@@ -480,8 +487,8 @@ $ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
/dev/hda10: empty
$ file -i file.c file /dev/{wd0a,hda}
-file.c: text/x-c
-file: application/x-executable
+file.c: text/x-c
+file: application/x-executable
/dev/hda: application/x-not-regular-file
/dev/wd0a: application/x-not-regular-file
@@ -506,7 +513,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
-\*[Gt]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
@@ -553,7 +560,7 @@ option.
To enable execution of external decompressors, one needs to disable
sandboxing using the
.Fl S
-flag.
+option.
.Sh MAGIC DIRECTORY
The magic file entries have been collected from various sources,
mainly USENET, and contributed by various authors.
@@ -665,7 +672,7 @@ and printing \e012- between entries is clumsy and complicated; refactor
and centralize.
.Pp
Some of the encoding logic is hard-coded in encoding.c and can be moved
-to the magic files if we had a !:charset annotation
+to the magic files if we had a !:charset annotation.
.Pp
Continue to squash all magic bugs.
See Debian BTS for a good source.
@@ -718,9 +725,13 @@ If the offsets specified internally in the file exceed the buffer size
.Dv HOWMANY
variable in file.h), then we don't seek to that offset, but we give up.
It would be better if buffer managements was done when the file descriptor
-is available so move around the file.
-One must be careful though because this has performance (and thus security
-considerations).
+is available so we can seek around the file.
+One must be careful though because this has performance and thus security
+considerations, because one can slow down things by repeateadly seeking.
+.Pp
+There is support now for keeping separate buffers and having offsets from
+the end of the file, but the internal buffer management still needs an
+overhaul.
.Sh AVAILABILITY
You can obtain the original author's latest version by anonymous FTP
on
diff --git a/doc/magic.man b/doc/magic.man
index f2b69896fae7..daa394aec339 100644
--- a/doc/magic.man
+++ b/doc/magic.man
@@ -1,5 +1,5 @@
-.\" $File: magic.man,v 1.98 2020/05/09 18:55:23 christos Exp $
-.Dd May 9, 2020
+.\" $File: magic.man,v 1.99 2021/05/09 22:37:23 christos Exp $
+.Dd May 9, 2021
.Dt MAGIC __FSECTION__
.Os
.\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems.
@@ -69,7 +69,7 @@ A 64-bit double precision IEEE floating point number in this machine's native by
.It Dv string
A string of bytes.
The string type specification can be optionally followed
-by /[WwcCtbT]*.
+by /[WwcCtbTf]*.
The
.Dq W
flag compacts whitespace in the target, which must
@@ -83,6 +83,9 @@ The
.Dq w
flag treats every blank in the magic as an optional blank.
The
+.Dq f
+flags requires that the matched string is a full word, not a partial word match.
+The
.Dq c
flag specifies case insensitive matching: lower case
characters in the magic match both lower and upper case characters in the
diff --git a/ltmain.sh b/ltmain.sh
index ffabee228c13..ffabee228c13 100755..100644
--- a/ltmain.sh
+++ b/ltmain.sh
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644
index 000000000000..7b24d39e683a
--- /dev/null
+++ b/m4/visibility.m4
@@ -0,0 +1,77 @@
+# visibility.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2005, 2008, 2010-2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ dnl First, check whether -Werror can be added to the command line, or
+ dnl whether it leads to an error because of some other option that the
+ dnl user has put into $CC $CFLAGS $CPPFLAGS.
+ AC_MSG_CHECKING([whether the -Werror option is usable])
+ AC_CACHE_VAL([gl_cv_cc_vis_werror], [
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [gl_cv_cc_vis_werror=yes],
+ [gl_cv_cc_vis_werror=no])
+ CFLAGS="$gl_save_CFLAGS"])
+ AC_MSG_RESULT([$gl_cv_cc_vis_werror])
+ dnl Now check whether visibility declarations are supported.
+ AC_MSG_CHECKING([for simple visibility declarations])
+ AC_CACHE_VAL([gl_cv_cc_visibility], [
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ dnl We use the option -Werror and a function dummyfunc, because on some
+ dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
+ dnl "visibility attribute not supported in this configuration; ignored"
+ dnl at the first function definition in every compilation unit, and we
+ dnl don't want to use the option in this case.
+ if test $gl_cv_cc_vis_werror = yes; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ void dummyfunc (void) {}
+ ]],
+ [[]])],
+ [gl_cv_cc_visibility=yes],
+ [gl_cv_cc_visibility=no])
+ CFLAGS="$gl_save_CFLAGS"])
+ AC_MSG_RESULT([$gl_cv_cc_visibility])
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+ AC_SUBST([CFLAG_VISIBILITY])
+ AC_SUBST([HAVE_VISIBILITY])
+ AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+ [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/magic/Magdir/acorn b/magic/Magdir/acorn
index 4aa34551a74b..37a4ed79e56e 100644
--- a/magic/Magdir/acorn
+++ b/magic/Magdir/acorn
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: acorn,v 1.7 2019/04/19 00:42:27 christos Exp $
+# $File: acorn,v 1.8 2021/04/26 15:56:00 christos Exp $
# acorn: file(1) magic for files found on Acorn systems
#
@@ -90,13 +90,13 @@
# null terminated root directory object like IDEFS::IDE-4.$.Apps.GRAPHICS.!XFMPdemo
>>>9 string x \b, root "%s"
# load address 0xFFFtttdd, ttt is the object filetype and dddddddddd is time
->>>>&1 ulelong x \b, load address 0x%x
+>>>>&1 ulelong x \b, load address %#x
# execution address 0xdddddddd dddddddddd is 40 bit unsigned centiseconds since 1.1.1900 UTC
->>>>&5 ulelong x \b, exec address 0x%x
+>>>>&5 ulelong x \b, exec address %#x
# attributes (bits: 0~owner read,1~owner write,3~no delete,4~public read,5~public write)
->>>>&9 ulelong x \b, attributes 0x%x
+>>>>&9 ulelong x \b, attributes %#x
# number of entries in this directory. for root dir 0
-#>>>&13 ulelong x \b, entries 0x%x
+#>>>&13 ulelong x \b, entries %#x
# the entries start here with object name
>>>>&17 string x \b, 1st object "%s"
diff --git a/magic/Magdir/aes b/magic/Magdir/aes
new file mode 100644
index 000000000000..e5e1edcb1350
--- /dev/null
+++ b/magic/Magdir/aes
@@ -0,0 +1,29 @@
+
+#------------------------------------------------------------------------------
+# $File: aes,v 1.1 2020/08/18 21:20:22 christos Exp $
+#
+# aes: magic file for AES encrypted files
+
+# Summary: AES Crypt Encrypted Data File
+# From: Joerg Jenderek
+# URL: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
+# Reference: https://www.aescrypt.com/aes_file_format.html
+0 string AES
+>3 ubyte <3 AES encrypted data, version %u
+#!:mime application/aes
+!:mime application/x-aes-encrypted
+!:ext aes
+# For Version 2 the encrypted file can have text tags
+>>3 ubyte =2
+# length of an extension identifier and contents like: 0 24 33 38
+#>>5 ubeshort x \b, tag length %u
+#>>5 pstring/H x '%s'
+# standard extension tags like CREATED_BY
+>>>7 string CREATED_BY \b, created by
+# software product, manufacturer like "SharpAESCrypt v1.3.3.0" "aescrypt (Windows GUI) 3.10" ...
+>>>>&1 string x "%s"
+# TODO: more other tags
+# tag CREATED_DATE like YYYY-MM-DD
+# tag CREATED_TIME like HH:MM:SS
+#
+
diff --git a/magic/Magdir/algol68 b/magic/Magdir/algol68
index 3675b840e3b6..77016778ad78 100644
--- a/magic/Magdir/algol68
+++ b/magic/Magdir/algol68
@@ -1,19 +1,41 @@
#------------------------------------------------------------------------------
-# $File: algol68,v 1.3 2018/10/19 01:04:21 christos Exp $
+# $File: algol68,v 1.4 2021/08/15 06:00:55 christos Exp $
# algol68: file(1) magic for Algol 68 source
#
-0 search/8192 (input, Algol 68 source text
-!:mime text/x-Algol68
-0 regex/1024 \^PROC Algol 68 source text
-!:mime text/x-Algol68
-0 regex/1024 \bMODE[\t\ ] Algol 68 source text
-!:mime text/x-Algol68
-0 regex/1024 \bREF[\t\ ] Algol 68 source text
-!:mime text/x-Algol68
-0 regex/1024 \bFLEX[\t\ ]\*\\[ Algol 68 source text
+# URL: https://en.wikipedia.org/wiki/ALGOL_68
+# Reference: http://www.softwarepreservation.org/projects/ALGOL/report/Algol68_revised_report-AB.pdf
+# Update: Joerg Jenderek
+0 search/8192 (input,
+>0 use algol_68
+# graph_2d.a68
+0 regex/4006 \^PROC
+#>&-4 string x \b, dBase or Algol "%s"
+# most xBase scripts *.prg with PROCEDURE like: Areacode BarCount Def_mens Vendors
+#>&-4 string =PROCEDURE \b, dBase PROCEDURE
+# skip xBase program scripts *.prg with PROCEDURE keyword
+# keyword proc probably followed by white space used to specify algol procedures
+>&-4 string !PROCEDURE
+>>0 use algol_68
+0 regex/1024 \bMODE[\t\ ]
+>0 use algol_68
+0 regex/1024 \bMODE[\t\ ]
+>0 use algol_68
+0 regex/1024 \bREF[\t\ ]
+>0 use algol_68
+0 regex/1024 \bFLEX[\t\ ]\*\\[
+>0 use algol_68
+
+# display information like mime type and file name extension of Algol 68 source text
+0 name algol_68 Algol 68 source text
!:mime text/x-Algol68
+# https://file-extension.net/seeker/file_extension_a68
+!:ext a68
+#!:ext a68/alg
+
#0 regex [\t\ ]OD Algol 68 source text
+#>0 use algol_68
#!:mime text/x-Algol68
#0 regex [\t\ ]FI Algol 68 source text
+#>0 use algol_68
#!:mime text/x-Algol68
diff --git a/magic/Magdir/amigaos b/magic/Magdir/amigaos
index e719921ef39f..fdd947fdf7f5 100644
--- a/magic/Magdir/amigaos
+++ b/magic/Magdir/amigaos
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: amigaos,v 1.17 2018/10/16 18:57:19 christos Exp $
+# $File: amigaos,v 1.20 2021/09/20 00:42:19 christos Exp $
# amigaos: file(1) magic for AmigaOS binary formats:
#
@@ -40,7 +40,62 @@
#26 string V.2 Brian Postma's Soundmon Module sound file v2
# The following are from: "Stefan A. Haubenthal" <polluks@web.de>
-0 beshort 0x0f00 AmigaOS bitmap font
+# Update: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/Amiga_bitmap_font
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/f/font-amiga.trid.xml
+# https://wiki.amigaos.net/wiki/Graphics_Library_and_Text
+# fch_FileID=FCH_ID=0x0f00
+0 beshort 0x0f00
+# skip some AVM powerline firmware images by check for positive number of font elements
+# https://download.avm.de/fritzpowerline/fritzpowerline-1000e-t/other/fritz.os/fritz.powerline_1000ET_01_05.image
+>2 ubeshort >0 AmigaOS bitmap font
+#!:mime application/octet-stream
+!:mime font/x-amiga-font
+!:ext font
+# struct FontContents fch_FC; 1st fc_FileName [MAXFONTPATH=256]; ~ filename "/" fc_YSize
+# like: topazb/6 suits/8 Excel/9e emerald/17 Franklin/23 DIAMONDS/60.8C
+>>4 string x "%.256s"
+# fc_YSize ~number after slash in fc_FileName; like: 6 7 8 9 11 12 16 17 21 23 45 60
+>>260 beshort x \b, fc_YSize %u
+# fch_NumEntries; number of FontContents elements like:
+# 1 (often) 2 3 (IconCondensed.font tempfont.font) 4 (Franklin.font) 6 (mcoop.font)
+>>2 ubeshort >1 \b, %u elements
+#>>2 beshort x \b, %u element
+# plural s
+#>>2 beshort !1 \bs
+# like: 6 7 8 9 11 12 16 17 21 23 45 60
+#>>262 beshort x \b, FLAGS_STYLE
+>>2 beshort >1 \b, 2nd
+# 2nd fc_FileName like: Franklin/36
+>>>264 string x "%.256s"
+>>2 beshort >2 \b, 3rd
+# 3rd fc_FileName like: Franklin/18
+>>>524 string x "%.256s"
+# URL: http://fileformats.archiveteam.org/wiki/Amiga_bitmap_font
+# Reference: https://wiki.amigaos.net/wiki/Graphics_Library_and_Text
+# http://mark0.net/download/triddefs_xml.7z/defs/f/font-amiga-var2.trid.xml
+# Note: called by TrID "Amiga bitmap Font (var.2)"
+# fch_FileID=TFCH_ID=0x0f02
+0 beshort 0x0f02
+# skip possible misidentified foo by check for positive number of font elements
+>2 ubeshort >0 AmigaOS bitmap font (TFCH)
+#!:mime application/octet-stream
+!:mime font/x-amiga-font
+!:ext font
+# struct TFontContents fch_TFC[]; 1st tfc_FileName [254]; ~ filename "/" fc_YSize
+# like: Abbey/45 XScript/75 XTriumvirate/45
+>>4 string x "%.254s"
+# tfc_TagCount; including the TAG_END tag like: 4
+>>258 ubeshort x \b, tfc_TagCount %u
+# tfc_YSize ~number after slash in tfc_FileName; like: 45 75
+>>260 beshort x \b, tfc_YSize %u
+# tfc_Style; tfc_Flags like: 8022h 8222h
+#>>262 ubeshort x \b, FLAGS_STYLE %#x
+# fch_NumEntries; number of FontContents elements like: 1 (abbey.font) 2 (xscript.font xtriumvirate.font)
+>>2 ubeshort >1 \b, %u elements
+>>2 beshort >1 \b, 2nd
+# 2nd tfc_FileName like: XScript/45 XTriumvirate/30
+>>>264 string x "%.254s"
0 beshort 0x0f03 AmigaOS outline font
0 belong 0x80001001 AmigaOS outline tag
0 string ##\ version catalog translation
@@ -49,15 +104,91 @@
0 string/c @database AmigaGuide file
# Amiga disk types
+# display information like volume name of root block on Amiga (floppy) disk
+0 name adf-rootblock
+# block primary type = T_HEADER (value 2)
+>0x000 ubelong !2 \b, type %u
+# header_key; unused in rootblock (value 0)
+>0x004 ubelong !0 \b, header_key %u
+# high_seq; unused (value 0)
+>0x008 ubelong !0 \b, high_seq %u
+# ht_size; hash table size; 0x48 for flopies
+>0x00c ubelong !0x48 \b, hash table size %#x
+# bm_flag; bitmap flag, -1 means VALID
+>0x138 belong !-1 \b, bitmap flag %#x
+# bm_ext; first bitmap extension block (Hard disks only)
+>0x1A0 ubelong !0 \b, bitmap extension block %#x
+# name_len; volume name length; diskname[30]; volume name
+>0x1B0 pstring >\0 \b, "%s"
+# first directory cache block for FFS; otherwise 0
+>0x1F8 ubelong !0 \b, directory cache block %#x
+# block secondary type = ST_ROOT (value 1)
+>0x1FC ubelong !1 \b, sec_type %#x
#
0 string RDSK Rigid Disk Block
>160 string x on %.24s
-0 string DOS\0 Amiga DOS disk
-0 string DOS\1 Amiga FFS disk
-0 string DOS\2 Amiga Inter DOS disk
-0 string DOS\3 Amiga Inter FFS disk
-0 string DOS\4 Amiga Fastdir DOS disk
-0 string DOS\5 Amiga Fastdir FFS disk
+# URL: http://fileformats.archiveteam.org/wiki/ADF_(Amiga)
+# https://en.wikipedia.org/wiki/Amiga_Fast_File_System
+# Reference: http://lclevy.free.fr/adflib/adf_info.html
+# Update: Joerg Jenderek
+# Note: created by ADFOpus.exe
+# and verified by `unadf -l TURBO_SILVER_SV.ADF`
+0 string DOS
+# skip DOS Client Message Files like IPXODI.MSG DOSRQSTR.MSG
+>3 ubyte <8 Amiga
+# https://reposcope.com/mimetype/application/x-amiga-disk-format
+!:mime application/x-amiga-disk-format
+!:ext adf
+>>3 ubyte 0 DOS disk
+>>3 ubyte 1 FFS disk
+>>3 ubyte 2 Inter DOS disk
+>>3 ubyte 3 Inter FFS disk
+# For Fastdir mode the international mode is also enabled,
+>>3 ubyte 4 Fastdir DOS disk
+>>3 ubyte 5 Fastdir FFS dis
+# called by TrID "Amiga Disk image File (OFS+INTL+DIRC)"
+>>3 ubyte 6 Inter Fastdir DOS disk
+# called by TrID "Amiga Disk image File (FFS+INTL+DIRC)"
+>>3 ubyte 7 Inter Fastdir FFS disk
+# but according to Wikipedia variants with long name support
+#>>3 ubyte 6 long name DOS disk
+#>>3 ubyte 7 long name FFS disk
+# DOES NOT only work! Partly for file size ~< FILE_BYTES_MAX=1 MiB defined in ../../src/file.h
+#>>-0 offset x \b, %lld bytes
+# Correct file size, but next lines are NOT executed
+#>>-0 offset 901120 (DD 880 KiB floppy)
+# 880 KiB Double Density floppy disk by characteristic hash table size 0x48 and T_HEADER=2
+>>0x6E00C ubelong 0x48
+>>>0x6E000 ubelong 2 (DD 880 KiB)
+# 1760 KiB High Density floppy disk (1802240 bytes) by characteristic hash table size 0x48
+>>0xDC00C ubelong 0x48
+>>>0xDC000 ubelong 2 (HD 1760 KiB)
+# Chksum; special block checksum like: 0 0x44ccf4c0 0x51f32cac 0xe33d0e7d ...
+#>>4 ubelong x \b, CRC %#x
+# Rootblock: 0 880 (often for DD and HD) 1146049280 (IMAGINE_1_0_DISK_01.ADF TURBO_SILVER_SV.ADF)
+>>8 ubelong >0 \b, probably root block %d
+# bootblock code
+>>12 quad !0 \b, bootable
+# assembler instructions: lea exp(pc),a1; moveq 25h,d0; jsr -552(a6)
+>>>12 ubequad =0x43fa003e70254eae AmigaDOS 3.0
+>>>12 default x
+>>>>12 ubequad !0x43fa003e70254eae %#llx..
+# 880 KiB Double Density floppy disk (901120 bytes)
+>>0x6E00C ubelong 0x48
+>>>0x6E000 ubelong 2
+>>>>0x6E000 use adf-rootblock
+# 1760 KiB High Density floppy disk (1802240 bytes)
+>>0xDC00C ubelong 0x48
+>>>0xDC000 ubelong 2
+>>>>0xDC000 use adf-rootblock
+# 1 MiB hard disc by test for T_HEADER=2 and header_key=0=high_seq
+>>0x80000 ubelong 2
+>>>0x80004 quad 0
+>>>>0x80000 use adf-rootblock
+# 2 MiB hard disc; only works if in ../../src/file.h FILE_BYTES_MAX is raised to 2 MiB
+#>>0x100000 ubelong x 2 MiB TEST
+#>>0x100000 ubelong 2 \b, 2 MiB hard disc rootblock
+#>>>0x100000 use adf-rootblock
0 string KICK Kickstart disk
# From: Alex Beregszaszi <alex@fsn.hu>
diff --git a/magic/Magdir/android b/magic/Magdir/android
index 1265d95925a7..63296d0ecfc5 100644
--- a/magic/Magdir/android
+++ b/magic/Magdir/android
@@ -1,6 +1,6 @@
#------------------------------------------------------------
-# $File: android,v 1.16 2019/11/15 21:03:14 christos Exp $
+# $File: android,v 1.19 2021/04/26 15:56:00 christos Exp $
# Various android related magic entries
#------------------------------------------------------------
@@ -24,11 +24,11 @@
>>1028 lelong 0 \b (boot)
>>1028 lelong 1 \b (recovery)
>8 lelong >0 \b, kernel
->>12 lelong >0 \b (0x%x)
+>>12 lelong >0 \b (%#x)
>16 lelong >0 \b, ramdisk
->>20 lelong >0 \b (0x%x)
+>>20 lelong >0 \b (%#x)
>24 lelong >0 \b, second stage
->>28 lelong >0 \b (0x%x)
+>>28 lelong >0 \b (%#x)
>36 lelong >0 \b, page size: %d
>38 string >0 \b, name: %s
>64 string >0 \b, cmdline (%s)
@@ -64,7 +64,7 @@
# look for backup content after line with encryption info
#>>19 search/7 \n
# data part after header for not encrypted Android Backup
-#>>>&0 ubequad x \b, content 0x%16.16llx...
+#>>>&0 ubequad x \b, content %#16.16llx...
# look for zlib compressed by ./compress after message with 1 space at end
#>>>&0 indirect x \b; contains
# look for tar archive block by ./archive for package name manifest
@@ -155,9 +155,9 @@
# flags
>>>0x0C ulelong&0x00000002 2 \b+RW
# partition ID:
-# 0~IPL,MOVINAND,GANG;1~PIT,GPT;2~HIDDEN;3~SBL,HIDDEN;4~SBL2,HIDDEN;5~BOOT;6~KENREl,RECOVER,misc;7~RECOVER
+# 0~IPL,MOVINAND,GANG;1~PIT,GPT;2~HIDDEN;3~SBL,HIDDEN;4~SBL2,HIDDEN;5~BOOT;6~kernel,RECOVER,misc;7~RECOVER
# ;11~MODEM;20~efs;21~PARAM;22~FACTORY,SYSTEM;23~DBDATAFS,USERDATA;24~CACHE;80~BOOTLOADER;81~TZSW
->>>0x08 ulelong x (0x%x)
+>>>0x08 ulelong x (%#x)
# filename
>>>0x44 string >\0 "%-.64s"
#>>>0x18 ulelong >0
@@ -188,3 +188,22 @@
0 lelong 0xd0b5b1c4 Android cryptfs footer
>4 leshort x \b, version: %d
>6 leshort x \b.%d
+
+# Android Vdex format
+# From https://android.googlesource.com/\
+# platform/art/+/master/runtime/vdex_file.h
+0 string vdex Android vdex file,
+>4 string >000 verifier deps version: %s,
+>8 string >000 dex section version: %s,
+>12 lelong >0 number of dex files: %d,
+>16 lelong >0 verifier deps size: %d
+
+# Android Vdex format, dexfile is currently being updated
+# by android system
+# From https://android.googlesource.com/\
+# platform/art/+/master/dex2oat/dex2oat.cc
+0 string wdex Android vdex file, being processed by dex2oat,
+>4 string >000 verifier deps version: %s,
+>8 string >000 dex section version: %s,
+>12 lelong >0 number of dex files: %d,
+>16 lelong >0 verifier deps size: %d
diff --git a/magic/Magdir/animation b/magic/Magdir/animation
index 470fdb6f3a6e..d59497d8005a 100644
--- a/magic/Magdir/animation
+++ b/magic/Magdir/animation
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: animation,v 1.77 2020/04/26 15:23:43 christos Exp $
+# $File: animation,v 1.87 2021/08/24 09:25:11 christos Exp $
# animation: file(1) magic for animation/movie formats
#
# animation formats
@@ -32,7 +32,10 @@
!:mime application/x-quicktime-player
4 string/W jP JPEG 2000 image
!:mime image/jp2
+
+#### MP4 ####
# https://www.ftyps.com/ with local additions
+# https://cconcolato.github.io/mp4ra/filetype.html
4 string ftyp ISO Media
# https://aeroquartet.com/wordpress/2016/03/05/3-xavc-s/
>8 string XAVC \b, MPEG v4 system, Sony XAVC Codec
@@ -53,11 +56,21 @@
>>11 byte 0x63 \b C.S0050-0-B V1.0
>8 string 3ge \b, MPEG v4 system, 3GPP
!:mime video/3gpp
->>11 byte 6 \b, Release 6 MBMS Extended Presentations
->>11 byte 7 \b, Release 7 MBMS Extended Presentations
+>>11 byte 6 \b, Release %d MBMS Extended Presentations
+>>11 byte 7 \b, Release %d MBMS Extended Presentations
+>>11 byte 9 \b, Release %d MBMS Extended Presentations
+>8 string 3gf \b, MPEG v4 system, 3GPP
+>>11 byte 9 \b, Release %d File-delivery profile
>8 string 3gg \b, MPEG v4 system, 3GPP
!:mime video/3gpp
->>11 byte 6 \b, Release 6 General Profile
+>>11 byte 6 \b, Release %d General Profile
+>>11 byte 9 \b, Release %d General Profile
+>8 string 3gh \b, MPEG v4 system, 3GPP
+!:mime video/3gpp
+>>11 byte 9 \b, Release %d Adaptive Streaming Profile
+>8 string 3gm \b, MPEG v4 system, 3GPP
+!:mime video/3gpp
+>>11 byte 9 \b, Release %d Media Segment Profile
>8 string 3gp \b, MPEG v4 system, 3GPP
!:mime video/3gpp
>>11 byte 1 \b, Release %d (non existent)
@@ -67,16 +80,49 @@
>>11 byte 5 \b, Release %d
>>11 byte 6 \b, Release %d
>>11 byte 7 \b, Release %d Streaming Servers
+>8 string 3gr \b, MPEG v4 system, 3GPP
+!:mime video/3gpp
+>>11 byte 6 \b, Release %d Progressive Download Profile
+>>11 byte 9 \b, Release %d Progressive Download Profile
>8 string 3gs \b, MPEG v4 system, 3GPP
!:mime video/3gpp
+>>11 byte 6 \b, Release %d Streaming Servers
>>11 byte 7 \b, Release %d Streaming Servers
+>>11 byte 9 \b, Release %d Streaming Servers
+>8 string 3gt \b, MPEG v4 system, 3GPP
+!:mime video/3gpp
+>>11 byte 8 \b, Release %d Media Stream Recording Profile
+>>11 byte 9 \b, Release %d Media Stream Recording Profile
+>8 string ARRI \b, MPEG v4 system, ARRI Digital Camera
+!:mime video/mp4
>8 string avc1 \b, MPEG v4 system, 3GPP JVT AVC [ISO 14496-12:2005]
!:mime video/mp4
+>8 string bbxm \b, Blinkbox Master File: H.264 video/16-bit LE LPCM audio
+!:mime video/mp4
>8 string/W qt \b, Apple QuickTime movie
!:mime video/quicktime
>8 string CAEP \b, Canon Digital Camera
>8 string caqv \b, Casio Digital Camera
>8 string CDes \b, Convergent Design
+>8 string caaa \b, CMAF Media Profile - AAC Adaptive Audio
+>8 string caac \b, CMAF Media Profile - AAC Core
+>8 string caqv \b, Casio Digital Camera Casio
+>8 string ccea \b, CMAF Supplemental Data - CEA-608/708
+>8 string ccff \b, Common container file format
+>8 string cfhd \b, CMAF Media Profile - AVC HD
+>8 string cfsd \b, CMAF Media Profile - AVC SD
+>8 string chd1 \b, CMAF Media Profile - HEVC HDR10
+>8 string chdf \b, CMAF Media Profile - AVC HDHF
+>8 string chhd \b, CMAF Media Profile - HEVC HHD8
+>8 string chh1 \b, CMAF Media Profile - HEVC HHD10
+>8 string clg1 \b, CMAF Media Profile - HEVC HLG10
+>8 string cmfc \b, CMAF Track Format
+>8 string cmff \b, CMAF Fragment Format
+>8 string cmfl \b, CMAF Chunk Format
+>8 string cmfs \b, CMAF Segment Format
+>8 string cud1 \b, CMAF Media Profile - HEVC UHD10
+>8 string cud8 \b, CMAF Media Profile - HEVC UHD8
+>8 string cwvt \b, CMAF Media Profile - WebVTT
>8 string da0a \b, DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG
>8 string da0b \b, DMB MAF, ext DA0A, with 3GPP timed text, DID, TVA, REL, IPMP
>8 string da1a \b, DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images
@@ -87,6 +133,12 @@
>8 string da3b \b, DMB MAF, ext da3a w/ BIFS, 3GPP, DID, TVA, REL, IPMP
>8 string dash \b, MPEG v4 system, Dynamic Adaptive Streaming over HTTP
!:mime video/mp4
+>8 string dby1 \b, MP4 files with Dolby content
+>8 string dsms \b, Media Segment DASH conformant
+>8 string dts1 \b, MP4 track file with audio codecs dtsc dtsh or dtse
+>8 string dts2 \b, MP4 track file with audio codec dtsx
+>8 string dts3 \b, MP4 track file with audio codec dtsy
+>8 string dxo$20 \b, DxO ONE camera
>8 string dmb1 \b, DMB MAF supporting all the components defined in the spec
>8 string dmpf \b, Digital Media Project
>8 string drc1 \b, Dirac (wavelet compression), encap in ISO base media (MP4)
@@ -99,6 +151,7 @@
>8 string dvr1 \b, DVB (.DVB) over RTP
!:mime video/vnd.dvb.file
>8 string dvt1 \b, DVB (.DVB) over MPEG-2 Transport Stream
+>8 string emsg \b, Event message box present
!:mime video/vnd.dvb.file
>8 string F4V \b, Video for Adobe Flash Player 9+ (.F4V)
!:mime video/mp4
@@ -108,12 +161,22 @@
!:mime audio/mp4
>8 string F4B \b, Audio Book for Adobe Flash Player 9+ (.F4B)
!:mime audio/mp4
+>8 string ifrm \b, Apple iFrame Specification, Version 8.1 Jan 2013
+>8 string im1i \b, CMAF Media Profile - IMSC1 Image
+>8 string im1t \b, CMAF Media Profile - IMSC1 Text
>8 string isc2 \b, ISMACryp 2.0 Encrypted File
# ?/enc-isoff-generic
->8 string iso2 \b, MP4 Base Media v2 [ISO 14496-12:2005]
+>8 string iso \b, MP4 Base Media
!:mime video/mp4
->8 string isom \b, MP4 Base Media v1 [IS0 14496-12:2003]
+>>11 string m v1 [ISO 14496-12:2003]
+>>11 string 2 v2 [ISO 14496-12:2005]
+>>11 string 4 v4
+>>11 string 5 v5
+>>11 string 6 v6
+>8 string isml \b, MP4 Base Media v2 [ISO 14496-12:2005]
!:mime video/mp4
+>8 string J2P0 \b, JPEG2000 Profile 0
+>8 string J2P1 \b, JPEG2000 Profile 1
>8 string/W jp2 \b, JPEG 2000
!:mime image/jp2
>8 string JP2 \b, JPEG 2000 Image (.JP2) [ISO 15444-1 ?]
@@ -121,10 +184,13 @@
>8 string JP20 \b, Unknown, from GPAC samples (prob non-existent)
>8 string jpm \b, JPEG 2000 Compound Image (.JPM) [ISO 15444-6]
!:mime image/jpm
+>8 string jpsi \b, The JPSearch data interchange format
>8 string jpx \b, JPEG 2000 w/ extensions (.JPX) [ISO 15444-2]
!:mime image/jpx
>8 string KDDI \b, 3GPP2 EZmovie for KDDI 3G cellphones
!:mime video/3gpp2
+>8 string LCAG \b, Leica digital camera
+>8 string lmsg \b, Last Media Segment indicator for ISO base media file format.
>8 string M4A \b, Apple iTunes ALAC/AAC-LC (.M4A) Audio
!:mime audio/x-m4a
>8 string M4B \b, Apple iTunes ALAC/AAC-LC (.M4B) Audio Book
@@ -140,6 +206,8 @@
>8 string mj2s \b, Motion JPEG 2000 [ISO 15444-3] Simple Profile
!:mime video/mj2
>8 string mjp2 \b, Motion JPEG 2000 [ISO 15444-3] General Profile
+>8 string MFSM \b, Media File for Samsung video Metadata
+>8 string MGSV \b, Sony Home and Mobile Multimedia Platform (HMMP)
!:mime video/mj2
>8 string mmp4 \b, MPEG-4/3GPP Mobile Profile (.MP4 / .3GP) (for NTT)
!:mime video/mp4
@@ -153,13 +221,16 @@
>8 string mp71 \b, MP4 w/ MPEG-7 Metadata [per ISO 14496-12]
>8 string mp7t \b, MPEG v4 system, MPEG v7 XML
>8 string mp7b \b, MPEG v4 system, MPEG v7 binary XML
+>8 string mpuf \b, Compliance with the MMT Processing Unit format
+>8 string msdh \b, Media Segment conforming to ISO base media file format.
+>8 string msix \b, Media Segment conforming to ISO base media file format.
>8 string mmp4 \b, MPEG v4 system, 3GPP Mobile
!:mime video/mp4
>8 string MPPI \b, Photo Player, MAF [ISO/IEC 23000-3]
>8 string mqt \b, Sony / Mobile QuickTime (.MQV) US Pat 7,477,830
!:mime video/quicktime
>8 string MSNV \b, MPEG-4 (.MP4) for SonyPSP
-!:mime video/mp4
+!:mime audio/mp4
>8 string NDAS \b, MP4 v2 [ISO 14496-14] Nero Digital AAC Audio
!:mime audio/mp4
>8 string NDSC \b, MPEG-4 (.MP4) Nero Cinema Profile
@@ -181,11 +252,14 @@
>8 string NDXP \b, H.264/MPEG-4 AVC (.MP4) Nero Portable Profile
!:mime video/mp4
>8 string NDXS \b, H.264/MPEG-4 AVC (.MP4) Nero Standard Profile
+>8 string niko \b, Nikon Digital Camera
!:mime video/mp4
>8 string odcf \b, OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A)
>8 string opf2 \b, OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C)
>8 string opx2 \b, OMA PDCF DRM + XBS ext (OMA-TS-DRM_XBS-V1_0-20070529-C)
>8 string pana \b, Panasonic Digital Camera
+>8 string piff \b, Protected Interoperable File Format
+>8 string pnvi ]b, Panasonic Video Intercom
>8 string qt \b, Apple QuickTime (.MOV/QT)
!:mime video/quicktime
# HEIF image format
@@ -217,11 +291,24 @@
!:mime image/heif-sequence
>8 string avcs \b, HEIF Image Sequence AVC
!:mime image/heif-sequence
-
+# AVIF image format
+# see https://aomediacodec.github.io/av1-avif/
+>8 string avif \b, AVIF Image
+!:mime image/avif
+>8 string avis \b, AVIF Image Sequence
+!:mime image/avif
+>8 string risx \b, Representation Index Segment for MPEG-2 TS Segments
>8 string ROSS \b, Ross Video
>8 string sdv \b, SD Memory Card Video
>8 string ssc1 \b, Samsung stereo, single stream (patent pending)
>8 string ssc2 \b, Samsung stereo, dual stream (patent pending)
+>8 string SEAU \b, Sony Home and Mobile Multimedia Platform (HMMP)
+>8 string SEBK \b, Sony Home and Mobile Multimedia Platform (HMMP)
+>8 string senv \b, Video contents Sony Entertainment Network
+>8 string sims \b, Media Segment for Sub-Indexed Media Segment format
+>8 string sisx \b, Single Index Segment forindex MPEG-2 TS
+>8 string ssss \b, Subsegment Index Segment used to index MPEG-2 Segments
+>8 string uvvu \b, UltraViolet file brand for DECE Common Format
# MPEG sequences
# Scans for all common MPEG header start codes
@@ -234,6 +321,9 @@
0 belong&0xFFFFFF00 0x00000100
>3 byte 0xBA MPEG sequence
!:mime video/mpeg
+# http://fileformats.archiveteam.org/wiki/Enhanced_VOB
+# https://reposcope.com/mimetype/video/mpeg
+!:ext vob/evo/mpg/mpeg
>>4 byte &0x40 \b, v2, program multiplex
>>4 byte ^0x40 \b, v1, system multiplex
>3 byte 0xBB MPEG sequence, v1/2, multiplex (missing pack header)
@@ -877,21 +967,6 @@
# ABC (alembic.io 3d models)
0 string 0gawa ABC 3d model
-# VRML (Virtual Reality Modelling Language)
-0 string/w #VRML\ V1.0\ ascii VRML 1 file
-!:mime model/vrml
-0 string/w #VRML\ V2.0\ utf8 ISO/IEC 14772 VRML 97 file
-!:mime model/vrml
-
-# X3D (Extensible 3D) [https://www.web3d.org/specifications/x3d-3.0.dtd]
-# From Michel Briand <michelbriand@free.fr>
-# mimetype from https://www.iana.org/assignments/media-types/model/x3d+xml
-# Example https://www.web3d.org/x3d/content/examples/Basic/course/CreateX3DFromStringRandomSpheres.x3d
-0 string/w \<?xml\ version=
-!:strength + 5
->20 search/1000/w \<!DOCTYPE\ X3D X3D (Extensible 3D) model xml text
-!:mime model/x3d+xml
-
#---------------------------------------------------------------------------
# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube
# From Mark Sheppard <msheppard@climax.co.uk>, 2002-10-03
@@ -905,12 +980,22 @@
>0x42 ubeshort 0 no audio
>0x42 ubeshort >0 %dHz audio
-# From: "Stefan A. Haubenthal" <polluks@web.de>
+# From: Stefan A. Haubenthal <polluks@sdf.lonestar.org>
+# Update: Joerg Jenderek
+# URL: https://en.wikipedia.org/wiki/VOB
0 string DVDVIDEO-VTS Video title set,
+!:mime video/x-ifo
+!:ext ifo/bup
>0x21 byte x v%x
0 string DVDVIDEO-VMG Video manager,
+!:mime video/x-ifo
+!:ext ifo/bup
>0x21 byte x v%x
+# From: Stefan A. Haubenthal <polluks@sdf.lonestar.org>
+0 string xMovieSetter MovieSetter movie
+0 string xSceneEditor MovieSetter movie
+
# From: Behan Webster <behanw@websterwood.com>
# NuppelVideo used by Mythtv (*.nuv)
# Note: there are two identical stanzas here differing only in the
@@ -1069,3 +1154,33 @@
# From: David Korth <gerbilsoft@gerbilsoft.com>
0 string CRID
>32 string @UTF Scaleform video
+
+# http://www.jerrysguide.com/tips/demystify-tvs-file-format.html
+0 string TVS\015\012
+>&0 string Version\040 TeamViewer Session File
+>>&0 string x \b, version %s
+
+# SER file format - simple uncompressed video format for astronomical use
+# Initially developed by Lucam Recorder,
+# as of 2021 maintained by Heiko Wilkens, Grischa Hahn
+# Typical extensions: .SER
+# http://www.grischa-hahn.homepage.t-online.de/astro/ser/SER%20Doc%20V3b.pdf
+0 string LUCAM-RECORDER SER video sequence
+!:ext ser
+>18 lelong 0 \b, bayer: mono
+>18 lelong 8 \b, bayer: RGGB
+>18 lelong 9 \b, bayer: GRBG
+>18 lelong 10 \b, bayer: GBRG
+>18 lelong 11 \b, bayer: BGGR
+>18 lelong 16 \b, bayer: CYYM
+>18 lelong 17 \b, bayer: YCMY
+>18 lelong 18 \b, bayer: YMCY
+>18 lelong 19 \b, bayer: MYYC
+>18 lelong 100 \b, bayer: RGB
+>18 lelong 101 \b, bayer: BGR
+>22 lelong 0 \b, big-endian
+>22 lelong 1 \b, little-endian
+>26 lelong x \b, width: %d
+>30 lelong x \b, height: %d
+>34 lelong x \b, %d bit
+>38 lelong x \b, frames: %d
diff --git a/magic/Magdir/apple b/magic/Magdir/apple
index e0617454cd95..4b249bf8a327 100644
--- a/magic/Magdir/apple
+++ b/magic/Magdir/apple
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: apple,v 1.44 2019/10/18 15:21:02 christos Exp $
+# $File: apple,v 1.45 2021/04/26 15:56:00 christos Exp $
# apple: file(1) magic for Apple file formats
#
0 search/1/t FiLeStArTfIlEsTaRt binscii (apple ][) text
@@ -180,7 +180,7 @@
# minimum version needed to read this files. SFMinVers (0 , 30~3.0 )
>>>183 ubyte 30 3.0
>>>183 ubyte !30
->>>>183 ubyte !0 0x%x
+>>>>183 ubyte !0 %#x
# usual tabstop start sequence "=====<"
>>>5 string x \b, tabstop ruler "%6.6s"
# tabstop ruler
@@ -299,7 +299,7 @@
# object is the first object (true for CoreFoundation implementation).
# From: David Remahl <dremahl@apple.com>
0 string bplist
->6 byte x \bCoreFoundation binary property list data, version 0x%c
+>6 byte x \bCoreFoundation binary property list data, version %#c
>>7 byte x \b%c
>6 string 00 \b
>>8 byte&0xF0 0x00 \b
@@ -358,7 +358,7 @@
0 belong 0xfade0c02 Mac OS X Code Directory
>8 belong x version %x
->12 belong >0 flags 0x%x
+>12 belong >0 flags %#x
>4 belong x - %d bytes
0 belong 0xfade0cc0 Mac OS X Detached Code Signature (non-executable)
@@ -438,7 +438,7 @@
# descSize driver size in blocks
>>4 ubeshort x \b, size %u
# descType driver system type 1 701h F8FFh FFFFh
->>6 ubeshort x \b, type 0x%x
+>>6 ubeshort x \b, type %#x
# URL: https://en.wikipedia.org/wiki/Apple_Partition_Map
# Reference: https://opensource.apple.com/source/IOStorageFamily/IOStorageFamily-116/IOApplePartitionScheme.h
diff --git a/magic/Magdir/archive b/magic/Magdir/archive
index 99798b030399..d4fd3c920d36 100644
--- a/magic/Magdir/archive
+++ b/magic/Magdir/archive
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: archive,v 1.138 2020/06/07 23:29:26 christos Exp $
+# $File: archive,v 1.151 2021/08/16 10:19:56 christos Exp $
# archive: file(1) magic for archive formats (see also "msdos" for self-
# extracting compressed archives)
#
@@ -168,8 +168,11 @@
0 short 0143561 byte-swapped cpio archive
!:mime application/x-cpio # encoding: swapped
0 string 070707 ASCII cpio archive (pre-SVR4 or odc)
+!:mime application/x-cpio
0 string 070701 ASCII cpio archive (SVR4 with no CRC)
+!:mime application/x-cpio
0 string 070702 ASCII cpio archive (SVR4 with CRC)
+!:mime application/x-cpio
#
# Various archive formats used by various versions of the "ar"
@@ -240,7 +243,7 @@
!:ext deb/udeb/ipk
# This should not happen
>14 default x Unknown Debian package
-# NL terminated version; for most Debian cases this is 2.0 or 2.1 for splitted
+# NL terminated version; for most Debian cases this is 2.0 or 2.1 for split
>68 string >\0 (format %s)
#>68 string !2.0\n
#>>68 string x (format %.3s)
@@ -261,7 +264,7 @@
>>>>>>>&-1 ubyte !0x2f
# display 4th character of file name extension like a of lzma
>>>>>>>>&-1 ubyte x \b%c
-# splitted debian package case
+# split debian package case
>68 string =2.1\n
# dpkg-1.18.25/dpkg-split/info.c
# NL terminated ASCII package name like ckermit
@@ -447,36 +450,116 @@
# look for first keyword of Panorama database *.pan
>12 search/261 DESIGN
# skip keyword with low entropy
->12 default x TTComp archive, binary, 4K dictionary
-# (version 5.25) labeled the above entry as "TTComp archive data"
+>12 default x
+# skip DOS 2.0 backup id file, sequence 6 with many nils like BACKUPID_xx6.@@@ handled by ./msdos
+>>8 quad !0
+>>>0 use ttcomp
+# variant ASCII, 4K dictionary (strength=48=50-2). With strength=49 wrong order! WHY?
+0 string \1\6
+# TODO:
+# skip VAX-order 68k Blit mpx/mux executable (strength=50) handled by ./blit
+!:strength -2
+>0 use ttcomp
+0 string \0\5
+# skip some DOS 2.0 backup id file, sequence 5 with many nils like BACKUPID_075.@@@ handled by ./msdos
+>8 quad !0
+>>0 use ttcomp
+0 string \1\5
+# TODO:
+# variant ASCII, 2K dictionary (strength=48=50-2). With strength=49 wrong order! WHY?
+# skip ctab data (strength=50) handled by ./ibm6000
+# skip locale data table (strength=50) handled by ./digital
+!:strength -2
+>0 use ttcomp
+0 string \0\4
+# skip many Maple help database *.hdb with version tag handled by ./maple
+>1028 string !version
+# skip veclib maple.hdb by looking for Mable keyword
+>>4 search/1091 Maple\040
+#>4 search/34090 Maple\040
+>>4 default x
+# skip DOS 2.0-3.2 backed up sequence 4 with many nils like LOTUS5.RAR handled by ./msdos
+# skip xBASE Compound Index file *.CDX with many nils
+>>>0x54 quad !0
+>>>>0 use ttcomp
+0 string \1\4
+# TODO:
+# skip Commodore PET BASIC 4.0 program *.prg
+# variant ASCII, 1K dictionary (strength=48=50-2). With strength=49 wrong order! WHY?
+# skip shared library (strength=50) handled by ./ibm6000
+!:strength -2
+>0 use ttcomp
+# display information of TTComp archive
+0 name ttcomp
+# (version 5.25) labeled the entry as "TTComp archive data"
+>0 ubyte x TTComp archive data
+!:mime application/x-compress-ttcomp
+# PBACKSCR.PI1
+!:ext $xe/$ts/pi1/__d
+# compression type: 0~binary compression 1~ASCII compression
+>0 ubyte 0 \b, binary
+>0 ubyte 1 \b, ASCII
+# size of the dictionary: 4~1024 bytes 5~2048 bytes 6~4096 bytes
+>1 ubyte 4 \b, 1K
+>1 ubyte 5 \b, 2K
+>1 ubyte 6 \b, 4K
+>1 ubyte x dictionary
+# https://mark0.net/forum/index.php?topic=848
+# last 3 bytes probably have only 8 possible bit sequences
+# xxxxxxxx 0000000x 11111111 ____FFh
+# xxxxxxxx 10000000 01111111 __807Fh
+# 0xxxxxxx 11000000 00111111 __C03Fh
+# 00xxxxxx 11100000 00011111 __E01Fh
+# 000xxxxx 11110000 00001111 __F00Fh
+# 0000xxxx 11111000 00000111 __F807h
+# 00000xxx 11111100 00000011 __FC03h
+# 000000xx 11111110 00000001 __FE01h
+# but for quickgif.__d 0A7DD4h
+#>-3 ubyte x \b, last 3 bytes 0x%2.2x
+#>-2 ubeshort x \b%4.4x
# From: Joerg Jenderek
# URL: https://wiki.68kmla.org/DiskCopy_4.2_format_specification
# reference: http://nulib.com/library/FTN.e00005.htm
0x52 ubeshort 0x0100
-# test for disk size equal or above 400k
->0x40 ubelong >409599 Apple DiskCopy 4.2 image
+# test for disk image size equal or above 400k
+>0x40 ubelong >409599
+# test also for disk image size equal or below 1440k to skip
+# windows7en.mbr UNICODE.DAT
+>>0x40 ubelong <1474561
+# To skip Flags$StringJoiner.class with size 00106A61h test also for only 4 disk image sizes
+# 00064000 for 400k GCR disks
+# 000c8000 for 800k GCR disks
+# 000b4000 for 720k MFM disks
+# 00168000 for 1440k MFM disks
+>>>0x40 ubelong&0xffE03fFF 0
+>>>>0 use dc42-floppy
+# display information of Apple DiskCopy 4.2 floppy image
+0 name dc42-floppy
+# image pascal name padded with NULs like Microsoft Mail
+>00 pstring/B x Apple DiskCopy 4.2 image %s
#!:mime application/octet-stream
+!:mime application/x-dc42-floppy-image
!:apple dCpydImg
!:ext image/dc42
-# image pascal name padded with NULs like Microsoft Mail
->>00 pstring/B x %s
# data size in bytes like 409600
->>0x40 ubelong x \b, %u bytes
+>0x40 ubelong x \b, %u bytes
+# for debugging purpose size in hexadecimal
+#>0x40 ubelong x (%#8.8x)
# tag size in bytes
->>0x44 ubelong >0 \b, 0x%x tag size
+>0x44 ubelong >0 \b, %#x tag size
# data checksum
-#>>0x48 ubelong x \b, 0x%x checksum
+#>0x48 ubelong x \b, %#x checksum
# tag checksum
-#>>0x4c ubelong x \b, 0x%x tag checksum
+#>0x4c ubelong x \b, %#x tag checksum
# disk encoding
->>0x50 ubyte 0 \b, GCR CLV ssdd (400k)
->>0x50 ubyte 1 \b, GCR CLV dsdd (800k)
->>0x50 ubyte 2 \b, MFM CAV dsdd (720k)
->>0x50 ubyte 3 \b, MFM CAV dshd (1440k)
->>0x50 ubyte >3 \b, 0x%x encoding
+>0x50 ubyte 0 \b, GCR CLV ssdd (400k)
+>0x50 ubyte 1 \b, GCR CLV dsdd (800k)
+>0x50 ubyte 2 \b, MFM CAV dsdd (720k)
+>0x50 ubyte 3 \b, MFM CAV dshd (1440k)
+>0x50 ubyte >3 \b, %#x encoding
# format byte
->>0x51 ubyte x \b, 0x%x format
-#>>0x54 ubequad x \b, data 0x%16.16llx
+>0x51 ubyte x \b, %#x format
+#>0x54 ubequad x \b, data %#16.16llx
# ESP, could this conflict with Easy Software Products' (e.g.ESP ghostscript) documentation?
0 string ESP ESP archive data
# ZPack
@@ -509,11 +592,11 @@
# compression method (0-4)
>>8 uleshort x \b, %u method
# offset of compressed data
->>10 uleshort x \b, 0x%x offset
+>>10 uleshort x \b, %#x offset
#>>(10.s) uleshort x
#>>>&-6 string x \b, TEST extension %-.3s
# header flags to mark header extensions
->>12 uleshort >0 \b, 0x%x flags
+>>12 uleshort >0 \b, %#x flags
# 4 bytes: decompressed length of file
>>12 uleshort &0x01
>>>14 ulelong x \b, original size: %u bytes
@@ -603,6 +686,21 @@
!:ext ??$
>>8 ulelong >0 \b, original size: %u bytes
+# Summary: FTCOMP compressed archive
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/FTCOMP
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/a/ark-ftcomp.trid.xml
+# Note: called by TrID "FTCOMP compressed archive"
+# extracted by `unpack seahelp.hl_`
+24 string/b FTCOMP FTCOMP compressed archive
+#!:mime application/octet-stream
+!:mime application/x-compress-ftcomp
+!:ext ??_/??@/dll/drv/pk2/
+# probably A596FDFF magic at the beginning
+>0 ubelong !0xA596FDFF \b, at beginning %#x
+# probably original file name with directory like: \OS2\unpack.exe \SYSTEM\8514.DRV MAHJONGG.EXE
+>41 string x "%s"
+
# MP3 (archiver, not lossy audio compression)
0 string MP3\x1a MP3-Archiver archive data
# ZET
@@ -816,7 +914,7 @@
!:ext dz
>>2 byte x \b, version %i
>>3 byte x \b.%i
->>4 ulelong x \b, offset 0x%x
+>>4 ulelong x \b, offset %#x
>>8 ulelong x \b, %u files
# ZZip archiver (.zz)
0 string ZZ\ \0\0 ZZip archive data
@@ -923,7 +1021,7 @@
>>>>>>3 regex \^lh[456] LHa (2.x) archive data
>>>>>>>2 string -lh5 \b
# https://en.wikipedia.org/wiki/BIOS
-# Some mainboard BIOS like Award use LHa compression. So archives with unusal extension are found like
+# Some mainboard BIOS like Award use LHa compression. So archives with unusual extension are found like
# bios.rom , kd7_v14.bin, 1010.004, ...
!:ext lha/lzh/rom/bin
# missing -lh?- variants (Joe Jared)
@@ -950,21 +1048,21 @@
# compressed data size != compressed file size
#>7 ulelong x \b, data size %d
# attribute: 0x2~?? 0x10~symlink|target 0x20~normal
-#>19 ubyte x \b, 19_0x%x
+#>19 ubyte x \b, 19_%#x
# level identifier 0 1 2 3
#>20 ubyte x \b, level %d
# time stamp
-#>15 ubelong x DATE 0x%8.8x
+#>15 ubelong x DATE %#8.8x
# OS ID for level 1
>20 ubyte 1
# 0x20 types find for *.rom files
->>(21.b+24) ubyte <0x21 \b, 0x%x OS
+>>(21.b+24) ubyte <0x21 \b, %#x OS
# ascii type like M for MSDOS
>>(21.b+24) ubyte >0x20 \b, '%c' OS
# OS ID for level 2
>20 ubyte 2
-#>>23 ubyte x \b, OS ID 0x%x
->>23 ubyte <0x21 \b, 0x%x OS
+#>>23 ubyte x \b, OS ID %#x
+>>23 ubyte <0x21 \b, %#x OS
>>23 ubyte >0x20 \b, '%c' OS
# filename only for level 0 and 1
>20 ubyte <2
@@ -1319,8 +1417,9 @@
>>>>38 search/64 .app/ iOS App
!:mime application/x-ios-app
->30 search/100/b application/epub+zip EPUB document
-!:mime application/epub+zip
+# Dup, see above.
+#>30 search/100/b application/epub+zip EPUB document
+#!:mime application/epub+zip
# Generic zip archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
# Next line excludes specialized formats:
@@ -1331,6 +1430,8 @@
>>>>4 beshort x \b, at least
>>>>4 use zipversion
>>>>4 beshort x to extract
+>>>>8 beshort x \b, compression method=
+>>>>8 use zipcompression
>>>>0x161 string WINZIP \b, WinZIP self-extracting
# StarView Metafile
@@ -1472,8 +1573,17 @@
>>0x2A string >\0 : %s
# DR-DOS 7.03 Packed File *.??_
-0 string Packed\ File\ Personal NetWare Packed File
->12 string x \b, was "%.12s"
+# Reference: http://www.antonis.de/dos/dos-tuts/mpdostip/html/nwdostip.htm
+# Note: unpacked by PNUNPACK.EXE
+0 string Packed\ File\
+# by looking for Control-Z skip ASCII text starting with Packed File
+>0x18 ubyte 0x1a Personal NetWare Packed File
+!:mime application/x-novell-compress
+!:ext ??_
+>>12 string x \b, was "%.12s"
+# 1 or 2
+#>>0x19 ubyte x \b, at 0x19 %u
+>>0x1b ulelong x with %u bytes
# EET archive
# From: Tilman Sauerbeck <tilman@code-monkey.de>
@@ -1548,7 +1658,7 @@
>24 belong 2 MD5 checksum
>24 belong 3 SHA-256 checksum
>24 belong 4 SHA-512 checksum
->24 belong >4 unknown 0x%x checksum
+>24 belong >4 unknown %#x checksum
#>24 belong >4 checksum
# For no compression jump 0 bytes
>24 belong 0
@@ -1556,7 +1666,7 @@
# jump more bytes forward by header size
>>>&(4.S) ubyte x
# jump more bytes forward by compressed table of contents size
-#>>>>&(8.Q) ubequad x \b, heap data 0x%llx
+#>>>>&(8.Q) ubequad x \b, heap data %#llx
>>>>&(8.Q) ubyte x
# look for data by ./compress after message with 1 space at end
>>>>>&-3 indirect x \b, contains
@@ -1628,7 +1738,7 @@
# *.GHS or *.[0-9] with cns program option
>2 ubyte&0x08 0x08 \b, split file
# part of split index interesting for *.ghs
->>4 ubyte x id=0x%x
+>>4 ubyte x id=%#x
# compression tag minus one equals numeric compression command line switch z[1-9]
>3 ubyte 0 \b, no compression
>3 ubyte 2 \b, fast compression (Z1)
@@ -1676,9 +1786,9 @@
!:mime application/x-acronis-tib
!:ext tib
# 01000000
-#>20 ubelong x \b, at 20 0x%x
+#>20 ubelong x \b, at 20 %#x
# 20000000
-#>28 ubelong x \b, at 28 0x%x
+#>28 ubelong x \b, at 28 %#x
# strings like "Generic- SD/MMC 1.00" "Unknown Disk" "Msft Virtual Disk 1.0"
# ???
# strings like "\Device\0000011e" "\Device\0000015a"
@@ -1719,3 +1829,24 @@
# path[CXBTFFile[MaximumPathLength=256]
>>9 string x \b, 1st %s
+# ALZIP archive
+# by Hyungjun Park <hyungjun.park@worksmobile.com>, Hajin Jang <hajin_jang@worksmobile.com>
+# http://kippler.com/win/unalz/
+# https://salsa.debian.org/l10n-korean-team/unalz
+0 string ALZ\001 ALZ archive data
+!:ext alz
+
+# https://cf-aldn.altools.co.kr/setup/EGG_Specification.zip
+0 string EGGA EGG archive data,
+!:ext egg
+>5 byte x version %u
+>4 byte x \b.%u
+>>0x0E ulelong =0x08E28222
+>>0x0E ulelong =0x24F5A262 \b, split
+>>0x0E ulelong =0x24E5A060 \b, solid
+>>0x0E default x \b, unknown
+
+# PAQ9A archive
+# URL: http://mattmahoney.net/dc/#paq9a
+# Note: Line 1186 of paq9a.cpp gives the magic bytes
+0 string pQ9\001 PAQ9A archive
diff --git a/magic/Magdir/arm b/magic/Magdir/arm
new file mode 100644
index 000000000000..b40f213cbfb4
--- /dev/null
+++ b/magic/Magdir/arm
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+# $File: arm,v 1.2 2021/07/14 17:40:31 christos Exp $
+# arm: file(1) magic for ARM COFF
+#
+# https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
+
+# Aarch64
+0 leshort 0xaa64
+# test for unused flag bits in f_flags
+>18 uleshort&0x8E80 0
+# use little endian variant of subroutine to
+# display name+variables+flags for common object formatted files
+>>0 use display-coff
+!:strength -10
+
+# ARM
+0 leshort 0x01c0
+# test for unused flag bits in f_flags
+>18 uleshort&0x8E80 0
+# use little endian variant of subroutine to
+# display name+variables+flags for common object formatted files
+>>0 use display-coff
+!:strength -10
+
+# ARM Thumb
+0 leshort 0x01c2
+# test for unused flag bits in f_flags
+>18 uleshort&0x8E80 0
+# use little endian variant of subroutine to
+# display name+variables+flags for common object formatted files
+>>0 use display-coff
+!:strength -10
+
+# ARMv7 Thumb
+0 leshort 0x01c4
+# test for unused flag bits in f_flags
+>18 uleshort&0x8E80 0
+# use little endian variant of subroutine to
+# display name+variables+flags for common object formatted files
+>>0 use display-coff
+!:strength -10
diff --git a/magic/Magdir/asf b/magic/Magdir/asf
index c97f5498f53e..faae6a8aa9cf 100644
--- a/magic/Magdir/asf
+++ b/magic/Magdir/asf
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: asf,v 1.1 2019/12/26 02:07:53 christos Exp $
+# $File: asf,v 1.2 2021/04/26 15:56:00 christos Exp $
# asf: file(1) magic for Microsoft Advanced Systems Format (ASF) files
# http://www.staroceans.org/e-book/ASF_Specification.pdf
@@ -23,7 +23,7 @@
#>>56 lequad x Time Offset %lld
#>>64 lelong x Type-Specicic Data Length %d
#>>68 lelong x Error Correction Data Length %d
-#>>72 leshort x Flags 0x%x
+#>>72 leshort x Flags %#x
#>>74 lelong x Reserved %x
# ASF_Audio_Media
>>24 guid F8699E40-5B4D-11CF-A8FD-00805F5C442B \b, Audio Media (
@@ -40,7 +40,7 @@
#>>>85 leshort x \b, Format Data Size %x
>>>93 lelong x \b, Image Width %d
>>>97 lelong x \b, Image Height %d
-#>>>101 leshort x \b, Reserved 0x%x
+#>>>101 leshort x \b, Reserved %#x
>>>103 leshort x \b, Bits Per Pixel Count %d
#>>>105 lelong x \b, Compression ID %d
#>>>109 lelong x \b, Image Size %d
diff --git a/magic/Magdir/audio b/magic/Magdir/audio
index 448f000a38bc..c85c2952336f 100644
--- a/magic/Magdir/audio
+++ b/magic/Magdir/audio
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: audio,v 1.118 2019/11/19 05:30:07 christos Exp $
+# $File: audio,v 1.121 2021/04/26 15:56:00 christos Exp $
# audio: file(1) magic for sound formats (see also "iff")
#
# Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),
@@ -445,7 +445,7 @@
>0 string >\0 Composer: "%s"
0 string AMF AMF Module
>4 string >\0 Title: "%s"
-0 string MODINFO1 Open Cubic Player Module Inforation MDZ
+0 string MODINFO1 Open Cubic Player Module Information MDZ
0 string Extended\40Instrument: Fast Tracker II Instrument
# From: Takeshi Hamasaki <hma@syd.odn.ne.jp>
@@ -716,36 +716,36 @@
>>8 ubyte&0x0F >0 \b%d
#Get soundchips
>>8 ubyte x \b, soundchip(s)=
->>0x0C ulelong >0 SN76489,
->>0x10 ulelong >0 YM2413,
->>0x2C ulelong >0 YM2612,
->>0x30 ulelong >0 YM2151,
+>>0x0C ulelong >0 SN76489 (PSG),
+>>0x10 ulelong >0 YM2413 (OPLL),
+>>0x2C ulelong >0 YM2612 (OPN2),
+>>0x30 ulelong >0 YM2151 (OPM),
>>0x38 ulelong >0 Sega PCM,
>>0x34 ulelong >0xC
->>>0x40 ulelong >0 RF5C68,
+>>>0x40 ulelong >0 RF5C68 (PCM),
>>0x34 ulelong >0x10
->>>0x44 ulelong >0 YM2203,
+>>>0x44 ulelong >0 YM2203 (OPN),
>>0x34 ulelong >0x14
->>>0x48 ulelong >0 YM2608,
+>>>0x48 ulelong >0 YM2608 (OPNA),
>>0x34 ulelong >0x18
->>>0x4C lelong >0 YM2610,
->>>0x4C lelong <0 YM2610B,
+>>>0x4C lelong >0 YM2610 (OPNB),
+>>>0x4C lelong <0 YM2610B (OPNB+2FM),
>>0x34 ulelong >0x1C
->>>0x50 ulelong >0 YM3812,
+>>>0x50 ulelong >0 YM3812 (OPL2),
>>0x34 ulelong >0x20
->>>0x54 ulelong >0 YM3526,
+>>>0x54 ulelong >0 YM3526 (OPL),
>>0x34 ulelong >0x24
->>>0x58 ulelong >0 Y8950,
+>>>0x58 ulelong >0 Y8950 (MSX-Audio),
>>0x34 ulelong >0x28
->>>0x5C ulelong >0 YMF262,
+>>>0x5C ulelong >0 YMF262 (OPL3),
>>0x34 ulelong >0x2C
->>>0x60 ulelong >0 YMF278B,
+>>>0x60 ulelong >0 YMF278B (OPL4),
>>0x34 ulelong >0x30
->>>0x64 ulelong >0 YMF271,
+>>>0x64 ulelong >0 YMF271 (OPX),
>>0x34 ulelong >0x34
->>>0x68 ulelong >0 YMZ280B,
+>>>0x68 ulelong >0 YMZ280B (PCMD8),
>>0x34 ulelong >0x38
->>>0x6C ulelong >0 RF5C164,
+>>>0x6C ulelong >0 RF5C164 (PCM),
>>0x34 ulelong >0x3C
>>>0x70 ulelong >0 PWM,
>>0x34 ulelong >0x40
@@ -767,11 +767,11 @@
>>0x34 ulelong >0x54
>>>0x88 ulelong >0 MultiPCM,
>>0x34 ulelong >0x58
->>>0x8C ulelong >0 uPD7759,
+>>>0x8C ulelong >0 uPD7759 (ADPCM Speech),
>>0x34 ulelong >0x5C
->>>0x90 ulelong >0 OKIM6258,
+>>>0x90 ulelong >0 OKIM6258 (ADPCM Speech),
>>0x34 ulelong >0x64
->>>0x98 ulelong >0 OKIM6295,
+>>>0x98 ulelong >0 OKIM6295 (ADPCM),
>>0x34 ulelong >0x68
>>>0x9C ulelong >0 K051649,
>>0x34 ulelong >0x6C
@@ -796,10 +796,10 @@
>>0x34 ulelong >0x94
>>>0xC8 ulelong >0 SAA1099,
>>0x34 ulelong >0x98
->>>0xCC ulelong >0 ES5503,
+>>>0xCC ulelong >0 ES5503 (DOC),
>>0x34 ulelong >0x9C
->>>0xD0 lelong >0 ES5505,
->>>0xD0 lelong <0 ES5506,
+>>>0xD0 lelong >0 ES5505 (OTIS),
+>>>0xD0 lelong <0 ES5506 (OTTO),
>>0x34 ulelong >0xA4
>>>0xD8 ulelong >0 X1-010,
>>0x34 ulelong >0xA8
@@ -847,16 +847,16 @@
>>18 ubyte x \b, language ID %d
# structure for phrases/sentences?
# number of voice sample in the 1st phrase?
-#>>19 uleshort x \b, 0x%x samples
-#>>>21 uleshort >0 \b, at 0x%4.4x
-#>>>(21.s) ubequad x 0x%llx
+#>>19 uleshort x \b, %#x samples
+#>>>21 uleshort >0 \b, at %#4.4x
+#>>>(21.s) ubequad x %#llx
# 2nd phrase?
-#>>23 uleshort x \b, 0x%x samples
-#>>>25 uleshort >0 \b, at 0x%4.4x
-#>>>(25.s) ubequad x 0x%llx
+#>>23 uleshort x \b, %#x samples
+#>>>25 uleshort >0 \b, at %#4.4x
+#>>>(25.s) ubequad x %#llx
# pointer to 1st audio WAV sample
>>16 uleshort >0
->>>(16.s) ulelong >0 \b, at 0x%x
+>>>(16.s) ulelong >0 \b, at %#x
# WAV length
# 1 space char after "bytes" to get phrase "bytes RIFF"
>>>>(16.s+4) ulelong >0 %u bytes
diff --git a/magic/Magdir/avm b/magic/Magdir/avm
new file mode 100644
index 000000000000..86e96d110e30
--- /dev/null
+++ b/magic/Magdir/avm
@@ -0,0 +1,33 @@
+
+#------------------------------------------------------------------------------
+# $File: avm,v 1.1 2020/08/28 20:37:58 christos Exp $
+# avm: file(1) magic for avm files; this is not use
+
+# Summary: FRITZ!Box router configuration backup
+# From: Joerg Jenderek
+# URL: https://en.wikipedia.org/wiki/Fritz!Box
+# Reference: http://www.mengelke.de/Projekte/FritzBoxTools2
+# Note: only tested with models 4040 and 6490 Cable (lgi)
+0 string ****\ FRITZ!Box\ FRITZ!Box configuration backup
+#!:mime text/plain
+!:mime application/x-avm-export
+!:ext export
+# router model name like "4040" , "6490 Cable (lgi)" followed by " CONFIGURATION EXPORT"
+>15 string x of %-.4s
+# on 2nd line hashed password
+#>41 search/54 Password= \b, password
+# on 3rd line firmware version like: 141.06.24 141.06.50 141.07.10 ... 155.06.83
+>41 search/172 FirmwareVersion= \b, firmware version
+>>&0 string x %s
+# on 5th line oem like: avme lgi
+>41 search/285 OEM= \b, oem
+>>&0 string x %s
+# on 7th line language like: de en
+>41 search/305 Language= \b, language
+>>&0 string x %s
+# on 10th line cfg file name like: /var/tmp.cfg
+>41 search/349 tmp.cfg
+# on 11th line date inside c-comment like: Thu Jun 4 22:25:19 2015
+>>&4 string x \b, %s
+#
+
diff --git a/magic/Magdir/biosig b/magic/Magdir/biosig
index e490f6cc7eff..7d41713f24a5 100644
--- a/magic/Magdir/biosig
+++ b/magic/Magdir/biosig
@@ -19,7 +19,7 @@
0 string ATES\x20MEDICA\x20SOFT.\x20EEG\x20for\x20Windows Biosig/ATES MEDICA SOFT. EEG for Windows
!:mime biosig/ates
#
-0 string ATF\x09 Biosig/Axon Text fomrat
+0 string ATF\x09 Biosig/Axon Text format
!:mime biosig/atf
#
0 string ADU1 Biosig/Axona file format
diff --git a/magic/Magdir/blit b/magic/Magdir/blit
index d5b687fce60b..5ce787070683 100644
--- a/magic/Magdir/blit
+++ b/magic/Magdir/blit
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: blit,v 1.8 2009/09/19 16:28:08 christos Exp $
+# $File: blit,v 1.9 2021/07/03 14:01:46 christos Exp $
# blit: file(1) magic for 68K Blit stuff as seen from 680x0 machine
#
# Note that this 0407 conflicts with several other a.out formats...
@@ -14,7 +14,11 @@
0 short 03401 VAX-order 68K Blit (standalone) executable
0 long 0406 68k Blit mpx/mux executable
0 short 0406 VAX-order2 68k Blit mpx/mux executable
+# GRR: line below is too general as it matches also TTComp archive, ASCII, 4K handled by ./archive
0 short 03001 VAX-order 68k Blit mpx/mux executable
+# TODO:
+# skip TTComp archive, ASCII, 4K by looking for executable keyword like main
+#>0 search/5536 main\0 VAX-order 68k Blit mpx/mux executable
# Need more values for WE32 DMD executables.
# Note that 0520 is the same as COFF
#0 short 0520 tty630 layers executable
diff --git a/magic/Magdir/bm b/magic/Magdir/bm
new file mode 100644
index 000000000000..a9a1d5bb3f42
--- /dev/null
+++ b/magic/Magdir/bm
@@ -0,0 +1,10 @@
+
+#------------------------------------------------------------------------------
+# $File: bm,v 1.2 2021/03/14 16:56:51 christos Exp $
+# bm: file(1) magic for "Birtual Machine", cf. https://github.com/tsoding/bm
+
+0 string bm\001\244 Birtual Machine
+>4 leshort x \b, version %d
+>6 lelong x \b, program size %u
+>14 lelong x \b, memory size %u
+>22 lelong x \b, memory capacity %u
diff --git a/magic/Magdir/bsi b/magic/Magdir/bsi
index 20a17d9c2d0d..87e0fec76e85 100644
--- a/magic/Magdir/bsi
+++ b/magic/Magdir/bsi
@@ -2,8 +2,9 @@
# Office for Information Security (Bundesamt fuer Sicherheit in der
# Informationstechnik).
-# Extension: .xia
-0 string XIA1 Chiasmus encrypted data
+# https://www.bsi.bund.de/EN/Topics/OtherTopics/Chiasmus/Chiasmus_node.html
+0 string XIA1\r Chiasmus Encrypted data
+!:ext xia
-# Extension: .xis
0 string XIS Chiasmus key
+!:ext xis
diff --git a/magic/Magdir/bytecode b/magic/Magdir/bytecode
new file mode 100644
index 000000000000..501cd9d4415f
--- /dev/null
+++ b/magic/Magdir/bytecode
@@ -0,0 +1,30 @@
+
+#------------------------------------------------------------
+# $File: bytecode,v 1.2 2021/06/30 11:57:32 christos Exp $
+# magic for various bytecodes
+
+# From: Mikhail Gusarov <dottedmag@dottedmag.net>
+# NekoVM (https://nekovm.org/) bytecode
+0 string NEKO NekoVM bytecode
+>4 lelong x (%d global symbols,
+>8 lelong x %d global fields,
+>12 lelong x %d bytecode ops)
+!:mime application/x-nekovm-bytecode
+
+# https://www.iana.org/assignments/media-types/application/vnd.resilient.logic
+# From: Benedikt Muessig <benedikt@resilient-group.de>
+0 belong 0x07524c4d Resilient Logic bytecode
+!:mime application/vnd.resilient.logic
+>4 byte/16 x \b, version %d
+>4 byte&0x0f x \b.%d
+
+# Guile file magic from <dalepsmith@gmail.com>
+# https://www.gnu.org/s/guile/
+# https://git.savannah.gnu.org/gitweb/?p=guile.git;f=libguile/_scm.h;hb=HEAD#l250
+
+0 string GOOF---- Guile Object
+>8 string LE \b, little endian
+>8 string BE \b, big endian
+>11 string 4 \b, 32bit
+>11 string 8 \b, 64bit
+>13 regex .\.. \b, bytecode v%s
diff --git a/magic/Magdir/c-lang b/magic/Magdir/c-lang
index 9356e82ed9e2..6500d37822c1 100644
--- a/magic/Magdir/c-lang
+++ b/magic/Magdir/c-lang
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: c-lang,v 1.28 2019/11/15 21:03:14 christos Exp $
+# $File: c-lang,v 1.30 2021/08/16 10:17:05 christos Exp $
# c-lang: file(1) magic for C and related languages programs
#
# The strength is to beat standard HTML
@@ -49,7 +49,10 @@
>0 regex \^union[[:space:]]+ C source text
!:mime text/x-c
0 search/8192 main(
->&0 regex \\)[[:space:]]*\\{ C source text
+>&0 search/64 String Java source text
+!:mime text/x-java
+>&0 default x
+>>&0 regex \\)[[:space:]]*\\{ C source text
!:mime text/x-c
# C++
diff --git a/magic/Magdir/c64 b/magic/Magdir/c64
index ff4e93309e6e..52a4e22d99e9 100644
--- a/magic/Magdir/c64
+++ b/magic/Magdir/c64
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: c64,v 1.7 2017/11/15 12:19:06 christos Exp $
+# $File: c64,v 1.9 2021/04/26 15:56:00 christos Exp $
# c64: file(1) magic for various commodore 64 related files
#
# From: Dirk Jagdmann <doj@cubic.org>
@@ -28,17 +28,17 @@
0 belong 0xFF424CFF WRAptor packer (c64)
0 string C64S\x20tape\x20file T64 tape Image
->32 leshort x Version:0x%x
+>32 leshort x Version:%#x
>36 leshort !0 Entries:%i
>40 string x Name:%.24s
0 string C64\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image
->32 leshort x Version:0x%x
+>32 leshort x Version:%#x
>36 leshort !0 Entries:%i
>40 string x Name:%.24s
0 string C64S\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image
->32 leshort x Version:0x%x
+>32 leshort x Version:%#x
>36 leshort !0 Entries:%i
>40 string x Name:%.24s
@@ -56,3 +56,8 @@
>68 string >\0 \b (C) %s
>100 byte >0 \b, %u subsong(s)
+# CBM BASIC (cc65 compiled)
+0 leshort 0x0801
+>2 leshort 0x080b
+>6 string \x9e CBM BASIC
+>7 string >\0 \b, SYS %s
diff --git a/magic/Magdir/cad b/magic/Magdir/cad
index 3d07b422fc18..530f72f31e95 100644
--- a/magic/Magdir/cad
+++ b/magic/Magdir/cad
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: cad,v 1.23 2020/05/30 23:58:07 christos Exp $
+# $File: cad,v 1.28 2021/04/26 15:56:00 christos Exp $
# autocad: file(1) magic for cad files
#
@@ -32,8 +32,8 @@
#>0 ubyte &0x40 \b, reserved
# type of element 9~TCB 8~Digitizer setup 5~Group Data Elements
#>1 ubyte&0x7F x \b, type %u
-# words to follow in element: 17H~CEL libray 2FEh~DGN 9FEh,DFEh~CIT
-#>2 uleshort x \b, words 0x%4.4x to follow
+# words to follow in element: 17H~CEL library 2FEh~DGN 9FEh,DFEh~CIT
+#>2 uleshort x \b, words %#4.4x to follow
# test for 3 reserved 0 bytes in CIT or "conversion" in ViewInfo structure (DGN CEL)
#>508 ubelong x \b, RESERVED %8.8x
>508 ubelong&0xFFffFF00 =0
@@ -58,7 +58,7 @@
>>>>1120 string x \b, units %-.2s
# 2 chars for name of master unit like IN in ML SU tn th TH HU mm "\0 "\040 \0\0
>>>>1122 string >\0 %-.2s
-#>>>>1120 ubelong x \b, units 0x%8.8x
+#>>>>1120 ubelong x \b, units %#8.8x
# element range low,high x y z like xlow=0 08010000h 01080000h
#>>>>4 ubelong !0 \b, xlow %8.8x
#>>>>8 ubelong !0 \b, ylow %8.8x
@@ -67,7 +67,7 @@
#>>>>20 ubelong !0 \b, yhigh %8.8x
#>>>>24 ubelong !0 \b, zhigh %8.8x
# graphic group number; all other elements in that group have same non-0 number
-#>>>>28 leshort x \b, grphgrp 0x%4.4x
+#>>>>28 leshort x \b, grphgrp %#4.4x
# words to optional attribute linkage
#>>>>30 ubyte x \b, attindx \%o
#>>>>31 ubyte x \b\%o
@@ -91,11 +91,11 @@
# >>30 string \372\106 DGNFile
# >>30 string \376\103 DGNFile
# elements properties indicator
-#>>>>32 uleshort !0 \b, properties 0x%4.4x
+#>>>>32 uleshort !0 \b, properties %#4.4x
# class 0~Primary
-#>>>>>32 uleshort&0x000F !0 \b, class 0x%4.4x
+#>>>>>32 uleshort&0x000F !0 \b, class %#4.4x
# Symbology
-#>>>>>34 uleshort x \b, Symbology 0x%4.4x
+#>>>>>34 uleshort x \b, Symbology %#4.4x
# test for 2nd element type 1~library cell header
>>&1 ubyte&0x7F 1
# test for 1st element with level 8 and type 5 for cell library
@@ -151,13 +151,13 @@
>194 ubyte &0x04 horizontal
>194 ubyte ^0x04 vertical
# ScannableFlag; Scanline indexing method used
-#>195 ubyte !0 \b, ScannableFlag 0x%x
+#>195 ubyte !0 \b, ScannableFlag %#x
# RotationAngle; Rotation angle of raster data
-#>196 ubequad !0 \b, RotationAngle 0x%llx
+#>196 ubequad !0 \b, RotationAngle %#llx
# SkewAngle; Skew angle of raster data
#>204 ubequad !0 \b, SkewAngle %llx
# DataTypeModifier; Additional raster data format info
-#>212 uleshort !0 \b, DataTypeModifier 0x%4.4x
+#>212 uleshort !0 \b, DataTypeModifier %#4.4x
# DesignFile[66]; Name of the design file
>214 string >\0 \b, DesignFile %-.66s
# DatabaseFile[66]; Name of the database file
@@ -167,9 +167,9 @@
# FileDescription[80]; Text description of file and contents
>412 string >\0 \b, FileDescription %-.80s
# MinValue
-#>492 ubequad !0 \b, MinValue 0x%llx
+#>492 ubequad !0 \b, MinValue %#llx
# MaxValue
-#>500 ubequad !0 \b, MaxValue 0x%llx
+#>500 ubequad !0 \b, MaxValue %#llx
# Reserved[3]; Unused (always 0)
#>508 ubelong&0xFFffFF00 x \b, RESERVED %8.8x
# GridFileVersion; Grid File Version like 2 3
@@ -213,9 +213,11 @@
# AutoCAD DWG versions R12/R13/R14 (www.autodesk.com)
0 string AC1012 DWG AutoDesk AutoCAD Release 13
!:mime image/vnd.dwg
+0 string AC1013 DWG AutoDesk AutoCAD Release 13c3
+!:mime image/vnd.dwg
0 string AC1014 DWG AutoDesk AutoCAD Release 14
!:mime image/vnd.dwg
-0 string AC1015 DWG AutoDesk AutoCAD 2000/2002
+0 string AC1015 DWG AutoDesk AutoCAD 2000
!:mime image/vnd.dwg
# A new version of AutoCAD DWG
@@ -233,7 +235,9 @@
!:mime image/vnd.dwg
# From GNU LibreDWG
-0 string AC1032 DWG AutoDesk AutoCAD 2018/2019
+0 string AC1032 DWG AutoDesk AutoCAD 2018/2019/2020
+!:mime image/vnd.dwg
+0 string AC1035 DWG AutoDesk AutoCAD 2021
!:mime image/vnd.dwg
# KOMPAS 2D drawing from ASCON
@@ -309,11 +313,15 @@
>>>>&1 search/8192 AC1006 \b, R10
>>>>&1 search/8192 AC1009 \b, R11/R12
>>>>&1 search/8192 AC1012 \b, R13
+>>>>&1 search/8192 AC1013 \b, R13c3
>>>>&1 search/8192 AC1014 \b, R14
>>>>&1 search/8192 AC1015 \b, version 2000
>>>>&1 search/8192 AC1018 \b, version 2004
>>>>&1 search/8192 AC1021 \b, version 2007
>>>>&1 search/8192 AC1024 \b, version 2010
+>>>>&1 search/8192 AC1027 \b, version 2013
+>>>>&1 search/8192 AC1032 \b, version 2018
+>>>>&1 search/8192 AC1035 \b, version 2021
# The Sketchup 3D model format https://www.sketchup.com/
0 string \xff\xfe\xff\x0e\x53\x00\x6b\x00\x65\x00\x74\x00\x63\x00\x68\x00\x55\x00\x70\x00\x20\x00\x4d\x00\x6f\x00\x64\x00\x65\x00\x6c\x00 SketchUp Model
@@ -322,3 +330,74 @@
4 regex/b P[0-9][0-9]\\.[0-9][0-9][0-9][0-9]\\.[0-9][0-9][0-9][0-9]\\.[0-9] NAXOS CAD System file from version %s
!:strength +40
+
+# glTF (GL Transmission Format) - by the Khronos Group
+# Reference: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#glb-file-format-specification
+0 string glTF glTF binary model
+>4 ulelong x \b, version %d
+>8 ulelong x \b, length %d bytes
+!:mime model/gltf-binary
+!:ext glb
+
+# FBX (FilmBoX) - by Kaydara/Autodesk
+# Reference: https://code.blender.org/2013/08/fbx-binary-file-format-specification
+0 string Kaydara\ FBX\ Binary\ \ \0 Kaydara FBX model,
+>&2 ulelong x version %d
+!:ext fbx
+
+# PLY (Polygon File Format/Stanford Triangle Format) - by Greg Turk
+# Reference: https://web.archive.org/web/20161204152348/http://www.dcs.ed.ac.uk/teaching/cs4/www/graphics/Web/ply.html
+0 string ply\n PLY model,
+!:ext ply
+>4 string format\ ascii\ ASCII,
+>>&0 regex/6 [0-9.]+ version %s
+>4 string format\ binary binary,
+>>&0 string _little_endian\ little endian,
+>>>&0 regex/6 [0-9.]+ version %s
+>>&0 string _big_endian\ big endian,
+>>>&0 regex/6 [0-9.]+ version %s
+
+# VRML (Virtual Reality Modeling Language) - by the Web3D Consortium
+# From: Michel Briand <michelbriand@free.fr>
+# Reference: https://www.web3d.org/standards
+0 string/w #VRML\ V1.0\ ascii VRML 1 file
+!:mime model/vrml
+!:ext wrl
+0 string/w #VRML\ V2.0\ utf8 ISO/IEC 14772 VRML 97 file
+!:mime model/vrml
+!:ext wrl
+# X3D, VRML encoded
+0 string #X3D X3D (Extensible 3D) model, VRML format
+>4 string V
+>>5 regex/6 [0-9.]+ \b, version %s
+!:mime model/x3d+vrml
+!:ext x3dv
+
+## XML-based 3D CAD Formats
+# From: Michel Briand <michelbriand@free.fr>, Oliver Galvin <odg@riseup.net>
+0 string/w \<?xml\ version=
+!:strength + 5
+# X3D (Extensible 3D)
+# Schema: https://www.web3d.org/specifications/x3d-3.2.dtd
+# MIME Type: https://www.iana.org/assignments/media-types/model/x3d+xml
+# Example: https://www.web3d.org/x3d/content/examples/Basic/course/CreateX3DFromStringRandomSpheres.x3d
+>20 search/1000/w \<!DOCTYPE\ X3D X3D (Extensible 3D) model, XML document
+!:mime model/x3d+xml
+!:ext x3d
+# COLLADA (COLLAborative Design Activity) - by the Khronos Group
+# Schema: http://www.collada.org/2005/11/COLLADASchema
+# Reference: https://www.khronos.org/collada
+>20 search/1000/w \<COLLADA COLLADA model, XML document
+!:mime model/vnd.collada+xml
+!:ext dae
+# 3MF (3D Manufacturing Format) - by the 3MF Consortium
+# Schema: http://schemas.microsoft.com/3dmanufacturing/core/2015/02
+# Reference: https://3mf.io/specification
+>20 search/1000/w xmlns="http://schemas.microsoft.com/3dmanufacturing 3MF (3D Manufacturing Format) model, XML document
+!:mime model/3mf
+!:ext 3mf
+# AMF (Additive Manufacturing File)
+# Reference: https://www.astm.org/Standards/ISOASTM52915.htm
+>20 search/1000/w \<amf AMF (Additive Manufacturing Format) model, XML document
+!:mime application/x-amf
+!:ext amf
diff --git a/magic/Magdir/cafebabe b/magic/Magdir/cafebabe
index 18dd1a27a39f..8cc0902b4cd5 100644
--- a/magic/Magdir/cafebabe
+++ b/magic/Magdir/cafebabe
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: cafebabe,v 1.24 2018/10/01 23:33:15 christos Exp $
+# $File: cafebabe,v 1.27 2021/04/26 15:56:00 christos Exp $
# Cafe Babes unite!
#
# Since Java bytecode and Mach-O universal binaries have the same magic number,
@@ -15,12 +15,20 @@
# might add another one or two as time goes by...
#
### JAVA START ###
+# Reference: http://en.wikipedia.org/wiki/Java_class_file
+# Update: Joerg Jenderek
0 belong 0xcafebabe
->4 belong >30 compiled Java class data,
+>4 ubelong >30 compiled Java class data,
!:mime application/x-java-applet
->>6 beshort x version %d.
->>4 beshort x \b%d
+#!:mime application/java-byte-code
+!:ext class
+>>6 ubeshort x version %d.
+>>4 ubeshort x \b%d
+# for debugging purpose version as hexadecimal to compare with Mach-O universal binary
+#>>4 ubelong x (%#8.8x)
# Which is which?
+# https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html
+#>>4 belong 0x002b (Java 0.?)
#>>4 belong 0x032d (Java 1.0)
#>>4 belong 0x032d (Java 1.1)
>>4 belong 0x002e (Java 1.2)
@@ -30,6 +38,16 @@
>>4 belong 0x0032 (Java 1.6)
>>4 belong 0x0033 (Java 1.7)
>>4 belong 0x0034 (Java 1.8)
+>>4 belong 0x0035 (Java SE 9)
+>>4 belong 0x0036 (Java SE 10)
+>>4 belong 0x0037 (Java SE 11)
+>>4 belong 0x0038 (Java SE 12)
+>>4 belong 0x0039 (Java SE 13)
+>>4 belong 0x003A (Java SE 14)
+# pool count unequal zero
+#>>8 beshort x \b, pool count %#x
+# pool table
+#>>10 ubequad x \b, pool %#16.16llx...
0 belong 0xcafed00d JAR compressed with pack200,
>5 byte x version %d.
@@ -44,29 +62,40 @@
### JAVA END ###
### MACH-O START ###
+# URL: https://en.wikipedia.org/wiki/Mach-O
0 name mach-o \b [
+# for debugging purpose CPU type as hexadecimal
+#>0 ubequad x CPU=%16.16llx
+# display CPU type as string like: i386 x86_64 ... armv7 armv7k ...
>0 use mach-o-cpu \b
+# for debugging purpose print offset to 1st mach_header like:
+# 1000h 4000h seldom 2d000h 88000h 5b000h 10e000 h
+#>8 ubelong x at %#x offset
>(8.L) indirect x \b:
>0 belong x \b]
+# Reference: https://opensource.apple.com/source/cctools/cctools-949.0.1/
+# include/mach-o/fat.h
+# include/mach/machine.h
0 belong 0xcafebabe
>4 belong 1 Mach-O universal binary with 1 architecture:
!:mime application/x-mach-binary
>>8 use mach-o \b
->4 belong >1
->>4 belong <20 Mach-O universal binary with %d architectures:
+# nfat_arch; number of CPU architectures; highest is 18 for CPU_TYPE_POWERPC in 2020
+>4 ubelong >1
+>>4 ubelong <20 Mach-O universal binary with %d architectures:
!:mime application/x-mach-binary
>>>8 use mach-o \b
->>4 belong >1
->>>28 use mach-o \b
->>4 belong >2
->>>48 use mach-o \b
->>4 belong >3
->>>68 use mach-o \b
->>4 belong >4
->>>88 use mach-o \b
->>4 belong >5
->>>108 use mach-o \b
+>>>4 ubelong >1
+>>>>28 use mach-o \b
+>>>4 ubelong >2
+>>>>48 use mach-o \b
+>>>4 ubelong >3
+>>>>68 use mach-o \b
+>>>4 ubelong >4
+>>>>88 use mach-o \b
+>>>4 ubelong >5
+>>>>108 use mach-o \b
### MACH-O END ###
diff --git a/magic/Magdir/citrus b/magic/Magdir/citrus
index ff2471ea75ac..1801a55fa650 100644
--- a/magic/Magdir/citrus
+++ b/magic/Magdir/citrus
@@ -1,8 +1,12 @@
#------------------------------------------------------------------------------
-# $File: citrus,v 1.4 2009/09/19 16:28:08 christos Exp $
+# $File: citrus,v 1.5 2021/01/04 19:48:31 christos Exp $
# citrus locale declaration
#
0 string RuneCT Citrus locale declaration for LC_CTYPE
+0 string CtrsME Citrus locale declaration for LC_MESSAGES
+0 string CtrsMO Citrus locale declaration for LC_MONETARY
+0 string CtrsNU Citrus locale declaration for LC_NUMERIC
+0 string CtrsTI Citrus locale declaration for LC_TIME
diff --git a/magic/Magdir/clipper b/magic/Magdir/clipper
index 2768b3af501d..484caeb89eac 100644
--- a/magic/Magdir/clipper
+++ b/magic/Magdir/clipper
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: clipper,v 1.8 2017/03/17 21:35:28 christos Exp $
+# $File: clipper,v 1.9 2020/12/15 23:57:27 christos Exp $
# clipper: file(1) magic for Intergraph (formerly Fairchild) Clipper.
#
# XXX - what byte order does the Clipper use?
@@ -61,5 +61,5 @@
>54 byte 2 -Cssw
>54 byte 3 -Cspw
>54 byte 4 -Cscb
-4 string pipe CLIPPER instruction trace
-4 string prof CLIPPER instruction profile
+#4 string pipe CLIPPER instruction trace
+#4 string prof CLIPPER instruction profile
diff --git a/magic/Magdir/coff b/magic/Magdir/coff
index 31b47e7aff42..535187c2ce9e 100644
--- a/magic/Magdir/coff
+++ b/magic/Magdir/coff
@@ -1,11 +1,11 @@
#------------------------------------------------------------------------------
-# $File: coff,v 1.3 2018/08/01 10:34:03 christos Exp $
+# $File: coff,v 1.6 2021/04/26 15:56:00 christos Exp $
# coff: file(1) magic for Common Object Files not specific to known cpu types or manufactures
#
# COFF
#
-# by Joerg Jenderek at Oct 2015
+# by Joerg Jenderek at Oct 2015, Feb 2021
# https://en.wikipedia.org/wiki/COFF
# https://de.wikipedia.org/wiki/Common_Object_File_Format
# http://www.delorie.com/djgpp/doc/coff/filhdr.html
@@ -16,62 +16,78 @@
0 name display-coff
# test for unused flag bits (0x8000,0x0800,0x0400,0x0200,x0080) in f_flags
>18 uleshort&0x8E80 0
->>0 clear x
+# skip DOCTOR.DAILY READER.NDA REDBOX.ROOT by looking for positive number of sections
+>>2 uleshort >0
+# skip ega80woa.fnt svgafix.fnt HP3FNTS1.DAT HP3FNTS2.DAT INTRO.ACT LEARN.PIF by looking for low number of sections
+>>>2 uleshort <4207
+>>>>0 clear x
# f_magic - magic number
# DJGPP, 80386 COFF executable, MS Windows COFF Intel 80386 object file (./intel)
->>0 uleshort 0x014C Intel 80386
+>>>>0 uleshort 0x014C Intel 80386
# Hitachi SH big-endian COFF (./hitachi-sh)
->>0 uleshort 0x0500 Hitachi SH big-endian
+>>>>0 uleshort 0x0500 Hitachi SH big-endian
# Hitachi SH little-endian COFF (./hitachi-sh)
->>0 uleshort 0x0550 Hitachi SH little-endian
+>>>>0 uleshort 0x0550 Hitachi SH little-endian
# executable (RISC System/6000 V3.1) or obj module (./ibm6000)
-#>>0 uleshort 0x01DF
+#>>>>0 uleshort 0x01DF
# MS Windows COFF Intel Itanium, AMD64
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx
->>0 uleshort 0x0200 Intel ia64
->>0 uleshort 0x8664 Intel amd64
+>>>>0 uleshort 0x0200 Intel ia64
+>>>>0 uleshort 0x8664 Intel amd64
+# ARM COFF (./arm)
+>>>>0 uleshort 0xaa64 Aarch64
+>>>>0 uleshort 0x01c0 ARM
+>>>>0 uleshort 0x01c2 ARM Thumb
+>>>>0 uleshort 0x01c4 ARMv7 Thumb
# TODO for other COFFs
-#>>0 uleshort 0xABCD COFF_TEMPLATE
->>0 default x
->>>0 uleshort x type 0x%04x
->>0 uleshort x COFF
+#>>>>0 uleshort 0xABCD COFF_TEMPLATE
+>>>>0 default x
+>>>>>0 uleshort x type %#04x
+>>>>0 uleshort x COFF
# F_EXEC flag bit
->>18 leshort ^0x0002 object file
-#!:mime application/x-coff
-#!:ext cof/o/obj/lib
->>18 leshort &0x0002 executable
+>>>>18 leshort ^0x0002 object file
+!:mime application/x-coff
+!:ext o/obj/lib
+# no cof sample found
+#!:ext cof/o/obj/lib
+>>>>18 leshort &0x0002 executable
#!:mime application/x-coffexec
# F_RELFLG flag bit,static object
->>18 leshort &0x0001 \b, no relocation info
+>>>>18 leshort &0x0001 \b, no relocation info
# F_LNNO flag bit
->>18 leshort &0x0004 \b, no line number info
+>>>>18 leshort &0x0004 \b, no line number info
# F_LSYMS flag bit
->>18 leshort &0x0008 \b, stripped
->>18 leshort ^0x0008 \b, not stripped
+>>>>18 leshort &0x0008 \b, stripped
+>>>>18 leshort ^0x0008 \b, not stripped
# flags in other COFF versions
#0x0010 F_FDPR_PROF
#0x0020 F_FDPR_OPTI
#0x0040 F_DSA
# F_AR32WR flag bit
-#>>>18 leshort &0x0100 \b, 32 bit little endian
+#>>>>18 leshort &0x0100 \b, 32 bit little endian
#0x1000 F_DYNLOAD
#0x2000 F_SHROBJ
#0x4000 F_LOADONLY
-# f_nscns - number of sections
->>2 uleshort <2 \b, %d section
->>2 uleshort >1 \b, %d sections
-# f_timdat - file time & date stamp only for little endian
-#>>4 date x \b, %s
+# f_nscns - number of sections like: 1 2 3 4 5 7 8 9 11 12 15 16 19 20 21 22 26 30 36 40 42 56 80 89 96 124
+>>>>2 uleshort <2 \b, %u section
+>>>>2 uleshort >1 \b, %u sections
# f_symptr - symbol table pointer, only for not stripped
->>8 ulelong >0 \b, symbol offset=0x%x
+# like: 0 0x7c 0xf4 0x104 0x182 0x1c2 0x1c6 0x468 0x948 0x416e 0x149a6 0x1c9d8 0x23a68 0x35120 0x7afa0
+>>>>8 ulelong >0 \b, symbol offset=%#x
# f_nsyms - number of symbols, only for not stripped
->>12 ulelong >0 \b, %d symbols
-# f_opthdr - optional header size
->>16 uleshort >0 \b, optional header size %d
+# like: 0 2 7 9 10 11 20 35 41 63 71 80 105 146 153 158 170 208 294 572 831 1546
+>>>>12 ulelong >0 \b, %d symbols
+# f_opthdr - optional header size. An object file should have a value of 0
+>>>>16 uleshort >0 \b, optional header size %u
+# f_timdat - file time & date stamp only for little endian
+>>>>4 ledate >0 \b, created %s
# at offset 20 can be optional header, extra bytes FILHSZ-20 because
# do not rely on sizeof(FILHDR) to give the correct size for header.
# or first section header
# additional variables for other COFF files
+>>>>16 uleshort =0
+# first section name s_name[8] like: .text .data .debug$S .drectve .testseg
+>>>>>20 string x \b, 1st section name "%.8s"
# >20 beshort 0407 (impure)
# >20 beshort 0410 (pure)
# >20 beshort 0413 (demand paged)
diff --git a/magic/Magdir/commands b/magic/Magdir/commands
index 10f8d2b20baa..705a72861ac0 100644
--- a/magic/Magdir/commands
+++ b/magic/Magdir/commands
@@ -1,112 +1,132 @@
#------------------------------------------------------------------------------
-# $File: commands,v 1.63 2020/06/06 15:36:30 christos Exp $
+# $File: commands,v 1.66 2021/07/03 13:50:29 christos Exp $
# commands: file(1) magic for various shells and interpreters
#
#0 string/w : shell archive or script for antique kernel text
-0 string/wt #!\ /bin/sh POSIX shell script text executable
+0 string/fwt #!\ /bin/sh POSIX shell script text executable
!:mime text/x-shellscript
-0 string/wb #!\ /bin/sh POSIX shell script executable (binary data)
+0 string/fwb #!\ /bin/sh POSIX shell script executable (binary data)
!:mime text/x-shellscript
-0 string/wt #!\ /bin/csh C shell script text executable
+0 string/fwt #!\ /bin/csh C shell script text executable
!:mime text/x-shellscript
# korn shell magic, sent by George Wu, gwu@clyde.att.com
-0 string/wt #!\ /bin/ksh Korn shell script text executable
+0 string/fwt #!\ /bin/ksh Korn shell script text executable
!:mime text/x-shellscript
-0 string/wb #!\ /bin/ksh Korn shell script executable (binary data)
+0 string/fwb #!\ /bin/ksh Korn shell script executable (binary data)
!:mime text/x-shellscript
-0 string/wt #!\ /bin/tcsh Tenex C shell script text executable
+0 string/fwt #!\ /bin/tcsh Tenex C shell script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/bin/tcsh Tenex C shell script text executable
+0 string/fwt #!\ /usr/bin/tcsh Tenex C shell script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/tcsh Tenex C shell script text executable
+0 string/fwt #!\ /usr/local/tcsh Tenex C shell script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/bin/tcsh Tenex C shell script text executable
+0 string/fwt #!\ /usr/local/bin/tcsh Tenex C shell script text executable
!:mime text/x-shellscript
#
# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson)
-0 string/wt #!\ /bin/zsh Paul Falstad's zsh script text executable
+0 string/fwt #!\ /bin/zsh Paul Falstad's zsh script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/bin/zsh Paul Falstad's zsh script text executable
+0 string/fwt #!\ /usr/bin/zsh Paul Falstad's zsh script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/bin/zsh Paul Falstad's zsh script text executable
+0 string/fwt #!\ /usr/local/bin/zsh Paul Falstad's zsh script text executable
!:mime text/x-shellscript
0 search/1 #!/usr/bin/env\ zsh Paul Falstad's zsh script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/bin/ash Neil Brown's ash script text executable
+0 string/fwt #!\ /bin/ash Neil Brown's ash script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/bin/ae Neil Brown's ae script text executable
+0 string/fwt #!\ /usr/bin/ash Neil Brown's ash script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /bin/nawk new awk script text executable
+0 string/fwt #!\ /usr/local/bin/ash Neil Brown's ash script text executable
+!:mime text/x-shellscript
+0 string/fwt #!\ /usr/local/bin/ae Neil Brown's ae script text executable
+!:mime text/x-shellscript
+0 string/fwt #!\ /bin/nawk new awk script text executable
!:mime text/x-nawk
-0 string/wt #!\ /usr/bin/nawk new awk script text executable
+0 string/fwt #!\ /usr/bin/nawk new awk script text executable
!:mime text/x-nawk
-0 string/wt #!\ /usr/local/bin/nawk new awk script text executable
+0 string/fwt #!\ /usr/local/bin/nawk new awk script text executable
!:mime text/x-nawk
-0 string/wt #!\ /bin/gawk GNU awk script text executable
+0 string/fwt #!\ /bin/gawk GNU awk script text executable
!:mime text/x-gawk
0 string/wt #!\ /usr/bin/gawk GNU awk script text executable
!:mime text/x-gawk
-0 string/wt #!\ /usr/local/bin/gawk GNU awk script text executable
+0 string/fwt #!\ /usr/local/bin/gawk GNU awk script text executable
!:mime text/x-gawk
#
-0 string/wt #!\ /bin/awk awk script text executable
+0 string/fwt #!\ /bin/awk awk script text executable
!:mime text/x-awk
-0 string/wt #!\ /usr/bin/awk awk script text executable
+0 string/fwt #!\ /usr/bin/awk awk script text executable
!:mime text/x-awk
0 regex/4096 =^[\040\t\f\r\n]{0,100}BEGIN[\040\t\f\r\n]{0,100}[{] awk or perl script text
# AT&T Bell Labs' Plan 9 shell
-0 string/wt #!\ /bin/rc Plan 9 rc shell script text executable
+0 string/fwt #!\ /bin/rc Plan 9 rc shell script text executable
# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de)
-0 string/wt #!\ /bin/bash Bourne-Again shell script text executable
+0 string/fwt #!\ /bin/bash Bourne-Again shell script text executable
!:mime text/x-shellscript
-0 string/wb #!\ /bin/bash Bourne-Again shell script executable (binary data)
+0 string/fwb #!\ /bin/bash Bourne-Again shell script executable (binary data)
!:mime text/x-shellscript
-0 string/wt #!\ /usr/bin/bash Bourne-Again shell script text executable
+0 string/fwt #!\ /usr/bin/bash Bourne-Again shell script text executable
!:mime text/x-shellscript
-0 string/wb #!\ /usr/bin/bash Bourne-Again shell script executable (binary data)
+0 string/fwb #!\ /usr/bin/bash Bourne-Again shell script executable (binary data)
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/bash Bourne-Again shell script text executable
+0 string/fwt #!\ /usr/local/bash Bourne-Again shell script text executable
!:mime text/x-shellscript
-0 string/wb #!\ /usr/local/bash Bourne-Again shell script executable (binary data)
+0 string/fwb #!\ /usr/local/bash Bourne-Again shell script executable (binary data)
!:mime text/x-shellscript
-0 string/wt #!\ /usr/local/bin/bash Bourne-Again shell script text executable
+0 string/fwt #!\ /usr/local/bin/bash Bourne-Again shell script text executable
!:mime text/x-shellscript
-0 string/wb #!\ /usr/local/bin/bash Bourne-Again shell script executable (binary data)
+0 string/fwb #!\ /usr/local/bin/bash Bourne-Again shell script executable (binary data)
!:mime text/x-shellscript
-0 string/wt #!\ /usr/bin/env\ bash Bourne-Again shell script text executable
+0 string/fwt #!\ /usr/bin/env\ bash Bourne-Again shell script text executable
!:mime text/x-shellscript
# Fish shell magic
# From: Benjamin Lowry <ben@ben.gmbh>
-0 string/wt #!\ /usr/local/bin/fish fish shell script text executable
+0 string/fwt #!\ /usr/local/bin/fish fish shell script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/bin/fish fish shell script text executable
+0 string/fwt #!\ /usr/bin/fish fish shell script text executable
!:mime text/x-shellscript
-0 string/wt #!\ /usr/bin/env\ fish fish shell script text executable
+0 string/fwt #!\ /usr/bin/env\ fish fish shell script text executable
!:mime text/x-shellscript
+0 string/wt #!\ a
+>&-1 string x %s script text executable
-0 search/1/wt #!\ /usr/bin/tclsh Tcl/Tk script text executable
+0 search/1/fwt #!\ /usr/bin/tclsh Tcl/Tk script text executable
!:mime text/x-tcl
-0 search/1/wt #!\ /usr/bin/texlua LuaTex script text executable
+0 search/1/fwt #!\ /usr/bin/texlua LuaTex script text executable
!:mime text/x-luatex
-0 search/1/wt #!\ /usr/bin/luatex LuaTex script text executable
+0 search/1/fwt #!\ /usr/bin/luatex LuaTex script text executable
!:mime text/x-luatex
-0 search/1/wt #!\ /usr/bin/stap Systemtap script text executable
+0 search/1/fwt #!\ /usr/bin/stap Systemtap script text executable
!:mime text/x-systemtap
-
+# From: Kylie McClain <kylie@somas.is>
+# Type: execline scripts
+# URL: https://skarnet.org/software/execline/
+0 string/fwt #!\ /command/execlineb execline script text executable
+!:mime text/x-execline
+0 string/fwt #!\ /bin/execlineb execline script text executable
+!:mime text/x-execline
+0 string/fwt #!\ /usr/bin/execlineb execline script text executable
+!:mime text/x-execline
+0 string/fwt #!\ /usr/bin/env\ execlineb execline script text executable
+!:mime text/x-execline
+
+0 string #!
+>0 regex \^#!.*/bin/execlineb([[:space:]].*)*$ execline script text executable
+!:mime text/x-execline
# PHP scripts
# Ulf Harnhammar <ulfh@update.uu.se>
diff --git a/magic/Magdir/compress b/magic/Magdir/compress
index a364a88039e7..8c368db58cd6 100644
--- a/magic/Magdir/compress
+++ b/magic/Magdir/compress
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: compress,v 1.79 2020/05/30 23:53:04 christos Exp $
+# $File: compress,v 1.82 2021/06/30 08:11:29 christos Exp $
# compress: file(1) magic for pure-compression formats (no archives)
#
# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
@@ -264,14 +264,19 @@
>>5 lequad !0xffffffffffffffff non-streamed, size %lld
# http://tukaani.org/xz/xz-file-format.txt
-0 ustring \xFD7zXZ\x00 XZ compressed data
+0 ustring \xFD7zXZ\x00 XZ compressed data, checksum
!:strength * 2
!:mime application/x-xz
+>7 byte&0xf 0x0 NONE
+>7 byte&0xf 0x1 CRC32
+>7 byte&0xf 0x4 CRC64
+>7 byte&0xf 0xa SHA-256
# 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
+>22 byte 1 \b, encrypted
!:mime application/x-lrzip
# https://fastcompression.blogspot.fi/2013/04/lz4-streaming-format-final.html
diff --git a/magic/Magdir/console b/magic/Magdir/console
index 022054dfea44..d31932d5834c 100644
--- a/magic/Magdir/console
+++ b/magic/Magdir/console
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: console,v 1.55 2020/04/19 17:30:55 christos Exp $
+# $File: console,v 1.63 2021/04/26 15:56:00 christos Exp $
# Console game magic
# Toby Deshane <hac@shoelace.digivill.net>
@@ -125,6 +125,7 @@
>0x14c byte x (Rev.%02u)
# Machine type. (SGB, CGB, SGB+CGB)
+# Old licensee code 0x33 is required for SGB, but not CGB.
>0x14b byte 0x33
>>0x146 byte 0x03
>>>0x143 byte&0x80 0x80 [SGB+CGB]
@@ -133,6 +134,8 @@
>>>0x143 byte&0xC0 0x80 [CGB]
>>>0x143 byte&0xC0 0xC0 [CGB ONLY]
>0x14b byte !0x33
+>>0x143 byte&0xC0 0x80 [CGB]
+>>0x143 byte&0xC0 0xC0 [CGB ONLY]
# Mapper.
>0x147 byte 0x00 [ROM ONLY]
@@ -178,7 +181,7 @@
# RAM size.
>0x149 byte 1 \b, RAM: 16Kbit
>0x149 byte 2 \b, RAM: 64Kbit
->0x149 byte 3 \b, RAM: 128Kbit
+>0x149 byte 3 \b, RAM: 256Kbit
>0x149 byte 4 \b, RAM: 1Mbit
>0x149 byte 5 \b, RAM: 512Kbit
@@ -486,17 +489,17 @@
#------------------------------------------------------------------------------
# Sony Playstation executables (Adam Sjoegren <asjo@diku.dk>) :
0 string PS-X\ EXE Sony Playstation executable
->16 lelong x PC=0x%08x,
->20 lelong !0 GP=0x%08x,
->24 lelong !0 .text=[0x%08x,
->>28 lelong x \b0x%x],
->32 lelong !0 .data=[0x%08x,
->>36 lelong x \b0x%x],
->40 lelong !0 .bss=[0x%08x,
->>44 lelong x \b0x%x],
->48 lelong !0 Stack=0x%08x,
+>16 lelong x PC=%#08x,
+>20 lelong !0 GP=%#08x,
+>24 lelong !0 .text=[%#08x,
+>>28 lelong x \b%#x],
+>32 lelong !0 .data=[%#08x,
+>>36 lelong x \b%#x],
+>40 lelong !0 .bss=[%#08x,
+>>44 lelong x \b%#x],
+>48 lelong !0 Stack=%#08x,
>48 lelong =0 No Stack!,
->52 lelong !0 StackSize=0x%x,
+>52 lelong !0 StackSize=%#x,
#>76 string >\0 (%s)
# Area:
>113 string x (%s)
@@ -768,7 +771,7 @@
>>>>0x40 leshort !0
>>>>>0x40 lestring16 x \b, metadata: "%s"
>>0x17 byte &0x40 \b, ROM:
->>>(0x18.l-26) lelong x CRC32 0x%08x
+>>>(0x18.l-26) lelong x CRC32 %#08x
>>>(0x18.l-23) string x "%s"
# Type: scummVM savegame files
@@ -1003,6 +1006,11 @@
# Reference: https://3dbrew.org/wiki/3DSX_Format
0 string 3DSX Nintendo 3DS Homebrew Application (3DSX)
+# Type: Nintendo 3DS Banner Model Data.
+# From: David Korth <gerbilsoft@gerbilsoft.com>
+# Reference: https://3dbrew.org/wiki/CBMD
+0 string CBMD\0\0\0\0 Nintendo 3DS Banner Model Data
+
#------------------------------------------------------------------------------
# a7800: file(1) magic for the Atari 7800 raw ROM format.
# From: David Korth <gerbilsoft@gerbilsoft.com>
@@ -1101,3 +1109,31 @@
>0x2C byte >0x20 Nintendo Badge Arcade badge set:
>>0x2C string x "%.48s"
>>0x24 ulelong x \b, set ID: %u
+
+#------------------------------------------------------------------------------
+# sufami: file(1) magic for Sufami Turbo ROM images.
+# From: David Korth <gerbilsoft@gerbilsoft.com>
+# References:
+# - https://problemkaputt.de/fullsnes.htm#snescartsufamiturbominicartridgeadaptor
+0 string BANDAI\ SFC-ADX
+>0x10 string !SFC-ADX\ BACKUP Sufami Turbo ROM image:
+>>0x10 string/T x "%.14s"
+>>0x30 byte x \b, ID %02X
+>>0x31 byte x \b%02X
+>>0x32 byte x \b%02X
+>>0x33 ubyte >0 \b, series index %u
+>>0x34 ubyte 0 [SlowROM]
+>>0x34 ubyte 1 [FastROM]
+>>0x35 ubyte 1 [SRAM]
+>>0x35 ubyte 3 [Special]
+
+# Type: Nintendo GameCube/Wii disc image (RVZ format)
+0 string RVZ\001 Nintendo
+>0x48 belong 1 GameCube
+!:mime application/x-gamecube-rom
+>0x48 belong 2 Wii
+!:mime application/x-wii-rom
+>0x48 default x GameCube/Wii
+>0x48 belong x disc image (RVZ format):
+>>0x58 use nintendo-gcn-disc-common
+
diff --git a/magic/Magdir/coverage b/magic/Magdir/coverage
index 69eab704933c..9f2c3dc91be9 100644
--- a/magic/Magdir/coverage
+++ b/magic/Magdir/coverage
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: coverage,v 1.2 2019/04/19 00:42:27 christos Exp $
+# $File: coverage,v 1.3 2021/02/23 00:51:10 christos Exp $
# xoverage: file(1) magic for test coverage data
# File formats used to store test coverage data
@@ -55,7 +55,7 @@
# Coverage reports generated by gcov
-# i.e. source code annoted with coverage information
+# i.e. source code annotated with coverage information
0 string \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Source:
>&0 search/128 \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Graph:
>>&0 search/128 \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Data: GCOV coverage report
diff --git a/magic/Magdir/crypto b/magic/Magdir/crypto
new file mode 100644
index 000000000000..72a90ace2829
--- /dev/null
+++ b/magic/Magdir/crypto
@@ -0,0 +1,5 @@
+
+#------------------------------------------------------------------------------
+# $File: crypto,v 1.2 2021/03/27 20:15:53 christos Exp $
+# crypto: file(1) magic for crypto formats
+#
diff --git a/magic/Magdir/database b/magic/Magdir/database
index a8a788effa8d..7f93f8e2da96 100644
--- a/magic/Magdir/database
+++ b/magic/Magdir/database
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: database,v 1.59 2020/03/25 01:49:58 christos Exp $
+# $File: database,v 1.63 2021/10/04 00:44:30 christos Exp $
# database: file(1) magic for various databases
#
# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
@@ -181,7 +181,10 @@
#!:mime application/x-dbase
>>>>>>>>>>>>0 use xbase-type
# database file
->>>>>>>>>>>>0 ubyte x \b DBF
+>>>>>>>>>>>>28 ubyte&0x04 =0 \b DBF
+!:ext dbf
+>>>>>>>>>>>>28 ubyte&0x04 =4 \b DataBaseContainer
+!:ext dbc
>>>>>>>>>>>>4 lelong 0 \b, no records
>>>>>>>>>>>>4 lelong >0 \b, %d record
# plural s appended
@@ -193,13 +196,14 @@
>>>>>>>>>>>>1 ubyte x \b, update-date
>>>>>>>>>>>>1 use xbase-date
# https://msdn.microsoft.com/de-de/library/cc483186(v=vs.71).aspx
-#>>>>>>>>>>>>29 ubyte =0 \b, codepage ID=0x%x
+#>>>>>>>>>>>>29 ubyte =0 \b, codepage ID=%#x
# 2~cp850 , 3~cp1252 , 0x1b~?? ; what code page is 0x1b ?
->>>>>>>>>>>>29 ubyte >0 \b, codepage ID=0x%x
+>>>>>>>>>>>>29 ubyte >0 \b, codepage ID=%#x
#>>>>>>>>>>>>28 ubyte&0x01 0 \b, no index file
+# MDX or CDX index
>>>>>>>>>>>>28 ubyte&0x01 1 \b, with index file .MDX
>>>>>>>>>>>>28 ubyte&0x02 2 \b, with memo .FPT
->>>>>>>>>>>>28 ubyte&0x04 4 \b, DataBaseContainer
+#>>>>>>>>>>>>28 ubyte&0x04 4 \b, DataBaseContainer
# 1st record offset + 1 = header size
>>>>>>>>>>>>8 uleshort >0
>>>>>>>>>>>>(8.s+1) ubyte >0
@@ -241,72 +245,111 @@
# 1 < version
>0 ubyte >1
>>0 ubyte 0x02 FoxBase
+!:mime application/x-dbf
+# like: ACCESS.DBF USER.DBF dbase3date.dbf mitarbei.dbf produkte.dbf umlaut-test-v2.dbf
# FoxBase+/dBaseIII+, no memo
>>0 ubyte 0x03 FoxBase+/dBase III
!:mime application/x-dbf
+# like: 92DATA.DBF MSCATLOG.DBF SYLLABI2.DBF SYLLABUS.DBF T4.DBF Teleadr.dbf us_city.dbf
# dBASE IV no memo file
>>0 ubyte 0x04 dBase IV
!:mime application/x-dbf
+# like: Quattro-test11.dbf umlaut-test-v4.dbf
# dBASE V no memo file
>>0 ubyte 0x05 dBase V
!:mime application/x-dbf
+# like: dbase4double.dbf Quattro-test2.dbf umlaut-test7.dbf
+!:ext dbf
+# probably Apollo Database Server 9.7? xBase (0x6)
+>>0 ubyte 0x06 Apollo
+!:mime application/x-dbf
+# like: ALIAS.DBF CRYPT.DBF PROCS.DBF USERS.DBF
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
+>>0 ubyte 0x2F FoxBase+/Dbase III plus, no memo
+!:mime application/x-dbf
+# no example
>>0 ubyte 0x30 Visual FoxPro
!:mime application/x-dbf
+# like: 26FRX.DBF 30DBC.DBF 30DBCPRO.DBF BEHINDSC.DBF USER_LEV.DBF
+# Microsoft Visual FoxPro Database Container File like: FOXPRO-DB-TEST.DBC TESTDATA.DBC TASTRADE.DBC
>>0 ubyte 0x31 Visual FoxPro, autoincrement
!:mime application/x-dbf
+# like: AI_Table.DBF dbase_31.dbf w_cityFoxpro.dbf
# Visual FoxPro, with field type Varchar or Varbinary
>>0 ubyte 0x32 Visual FoxPro, with field type Varchar
!:mime application/x-dbf
+# like: dbase_32.dbf
# dBASE IV SQL, no memo;dbv memo var size (Flagship)
>>0 ubyte 0x43 dBase IV, with SQL table
!:mime application/x-dbf
-# https://msdn.microsoft.com/en-US/library/st4a0s68(v=vs.80).aspx
-#>>0 ubyte 0x62 dBase IV, with SQL table
+# like: ASSEMBLY.DBF INVENTRY.DBF STAFF.DBF
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
+>>0 ubyte 0x62 dBase IV, with SQL table
#!:mime application/x-dbf
+# no example
# dBASE IV, with memo!!
>>0 ubyte 0x7b dBase IV, with memo
!:mime application/x-dbf
-# https://msdn.microsoft.com/en-US/library/st4a0s68(v=vs.80).aspx
-#>>0 ubyte 0x82 dBase IV, with SQL system
+# like: test3memo.DBF dbase5.DBF
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
+>>0 ubyte 0x82 dBase IV, with SQL system
#!:mime application/x-dbf
+# no example
# FoxBase+/dBaseIII+ with memo .DBT!
>>0 ubyte 0x83 FoxBase+/dBase III, with memo .DBT
!:mime application/x-dbf
+# like: T2.DBF t3.DBF biblio.dbf dbase_83.dbf dbase3dbt0_4.dbf fsadress.dbf stop.dbf
# VISUAL OBJECTS (first 1.0 versions) for the Dbase III files (NTX clipper driver); memo file
>>0 ubyte 0x87 VISUAL OBJECTS, with memo file
!:mime application/x-dbf
-# https://msdn.microsoft.com/en-US/library/st4a0s68(v=vs.80).aspx
-#>>0 ubyte 0x8A FoxBase+/dBase III, with memo .DBT
+# like: ACCESS.DBF dbase3date.dbf dbase3float.dbf holdings.dbf mitarbei.dbf
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
+>>0 ubyte 0x8A FoxBase+/dBase III, with memo .DBT
#!:mime application/x-dbf
+# no example
# dBASE IV with memo!
>>0 ubyte 0x8B dBase IV, with memo .DBT
!:mime application/x-dbf
+# like: animals.dbf archive.dbf callin.dbf dbase_8b.dbf phnebook.dbf t6.dbf
# dBase IV with SQL Table,no memo?
>>0 ubyte 0x8E dBase IV, with SQL table
!:mime application/x-dbf
+# like: dbase5.DBF test3memo.DBF test-memo.DBF
# .dbv and .dbt memo (Flagship)?
>>0 ubyte 0xB3 Flagship
-# https://msdn.microsoft.com/en-US/library/st4a0s68(v=vs.80).aspx
-#>>0 ubyte 0xCA dBase IV with memo .DBT
+!:mime application/x-dbf
+# no example
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
+>>0 ubyte 0xCA dBase IV with memo .DBT
#!:mime application/x-dbf
+# no example
# dBASE IV with SQL table, with memo .DBT
>>0 ubyte 0xCB dBase IV with SQL table, with memo .DBT
!:mime application/x-dbf
+# like: dbase5.DBF test3memo.DBF test-memo.DBF
# HiPer-Six format;Clipper SIX, with SMT memo file
>>0 ubyte 0xE5 Clipper SIX with memo
!:mime application/x-dbf
-# https://msdn.microsoft.com/en-US/library/st4a0s68(v=vs.80).aspx
-#>>0 ubyte 0xF4 dBase IV, with SQL table, with memo
+# like: dbase5.DBF test3memo.DBF test-memo.DBF testClipper.dbf DATA.DBF
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
+>>0 ubyte 0xF4 dBase IV, with SQL table, with memo
#!:mime application/x-dbf
+# no example
>>0 ubyte 0xF5 FoxPro with memo
!:mime application/x-dbf
-# https://msdn.microsoft.com/en-US/library/st4a0s68(v=vs.80).aspx
+# like: CUSTOMER.DBF FOXUSER1.DBF Invoice.DBF NG.DBF OBJSAMP.DBF dbase_f5.dbf kunde.dbf
+# probably Apollo Database Server 9.7 with SQL and memo mask? xBase (0xF6)
+>>0 ubyte 0xF6 Apollo, with SQL table with memo
+!:mime application/x-dbf
+# like: SCRIPTS.DBF
+# https://docs.microsoft.com/en-us/previous-versions/visualstudio/foxpro/st4a0s68(v=vs.80)
#>>0 ubyte 0xFA FoxPro 2.x, with memo
#!:mime application/x-dbf
+# no example
# unknown version (should not happen)
>>0 default x xBase
!:mime application/x-dbf
->>>0 ubyte x (0x%x)
+>>>0 ubyte x (%#x)
# flags in version byte
# DBT flag (with dBASE III memo .DBT)!!
# >>0 ubyte&0x80 >0 DBT_FLAG=%x
@@ -393,7 +436,7 @@
# Number of next available block for appending data
#>0 lelong =0 \b, next free block index %u
>0 lelong !0 \b, next free block index %u
-# no positiv block length
+# no positive block length
#>20 uleshort =0 \b, block length %u
>20 uleshort !0 \b, block length %u
# dBase III memo field terminated by \032\032
@@ -404,7 +447,7 @@
>0 lelong x dBase IV DBT
!:mime application/x-dbt
!:ext dbt
-# 8 character shorted main name of coresponding dBASE IV DBF file
+# 8 character shorted main name of corresponding dBASE IV DBF file
>8 ubelong >0x20000000
# skip unusual like for angest.dbt
>>20 uleshort >0
@@ -455,10 +498,131 @@
>>516 belong >0 \b, field length %d
>>>520 string >\0 \b, 1st item "%s"
+# Summary: DBASE Compound Index file *.CDX and FoxPro index *.IDX
+# From: Joerg Jenderek
+# URL: https://www.clicketyclick.dk/databases/xbase/format/cdx.html
+# https://www.clicketyclick.dk/databases/xbase/format/idx.html
+# https://www.clicketyclick.dk/databases/xbase/format/idx_comp.html
+# Reference: https://mark0.net/download/triddefs_xml.7z/defs/s/sybase-ianywhere-cdx.trid.xml
+# https://mark0.net/download/triddefs_xml.7z/defs/c/cdx-vfp7.trid.xml
+# like: kunde.cdx
+0 ulelong 0x1C00
+>0 use xbase-index
+# like: SYLLABI2.CDX SYLLABUS.CDX
+0 ulelong 0x0800
+>0 use xbase-index
+# often in xBase index pointer to root node 400h
+0 ulelong 0x0400
+# skip most Maple help database *.hdb with version tag handled by ./maple
+>1028 string !version
+# skip Maple help database hsum.hdb checking for valid reserved area
+>>492 quad =0
+# skip remaining Maple help database *.hdb by checking key length
+#>>>12 uleshort !0x000F KEY_LENGTHVALID
+>>>0 use xbase-index
+# display information about dBase/FoxPro index
+0 name xbase-index
+>0 ulelong x xBase
+!:mime application/x-dbase-index
+>14 ubyte &0x40 compound index
+# DCX for FoxPro database index like: TESTDATA.DCX
+!:ext cdx/dcx
+>14 ubyte ^0x40 index
+# only 1 example like: TEST.IDX
+!:ext idx
+# pointer to root node like: 1C00h 800h often 400h
+>0 ulelong !0x400 \b, root pointer %#x
+# Pointer to free node list: often 0 but -1 if not present
+>4 ulelong !0 \b, free node pointer %#x
+# MAYBE number of pages in file (Foxbase, FoxPro 1.x) or
+# http://www.foxpert.com/foxpro/knowlbits/files/knowlbits_200708_1.HTM
+# Whenever Visual FoxPro updates the index file it increments this reserved field
+# Reserved for internal use like: 02000000h 03000000h 460c0000h 780f0000h 89000000h 9fdc0100h often 0
+>8 ulelong !0 \b, reserved counter %#x
+# length of key like: mostly 000Ah 0028h (TEST.IDX)
+>12 uleshort !0x000A \b, key length %#x
+# index options like: 24h E0h E8h
+# 1~a unique index 8~index has FOR clause 32~compact index format 64~compound index header
+# 16~Bit vector (SoftC) 128~Structure index (FoxPro)
+>14 ubyte x \b, index options (%#x
+>14 ubyte &0x01 \b, unique
+>14 ubyte &0x08 \b, has FOR clause
+>14 ubyte &0x10 \b, bit vector (SoftC)
+>14 ubyte &0x20 \b, compact format
+#>14 ubyte &0x40 \b, compound header
+>14 ubyte &0x80 \b, structure
+>14 ubyte x \b)
+# WHAT EXACTLY IS THAT? index signature like: 0 (sybase-ianywhere-cdx.trid.xml) 1 (cdx-vfp7.trid.xml)
+>15 ubyte !0 \b, index signature %u
+# reserved area (0-bytes) til about 500, but not for uncompressed Index files *.idx
+>16 quad !0 \b, at 16 reserved %#llx
+>492 quad !0 \b, at 492 reserved %#llx
+# for IDX variant
+#>14 ubyte ^0x40 IDX
+# for CDX variant
+>14 ubyte &0x40
+# Ascending or descending: 0~ascending 1~descending
+>>502 uleshort x \b, sort order %u
+# Total expression length (FoxPro 2) like: 0 1
+>>504 uleshort !0 \b, expression length %u
+# FOR expression pool length like: 1
+>>506 uleshort !1 \b, FOR expression pool length %#x
+# reserved for internal use like: 0
+>>508 uleshort !0 \b, at 0x508 reserved %#x
+# Key expression pool length like: 1
+>>510 uleshort !1 \b, key expression pool length %#x
+# 512 - 1023 Key & FOR expression pool (uncompiled)
+>>512 quad !0 \b, key expression pool %#llx
+#>>520 quad !0 \b, key expression pool %#llx
+
+# Summary: dBASE IV Printer Form *.PRF
+# From: Joerg Jenderek
+# URL: https://en.wikipedia.org/wiki/.dbf#Other_file_types_found_in_dBASE
+# Reference: https://mark0.net/download/triddefs_xml.7z/defs/p/prf-dbase.trid.xml
+0 ubeshort 0x0400
+# skip some Xbase Index files *.ndx and Infocom (Z-machine 4) *.z4 handled by ./adventure
+# by looking for valid printer driver name extension
+>0x58 search/8 .PR2
+>>0 use xbase-prf
+# display information of dbase print form like printer driver *.PR2
+0 name xbase-prf dBase Printer Form
+!:mime application/x-dbase-prf
+!:ext prf
+# MAYBE version? like: 4~DBASE IV
+#>0 ubyte x \b, version %u
+# MAYBE flag like: 1~with output file name 0~not
+#>2 ubyte !0 \b, flag %u
+# optional printer text output file name like E:\DBASE\IV\T6.txt
+>3 string >\0 \b, output file %s
+# probably padding with nils til 0x53
+#>0x48 uquad !0 \b, at 0x48 padding %#llx
+# dBASE IV printer driver name like: Generic.PR2 ASCII.PR2
+>0x56 string >\0 \b, using printer driver %s
+# 2 is probably last character of previous dBASE printer driver name
+#>0x60 ubyte !0x32 \b, at 0x60 %#x
+# probably padding with nils til 0xa8
+#>0x61 uquad !0 \b, at 0x61 padding %#llx
+# unknown 0x03020300 0x03020100 at 0xa8
+>0xa8 ubelong x \b, at 0xa8 unknown %#8.8x
+# probably padding with nils til 0x2aa
+#>0x2a0 uquad !0 \b, at 0x2a0 padding %#llx
+# unknown 0x100ff7f01000001 at 0x2AB
+>0x2ab ubequad !0x100ff7f01000001 \b, at 0x2ab unknown %#llx
+# unknown 0x0042 at 0x2b3
+>0x2b3 ubeshort !0x0042 \b, at 0x2b3 unknown %#4.4x
+# unknown last 4 bytes at 0x2b6 like: 0 0x23
+>0x2b6 ubelong !0 \b, at 0x2b6 unknown %#8.8x
+
# TODO:
# DBASE index file *.NDX
-# DBASE Compound Index file *.CDX
-# dBASE IV Printer Driver *.PRF
+# dBASE compiled Format *.FMO
+# FoxPro Database memo file *.DCT
+# FoxPro Forms Memo *.SCT
+# FoxPro Generated Menu Program *.MPR
+# FoxPro Report *.FRX
+# FoxPro Report Memo *.FRT
+# Foxpro Generated Screen Program *.SPR
+# Foxpro memo *.PJT
## End of XBase database stuff
# MS Access database
@@ -485,9 +649,9 @@
>>12 ulelong 1 STreaMing
!:ext stm
# format_version 620h
->>8 uleshort x \b, version 0x%x
->>10 uleshort >0 revision 0x%4.4x
->>0 ubelong x \b, checksum 0x%8.8x
+>>8 uleshort x \b, version %#x
+>>10 uleshort >0 revision %#4.4x
+>>0 ubelong x \b, checksum %#8.8x
# Page size 4096 8192 32768
>>236 ulequad x \b, page size %lld
# database_state
diff --git a/magic/Magdir/der b/magic/Magdir/der
index 82cf70345bcb..d8a21cd57ef7 100644
--- a/magic/Magdir/der
+++ b/magic/Magdir/der
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: der,v 1.3 2020/02/16 20:45:21 christos Exp $
+# $File: der,v 1.4 2021/03/14 17:12:04 christos Exp $
# der: file(1) magic for DER encoded files
#
@@ -117,8 +117,9 @@
0 der seq
>&0 der seq
->>&0 der eoc Certificate
->>>&0 der int1=02 \b, Version=3
+>>&0 der eoc
+>>>&0 der int1=02 Certificate, Version=3
+>>>&0 der int1=x Certificate, Version=%s
>>&0 der int9=x \b, Serial=%s
>>&0 der seq
>>>&0 der obj_id9=2a864886f70d01010b
diff --git a/magic/Magdir/diff b/magic/Magdir/diff
index cd530d345e32..a6124e3f703b 100644
--- a/magic/Magdir/diff
+++ b/magic/Magdir/diff
@@ -1,11 +1,12 @@
#------------------------------------------------------------------------------
-# $File: diff,v 1.16 2017/03/17 22:20:22 christos Exp $
+# $File: diff,v 1.17 2020/08/22 18:16:58 christos Exp $
# diff: file(1) magic for diff(1) output
#
0 search/1 diff\040 diff output text
!:mime text/x-diff
-0 search/1 ***\040 diff output text
+0 search/1 ***\040
+>&0 search/1024 \n---\040 context diff output text
!:mime text/x-diff
0 search/1 Only\040in\040 diff output text
!:mime text/x-diff
@@ -16,15 +17,15 @@
!:mime text/x-diff
# bsdiff: file(1) magic for bsdiff(1) output
-0 string/b BSDIFF40 bsdiff(1) patch file
+0 string/b BSDIFF40 bsdiff(1) patch file
# unified diff
0 search/4096 ---\040
->&0 search/1024 \n
->>&0 search/1 +++\040
->>>&0 search/1024 \n
->>>>&0 search/1 @@ unified diff output text
+>&0 search/1024 \n
+>>&0 search/1 +++\040
+>>>&0 search/1024 \n
+>>>>&0 search/1 @@ unified diff output text
!:mime text/x-diff
!:strength + 90
diff --git a/magic/Magdir/digital b/magic/Magdir/digital
index f66e0bc55917..b2753b989859 100644
--- a/magic/Magdir/digital
+++ b/magic/Magdir/digital
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: digital,v 1.11 2013/01/11 16:45:23 christos Exp $
+# $File: digital,v 1.12 2021/07/03 14:01:46 christos Exp $
# Digital UNIX - Info
#
0 string =!<arch>\n________64E Alpha archive
@@ -53,6 +53,7 @@
#
# Locale data tables (MIPS and Alpha).
#
+# GRR: line below is too general as it matches also TTComp archive, ASCII, 2K handled by ./archive
0 short 0x0501 locale data table
>6 short 0x24 for MIPS
>6 short 0x40 for Alpha
diff --git a/magic/Magdir/editors b/magic/Magdir/editors
index 78f3a84056e6..48eaa116e3b3 100644
--- a/magic/Magdir/editors
+++ b/magic/Magdir/editors
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: editors,v 1.11 2017/03/17 21:35:28 christos Exp $
+# $File: editors,v 1.12 2020/10/11 20:28:07 christos Exp $
# T602 editor documents
# by David Necas <yeti@physics.muni.cz>
0 string @CT\ T602 document data,
@@ -11,7 +11,11 @@
# Vi IMproved Encrypted file
# by David Necas <yeti@physics.muni.cz>
+# updated by Osman Surkatty
0 string VimCrypt~ Vim encrypted file data
+>9 string 01! with zip cryptmethod
+>9 string 02! with blowfish cryptmethod
+>9 string 03! with blowfish2 cryptmethod
0 name vimnanoswap
>67 byte 0
diff --git a/magic/Magdir/elf b/magic/Magdir/elf
index f5e1af9a25bc..93abdc380db9 100644
--- a/magic/Magdir/elf
+++ b/magic/Magdir/elf
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: elf,v 1.80 2020/02/12 22:17:33 christos Exp $
+# $File: elf,v 1.87 2021/05/25 15:19:51 christos Exp $
# elf: file(1) magic for ELF executables
#
# We have to check the byte order flag to see what byte order all the
@@ -43,6 +43,14 @@
>2 leshort 0x0214 2.0
>0 leshort &0x0008 (LP64)
+0 name elf-riscv
+>0 lelong&0x00000001 0x00000001 RVC,
+>0 lelong&0x00000008 0x00000008 RVE,
+>0 lelong&0x00000006 0x00000000 soft-float ABI,
+>0 lelong&0x00000006 0x00000002 single-float ABI,
+>0 lelong&0x00000006 0x00000004 double-float ABI,
+>0 lelong&0x00000006 0x00000006 quad-float ABI,
+
0 name elf-le
>16 leshort 0 no file type,
!:mime application/octet-stream
@@ -62,7 +70,12 @@
# Core file detection is not reliable.
#>>>(0x38+0xcc) string >\0 of '%s'
#>>>(0x38+0x10) lelong >0 (signal %d),
->16 leshort &0xff00 processor-specific,
+>16 leshort &0xff00
+>>18 leshort !8 processor-specific,
+>>18 leshort 8
+>>>16 leshort 0xFF80 PlayStation 2 IOP module,
+!:mime application/x-sharedlib
+>>>16 leshort !0xFF80 processor-specific,
>18 clear x
>18 leshort 0 no machine,
>18 leshort 1 AT&T WE32100,
@@ -111,6 +124,9 @@
>18 leshort 19 Intel 80960,
>18 leshort 20 PowerPC or cisco 4500,
>18 leshort 21 64-bit PowerPC or cisco 7500,
+>>48 lelong 0 Unspecified or Power ELF V1 ABI,
+>>48 lelong 1 Power ELF V1 ABI,
+>>48 lelong 2 OpenPOWER ELF V2 ABI,
>18 leshort 22 IBM S/390,
>18 leshort 23 Cell SPU,
>18 leshort 24 cisco SVIP,
@@ -179,7 +195,7 @@
>18 leshort 90 Matsushita MN10200,
>18 leshort 91 picoJava,
>18 leshort 92 OpenRISC,
->18 leshort 93 ARC Cores Tangent-A5,
+>18 leshort 93 Synopsys ARCompact ARC700 cores,
>18 leshort 94 Tensilica Xtensa,
>18 leshort 95 Alphamosaic VideoCore,
>18 leshort 96 Thompson Multimedia,
@@ -218,6 +234,7 @@
>18 leshort 140 TI TMS320C6000 DSP family,
>18 leshort 141 TI TMS320C2000 DSP family,
>18 leshort 142 TI TMS320C55x DSP family,
+>18 leshort 144 TI Programmable Realtime Unit
>18 leshort 160 STMicroelectronics 64bit VLIW DSP,
>18 leshort 161 Cypress M8C,
>18 leshort 162 Renesas R32C series,
@@ -248,6 +265,7 @@
>18 leshort 189 Xilinx MicroBlaze 32-bit RISC,
>18 leshort 190 NVIDIA CUDA architecture,
>18 leshort 191 Tilera TILE-Gx,
+>18 leshort 195 Synopsys ARCv2/HS3x/HS4x cores,
>18 leshort 197 Renesas RL78 family,
>18 leshort 199 Renesas 78K0R,
>18 leshort 200 Freescale 56800EX,
@@ -265,8 +283,28 @@
>18 leshort 217 iCelero CoolEngine,
>18 leshort 218 Nanoradio Optimized RISC,
>18 leshort 243 UCB RISC-V,
+# only for 32-bit
+>>4 byte 1
+>>>36 use elf-riscv
+# only for 64-bit
+>>4 byte 2
+>>>48 use elf-riscv
+>18 leshort 244 Lanai 32-bit processor,
+>18 leshort 245 CEVA Processor Architecture Family,
+>18 leshort 246 CEVA X2 Processor Family,
>18 leshort 247 eBPF,
->18 leshort 251 NEC VE,
+>18 leshort 248 Graphcore Intelligent Processing Unit,
+>18 leshort 249 Imagination Technologies,
+>18 leshort 250 Netronome Flow Processor,
+>18 leshort 251 NEC Vector Engine,
+>18 leshort 252 C-SKY processor family,
+>18 leshort 253 Synopsys ARCv3 64-bit ISA/HS6x cores,
+>18 leshort 254 MOS Technology MCS 6502 processor,
+>18 leshort 255 Synopsys ARCv3 32-bit,
+>18 leshort 256 Kalray VLIW core of the MPPA family,
+>18 leshort 257 WDC 65816/65C816,
+>18 leshort 258 LoongArch,
+>18 leshort 259 ChipON KungFu32,
>18 leshort 0x1057 AVR (unofficial),
>18 leshort 0x1059 MSP430 (unofficial),
>18 leshort 0x1223 Adapteva Epiphany (unofficial),
@@ -296,7 +334,7 @@
>18 leshort 0xfebb NIOS (unofficial),
>18 leshort 0xfeed Moxie (unofficial),
>18 default x
->>18 leshort x *unknown arch 0x%x*
+>>18 leshort x *unknown arch %#x*
>20 lelong 0 invalid version
>20 lelong 1 version 1
diff --git a/magic/Magdir/espressif b/magic/Magdir/espressif
index 7a8616a1a48c..a97c09301fd1 100644
--- a/magic/Magdir/espressif
+++ b/magic/Magdir/espressif
@@ -1,5 +1,5 @@
-# $File: espressif,v 1.2 2019/11/15 21:03:14 christos Exp $
+# $File: espressif,v 1.3 2021/04/26 15:56:00 christos Exp $
# configuration dump of Tasmota firmware for ESP8266 based devices by Espressif
# URL: https://github.com/arendst/Sonoff-Tasmota/
# Reference: https://codeload.github.com/arendst/Sonoff-Tasmota/zip/release-6.2/
@@ -17,7 +17,7 @@
>>10 ubyte^0x64 x \b.%u
>>9 ubyte^0x63 x \b.%u
>>8 ubyte^0x62 x \b.%u
-#>8 ubelong x (0x%x)
+#>8 ubelong x (%#x)
# hostname[33] XORed
>>0x165 ubyte^0x1BF x \b, hostname %c
>>0x166 ubyte^0x1C0 >037 \b%c
diff --git a/magic/Magdir/filesystems b/magic/Magdir/filesystems
index 7b95a4f9c72f..283f9c4ac9b6 100644
--- a/magic/Magdir/filesystems
+++ b/magic/Magdir/filesystems
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: filesystems,v 1.133 2020/05/17 19:32:00 christos Exp $
+# $File: filesystems,v 1.145 2021/09/07 18:57:50 christos Exp $
# filesystems: file(1) magic for different filesystems
#
0 name partid
@@ -220,7 +220,7 @@
>>>>>>18 string =_ \b.
>>>>>>>19 string x \b%-.1s
>>>22 ubyte 0
->>>>21 ubyte x \b, from drive 0x%x
+>>>>21 ubyte x \b, from drive %#x
>>>22 ubyte >0
>>>>21 string x \b, from drive %s
>>>535 search/17 \x55\xAA
@@ -261,6 +261,18 @@
# for sector sizes with 512 or more Bytes
>0x1FE leshort 0xAA55 DOS/MBR boot sector
+# ExFAT
+3 string/w =EXFAT
+>0x1FE leshort 0xAA55
+>>0x6E ubyte 1
+>>>0x6F ubyte 0x80
+>>>0 ubyte 0xEB DOS/MBR boot sector,
+>>>0x69 ubyte x ExFAT Filesystem version %d.
+>>>0x68 ubyte x \b%d
+>>>0x6d ubyte x \b, (1<<%d) sectors per cluster
+>>>0x48 ulequad x \b, sectors %lld
+>>>0x64 ulelong x \b, serial number %#x
+
# keep old DOS/MBR boot sector as dummy for mbr and bootloader displaying
# only for sector sizes with 512 or more Bytes
0x1FE leshort 0xAA55 DOS/MBR boot sector
@@ -296,7 +308,7 @@
>>>>>(0x49.b) string Tabela\ de\ parti\207ao\ inv\240lida portuguese
>>>>>(0x49.b) string Tabla\ de\ partici\242n\ no\ v\240lida spanish
>>>>>(0x49.b) string Tavola\ delle\ partizioni\ non\ valida italian
->>>>>0x49 ubyte >0 at offset 0x%x
+>>>>>0x49 ubyte >0 at offset %#x
>>>>>>(0x49.b) string >\0 "%s"
# "Error loading operating system" nn=0xa3 for english version
# "Fehler beim Laden des Betriebssystems" nn=0xa7 for german version
@@ -304,7 +316,7 @@
# "Erro na inicializa\207ao do sistema operacional" nn=0xa7 for portuguese Brazilian version
# "Error al cargar sistema operativo" nn=0xa8 for spanish version
# "Errore durante il caricamento del sistema operativo" nn=0xae for italian version
->>>>>0x74 ubyte >0 at offset 0x%x
+>>>>>0x74 ubyte >0 at offset %#x
>>>>>>(0x74.b) string >\0 "%s"
# "Missing operating system" nn=0xc2 for english version
# "Betriebssystem fehlt" nn=0xcd for german version
@@ -312,7 +324,7 @@
# "Sistema operacional nao encontrado" nn=0xd4 for portuguese Brazilian version
# "Falta sistema operativo" nn=0xca for spanish version
# "Sistema operativo mancante" nn=0xe2 for italian version
->>>>>0x79 ubyte >0 at offset 0x%x
+>>>>>0x79 ubyte >0 at offset %#x
>>>>>>(0x79.b) string >\0 "%s"
# Microsoft Windows 95B to XP (https://thestarman.pcministry.com/asm/mbr/95BMEMBR.htm)
# assembler instructions: push ax;pop es;push ax;pop ds;cld;mov si,7c1b
@@ -327,7 +339,7 @@
>>>>(0x3C.b+0x0FF) string Ung\201ltige\ Partitionstabelle german
>>>>(0x3C.b+0x0FF) string Table\ de\ partition\ erron\202e french
>>>>(0x3C.b+0x0FF) string \215\245\257\340\240\242\250\253\354\255\240\357\ \342\240\241\253\250\346\240 russian
->>>>0x3C ubyte x at offset 0x%x+0xFF
+>>>>0x3C ubyte x at offset %#x+0xFF
>>>>(0x3C.b+0x0FF) string >\0 "%s"
# "Error loading operating system" nn=0x127 for english version
# "Fehler beim Laden des Betriebssystems" nn=0x12b for german version
@@ -400,12 +412,12 @@
>>>>(0x1b7.b+0x100) string >\0 "%s"
# https://thestarman.pcministry.com/asm/mbr/Win2kmbr.htm#DiskSigs
# https://en.wikipedia.org/wiki/MBR_disk_signature#ID
->>0x1b8 ulelong >0 \b, disk signature 0x%-.4x
+>>0x1b8 ulelong >0 \b, disk signature %#-.4x
# driveID/timestamp for Win 95B,98,98SE and ME. See https://thestarman.pcministry.com/asm/mbr/mystery.htm
>>0xDA uleshort 0
>>>0xDC ulelong >0 \b, created
# physical drive number (0x80-0xFF) when the Windows wrote that byte to the drive
->>>>0xDC ubyte x with driveID 0x%x
+>>>>0xDC ubyte x with driveID %#x
# hours, minutes and seconds
>>>>0xDf ubyte x at %x
>>>>0xDe ubyte x \b:%x
@@ -452,13 +464,13 @@
>>>397 search/4 Booting\040
>>>>408 search/4 HD1/\0 \b, Ranish MBR (
>>>>>416 string Writing\ changes... \b2.37
->>>>>>438 ubyte x \b,0x%x dots
+>>>>>>438 ubyte x \b,%#x dots
>>>>>>440 ubyte >0 \b,virus check
>>>>>>441 ubyte >0 \b,partition %c
#2.38,2.42,2.44
>>>>>416 string !Writing\ changes... \b
>>>>>>418 ubyte 1 \bvirus check,
->>>>>>419 ubyte x \b0x%x seconds
+>>>>>>419 ubyte x \b%#x seconds
>>>>>>420 ubyte&0x0F >0 \b,partition
>>>>>>>420 ubyte&0x0F <5 \b %x
>>>>>>>420 ubyte&0x0F 0Xf \b ask
@@ -491,25 +503,25 @@
# updated by Joerg Jenderek at Oct 2008
# variables according to grub-0.97/stage1/stage1.S or
# https://www.gnu.org/software/grub/manual/grub.html#Embedded-data
-# usual values are marked with comments to get only informations of strange GRUB loaders
+# usual values are marked with comments to get only information of strange GRUB loaders
>342 search/60 \0Geom\0
#>0 ulelong x %x=0x009048EB , 0x2a9048EB 0
>>0x41 ubyte <2
>>>0x3E ubyte >2 \b; GRand Unified Bootloader
# 0x3 for 0.5.95,0.93,0.94,0.96 0x4 for 1.90
->>>>0x3E ubyte x \b, stage1 version 0x%x
+>>>>0x3E ubyte x \b, stage1 version %#x
#If it is 0xFF, use a drive passed by BIOS
->>>>0x40 ubyte <0xFF \b, boot drive 0x%x
+>>>>0x40 ubyte <0xFF \b, boot drive %#x
# in most case 0,1,0x2e for GRUB 0.5.95
->>>>0x41 ubyte >0 \b, LBA flag 0x%x
->>>>0x42 uleshort <0x8000 \b, stage2 address 0x%x
-#>>>>0x42 uleshort =0x8000 \b, stage2 address 0x%x (usual)
->>>>0x42 uleshort >0x8000 \b, stage2 address 0x%x
-#>>>>0x44 ulelong =1 \b, 1st sector stage2 0x%x (default)
->>>>0x44 ulelong >1 \b, 1st sector stage2 0x%x
->>>>0x48 uleshort <0x800 \b, stage2 segment 0x%x
-#>>>>0x48 uleshort =0x800 \b, stage2 segment 0x%x (usual)
->>>>0x48 uleshort >0x800 \b, stage2 segment 0x%x
+>>>>0x41 ubyte >0 \b, LBA flag %#x
+>>>>0x42 uleshort <0x8000 \b, stage2 address %#x
+#>>>>0x42 uleshort =0x8000 \b, stage2 address %#x (usual)
+>>>>0x42 uleshort >0x8000 \b, stage2 address %#x
+#>>>>0x44 ulelong =1 \b, 1st sector stage2 %#x (default)
+>>>>0x44 ulelong >1 \b, 1st sector stage2 %#x
+>>>>0x48 uleshort <0x800 \b, stage2 segment %#x
+#>>>>0x48 uleshort =0x800 \b, stage2 segment %#x (usual)
+>>>>0x48 uleshort >0x800 \b, stage2 segment %#x
>>>>402 string Geom\0Hard\ Disk\0Read\0\ Error\0
>>>>>394 string stage1 \b, GRUB version 0.5.95
>>>>382 string Geom\0Hard\ Disk\0Read\0\ Error\0
@@ -533,7 +545,7 @@
# mbr partition table entries updated by Joerg Jenderek at Sep 2013
# skip Norton Utilities disc image data
>3 string !IHISK
-# skip Linux style boot sector starting with assember instructions mov 0x7c0,ax;
+# skip Linux style boot sector starting with assembler instructions mov 0x7c0,ax;
>>0 belong !0xb8c0078e
# not Linux kernel
>>>514 string !HdrS
@@ -548,7 +560,7 @@
>>>>>0 ubelong&0xFD000000 !0xE9000000
# skip FSInfosector
>>>>>>0 string !RRaA
-# skip 3rd sector of MS x86 bootloader with assember instructions cli;MOVZX EAX,BYTE PTR [BP+10];MOV ECX,
+# skip 3rd sector of MS x86 bootloader with assembler instructions cli;MOVZX EAX,BYTE PTR [BP+10];MOV ECX,
# https://thestarman.pcministry.com/asm/mbr/MSWIN41.htm
>>>>>>>0 ubequad !0xfa660fb64610668b
# skip 13rd sector of MS x86 bootloader
@@ -1114,9 +1126,9 @@
>>48 leshort 0xAA55 2
>>32 leshort 0xAA55 3
>>16 leshort 0xAA55 4
->>4 ubyte x : ID=0x%x
+>>4 ubyte x : ID=%#x
>>0 ubyte&0x80 0x80 \b, active
->>0 ubyte >0x80 0x%x
+>>0 ubyte >0x80 %#x
>>1 ubyte x \b, start-CHS (
>>1 use partition-chs
>>5 ubyte x \b), end-CHS (
@@ -1214,7 +1226,7 @@
# ERRorTeXT
>>181 search/166 Error\ \0\r\n NetBSD mbr
# NT Drive Serial Number https://thestarman.pcministry.com/asm/mbr/Win2kmbr.htm#DS
->>>0x1B8 ubelong >0 \b,Serial 0x%-.8x
+>>>0x1B8 ubelong >0 \b,Serial %#-.8x
# BOOTSEL definitions contains assembler instructions: int 0x13;pop dx;push dx;push dx
>>>0xbb search/71 \xcd\x13\x5a\x52\x52 \b,bootselector
# BOOT_EXTENDED definitions contains assembler instructions:
@@ -1265,38 +1277,38 @@
# variant used by testdisk of https://www.cgsecurity.org/wiki/Menu_MBRCode
>>>(0x1BC.s+8) ubyte&2 2 \b,TestDisk
#0x1~1,..,0x8~4,0x10~F,0x80~A enabled
-#>>>(0x1BC.s+10) ubyte x \b,flags 0x%x
+#>>>(0x1BC.s+10) ubyte x \b,flags %#x
#0x0~1,0x1~2,...,0x3~4,0x4~F,0x7~D default boot
-#>>>(0x1BC.s+11) ubyte x \b,cfg_def 0x%x
+#>>>(0x1BC.s+11) ubyte x \b,cfg_def %#x
# for older versions
>>>(0x1BC.s+9) ubyte <2
#>>>>(0x1BC.s+12) ubyte 18 \b,%hhu/18 seconds
>>>>(0x1BC.s+12) ubyte !18 \b,%u/18 seconds
# floppy A: or B:
->>>>(0x1BC.s+13) ubyte <2 \b,floppy 0x%x
+>>>>(0x1BC.s+13) ubyte <2 \b,floppy %#x
>>>>(0x1BC.s+13) ubyte >1
# 1st hard disc
-#>>>>>(0x1BC.s+13) ubyte 0x80 \b,drive 0x%x
+#>>>>>(0x1BC.s+13) ubyte 0x80 \b,drive %#x
# not 1st hard disc
->>>>>(0x1BC.s+13) ubyte !0x80 \b,drive 0x%x
+>>>>>(0x1BC.s+13) ubyte !0x80 \b,drive %#x
# for version >= 2 maximal timeout can be 65534
>>>(0x1BC.s+9) ubyte >1
#>>>>(0x1BC.s+12) uleshort 18 \b,%u/18 seconds
>>>>(0x1BC.s+12) uleshort !18 \b,%u/18 seconds
# floppy A: or B:
->>>>(0x1BC.s+14) ubyte <2 \b,floppy 0x%x
+>>>>(0x1BC.s+14) ubyte <2 \b,floppy %#x
>>>>(0x1BC.s+14) ubyte >1
# 1st hard disc
-#>>>>>(0x1BC.s+14) ubyte 0x80 \b,drive 0x%x
+#>>>>>(0x1BC.s+14) ubyte 0x80 \b,drive %#x
# not 1st hard disc
->>>>>(0x1BC.s+14) ubyte !0x80 \b,drive 0x%x
+>>>>>(0x1BC.s+14) ubyte !0x80 \b,drive %#x
>>>0 ubyte x \b)
# added by Joerg Jenderek
# In the second sector (+0x200) are variables according to grub-0.97/stage2/asm.S or
# grub-1.94/kern/i386/pc/startup.S
# https://www.gnu.org/software/grub/manual/grub.html#Embedded-data
-# usual values are marked with comments to get only informations of strange GRUB loaders
+# usual values are marked with comments to get only information of strange GRUB loaders
0x200 uleshort 0x70EA
# found only version 3.{1,2}
>0x206 ubeshort >0x0300
@@ -1318,9 +1330,9 @@
# GRUB 0.5.95 unofficial
>>>>0x20C ulelong&0x2E300000 0x2E300000
# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs
->>>>>0x20C ubyte x \b, identifier 0x%x
-#>>>>>0x20D ubyte =0 \b, LBA flag 0x%x (default)
->>>>>0x20D ubyte >0 \b, LBA flag 0x%x
+>>>>>0x20C ubyte x \b, identifier %#x
+#>>>>>0x20D ubyte =0 \b, LBA flag %#x (default)
+>>>>>0x20D ubyte >0 \b, LBA flag %#x
# GRUB version as string
>>>>>0x20E string >\0 \b, GRUB version %-s
# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default
@@ -1335,10 +1347,10 @@
# for 1.94 contains kernel image size
# for 0.93,0.94,0.96,0.97
# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs 6=vstafs 7=jfs 8=xfs 9=iso9660 a=ufs2
->>>>>0x210 ubyte x \b, identifier 0x%x
+>>>>>0x210 ubyte x \b, identifier %#x
# The flag for LBA forcing is in most cases 0
-#>>>>>0x211 ubyte =0 \b, LBA flag 0x%x (default)
->>>>>0x211 ubyte >0 \b, LBA flag 0x%x
+#>>>>>0x211 ubyte =0 \b, LBA flag %#x (default)
+>>>>>0x211 ubyte >0 \b, LBA flag %#x
# GRUB version as string
>>>>>0x212 string >\0 \b, GRUB version %-s
# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default
@@ -1358,16 +1370,16 @@
0 ulelong&0x804000E9 0x000000E9
!:strength +60
# mtools-3.9.8/msdos.h
-# usual values are marked with comments to get only informations of strange FAT systems
+# usual values are marked with comments to get only information of strange FAT systems
# valid sectorsize must be a power of 2 from 32 to 32768
>11 uleshort&0x001f 0
>>11 uleshort <32769
>>>11 uleshort >31
>>>>21 ubyte&0xf0 0xF0
>>>>>0 ubyte 0xEB DOS/MBR boot sector
->>>>>>1 ubyte x \b, code offset 0x%x+2
+>>>>>>1 ubyte x \b, code offset %#x+2
>>>>>0 ubyte 0xE9
->>>>>>1 uleshort x \b, code offset 0x%x+3
+>>>>>>1 uleshort x \b, code offset %#x+3
>>>>>3 string >\0 \b, OEM-ID "%-.8s"
#http://mirror.href.com/thestarman/asm/debug/debug2.htm#IHC
>>>>>>8 string IHC \b cached by Windows 9M
@@ -1392,9 +1404,9 @@
#>>>>>17 uleshort =0 \b, root entries %hu=0 (usual Fat32)
>>>>>19 uleshort >0 \b, sectors %u (volumes <=32 MB)
#>>>>>19 uleshort =0 \b, sectors %hu=0 (usual Fat32)
->>>>>21 ubyte >0xF0 \b, Media descriptor 0x%x
-#>>>>>21 ubyte =0xF0 \b, Media descriptor 0x%x (usual floppy)
->>>>>21 ubyte <0xF0 \b, Media descriptor 0x%x
+>>>>>21 ubyte >0xF0 \b, Media descriptor %#x
+#>>>>>21 ubyte =0xF0 \b, Media descriptor %#x (usual floppy)
+>>>>>21 ubyte <0xF0 \b, Media descriptor %#x
>>>>>22 uleshort >0 \b, sectors/FAT %u
#>>>>>22 uleshort =0 \b, sectors/FAT %hu=0 (usual Fat32)
>>>>>24 uleshort x \b, sectors/track %u
@@ -1413,18 +1425,18 @@
#>>>>>>>32 ulelong =0 \b, sectors %u (volumes > 32 MB)
# FAT<32 bit specific
>>>>>>>82 string/c !fat32
-#>>>>>>>>36 ubyte 0x80 \b, physical drive 0x%x=0x80 (usual harddisk)
-#>>>>>>>>36 ubyte 0 \b, physical drive 0x%x=0 (usual floppy)
+#>>>>>>>>36 ubyte 0x80 \b, physical drive %#x=0x80 (usual harddisk)
+#>>>>>>>>36 ubyte 0 \b, physical drive %#x=0 (usual floppy)
>>>>>>>>36 ubyte !0x80
->>>>>>>>>36 ubyte !0 \b, physical drive 0x%x
+>>>>>>>>>36 ubyte !0 \b, physical drive %#x
# VGA-copy CRC or
# in Windows NT bit 0 is a dirty flag to request chkdsk at boot time. bit 1 requests surface scan too
->>>>>>>>37 ubyte >0 \b, reserved 0x%x
-#>>>>>>>>37 ubyte =0 \b, reserved 0x%x
-# extended boot signatur value is 0x80 for NTFS, 0x28 or 0x29 for others
->>>>>>>>38 ubyte !0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>>37 ubyte >0 \b, reserved %#x
+#>>>>>>>>37 ubyte =0 \b, reserved %#x
+# extended boot signature value is 0x80 for NTFS, 0x28 or 0x29 for others
+>>>>>>>>38 ubyte !0x29 \b, dos < 4.0 BootSector (%#x)
>>>>>>>>38 ubyte&0xFE =0x28
->>>>>>>>>39 ulelong x \b, serial number 0x%x
+>>>>>>>>>39 ulelong x \b, serial number %#x
>>>>>>>>38 ubyte =0x29
>>>>>>>>>43 string <NO\ NAME \b, label: "%11.11s"
>>>>>>>>>43 string >NO\ NAME \b, label: "%11.11s"
@@ -1466,7 +1478,7 @@
>>>>>82 string/c fat32 \b, FAT (32 bit)
>>>>>>36 ulelong x \b, sectors/FAT %u
# https://technet.microsoft.com/en-us/library/cc977221.aspx
->>>>>>40 uleshort >0 \b, extension flags 0x%x
+>>>>>>40 uleshort >0 \b, extension flags %#x
#>>>>>>40 uleshort =0 \b, extension flags %hu
>>>>>>42 uleshort >0 \b, fsVersion %u
#>>>>>>42 uleshort =0 \b, fsVersion %u (usual)
@@ -1483,19 +1495,19 @@
>>>>>>50 default x
>>>>>>>50 uleshort x \b, Backup boot sector %u
# corrected by Joerg Jenderek at Feb 2011 according to https://thestarman.pcministry.com/asm/mbr/MSWIN41.htm#FSINFO
->>>>>>52 ulelong >0 \b, reserved1 0x%x
->>>>>>56 ulelong >0 \b, reserved2 0x%x
->>>>>>60 ulelong >0 \b, reserved3 0x%x
+>>>>>>52 ulelong >0 \b, reserved1 %#x
+>>>>>>56 ulelong >0 \b, reserved2 %#x
+>>>>>>60 ulelong >0 \b, reserved3 %#x
# same structure as FAT1X
-#>>>>>>64 ubyte =0x80 \b, physical drive 0x%x=80 (usual harddisk)
-#>>>>>>64 ubyte =0 \b, physical drive 0x%x=0 (usual floppy)
+#>>>>>>64 ubyte =0x80 \b, physical drive %#x=80 (usual harddisk)
+#>>>>>>64 ubyte =0 \b, physical drive %#x=0 (usual floppy)
>>>>>>64 ubyte !0x80
->>>>>>>64 ubyte >0 \b, physical drive 0x%x
+>>>>>>>64 ubyte >0 \b, physical drive %#x
# in Windows NT bit 0 is a dirty flag to request chkdsk at boot time. bit 1 requests surface scan too
->>>>>>65 ubyte >0 \b, reserved 0x%x
->>>>>>66 ubyte !0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>65 ubyte >0 \b, reserved %#x
+>>>>>>66 ubyte !0x29 \b, dos < 4.0 BootSector (%#x)
>>>>>>66 ubyte =0x29
->>>>>>>67 ulelong x \b, serial number 0x%x
+>>>>>>>67 ulelong x \b, serial number %#x
>>>>>>>71 string <NO\ NAME \b, label: "%11.11s"
>>>>>>>71 string >NO\ NAME \b, label: "%11.11s"
>>>>>>>71 string =NO\ NAME \b, unlabeled
@@ -1518,10 +1530,10 @@
>>>>>>>19 uleshort =0
# 0 sectors/FAT
# dos < 4.0 BootSector value found is 0x80
-#38 ubyte =0x80 \b, dos < 4.0 BootSector (0x%x)
+#38 ubyte =0x80 \b, dos < 4.0 BootSector (%#x)
>>>>>>>>22 uleshort =0 \b; NTFS
>>>>>>>>>24 uleshort >0 \b, sectors/track %u
->>>>>>>>>36 ulelong !0x800080 \b, physical drive 0x%x
+>>>>>>>>>36 ulelong !0x800080 \b, physical drive %#x
>>>>>>>>>40 ulequad >0 \b, sectors %lld
>>>>>>>>>48 ulequad >0 \b, $MFT start cluster %lld
>>>>>>>>>56 ulequad >0 \b, $MFTMirror start cluster %lld
@@ -1537,8 +1549,8 @@
#>>>>>>>>>>68 ulelong >127 \b, bytes/index block 2^(256-%d)
>>>>>>>>>>68 ubyte >127 \b, bytes/index block 2^(-1*%i)
>>>>>>>>>72 ulequad x \b, serial number 0%llx
->>>>>>>>>80 ulelong >0 \b, checksum 0x%x
-#>>>>>>>>>80 ulelong =0 \b, checksum 0x%x=0 (usual)
+>>>>>>>>>80 ulelong >0 \b, checksum %#x
+#>>>>>>>>>80 ulelong =0 \b, checksum %#x=0 (usual)
# unicode loadername size jump
>>>>>>>>>(0x200.s*2) ubyte x
# in next sector loadername terminated by unicode CTRL-D and $
@@ -1705,7 +1717,13 @@
>0x94 lelong x (of %d),
>0x50 string x name %s,
>0x98 ulelong x version %u,
->0xa0 ulelong x flags 0x%x
+>0xa0 ulelong x flags %#x
+
+0 ulequad 0x48414d3205172011 HAMMER2 filesystem (little-endian),
+>0x3b byte x volume %d,
+>0x28 ulequad/1073741824 x size %lluGB,
+>0x30 ulelong x version %u,
+>0x34 ulelong x flags %#x
# ext2/ext3 filesystems - Andreas Dilger <adilger@dilger.ca>
# ext4 filesystem - Eric Sandeen <sandeen@sandeen.net>
@@ -1727,12 +1745,12 @@
>>>0x464 lelong >0x0000007 ext4 filesystem data
# else large INCOMPAT?
>>0x460 lelong >0x000003f ext4 filesystem data
->0x468 belong x \b, UUID=%08x
->0x46c beshort x \b-%04x
->0x46e beshort x \b-%04x
->0x470 beshort x \b-%04x
->0x472 belong x \b-%08x
->0x476 beshort x \b%04x
+>0x468 ubelong x \b, UUID=%08x
+>0x46c ubeshort x \b-%04x
+>0x46e ubeshort x \b-%04x
+>0x470 ubeshort x \b-%04x
+>0x472 ubelong x \b-%08x
+>0x476 ubeshort x \b%04x
>0x478 string >0 \b, volume name "%s"
# General flags for any ext* fs
>0x460 lelong &0x0000004 (needs journal recovery)
@@ -1755,12 +1773,12 @@
# f2fs filesystem - Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>
0x400 lelong 0xF2F52010 F2FS filesystem
->0x46c belong x \b, UUID=%08x
->0x470 beshort x \b-%04x
->0x472 beshort x \b-%04x
->0x474 beshort x \b-%04x
->0x476 belong x \b-%08x
->0x47a beshort x \b%04x
+>0x46c ubelong x \b, UUID=%08x
+>0x470 ubeshort x \b-%04x
+>0x472 ubeshort x \b-%04x
+>0x474 ubeshort x \b-%04x
+>0x476 ubelong x \b-%08x
+>0x47a ubeshort x \b%04x
>0x147c lestring16 x \b, volume name "%s"
# Minix filesystems - Juan Cespedes <cespedes@debian.org>
@@ -1925,7 +1943,7 @@
#>>>0x60E ubequad 0
#>>>>0x600 ubequad !0
#!:mime application/x-ima
-#>>512 ubyte x \b, Media descriptor 0x%x
+#>>512 ubyte x \b, Media descriptor %#x
# without x86 jump instruction
#>>0 ulelong&0x804000E9 !0x000000E9
# assembler instructions: CLI;MOV SP,1E7;MOV AX;07c0;MOV
@@ -1935,7 +1953,7 @@
#>>0 ulelong&0x804000E9 =0x000000E9
# only x86 short jump instruction found
#>>>0 ubyte =0xEB
-#>>>>1 ubyte x \b, code offset 0x%x+2
+#>>>>1 ubyte x \b, code offset %#x+2
# https://thestarman.pcministry.com/DOS/ibm100/Boot.htm
# assembler instructions: CLI;MOV AX,CS;MOV DS,AX;MOV DX,0
#>>>>(1.b+2) ubequad 0xfa8cc88ed8ba0000 \b, PC-DOS 1.0 bootloader
@@ -1975,16 +1993,19 @@
>>38917 string 1 (version 1.0)
>>38917 string 2 (version 1.5)
>>38917 string 3 (version 2.0)
->>38917 byte >0x33 (unknown version, ID 0x%X)
->>38917 byte <0x31 (unknown version, ID 0x%X)
+>>38917 byte >0x33 (unknown version, ID %#X)
+>>38917 byte <0x31 (unknown version, ID %#X)
# The next line is not necessary because the MBR staff is done looking for boot signature
>0x1FE leshort 0xAA55 (DOS/MBR boot sector)
# "application id" which appears to be used as a volume label
->32808 string/T >\0 '%s'
+>32808 string/T >\0 '%.32s'
>34816 string \000CD001\001EL\ TORITO\ SPECIFICATION (bootable)
37633 string CD001 ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
!:mime application/x-iso9660-image
32777 string CDROM High Sierra CD-ROM filesystem data
+# "application id" which appears to be used as a volume label
+>32816 string/T >\0 '%.32s'
+
# CDROM Filesystems
# https://en.wikipedia.org/wiki/ISO_9660
@@ -2031,7 +2052,7 @@
>8 lelong &1 version #2
>8 lelong &2 sorted_dirs
>8 lelong &4 hole_support
->32 lelong x CRC 0x%x,
+>32 lelong x CRC %#x,
>36 lelong x edition %u,
>40 lelong x %u blocks,
>44 lelong x %u files
@@ -2041,7 +2062,7 @@
>8 belong &1 version #2
>8 belong &2 sorted_dirs
>8 belong &4 hole_support
->32 belong x CRC 0x%x,
+>32 belong x CRC %#x,
>36 belong x edition %u,
>40 belong x %u blocks,
>44 belong x %u files
@@ -2134,10 +2155,10 @@
>31 byte 3 (lzma),
>12 belong x %d bytes,
>8 bedate x %s,
->16 belong x Load Address: 0x%08X,
->20 belong x Entry Point: 0x%08X,
->4 belong x Header CRC: 0x%08X,
->24 belong x Data CRC: 0x%08X
+>16 belong x Load Address: %#08X,
+>20 belong x Entry Point: %#08X,
+>4 belong x Header CRC: %#08X,
+>24 belong x Data CRC: %#08X
# JFFS2 file system
0 leshort 0x1984 Linux old jffs2 filesystem data little endian
@@ -2281,20 +2302,20 @@
>>0x10060 string >\0 lockproto %s)
# Russell Coker <russell@coker.com.au>
-0x10040 string _BHRfS_M BTRFS Filesystem
->0x1012b string >\0 label "%s",
->0x10090 lelong x sectorsize %d,
->0x10094 lelong x nodesize %d,
->0x10098 lelong x leafsize %d,
->0x10020 belong x UUID=%08x-
->0x10024 beshort x \b%04x-
->0x10026 beshort x \b%04x-
->0x10028 beshort x \b%04x-
->0x1002a beshort x \b%04x
->0x1002c belong x \b%08x,
->0x10078 lequad x %lld/
->0x10070 lequad x \b%lld bytes used,
->0x10088 lequad x %lld devices
+0x10040 string _BHRfS_M BTRFS Filesystem
+>0x1012b string >\0 label "%s",
+>0x10090 lelong x sectorsize %d,
+>0x10094 lelong x nodesize %d,
+>0x10098 lelong x leafsize %d,
+>0x10020 ubelong x UUID=%08x-
+>0x10024 ubeshort x \b%04x-
+>0x10026 ubeshort x \b%04x-
+>0x10028 ubeshort x \b%04x-
+>0x1002a ubeshort x \b%04x
+>0x1002c ubelong x \b%08x,
+>0x10078 lequad x %lld/
+>0x10070 lequad x \b%lld bytes used,
+>0x10088 lequad x %lld devices
# dvdisaster's .ecc
# From: "Nelson A. de Oliveira" <naoliv@gmail.com>
@@ -2363,11 +2384,11 @@
>40 lelong x \b number of files %u,
>44 lelong x \b blocks available for writing %d,
>48 lelong x \b inodes in cache %d,
->52 lelong x \b inode file disk address 0x%x,
+>52 lelong x \b inode file disk address %#x,
>56 lelong x \b inode file inode number %u,
->60 lelong x \b address of last segment written 0x%x,
->64 lelong x \b address of next segment to write 0x%x,
->68 lelong x \b address of current segment written 0x%x
+>60 lelong x \b address of last segment written %#x,
+>64 lelong x \b address of next segment to write %#x,
+>68 lelong x \b address of current segment written %#x
0 string td\000 floppy image data (TeleDisk, compressed)
0 string TD\000 floppy image data (TeleDisk)
@@ -2399,7 +2420,7 @@
>0x16 leshort 0 UBIfs image
>0x08 lequad x \b, sequence number %llu
>0x10 leshort x \b, length %u
->0x04 lelong x \b, CRC 0x%08x
+>0x04 lelong x \b, CRC %#08x
0 lelong 0x23494255
>0x04 leshort <2
@@ -2433,3 +2454,53 @@
>0x400 pstring x serial: %s
#>0x500 pstring x unknown: %s
!:ext imgc
+
+# http://martin.hinner.info/fs/bfs/bfs-structure.html
+0 lelong 0x1BADFACE SCO UnixWare BFS filesystem
+
+# https://arstechnica.com/information-technology/2018/07/the-beos-filesystem/
+32 lelong 0x42465331 BE/OS BFS1 filesystem
+>36 lelong x \b, byte order %d
+>40 lelong x \b, block size %d
+>44 lelong x \b, block shift %d
+>48 lequad x \b, total blocks %lld
+>56 lequad x \b, used blocks %lld
+
+
+0 name next
+>0 lelong x \b, size %d
+>4 string x \b, label %s
+
+# https://opensource.apple.com/source/IOStorageFamily/IOStorageFamily-44.3\
+# /IONeXTPartitionScheme.h
+0 string NeXT NeXT version 1 disklabel
+>12 use next
+0 string dlV1 NeXT version 2 disklabel
+>12 use next
+0 string dlV2 NeXT version 3 disklabel
+>12 use next
+
+# bcachefs
+# From: Thomas Weißschuh <thomas@t-8ch.de>
+
+0 name bcachefs-uuid
+>0 ubelong x \b%08x
+>4 ubeshort x \b-%04x
+>6 ubeshort x \b-%04x
+>8 ubeshort x \b-%04x
+>10 ubelong x \b-%08x
+>14 ubeshort x \b%04x
+
+0x1018 string \xc6\x85\x73\xf6\x4e\x1a\x45\xca\x82\x65\xf5\x7f\x48\xba\x6d\x81 bcachefs
+>0x1068 lequad 8 \b, UUID=
+>>0x1038 use bcachefs-uuid
+>>0x1048 string >0 \b, label "%.32s"
+>>0x1010 uleshort x \b, version %u
+>>0x1012 uleshort x \b, min version %u
+>>0x107a byte x \b, device %d
+# assumes the first field is the members field
+>>0x12f4 ulelong 0x01 \b/UUID=
+>>>0x12f0 default x
+>>>&(0x107a.b*56) use bcachefs-uuid
+>>0x107b byte x \b, %d devices
+>>0x1090 byte ^0x02 \b (unclean)
diff --git a/magic/Magdir/fonts b/magic/Magdir/fonts
index b0b40083a5d7..c53822271e05 100644
--- a/magic/Magdir/fonts
+++ b/magic/Magdir/fonts
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: fonts,v 1.43 2019/07/16 11:11:31 christos Exp $
+# $File: fonts,v 1.46 2021/04/26 15:56:00 christos Exp $
# fonts: file(1) magic for font data
#
0 search/1 FONT ASCII vfont text
@@ -11,6 +11,7 @@
0 string %!PS-AdobeFont-1. PostScript Type 1 font text
>20 string >\0 (%s)
6 string %!PS-AdobeFont-1. PostScript Type 1 font program data
+>26 string >\0 (%s)
0 string %!FontType1 PostScript Type 1 font program data
6 string %!FontType1 PostScript Type 1 font program data
0 string %!PS-Adobe-3.0\ Resource-Font PostScript Type 1 font text
@@ -123,7 +124,15 @@
>10 leshort x \b%d
>40 string x %s
# Misc. DOS VGA fonts, from Albert Cahalan (acahalan@cs.uml.edu)
+# Update: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/CPI
+# Reference: http://www.delorie.com/djgpp/doc/rbinter/it/58/17.html
0 belong 0xff464f4e DOS code page font data collection
+!:mime font/x-dos-cpi
+!:ext cpi
+0 string \x7fDRFONT DR-DOS code page font data collection
+!:mime font/x-drdos-cpi
+!:ext cpi
7 belong 0x00454741 DOS code page font data
7 belong 0x00564944 DOS code page font data (from Linux?)
4098 string DOSFONT DOSFONT2 encrypted font data
@@ -158,7 +167,7 @@
# face size in points 3-72 SLSS03CG.FNT H1CELT72.FNT
>2 uleshort x %u
# face ID (must be unique)
->0 uleshort x \b, ID 0x%4.4x
+>0 uleshort x \b, ID %#4.4x
# lowest character index in face (4 but usually 32 for disk-loaded fonts)
#>36 uleshort !32 \b, unusual character index %u
# width of the widest character like 0 8 10 12 16 24 32
@@ -168,21 +177,21 @@
# thickening size in pixel like 0 1 2 3 4 5 6 7 8
#>58 uleshort x \b, %u thick
# lightening mask to eliminate pixels, usually 5555h
->62 uleshort !0x5555 \b, lightening mask 0x%x
+>62 uleshort !0x5555 \b, lightening mask %#x
# skewing mask to determine when to perform additional rotation when skewing, usually 5555h
->64 uleshort !0x5555 \b, skewing mask 0x%x
+>64 uleshort !0x5555 \b, skewing mask %#x
# offset to optional horizontal offset table 0 58h~88 5eh 252h
-#>68 ulelong x \b, 0x%x horizontal table offset
+#>68 ulelong x \b, %#x horizontal table offset
# offset of character offset table 54h for many *.GFT 55h 58h 5Eh 120h 1D4h 202h 220h
-#>72 ulelong x \b, 0x%x coffset
+#>72 ulelong x \b, %#x coffset
# offset to font data like 116h 118h 158 20Ah 20Eh
->76 ulelong x \b, 0x%x foffset
+>76 ulelong x \b, %#x foffset
# form width in bytes like 58 67 156 190 227 317 345
#>80 uleshort x \b, %u fwidth
# form height in bytes like 4 8 11 17 26 56 70 90 120 146 150
#>82 uleshort x \b, %u fheight
# pointer to the next font like 0 10000h 20000h 30000h 40000h 60000h 80000h E0000h D0000h
-#>84 ulelong x \b, 0x%x noffset
+#>84 ulelong x \b, %#x noffset
# downloadable fonts for browser (prints type) anthon@mnt.org
# https://tools.ietf.org/html/rfc3073
@@ -221,7 +230,7 @@
# tag names consist of up to four characters padded with spaces at end like
# BASE DSIG OS/2 Zapf acnt glyf cvt vmtx xref ...
>>12 regex/4l \^[A-Za-z][A-Za-z][A-Za-z/][A-Za-z2\ ]
-#>>>0 ubelong x \b, sfnt version 0x%x
+#>>>0 ubelong x \b, sfnt version %#x
>>>0 ubelong !0x4f54544f TrueType
!:mime font/sfnt
!:apple ????tfil
@@ -253,7 +262,7 @@
#>>>>&8 ubelong >0x0100bd27 BIGGEST OFFSET
>>&8 ubelong >0x00100000
# offset of name table
->>>&-4 ubelong x \b, name offset 0x%x
+>>>&-4 ubelong x \b, name offset %#x
# GRR: pointer to name table only works if offset ~< FILE_BYTES_MAX = 100000h defined in src\file.h
>>&8 ubelong <0x00100000
>>>&-16 ubelong x
@@ -284,7 +293,7 @@
>>>>>&-2 ubeshort 1 \b, Macintosh
>>>>>&-2 ubeshort 3 \b, Microsoft
# languageID (0~english Macintosh, 0409h~english Microsoft, ...)
->>>>>&2 ubeshort >0 \b, language 0x%x
+>>>>>&2 ubeshort >0 \b, language %#x
# name identifiers
# often 0~copyright, 1~font, 2~font subfamily, 5~version, 13~license, 19~sample, ...
>>>>>&4 ubeshort >0 \b, type %d string
@@ -339,7 +348,7 @@
# 0x44454947 = 'DSIG'
>>>&4 belong 0x44534947 \b, digitally signed
# offset to 1st font
->>12 ubelong x \b, at 0x%x
+>>12 ubelong x \b, at %#x
# point to 1st font that starts with sfnt version
>>(12.L) use sfnt-font
diff --git a/magic/Magdir/forth b/magic/Magdir/forth
index cfbcef55482b..34c918152aec 100644
--- a/magic/Magdir/forth
+++ b/magic/Magdir/forth
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: forth,v 1.1 2019/06/06 19:14:20 christos Exp $
+# $File: forth,v 1.4 2021/04/26 15:56:00 christos Exp $
# forth: file(1) magic for various Forth environments
# From: Lubomir Rintel <lkundrak@v3.sk>
#
@@ -16,16 +16,18 @@
0 regex \^:[[:space:]].*[[:space:]]\\(([[:space:]].*)?\ --\ (.*[[:space:]])?\\)[[:space:]].*[[:space:]];$ FORTH program
!:mime text/x-forth
-# Various dictionary images used by OpenFirware FORTH environent
+# Various dictionary images used by OpenFirware FORTH environment
0 lelong 0xe1a00000
->8 lelong 0xe1a00000 ARM OpenFirmware FORTH Dictionary,
->>24 lelong x Text length: %d bytes,
->>28 lelong x Data length: %d bytes,
->>32 lelong x Text Relocation Table length: %d bytes,
->>36 lelong x Data Relocation Table length: %d bytes,
->>40 lelong x Entry Point: 0x%08X,
->>44 lelong x BSS length: %d bytes
+>8 lelong 0xe1a00000
+# skip raspberry pi kernel image kernel7.img by checking for positive text length
+>>24 lelong >0 ARM OpenFirmware FORTH Dictionary,
+>>>24 lelong x Text length: %d bytes,
+>>>28 lelong x Data length: %d bytes,
+>>>32 lelong x Text Relocation Table length: %d bytes,
+>>>36 lelong x Data Relocation Table length: %d bytes,
+>>>40 lelong x Entry Point: %#08X,
+>>>44 lelong x BSS length: %d bytes
0 string MP
>28 lelong 1 x86 OpenFirmware FORTH Dictionary,
@@ -35,18 +37,18 @@
>>8 leshort x Header length: %d paragraphs,
>>10 leshort x Data Size: %d
>>12 leshort x - %d 4K pages,
->>14 lelong x Initial Stack Pointer: 0x%08X,
->>20 lelong x Entry Point: 0x%08X,
+>>14 lelong x Initial Stack Pointer: %#08X,
+>>20 lelong x Entry Point: %#08X,
>>24 lelong x First Relocation Item: %d,
>>26 lelong x Overlay Number: %d,
->>18 leshort x Checksum: 0x%08X
+>>18 leshort x Checksum: %#08X
0 belong 0x48000020 PowerPC OpenFirmware FORTH Dictionary,
>4 belong x Text length: %d bytes,
>8 belong x Data length: %d bytes,
>12 belong x BSS length: %d bytes,
>16 belong x Symbol Table length: %d bytes,
->20 belong x Entry Point: 0x%08X,
+>20 belong x Entry Point: %#08X,
>24 belong x Text Relocation Table length: %d bytes,
>28 belong x Data Relocation Table length: %d bytes
@@ -55,7 +57,7 @@
>8 lelong x Data length: %d bytes,
>12 lelong x BSS length: %d bytes,
>16 lelong x Symbol Table length: %d bytes,
->20 lelong x Entry Point: 0x%08X,
+>20 lelong x Entry Point: %#08X,
>24 lelong x Text Relocation Table length: %d bytes,
>28 lelong x Data Relocation Table length: %d bytes
@@ -64,17 +66,17 @@
# Weak.
#0 short 0x5820 cForth 16-bit Dictionary,
-#>2 short x Serial: 0x%08X,
-#>4 short x Dictionary Start: 0x%08X,
+#>2 short x Serial: %#08X,
+#>4 short x Dictionary Start: %#08X,
#>6 short x Dictionary Size: %d bytes,
-#>8 short x User Area Start: 0x%08X,
+#>8 short x User Area Start: %#08X,
#>10 short x User Area Size: %d bytes,
-#>12 short x Entry Point: 0x%08X
+#>12 short x Entry Point: %#08X
0 long 0x581120 cForth 32-bit Dictionary,
->4 long x Serial: 0x%08X,
->8 long x Dictionary Start: 0x%08X,
+>4 long x Serial: %#08X,
+>8 long x Dictionary Start: %#08X,
>12 long x Dictionary Size: %d bytes,
->16 long x User Area Start: 0x%08X,
+>16 long x User Area Start: %#08X,
>20 long x User Area Size: %d bytes,
->24 long x Entry Point: 0x%08X
+>24 long x Entry Point: %#08X
diff --git a/magic/Magdir/fsav b/magic/Magdir/fsav
index 7ea094144e70..5c1d6e23dcfd 100644
--- a/magic/Magdir/fsav
+++ b/magic/Magdir/fsav
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: fsav,v 1.19 2019/04/19 00:42:27 christos Exp $
+# $File: fsav,v 1.22 2021/04/26 15:56:00 christos Exp $
# fsav: file(1) magic for datafellows fsav virus definition files
# Anthon van der Neut (anthon@mnt.org)
@@ -35,7 +35,7 @@
#>>>3 ubyte 0x1
#>>>>4 ubyte 0x0e
#>>>>>13 ubyte >0 fsav virus signatures
-#>>>>>>11 ubyte x size 0x%02x
+#>>>>>>11 ubyte x size %#02x
#>>>>>>12 ubyte x \b%02x
#>>>>>>13 ubyte x \b%02x bytes
@@ -59,7 +59,7 @@
# file: could not find any valid magic files! (No error)
>>10 default x (with buildtime)
#>>10 default x
-# clamtmp is used for temporily database like update process
+# clamtmp is used for temporarily database like update process
# for pure tar database only cld extension found
!:ext cld/cvd/clamtmp/cud
>511 default x file
@@ -86,16 +86,16 @@
#>>>>>>>>>&1 regex \^[^:]{1,10} \b, %s
>>>>>>>>>&1 regex \^[^:]{1,10}
# padding with spaces
-#>>>>>>>>>>&1 ubequad x \b, padding 0x%16.16llx
+#>>>>>>>>>>&1 ubequad x \b, padding %#16.16llx
>510 ubyte =0x20
# inspect real database content
-#>>512 ubeshort x \b, database MAGIC 0x%x
+#>>512 ubeshort x \b, database MAGIC %#x
# ./archive handle pure tar archives
>>1012 quad =0 \b, with
>>>512 use tar-file
# not pure tar
>>1012 quad !0
-# one space at the end of text and then handles gziped archives by ./compress
+# one space at the end of text and then handles gzipped archives by ./compress
>>>512 string \037\213 \b, with
>>>>512 indirect x
diff --git a/magic/Magdir/games b/magic/Magdir/games
index 21e5328c5c94..65af681bad00 100644
--- a/magic/Magdir/games
+++ b/magic/Magdir/games
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: games,v 1.20 2020/02/01 16:32:33 christos Exp $
+# $File: games,v 1.24 2021/04/26 15:56:00 christos Exp $
# games: file(1) for games
# Fabio Bonelli <fabiobonelli@libero.it>
@@ -53,11 +53,11 @@
# dividing this by entry size (64) gives number of files
>>>8 ulelong/64 x \b, %u files
# offset to the beginning of the file table
->>>4 ulelong x \b, offset 0x%x
+>>>4 ulelong x \b, offset %#x
# 1st file entry
>>>(4.l) use pak-entry
# 2nd file entry
-#>>>4 ulelong+64 x \b, offset 0x%x
+#>>>4 ulelong+64 x \b, offset %#x
#>>>(4.l+64) use pak-entry
#
# display file table entry of Quake PAK archive
@@ -65,7 +65,7 @@
# normally entry start after header which implies offset 12 or higher
>56 ulelong >11
# the offset from the beginning of pak to beginning of this entry file contents
->>56 ulelong x at 0x%x
+>>56 ulelong x at %#x
# the size of file for this entry
>>60 ulelong x %u bytes
# 56 byte null-terminated entry name string includes path like maps/e1m1.bsp
@@ -276,7 +276,7 @@
# Summary: NetImmerse game engine file
# Extension .nif
# Created by: Abel Cheung <abelcheung@gmail.com>
-0 string NetImmerse\ File\ Format,\ Versio
+0 string NetImmerse\ File\ Format,\ Version
>&0 string n\ NetImmerse game engine file
>>&0 regex [0-9a-z.]+ \b, version %s
@@ -313,3 +313,208 @@
>>12 regex [0-9a-z.]+ saved by game version %s
0 string CIV6 Sid Meier's Civilization VI saved game
+
+# https://syzygy-tables.info/
+# From Michel Van den Bergh
+0 string \327f\f\245 Syzygy DTZ tablebase
+!:mime application/syzygy
+0 string q\350#] Syzygy WDL tablebase
+!:mime application/syzygy
+
+##############################################################################
+# Grand Theft Auto (GTA) file formats.
+#
+# Summary:
+# Includes GTA-specific formats used in all games from 1997 to present. Games
+# and formats were created by Rockstar North, formerly DMA Design. Magic tests
+# were written based on a combination of official and community documentation.
+#
+# Created by: Oliver Galvin <odg@riseup.net>
+#
+# References:
+# * Classic GTA documentation and research:
+# <https://gitlab.com/classic-gta/gta-data>
+# * Official RenderWare documentation available from EA:
+# <https://github.com/electronicarts/RenderWare3Docs>
+# * Lots of community research in the GTAMods wiki:
+# <https://gtamods.com/wiki>
+
+# GTA 2D-Era data - 'Classic' top down games (1/L/2)
+
+## GTA text
+
+0 string \xbf\xf8\xbd\x49\x62\xbe GTA1 in-game text (FXT),
+0 string GBL GTA2 in-game text (GXT),
+>3 string E English,
+>>4 uleshort x version %d
+>3 string F French,
+>>4 uleshort x version %d
+>3 string G German,
+>>4 uleshort x version %d
+>3 string I Italian,
+>>4 uleshort x version %d
+>3 string S Spanish,
+>>4 uleshort x version %d
+>3 string J Japanese,
+>>4 uleshort x version %d
+
+## GTA maps
+
+0 ulelong 331 GTA1 map layout (CMP),
+>4 byte 1 Level 1
+>4 byte 2 Level 2
+>4 byte 3 Level 3
+0 string GBMP GTA2/GBH map layout (GMP),
+>4 uleshort x version %d
+0 string/t [MapFiles] GTA2 multiplayer map metadata (MMP)
+0 string/t MainOrBonus\ =\ MAIN GTA2 single player map listing (test1.seq)
+
+## GTA 2D sprites and textures
+
+0 ulelong 290 GTA1 style data (GRX), 8 bit editor graphics
+0 ulelong 325 GTA1 style data (GRY), 8 bit in-game graphics
+0 ulelong 336 GTA1 style data (G24), 24 bit in-game graphics
+0 string GBST GTA2/GBH style data (STY), in-game graphics,
+>4 uleshort x version %d
+
+## GTA audio index
+
+0 ulelong 0
+>4 ulelong <0x40000
+>>8 ulelong >4500
+>>>8 ulelong <45000 GTA audio index data (SDT)
+
+## GTA scripts
+
+0 ulelong 0x00080000
+>4 uleshort 0x0024 GTA2 binary main script (SCR)
+
+0 uleshort 0x063c GTA2 binary mission script (SCR), Residential area (ste)
+0 uleshort 0x055b GTA2 binary mission script (SCR), Downtown area (wil)
+0 uleshort 0x0469 GTA2 binary mission script (SCR), Industrial area (bil)
+
+0 string v9.6\0\0 GTA2 replay file (REP),
+>8 regex/30c [a-z0-9:\ ]+\0\0 created on %s
+
+# GTA 3D-Era (III/VC/SA/LCS/VCS) - used by the RenderWare engine by Criterion Games
+
+## GTA 3D models and textures - RenderWare binary streams
+
+8 ulelong 0x00000310 RenderWare data, v3.1.0.0, used in GTA III on PS2,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x0401ffff RenderWare data, v3.1.0.1, used in GTA III on PC/PS2,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x0800ffff RenderWare data, v3.2.0.0, used in GTA III on PC,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x0c00ffff RenderWare data, v3.3.0.0,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x0c02ffff RenderWare data, v3.3.0.2, used in GTA III PC and GTA VC PS2,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x1000ffff RenderWare data, v3.4.0.0,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x1003ffff RenderWare data, v3.4.0.3, used in GTA VC PC,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x1005ffff RenderWare data, v3.4.0.5, used in GTA III/VC on Android,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x1400ffff RenderWare data, v3.5.0.0, used in GTA III/VC on Xbox,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+8 ulelong 0x1803ffff RenderWare data, v3.6.0.3, used in GTA SA,
+>0 ulelong 0x00000016 texture archive (TXD)
+>0 ulelong 0x00000010 3D models (DFF)
+
+0 string COL RenderWare collision data (COL),
+>3 string L version 1, used in GTA III/VC/SA
+>3 string 2 version 2, used in GTA SA
+>3 string 3 version 3, used in GTA SA
+>3 string 4 version 4, used in GTA SA
+
+## GTA items and animations
+
+0 string/c #\ ipl\ generated\ from\ max\ file GTA Item Placement data (IPL), used in GTA III/VC
+0 string/b bnry GTA Item Placement data (IPL), used in GTA SA/IV,
+>4 ulelong x %d items
+
+0 string ANP GTA animation data (IFP),
+>3 string K version 1, used in GTA III/VC
+>3 string 3 version 2, used in GTA SA
+
+0 string GtaSA29 GTA Replay data (REP), used in GTA SA
+
+## GTA text
+
+0 string TKEY GTA in-game text (GXT), version 2, used in GTA III
+0 string TABL GTA in-game text (GXT), version 3, used in GTA VC/LS/VCS
+
+## GTA scripts
+
+0 string \x02\x00\x01 GTA script (SCM), used in GTA III/VC/SA
+
+## GTA archives
+
+0 string VER2 GTA archive (IMG), version 2, used in GTA SA,
+>4 ulelong x %d items
+
+# GTA HD-Era (IV/V) - used by the Rockstar Advanced Game Engine (RAGE)
+
+## GTA models and textures - RAGE resources
+# Note: GTA IV formats not yet documented - WAD, WBD, WBN, WHM, WPL
+
+0 ulelong 0x00695254 GTA Drawable data (WDR), model and weapon data, used in GTA IV
+0 ulelong 0x00695238 GTA Windows Frag Type (WFT), vehicle models, used in GTA IV
+0 ulelong 0x006953A4 GTA Ped and LOD models (WDD), used in GTA IV
+0 ulelong 0x00695384 GTA Windows Texture Dictionary (WTD), used in GTA IV
+
+## GTA text
+
+4 string TABL GTA in-game text (GXT),
+>0 uleshort x version %d, used in GTA SA/IV
+0 string 2GXT GTA in-game text (GXT2), used in GTA V
+
+## GTA scripts
+
+0 ulelong 0x0d524353 GTA script (SCO), unencrypted, used in GTA IV,
+>4 ulelong x %d code bytes,
+>>8 ulelong x %d static variables,
+>>>12 ulelong x %d global variables
+0 ulelong 0x0e726373 GTA script (SCO), encrypted, used in GTA IV
+>4 ulelong x %d code bytes,
+>>8 ulelong x %d static variables,
+>>>12 ulelong x %d global variables
+
+## GTA archives
+
+0 ulelong 0xa94e2a52 GTA archive (IMG),
+>4 ulelong x version %d, used in GTA IV,
+>>8 ulelong x %d items
+
+0 uleshort 0x5250 RAGE Package Format (RPF),
+>2 uleshort 0x4630 version 0, used in Rockstar Table Tennis,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
+>2 uleshort 0x4632 version 2, used in GTA IV,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
+>2 uleshort 0x4633 version 3, used in GTA IV Audio & Midnight Club: LA,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
+>2 uleshort 0x4634 version 4, used in Max Payne 3,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
+>2 uleshort 0x4636 version 6, used in RDR,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
+>2 uleshort 0x4637 version 7, used in GTA V,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
+>2 uleshort 0x4638 version 8, used in RDR 2,
+>>4 ulelong x %d bytes,
+>>>8 ulelong x %d entries
diff --git a/magic/Magdir/git b/magic/Magdir/git
index 4087fcd8de4b..67eab32a663a 100644
--- a/magic/Magdir/git
+++ b/magic/Magdir/git
@@ -1,13 +1,13 @@
#------------------------------------------------------------------------------
-# $File: git,v 1.1 2019/10/04 18:46:29 christos Exp $
+# $File: git,v 1.2 2020/08/09 16:57:15 christos Exp $
# git: file(1) magic for Git objects
0 string blob\040
->5 regex [0-9]+ Git blob %s
+>5 regex [0-9a-f]+ Git blob %s
0 string tree\040
->5 regex [0-9]+ Git tree %s
+>5 regex [0-9a-f]+ Git tree %s
0 string commit\040
->7 regex [0-9]+ Git commit %s
+>7 regex [0-9a-f]+ Git commit %s
diff --git a/magic/Magdir/gnome b/magic/Magdir/gnome
index 2905340c7e06..7a45d1d586ef 100644
--- a/magic/Magdir/gnome
+++ b/magic/Magdir/gnome
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: gnome,v 1.6 2019/04/19 00:42:27 christos Exp $
+# $File: gnome,v 1.7 2020/06/23 16:17:08 christos Exp $
# GNOME related files
# Contributed by Josh Triplett
@@ -55,5 +55,5 @@
0 string GOBJ\nMETADATA\r\n\032 G-IR binary database
>16 byte x \b, v%d
>17 byte x \b.%d
->20 leshort x \b, %d entries
->22 leshort x \b/%d local
+>20 short x \b, %d entries
+>22 short x \b/%d local
diff --git a/magic/Magdir/gnu b/magic/Magdir/gnu
index 29f0b05e1c08..761d657c4e84 100644
--- a/magic/Magdir/gnu
+++ b/magic/Magdir/gnu
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: gnu,v 1.22 2020/04/09 19:11:58 christos Exp $
+# $File: gnu,v 1.24 2021/04/26 15:56:00 christos Exp $
# gnu: file(1) magic for various GNU tools
#
# GNU nlsutils message catalog file format
@@ -33,48 +33,48 @@
# size of hashing table
#>20 ulelong x \b, %u hash
#>20 ulelong >1 \bes
-#>24 ulelong x at 0x%x
-# for revsion x.0 offset of table with originals is 1Ch if directly after header
+#>24 ulelong x at %#x
+# for revision x.0 offset of table with originals is 1Ch if directly after header
>4 ulelong&0x0000FFff =0
->>12 ulelong !0x1C \b, at 0x%x string table
+>>12 ulelong !0x1C \b, at %#x string table
# but for x.1 table offset i found is 30h. That means directly after bigger header
>4 ulelong&0x0000FFff >0
->>12 ulelong !0x30 \b, at 0x%x string table
+>>12 ulelong !0x30 \b, at %#x string table
# The following variables are only used in .mo files with minor revision >= 1
# number of system dependent segments
#>>28 ulelong x \b, %u segment
#>>28 ulelong >1 \bs
# offset of table describing system dependent segments
-#>>32 ulelong x at 0x%x
+#>>32 ulelong x at %#x
# number of system dependent strings pairs
>>36 ulelong x \b, %u sysdep message
>>36 ulelong >1 \bs
# offset of table with start offsets of original sysdep strings
-#>>40 ulelong x \b, at 0x%x sysdep strings
+#>>40 ulelong x \b, at %#x sysdep strings
# offset of table with start offsets of translated sysdep strings
-#>>44 ulelong x \b, at 0x%x sysdep translations
-# >>(44.l) ulelong x 0x%x chars
-# >>>&0 ulelong x at 0x%x
+#>>44 ulelong x \b, at %#x sysdep translations
+# >>(44.l) ulelong x %#x chars
+# >>>&0 ulelong x at %#x
# >>>>(&-4) string x "%s"
# string table after big header
-#>>48 ubequad x \b, string table 0x%llx
+#>>48 ubequad x \b, string table %#llx
#
# 0th string length seems to be always 0
#>(12.l) ulelong x \b, %u chars
-#>>&0 ulelong x at 0x%x
-# if 1st string length positiv inspect offset and string
+#>>&0 ulelong x at %#x
+# if 1st string length positive inspect offset and string
#>(12.l+8) ulelong >0 \b, %u chars
-#>>&0 ulelong x at 0x%x
-# if 2nd string length positiv inspect offset and string
+#>>&0 ulelong x at %#x
+# if 2nd string length positive inspect offset and string
# >(12.l+16) ulelong >0 \b, %u chars
-# >>&0 ulelong x at 0x%x
+# >>&0 ulelong x at %#x
# skip newline byte
#>>>(&-4) ubyte =0x0A
#>>>>&0 string x "%s"
#>>>(&-4) ubyte !0x0A
#>>>>&-1 string x '%s'
# offset of table with translation strings
-#>16 ulelong x \b, at 0x%x translation table
+#>16 ulelong x \b, at %#x translation table
# check translation 0 length and offset
>(16.l) ulelong >0
>>&0 ulelong x
@@ -100,11 +100,11 @@
# TODO: for big endian use same code as for little endian
#>0 use \^gettext-object
# DEBUG code
-#>16 ubelong x \b, at 0x%x translation table
-#>(16.L) ubelong x 0x%x chars
-#>>&0 ubelong x at 0x%x
+#>16 ubelong x \b, at %#x translation table
+#>(16.L) ubelong x %#x chars
+#>>&0 ubelong x at %#x
# unexpected value HERE!
-#>>>(&-4) ubequad x 0x%llx
+#>>>(&-4) ubequad x %#llx
#
>4 beshort x revision %d.
>6 beshort >0 \b%d,
diff --git a/magic/Magdir/gpt b/magic/Magdir/gpt
index 76a223c3a030..c2fd51c0dcb6 100644
--- a/magic/Magdir/gpt
+++ b/magic/Magdir/gpt
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: gpt,v 1.4 2017/03/17 21:35:28 christos Exp $
+# $File: gpt,v 1.5 2020/12/12 20:01:47 christos Exp $
#
# GPT Partition table patterns.
# Author: Rogier Goossens (goossens.rogier@gmail.com)
@@ -12,7 +12,7 @@
# This is kept separate, so that MBR partitions are not reported as well.
# (use -k if you do want them as well)
-# First, detect the MBR partiton table
+# First, detect the MBR partition table
# If more than one GPT protective MBR partition exists, don't print anything
# (the other MBR detection code will then just print the MBR partition table)
0x1FE leshort 0xAA55
diff --git a/magic/Magdir/gpu b/magic/Magdir/gpu
index 62e30d0f7a25..36d712443ba0 100644
--- a/magic/Magdir/gpu
+++ b/magic/Magdir/gpu
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: gpu,v 1.2 2017/03/23 22:11:53 christos Exp $
+# $File: gpu,v 1.3 2021/04/26 15:56:00 christos Exp $
# gpu: file(1) magic for GPU input files
# Standard Portable Intermediate Representation (SPIR)
@@ -8,12 +8,12 @@
# Typical file extension: .spv
0 belong 0x07230203 Khronos SPIR-V binary, big-endian
->4 belong x \b, version 0x%08x
->8 belong x \b, generator 0x%08x
+>4 belong x \b, version %#08x
+>8 belong x \b, generator %#08x
0 lelong 0x07230203 Khronos SPIR-V binary, little-endian
->4 lelong x \b, version 0x%08x
->8 lelong x \b, generator 0x%08x
+>4 lelong x \b, version %#08x
+>8 lelong x \b, generator %#08x
# Vulkan Trace file
# Documentation:
diff --git a/magic/Magdir/guile b/magic/Magdir/guile
deleted file mode 100644
index 99f837133c7c..000000000000
--- a/magic/Magdir/guile
+++ /dev/null
@@ -1,13 +0,0 @@
-
-#------------------------------------------------------------------------------
-# $File: guile,v 1.2 2019/04/19 00:42:27 christos Exp $
-# Guile file magic from <dalepsmith@gmail.com>
-# https://www.gnu.org/s/guile/
-# https://git.savannah.gnu.org/gitweb/?p=guile.git;f=libguile/_scm.h;hb=HEAD#l250
-
-0 string GOOF---- Guile Object
->8 string LE \b, little endian
->8 string BE \b, big endian
->11 string 4 \b, 32bit
->11 string 8 \b, 64bit
->13 regex .\.. \b, bytecode v%s
diff --git a/magic/Magdir/hitachi-sh b/magic/Magdir/hitachi-sh
index 18d83844515f..f64489f7fcf6 100644
--- a/magic/Magdir/hitachi-sh
+++ b/magic/Magdir/hitachi-sh
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: hitachi-sh,v 1.9 2018/08/21 12:48:41 christos Exp $
+# $File: hitachi-sh,v 1.10 2020/12/12 20:01:47 christos Exp $
# hitach-sh: file(1) magic for Hitachi Super-H
#
# Super-H COFF
@@ -16,7 +16,7 @@
# test for unused flag bits (0x8000,0x0800,0x0400,0x0200,x0080) in f_flags
>18 ubeshort&0x8E80 0
# use big endian variant of subroutine to display name+variables+flags
-# for common object formated files
+# for common object formatted files
>>0 use \^display-coff
!:strength -10
@@ -24,7 +24,7 @@
# test for unused flag bits in f_flags
>18 uleshort&0x8E80 0
# use little endian variant of subroutine to
-# display name+variables+flags for common object formated files
+# display name+variables+flags for common object formatted files
>>0 use display-coff
!:strength -10
diff --git a/magic/Magdir/human68k b/magic/Magdir/human68k
index b3d66ce5d089..707c74098b88 100644
--- a/magic/Magdir/human68k
+++ b/magic/Magdir/human68k
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: human68k,v 1.5 2009/09/19 16:28:09 christos Exp $
+# $File: human68k,v 1.6 2021/04/26 15:56:00 christos Exp $
# human68k: file(1) magic for Human68k (X680x0 DOS) binary formats
# Magic too short!
#0 string HU Human68k
@@ -12,7 +12,7 @@
#>(8.L+66) string #HUPAIR hupair
#>0 string HU X executable
#>(8.L+74) string #LIBCV1 - linked PD LIBC ver 1
-#>4 belong >0 - base address 0x%x
+#>4 belong >0 - base address %#x
#>28 belong >0 not stripped
#>32 belong >0 with debug information
#0 beshort 0x601a Human68k Z executable
diff --git a/magic/Magdir/ibm370 b/magic/Magdir/ibm370
index a49b28f5db80..dc976f8705ea 100644
--- a/magic/Magdir/ibm370
+++ b/magic/Magdir/ibm370
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: ibm370,v 1.10 2017/03/17 21:35:28 christos Exp $
+# $File: ibm370,v 1.11 2021/03/14 16:51:45 christos Exp $
# ibm370: file(1) magic for IBM 370 and compatibles.
#
# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
@@ -46,3 +46,7 @@
0 beshort 0535 SVR2 executable (USS/370)
>12 belong >0 not stripped
>24 belong >0 - version %d
+
+# NETDATA (https://en.wikipedia.org/wiki/NETDATA)
+# -\INMR01 In EBCDIC
+0 string \x60\xe0\xc9\xd5\xd4\xd9\xf0\xf1 IBM NETDATA file
diff --git a/magic/Magdir/ibm6000 b/magic/Magdir/ibm6000
index 2112e71652d3..724b64d3a5eb 100644
--- a/magic/Magdir/ibm6000
+++ b/magic/Magdir/ibm6000
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: ibm6000,v 1.14 2019/03/07 17:21:54 christos Exp $
+# $File: ibm6000,v 1.15 2021/07/03 14:01:46 christos Exp $
# ibm6000: file(1) magic for RS/6000 and the RT PC.
#
0 beshort 0x01df executable (RISC System/6000 V3.1) or obj module
@@ -10,7 +10,9 @@
#>2 byte 0x50 pure
#>28 belong >0 not stripped
#>6 beshort >0 - version %ld
+# GRR: line below is too general as it matches also TTComp archive, ASCII, 1K handled by ./archive
0 beshort 0x0104 shared library
+# GRR: line below is too general as it matches also TTComp archive, ASCII, 2K handled by ./archive
0 beshort 0x0105 ctab data
0 beshort 0xfe04 structured file
0 string 0xabcdef AIX message catalog
diff --git a/magic/Magdir/icc b/magic/Magdir/icc
index a8b57864bf0d..15fd76b8d512 100644
--- a/magic/Magdir/icc
+++ b/magic/Magdir/icc
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: icc,v 1.6 2019/11/15 21:03:14 christos Exp $
+# $File: icc,v 1.7 2021/04/26 15:56:00 christos Exp $
# icc: file(1) magic for International Color Consortium file formats
#
@@ -123,9 +123,9 @@
# seconds <= 59
>>>>>34 ubeshort x \b:%.2u
# vendor specific flags like 2 in HPCLJ5.ICM
->>>44 ubeshort >0 \b, 0x%x vendor flags
+>>>44 ubeshort >0 \b, %#x vendor flags
# profile flags bits 0-2 of least 16 used by ICC
-#>>>44 ubelong >0 \b, 0x%x flags
+#>>>44 ubelong >0 \b, %#x flags
# icEmbeddedProfileTrue
>>>44 ubelong &1 \b, embedded
# icEmbeddedProfileFalse
@@ -138,9 +138,9 @@
#>>>44 ubelong ^4 \b, no MCS
# vendor specific device attributes 1~srgb.icc
# E000D00h~CNB7QEDA.ICM C000A00h~CNB5FCAA.ICM 01040401h~CNB25PE3.ICM
->>>56 ubelong >0 \b, 0x%x vendor attribute
+>>>56 ubelong >0 \b, %#x vendor attribute
# ICC device attributes bits 0-7 used
-#>>>60 ubelong x \b, 0x%x attribute
+#>>>60 ubelong x \b, %#x attribute
# http://www.color.org/icc34.h
>>>60 ubelong &0x01 \b, transparent
#>>>60 ubelong ^0x01 \b, reflective
@@ -159,7 +159,7 @@
>>>60 ubelong &0x80 \b, self-luminous
#>>>60 ubelong ^0x80 \b, non-self-luminous
# rendering intent 0-3 but 7AEA5027h in EE051__1.ICM 6CB1BCh in EE061__1.ICM
->>>64 ubelong >3 \b, 0x%x rendering intent
+>>>64 ubelong >3 \b, %#x rendering intent
#>>>64 ubelong =0 \b, perceptual
>>>64 ubelong =1 \b, relative colorimetric
>>>64 ubelong =2 \b, saturation
@@ -168,16 +168,16 @@
>>>71 ubequad !0xd6000100000000d3 \b, PCS
# usually X~0.9642*65536=63189.8112~63190=F6D5h ; but also found
# often F6D6 in gt5000r.icm, F6B8 in kodakce.icm, F6CA in RSWOP.icm
->>>>68 ubelong !0x0000f6d5 X=0x%x
+>>>>68 ubelong !0x0000f6d5 X=%#x
# usually Y=1.0~00010000h but Y=0 in brmsl07f.icm
->>>>72 ubelong !0x00010000 Y=0x%x
+>>>>72 ubelong !0x00010000 Y=%#x
# usually Z~0.8249*65536=54060.6464~54061=D32Dh ; but also found
# D2F7 in hp1200c.icm, often D32C in A925A.icm, D309 in RSWOP.icm , D2F8 in kodak_dc.icm
->>>>76 ubelong !0x0000d32d Z=0x%x
+>>>>76 ubelong !0x0000d32d Z=%#x
# Profile ID. MD5 fingerprinting method as defined in Internet RFC 1321.
->>>84 ubequad >0 \b, 0x%llx MD5
+>>>84 ubequad >0 \b, %#llx MD5
# reserved in older versions should be zero but also found CDCDCDCDCDCDCDCD
-#>>100 ubequad x \b 0x%llx reserved
+#>>100 ubequad x \b %#llx reserved
# tag table
# 6 <= tags count <= 43
#>>>128 ubelong >43 \b, %u tags
@@ -191,8 +191,8 @@
>>>>132 default x \b, no copyright tag
# 1st tag
#>>>132 string x \b, 1st tag %.4s
-#>>>136 ubelong x 0x%x offset
-#>>>140 ubelong x 0x%x len
+#>>>136 ubelong x %#x offset
+#>>>140 ubelong x %#x len
# 2nd tag,...
# look also for profileDescriptionTag "desc"
>>>132 search/508 desc
diff --git a/magic/Magdir/iff b/magic/Magdir/iff
index 9437dd68e129..8da0350dbfac 100644
--- a/magic/Magdir/iff
+++ b/magic/Magdir/iff
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: iff,v 1.14 2015/09/07 10:03:21 christos Exp $
+# $File: iff,v 1.17 2021/02/23 01:07:32 christos Exp $
# iff: file(1) magic for Interchange File Format (see also "audio" & "images")
#
# Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic
@@ -41,8 +41,10 @@
>8 string ANIM \b, ANIM animation
>8 string YAFA \b, YAFA animation
>8 string SSA\ \b, SSA super smooth animation
+>8 string FANT \b, Fantavision animation
>8 string ACBM \b, ACBM continuous image
>8 string FAXX \b, FAXX fax image
+>8 string STFX \b, ST-Fax image
# other formats
>8 string FTXT \b, FTXT formatted text
>8 string CTLG \b, CTLG message catalog
@@ -51,7 +53,11 @@
>8 string PTCH \b, PTCH binary patch
>8 string AMFF \b, AMFF AmigaMetaFile format
>8 string WZRD \b, WZRD StormWIZARD resource
->8 string DOC\ \b, DOC desktop publishing document
+>8 string DOC\040 \b, DOC desktop publishing document
+>8 string SWRT \b, SWRT Final Copy/Writer document
+>8 string WORD \b, ProWrite document
+>8 string WTXT \b, WTXT Wordworth document
+>8 string WOWO \b, WOWO Wordworth document
>8 string WVQA \b, Westwood Studios VQA Multimedia,
>>24 leshort x %d video frames,
>>26 leshort x %d x
diff --git a/magic/Magdir/images b/magic/Magdir/images
index e6ebc5a030f2..6ce087255570 100644
--- a/magic/Magdir/images
+++ b/magic/Magdir/images
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: images,v 1.181 2020/05/30 23:49:03 christos Exp $
+# $File: images,v 1.205 2021/10/18 13:56:29 christos Exp $
# images: file(1) magic for image formats (see also "iff", and "c-lang" for
# XPM bitmaps)
#
@@ -30,24 +30,29 @@
# Conflict with MPEG sequences.
!:strength -40
# Prevent conflicts with CRI ADX.
->(2.S-2) belong !0x28632943
+#>(2.S-2) belong !0x28632943
+# above line does not work for rgb32_top_left_rle.tga
+# skip some MPEG sequence *.vob and some CRI ADX audio with improbable interleave bits
+>17 ubyte&0xC0 !0xC0
# skip more garbage like *.iso by looking for positive image type
>>2 ubyte >0
# skip some compiled terminfo like xterm+tmux by looking for image type less equal 33
>>>2 ubyte <34
+# skip some MPEG sequence *.vob HV001T01.EVO winnicki.mpg with unacceptable alpha channel depth 11
+>>>>17 ubyte&0x0F !11
# skip arches.3200 , Finder.Root , Slp.1 by looking for low pixel depth 1 8 15 16 24 32
->>>>16 ubyte 1
->>>>>0 use tga-image
->>>>16 ubyte 8
->>>>>0 use tga-image
->>>>16 ubyte 15
->>>>>0 use tga-image
->>>>16 ubyte 16
->>>>>0 use tga-image
->>>>16 ubyte 24
->>>>>0 use tga-image
->>>>16 ubyte 32
->>>>>0 use tga-image
+>>>>>16 ubyte 1
+>>>>>>0 use tga-image
+>>>>>16 ubyte 8
+>>>>>>0 use tga-image
+>>>>>16 ubyte 15
+>>>>>>0 use tga-image
+>>>>>16 ubyte 16
+>>>>>>0 use tga-image
+>>>>>16 ubyte 24
+>>>>>>0 use tga-image
+>>>>>16 ubyte 32
+>>>>>>0 use tga-image
# display tga bitmap image information
0 name tga-image
>2 ubyte <34 Targa image data
@@ -88,6 +93,7 @@
# Y origin of image. 0 normal; positive for top
>10 uleshort >0 +%d
# Image descriptor: bits 3-0 give the alpha channel depth, bits 5-4 give direction
+# alpha depth like: 1 8
>17 ubyte&0x0F >0 - %d-bit alpha
# bits 5-4 give direction. normal bottom left
>17 ubyte &0x20 - top
@@ -146,7 +152,7 @@
# VersionLetter
>>>>>&42 ubyte >0x20 \b%c
# KeyColor
->>>>&468 ulelong >0 - keycolor 0x%8.8x
+>>>>&468 ulelong >0 - keycolor %#8.8x
# Denominator of Pixel ratio. 0~no pixel aspect
>>>>&474 uleshort >0
# Numerator
@@ -158,36 +164,47 @@
>>>>>&-4 uleshort >0 - gamma %d
>>>>>&-2 uleshort x \b/%d
# ColorOffset
-#>>>>&480 ulelong x - col offset 0x%8.8x
+#>>>>&480 ulelong x - col offset %#8.8x
# StampOffset
-#>>>>&484 ulelong x - stamp offset 0x%8.8x
+#>>>>&484 ulelong x - stamp offset %#8.8x
# ScanOffset
-#>>>>&488 ulelong x - scan offset 0x%8.8x
+#>>>>&488 ulelong x - scan offset %#8.8x
# AttributesType
-#>>>>&492 ubyte x - Attributes 0x%x
+#>>>>&492 ubyte x - Attributes %#x
## EndOfTGA
# PBMPLUS images
+# URL: https://en.wikipedia.org/wiki/Netpbm
# The next byte following the magic is always whitespace.
-# strength is changed to try these patterns before "x86 boot sector"
+# adding 65 to strength so that Netpbm images comes before "x86 boot sector" or
+# "DOS/MBR boot sector" identified by ./filesystems
0 name netpbm
>3 regex/s =[0-9]{1,50}\ [0-9]{1,50} Netpbm image data
>>&0 regex =[0-9]{1,50} \b, size = %s x
>>>&0 regex =[0-9]{1,50} \b %s
0 search/1 P1
->0 regex/4 P1[\040\t\f\r\n]
->>0 use netpbm
->>0 string x \b, bitmap
+# test for whitespace after 2 byte magic
+>2 regex/2 [\040\t\f\r\n]
+# skip DROID x-fmt-164-signature-id-583.pbm with ten 0 digits
+>>3 string !000000000
+>>>0 use netpbm
+>>>0 string x \b, bitmap
!:strength + 65
!:mime image/x-portable-bitmap
+!:ext pbm
+# check for character # starting a comment line
+>>>3 ubyte =0x23
+>>>>4 string x %s
0 search/1 P2
>0 regex/4 P2[\040\t\f\r\n]
>>0 use netpbm
>>0 string x \b, greymap
!:strength + 65
-!:mime image/x-portable-greymap
+# american spelling gray
+!:mime image/x-portable-graymap
+!:ext pgm
0 search/1 P3
>0 regex/4 P3[\040\t\f\r\n]
@@ -195,6 +212,7 @@
>>0 string x \b, pixmap
!:strength + 65
!:mime image/x-portable-pixmap
+!:ext ppm
0 string P4
>0 regex/4 P4[\040\t\f\r\n]
@@ -202,6 +220,7 @@
>>0 string x \b, rawbits, bitmap
!:strength + 65
!:mime image/x-portable-bitmap
+!:ext pbm
0 string P5
>0 regex/4 P5[\040\t\f\r\n]
@@ -209,6 +228,7 @@
>>0 string x \b, rawbits, greymap
!:strength + 65
!:mime image/x-portable-greymap
+!:ext pgm
0 string P6
>0 regex/4 P6[\040\t\f\r\n]
@@ -216,9 +236,24 @@
>>0 string x \b, rawbits, pixmap
!:strength + 65
!:mime image/x-portable-pixmap
+!:ext ppm/pnm
-0 string P7 Netpbm PAM image file
-!:mime image/x-portable-pixmap
+# URL: https://en.wikipedia.org/wiki/Netpbm#PAM_graphics_format
+# Reference: http://fileformats.archiveteam.org/wiki/Portable_Arbitrary_Map
+# Update: Joerg Jenderek
+0 string P7
+# skip DROID fmt-405-signature-id-589.pam by looking for character like New Line
+>2 ubyte !0xAB
+#>2 ubyte =0x0A
+>>3 search/256/b WIDTH Netpbm PAM image file, size =
+!:mime image/x-portable-arbitrarymap
+!:ext pam
+!:strength + 65
+>>>&1 string x %s
+>>>3 search/256/b HEIGHT x
+>>>>&1 string x %s
+# at offset 2 a New Line character (0xA) should appear
+>>>2 ubyte !0x0A \b, %#x at offset 2 instead new line
# From: bryanh@giraffe-data.com (Bryan Henderson)
0 string \117\072 Solitaire Image Recorder format
@@ -256,16 +291,32 @@
>10 byte x \b, version %d.
>11 byte x \b%d
+# Fujifilm RAF RAW image files with embedded JPEG data and compressed
+# or uncompressed CFA RAW data. Byte order: Big Endian.
+# URL: https://libopenraw.freedesktop.org/formats/raf/
+# Useful info from http://fileformats.archiveteam.org/wiki/Fujifilm_RAF.
+# File extension: RAF
+# Works for both the FinePix S2 Pro and the X-T3. Anybody have some more Fuji
+# raw samples available?
+# -- David Dyer-Bennet <dd-b@dd-b.net> 9-Sep-2021
+0 string FUJIFILMCCD-RAW Fujifilm RAF raw image data
+!:mime image/x-fuji-raf
+!:ext raf
+>0x10 string x \b, format version %4.4s
+>0x1C string x \b, camera %s
+
# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
# The second word of TIFF files is the TIFF version number, 42, which has
# never changed. The TIFF specification recommends testing for it.
0 string MM\x00\x2a TIFF image data, big-endian
!:strength +70
!:mime image/tiff
+!:ext tif,tiff
>(4.L) use \^tiff_ifd
0 string II\x2a\x00 TIFF image data, little-endian
!:mime image/tiff
!:strength +70
+!:ext tif,tiff
>(4.l) use tiff_ifd
0 name tiff_ifd
@@ -312,7 +363,7 @@
>>>8 leshort 0x8798 \bJPEG2000
>>>8 leshort 0x8799 \bNikon NEF Compressed
>>>8 default x
->>>>8 leshort x \b(unknown 0x%x)
+>>>>8 leshort x \b(unknown %#x)
>>>12 use tiff_entry
>0 leshort 0x106 \b, PhotometricIntepretation=
>>8 clear x
@@ -325,7 +376,7 @@
>>8 leshort 6 \bYCbCr
>>8 leshort 8 \bCIELab
>>8 default x
->>>8 leshort x \b(unknown=0x%x)
+>>>8 leshort x \b(unknown=%#x)
>>12 use tiff_entry
# FillOrder
>0 leshort 0x10a
@@ -410,7 +461,7 @@
>0 leshort 0x8825 \b, GPS-Data
>>12 use tiff_entry
-#>0 leshort x \b, unknown=0x%x
+#>0 leshort x \b, unknown=%#x
#>>12 use tiff_entry
0 string MM\x00\x2b Big TIFF image data, big-endian
@@ -478,6 +529,7 @@
!:strength +80
!:mime image/gif
!:apple 8BIMGIFf
+!:ext gif
>4 string 7a \b, version 8%s,
>4 string 9a \b, version 8%s,
>6 leshort >0 %d x
@@ -506,7 +558,7 @@
# http://www.nationalarchives.gov.uk/pronom/fmt/930
0 search/256/bc id=imagemagick
# skip bad ASCII text by following new line~0x0A or space~0x20 character
-#>&0 ubyte x \b, next character 0x%x
+#>&0 ubyte x \b, next character %#x
# called by TriD ImageMagick Machine independent File Format bitmap
>&0 ubyte&0xD5 0 MIFF image data
# https://reposcope.com/mimetype/image/miff
@@ -580,18 +632,31 @@
0 string Sfff structured fax file
# From: Joerg Jenderek <joerg.jen.der.ek@gmx.net>
-# most files with the extension .EPA and some with .BMP
+# URL: http://fileformats.archiveteam.org/wiki/Award_BIOS_logo
+# Note: verified by XnView command `nconvert -fullinfo *.EPA`
0 string \x11\x06 Award BIOS Logo, 136 x 84
!:mime image/x-award-bioslogo
+!:ext epa
0 string \x11\x09 Award BIOS Logo, 136 x 126
!:mime image/x-award-bioslogo
+!:ext epa
+# https://telparia.com/fileFormatSamples/image/epa/IO.EPA
+# Note: by bitmap-awbm-v1x1009.trid.xml called "Award BIOS logo bitmap (128x126) (v1)"
+# verified by RECOIL `recoil2png -o tmp.png IO.EPA; file tmp.png`
+0 string \x10\x09 Award BIOS Logo, 128 x 126
+!:mime image/x-award-bioslogo
+!:ext epa
#0 string \x07\x1f BIOS Logo corrupted?
# http://www.blackfiveservices.co.uk/awbmtools.shtml
# http://biosgfx.narod.ru/v3/
# http://biosgfx.narod.ru/abr-2/
0 string AWBM
->4 leshort <1981 Award BIOS bitmap
-!:mime image/x-award-bmp
+# Note: by bitmap-awbm.trid.xml called "Award BIOS logo bitmap (v2)"
+>4 leshort <1981 Award BIOS Logo, version 2
+#>4 leshort <1981 Award BIOS bitmap
+!:mime image/x-award-bioslogo2
+#!:mime image/x-award-bmp
+!:ext epa/bmp
# image width is a multiple of 4
>>4 leshort&0x0003 0
>>>4 leshort x \b, %d
@@ -615,7 +680,7 @@
0 leshort 40
# skip bad samples like GAME by looking for valid number of color planes
>12 uleshort 1 Device independent bitmap graphic
-!:mime image/bmp
+!:mime image/x-ms-bmp
!:apple ????BMPp
!:ext dib
>>4 lelong x \b, %d x
@@ -635,12 +700,104 @@
#>>32 ulelong >0 \b, %u colors
# number of important colors used, or 0 when every color is important
>>36 ulelong >0 \b, %u important colors
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/VBM_(VDC_BitMap)
+# Reference: http://csbruce.com/cbm/postings/csc19950906-1.txt
+# http://mark0.net/download/triddefs_xml.7z
+# defs/b/bitmap-vbm.trid.xml
+# defs/b/bitmap-vbm-v3.trid.xml
+# Note: called "VDC BitMap" by TrID
+# verified by RECOIL `recoil2png -o tmp.png coke_can.vbm; file tmp.png`
+# begin with a signature of 'B' 'M' 0xCB, followed by a version byte 2 or 3
+# Similar to the unrelated Windows BMP format
+# check for VDC bitmap and then display image dimension and version
+0 name bitmap-vbm
+>2 ubyte 0xCB VDC bitmap
+!:mime image/x-commodore-vbm
+# http://recoil.sourceforge.net/formats.html
+!:ext bm/vbm
+# the VBM format version number: 2 or 3
+>>3 ubyte x \b, version %u
+# width of the image in Hi/Lo format
+>>4 ubeshort x \b, %u
+# height of the image
+>>6 ubeshort x x %u
+# version 3 images have the following additional header information
+>>3 ubyte =3
+# data-encoding type: 0~uncompressed 1~RLE-compressed
+>>>8 ubyte 0 \b, uncompressed
+>>>8 ubyte 1 \b, RLE-compressed
+# byte code for general RLE repetitions
+#>>>9 ubyte x \b, RLE repetition code 0x%x
+# reserved := 0
+#>>>14 short >0 \b, reserved 0x%x
+# length of comment text; 0~no comment text
+#>>>16 ubeshort >0 \b, comment length %u
+>>>16 pstring/H >0 \b, comment "%s"
+#
0 string BM
->14 leshort 12 PC bitmap, OS/2 1.x format
-!:mime image/x-ms-bmp
+# check for magic and version 2 of VDC bitmap or BMP with cbSize=715=CB02
+>2 beshort 0xCB02
+>>6 short =0
+>>>0 use bitmap-bmp
+# VDC bitmap height or maybe a few OS/2 BMP with nonzero "hotspot coordinates"
+>>6 short !0
+>>>0 use bitmap-vbm
+# check for magic and version 3 of VDC bitmap or BMP with cbSize=971=CB03
+>2 beshort 0xCB03
+# check for reserved value (=0) of VDC bitmap
+>>14 short =0
+>>>0 use bitmap-vbm
+# BMP with cbSize=????03CBh and dib header size != 0
+>>14 short !0
+>>>0 use bitmap-bmp
+# cbSize is size of header or file size of Windows BMP bitmap
+>2 default x
+>>0 use bitmap-bmp
+0 name bitmap-bmp
+>14 lelong 12 PC bitmap, OS/2 1.x format
+!:mime image/bmp
+!:ext bmp
>>18 leshort x \b, %d x
>>20 leshort x %d
->14 leshort 64 PC bitmap, OS/2 2.x format
+# number of color planes (must be 1)
+#>>22 leshort !1 \b, %u color planes
+# number of bits per pixel (color depth); found 4 8
+>>24 leshort x x %d
+# x, y coordinates of the hotspot
+>>6 uleshort >0 \b, hotspot %ux
+>>>8 uleshort x \b%u
+# cbSize; size of file or header like 1Ah 228C8h
+>>2 ulelong x \b, cbSize %u
+#>>2 ulelong x \b, cbSize 0x%8.8x
+# offBits; offset to bitmap data like:
+>>10 ulelong x \b, bits offset %u
+# http://fileformats.archiveteam.org/wiki/BMP#OS.2F2_BMP_2.0 no examples found
+>14 ulelong 48 PC bitmap, OS/2 2.x format (DIB header size=48)
+>14 ulelong 24 PC bitmap, OS/2 2.x format (DIB header size=24)
+# http://entropymine.com/jason/bmpsuite/bmpsuite/q/pal8os2v2-16.bmp
+# Note: by bitmap-bmp-v2o.trid.xml called "Windows Bitmap (v2o)"
+>14 ulelong 16 PC bitmap, OS/2 2.x format (DIB header size=16)
+!:mime image/bmp
+!:apple ????BMPp
+!:ext bmp
+# image width and height fields are unsigned integers for OS/2
+>>18 ulelong x \b, %u x
+>>22 ulelong x %u
+# number of bits per pixel (color depth); found 8
+>>28 uleshort >1 x %u
+# x, y coordinates of the hotspot
+>>6 uleshort >0 \b, hotspot %ux
+>>>8 uleshort x \b%u
+# number of color planes (must be 1)
+#>>26 uleshort >1 \b, %u color planes
+# cbSize; size of file like: 241E
+>>2 ulelong x \b, cbSize %u
+#>>2 ulelong x \b, cbSize 0x%x
+# offBits; offset to bitmap data like: 41E
+>>10 ulelong x \b, bits offset %u
+#>>10 ulelong x \b, bits offset 0x%x
+>14 lelong 64 PC bitmap, OS/2 2.x format
!:mime image/bmp
!:apple ????BMPp
!:ext bmp
@@ -655,30 +812,53 @@
>>26 uleshort >1 \b, %u color planes
# cbSize; size of file or headers
>>2 ulelong x \b, cbSize %u
-#>>2 ulelong x \b, cbSize 0x%x
+# BMP with cbSize 000002CBh=715 or 000003CBh=971 maybe misinterpreted as VDC bitmap
+#>>2 ulelong x \b, cbSize %#x
# offBits; offset to bitmap data like 56h 5Eh 8Eh 43Eh
>>10 ulelong x \b, bits offset %u
-#>>10 ulelong x \b, bits offset 0x%x
-#>>(10.l) ubequad !0 \b, bits 0x%16.16llx
+#>>10 ulelong x \b, bits offset %#x
+#>>(10.l) ubequad !0 \b, bits %#16.16llx
# BITMAPV2INFOHEADER adds RGB bit masks
->14 leshort 52 PC bitmap, Adobe Photoshop
+>14 lelong 52 PC bitmap, Adobe Photoshop
!:mime image/bmp
!:apple ????BMPp
!:ext bmp
>>18 lelong x \b, %d x
>>22 lelong x %d x
+# number of bits per pixel (color depth); found 16 32
>>28 leshort x %d
+# x, y coordinates of the hotspot; should be zero for Windows variant
+>>6 uleshort >0 \b, hotspot %ux
+>>>8 uleshort x \b%u
+# cbSize; size of file like: 14A 7F42
+>>2 ulelong x \b, cbSize %u
+#>>2 ulelong x \b, cbSize 0x%x
+# offBits; offset to bitmap data like: 42h
+>>10 ulelong x \b, bits offset %u
+#>>10 ulelong x \b, bits offset 0x%x
# BITMAPV3INFOHEADER adds alpha channel bit mask
->14 leshort 56 PC bitmap, Adobe Photoshop with alpha channel mask
+>14 lelong 56 PC bitmap, Adobe Photoshop with alpha channel mask
!:mime image/bmp
!:apple ????BMPp
!:ext bmp
>>18 lelong x \b, %d x
>>22 lelong x %d x
+# number of bits per pixel (color depth); found 16 32
>>28 leshort x %d
->14 leshort 40
+# x, y coordinates of the hotspot; should be zero for Windows variant
+>>6 uleshort >0 \b, hotspot %ux
+>>>8 uleshort x \b%u
+# cbSize; size of file like: 4E 7F46 131DE 14046h
+>>2 ulelong x \b, cbSize %u
+#>>2 ulelong x \b, cbSize 0x%x
+# offBits; offset to bitmap data like: 46h
+>>10 ulelong x \b, bits offset %u
+#>>10 ulelong x \b, bits offset 0x%x
+>14 lelong 40
# jump 4 bytes before end of file/header to skip fmt-116-signature-id-118.dib
->>(2.l-4) ulong x PC bitmap, Windows 3.x format
+# broken for large bitmaps
+#>>(2.l-4) ulong x PC bitmap, Windows 3.x format
+>>14 lelong 40 PC bitmap, Windows 3.x format
!:mime image/bmp
!:apple ????BMPp
>>>18 lelong x \b, %d x
@@ -690,7 +870,16 @@
# compression method 2~RLE 4-bit/pixel implies also extension rle
>>>>30 ulelong 2 x
!:ext bmp/rle
->>>>30 default x x
+# not RLE compressed and not 320x400 dimension
+>>>>30 default x
+# "small" dimensions like: 14x15 15x16 16x14 16x16 32x32
+# https://en.wikipedia.org/wiki/Favicon
+>>>>>18 ulequad&0xffFFffC0ffFFffC0 =0 x
+# https://www.politi-kdigital.de/favicon.ico
+# http://forum.rpc1.org/favicon.ico
+!:ext bmp/ico
+# "big" dimensions > 63
+>>>>>18 default x x
!:ext bmp
# number of bits per pixel (color depth); found 1 2 4 8 16 24 32
>>>28 leshort x %d
@@ -713,26 +902,45 @@
>>>50 ulelong >0 \b, %u important colors
# cbSize; often size of file
>>>2 ulelong x \b, cbSize %u
-#>>>2 ulelong x \b, cbSize 0x%x
+#>>>2 ulelong x \b, cbSize %#x
# offBits; offset to bitmap data like 36h 76h BEh 236h 406h 436h 4E6h
>>>10 ulelong x \b, bits offset %u
-#>>>10 ulelong x \b, bits offset 0x%x
-#>>>(10.l) ubequad !0 \b, bits 0x%16.16llxd
->14 leshort 124 PC bitmap, Windows 98/2000 and newer format
-!:mime image/x-ms-bmp
->>18 lelong x \b, %d x
->>22 lelong x %d x
->>28 leshort x %d
->14 leshort 108 PC bitmap, Windows 95/NT4 and newer format
-!:mime image/x-ms-bmp
+#>>>10 ulelong x \b, bits offset %#x
+#>>>(10.l) ubequad !0 \b, bits %#16.16llxd
+>14 lelong 124 PC bitmap, Windows 98/2000 and newer format
+!:mime image/bmp
+!:ext bmp
>>18 lelong x \b, %d x
>>22 lelong x %d x
+# color planes; must be 1
+#>>>26 uleshort >1 \b, %u color planes
+# number of bits per pixel (color depth); found 4 8 16 24 32 1 (fmt-119-signature-id-121.bmp) 0 (rgb24jpeg.bmp rgb24png.bmp)
>>28 leshort x %d
->14 leshort 128 PC bitmap, Windows NT/2000 format
-!:mime image/x-ms-bmp
+# x, y coordinates of the hotspot; should be zero for Windows variant
+>>6 leshort >0 \b, hotspot %ux
+>>>8 leshort x \b%u
+# cbSize; size of file like: 8E AA 48A 999 247A 4F02 7F8A 3F88E B216E 1D4C8A 100008A
+>>2 ulelong x \b, cbSize %u
+#>>2 ulelong x \b, cbSize 0x%x
+# offBits; offset to bitmap data like: 8A 47A ABABABAB (fmt-119-signature-id-121.bmp)
+>>10 ulelong x \b, bits offset %u
+#>>10 ulelong x \b, bits offset 0x%x
+>14 lelong 108 PC bitmap, Windows 95/NT4 and newer format
+!:mime image/bmp
+!:ext bmp
>>18 lelong x \b, %d x
>>22 lelong x %d x
+# number of bits per pixel (color depth); found 8 24 32
>>28 leshort x %d
+# x, y coordinates of the hotspot; should be zero for Windows variant
+>>6 leshort >0 \b, hotspot %ux
+>>>8 leshort x \b%u
+# cbSize; size of file like: 82 8A 9A 9F86 1E07A 3007A 88B7A C007A
+>>2 ulelong x \b, cbSize %u
+#>>2 ulelong x \b, cbSize 0x%x
+# offBits; offset to bitmap data like: 7A 7E 46A
+>>10 ulelong x \b, bits offset %u
+#>>10 ulelong x \b, bits offset 0x%x
# Update: Joerg Jenderek
# URL: http://fileformats.archiveteam.org/wiki/OS/2_Icon
# Reference: http://www.fileformat.info
@@ -752,7 +960,7 @@
>>8 uleshort x \b%u
# offBits; offset in bytes to the beginning of the bit-map pel data like 20h
>>10 ulelong x \b, bits offset %u
-#>>(10.l) ubequad x \b, bits 0x%16.16llx
+#>>(10.l) ubequad x \b, bits %#16.16llx
#0 string PI PC pointer image data
#0 string CI PC color icon data
0 string CI
@@ -790,16 +998,24 @@
#>>2 ulelong x \b, cbSize %x
# offBits; offset to bitmap data (pixel array) like E4h 3Ah 66h 6Ah 33Ah 4A4h
>>10 ulelong x \b, bits offset %u
-#>>10 ulelong x \b, bits offset 0x%x
-#>>(10.l) ubequad !0 \b, bits 0x%16.16llx
+#>>10 ulelong x \b, bits offset %#x
+#>>(10.l) ubequad !0 \b, bits %#16.16llx
# dib header size: 12~Ch~OS/2 1.x 64~40h~OS/2 2.x
#>>14 ulelong x \b, dib header size %u
#0 string CP PC color pointer image data
# URL: http://fileformats.archiveteam.org/wiki/OS/2_Pointer
# Reference: http://www.fileformat.info/format/os2bmp/egff.htm
0 string CP
+# skip many Corel Photo-Paint image "CPT9FILE" by checking for positive bits offset
+>10 ulelong >0
# skip CPU-Z Report by checking for valid dib header sizes 12 or 64
->14 ulelong <65 OS/2
+>>14 ulelong =12
+>>>0 use os2-ptr
+>>14 ulelong =64
+>>>0 use os2-ptr
+# display information of OS/2 pointer bitmaps
+0 name os2-ptr
+>14 ulelong x OS/2
# http://extension.nirsoft.net/PTR
!:mime image/x-ibm-pointer
!:ext ptr
@@ -831,8 +1047,8 @@
#>>2 ulelong x \b, cbSize %x
# offBits; offset to bitmap data (pixel array) like 6Ah A4h E4h 4A4h
>>10 ulelong x \b, bits offset %u
-#>>10 ulelong x \b, bits offset 0x%x
-#>>(10.l) ubequad !0 \b, bits 0x%16.16llx
+#>>10 ulelong x \b, bits offset %#x
+#>>(10.l) ubequad !0 \b, bits %#16.16llx
# dib header size: 12~Ch~OS/2 1.x 64~40h~OS/2 2.x
#>>14 ulelong x \b, dib header size %u
# Conflicts with other entries [BABYL]
@@ -846,11 +1062,11 @@
#!:apple ????BMPf
# cbSize; size of header like 28h 5Ch
>>2 ulelong x \b, cbSize %u
-#>>2 ulelong x \b, cbSize 0x%x
+#>>2 ulelong x \b, cbSize %#x
# offNext; offset to data like 0 48h F2h 4Eh 64h C6h D2h D6h DAh E6h EAh 348h
>>6 ulelong >0 \b, data offset %u
-#>>6 ulelong >0 \b, data offset 0x%x
-#>>(6.l) ubequad !0 \b, data 0x%16.16llx
+#>>6 ulelong >0 \b, data offset %#x
+#>>(6.l) ubequad !0 \b, data %#16.16llx
# dimensions of the intended device like 640 x 480 for VGA or 1024 x 768
>>10 uleshort >0 \b, display %u
>>>12 uleshort >0 x %u
@@ -1025,6 +1241,22 @@
# https://www.atarimax.com/jindroush.atari.org/afmtatr.html
0 leshort 0x0296 Atari ATR image
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/ImageLab/PrintTechnic
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/b/bitmap-b_w.trid.xml
+# Note: called "ImageLab bitmap" by TrID
+# verfied by XnView `nconvert -fullinfo "MAEDCHEN.B&W"`
+0 string B&W256 ImageLab bitmap
+!:mime image/x-ilab
+# https://www.xnview.com/de/image_formats/
+# GRR: add char & inside parse_ext in ../../src/apprentice.c to avoid in file version 5.40 error like:
+# Magdir\images, 1090: Warning: EXTENSION type ` b_w/b&w' has bad char '&'
+!:ext b_w/b&w
+# Width
+>6 ubeshort x \b, %u
+# Height
+>8 ubeshort x x %u
+
# XXX:
# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
# magic.
@@ -1082,30 +1314,63 @@
# Adobe Photoshop
# From: Asbjoern Sloth Toennesen <asbjorn@lila.io>
-0 string 8BPS Adobe Photoshop Image
+# URL: http://fileformats.archiveteam.org/wiki/PSD
+# Reference: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/
+# Note: verfied by XnView `nconvert -fullinfo *.psd *.psb *.pdd`
+# and ImageMagick `identify -verbose *.pdd`
+0 string 8BPS
+# skip DROID x-fmt-92-signature-id-277.psd by checking valid width
+>18 belong >0 Adobe Photoshop
!:mime image/vnd.adobe.photoshop
->4 beshort 2 (PSB)
->18 belong x \b, %d x
->14 belong x %d,
->24 beshort 0 bitmap
->24 beshort 1 grayscale
->>12 beshort 2 with alpha
->24 beshort 2 indexed
->24 beshort 3 RGB
->>12 beshort 4 \bA
->24 beshort 4 CMYK
->>12 beshort 5 \bA
->24 beshort 7 multichannel
->24 beshort 8 duotone
->24 beshort 9 lab
->12 beshort > 1
->>12 beshort x \b, %dx
->12 beshort 1 \b,
->22 beshort x %d-bit channel
->12 beshort > 1 \bs
+!:apple ????8BPS
+# version: always equal to 1, but 2 for PSB
+>>4 beshort 1
+# URL: http://fileformats.archiveteam.org/wiki/PhotoDeluxe
+# EXTRAS/PHOTOS/DEMOPIX/ORIGINAL.PDD
+>>>34 search/0xC0d7 PHUT Image (PhotoDeluxe)
+!:ext pdd
+>>>34 default x Image
+!:ext psd
+# URL: http://fileformats.archiveteam.org/wiki/PSB
+>>4 beshort 2 Image (PSB)
+!:ext psb
+# width in pixels: 1-30000 1-300000 for PSB
+>>18 belong x \b, %d x
+>>14 belong x %d,
+# The color mode; 0~Bitmap 1~Grayscale 2~Indexed 3~RGB 4~CMYK 7~Multichannel 9~Duotone 9~Lab
+>>24 beshort 0 bitmap
+>>24 beshort 1 grayscale
+# the number of channels; range is 1 to 56
+>>>12 beshort 2 with alpha
+>>24 beshort 2 indexed
+>>24 beshort 3 RGB
+>>>12 beshort 4 \bA
+>>24 beshort 4 CMYK
+>>>12 beshort 5 \bA
+>>24 beshort 7 multichannel
+>>24 beshort 8 duotone
+>>24 beshort 9 lab
+>>12 beshort > 1
+>>>12 beshort x \b, %dx
+>>12 beshort 1 \b,
+>>22 beshort x %d-bit channel
+>>12 beshort > 1 \bs
+# 6 reserved bytes; must be zero, but spaces inside ImageMagick input.psd
+# https://download.imagemagick.org/ImageMagick/download/ImageMagick-7.0.11-11.zip
+# ImageMagick-7.0.11-11\PerlMagick\t\input.psd
+>>6 bequad&0xFFffFFffFFff0000 !0 \b, at offset 6
+>>>6 belong x 0x%8.8x
+>>>6 beshort x \b%4.4x
# XV thumbnail indicator (ThMO)
+# URL: https://en.wikipedia.org/wiki/Xv_(software)
+# Reference: http://fileformats.archiveteam.org/wiki/XV_thumbnail
+# Update: Joerg Jenderek
0 string P7\ 332 XV thumbnail image data
+#0 string P7\ 332 XV "thumbnail file" (icon) data
+!:mime image/x-xv-thumbnail
+# thumbnail .xvpic/foo.bar for graphic foo.bar
+!:ext p7/gif/tif/xpm/jpg
# NITF is defined by United States MIL-STD-2500A
0 string NITF National Imagery Transmission Format
@@ -1211,10 +1476,6 @@
0 string Paint\ Shop\ Pro\ Image\ File Paint Shop Pro Image File
-# "thumbnail file" (icon)
-# descended from "xv", but in use by other applications as well (Wolfram Kleff)
-0 string P7\ 332 XV "thumbnail file" (icon) data
-
# taken from fkiss: (<yav@mte.biglobe.ne.jp> ?)
0 string KiSS KISS/GS
>4 byte 16 color
@@ -1273,7 +1534,22 @@
# DCX is multi-page PCX, using a simple header of up to 1024
# offsets for the respective PCX components.
# From: Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de>
-0 lelong 987654321 DCX multi-page PCX image data
+# Update: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/DCX
+0 lelong 987654321 DCX multi-page
+# http://www.nationalarchives.gov.uk/pronom/x-fmt/348
+!:mime image/x-dcx
+!:ext dcx
+# The first file offset usually starts at file offset 0x1004
+# print 1 space after 0x100? offset and then handles PCX images by ./images
+>4 lelong x \b, at %#x
+>(4.l) indirect x
+# possible 2nd PCX image
+#>8 lelong !0 \b, at %#x
+#>>(8.l) indirect x
+# possible 3rd PCX image
+#>12 lelong !0 \b, at %#x
+#>>(12.l) indirect x
# Simon Walton <simonw@matteworld.com>
# Kodak Cineon format for scanned negatives
@@ -1383,36 +1659,72 @@
>768 beshort 7 bottom to top/right to left
# From: Tom Hilinski <tom.hilinski@comcast.net>
-# https://www.unidata.ucar.edu/packages/netcdf/
+# https://www.unidata.ucar.edu/software/netcdf/
0 string CDF\001 NetCDF Data Format data
# 64-bit offset netcdf Classic https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications
0 string CDF\002 NetCDF Data Format data (64-bit offset)
-#-----------------------------------------------------------------------
+# From: Michael Liu
+# https://en.wikipedia.org/wiki/Common_Data_Format
+0 belong 0xCDF30001 Common Data Format (Version 3 or later) data
+!:mime application/x-cdf
+
+0 belong 0xCDF26002 Common Data Format (Version 2.6 or 2.7) data
+!:mime application/x-cdf
+
+0 belong 0x0000FFFF Common Data Format (Version 2.5 or earlier) data
+!:mime application/x-cdf
+
# Hierarchical Data Format, used to facilitate scientific data exchange
# specifications at http://hdf.ncsa.uiuc.edu/
+# URL: http://fileformats.archiveteam.org/wiki/HDF
+# https://en.wikipedia.org/wiki/Hierarchical_Data_Format
+# Reference: https://portal.hdfgroup.org/download/attachments/52627880/HDF5_File_Format_Specification_Version-3.0.pdf
0 belong 0x0e031301 Hierarchical Data Format (version 4) data
!:mime application/x-hdf
+!:ext hdf/hdf4/h4
0 string \211HDF\r\n\032\n Hierarchical Data Format (version 5) data
-!:mime application/x-hdf
-512 string \211HDF\r\n\032\n Hierarchical Data Format (version 5) with 512 bytes user block
-!:mime application/x-hdf
+#!:mime application/x-hdf
+!:mime application/x-hdf5
+!:ext h5/hdf5/hdf/he5
+512 string \211HDF\r\n\032\n
+# skip Matlab v5 mat-file testhdf5_7.4_GLNX86.mat handled by ./mathematica
+>0 string !MATLAB Hierarchical Data Format (version 5) with 512 bytes user block
+#!:mime application/x-hdf
+!:mime application/x-hdf5
+!:ext h5/hdf5/hdf/he5
1024 string \211HDF\r\n\032\n Hierarchical Data Format (version 5) with 1k user block
-!:mime application/x-hdf
+#!:mime application/x-hdf
+!:mime application/x-hdf5
+!:ext h5/hdf5/hdf/he5
2048 string \211HDF\r\n\032\n Hierarchical Data Format (version 5) with 2k user block
-!:mime application/x-hdf
+#!:mime application/x-hdf
+!:mime application/x-hdf5
+!:ext h5/hdf5/hdf/he5
4096 string \211HDF\r\n\032\n Hierarchical Data Format (version 5) with 4k user block
-!:mime application/x-hdf
-
+#!:mime application/x-hdf
+!:mime application/x-hdf5
+!:ext h5/hdf5/hdf/he5
# From: Tobias Burnus <burnus@net-b.de>
# Xara (for a while: Corel Xara) is a graphic package, see
# http://www.xara.com/ for Windows and as GPL application for Linux
0 string XARA\243\243 Xara graphics file
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/Corel_Gallery
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/b/bmf-corel.trid.xml
+# Note: called "Corel Binary Material Format" by TrID and
+# "Corel Flow" by XnView
+0 string @CorelBMF\n\rCorel\040Corporation Corel GALLERY Clipart
+!:mime image/x-corel-bmf
+!:ext bmf
+
# https://www.cartesianinc.com/Tech/
+# Reference: http://fileformats.archiveteam.org/wiki/Cartesian_Perceptual_Compression
0 string CPC\262 Cartesian Perceptual Compression image
!:mime image/x-cpi
+!:ext cpi/cpc
# From Albert Cahalan <acahalan@gmail.com>
# puredigital used it for the CVS disposable camcorder
@@ -1600,7 +1912,7 @@
>>101 beshort&0xf0 0x60 \bNCOMPONENT
>>101 beshort&0xf0 0x70 \bRGB
>>101 beshort&0xf0 0x80 \bRGBE
->>101 beshort&0xf0 >0x80 \b(reserved 0x%x)
+>>101 beshort&0xf0 >0x80 \b(reserved %#x)
# From: Johan van der Knijff <johan.vanderknijff@kb.nl>
#
@@ -1624,25 +1936,75 @@
>>8 string x \b, "%4.4s" type
# TIM images
-0 lelong 0x00000010 TIM image,
->4 lelong 0x8 4-Bit,
->4 lelong 0x9 8-Bit,
->4 lelong 0x2 15-Bit,
->4 lelong 0x3 24-Bit,
->4 lelong &8
->>(8.l+12) leshort x Pixel at (%d,
->>(8.l+14) leshort x \b%d)
->>(8.l+16) leshort x Size=%dx
->>(8.l+18) leshort x \b%d,
->>4 lelong 0x8 16 CLUT Entries at
->>4 lelong 0x9 256 CLUT Entries at
->>12 leshort x (%d,
->>14 leshort x \b%d)
->4 lelong ^8
->>12 leshort x Pixel at (%d,
->>14 leshort x \b%d)
->>16 leshort x Size=%dx
->>18 leshort x \b%d
+# URL: http://fileformats.archiveteam.org/wiki/TIM_(PlayStation_graphics)
+# Reference: https://mrclick.zophar.net/TilEd/download/timgfx.txt
+# Update: Joerg Jenderek
+# Note: called as "PSX TIM *bpp bitmap" by bitmap-tim-*.trid.xml
+# verified as "TIM PSX" by XnView `nconvert -fullinfo *.tim` and
+# by RECOIL `recoil2png -o TMP.PNG input.tim; file TMP.PNG` and often
+# as "PSX TIM" by ImageMagick version 7.1.0-10 command `identify *.tim`
+# here signed integers are used but according to Kaitai unsigned
+0 lelong 0x00000010
+# 32 Flag bits *cttt; c~CLUT flag t~type 000~4BPP 001~8BPP 010~16BPP 011~24BPP 100~Mixed
+#>4 lelong x FLAGS=%#x
+# 12+Size of CLUT (2Ch for 4BPP; 20Ch 40Ch 60Ch 80Ch C0Ch for 8BPP) or
+# +image data size (800Ch 2000Ch 2580C for 16BPP) (02000003h for dBase memo test.dbt)
+#>8 lelong x \b, 12+CLUT or data size=%#8.8x
+# CLUT or data size remainder is 12 (Ch), but 03 for dBase memo test.dbt
+#>8 ubyte&0x0F =0x0C \b, SIZE REMAINDER IS 12
+# skip dBase III memo test.dbt with invalid flags 22D10189h
+>4 lelong&0xffFFffF0 =0 Sony PlayStation PSX image,
+# file (version 5.40) labeled the above entry as "TIM image"
+!:mime image/x-sony-tim
+!:ext tim
+#>>4 lelong&0x00000007 x \b, BPP~%u
+# 4BPP and 8BPP examples exist with CLUT or without CLUT
+>>4 lelong&0x07 0x0 4-Bit,
+>>4 lelong&0x07 0x1 8-Bit,
+# 16BPP and 24BPP examples have no CLUT
+>>4 lelong 0x2 15-Bit,
+>>4 lelong 0x3 24-Bit,
+# no example
+>>4 lelong&0x07 0x4 Mixed-Bit,
+# CLUT flag set
+>>4 lelong &8
+# 12 + size of CLUT like: 1000Ch 800Ch 400Ch 40Ch and 2FEh (KAGE.TIM)
+#>>>(8.l+8) lelong x \b, 12+CLUT SIZE=%#8.8x
+>>>(8.l+12) leshort x Pixel at (%d,
+>>>(8.l+14) leshort x \b%d) Size=
+# image width (to get actual width multiply by 4 for 4BPP and by 2 for 8BPP)
+>>>>4 lelong 0x8
+>>>>>(8.l+16) leshort*4 x \b%d
+>>>>4 lelong 0x9
+>>>>>(8.l+16) leshort*2 x \b%d
+# image height like: 32 64 128 144 160 208 256
+>>>(8.l+18) leshort x \bx%d,
+>>>4 lelong 0x8 16 CLUT Entries at
+>>>4 lelong 0x9 256 CLUT Entries at
+>>>12 leshort x (%d,
+>>>14 leshort x \b%d)
+# no Color LookUp Table (CLUT)
+>>4 lelong ^8
+# image orgin X Y
+>>>12 leshort x Pixel at (%d,
+>>>14 leshort x \b%d) Size=
+# real image width = multiply by 4 (4BPP) 2 (8BPP) 1 (16BPP) 2/3 (24BPP)
+>>>>4 lelong 0x0
+>>>>>16 leshort*4 x \b%d
+>>>>4 lelong 0x1
+>>>>>16 leshort*2 x \b%d
+>>>>4 lelong 0x2
+>>>>>16 leshort x \b%d
+>>>>4 lelong 0x3
+# GRR: NOT working
+#>>>>>16 leshort*2/3 x \b%d
+>>>>>16 leshort x \b2/3*%d
+# mixed format width not explained!
+>>>>4 lelong 0x4
+>>>>>16 leshort x \b%d
+# image height like: 64 240 256
+>>>18 leshort x \bx%d
+# TIM image data
# MDEC streams
0 lelong 0x80010160 MDEC video stream,
@@ -1984,8 +2346,9 @@
# Supercompression enum.
0 name khronos-ktx2-supercompression
->0 lelong 1 Basis Universal
+>0 lelong 1 BasisLZ
>0 lelong 2 Zstandard
+>0 lelong 3 ZLIB
# Vulkan format identifier.
# NOTE: Formats prohibited from KTX2 are commented out.
@@ -2567,3 +2930,134 @@
>4 byte 0 Apple QuickTake 150 Raw Image
>4 byte >0 Apple QuickTake 200 Raw Image
>0 use quicktake
+
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/Corel_Photo-Paint_image
+# Reference: http://blog.argasinski.eu/wp-content/uploads/2011/08/cpt-specification-0.01.pdf
+0 string CPT
+>4 string FILE Corel Photo-Paint image, version
+# version like 7, 9 or 8
+>>3 ubyte x %c,
+!:mime image/x-corel-cpt
+!:ext cpt
+# if blocks_array_offset available jump blockNumber*8 bytes
+>>0x34 ulelong >0
+>>>(0x28.l*8) ubyte x
+# jump additional stored blocks_array_offset bytes forward to object block
+>>>>&(0x34.l-1) ulelong x %u
+# object height in pixels
+>>>>>&0 ulelong x x %u
+# if no blocks_array_offset available jump blockNumber*8 bytes
+>>0x34 ulelong =0
+>>>(0x28.l*8) ubyte x
+# jump additional 0x13C bytes forward to object block
+>>>>&0x13B ulelong x %u
+>>>>>&0 ulelong x x %u
+# image color model used
+>>0x8 ulelong x
+>>>0x8 ulelong 0x1 RGB 24 bits
+>>>0x8 ulelong 0x3 CMYK 24 bits
+>>>0x8 ulelong 0x5 greyscale 8 bits
+>>>0x8 ulelong 0x6 black and white 1 bit
+>>>0x8 ulelong 0xA RGB 8 bits
+# palette_length number of colors * 3 in case of 8-bit RGB paletted image
+# 0 otherwise. Allowed values: 0 or [1..256] * 3
+#>>0xC ulelong >0 \b, palette length %u
+>>>>0xC ulelong/3 <256 \b, %u colors
+>>>0x8 ulelong 0xB LAB
+>>>0x8 ulelong 0xC RGB 48 bits
+>>>0x8 ulelong 0xE greyscale 16 bits
+# this should not happen
+>>>0x8 default x color model
+>>>>0x8 ulelong x %#x
+# bit 1 in CPT file flags: UCS-2 file comment present
+>>0x31 ubyte &0x02
+# look for comment marker
+>>>0x100 search/0xc9d \4\2\0\0
+# UCS-2 file comment
+>>>>&0 lestring16 x "%s"
+# if no UCS-2 is present show ANSI file comment[112] if available
+>>0x31 ubyte&0x02 =0
+>>>0x3C string >\0 "%-.112s"
+# reserved seems to be always 0
+#>>0x10 ulelong >0 \b, reserved1 %u
+# horizontal real dpi = dpi_h * 25.4 / 10**6
+>>0x18 ulelong x \b, %u micro dots/mm
+# image vertical DPI in CPT DPI unit
+#>>0x1C ulelong x \b, %u micro dots/mm
+# reserved seems to be always 0
+#>>0x20 ulelong >0 \b, reserved2 %u
+#>>0x24 ulelong >0 \b, reserved3 %u
+# blocks_count; number of CPT_Block blocks. Allowed values: > 0
+>>0x28 ulelong x \b, %u block
+# plural s
+>>0x28 ulelong !1 \bs
+# CPT file flags
+# lower byte of CPT file flags: 0x94~CPT9FILE 0x01~often CPT7FILE 0x8C~CPT8FILE
+#>>0x30 ubyte x \b, lower flags %#x
+# upper byte of CPT file flags:
+#>>0x31 ubyte >0 \b, upper flags %#x
+# bit 2 in CPT file flags: unknown
+#>>0x31 ubyte &0x04 \b, with UNKNOWN
+# bits 3-7 in CPT file flags: unknown, seem to be often 0
+# show unusual flag combinations
+>>0x31 ubyte&0xFC >0
+>>>0x30 uleshort x \b, flags %#4.4x
+# reserved seems to be always 0
+#>>0x32 uleshort >0 \b, reserved4 %#x
+# blocks_array_offset is always 0 for CPT7 and CPT8 files created by PP7-PP8
+# typical values like: 13Ch 154h 43Ch 4F0h DA8h
+>>0x34 ulelong x \b, array offset %#x
+# reserved seems to be often 0
+>>0x38 ulelong >0 \b, reserved5 %#x
+# possible next master block
+#>>0x100 ubequad !0 \b, next block=%#llx...
+# bit 0: ICC profile block present
+>>0x31 ubyte &0x01 \b, with ICC profile
+# check for characteristic string acsp of color profile for DEBUGGING
+#>>>0x178 string x icc=%.4s
+# display ICC/ICM color profile by ./icc
+#>>>0x154 use color-profile
+
+# Type: Crunch compressed texture.
+# From: David Korth <gerbilsoft@gerbilsoft.com>
+# References:
+# - https://github.com/BinomialLLC/crunch/blob/44c8402e24441c7524ca364941fd224ab3b971e9/inc/crn_decomp.h#L267
+0 ubelong 0x4878004A Crunch compressed texture:
+>0x0C ubeshort x %u x
+>0x0E ubeshort x %u
+>0x12 ubyte 0 \b, DXT1
+>0x12 ubyte 1 \b, DXT3
+>0x12 ubyte 2 \b, DXT5
+>0x12 ubyte 3 \b, DXT5 CCxY
+>0x12 ubyte 4 \b, DXT5 xGxR
+>0x12 ubyte 5 \b, DXT5 xGBR
+>0x12 ubyte 6 \b, DXT5 AGBR
+>0x12 ubyte 7 \b, DXn XY
+>0x12 ubyte 8 \b, DXn YX
+>0x12 ubyte 9 \b, DXT5 Alpha
+>0x12 ubyte 10 \b, ETC1
+>0x10 ubyte >1 \b, %u images
+>0x11 ubyte >1 \b, %u faces
+# TODO: Flags at 0x13? (ubeshort)
+
+# Type: BasisLZ compressed texture.
+# From: David Korth <gerbilsoft@gerbilsoft.com>
+# References:
+# - https://github.com/BinomialLLC/basis_universal/blob/master/spec/basis_spec.txt
+0 uleshort 0x4273
+>0x04 uleshort 0x4D BasisLZ
+>>0x02 uleshort x v%x compressed texture:
+>>0x14 ubyte 0 ETC1S
+>>0x14 ubyte 1 UASTC 4x4
+>>0x0E ulelong&0xFFFFFF >1 \b, %u slices
+>>0x11 ulelong&0xFFFFFF >1 \b, %u images
+>>0x15 uleshort&0x02 2 \b, Y-flipped
+
+# MIME registration: https://www.iana.org/assignments/media-types/model/e57
+# Sample files: http://www.libe57.org/data.html
+# Reference implementation: http://www.libe57.org/
+# https://www.ri.cmu.edu/pub_files/2011/1/2011-huber-e57-v3.pdf
+0 string ASTM-E57 ASTM E57 three-dimensional model
+!:mime model/e57
+!:ext e57
diff --git a/magic/Magdir/intel b/magic/Magdir/intel
index ba25d983411a..531dd6548ddb 100644
--- a/magic/Magdir/intel
+++ b/magic/Magdir/intel
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: intel,v 1.18 2020/04/18 16:19:03 christos Exp $
+# $File: intel,v 1.20 2021/04/26 15:56:00 christos Exp $
# intel: file(1) magic for x86 Unix
#
# Various flavors of x86 UNIX executable/object (other than Xenix, which
@@ -37,7 +37,7 @@
# ./intel (version 5.25) label labeled the next entry as "80386 COFF executable"
# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
0 leshort =0514
-# use subroutine to display name+flags+variables for common object formated files
+# use subroutine to display name+flags+variables for common object formatted files
>0 use display-coff
#>12 lelong >0 not stripped
# no hint found, that at offset 22 is version
@@ -118,7 +118,7 @@
# length, in bytes, of the entire DSDT (including the header)
>>4 ulelong x \b, %u bytes
# entire table must sum to zero
-#>>9 ubyte x \b, checksum 0x%x
+#>>9 ubyte x \b, checksum %#x
# vendor ID for the ASL Compiler like: INTL MSFT ...
>>28 string >\0 \b, created by %.4s
# revision number of the ASL Compiler like: 20051117 20140724 20190703 20200110 ...
diff --git a/magic/Magdir/jpeg b/magic/Magdir/jpeg
index 52c9ad36203e..522f8d34f07a 100644
--- a/magic/Magdir/jpeg
+++ b/magic/Magdir/jpeg
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: jpeg,v 1.32 2018/10/01 18:58:29 christos Exp $
+# $File: jpeg,v 1.36 2021/08/28 12:30:52 christos Exp $
# JPEG images
# SunOS 5.5.1 had
#
@@ -9,11 +9,19 @@
#
# both of which turn into "JPEG image data" here.
#
-0 beshort 0xffd8 JPEG image data
+0 belong 0xffd8fff7 JPEG-LS image data
+!:mime image/jls
+!:ext jls
+>0 use jpeg
+
+0 belong&0xffffff00 0xffd8ff00 JPEG image data
!:mime image/jpeg
!:apple 8BIMJPEG
!:strength *3
!:ext jpeg/jpg/jpe/jfif
+>0 use jpeg
+
+0 name jpeg
>6 string JFIF \b, JFIF standard
# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
# in a vain attempt to add image size reporting for JFIF. Note that these
@@ -91,7 +99,7 @@
>>0 beshort&0xFFE0 !0xFFE0
>>>(2.S+2) use jpeg_segment
-#>0 beshort x unknown 0x%x
+#>0 beshort x unknown %#x
#>>(2.S+2) use jpeg_segment
# HSI is Handmade Software's proprietary JPEG encoding scheme
@@ -124,3 +132,14 @@
>>4 lelong%2 0 JPEG-XR
!:mime image/jxr
!:ext jxr
+
+# JPEG XL
+# From: Ian Tester
+0 string \xff\x0a JPEG XL codestream
+!:mime image/jxl
+!:ext jxl
+
+# JPEG XL (transcoded JPEG file)
+0 string \x00\x00\x00\x0cJXL\x20\x0d\x0a\x87\x0a JPEG XL container
+!:mime image/jxl
+!:ext jxl
diff --git a/magic/Magdir/lammps b/magic/Magdir/lammps
new file mode 100644
index 000000000000..5424383db80f
--- /dev/null
+++ b/magic/Magdir/lammps
@@ -0,0 +1,64 @@
+#------------------------------------------------------------------------------
+# $File: lammps,v 1.1 2021/03/14 16:24:18 christos Exp $
+#
+
+# Magic file patterns for use with file(1) for the
+# LAMMPS molecular dynamics simulation software.
+# https://lammps.sandia.gov
+#
+# Updated: 2021-03-14 by akohlmey@gmail.com
+
+# Binary restart file for the LAMMPS MD code
+0 string LammpS\ RestartT LAMMPS binary restart file
+>0x14 long x (rev %d),
+>>0x20 string x Version %s,
+>>>0x10 lelong 0x0001 Little Endian
+>>>0x10 lelong 0x1000 Big Endian
+
+# Atom style binary dump file for the LAMMPS MD code
+# written on a little endian machine
+0 lequad -8
+>0x08 string DUMPATOM LAMMPS atom style binary dump
+>>0x14 long x (rev %d),
+>>>0x10 lelong 0x0001 Little Endian,
+>>>>0x18 lequad x First time step: %lld
+
+# written on a big endian machine
+0 bequad -8
+>0x08 string DUMPATOM LAMMPS atom style binary dump
+>>0x14 belong x (rev %d),
+>>>0x10 lelong 0x1000 Big Endian,
+>>>>0x18 bequad x First time step: %lld
+
+# Atom style binary dump file for the LAMMPS MD code
+# written on a little endian machine
+0 lequad -10
+>0x08 string DUMPCUSTOM LAMMPS custom style binary dump
+>>0x16 lelong x (rev %d),
+>>>0x12 lelong 0x0001 Little Endian,
+>>>>0x1a lequad x First time step: %lld
+
+# written on a big endian machine
+0 bequad -10
+>0x08 string DUMPCUSTOM LAMMPS custom style binary dump
+>>0x16 belong x (rev %d),
+>>>0x12 lelong 0x1000 Big Endian,
+>>>>0x1a bequad x First time step: %lld
+
+# LAMMPS log file
+0 string LAMMPS\ ( LAMMPS log file
+>8 regex/16 [0-9]+\ [A-Za-z]+\ [0-9]+ written by version %s
+
+# Data file written either by LAMMPS, msi2lmp or VMD/TopoTools
+0 string LAMMPS\ data\ file LAMMPS data file
+>0x12 string CGCMM\ style written by TopoTools
+>0x12 string msi2lmp written by msi2lmp
+>0x11 string via\ write_data written by LAMMPS
+
+# LAMMPS data file written by OVITO
+0 string #\ LAMMPS\ data\ file LAMMPS data file
+>0x13 string written\ by\ OVITO written by OVITO
+
+# LAMMPS text mode dump file
+0 string ITEM:\ TIMESTEP LAMMPS text mode dump,
+>15 regex/16 [0-9]+ First time step: %s
diff --git a/magic/Magdir/lif b/magic/Magdir/lif
index a7a0a8abe776..89d7a8611624 100644
--- a/magic/Magdir/lif
+++ b/magic/Magdir/lif
@@ -1,8 +1,49 @@
#------------------------------------------------------------------------------
-# $File: lif,v 1.8 2009/09/19 16:28:10 christos Exp $
+# $File: lif,v 1.10 2021/04/26 15:56:00 christos Exp $
# lif: file(1) magic for lif
#
# (Daniel Quinlan <quinlan@yggdrasil.com>)
#
-0 beshort 0x8000 lif file
+# Modified by: Joerg Jenderek
+# URL: https://www.hp9845.net/9845/projects/hpdir/
+# https://github.com/bug400/lifutils
+# Reference: https://www.hp9845.net/9845/downloads/manuals/LIF_excerpt_64941-90906_flpRef_Jan84.pdf
+# Note: called by TrID "HP Logical Interchange Format disk image"
+0 beshort 0x8000
+# GRR: line above is too general as it catches also compressed DEGAS low-res bitmap *.pc1
+# skip many compressed DEGAS low-res bitmap *.pc1 by test for unused bytes
+>14 beshort =0
+# skip MUNCHIE.PC1 BOARD.PC1 ENEMIES.PC1 by test for low version number
+>>20 ubeshort <0x0100
+# skip DEGAS MUNCHIE.PC1 BOARD.PC1 ENEMIES.PC1 by test for ASCII like volume name
+#>>>2 ubelong >0x2020201F
+>>>0 use lif-file
+0 name lif-file
+# LIF ID
+>0 beshort x lif file
+!:mime application/x-lif-disk
+# lif used by Tony Duell LIF utilities; enhanced version by Joachim Siebold use also dat; hpi used by hpdir
+!:ext lif/hpi/dat
+# volume label; A-Z 0-9 _ ; default are 6 spaces
+>2 string x "%.6s"
+# version number; 0 for systems without extensions or 1 for model 64000
+>20 ubeshort x \b, version %u
+# LIF identifier; 010000 for system 3000
+>12 beshort !0x1000 \b, LIF identifier %#x
+# directory start address in units like: 2
+>8 ubelong x \b, directory
+>8 ubelong !2 start address %u
+# length of directory like: 2 4 7 10 12 14 (for model 64000) 16 18 20 24 30 50 57 77 80
+>16 ubelong x length %u
+# level 1 extensions
+>20 beshort =0
+>>24 ubequad !0 \b, for extensions %#llx...
+>20 beshort >0
+>>24 ubequad !0 \b, extensions %#llx...
+# word 21-126 reserved for extensions and future use; set to nil
+>42 ubequad !0 \b, RESERVED %#llx
+# lif first file name for standard directory; 0xffff... means uninitialized
+>8 ubelong 2
+>>512 string <\xff\xff \b, 1st file %-.10s
+
diff --git a/magic/Magdir/linux b/magic/Magdir/linux
index e7d0a15607e2..f5216087f0cf 100644
--- a/magic/Magdir/linux
+++ b/magic/Magdir/linux
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: linux,v 1.72 2020/06/07 21:56:13 christos Exp $
+# $File: linux,v 1.79 2021/04/26 15:56:00 christos Exp $
# linux: file(1) magic for Linux files
#
# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
@@ -83,20 +83,20 @@
# format v1, supported since 1998
0 name linux-swap
->0x400 lelong 1 little endian, version %u,
->>0x404 lelong x size %u pages,
->>0x408 lelong x %u bad pages,
->0x400 belong 1 big endian, version %u,
->>0x404 belong x size %u pages,
->>0x408 belong x %u bad pages,
->0x41c string \0 no label,
->0x41c string >\0 LABEL=%s,
->0x40c belong x UUID=%08x
->0x410 beshort x \b-%04x
->0x412 beshort x \b-%04x
->0x414 beshort x \b-%04x
->0x416 belong x \b-%08x
->0x41a beshort x \b%04x
+>0x400 lelong 1 little endian, version %u,
+>>0x404 lelong x size %u pages,
+>>0x408 lelong x %u bad pages,
+>0x400 belong 1 big endian, version %u,
+>>0x404 belong x size %u pages,
+>>0x408 belong x %u bad pages,
+>0x41c string \0 no label,
+>0x41c string >\0 LABEL=%s,
+>0x40c ubelong x UUID=%08x
+>0x410 ubeshort x \b-%04x
+>0x412 ubeshort x \b-%04x
+>0x414 ubeshort x \b-%04x
+>0x416 ubelong x \b-%08x
+>0x41a ubeshort x \b%04x
0xff6 string SWAPSPACE2 Linux swap file, 4k page size,
>0 use linux-swap
@@ -154,8 +154,8 @@
>>>>(526.s+0x200) string >\0 version %s,
>>498 leshort 1 RO-rootFS,
>>498 leshort 0 RW-rootFS,
->>508 leshort >0 root_dev 0x%X,
->>502 leshort >0 swap_dev 0x%X,
+>>508 leshort >0 root_dev %#X,
+>>502 leshort >0 swap_dev %#X,
>>504 leshort >0 RAMdisksize %u KB,
>>506 leshort 0xFFFF Normal VGA
>>506 leshort 0xFFFE Extended VGA
@@ -191,8 +191,8 @@
>497 leshort !0 x86 kernel
>>504 leshort >0 RAMdisksize=%u KB
->>502 leshort >0 swap=0x%X
->>508 leshort >0 root=0x%X
+>>502 leshort >0 swap=%#X
+>>508 leshort >0 root=%#X
>>>498 leshort 1 \b-ro
>>>498 leshort 0 \b-rw
>>506 leshort 0xFFFF vga=normal
@@ -239,14 +239,14 @@
# From: Kevin Cernekee <cernekee@gmail.com>
# Update: Joerg Jenderek
0x24 lelong 0x016f2818 Linux kernel ARM boot executable zImage
-# There are three posible situations: LE, BE with LE bootloader and pure BE.
+# There are three possible situations: LE, BE with LE bootloader and pure BE.
# In order to aid telling these apart a new endian flag was added. In order
# to support kernels before the flag and BE with LE bootloader was added we'll
# do a negative check against the BE variant of the flag when we see a LE magic.
>0x30 belong !0x04030201 (little-endian)
->0x30 belong 0x04030201 (big-endian)
# raspian "kernel7.img", Vu+ Ultimo4K "kernel_auto.bin"
!:ext img/bin
+>0x30 belong 0x04030201 (big-endian)
0x24 belong 0x016f2818 Linux kernel ARM boot executable zImage (big-endian)
############################################################################
@@ -438,17 +438,16 @@
# Documentation/devicetree/booting-without-of.txt
# From Christoph Biedl
0 belong 0xd00dfeed
-# structure and strings must be within blob
+# structure must be within blob, strings are omitted to handle devicetrees > 1M
>&(8.L) byte x
->>&(12.L) byte x
->>>20 belong >1 Device Tree Blob version %d
->>>>4 belong x \b, size=%d
->>>>20 belong >1
->>>>>28 belong x \b, boot CPU=%d
->>>>20 belong >2
->>>>>32 belong x \b, string block size=%d
->>>>20 belong >16
->>>>>36 belong x \b, DT structure block size=%d
+>>20 belong >1 Device Tree Blob version %d
+>>>4 belong x \b, size=%d
+>>>20 belong >1
+>>>>28 belong x \b, boot CPU=%d
+>>>20 belong >2
+>>>>32 belong x \b, string block size=%d
+>>>20 belong >16
+>>>>36 belong x \b, DT structure block size=%d
# glibc locale archive as defined in glibc locale/locarchive.h
0 lelong 0xde020109 locale archive
@@ -518,3 +517,21 @@
0 search/1024 /dts-v1/ Device Tree File (v1)
# beat c code
!:strength +14
+
+
+# e2fsck undo file
+# David Gilman <davidgilman1@gmail.com>
+0 string E2UNDO02 e2fsck undo file, version 2
+>44 lelong x \b, undo file is
+>>44 lelong&1 0 not finished
+>>44 lelong&1 1 finished
+>48 lelong x \b, undo file features:
+>>48 lelong&1 0 lacks filesystem offset
+>>48 lelong&1 1 has filesystem offset
+>>>64 lequad x at %#llx
+
+# ansible vault (does not really belong here)
+0 string $ANSIBLE_VAULT; Ansible Vault
+>&0 regex [0-9]*\.[0-9]* \b, version %s
+>>&0 string ;
+>>>&0 regex [A-Z0-9]* \b, encryption %s
diff --git a/magic/Magdir/lisp b/magic/Magdir/lisp
index d32cc101a90a..c854fb7c74be 100644
--- a/magic/Magdir/lisp
+++ b/magic/Magdir/lisp
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: lisp,v 1.26 2019/04/19 00:42:27 christos Exp $
+# $File: lisp,v 1.27 2020/08/14 19:23:39 christos Exp $
# lisp: file(1) magic for lisp programs
#
# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
@@ -60,6 +60,9 @@
!:apple EMAxTEXT
!:ext elc
+# Files produced by GNU/Emacs pdumper
+0 string DUMPEDGNUEMACS GNU/Emacs pdumper image
+
# Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr>
0 string (SYSTEM::VERSION\040' CLISP byte-compiled Lisp program (pre 2004-03-27)
0 string (|SYSTEM|::|VERSION|\040' CLISP byte-compiled Lisp program text
diff --git a/magic/Magdir/locoscript b/magic/Magdir/locoscript
new file mode 100644
index 000000000000..87771ccdf9e6
--- /dev/null
+++ b/magic/Magdir/locoscript
@@ -0,0 +1,12 @@
+
+#------------------------------------------------------------------------------
+# $File: locoscript,v 1.1 2021/01/03 20:56:25 christos Exp $
+# locoscript: file(1) magic for LocoScript documents and related files
+#
+# See http://fileformats.archiveteam.org/wiki/LocoScript
+0 string JOY\x01\x01 LocoScript 1 document
+0 string JOY\x01\x02 LocoScript 2 document
+0 string JOY\x01\x04 LocoScript 3 document
+0 string JOY\x01\x06 LocoScript 4 document
+0 string DOC\x01\x01 LocoScript PC document
+0 string DOC\x01\x03 LocoScript Professional document
diff --git a/magic/Magdir/lua b/magic/Magdir/lua
index 0e47c2f9122a..ab17374534de 100644
--- a/magic/Magdir/lua
+++ b/magic/Magdir/lua
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: lua,v 1.7 2019/04/19 00:42:27 christos Exp $
+# $File: lua,v 1.8 2020/10/08 23:23:56 christos Exp $
# lua: file(1) magic for Lua scripting language
# URL: https://www.lua.org/
# From: Reuben Thomas <rrt@sc3d.org>, Seo Sanghyeon <tinuviel@sparcs.kaist.ac.kr>
@@ -17,6 +17,15 @@
# Lua bytecode
0 string \033Lua Lua bytecode,
+# 2.4 uses 0x23 as its version byte because it shares the format
+# with 2.3 (which was never released publicly).
+>4 byte 0x23 version 2.4
+>4 byte 0x25 version 2.5/3.0
+>4 byte 0x31 version 3.1
+>4 byte 0x32 version 3.2
+>4 byte 0x40 version 4.0
>4 byte 0x50 version 5.0
>4 byte 0x51 version 5.1
>4 byte 0x52 version 5.2
+>4 byte 0x53 version 5.3
+>4 byte 0x54 version 5.4
diff --git a/magic/Magdir/mach b/magic/Magdir/mach
index c1bec073480f..7eb98ff34e39 100644
--- a/magic/Magdir/mach
+++ b/magic/Magdir/mach
@@ -1,6 +1,6 @@
#------------------------------------------------------------
-# $File: mach,v 1.23 2015/10/15 21:51:22 christos Exp $
+# $File: mach,v 1.29 2021/04/26 15:56:00 christos Exp $
# Mach has two magic numbers, 0xcafebabe and 0xfeedface.
# Unfortunately the first, cafebabe, is shared with
# Java ByteCode, so they are both handled in the file "cafebabe".
@@ -11,8 +11,11 @@
# it's also separate from the "64-bit libraries" bit in the
# upper 8 bits of the CPU subtype
+# Reference: https://opensource.apple.com/source/cctools/cctools-949.0.1/
+# include/mach-o/loader.h
+# display CPU type as string like: i386 x86_64 ... armv7 armv7k ...
0 name mach-o-cpu
->0 belong&0x01000000 0
+>0 belong&0xff000000 0
#
# 32-bit ABIs.
#
@@ -51,37 +54,37 @@
>>>>4 belong&0x00fffff0 0x30 pentium_2_m3
>>>>4 belong&0x00fffff0 0x40 pentium_2_m0x40
>>>>4 belong&0x00fffff0 0x50 pentium_2_m5
->>>>4 belong&0x00fffff0 >0x50 pentium_2_m0x%x
+>>>>4 belong&0x00fffff0 >0x50 pentium_2_m%#x
>>>4 belong&0x0000000f 7 celeron
->>>>4 belong&0x00fffff0 0x00 \b_m0x%x
->>>>4 belong&0x00fffff0 0x10 \b_m0x%x
->>>>4 belong&0x00fffff0 0x20 \b_m0x%x
->>>>4 belong&0x00fffff0 0x30 \b_m0x%x
->>>>4 belong&0x00fffff0 0x40 \b_m0x%x
->>>>4 belong&0x00fffff0 0x50 \b_m0x%x
+>>>>4 belong&0x00fffff0 0x00 \b_m%#x
+>>>>4 belong&0x00fffff0 0x10 \b_m%#x
+>>>>4 belong&0x00fffff0 0x20 \b_m%#x
+>>>>4 belong&0x00fffff0 0x30 \b_m%#x
+>>>>4 belong&0x00fffff0 0x40 \b_m%#x
+>>>>4 belong&0x00fffff0 0x50 \b_m%#x
>>>>4 belong&0x00fffff0 0x60
>>>>4 belong&0x00fffff0 0x70 \b_mobile
->>>>4 belong&0x00fffff0 >0x70 \b_m0x%x
+>>>>4 belong&0x00fffff0 >0x70 \b_m%#x
>>>4 belong&0x0000000f 8 pentium_3
>>>>4 belong&0x00fffff0 0x00
>>>>4 belong&0x00fffff0 0x10 \b_m
>>>>4 belong&0x00fffff0 0x20 \b_xeon
->>>>4 belong&0x00fffff0 >0x20 \b_m0x%x
+>>>>4 belong&0x00fffff0 >0x20 \b_m%#x
>>>4 belong&0x0000000f 9 pentiumM
>>>>4 belong&0x00fffff0 0x00
->>>>4 belong&0x00fffff0 >0x00 \b_m0x%x
+>>>>4 belong&0x00fffff0 >0x00 \b_m%#x
>>>4 belong&0x0000000f 10 pentium_4
>>>>4 belong&0x00fffff0 0x00
>>>>4 belong&0x00fffff0 0x10 \b_m
->>>>4 belong&0x00fffff0 >0x10 \b_m0x%x
+>>>>4 belong&0x00fffff0 >0x10 \b_m%#x
>>>4 belong&0x0000000f 11 itanium
>>>>4 belong&0x00fffff0 0x00
>>>>4 belong&0x00fffff0 0x10 \b_2
->>>>4 belong&0x00fffff0 >0x10 \b_m0x%x
+>>>>4 belong&0x00fffff0 >0x10 \b_m%#x
>>>4 belong&0x0000000f 12 xeon
>>>>4 belong&0x00fffff0 0x00
>>>>4 belong&0x00fffff0 0x10 \b_mp
->>>>4 belong&0x00fffff0 >0x10 \b_m0x%x
+>>>>4 belong&0x00fffff0 >0x10 \b_m%#x
>>>4 belong&0x0000000f >12 ia32 family=%d
>>>>4 belong&0x00fffff0 0x00
>>>>4 belong&0x00fffff0 >0x00 model=%x
@@ -139,13 +142,13 @@
>>>4 belong&0x00ffffff 6 \b_604
>>>4 belong&0x00ffffff 7 \b_604e
>>>4 belong&0x00ffffff 8 \b_620
->>>4 belong&0x00ffffff 9 \b_650
+>>>4 belong&0x00ffffff 9 \b_750
>>>4 belong&0x00ffffff 10 \b_7400
>>>4 belong&0x00ffffff 11 \b_7450
>>>4 belong&0x00ffffff 100 \b_970
>>>4 belong&0x00ffffff >100 subarchitecture=%d
>>0 belong&0x00ffffff >18 architecture=%d
->0 belong&0x01000000 0x01000000
+>0 belong&0xff000000 0x01000000
#
# 64-bit ABIs.
#
@@ -171,6 +174,15 @@
>>0 belong&0x00ffffff 12 arm64
>>>4 belong&0x00ffffff 0
>>>4 belong&0x00ffffff 1 \bv8
+>>>4 belong&0x00ffffff 2 \be
+>>>>7 ubyte&0xff >0 (caps:
+>>>>7 ubyte&0xff <0x80 %#02x
+>>>>7 ubyte&0xc0 0x80 PAC
+>>>>>7 ubyte&0x3f x \b%02d
+>>>>7 ubyte&0xc0 0xc0 PAK
+>>>>>7 ubyte&0x3f x \b%02d
+>>>>7 ubyte&0xff x \b)
+>>>4 belong&0x00ffffff >2 subarchitecture=%d
>>0 belong&0x00ffffff 13 64-bit architecture=%d
>>0 belong&0x00ffffff 14 64-bit architecture=%d
>>0 belong&0x00ffffff 15 64-bit architecture=%d
@@ -192,51 +204,91 @@
>>>4 belong&0x00ffffff 100 \b_970
>>>4 belong&0x00ffffff >100 subarchitecture=%d
>>0 belong&0x00ffffff >18 64-bit architecture=%d
-
+>0 belong&0xff000000 0x02000000
+#
+# 64_32-bit ABIs.
+#
+>>0 belong&0x00ffffff 0 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 1 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 2 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 3 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 4 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 5 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 6 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 7 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 8 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 9 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 10 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 11 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 12 64_32-bit arm
+>>>4 belong&0x00ffffff 0
+>>>4 belong&0x00ffffff 1 \bv8
+>>>4 belong&0x00ffffff >1 subarchitecture=%d
+>>0 belong&0x00ffffff 13 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 14 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 15 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 16 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 17 64_32-bit architecture=%d
+>>0 belong&0x00ffffff 18 64_32-bit architecture=%d
+>>0 belong&0x00ffffff >18 64_32-bit architecture=%d
0 name mach-o-be
>0 byte 0xcf 64-bit
>4 use mach-o-cpu
>12 belong 1 object
+# GRR: Does not work for Mach-O with 2 architectures; instead display oo
+#!:ext o
+!:ext o/
>12 belong 2 executable
+# the executables normally have no file extension like perl,
+# but exceptions like perl5.18 perl5.16
+!:ext 16/18/
>12 belong 3 fixed virtual memory shared library
>12 belong 4 core
>12 belong 5 preload executable
>12 belong 6 dynamically linked shared library
+# GRR: Does not work for Mach-O with 2 architectures; instead display dylibdylib
+#!:ext dylib
+!:ext dylib/
>12 belong 7 dynamic linker
>12 belong 8 bundle
+# normally name extension bundle; but exceptions like: AMDil_r700.dylib
+!:ext bundle/dylib/
>12 belong 9 dynamically linked shared library stub
>12 belong 10 dSYM companion file
>12 belong 11 kext bundle
>12 belong >11
>>12 belong x filetype=%d
>24 belong >0 \b, flags:<
->>24 belong &0x0000001 \bNOUNDEFS
->>24 belong &0x0000002 \b|INCRLINK
->>24 belong &0x0000004 \b|DYLDLINK
->>24 belong &0x0000008 \b|BINDATLOAD
->>24 belong &0x0000010 \b|PREBOUND
->>24 belong &0x0000020 \b|SPLIT_SEGS
->>24 belong &0x0000040 \b|LAZY_INIT
->>24 belong &0x0000080 \b|TWOLEVEL
->>24 belong &0x0000100 \b|FORCE_FLAT
->>24 belong &0x0000200 \b|NOMULTIDEFS
->>24 belong &0x0000400 \b|NOFIXPREBINDING
->>24 belong &0x0000800 \b|PREBINDABLE
->>24 belong &0x0001000 \b|ALLMODSBOUND
->>24 belong &0x0002000 \b|SUBSECTIONS_VIA_SYMBOLS
->>24 belong &0x0004000 \b|CANONICAL
->>24 belong &0x0008000 \b|WEAK_DEFINES
->>24 belong &0x0010000 \b|BINDS_TO_WEAK
->>24 belong &0x0020000 \b|ALLOW_STACK_EXECUTION
->>24 belong &0x0040000 \b|ROOT_SAFE
->>24 belong &0x0080000 \b|SETUID_SAFE
->>24 belong &0x0100000 \b|NO_REEXPORTED_DYLIBS
->>24 belong &0x0200000 \b|PIE
->>24 belong &0x0400000 \b|DEAD_STRIPPABLE_DYLIB
->>24 belong &0x0800000 \b|HAS_TLV_DESCRIPTORS
->>24 belong &0x1000000 \b|NO_HEAP_EXECUTION
->>24 belong &0x2000000 \b|APP_EXTENSION_SAFE
+>>24 belong &0x00000001 \bNOUNDEFS
+>>24 belong &0x00000002 \b|INCRLINK
+>>24 belong &0x00000004 \b|DYLDLINK
+>>24 belong &0x00000008 \b|BINDATLOAD
+>>24 belong &0x00000010 \b|PREBOUND
+>>24 belong &0x00000020 \b|SPLIT_SEGS
+>>24 belong &0x00000040 \b|LAZY_INIT
+>>24 belong &0x00000080 \b|TWOLEVEL
+>>24 belong &0x00000100 \b|FORCE_FLAT
+>>24 belong &0x00000200 \b|NOMULTIDEFS
+>>24 belong &0x00000400 \b|NOFIXPREBINDING
+>>24 belong &0x00000800 \b|PREBINDABLE
+>>24 belong &0x00001000 \b|ALLMODSBOUND
+>>24 belong &0x00002000 \b|SUBSECTIONS_VIA_SYMBOLS
+>>24 belong &0x00004000 \b|CANONICAL
+>>24 belong &0x00008000 \b|WEAK_DEFINES
+>>24 belong &0x00010000 \b|BINDS_TO_WEAK
+>>24 belong &0x00020000 \b|ALLOW_STACK_EXECUTION
+>>24 belong &0x00040000 \b|ROOT_SAFE
+>>24 belong &0x00080000 \b|SETUID_SAFE
+>>24 belong &0x00100000 \b|NO_REEXPORTED_DYLIBS
+>>24 belong &0x00200000 \b|PIE
+>>24 belong &0x00400000 \b|DEAD_STRIPPABLE_DYLIB
+>>24 belong &0x00800000 \b|HAS_TLV_DESCRIPTORS
+>>24 belong &0x01000000 \b|NO_HEAP_EXECUTION
+>>24 belong &0x02000000 \b|APP_EXTENSION_SAFE
+>>24 belong &0x04000000 \b|NLIST_OUTOFSYNC_WITH_DYLDINFO
+>>24 belong &0x08000000 \b|SIM_SUPPORT
+>>24 belong &0x80000000 \b|DYLIB_IN_CACHE
>>24 belong x \b>
#
diff --git a/magic/Magdir/macintosh b/magic/Magdir/macintosh
index 218a844dbefd..905e4d6e1500 100644
--- a/magic/Magdir/macintosh
+++ b/magic/Magdir/macintosh
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: macintosh,v 1.30 2019/12/14 20:40:26 christos Exp $
+# $File: macintosh,v 1.32 2021/04/26 15:56:00 christos Exp $
# macintosh description
#
# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
@@ -17,7 +17,7 @@
0 search/2652/b (This\ file\
>&0 use binhex
0 name binhex
-# keep splitted search string format similar like in version 5.37
+# keep split search string format similar like in version 5.37
>0 string must\ be\ converted\ with\ BinHex\ BinHex binary text, version
# http://www.macdisk.com/binhexen.php3
!:apple BNHQTEXT
@@ -141,7 +141,7 @@
!:ext bin/macbin
# THIS SHOULD NEVER HAPPEN! Maybe another file type is misidetified as MacBinary
#>1 ubyte >63 \b, name length %u too BIG!
-#>122 ubeshort x \b, version 0x%x
+#>122 ubeshort x \b, version %#x
# Finder flags if not 0
# >73 byte !0 \b, flags 0x
# >73 byte =0
@@ -164,21 +164,21 @@
# 77 beshort # horiz posn in window
#>77 beshort !0 \b, h.pos %u
# 79 beshort # window or folder ID
->79 ubeshort !0 \b, ID 0x%x
+>79 ubeshort !0 \b, ID %#x
# protected flag
->81 byte !0 \b, protected 0x%x
+>81 byte !0 \b, protected %#x
# length of comment after resource
>99 ubeshort !0 \b, comment length %u
# char. code of file name
->106 ubyte !0 \b, char. code 0x%x
+>106 ubyte !0 \b, char. code %#x
# still more Finder flags
->107 ubyte !0 \b, more flags 0x%x
+>107 ubyte !0 \b, more flags %#x
# length of total files when unpacked only used when pack and unpack on the fly
>116 ubelong !0 \b, total length %u
# 120 beshort # length of add'l header
>120 ubeshort !0 \b, 2nd header length %u
# 124 beshort # checksum
-#>124 ubeshort !0 \b, CRC 0x%x
+#>124 ubeshort !0 \b, CRC %#x
# creation date in seconds since MacOS epoch start. So 1 Jan 1970 ~ 7C25B080
>91 beldate-0x7C25B080 x \b, %s
# THIS SHOULD NEVER HAPPEN! Maybe another file type is misidetified or time overflow
@@ -204,7 +204,7 @@
# Afterwards resource fork if length of resource segment not zero
>87 ubelong !0
# calculate resource fork offset
->>83 ubelong+128 x \b, at 0x%x
+>>83 ubelong+128 x \b, at %#x
# length of resource segment
>>87 ubelong !0 %u bytes
>>(83.S+128) ubequad x resource
diff --git a/magic/Magdir/mail.news b/magic/Magdir/mail.news
index 006fe923a860..074cfb191456 100644
--- a/magic/Magdir/mail.news
+++ b/magic/Magdir/mail.news
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: mail.news,v 1.25 2019/06/21 20:06:05 christos Exp $
+# $File: mail.news,v 1.28 2021/09/11 19:20:15 christos Exp $
# mail.news: file(1) magic for mail and news
#
# Unfortunately, saved netnews also has From line added in some news software.
@@ -24,6 +24,8 @@
!:mime message/news
0 string/t From: news or mail text
!:mime message/rfc822
+0 string/t Date: news or mail text
+!:mime message/rfc822
0 string/t Article saved news text
!:mime message/news
# Reference: http://quimby.gnus.org/notes/BABYL
@@ -75,3 +77,10 @@
>12 belong =1 version 1, big-endian
>12 lelong =1 version 1, little-endian
>12 belong x version %d, network-endian
+
+# Dovecot mail server, version 2.2 and later.
+# Dovecot mailing list: dovecot@dovecot.org
+# File format spec: https://wiki.dovecot.org/Design/Dcrypt/#File_format
+# From: Stephen Gildea
+0 string CRYPTED\003\007 Dovecot encrypted message
+>9 byte x \b, dcrypt version %d
diff --git a/magic/Magdir/map b/magic/Magdir/map
index 460746bab227..2e8d0797d319 100644
--- a/magic/Magdir/map
+++ b/magic/Magdir/map
@@ -1,7 +1,7 @@
#------------------------------------------------------------------------------
-# $File: map,v 1.8 2019/12/01 22:46:23 christos Exp $
+# $File: map,v 1.9 2021/04/26 15:56:00 christos Exp $
# map: file(1) magic for Map data
#
@@ -40,7 +40,7 @@
>0 ubyte x Garmin
!:mime application/x-garmin-map
# If non-zero, every byte of the entire .img file is to be XORed with this value
->0 ubyte !0 \b, 0x%x XORed
+>0 ubyte !0 \b, %#x XORed
# goto block before FAT
>(0x40.b*512) ubyte x
# 1st fat name "DLLINFO TXT" only found for vpm
@@ -54,7 +54,7 @@
>>&512 string !DLLINFO\ TXT map
!:ext img
# 9 zeros
->1 ubelong !0 \b, zeroes 0x%x
+>1 ubelong !0 \b, zeroes %#x
# Map's version major
>8 ubyte x v%u
# Map's version minor
@@ -72,12 +72,12 @@
# Update month (0-11)
>0xA ubyte x \b-%.2u
# All zeroes
->0xc uleshort !0 \b, zeroes 0x%x
+>0xc uleshort !0 \b, zeroes %#x
# Mapsource flag, 1 - file created by Mapsource, 0 - Garmin map visible in Basecamp and Homeport
-#>0xE ubyte !0 \b, Mapsource flag 0x%x
+#>0xE ubyte !0 \b, Mapsource flag %#x
>0xE ubyte 1 \b, Mapsource
# Checksum, sum of all bytes modulo 256 should be 0
-#>0xF ubyte x \b, Checksum 0x%x
+#>0xF ubyte x \b, Checksum %#x
# Signature: DSKIMG 0x00 or DSDIMG 0x00 for demo map
>0x10 string !DSKIMG \b, signature "%.7s"
>0x39 use garmin-date
@@ -99,20 +99,20 @@
# MBR signature
>0x1FE leshort !0xAA55 \b, invalid MBR
# 512 zeros
->0x200 uquad !0 \b, zeroes 0x%llx
+>0x200 uquad !0 \b, zeroes %#llx
# First sub-file offset (absolute); sometimes NO/UNKNOWN sub file!
->0x40C ulelong >0 \b, at 0x%x
+>0x40C ulelong >0 \b, at %#x
# sub-file Header length
-#>>(0x40C.l) uleshort x \b, header len 0x%x
+#>>(0x40C.l) uleshort x \b, header len %#x
>>(0x40C.l) uleshort x %u bytes
# sub-file Type[10] like "GARMIN RGN" "GARMIN TRE", "GARMIN TYP", etc.
>>(0x40C.l+2) ubyte >0x1F
>>>(0x40C.l+2) ubyte <0xFF
>>>>(0x40C.l+2) string x "%.10s"
# 0x00 for most maps, 0x80 for locked maps (City Nav, City Select, etc.)
->>>>(0x40C.l+13) ubyte >0 \b, locked 0x%x
+>>>>(0x40C.l+13) ubyte >0 \b, locked %#x
# Block sequence numbers like 0000 0100 0200 ... FFFF
-# >0x420 ubequad >0 \b, seq. 0x%16.16llx
+# >0x420 ubequad >0 \b, seq. %#16.16llx
# >>0x428 ubequad >0 \b%16.16llx
# >>>0x430 ubequad >0 \b%16.16llx
# >>>>0x438 ubequad >0 \b%16.16llx
@@ -147,12 +147,12 @@
# ... xth FAT block
#
# 314 zeros but not in vpm and also gmaptz.img
->0x84 uquad !0 \b, at 0x84 0x%llx
+>0x84 uquad !0 \b, at 0x84 %#llx
# display FileAllocationTable block entry in garmin map
0 name garmin-fat
>0 ubyte x \b;
# sub file part; 0x0003 seems to be garbage
->0x10 uleshort !0 next 0x%4.4x
+>0x10 uleshort !0 next %#4.4x
>0x10 uleshort =0
# fat flag 0~dummy block 1~true sub file
>>0 ubyte !1 flag %u
@@ -164,7 +164,7 @@
# size of sub file
>>>0xC ulelong x \b, %u bytes
# 32-bit block sequence numbers
-#>>>0x20 ubequad x \b, seq. 0x%16.16llx
+#>>>0x20 ubequad x \b, seq. %#16.16llx
# display date stored inside Garmin maps like yyyy-mm-dd h:mm:ss
0 name garmin-date
@@ -207,38 +207,38 @@
!:mime application/x-garmin-nod
!:ext nod
>>>0x0E use garmin-date
-#>>>0x15 ulelong x \b, at 0x%x
-#>>>0x19 ulelong x 0x%x bytes NOD1
-#>>>0x25 ulelong x \b, at 0x%x
-#>>>0x29 ulelong x 0x%x bytes NOD2
-#>>>0x31 ulelong x \b, at 0x%x
-#>>>0x35 ulelong x 0x%x bytes NOD3
+#>>>0x15 ulelong x \b, at %#x
+#>>>0x19 ulelong x %#x bytes NOD1
+#>>>0x25 ulelong x \b, at %#x
+#>>>0x29 ulelong x %#x bytes NOD2
+#>>>0x31 ulelong x \b, at %#x
+#>>>0x35 ulelong x %#x bytes NOD3
# URL: http://www.pinns.co.uk/osm/net.html
# routable highways (length, direction, allowed speed,house address information)
>>9 string NET highways
!:mime application/x-garmin-net
!:ext net
-#>>>0x15 ulelong x \b, at 0x%x
-#>>>0x19 ulelong x 0x%x bytes NET1
+#>>>0x15 ulelong x \b, at %#x
+#>>>0x19 ulelong x %#x bytes NET1
#>>>0x22 ulelong >0
-#>>>>0x1E ulelong x \b, at 0x%x
-#>>>>0x22 ulelong x 0x%x bytes NET2
+#>>>>0x1E ulelong x \b, at %#x
+#>>>>0x22 ulelong x %#x bytes NET2
#>>>0x2B ulelong >0
-#>>>>0x27 ulelong x \b, at 0x%x
-#>>>>0x2B ulelong x 0x%x bytes NET3
+#>>>>0x27 ulelong x \b, at %#x
+#>>>>0x2B ulelong x %#x bytes NET3
# URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/LBL_Subfile_Format
>>9 string LBL labels
!:mime application/x-garmin-lbl
!:ext lbl
>>>(0.s) string x %s
# Label coding type 6h 9h and ah
->>>0x1E ubyte x \b, coding type 0x%x
-#>>>0x15 ulelong x \b, at 0x%x
-#>>>0x19 ulelong x 0x%x bytes LBL1
-#>>>0x1F ulelong x \b, at 0x%x
-#>>>0x23 ulelong x 0x%x bytes LBL2
-#>>>0x2D ulelong x \b, at 0x%x
-#>>>0x31 ulelong x 0x%x bytes LBL3
+>>>0x1E ubyte x \b, coding type %#x
+#>>>0x15 ulelong x \b, at %#x
+#>>>0x19 ulelong x %#x bytes LBL1
+#>>>0x1F ulelong x \b, at %#x
+#>>>0x23 ulelong x %#x bytes LBL2
+#>>>0x2D ulelong x \b, at %#x
+#>>>0x31 ulelong x %#x bytes LBL3
# URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/SRT_Subfile_Format
# A lookup table of the chars in the map's codepage, and their collating sequence
>>9 string SRT sort table
@@ -256,16 +256,16 @@
# or http://www.openstreetmap.org/
>>>>&1 string x %s
>>>0x0E use garmin-date
-#>>>0x21 ulelong x \b, at 0x%x
-#>>>0x25 ulelong x 0x%x bytes TRE1
-#>>>0x29 ulelong x \b, at 0x%x
-#>>>0x2D ulelong x 0x%x bytes TRE2
-#>>>0x31 ulelong x \b, at 0x%x
-#>>>0x35 ulelong x 0x%x bytes TRE3
+#>>>0x21 ulelong x \b, at %#x
+#>>>0x25 ulelong x %#x bytes TRE1
+#>>>0x29 ulelong x \b, at %#x
+#>>>0x2D ulelong x %#x bytes TRE2
+#>>>0x31 ulelong x \b, at %#x
+#>>>0x35 ulelong x %#x bytes TRE3
# Copyright record size
#>>>0x39 uleshort x \b, copyright record size %u
# Map ID
->>>0x74 ulelong x \b, ID 0x%x
+>>>0x74 ulelong x \b, ID %#x
# URL: https://www.gpspower.net/garmin-tutorials/353310-basecamp-installing-free-desktop-map.html
# For road traffic information service (RDS/TMS/TMC). Commonly seen in City Navigator maps
>>9 string TRF traffic,
@@ -285,11 +285,11 @@
# character set 1252 65001~UTF8
>>>0x15 uleshort x \b, code page %u
# POIs
-#>>>0x17 ulelong x \b, at 0x%x
-#>>>0x1B ulelong x 0x%x bytes TYP1
+#>>>0x17 ulelong x \b, at %#x
+#>>>0x1B ulelong x %#x bytes TYP1
# extra pois
-#>>>0x5B ulelong x \b, at 0x%x
-#>>>0x5F ulelong x 0x%x bytes TYP8
+#>>>0x5B ulelong x \b, at %#x
+#>>>0x5F ulelong x %#x bytes TYP8
# URL: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/RGN_Subfile_Format
# http://www.pinns.co.uk/osm/RGN.html
# region data used by the Garmin software
@@ -297,24 +297,24 @@
!:mime application/x-garmin-rgn
!:ext rgn
# POIs,Indexed POIs,Polylines or Polygons or first map level
-#>>>0x15 ulelong x \b, at 0x%x
-#>>>0x19 ulelong x 0x%x bytes RGN1
+#>>>0x15 ulelong x \b, at %#x
+#>>>0x19 ulelong x %#x bytes RGN1
# polygons with extended types
#>>>0x21 ulelong >0
-#>>>>0x1D ulelong x \b, at 0x%x
-#>>>>0x21 ulelong x 0x%x bytes RGN2
+#>>>>0x1D ulelong x \b, at %#x
+#>>>>0x21 ulelong x %#x bytes RGN2
# polylines with extended types
#>>>0x3D ulelong >0
-#>>>>0x39 ulelong x \b, at 0x%x
-#>>>>0x3D ulelong x 0x%x bytes RGN3
+#>>>>0x39 ulelong x \b, at %#x
+#>>>>0x3D ulelong x %#x bytes RGN3
# extended POIs
#>>>0x59 ulelong >0
-#>>>>0x55 ulelong x \b, at 0x%x
-#>>>>0x59 ulelong x 0x%x bytes RGN3
+#>>>>0x55 ulelong x \b, at %#x
+#>>>>0x59 ulelong x %#x bytes RGN3
#>>9 default x unknown map type
# Header length; GMP:31h 35h 3Dh,MDR:11Eh 238h 2C4h 310h,NOD:3Fh 7Fh,NET:64h,
# LBL:2A9h,SRT:1Dh 25h 27h,TRE:CFh 135h,TRF:5Ah,TYP:5Bh 6Eh 7Ch AEh,RGN:7Dh
->>0 uleshort x \b, header length 0x%x
+>>0 uleshort x \b, header length %#x
# URL: https://www.memotech.franken.de/FileFormats/
# Reference: https://www.memotech.franken.de/FileFormats/Garmin_RGN_Format.pdf
@@ -357,7 +357,7 @@
# display information of Garmin RGN record
0 name garmin-entry
# record length: 2 for Data, for Application often 1Bh sometimes 1Dh, "big" for Region
-#>0 ulelong x \b, length 0x%x
+#>0 ulelong x \b, length %#x
# data record (ID='D') with version content like 0064h~1.0
>4 ubyte =0x44
>>5 uleshort !0x0064 \b; Data
@@ -382,11 +382,11 @@
# delay in ms: like 0, 500
>>7 ulelong !0 \b, %u ms
# region size (is record length - 10)
-#>>11 ulelong x \b, length 0x%x
+#>>11 ulelong x \b, length %#x
# region content like:
# "KpGr"~recursiv embedded,"GARMIN BITMAP"~Garmin Bitmap *.srf, "PK"~ZIP archive
#>>15 string x \b, content "%s"
->>15 ubequad x \b, content 0x%llx...
+>>15 ubequad x \b, content %#llx...
# This does NOT WORK!
#>>15 indirect x \b; contains
>4 default x \b; other
diff --git a/magic/Magdir/maple b/magic/Magdir/maple
index 44ab2842b604..80cf9f29a114 100644
--- a/magic/Magdir/maple
+++ b/magic/Magdir/maple
@@ -1,20 +1,72 @@
#------------------------------------------------------------------------------
-# $File: maple,v 1.8 2017/03/17 21:35:28 christos Exp $
+# $File: maple,v 1.10 2021/08/30 13:31:25 christos Exp $
# maple: file(1) magic for maple files
# "H. Nanosecond" <aldomel@ix.netcom.com>
# Maple V release 4, a multi-purpose math program
#
# maple library .lib
-0 string \000MVR4\nI MapleVr4 library
+# URL: https://en.wikipedia.org/wiki/Maple_(software)
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/l/lib-maple-v-r4.trid.xml
+# Update: Joerg Jenderek
+0 string \000MVR4\nI Maple Vr4 library
+#!:mime application/octet-stream
+!:mime application/x-maple-lib
+!:ext lib
+
+# URL: https://en.wikipedia.org/wiki/Maple_(software)
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/l/lib-maple-v-r5.trid.xml
+# From: Joerg Jenderek
+0 string \000MVR5\n Maple Vr5 library
+#!:mime application/octet-stream
+!:mime application/x-maple-lib
+!:ext lib
+
+# From: Joerg Jenderek
+0x400 string M7R0\nI Maple Vr7 library
+#!:mime application/octet-stream
+!:mime application/x-maple-lib
+!:ext lib
+# null terminated library name like: C:\Maple12/Cliffordlib\maple.lib ../Maplets/Tutors.lib
+>5 string x %s
+# probably library name padding with nil or points (0x2E)
+#>0xF8 uquad x \b, PADDING 0x%16.16llx
+# null terminated strings like: Exterior Clifford FunctionArithmetics
+# like: 1 20 40
+>0x115 ulelong x \b, %u string
+# plural s
+>0x115 ulelong >1 \bs
+>0x119 string x 1st '%s'
+# probably second name section padding with nil or points (0x2E)
+#>0x3F0 uquad x \b, 2nd PADDING 0x%16.16llx
+# line feed separated ASCII string with maximal 79 length
+#>0x407 string x \b, section "%s"
+>0x454 ubyte !0x0a \b, at 0x454 0x%x
# .ind
# no magic for these :-(
# they are compiled indexes for maple files
# .hdb
-0 string \000\004\000\000 Maple help database
+# Update: Joerg Jenderek
+# URL: https://www.maplesoft.com/support/help/maple/view.aspx?path=Formats/HDB
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/h/hdb-maple.trid.xml
+# Note: This format was replaced in Maple 18 by the Maple Help format (*.help)
+0 string \000\004\000\000
+# skip xBASE Compound Index file *.CDX by looking for version
+>1028 string version Maple help database
+# length of string version
+#>>1024 ulelong !7 \b, at 0x400 unexpected %u
+#!:mime application/octet-stream
+!:mime application/x-maple-hdb
+!:ext hdb
+>1028 default x
+# skip more xBASE Compound Index file *.CDX by looking for keyword Maple
+# like hsum.hdb
+>>4 search/0xCC41 Maple Maple help database
+!:mime application/x-maple-hdb
+!:ext hdb
# .mhp
# this has the form <PACKAGE=name>
diff --git a/magic/Magdir/mathematica b/magic/Magdir/mathematica
index e76957eea43a..77903b5fe8c3 100644
--- a/magic/Magdir/mathematica
+++ b/magic/Magdir/mathematica
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: mathematica,v 1.9 2017/03/17 21:35:28 christos Exp $
+# $File: mathematica,v 1.13 2021/07/14 09:06:24 christos Exp $
# mathematica: file(1) magic for mathematica files
# "H. Nanosecond" <aldomel@ix.netcom.com>
# Mathematica a multi-purpose math program
@@ -13,7 +13,7 @@
!:ext mb
# .ma
-# multiple possibilites:
+# multiple possibilities:
0 string (*^\n\n::[\011frontEndVersion\ =\ Mathematica notebook
#>41 string >\0 %s
@@ -24,7 +24,7 @@
#0 string (*^\n\n::[\011Information Mathematica notebook version 2.x
#>675 string >\0 %s #doesn't work well
-# there may be 'cr' instread of 'nl' in some does this matter?
+# there may be 'cr' instead of 'nl' in some does this matter?
# generic:
0 string (*^\r\r::[\011 Mathematica notebook version 2.x
@@ -73,9 +73,90 @@
#########################
# MatLab v5
-0 string MATLAB Matlab v5 mat-file
+# URL: http://fileformats.archiveteam.org/wiki/MAT
+# Reference: https://www.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf
+# first 116 bytes of header contain text in human-readable form
+0 string MATLAB Matlab v
+#>11 string/T x \b, at 11 "%.105s"
+#!:mime application/octet-stream
+!:mime application/x-matlab-data
+!:ext mat
+# https://de.mathworks.com/help/matlab/import_export/mat-file-versions.html
+# level of the MAT-file like: 5.0 7.0 or maybe 7.3
+#>7 string x LEVEL "%.3s"
+>7 ubyte =0x35 \b5 mat-file
+>7 ubyte !0x35
+>>7 string x \b%.3s mat-file
>126 short 0x494d (big endian)
->>124 beshort x version 0x%04x
+>>124 beshort x version %#04x
>126 short 0x4d49 (little endian)
->>124 leshort x version 0x%04x
-
+# 0x0100 for level 5.0 and 0x0200 for level 7.0
+>>124 leshort x version %#04x
+# test again so that default clause works
+>126 short x
+# created by MATLAB include Platform sometimes without leading comma (0x2C) or missing
+# like: GLNX86 PCWIN PCWIN64 SOL2 Windows\0407 nt posix
+>>20 search/2 Platform:\040 \b, platform
+>>>&0 string x %-0.2s
+>>>&2 ubyte !0x2C \b%c
+>>>>&0 ubyte !0x2C \b%c
+>>>>>&0 ubyte !0x2C \b%c
+>>>>>>&0 ubyte !0x2C \b%c
+>>>>>>>&0 ubyte !0x2C \b%c
+>>>>>>>>&0 ubyte !0x2C \b%c
+>>>>>>>>>&0 ubyte !0x2C \b%c
+# examples without Platform tag like one_by_zero_char.mat
+>>20 default x
+>>>11 string x "%s"
+# created by MATLAB include time like: Fri Feb 20 15:26:59 2009
+>34 search/9/c created\040on:\040 \b, created
+>>&0 string x %-.24s
+# MatLab v4
+# From: Joerg Jenderek
+# check for valid imaginary flag of Matlab matrix version 4
+13 ushort 0
+# check for valid ASCII matrix name
+>20 ubyte >0x1F
+# skip some CD-ROM filesystem like test-hfs.iso by looking for valid big endian type flag
+>>0 ubelong&0xFFffFF00 0x00000300
+>>>0 use matlab4
+# no example for 8-bit and 16-bit integers matrix
+>>0 ubelong&0xFFffFF00 0x00000400
+>>>0 use matlab4
+>>0 ulelong x
+# skip big endian variant by looking for valid low lttle endian type flag
+>>0 ulelong <53
+>>>0 use \^matlab4
+# display information of Matlab v4 mat-file
+0 name matlab4 Matlab v4 mat-file
+#!:mime application/octet-stream
+!:mime application/x-matlab-data
+!:ext mat
+# 20-byte header with 5 long integers that contains information describing certain attributes of the Matrix
+# type flag decimal MOPT; maximal 4052=FD4h; maximal 52=34h for little endian
+#>0 ubelong x \b, type flag %u
+#>0 ubelong x (%#x)
+# M: 0~little endian 1~Big Endian 2~VAX D-float 3~VAX G-float 4~Cray
+#>0 ubelong/1000 x \b, M=%u
+>0 ubelong/1000 0 (little endian)
+>0 ubelong/1000 1 (big endian)
+>0 ubelong/1000 2 (VAX D-float)
+>0 ubelong/1000 3 (VAX G-float)
+>0 ubelong/1000 4 (Cray)
+# namlen; the length of the matrix name
+#>16 ubelong x \b, name length %u
+# nul terminated matrix name like: fit_params testmatrix testsparsecomplex teststringarray
+#>20 string x \b, MATRIX NAME="%s"
+>16 pstring/L x %s
+# T indicates the matrix type: 0~numeric 1~text 2~sparse
+#>0 ubelong%10 x \b, T=%u
+>0 ubelong%10 0 \b, numeric
+>0 ubelong%10 1 \b, text
+>0 ubelong%10 2 \b, sparse
+# mrows; number of rows in the matrix like: 1 3 8
+>4 ubelong x \b, rows %u
+# ncols; number of columns in the matrix like: 1 3 4 5 9 43
+>8 ubelong x \b, columns %u
+# imagf; imaginary flag; 1~matrix has an imaginary part 0~only real data
+>12 ubelong !0 \b, imaginary
+# real; Real part of the matrix consists of mrows * ncols numbers
diff --git a/magic/Magdir/measure b/magic/Magdir/measure
index c99cac841125..42e7186484c8 100644
--- a/magic/Magdir/measure
+++ b/magic/Magdir/measure
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: measure,v 1.2 2018/06/23 16:13:15 christos Exp $
+# $File: measure,v 1.3 2021/03/25 17:30:10 christos Exp $
# measure: file(1) magic for measurement data
# DIY-Thermocam raw data
@@ -37,3 +37,8 @@
>>9600 default x (Lepton 2.x),
>>>9600 use diy-thermocam-parser
+# Becker & Hickl Photon Counting (PMS) data file
+# format documentation: https://www.becker-hickl.com/wp-content/uploads/2018/11/opm-pms400-v01.pdf (page 57)
+(0x02.l) string *IDENTIFICATION Becker & Hickl PMS Data File
+>0x12 short x (%d data blocks)
+!:ext sdt
diff --git a/magic/Magdir/misctools b/magic/Magdir/misctools
index cef1da5f4e5f..4292e2b0401a 100644
--- a/magic/Magdir/misctools
+++ b/magic/Magdir/misctools
@@ -1,22 +1,37 @@
#-----------------------------------------------------------------------------
-# $File: misctools,v 1.18 2019/04/19 00:42:27 christos Exp $
+# $File: misctools,v 1.20 2021/05/25 15:13:55 christos Exp $
# misctools: file(1) magic for miscellaneous UNIX tools.
#
0 search/1 %%!! X-Post-It-Note text
0 string/c BEGIN:VCALENDAR vCalendar calendar file
!:mime text/calendar
-# updated by Joerg Jenderek at Apr 2015
-# Extension: .vcf
+# updated by Joerg Jenderek at Apr 2015, May 2021
# https://en.wikipedia.org/wiki/VCard
-0 string/c BEGIN:VCARD vCard visiting card
+# URL: http://fileformats.archiveteam.org/wiki/VCard
+# https://datatracker.ietf.org/doc/html/rfc6350
+# the value is case-insensitive
+0 string/c begin:vcard
+# skip DROID fmt-395-signature-id-634.vcf
+>13 string !VERSION:END vCard visiting card
# deprecated
#!:mime text/x-vcard
!:mime text/vcard
+!:apple ????vCrd
+!:ext vcf/vcard
# VERSION must come right after BEGIN for 3.0 or 4.0 except in 2.1 , where it can be anywhere
->12 search/14000/c VERSION:
+# Joerg_Jenderek_67.vcf
+>>12 search/0x113b4/c version:
# VERSION 2.1 , 3.0 or 4.0
->>&0 string x \b, version %-.3s
+>>>&0 string x \b, version %-.3s
+>>>&0 string !2.1
+>>>>13 string !VERSION: \b, 2nd line does not start with VERSION:
+# downcase violates RFC 6350, but some "bad" software produce such vcards
+>>0 string !BEGIN \b, not up case
+# http://ftp.mozilla.org/pub/thunderbird/candidates/
+# 78.10.1-candidates/build1/source/thunderbird-78.10.1.source.tar.xz
+# thunderbird-78.10.1/comm/mailnews/import/test/unit/resources/basic_vcard_addressbook.vcf
+>>11 beshort !0x0D0A \b, lines not separated by CRLF
# Summary: Libtool library file
# Extension: .la
@@ -41,18 +56,18 @@
!:ext dmp/mdmp
# The high-order word is an internal value that is implementation specific.
# The low-order word is MINIDUMP_VERSION 0xA793
->4 ulelong&0x0000FFFF !0xA793 \b, version 0x%4.4x
+>4 ulelong&0x0000FFFF !0xA793 \b, version %#4.4x
# NumberOfStreams 8,9,10,13
>8 ulelong x \b, %d streams
# StreamDirectoryRva 0x20
->12 ulelong !0x20 \b, 0x%8.8x RVA
+>12 ulelong !0x20 \b, %#8.8x RVA
# CheckSum 0
->16 ulelong !0 \b, CheckSum 0x%8.8x
+>16 ulelong !0 \b, CheckSum %#8.8x
# Reserved or TimeDateStamp
>20 ledate x \b, %s
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms680519%28v=vs.85%29.aspx
# Flags MINIDUMP_TYPE enumeration type 0 0x121 0x800
->24 ulelong x \b, 0x%x type
+>24 ulelong x \b, %#x type
# >24 ulelong >0 \b; include
# >>24 ulelong &0x00000001 \b data sections,
# >>24 ulelong &0x00000020 \b list of unloaded modules,
diff --git a/magic/Magdir/modem b/magic/Magdir/modem
index c7a53ee436fe..6eb21136e462 100644
--- a/magic/Magdir/modem
+++ b/magic/Magdir/modem
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: modem,v 1.9 2019/04/19 00:42:27 christos Exp $
+# $File: modem,v 1.10 2021/04/26 15:56:00 christos Exp $
# modem: file(1) magic for modem programs
#
# From: Florian La Roche <florian@knorke.saar.de>
@@ -59,7 +59,7 @@
#
0 string RMD1 raw modem data
>4 string >\0 (%s /
->20 short >0 compression type 0x%04x)
+>20 short >0 compression type %#04x)
#
# portable voice format 1
diff --git a/magic/Magdir/motorola b/magic/Magdir/motorola
index e19a9075621f..af93720f2968 100644
--- a/magic/Magdir/motorola
+++ b/magic/Magdir/motorola
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: motorola,v 1.11 2014/04/30 21:41:02 christos Exp $
+# $File: motorola,v 1.12 2021/04/26 15:56:00 christos Exp $
# motorola: file(1) magic for Motorola 68K and 88K binaries
#
# 68K
@@ -60,7 +60,7 @@
>22 belong &0x01 fastload flag,
>22 belong &0x02 may be loaded to alternate RAM,
>22 belong &0x04 malloc may be from alternate RAM,
->22 belong x flags: 0x%X,
+>22 belong x flags: %#X,
>26 beshort 0 no relocation tab
>26 beshort !0 + relocation tab
>30 string SFX [Self-Extracting LZH SFX archive]
diff --git a/magic/Magdir/mozilla b/magic/Magdir/mozilla
index bc6b6a66b91e..32f3bb7e9c46 100644
--- a/magic/Magdir/mozilla
+++ b/magic/Magdir/mozilla
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: mozilla,v 1.10 2019/04/19 00:42:27 christos Exp $
+# $File: mozilla,v 1.12 2021/04/26 15:56:00 christos Exp $
# mozilla: file(1) magic for Mozilla XUL fastload files
# (XUL.mfasl and XPC.mfasl)
# URL: https://www.mozilla.org/
@@ -14,7 +14,7 @@
# Reference: https://github.com/avih/dejsonlz4/archive/master.zip/
# dejsonlz4-master\src\dejsonlz4.c
# Note: mostly JSON compressed with a non-standard LZ4 header
-# can be unpacked by dejsonlz4 but not lz4 programm.
+# can be unpacked by dejsonlz4 but not lz4 program.
0 string mozLz40\0 Mozilla lz4 compressed data
!:mime application/x-lz4+json
# mozlz4 extension seems to be used for search/store, while jsonlz4 for bookmarks
@@ -22,7 +22,7 @@
# decomp_size
>8 ulelong x \b, originally %u bytes
# lz4 data
-#>12 ubequad x \b, lz4 data 0x%16.16llx
+#>12 ubequad x \b, lz4 data %#16.16llx
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/Firefox_4
diff --git a/magic/Magdir/msdos b/magic/Magdir/msdos
index 7ddbb30fbbe0..c586210218bf 100644
--- a/magic/Magdir/msdos
+++ b/magic/Magdir/msdos
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: msdos,v 1.137 2020/03/20 17:20:19 christos Exp $
+# $File: msdos,v 1.152 2021/10/12 18:26:10 christos Exp $
# msdos: file(1) magic for MS-DOS files
#
@@ -47,7 +47,7 @@
# Tests for various EXE types.
#
-# Many of the compressed formats were extraced from IDARC 1.23 source code.
+# Many of the compressed formats were extracted from IDARC 1.23 source code.
#
0 string/b MZ
# All non-DOS EXE extensions have the relocation table more than 0x40 bytes into the file.
@@ -55,7 +55,9 @@
!:mime application/x-dosexec
# Windows and later versions of DOS will allow .EXEs to be named with a .COM
# extension, mostly for compatibility's sake.
-!:ext exe/com
+# URL: https://en.wikipedia.org/wiki/Personal_NetWare#VLM
+# Reference: https://mark0.net/download/triddefs_xml.7z/defs/e/exe-vlm-msg.trid.xml
+!:ext exe/com/vlm
# These traditional tests usually work but not always. When test quality support is
# implemented these can be turned on.
#>>0x18 leshort 0x1c (Borland compiler)
@@ -68,7 +70,7 @@
>>(0x3c.l+24) leshort 0x020b \b32+ executable
>>(0x3c.l+24) leshort 0x0107 ROM image
>>(0x3c.l+24) default x Unknown PE signature
->>>&0 leshort x 0x%x
+>>>&0 leshort x %#x
>>(0x3c.l+22) leshort&0x2000 >0 (DLL)
>>(0x3c.l+92) leshort 1
# Native PEs include ntoskrnl.exe, hal.dll, smss.exe, autochk.exe, and all the
@@ -107,7 +109,7 @@
>>(0x3c.l+92) leshort 14 (XBOX)
>>(0x3c.l+92) leshort 15 (Windows boot application)
>>(0x3c.l+92) default x (Unknown subsystem
->>>&0 leshort x 0x%x)
+>>>&0 leshort x %#x)
>>(0x3c.l+4) leshort 0x14c Intel 80386
>>(0x3c.l+4) leshort 0x166 MIPS R4000
>>(0x3c.l+4) leshort 0x168 MIPS R10000
@@ -139,7 +141,7 @@
>>(0x3c.l+4) leshort 0xaa64 Aarch64
>>(0x3c.l+4) leshort 0xc0ee MSIL
>>(0x3c.l+4) default x Unknown processor type
->>>&0 leshort x 0x%x
+>>>&0 leshort x %#x
>>(0x3c.l+22) leshort&0x0200 >0 (stripped to external PDB)
>>(0x3c.l+22) leshort&0x1000 >0 system file
>>(0x3c.l+24) leshort 0x010b
@@ -289,7 +291,7 @@
>>>&1 string x for DOS, Win or OS/2, emx %s
>>&(&0x42.l-3) byte x
>>>&0x26 string UPX \b, UPX compressed
-# and yet another guess: small .text, and after large .data is unusal, could be 32lite
+# and yet another guess: small .text, and after large .data is unusual, could be 32lite
>>&0x2c search/0xa0 .text
>>>&0x0b lelong <0x2000
>>>>&0 lelong >0x6000 \b, 32lite compressed
@@ -362,12 +364,93 @@
>>49824 leshort =1 \b, 1 file
>>49824 leshort >1 \b, %u files
+# Summary: OS/2 LX Library and device driver (no DOS stub)
+# From: Joerg Jenderek
+# URL: http://en.wikipedia.org/wiki/EXE
+# Reference: http://www.textfiles.com/programming/FORMATS/lxexe.txt
+# https://github.com/open-watcom/open-watcom-v2/blob/master/bld/watcom/h/exeflat.h
+# Note: by dll-os2-no-dos-stub.trid.xml called "OS/2 Dynamic Link Library (no DOS stub)"
+# TODO: unify with DOS stub variant (MZ magic)
+0 string/b LX
+>2 ushort =0
+>>0 use lx-executable
+# no examples found for big endian variant
+>2 ushort =0x0101
+>>0 use \^lx-executable
+0 name lx-executable
+# similar looking like variant with MS-DOS stub (MZ magic): "MS-DOS executable, LX"
+#>0x00 uleshort x executable,
+# signature OSF_FLAT_LX_SIGNATURE~0x584C~LX OSF_FLAT_SIGNATURE~0x454C~LE
+>0x00 uleshort =0x584c LX
+>0x00 uleshort =0x454C LE
+>0x00 uleshort x executable
+#!:mime application/x-msdownload
+!:mime application/x-lx-executable
+# byte order: 00h~little-endian non-zero=1~big-endian
+#>0x02 ubyte =0 (little-endian)
+>0x02 ubyte !0 (big-endian)
+# FOR DEBUGGING!
+# word order: 00h~little-endian non-zero=1~big-endian
+#>0x03 ubyte =0 \b, little-endian word order
+#>0x03 ubyte !0 \b, big-endian word order
+# cpu_type; CPU type like: 1~286 2~386 3~486 4 20h~i860 21h~Intel N11 40h~MIPS R2000,R3000 41h~MIPS R6000 42h~MIPS R4000
+#>0x08 uleshort x \b, CPU %u
+# os_type; target operating system like: 0~unknown 1~OS/2 2~Windows 3~DOS 4.x 4~Windows 386
+#>0x0A leshort x \b, OS %u
+# flags; module type flags
+#>0x10 ulelong x \b, FLAGS %#8.8x
+# 00000002h ~Reserved for system use
+#>0x10 ulelong &0x00000002 \b, 2h reserved
+# OSF_INIT_INSTANCE=00000004h ~Per-Process Library Initialization; setting this bit for EXE file is invalid
+#>0x10 ulelong &0x00000004 \b, per-process library Initialization
+# OSF_INTERNAL_FIXUPS_DONE=00000010h ~Internal fixups for the module have been applied
+#>0x10 ulelong &0x00000010 \b, int. fixup
+# OSF_EXTERNAL_FIXUPS_DONE=00000020h ~External fixups for the module have been applied
+#>0x10 ulelong &0x00000020 \b, ext. fixup
+# OSF_NOT_PM_COMPATIBLE=00000100h ~Incompatible with PM windowing
+#>0x10 ulelong&0x00000100 =0x00000100 \b, incompatible with PM windowing
+# OSF_PM_COMPATIBLE=00000200h ~Compatible with PM windowing
+#>0x10 ulelong&0x00000200 =0x00000200 \b, compatible with PM windowing
+# bit 17; device driver
+#>0x10 ulelong&0x00020000 >0 \b, device driver
+# Per-process Library Termination; setting this bit for EXE file is invalid
+#>0x10 ulelong&0x40000000 =0x40000000 \b, per-process library termination
+>0x0a leshort 1 for OS/2
+# no example found
+>0x0a leshort 3 for DOS
+# http://www.ctyme.com/intr/rb-2939.htm#Table1610
+# library by module type mask 00038000h (bits 15-17);
+# 0h ~exectable Program module
+>0x10 ulelong&0x00038000 =0x00000000 (program)
+#!:ext exe
+# OSF_IS_DLL=8000h ~Library module (DLL)
+>0x10 ulelong&0x00038000 >0x00000000
+# OSF_PHYS_DEVICE=00020000h ~device driver
+>>0x10 ulelong&0x00020000 >0 (device driver)
+!:ext sys
+# if not device driver it is library (DLL)
+>>0x10 ulelong&0x00020000 =0 (library)
+!:ext dll
+# bits 8-10; OSF_PM_APP=300h in flags ~Uses PM windowing API; either it is GUI or console
+>0x10 ulelong&0x00000300 =0x00000300 (GUI)
+>0x10 ulelong&0x00000300 !0x00000300 (console)
+# CPU type
+>0x08 uleshort 1 i80286
+# all inspected examples
+>0x08 uleshort 2 i80386
+>0x08 uleshort 3 i80486
+>0x08 uleshort 4 i80586
+# 21h Intel "N11" or compatible
+# 40h MIPS Mark I ( R2000, R3000) or compatible
+# 41h MIPS Mark II ( R6000 ) or compatible
+# 42h MIPS Mark III ( R4000 ) or compatible
+
# added by Joerg Jenderek of https://www.freedos.org/software/?prog=kc
# and https://www.freedos.org/software/?prog=kpdos
# for FreeDOS files like KEYBOARD.SYS, KEYBRD2.SYS, KEYBRD3.SYS, *.KBD
0 string/b KCF FreeDOS KEYBoard Layout collection
# only version=0x100 found
->3 uleshort x \b, version 0x%x
+>3 uleshort x \b, version %#x
# length of string containing author,info and special characters
>6 ubyte >0
#>>6 pstring x \b, name=%s
@@ -378,42 +461,54 @@
# for FreeDOS *.KL files
0 string/b KLF FreeDOS KEYBoard Layout file
# only version=0x100 or 0x101 found
->3 uleshort x \b, version 0x%x
+>3 uleshort x \b, version %#x
# stringlength
>5 ubyte >0
>>8 string x \b, name=%-.2s
0 string \xffKEYB\ \ \ \0\0\0\0
>12 string \0\0\0\0`\004\360 MS-DOS KEYBoard Layout file
-# DOS device driver updated by Joerg Jenderek at May 2011,Mar 2017
+# DOS device driver updated by Joerg Jenderek at May 2011,Mar 2017,Aug 2020
+# URL: http://fileformats.archiveteam.org/wiki/DOS_device_driver
+# Reference: http://www.delorie.com/djgpp/doc/rbinter/it/46/16.html
# https://amaus.net/static/S100/IBM/software/DOS/DOS%20techref/CHAPTER.009
0 ulequad&0x07a0ffffffff 0xffffffff
->0 use msdos-driver
+# skip OS/2 INI ./os2
+>4 ubelong !0x14000000
+>>0 use msdos-driver
0 name msdos-driver DOS executable (
#!:mime application/octet-stream
!:mime application/x-dosdriver
# also found FreeDOS print driver SPOOL.DEV and disc compression driver STACLOAD.BIN
-!:ext sys/dev/bin
->40 search/7 UPX! \bUPX compressed
+# and IBM Token-Ring adapter IBMTOK.DOS. Why and when DOS instead SYS is used?
+# PROTMAN.DOS ELNKPL.DOS
+!:ext sys/dev/bin/dos
+# 1 space char after "UPX compressed" to get phrase like "UPX compressed character device"
+>40 search/7 UPX! \bUPX compressed
# DOS device driver attributes
>4 uleshort&0x8000 0x0000 \bblock device driver
# character device
>4 uleshort&0x8000 0x8000 \b
->>4 uleshort&0x0008 0x0008 \bclock
+# 1 space char after "clock" to get phrase like "clock character device driver CLOCK$"
+>>4 uleshort&0x0008 0x0008 \bclock
# fast video output by int 29h
->>4 uleshort&0x0010 0x0010 \bfast
+# 1 space char after "fast" to get phrase like "fast standard input/output character device driver"
+>>4 uleshort&0x0010 0x0010 \bfast
# standard input/output device
->>4 uleshort&0x0003 >0 \bstandard
+# 1 space char after "standard" to get phrase like "standard input/output character device driver"
+>>4 uleshort&0x0003 >0 \bstandard
>>>4 uleshort&0x0001 0x0001 \binput
>>>4 uleshort&0x0003 0x0003 \b/
->>>4 uleshort&0x0002 0x0002 \boutput
+# 1 space char after "output" to get phrase like "input/output character device driver"
+>>>4 uleshort&0x0002 0x0002 \boutput
>>4 uleshort&0x8000 0x8000 \bcharacter device driver
>0 ubyte x
# upx compressed device driver has garbage instead of real in name field of header
>>40 search/7 UPX!
>>40 default x
# leading/trailing nulls, zeros or non ASCII characters in 8-byte name field at offset 10 are skipped
->>>12 ubyte >0x2E \b
+# 1 space char before device driver name to get phrase like "device driver PROTMAN$"
+>>>12 ubyte >0x2E \b
>>>>10 ubyte >0x20
>>>>>10 ubyte !0x2E
>>>>>>10 ubyte !0x2A \b%c
@@ -456,6 +551,7 @@
>4 uleshort&0x8000 0x0000
>>4 uleshort&0x4842 >0 \bsupport
>0 ubyte x \b)
+>0 ulelong !0xffffffff with pointer %#x
# DOS driver cmd640x.sys has 0x12 instead of 0xffffffff for pointer field to next device header
0 ulequad 0x0513c00000000012
>0 use msdos-driver
@@ -464,6 +560,7 @@
>0 use msdos-driver
0 ulequad 0x007f00000000ffff
>0 use msdos-driver
+# https://www.uwe-sieber.de/files/cfg_echo.zip
0 ulequad 0x001600000000ffff
>0 use msdos-driver
# DOS drivers LS120.SYS, MKELS120.SYS use reserved bits of attribute field
@@ -471,6 +568,12 @@
>0 use msdos-driver
0 ulequad 0x07bd08c2ffffffff
>0 use msdos-driver
+# 3Com EtherLink 3C501 CID\SERVER\IBMLS\IBM500D1\DLSNETDR.ZIP\ELNK.DOS
+0 ulequad 0x027ac0c0ffffffff
+>0 use msdos-driver
+# IBM Streamer CID\SERVER\IBMLS\IBM500D1\DLSNETDR.ZIP\IBMMPC.DOS
+0 ulequad 0x00228880ffffffff
+>0 use msdos-driver
# updated by Joerg Jenderek
# GRR: line below too general as it catches also
@@ -558,35 +661,48 @@
# syslinux version (4.x)
# "COM executable (COM32R)" or "Syslinux COM32 module" by TrID
>>>1 lelong 0x21CD4CFe \b, relocatable)
-# remaining are DOS COM executables starting with assembler instruction MOV
-# like FreeDOS BANNER*.COM FINDDISK.COM GIF2RAW.COM WINCHK.COM
-# MS-DOS SYS.COM RESTART.COM
-# SYSLINUX.COM (version 1.40 - 2.13)
-# GFXBOOT.COM (version 3.75)
-# COPYBS.COM POWEROFF.COM INT18.COM
+# Hajin Jang <hajin_jang@worksmobile.com>:
+# Disable simplest COM signature to prevent false positive on some EUC-KR text files.
+## remaining are DOS COM executables starting with assembler instruction MOV
+## like FreeDOS BANNER*.COM FINDDISK.COM GIF2RAW.COM WINCHK.COM
+## MS-DOS SYS.COM RESTART.COM
+## SYSLINUX.COM (version 1.40 - 2.13)
+## GFXBOOT.COM (version 3.75)
+## COPYBS.COM POWEROFF.COM INT18.COM
>>1 default x COM executable for DOS
!:mime application/x-dosexec
-#!:mime application/x-ms-dos-executable
-#!:mime application/x-msdos-program
+##!:mime application/x-ms-dos-executable
+##!:mime application/x-msdos-program
!:ext com
+# URL: https://en.wikipedia.org/wiki/UPX
+# Reference: https://github.com/upx/upx/archive/v3.96.zip/upx-3.96/
+# src/stub/src/i086-dos16.com.S
+# Update: Joerg Jenderek
+# assembler instructions: cmp sp, offset sp_limit
0 string/b \x81\xfc
+#>2 uleshort x \b, sp_limit=%#x
+# assembler instructions: jump above +2; int 0x20; mov cx, offset bytes_to_copy
>4 string \x77\x02\xcd\x20\xb9
->>36 string UPX! FREE-DOS executable (COM), UPX compressed
+#>9 uleshort x \b, [bytes_to_copy]=%#x
+# at different offsets assembler instructions: push di; jump decomp_start_n2b
+>0x1e search/3 \x57\xe9
+#>>&0 uleshort x \b, decomp_start_n2b=%#x
+# src/stub/src/include/header.S; UPX_MAGIC_LE32
+>>&2 string UPX! FREE-DOS executable (COM), UPX
!:mime application/x-dosexec
+# UPX compressed *.CPI; See ./fonts
+>>>&21 string =FONT compressed DOS code page font
+!:ext cpx
+>>>&21 string !FONT compressed
!:ext com
+# compressed size?
+#>>>&14 uleshort+152 x \b, %u bytes
+# uncompressed len
+>>>&12 uleshort x \b, uncompressed %u bytes
252 string Must\ have\ DOS\ version DR-DOS executable (COM)
!:mime application/x-dosexec
!:ext com
-# added by Joerg Jenderek at Oct 2008
-# GRR search is not working
-#34 search/2 UPX! FREE-DOS executable (COM), UPX compressed
-34 string UPX! FREE-DOS executable (COM), UPX compressed
-!:mime application/x-dosexec
-!:ext com
-35 string UPX! FREE-DOS executable (COM), UPX compressed
-!:mime application/x-dosexec
-!:ext com
# GRR search is not working
#2 search/28 \xcd\x21 COM executable for MS-DOS
#WHICHFAT.cOM
@@ -616,7 +732,11 @@
!:mime application/x-dosexec
!:ext com
#HELP.COm EDIT.coM
-18 string \xcd\x21 COM executable for MS-DOS
+18 string \xcd\x21
+# not printable before it?
+>17 byte >32
+>>17 byte <126
+>>17 default x COM executable for MS-DOS
!:mime application/x-dosexec
!:ext com
#NWRPLTRM.COm
@@ -687,7 +807,7 @@
# reserved; must be zero
#>>6 ulelong !0 \b, reserved %u
# block pointer to the block containing optional file manager information
-#>>0x1C uleshort x \b, at 0x%x info block
+#>>0x1C uleshort x \b, at %#x info block
# jump to File manager information block
>>(0x1C.s*128) uleshort x
# test for valid information start; maybe also 0012h
@@ -717,7 +837,7 @@
# number of blocks used in the file; seems to be 0 for Word 4.0 and Write 3.0
>>0x6A uleshort >0 \b, %u blocks
# bit field for corrected text areas
-#>>0x6C uleshort x \b, 0x%x bit field
+#>>0x6C uleshort x \b, %#x bit field
# text of document; some times start with 4 non printable characters like CR LF
>>128 ubyte x \b,
>>>128 ubyte >0x1F
@@ -821,7 +941,7 @@
>>>>6 uleshort !0x0004 formatting data
!:ext fXX
# main revision number
->>>>4 uleshort x \b, revision 0x%x
+>>>>4 uleshort x \b, revision %#x
>>>6 uleshort =0x0004 \b, cell range
# active cellcoord range (start row, page,column ; end row, page, column)
# start values normally 0~1st sheet A1
@@ -835,9 +955,9 @@
>>>>12 uleshort x \b%d,
>>>>15 ubyte x \b%d
# Lotus Multi Byte Character Set (1~cp850,2~cp851,...,16~japan,...,31~??)
->>>>20 ubyte >1 \b, character set 0x%x
+>>>>20 ubyte >1 \b, character set %#x
# flags
->>>>21 ubyte x \b, flags 0x%x
+>>>>21 ubyte x \b, flags %#x
>>>6 uleshort !0x0004
# record type (FONTNAME=00AEh)
>>>>30 search/29 \0\xAE
@@ -855,7 +975,7 @@
!:strength -1
# skip Windows cursors with image height <256 and keep Lotus with low opcode 0001-0083h
>7 ubyte 0
-# skip Windows cursors with image width 256 and keep Lotus with positiv opcode
+# skip Windows cursors with image width 256 and keep Lotus with positive opcode
>>6 ubyte >0 Lotus
# !:mime application/x-123
!:mime application/vnd.lotus-1-2-3
@@ -911,10 +1031,10 @@
# (version 5.26) labeled the entry as "Lotus 1-2-3"
>>>4 default x unknown worksheet or configuration
!:ext cnf
->>>>4 uleshort x \b, revision 0x%x
+>>>>4 uleshort x \b, revision %#x
# 2nd record for most worksheets describes cells range
>>>6 use lotus-cells
-# 3nd record for most japan worksheets describes cells range
+# 3rd record for most japan worksheets describes cells range
>>>(8.s+10) use lotus-cells
# check and then display Lotus worksheet cells range
0 name lotus-cells
@@ -1037,7 +1157,7 @@
#>3 ubyte x \b, reserved %x
#>8 ulelong x \b, image size %d
# offset of PNG or DIB image
-#>12 ulelong x \b, offset 0x%x
+#>12 ulelong x \b, offset %#x
# PNG header (\x89PNG)
>(12.l) ubelong =0x89504e47
# 1 space char after "with" to get phrase "with PNG image" by magic in ./images
@@ -1166,6 +1286,9 @@
0 string NG\0\001
# only value 0x100 found at offset 2
>2 ulelong 0x00000100 Norton Guide
+!:mime application/x-norton-guide
+# often like NORTON.NG but some times like NC.HLP
+!:ext ng/hlp
# Title[40]
>>8 string >\0 "%-.40s"
#>>6 uleshort x \b, MenuCount=%u
@@ -1173,6 +1296,66 @@
>>48 string >\0 \b, %-.66s
>>114 string >\0 %-.66s
+# URL: https://en.wikipedia.org/wiki/Norton_Commander
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/m/msg-nc-eng.trid.xml
+# From: Joerg Jenderek
+# Note: Message file is used by executable with same main name.
+# Only tested with version 5.50 (english) and 2.01 (Windows)
+0 string Abort
+# \0 or i
+#>5 ubyte x %x
+# skip ASCII Abort text by looking for error message like in NCVIEW.MSG
+>6 search/7089 Non-DOS\ disk Norton Commander module message
+!:mime application/x-norton-msg
+!:ext msg
+
+# URL: http://www.antonis.de/dos/dos-tuts/mpdostip/html/nwdostip.htm
+# Reference: https://mark0.net/download/triddefs_xml.7z/defs/m/msg-netware-dos.trid.xml
+# From: Joerg Jenderek
+0 string DOS\ Client\ Message\ File: Novell DOS client message
+#!:mime application/octet-stream
+#!:mime application/x-novell-msg
+!:ext msg
+# look for second letter instead space character
+>26 ubyte >0x20
+# digit 1 or often main or program name like: IPXODI.COM TASKID pnwtrap DOSRqstr
+>>25 ubyte !0x20 %c
+>>>26 ubyte !0x20 \b%c
+>>>>27 ubyte !0x20 \b%c
+>>>>>28 ubyte !0x20 \b%c
+>>>>>>29 ubyte !0x20 \b%c
+>>>>>>>30 ubyte !0x20 \b%c
+>>>>>>>>31 ubyte !0x20 \b%c
+>>>>>>>>>32 ubyte !0x20 \b%c
+>>>>>>>>>>33 ubyte !0x20 \b%c
+>>>>>>>>>>>34 ubyte !0x20 \b%c
+>>>>>>>>>>>>35 ubyte !0x20 \b%c
+>>>>>>>>>>>>>36 ubyte !0x20 \b%c
+# followed by string like: 0 v.10 V1.20
+#
+# followed by ,\040Tran
+>28 search/14 ,\040Tran
+# probably translated version string like: 0 v1.00
+>>&0 string x \b, tran version %s
+# followed by Ctrl-J Ctrl-Z
+>>>&0 ubyte !0xa \b, terminated by %#2.2x
+>>>>&0 ubyte x \b%2.2x
+# Ctrl-Z
+>0x65 ubyte !0x1A \b, at 0x65 %#x
+# one
+>0x66 ubyte !0x01 \b, at 0x66 %#x
+# URL: https://en.wikipedia.org/wiki/NetWare
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/d/dat-novell-msg.trid.xml
+# ftp://ftp.iitb.ac.in/LDP/en/NLM-HOWTO/NLM-HOWTO-single.html
+# From: Joerg Jenderek
+0 string Novell\ Message\ Librarian\ Data\ File Novell message librarian data
+#>35 string Version\ 1.00
+#>49 string COPYRIGHT\ (c)\ 1985\ by\ Novell,\ Inc.
+#>83 string \ \ All\ Rights\ Reserved
+#!:mime application/octet-stream
+#!:mime application/x-novell-msg
+!:ext msg
+#!:ext msg/dat
# 4DOS help (.HLP) files added by Joerg Jenderek from source TPHELP.PAS
# of https://www.4dos.info/
# pointer,HelpID[8]=4DHnnnmm
@@ -1234,7 +1417,7 @@
# member Macromedia Flash data *.swf implies IncrediMail skin like in im2.ims
>>0x2c search/211/c .swf\0 skin
!:ext ims
-# member anim.im3 implies IncrediMail animation like in letter_fold.ima
+# member anim.im3 implies IncrediMail animation like in letter_fold.ima
>>0x2c search/92/c anim.im3\0 animation
!:ext ima
# other IncrediMail cab archive
@@ -1270,7 +1453,7 @@
!:mime application/vnd.ms-cab-compressed
!:ext msu
>>>&-1 default x
-# look at point charcter of 1st archive member name for file name extension
+# look at point character of 1st archive member name for file name extension
>>>>&-1 search/255 .
# http://www.pptfaq.com/FAQ00164_What_is_a_PPZ_file-.htm
# PPZ were created using Pack & Go feature of PowerPoint versions 97 - 2002
@@ -1329,7 +1512,7 @@
#>4 belong !0 \b, reserved1 %x
#>12 belong !0 \b, reserved2 %x
# offset of the first CFFILE entry coffFiles: minimal 2Ch
->16 ulelong x \b, at 0x%x
+>16 ulelong x \b, at %#x
>(16.l) use cab-file
# at least also 2nd member
>28 uleshort >1
@@ -1339,12 +1522,12 @@
>>>>&0 use cab-file
#>20 belong !0 \b, reserved %x
# Cabinet file format version. Currently, versionMajor = 1 and versionMinor = 3
->24 ubeshort !0x0301 \b version 0x%x
+>24 ubeshort !0x0301 \b version %#x
# number of CFFOLDER entries
>26 uleshort >1 \b, %u cffolders
# cabinet file option indicators 1~PREVIOUS, 2~NEXT, 4~reserved fields
# only found for flags 0 1 2 3 4 not 7
->30 uleshort >0 \b, flags 0x%x
+>30 uleshort >0 \b, flags %#x
# Cabinet files have a 16-bit cabinet setID field that is designed for application use.
# default is zero, however, the -i option of cabarc can be used to set this field
>32 uleshort >0 \b, ID %u
@@ -1395,30 +1578,30 @@
# display folder structure CFFOLDER information like compression of cabinet
0 name cab-folder
# offset of the CFDATA block in this folder
-#>0 ulelong x \b, coffCabStart 0x%x
+#>0 ulelong x \b, coffCabStart %#x
# number of CFDATA blocks in folder
>4 uleshort x \b, %u datablock
# plural s
>4 uleshort >1 \bs
# compression typeCompress: 0~None 1~MSZIP 0x1503~LZX:21 0x1003~LZX:16 0x0f03~LZX:15
->6 uleshort x \b, 0x%x compression
+>6 uleshort x \b, %#x compression
# optional per-folder reserved area
-#>8 ubequad x \b, abReserve 0x%llx
+#>8 ubequad x \b, abReserve %#llx
# display member structure CFFILE information like member name of cabinet
0 name cab-file
-# cbFile is uncompressed size of file in bytes
+# cbFile is uncompressed size of file in bytes
#>0 ulelong x \b, cbFile %u
# uoffFolderStart is uncompressed offset of file in folder
-#>4 ulelong >0 \b, uoffFolderStart 0x%x
+#>4 ulelong >0 \b, uoffFolderStart %#x
# iFolder is index into the CFFOLDER area. 0 indicates first folder in cabinet
# define ifoldCONTINUED_FROM_PREV (0xFFFD)
# define ifoldCONTINUED_TO_NEXT (0xFFFE)
# define ifoldCONTINUED_PREV_AND_NEXT (0xFFFF)
->8 uleshort >0 \b, iFolder 0x%x
+>8 uleshort >0 \b, iFolder %#x
# date stamp for file
-#>10 uleshort x \b, date 0x%x
+#>10 uleshort x \b, date %#x
# time stamp for file
-#>12 uleshort x \b, time 0x%x
+#>12 uleshort x \b, time %#x
# attribs is attribute flags for file
# define _A_RDONLY (0x01) file is read-only
# define _A_HIDDEN (0x02) file is hidden
@@ -1428,7 +1611,7 @@
# define _A_EXEC (0x40) run after extraction
# define _A_NAME_IS_UTF (0x80) szName[] contains UTF
# define UNKNOWN (0x0100) undocumented or accident
-#>14 uleshort x \b, attribs 0x%x
+#>14 uleshort x \b, attribs %#x
>14 uleshort >0 +
>>14 uleshort &0x0001 \bR
>>14 uleshort &0x0002 \bH
@@ -1471,7 +1654,7 @@
# for further information.
0 ulelong 1
>40 string \ EMF Windows Enhanced Metafile (EMF) image data
->>44 ulelong x version 0x%x
+>>44 ulelong x version %#x
0 string/b \224\246\056 Microsoft Word Document
@@ -1516,7 +1699,8 @@
0 string Jetsam0 Mallard BASIC Jetsam index data
# DOS backup 2.0 to 3.2
-
+# URL: http://fileformats.archiveteam.org/wiki/BACKUP_(MS-DOS)
+# Reference: http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/dos/restore/brtecdoc.htm
# backupid.@@@
# plausibility check for date
@@ -1526,6 +1710,7 @@
# actually 121 nul bytes
>>>0x7 string \0\0\0\0\0\0\0\0
>>>>0x1 ubyte x DOS 2.0 backup id file, sequence %d
+#!:mime application/octet-stream
!:ext @@@
>>>>0x0 ubyte 0xff \b, last disk
@@ -1548,7 +1733,7 @@
# but sometimes garbage according to Ralf Quint. So can not be used as test
#>0x54 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
# first char of full file name is DOS (5Ch) or UNIX (2Fh) path separator
-# only DOS variant found. UNIX variant according to V32SLASH.TXT in archive PD0315.EXE
+# only DOS variant found. UNIX variant according to V32SLASH.TXT in archive PD0315.EXE
>>>>>5 ubyte&0x8C 0x0C
# ./msdos (version 5.30) labeled the entry as
# "DOS 2.0 backed up file %s, split file, sequence %d" or
@@ -1559,7 +1744,9 @@
>>>>>>>1 uleshort x sequence %d of
# full file name with path but without drive letter and colon stored from 0x05 til 0x52
>>>>>>0x5 string x file %s
+#!:mime application/octet-stream
# backup name is original filename
+#!:ext doc/exe/rar/zip
#!:ext *
# magic/Magdir/msdos, 1169: Warning: EXTENSION type ` *' has bad char '*'
# file: line 1169: Bad magic entry ' *'
diff --git a/magic/Magdir/msooxml b/magic/Magdir/msooxml
index 620d5e132f04..06f244fa132c 100644
--- a/magic/Magdir/msooxml
+++ b/magic/Magdir/msooxml
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: msooxml,v 1.13 2019/11/27 13:12:55 christos Exp $
+# $File: msooxml,v 1.16 2021/08/16 10:06:55 christos Exp $
# msooxml: file(1) magic for Microsoft Office XML
# From: Ralf Brown <ralf.brown@gmail.com>
@@ -19,29 +19,32 @@
!:mime application/vnd.openxmlformats-officedocument.presentationml.presentation
>0 string xl/ Microsoft Excel 2007+
!:mime application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
-0 string visio/ Microsoft Visio 2013+
+>0 string visio/ Microsoft Visio 2013+
!:mime application/vnd.ms-visio.drawing.main+xml
+>0 string AppManifest.xaml Microsoft Silverlight Application
+!:mime application/x-silverlight-app
# start by checking for ZIP local file header signature
0 string PK\003\004
!:strength +10
# make sure the first file is correct
>0x1E use msooxml
->0x1E regex \\[Content_Types\\]\\.xml|_rels/\\.rels|docProps
+>0x1E default x
+>>0x1E regex \\[Content_Types\\]\\.xml|_rels/\\.rels|docProps
# 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/6000 PK\003\004
+>>>(18.l+49) search/6000 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/6000 PK\003\004
+>>>>&26 search/6000 PK\003\004
# and check the subdirectory name to determine which type of OOXML
# file we have. Correct the mimetype with the registered ones:
# https://technet.microsoft.com/en-us/library/cc179224.aspx
->>>>&26 use msooxml
->>>>&26 default x
+>>>>>&26 use msooxml
+>>>>>&26 default x
# OpenOffice/Libreoffice orders ZIP entry differently, so check the 4th file
->>>>>&26 search/6000 PK\003\004
->>>>>>&26 use msooxml
->>>>>>&26 default x Microsoft OOXML
+>>>>>>&26 search/6000 PK\003\004
+>>>>>>>&26 use msooxml
+>>>>>>>&26 default x Microsoft OOXML
>>>>>&26 default x Microsoft OOXML
diff --git a/magic/Magdir/msx b/magic/Magdir/msx
index 69df6416fe7c..60e16569e24f 100644
--- a/magic/Magdir/msx
+++ b/magic/Magdir/msx
@@ -138,8 +138,8 @@
>>>>>>>>>>>>>>>0x002D ubyte 2 \b, version=MSX2+
>>>>>>>>>>>>>>>0x002D ubyte 3 \b, version=MSX Turbo-R
>>>>>>>>>>>>>>>0x002D ubyte >3 \b, version=Unknown MSX %d version
->>>>>>>>>>>>>>>0x0006 ubyte x \b, VDP.DR=0x%2x
->>>>>>>>>>>>>>>0x0007 ubyte x \b, VDP.DW=0x%2x
+>>>>>>>>>>>>>>>0x0006 ubyte x \b, VDP.DR=%#2x
+>>>>>>>>>>>>>>>0x0007 ubyte x \b, VDP.DW=%#2x
>>>>>>>>>>>>>>>0x002B ubyte&0xF 0 \b, charset=Japanese
>>>>>>>>>>>>>>>0x002B ubyte&0xF 1 \b, charset=International
>>>>>>>>>>>>>>>0x002B ubyte&0xF 2 \b, charset=Korean
@@ -188,32 +188,32 @@
# MSX extension ROMs
0 string/b AB
>2 uleshort 0x0010 MSX ROM
->>2 uleshort x \b, init=0x%4x
->>4 uleshort >0 \b, stahdl=0x%4x
->>6 uleshort >0 \b, devhdl=0x%4x
->>8 uleshort >0 \b, bas=0x%4x
+>>2 uleshort x \b, init=%#4x
+>>4 uleshort >0 \b, stahdl=%#4x
+>>6 uleshort >0 \b, devhdl=%#4x
+>>8 uleshort >0 \b, bas=%#4x
>2 uleshort 0x4010 MSX ROM
->>2 uleshort x \b, init=0x%04x
->>4 uleshort >0 \b, stahdl=0x%04x
->>6 uleshort >0 \b, devhdl=0x%04x
->>8 uleshort >0 \b, bas=0x%04x
+>>2 uleshort x \b, init=%#04x
+>>4 uleshort >0 \b, stahdl=%#04x
+>>6 uleshort >0 \b, devhdl=%#04x
+>>8 uleshort >0 \b, bas=%#04x
>2 uleshort 0x8010 MSX ROM
->>2 uleshort x \b, init=0x%04x
->>4 uleshort >0 \b, stahdl=0x%04x
->>6 uleshort >0 \b, devhdl=0x%04x
->>8 uleshort >0 \b, bas=0x%04x
+>>2 uleshort x \b, init=%#04x
+>>4 uleshort >0 \b, stahdl=%#04x
+>>6 uleshort >0 \b, devhdl=%#04x
+>>8 uleshort >0 \b, bas=%#04x
0 string/b AB\0\0
>6 uleshort 0
>>4 uleshort >0x400F MSX-BASIC extension ROM
->>>4 uleshort >0 \b, stahdl=0x%04x
->>>6 uleshort >0 \b, devhdl=0x%04x
+>>>4 uleshort >0 \b, stahdl=%#04x
+>>>6 uleshort >0 \b, devhdl=%#04x
>>>0x1C string OPLL \b, MSX-Music
>>>>0x18 string PAC2 \b (external)
>>>>0x18 string APRL \b (internal)
0 string/b AB\0\0\0\0
>6 uleshort >0x400F MSX device BIOS
->>6 uleshort >0 \b, devhdl=0x%04x
+>>6 uleshort >0 \b, devhdl=%#04x
0 string/b AB
@@ -233,38 +233,38 @@
>>>>>>0x12 ubyte x \b%d
>>>>>>0x13 ubyte/16 x \b%d
>>>>>>0x13 ubyte&0xF x \b%d
->>>>>2 uleshort x \b, init=0x%04x
->>>>>4 uleshort >0 \b, stahdl=0x%04x
->>>>>6 uleshort >0 \b, devhdl=0x%04x
->>>>>8 uleshort >0 \b, bas=0x%04x
+>>>>>2 uleshort x \b, init=%#04x
+>>>>>4 uleshort >0 \b, stahdl=%#04x
+>>>>>6 uleshort >0 \b, devhdl=%#04x
+>>>>>8 uleshort >0 \b, bas=%#04x
>>>2 uleshort 0
>>>>4 uleshort 0
>>>>>6 uleshort 0
->>>>>>8 uleshort >0 MSX BASIC program in ROM, bas=0x%04x
+>>>>>>8 uleshort >0 MSX BASIC program in ROM, bas=%#04x
0x4000 string/b AB
>0x4002 uleshort >0x400F
>>0x400A string \0\0\0\0\0\0 MSX ROM with nonstandard page order
->>>0x4002 uleshort x \b, init=0x%04x
->>>0x4004 uleshort >0 \b, stahdl=0x%04x
->>>0x4006 uleshort >0 \b, devhdl=0x%04x
->>>0x4008 uleshort >0 \b, bas=0x%04x
+>>>0x4002 uleshort x \b, init=%#04x
+>>>0x4004 uleshort >0 \b, stahdl=%#04x
+>>>0x4006 uleshort >0 \b, devhdl=%#04x
+>>>0x4008 uleshort >0 \b, bas=%#04x
0x8000 string/b AB
>0x8002 uleshort >0x400F
>>0x800A string \0\0\0\0\0\0 MSX ROM with nonstandard page order
->>>0x8002 uleshort x \b, init=0x%04x
->>>0x8004 uleshort >0 \b, stahdl=0x%04x
->>>0x8006 uleshort >0 \b, devhdl=0x%04x
->>>0x8008 uleshort >0 \b, bas=0x%04x
+>>>0x8002 uleshort x \b, init=%#04x
+>>>0x8004 uleshort >0 \b, stahdl=%#04x
+>>>0x8006 uleshort >0 \b, devhdl=%#04x
+>>>0x8008 uleshort >0 \b, bas=%#04x
0x3C000 string/b AB
>0x3C008 string \0\0\0\0\0\0\0\0 MSX MegaROM with nonstandard page order
->>0x3C002 uleshort x \b, init=0x%04x
->>0x3C004 uleshort >0 \b, stahdl=0x%04x
->>0x3C006 uleshort >0 \b, devhdl=0x%04x
->>0x3C008 uleshort >0 \b, bas=0x%04x
+>>0x3C002 uleshort x \b, init=%#04x
+>>0x3C004 uleshort >0 \b, stahdl=%#04x
+>>0x3C006 uleshort >0 \b, devhdl=%#04x
+>>0x3C008 uleshort >0 \b, bas=%#04x
# MSX BIN file
#0 byte 0xFE
diff --git a/magic/Magdir/neko b/magic/Magdir/neko
deleted file mode 100644
index 6bedc22a5a38..000000000000
--- a/magic/Magdir/neko
+++ /dev/null
@@ -1,12 +0,0 @@
-
-#------------------------------------------------------------
-# $File: neko,v 1.2 2019/04/19 00:42:27 christos Exp $
-
-# From: Mikhail Gusarov <dottedmag@dottedmag.net>
-# NekoVM (https://nekovm.org/) bytecode
-0 string NEKO NekoVM bytecode
->4 lelong x (%d global symbols,
->8 lelong x %d global fields,
->12 lelong x %d bytecode ops)
-!:mime application/x-nekovm-bytecode
-
diff --git a/magic/Magdir/netware b/magic/Magdir/netware
index c3f57e83819a..089a243644df 100644
--- a/magic/Magdir/netware
+++ b/magic/Magdir/netware
@@ -1,7 +1,11 @@
#------------------------------------------------------------------------------
-# $File: netware,v 1.4 2009/09/19 16:28:11 christos Exp $
+# $File: netware,v 1.5 2020/09/04 16:30:51 christos Exp $
# netware: file(1) magic for NetWare Loadable Modules (NLMs)
# From: Mads Martin Joergensen <mmj@suse.de>
+# URL: https://en.wikipedia.org/wiki/NetWare_Loadable_Module
0 string NetWare\ Loadable\ Module NetWare Loadable Module
+#!:mime application/octet-stream
+!:ext nlm
+
diff --git a/magic/Magdir/nim-lang b/magic/Magdir/nim-lang
new file mode 100644
index 000000000000..bc2cf987c7d3
--- /dev/null
+++ b/magic/Magdir/nim-lang
@@ -0,0 +1,29 @@
+
+#------------------------------------------------------------------------------
+# $File: nim-lang,v 1.3 2021/07/06 12:34:06 christos Exp $
+# nim-lang: file(1) magic for nim
+# URL: https://nim-lang.org/
+
+0 search/8192 import
+>&0 search/64 os
+>>&0 use nim1
+>&0 default x
+>>&0 search/64 osproc
+>>>&0 use nim1
+>>&0 default x
+>>>&0 search/64 strutils
+>>>>&0 use nim1
+
+0 name nim1
+>&0 search/8192 proc
+>>&0 use nim2
+>&0 default x
+>>&0 search/8192 template
+>>>&0 use nim2
+>>&0 default x
+>>>&0 search/8192 let
+>>>>&0 use nim2
+
+0 name nim2
+>&0 search/8192 when Nim source code
+!:ext nim
diff --git a/magic/Magdir/ole2compounddocs b/magic/Magdir/ole2compounddocs
index 7b16a5fa8aea..a5e60a821b5e 100644
--- a/magic/Magdir/ole2compounddocs
+++ b/magic/Magdir/ole2compounddocs
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: ole2compounddocs,v 1.8 2020/03/28 23:10:30 christos Exp $
+# $File: ole2compounddocs,v 1.12 2021/09/04 16:00:38 christos Exp $
# Microsoft OLE 2 Compound Documents : file(1) magic for Microsoft Structured
# storage (https://en.wikipedia.org/wiki/Compound_File_Binary_Format)
# Additional tests for OLE 2 Compound Documents should be under this recipe.
@@ -10,7 +10,7 @@
# https://digital-preservation.github.io/droid/
# skip droid skeleton like fmt-39-signature-id-128.doc by valid version
>0x1A ushort !0xABAB OLE 2 Compound Document
-#>0x1C uleshort x \b, endnian 0x%4.4x
+#>0x1C uleshort x \b, endnian %#4.4x
# big endian not tested
>>0x1C ubeshort =0xfffe \b, big-endian
>>>546 string jbjb : Microsoft Word Document
@@ -26,25 +26,25 @@
# Minor Version 32h=50 3Bh=59 3Eh=62
>>>0x18 uleshort x \b.%u
# SecID of first sector of the directory stream is often 1 but high like 3144h
->>>48 ulelong x \b, SecID 0x%x
+>>>48 ulelong x \b, SecID %#x
# Sector Shift Exponent in short-stream container stream: 6~64 bytes
>>>32 uleshort !6 \b, exponent of short stream %u
# total number of sectors used for the FAT
>>>44 ulelong >1 \b, %u FAT sectors
# SecID of first sector of the short-sector allocation table (Mini FAT)
# or -2 (End Of ChainSecID) if not extant
->>>60 ulelong !0xffFFffFE \b, Mini FAT start sector 0x%x
+>>>60 ulelong !0xffFFffFE \b, Mini FAT start sector %#x
# total number of sectors used for the short-sector allocation table
>>>64 ulelong !1 \b, %u Mini FAT sector
# plural s
>>>>64 ulelong >1 \bs
# SecID of first sector of the master sector allocation table (DIFAT)
# or -2 (End Of Chain SecID) if no additional sectors used
->>>68 ulelong !0xffFFffFE \b, DIFAT start sector 0x%x
+>>>68 ulelong !0xffFFffFE \b, DIFAT start sector %#x
# total number of sectors used for the master sector allocation table (DIFAT)
>>>72 ulelong >0 \b, %u DIFAT sectors
# First part of the master sector allocation table (DIFAT) containing 109 SecIDs
-#>>>76 ubequad x \b, DIFAT=0x%16.16llx
+#>>>76 ubequad x \b, DIFAT=%#16.16llx
#>>>84 ubequad x \b%16.16llx...
# pointer to root entry only works with standard configuration for SecID ~< 800h
# Red-Carpet-presentation-1.0-1.sdd sg10.sdv 2000_GA_Annual_Review_Data.xls
@@ -87,8 +87,8 @@
# https://wikileaks.org/ciav7p1/cms/page_13762814.html
# https://m.blog.naver.com/superman4u/40047693679
# https://misc.daniel-marschall.de/projects/guid_analysis/guid.txt
-# http://www.windowstricks.in/online-windows-guid-converter
-#>80 ubequad !0 \b, clsid 0x%16.16llx
+# https://toolslick.com/conversion/data/guid
+#>80 ubequad !0 \b, clsid %#16.16llx
#>>88 ubequad x \b%16.16llx
# test for "Root Entry" inside directory by type 5 value
>66 ubyte 5
@@ -210,6 +210,15 @@
>>>>256 lestring16 Thumbnail : Corel PrintHouse image
!:mime application/x-corel-cph
!:ext cph
+# URL: http://fileformats.archiveteam.org/wiki/Corel_Gallery
+# Note: format since Gallery 2; sometimes called Corel Multimedia Manager Album
+# third directory entry name _INFO_
+>>>>256 lestring16 _INFO_ : Corel Gallery
+# second directory entry name _ITEM_ or _DATA_
+# later directory entry names: _ALBUM_ _THUMBNAIL_
+#!:mime application/x-ole-storage
+!:mime application/x-corel-gal
+!:ext gal
#
# URL: https://en.wikipedia.org/wiki/Hangul_(word_processor)
# Note: "HWP Document File" signature found in FileHeader
@@ -231,7 +240,7 @@
>>>>128 lestring16 Current\ User : SoftMaker
# third directory entry name SMNativeObjData
>>>>>256 lestring16 SMNativeObjData
-# 5th directory entry nane PowerPoint
+# 5th directory entry name PowerPoint
>>>>>>512 lestring16 PowerPoint PowerPoint presentation or template
!:mime application/vnd.ms-powerpoint
!:ext ppt/pps/pot
@@ -251,6 +260,12 @@
>>>>>>128 lestring16 Pictures with pictures
# remaining null clsid
>>>>128 default x : UNKNOWN
+# second directory entry name like VisioDocument Control000
+>>>>>128 lestring16 x with names %.20s
+# third directory entry like WordDocument
+>>>>>256 lestring16 x %.20s
+# forth
+>>>>>384 lestring16 x %.20s
!:mime application/x-ole-storage
# look for known clsid GUID
# - Visio documents
@@ -315,7 +330,7 @@
!:mime application/vnd.ms-excel
# https://www.macdisk.com/macsigen.php XLS5 for Excel 5
!:apple ????XLS9
-# 3nd directory entry name
+# 3rd directory entry name
>>>>256 lestring16 _VBA_PROJECT_CUR addin
!:ext xla/
# 4th directory entry name
@@ -365,6 +380,21 @@
!:mime application/vnd.ms-works
!:apple ????AWWP
!:ext wps
+# From: Joerg Jenderek
+# URL: https://en.wikipedia.org/wiki/Microsoft_Works
+# Reference: http://fileformats.archiveteam.org/wiki/Microsoft_Compound_File
+# Note: probably version 6 and 7
+# organize pictures like JPFG images in streams __cf1 with names like
+# 001.JPG, 002.JPG ... in streams __fname
+>>88 ubequad 0xa1c800c04f612452 : Microsoft
+>>>80 ubequad 0xc0c7266eb98cd311 Works portfolio
+# 2nd directory entry name PfOrder, 3rd __LastID and 4th __SizeUsed
+#!:mime application/x-ole-storage
+# https://www.iana.org/assignments/media-types/application/vnd.ms-works
+!:mime application/vnd.ms-works
+# https://extension.nirsoft.net/wsb
+# like: wsbsamp.wsb WORKS2003_CD:\MSWorks\Common\Sammlung.wsb
+!:ext wsb
#??
# URL: http://fileformats.archiveteam.org/wiki/Microsoft_Publisher
>>88 ubequad 0x00c0000000000046 : Microsoft
@@ -395,6 +425,25 @@
!:mime application/vnd.ms-project
!:ext mpp
#
+# URL: http://fileformats.archiveteam.org/wiki/WordPerfect
+# Reference: http://fileformats.archiveteam.org/wiki/Microsoft_Compound_File
+# https://github.com/OneWingedShark/WordPerfect/
+# blob/master/doc/SDK_Help/FileFormats/WPFF_DocumentStructure.htm
+# From: Joerg Jenderek
+# Note: internal version x.2 or 2.2 like in embedded ole6-PerfectOffice_MAIN.wpd
+# 3rd directory entry name PerfectOffice_OBJECT and 2nd PerfectOffice_MAIN,
+# which contains WordPerfect document \xffWPC signature handled by ./wordprocessors
+>>88 ubequad 0x19370000929679cd : WordPerfect 7
+>>>80 ubequad 0xff739851ad2d2002 Document
+!:mime application/vnd.wordperfect
+#!:apple ????WPC?
+# https://fossies.org/linux/wp2latex/test/ole6.wpd
+!:ext wpd
+#>>>>0 search/0xc01/s \xffWPC \b, WPC SIGNATURE
+# inspect embedded WordPerfect document by ./wordprocessors with 1 space at end
+#>>>>>&0 indirect x \b; contains
+# GRR: the above expression does not work correctly
+#
# URL: http://fileformats.archiveteam.org/wiki/SHW_(Corel)
#???
>>88 ubequad 0x99ae04021c007002 : WordPerfect
@@ -514,6 +563,6 @@
# remaining non null clsid
>>88 default x : UNKNOWN
!:mime application/x-ole-storage
->>>80 ubequad !0 \b, clsid 0x%16.16llx
+>>>80 ubequad !0 \b, clsid %#16.16llx
>>>88 ubequad x \b%16.16llx
diff --git a/magic/Magdir/os2 b/magic/Magdir/os2
index ace69cb34b23..02f27fa6b075 100644
--- a/magic/Magdir/os2
+++ b/magic/Magdir/os2
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: os2,v 1.10 2017/03/17 21:35:28 christos Exp $
+# $File: os2,v 1.13 2021/04/26 15:56:00 christos Exp $
# os2: file(1) magic for OS/2 files
#
@@ -25,6 +25,8 @@
#>5 string >\ (Local file) <%s>
# >>>>> OS/2 INF/HLP <<<<< (source: Daniel Dissett ddissett@netcom.com)
+# URL: http://fileformats.archiveteam.org/wiki/INF/HLP_(OS/2)
+# Reference: http://www.edm2.com/0308/inf.html
# Carl Hauser (chauser.parc@xerox.com) and
# Marcus Groeber (marcusg@ph-cip.uni-koeln.de)
# list the following header format in inf02a.doc:
@@ -41,9 +43,142 @@
# int16 unknown2; // unknown purpose
#
0 string HSP\x01\x9b\x00 OS/2 INF
+!:mime application/x-os2-inf
+!:ext inf
>107 string >0 (%s)
0 string HSP\x10\x9b\x00 OS/2 HLP
+!:mime application/x-os2-hlp
+!:ext hlp
>107 string >0 (%s)
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/MSG_(OS/2)
+# Reference: https://github.com/OS2World/UTIL-SYSTEM-MKMSGF/blob/master/mkmsgf.h
+# Note: created by MKMSGF.EXE. Text source can be recreated by E_MSGF
+# example like OS001H.MSG
+0 string \xffMKMSGF\0 OS/2 help message
+!:mime application/x-os2-msg
+!:ext msg
+# identifier[3] like: DOS NET REX SYS ...
+>8 string x '%.3s'
+# msgnumber: number of messages
+>11 uleshort x \b, %u messages
+# firstmsgnumber; number of the first message like: some times 0 often 1 169 1000 3502
+>13 uleshort >1 \b, 1st number %u
+# offset16bit; 1~Index table has 16-bit offsets (files<64k) 0~Index table has 32-bit offsets
+>15 ubyte =0 \b, 32-bit
+#>15 ubyte =1 \b, 16-bit
+# version; file version: 2~new 0~old
+>16 uleshort !2 \b, version %u
+# indextaboffset; offset of index table: 1F~after header 0~no index table for version 0?
+>18 uleshort >0
+>>18 uleshort !0x1f \b, at %#x index
+# 32-bit offset
+>>15 ubyte =0
+# offset with message table
+>>>(18.s) ulelong x \b, at %#x
+# 1st message
+# http://www.os2museum.com/files/docs/os210ptk/os2-1.0-ptk-tools-1988.pdf
+# message type: E~Error H~Help I~Information P~Prompt W~Warning ?
+>>>>(&-4.l) ubyte x %c-type
+>>>>>&0 string x %s
+# 16-bit offset
+>>15 ubyte =1
+# msgnum; message number
+>>>(18.s) uleshort x \b, number %u
+# msgindex; offset of message from begin of file
+>>>(18.s+2) uleshort x at %#x
+# message type E H I P W ?
+>>>>(&-2.s) ubyte x %c-type
+# skip newline carriage return
+>>>>>&0 ubeshort =0x0D0a
+>>>>>>&0 string x %s
+>>>>>&0 ubeshort !0x0D0a
+>>>>>>&-2 string x %s
+# for version 0 index table apparently at offset 1F
+>16 uleshort 0
+>>15 ubyte 1
+# 1st message 16-bit
+>>>0x1F uleshort x \b, at %#x
+# message type: E~Error H~Help I~Information P~Prompt W~Warning ?
+>>>>(0x1F.s) ubyte x %c-type
+>>>>>&0 string x %s
+# 2nd message 16-bit
+>>>0x21 uleshort x \b, at %#x
+>>>>(0x21.s) ubyte x %c-type
+>>>>>&0 string x %s
+# 3rd message 16-bit
+>>>0x23 uleshort x \b, at %#x
+>>>>(0x23.s) ubyte x %c-type
+>>>>>&0 string x %s
+# version 0 32-bit
+>>15 ubyte 0
+# 1st message 32-bit
+>>>0x1f ulelong x \b, at %#x
+>>>>(0x1F.l) ubyte x %c-type
+>>>>>&0 string x %s
+# 2nd message 32-bit
+>>>0x23 ulelong x \b, at %#x
+>>>>(0x23.l) ubyte x %c-type
+>>>>>&0 string x %s
+# 3rd message 32-bit
+>>>0x27 ulelong x \b, AT %#x
+>>>>(0x27.l) ubyte x %c-type
+>>>>>&0 string x %s
+# countryinfo; offset of country info block: 0 for version 0
+>20 uleshort !0 \b, at %#x countryinfo
+# nextcoutryinfo
+>>22 uleshort >0 \b, at %#x next
+# reserved[5]; Must be 0
+>>25 ulelong !0 \b, RESERVED %#x
+>>(20.s) use os2-msg-info
+# display country info block of MKMSGF message file
+0 name os2-msg-info
+# bytesperchar; bytes per char: 1~SBCS 2~DBCS
+>0 ubyte >1 \b, %u bytes/char
+# reserved; Not known
+>1 uleshort !0 \b, reserved %#x
+# langfamilyID; language family ID like: 0~? 1~Arabic ... 7~German ... 9~English ... 34~Slovene
+>3 uleshort >0 \b, language %u
+# langversionID; like: 7_1~German 7_2~Swiss German 12_1~French 12_3~Canadian French
+>>5 uleshort x \b_%u
+# langfamilyID too high. This should not happen
+>3 uleshort >34 (invalid language)
+# codepagesnumber; number of codepages like: 1 2 ... 16
+>7 uleshort x \b, %u code page
+# plural s
+>7 uleshort >1 \bs
+# too many number of codepages. This should not happen
+>7 uleshort >16 (Too many)
+# codepages[16]; codepages list like 437 850 ...
+>7 uleshort <17
+# 1st code page
+>>9 uleshort >0 %u
+# possible 2nd code page number
+>>>7 uleshort >1
+>>>>11 uleshort x %u
+# filename[260]; name of file like: dbaseos2.msg dde4c01e.msg os2ldr.mgr xdfh.msg ...
+>41 string x \b, %s
+
# OS/2 INI (this is a guess)
0 string \xff\xff\xff\xff\x14\0\0\0 OS/2 INI
+!:mime application/x-os2-ini
+!:ext ini
+
+# From: Joerg Jenderek
+# URL: http://warpin.netlabs.org/
+# Reference: http://mark0.net/download/triddefs_xml.7z/defs/a/ark-wpi.trid.xml
+# Note: called by TrID "WarpIN Installer"
+# probably magic at the beginning
+0 ubelong =0x770402BE WarpIN Installer
+#>4 ubelong =0x03000000
+#!:mime application/octet-stream
+!:mime application/x-os2-wpi
+!:ext wpi
+# creator program name like: "reserved" or "WIC x.y.z"
+>0x106 string x \b, created by %s
+# name like: "reserved" or "OS/2 Netlabs"
+>0x146 string x \b, '%s'
+# name like: "N/A" "http://warpin.netlabs.org"
+>0x186 string x \b, URL %s
+
diff --git a/magic/Magdir/pcjr b/magic/Magdir/pcjr
new file mode 100644
index 000000000000..c3ab7a25fdf4
--- /dev/null
+++ b/magic/Magdir/pcjr
@@ -0,0 +1,8 @@
+
+#------------------------------------------------------------------------------
+# $File: pcjr,v 1.1 2021/01/09 15:09:58 christos Exp $
+# pcjr: file(1) magic for PCjr Cartridge image file format
+# From: Francis Laniel <laniel_francis@privacyrequired.com>
+0 string PCjr
+>0x80 beshort 0x55aa PCjr Cartridge image
+>0x200 beshort 0x55aa PCjr Cartridge image
diff --git a/magic/Magdir/pdf b/magic/Magdir/pdf
index e386f454a593..38de3cff9b9f 100644
--- a/magic/Magdir/pdf
+++ b/magic/Magdir/pdf
@@ -1,15 +1,18 @@
#------------------------------------------------------------------------------
-# $File: pdf,v 1.12 2020/01/30 01:48:44 christos Exp $
+# $File: pdf,v 1.16 2021/07/30 11:47:07 christos Exp $
# pdf: file(1) magic for Portable Document Format
#
0 name pdf
->8 search/512 /Filter/FlateDecode/ (password protected)
+>8 search /Count
+>>&0 regex [0-9]+ \b, %s pages
+>8 search/512 /Filter/FlateDecode/ (zip deflate encoded)
0 string %PDF- PDF document
!:mime application/pdf
!:strength +60
+!:ext pdf
>5 byte x \b, version %c
>7 byte x \b.%c
>0 use pdf
@@ -17,6 +20,7 @@
0 string \012%PDF- PDF document
!:mime application/pdf
!:strength +60
+!:ext pdf
>6 byte x \b, version %c
>8 byte x \b.%c
>0 use pdf
@@ -24,6 +28,7 @@
0 string \xef\xbb\xbf%PDF- PDF document (UTF-8)
!:mime application/pdf
!:strength +60
+!:ext pdf
>6 byte x \b, version %c
>8 byte x \b.%c
>0 use pdf
@@ -33,12 +38,14 @@
0 string %FDF- FDF document
!:mime application/vnd.fdf
!:strength +60
+!:ext pdf
>5 byte x \b, version %c
>7 byte x \b.%c
0 search/256 %PDF- PDF document
!:mime application/pdf
!:strength +60
+!:ext pdf
>&0 byte x \b, version %c
>&2 byte x \b.%c
>0 use pdf
diff --git a/magic/Magdir/pgf b/magic/Magdir/pgf
index b5a251efdf38..8318ce133804 100644
--- a/magic/Magdir/pgf
+++ b/magic/Magdir/pgf
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: pgf,v 1.2 2017/03/17 21:35:28 christos Exp $
+# $File: pgf,v 1.3 2021/02/23 00:51:10 christos Exp $
# pgf: file(1) magic for Progressive Graphics File (PGF)
#
# <http://www.libpgf.org/uploads/media/PGF_Details_01.pdf>
@@ -25,7 +25,7 @@
>>20 byte 1 gray scale,
>>20 byte 2 indexed color,
>>20 byte 3 RGB color,
->>20 byte 4 CYMK color,
+>>20 byte 4 CMYK color,
>>20 byte 5 HSL color,
>>20 byte 6 HSB color,
>>20 byte 7 multi-channel,
@@ -34,7 +34,7 @@
>>20 byte 10 gray scale 16,
>>20 byte 11 RGB color 48,
>>20 byte 12 LAB color 48,
->>20 byte 13 CYMK color 64,
+>>20 byte 13 CMYK color 64,
>>20 byte 14 deep multi-channel,
>>20 byte 15 duo tone 16,
>>20 byte 17 RGBA color,
diff --git a/magic/Magdir/pgp b/magic/Magdir/pgp
index 069c82eb8bef..d81883868b41 100644
--- a/magic/Magdir/pgp
+++ b/magic/Magdir/pgp
@@ -1,54 +1,11 @@
#------------------------------------------------------------------------------
-# $File: pgp,v 1.21 2020/03/20 17:11:05 christos Exp $
+# $File: pgp,v 1.25 2021/04/26 15:56:00 christos Exp $
# pgp: file(1) magic for Pretty Good Privacy
+
+# Handling of binary PGP keys is in pgp-binary-keys.
# see https://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html
#
-# Update: Joerg Jenderek
-# Note: verified by `gpg -v --debug 0x02 --list-packets < PUBRING263_10.PGP`
-#0 byte 0x99 MAYBE PGP 0x99
-0 byte 0x99
-# 99h~10;0110;01~2=old packet type;tag 6=Public-Key Packet;1=two-octet length
-# A two-octet body header encodes packet lengths of 192~00C0h - 8383~20BFh
-#>1 ubeshort x \b, body length 0x%.4x
-# skip Basic.Image Beauty.320 Pic.Icons by looking for low version number
-#>3 ubyte x \b, V=%u
-#>3 ubyte <5 VERSION OK
->3 ubyte <5
-# next packet type often b4h~(tag 13)~User ID Packet, b0h~(tag 12)~Trust packet
-#>>(1.S+3) ubyte x \b, next packet type 0x%x
-# skip 9900-v4.bin 9902-v4.bin by looking for valid second packet type (bit 7=1)
-#>>(1.S+3) ubyte >0x7F TYPE OK,
->>(1.S+3) ubyte >0x7F
-# old versions 2,3 implies Pretty Good Privacy
->>>3 ubyte <4 PGP key public ring (v%u)
-!:mime application/pgp-keys
-!:ext pgp/ASD
->>>>4 beldate x created %s
-# days that this key is valid. If this number is zero, then it does not expire
->>>>8 ubeshort >0 \b, %u days valid
->>>>8 ubeshort =0 \b, not expire
-# display key algorithm 1~RSA (Encrypt or Sign)
->>>>10 use key_algo
-# Multiprecision Integers (MPI) size
->>>>11 ubeshort x %u bits
-# MPI
->>>>13 ubequad x MPI=0x%16.16llx...
-# new version implies Pretty Good Privacy (PGP) >= 5.0 or Gnu Privacy Guard (GPG)
->>>3 ubyte >3 PGP/GPG key public ring (v%u)
-!:mime application/pgp-keys
-!:ext pgp/gpg/pkr/asd
->>>>4 beldate x created %s
-# display key algorithm 17~DSA
->>>>8 use key_algo
-# Multiprecision Integers (MPI) size
->>>>9 ubeshort x %u bits
->>>>11 ubequad x MPI=0x%16.16llx...
-
-0 beshort 0x9501 PGP key security ring
-!:mime application/x-pgp-keyring
-0 beshort 0x9500 PGP key security ring
-!:mime application/x-pgp-keyring
0 beshort 0xa600 PGP encrypted data
#!:mime application/pgp-encrypted
#0 string -----BEGIN\040PGP text/PGP armored data
@@ -404,7 +361,7 @@
# we branch into the proper key size
# signatures defined as x{keysize}
->0 name pgpkey
+0 name pgpkey
>0 string \x01\xd8 1024b
>>2 use x1024
>0 string \x01\xeb 1024b
@@ -582,8 +539,6 @@
# PGP RSA (e=65537) secret (sub-)key header
-0 byte 0x95 PGP Secret Key -
->1 use pgpkey
0 byte 0x97 PGP Secret Sub-key -
>1 use pgpkey
0 byte 0x9d
@@ -591,9 +546,9 @@
# secret subkey packet (tag 7) with same structure as secret key packet (tag 5)
# skip Fetus.Sys16 CALIBUS.MAIN OrbFix.Sys16.Ex by looking for positive len
>1 ubeshort >0
-#>1 ubeshort x \b, body length 0x%x
+#>1 ubeshort x \b, body length %#x
# next packet type often 88h,89h~(tag 2)~Signature Packet
-#>>(1.S+3) ubyte x \b, next packet type 0x%x
+#>>(1.S+3) ubyte x \b, next packet type %#x
# skip Dragon.SHR DEMO.INIT by looking for positive version
>>3 ubyte >0
# skip BUISSON.13 GUITAR1 by looking for low version number
@@ -609,7 +564,7 @@
>>>>>11 ubeshort x %db
>>>>>4 beldate x created on %s -
# old versions use 2 additional bytes after time stamp
-#>>>>>8 ubeshort x 0x%x
+#>>>>>8 ubeshort x %#x
# display key algorithm 1~RSA Encrypt|Sign - 21~Diffie-Hellman
>>>>>10 use key_algo
>>>>>(11.S/8) ubequad x
diff --git a/magic/Magdir/pgp-binary-keys b/magic/Magdir/pgp-binary-keys
new file mode 100644
index 000000000000..1ce76d907b07
--- /dev/null
+++ b/magic/Magdir/pgp-binary-keys
@@ -0,0 +1,388 @@
+
+#------------------------------------------------------------------------------
+# $File: pgp-binary-keys,v 1.2 2021/04/26 15:56:00 christos Exp $
+# pgp-binary-keys: This file handles pgp binary keys.
+#
+# An PGP certificate or message doesn't have a fixed header. Instead,
+# they are sequences of packets:
+#
+# https://tools.ietf.org/html/rfc4880#section-4.3
+#
+# whose order conforms to a grammar:
+#
+# https://tools.ietf.org/html/rfc4880#section-11
+#
+# Happily most packets have a few fields that are constrained, which
+# allow us to fingerprint them with relatively high certainty.
+#
+# A PGP packet is described by a single byte: the so-called CTB. The
+# high-bit is always set. If bit 6 is set, then it is a so-called
+# new-style CTB; if bit 6 is clear, then it is a so-called old-style
+# CTB. Old-style CTBs have only four bits of type information; bits
+# 1-0 are used to describe the length. New-style CTBs have 6 bits of
+# type information.
+#
+# Following the CTB is the packet's length in bytes. If we blindly
+# advance the file cursor by this amount past the end of the length
+# information we come to the next packet.
+#
+# Data Structures
+# ===============
+#
+# New Style CTB
+# -------------
+#
+# https://tools.ietf.org/html/rfc4880#section-4.2.2
+#
+# 76543210
+# ||\----/
+# || tag
+# |always 1
+# always 1
+#
+# Tag bits 7 and 6 set
+# 0 0xC0 -- Reserved - a packet tag MUST NOT have this value
+# 1 0xC1 -- Public-Key Encrypted Session Key Packet
+# 2 0xC2 -- Signature Packet
+# 3 0xC3 -- Symmetric-Key Encrypted Session Key Packet
+# 4 0xC4 -- One-Pass Signature Packet
+# 5 0xC5 -- Secret-Key Packet
+# 6 0xC6 -- Public-Key Packet
+# 7 0xC7 -- Secret-Subkey Packet
+# 8 0xC8 -- Compressed Data Packet
+# 9 0xC9 -- Symmetrically Encrypted Data Packet
+# 10 0xCA -- Marker Packet
+# 11 0xCB -- Literal Data Packet
+# 12 0xCC -- Trust Packet
+# 13 0xCD -- User ID Packet
+# 14 0xCE -- Public-Subkey Packet
+# 17 0xD1 -- User Attribute Packet
+# 18 0xD2 -- Sym. Encrypted and Integrity Protected Data Packet
+# 19 0xD3 -- Modification Detection Code Packet
+# 60 to 63 -- Private or Experimental Values
+#
+# The CTB is followed by the length header, which is densely encoded:
+#
+# if length[0] is:
+# 0..191: one byte length (length[0])
+# 192..223: two byte length ((length[0] - 192) * 256 + length[2] + 192
+# 224..254: four byte length (big endian interpretation of length[1..5])
+# 255: partial body encoding
+#
+# The partial body encoding is similar to HTTP's chunk encoding. It
+# is only allowed for container packets (SEIP, Compressed Data and
+# Literal).
+#
+# Old Style CTB
+# -------------
+#
+# https://tools.ietf.org/html/rfc4880#section-4.2.1
+#
+# CTB:
+#
+# 76543210
+# ||\--/\/
+# || | length encoding
+# || tag
+# |always 0
+# always 1
+#
+# Tag:
+#
+# Tag bit 7 set, bits 6, 1, 0 clear
+# 0 0x80 -- Reserved - a packet tag MUST NOT have this value
+# 1 0x84 -- Public-Key Encrypted Session Key Packet
+# 2 0x88 -- Signature Packet
+# 3 0x8C -- Symmetric-Key Encrypted Session Key Packet
+# 4 0x90 -- One-Pass Signature Packet
+# 5 0x94 -- Secret-Key Packet
+# 6 0x98 -- Public-Key Packet
+# 7 0x9C -- Secret-Subkey Packet
+# 8 0xA0 -- Compressed Data Packet
+# 9 0xA4 -- Symmetrically Encrypted Data Packet
+# 10 0xA8 -- Marker Packet
+# 11 0xAC -- Literal Data Packet
+# 12 0xB0 -- Trust Packet
+# 13 0xB4 -- User ID Packet
+# 14 0xB8 -- Public-Subkey Packet
+#
+# Length encoding:
+#
+# Value
+# 0 1 byte length (following byte is the length)
+# 1 2 byte length (following two bytes are the length)
+# 2 4 byte length (following four bytes are the length)
+# 3 indeterminate length: natural end of packet, e.g., EOF
+#
+# An indeterminate length is only allowed for container packets
+# (SEIP, Compressed Data and Literal).
+#
+# Certificates
+# ------------
+#
+# We check the first three packets to determine if a sequence of
+# OpenPGP packets is likely to be a certificate. The grammar allows
+# the following prefixes:
+#
+# [Primary Key] [SIG] (EOF or another certificate)
+# [Primary Key] [SIG] [User ID] [SIG]...
+# [Primary Key] [SIG] [User Attribute] [SIG]...
+# [Primary Key] [SIG] [Subkey] [SIG]...
+# [Primary Key] [User ID] [SIG]...
+# [Primary Key] [User Attribute] [SIG]...
+# [Primary Key] [Subkey] [SIG]...
+#
+# Any number of marker packets are also allowed between each packet,
+# but they are not normally used and we don't currently check for
+# them.
+#
+# The keys and subkeys may be public or private.
+#
+
+# Key packets and signature packets are versioned. There are two
+# packet versions that we need to worry about in practice: v3 and v4.
+# v4 packets were introduced in RFC 2440, which was published in 1998.
+# It also deprecated v3 packets. There are no actively used v3
+# certificates (GnuPG removed the code to support them in November
+# 2014). But there are v3 keys lying around and it is useful to
+# identify them. The next version of OpenPGP will introduce v5 keys.
+# The document has not yet been standardized so changes are still
+# possible. But, for our purposes, it appears that v5 data structures
+# will be identical to v4 data structures modulo the version number.
+#
+# https://tools.ietf.org/html/rfc2440
+# https://lists.gnupg.org/pipermail/gnupg-announce/2014q4/000358.html
+# https://www.ietf.org/id/draft-ietf-openpgp-rfc4880bis-09.html#name-key-material-packet
+
+
+
+
+# The first packet has to be a public key or a secret key.
+#
+# New-Style Public Key
+0 ubyte =0xC6 OpenPGP Public Key
+>&0 use primary_key_length_new
+# New-Style Secret Key
+0 ubyte =0xC5 OpenPGP Secret Key
+>&0 use primary_key_length_new
+# Old-Style Public Key
+0 ubyte&0xFC =0x98 OpenPGP Public Key
+>&-1 use primary_key_length_old
+# Old-Style Secret Key
+0 ubyte&0xFC =0x94 OpenPGP Secret Key
+>&-1 use primary_key_length_old
+
+# Parse the length, check the packet's body and finally advance to the
+# next packet.
+
+# There are 4 different new-style length encodings, but the partial
+# body encoding is only acceptable for the SEIP, Compressed Data, and
+# Literal packets, which isn't valid for any packets in a certificate
+# so we ignore it.
+0 name primary_key_length_new
+>&0 ubyte <192
+#>>&0 ubyte x (1 byte length encoding, %d bytes)
+>>&0 use pgp_binary_key_pk_check
+>>>&(&-1.B) use sig_or_component_1
+>&0 ubyte >191
+>>&-1 ubyte <225
+# offset = ((offset[0] - 192) << 8) + offset[1] + 192 (for the length header)
+# raw - (192 * 256 - 192)
+# = 48960
+#>>>&0 ubeshort x (2 byte length encoding, %d bytes)
+>>>&1 use pgp_binary_key_pk_check
+>>>>&(&-2.S-48960) use sig_or_component_1
+>&0 ubyte =255
+#>>&0 belong x (5 byte length encoding, %d bytes)
+>>&4 use pgp_binary_key_pk_check
+>>>&(&-4.L) use sig_or_component_1
+# Partial body encoding (only valid for container packets).
+# >&0 ubyte >224
+# >>&0 ubyte <255 partial body encoding
+
+# There are 4 different old-style length encodings, but the
+# indeterminate length encoding is only acceptable for the SEIP,
+# Compressed Data, and Literal packets, which isn't valid for any
+# packets in a certificate.
+0 name primary_key_length_old
+#>&0 ubyte x (ctb: %x)
+>&0 ubyte&0x3 =0
+#>>&0 ubyte x (1 byte length encoding, %d bytes)
+>>&1 use pgp_binary_key_pk_check
+>>>&(&-1.B) use sig_or_component_1
+>&0 ubyte&0x3 =1
+#>>&0 ubeshort x (2 byte length encoding, %d bytes)
+>>&2 use pgp_binary_key_pk_check
+>>>&(&-2.S) use sig_or_component_1
+>&0 ubyte&0x3 =2
+#>>&0 ubelong x (4 byte length encoding, %d bytes)
+>>&4 use pgp_binary_key_pk_check
+>>>&(&-4.L) use sig_or_component_1
+
+# Check the Key.
+#
+# https://tools.ietf.org/html/rfc4880#section-5.5.2
+0 name pgp_binary_key_pk_check
+# Valid versions are: 2, 3, 4. 5 is proposed in RFC 4880bis.
+# Anticipate a v6 / v7 format that like v5 is compatible with v4.
+# key format in a decade or so :D.
+>&0 ubyte >1
+>>&-1 ubyte <8
+>>>&-1 byte x Version %d
+# Check that keys were created after 1990.
+# (1990 - 1970) * 365.2524 * 24 * 60 * 60 = 631156147
+>>>&0 bedate >631156147 \b, Created %s
+>>>>&-5 ubyte >3
+>>>>>&4 use pgp_binary_key_algo
+>>>>&-5 ubyte <4
+>>>>>&6 use pgp_binary_key_algo
+
+# Print out the key's algorithm and the number of bits, if this is
+# relevant (ECC keys are a fixed size).
+0 name pgp_binary_key_algo
+>0 clear x
+>&0 ubyte =1 \b, RSA (Encrypt or Sign,
+>>&0 ubeshort x \b %d bits)
+>&0 ubyte =2 \b, RSA (Encrypt,
+>>&0 ubeshort x \b %d bits)
+>&0 ubyte =3 \b, RSA (Sign,
+>>&0 ubeshort x \b %d bits)
+>&0 ubyte =16 \b, El Gamal (Encrypt,
+>>&0 ubeshort x \b %d bits)
+>&0 ubyte =17 \b, DSA
+>>&0 ubeshort x \b (%d bits)
+>&0 ubyte =18 \b, ECDH
+>&0 ubyte =19 \b, ECDSA
+>&0 ubyte =20 \b, El Gamal (Encrypt or Sign,
+>>&0 ubeshort x \b %d bits)
+>&0 ubyte =22 \b, EdDSA
+>&0 default x
+>>&0 ubyte x \b, Unknown Algorithm (%#x)
+
+# Match all possible second packets.
+0 name sig_or_component_1
+#>0 ubyte x (ctb: %x)
+>&0 ubyte =0xC2
+>>0 ubyte x \b; Signature
+>>&0 use sig_or_component_1_length_new
+>&0 ubyte =0xCD
+>>0 ubyte x \b; User ID
+>>&0 use sig_or_component_1_length_new
+>&0 ubyte =0xCE
+>>0 ubyte x \b; Public Subkey
+>>&0 use sig_or_component_1_length_new
+>&0 ubyte =0xC7
+>>0 ubyte x \b; Secret Subkey
+>>&0 use sig_or_component_1_length_new
+>&0 ubyte =0xD1
+>>0 ubyte x \b; User Attribute
+>>&0 use sig_or_component_1_length_new
+>&0 ubyte&0xFC =0x88
+>>0 ubyte x \b; Signature
+>>&-1 use sig_or_component_1_length_old
+>&0 ubyte&0xFC =0xB4
+>>0 ubyte x \b; User ID
+>>&-1 use sig_or_component_1_length_old
+>&0 ubyte&0xFC =0xB8
+>>0 ubyte x \b; Public Subkey
+>>&-1 use sig_or_component_1_length_old
+>&0 ubyte&0xFC =0x9C
+>>0 ubyte x \b; Secret Subkey
+>>&-1 use sig_or_component_1_length_old
+
+# Copy of 'primary_key_length_new', but calls cert_packet_3.
+0 name sig_or_component_1_length_new
+>&0 ubyte <192
+#>>&0 ubyte x (1 byte new length encoding, %d bytes)
+>>&(&-1.B) use cert_packet_3
+>&0 ubyte >191
+>>&-1 ubyte <225
+# offset = ((offset[0] - 192) << 8) + offset[1] + 192 + 1 (for the length header)
+# raw - (192 * 256 - 192 - 1)
+# = 48959
+#>>>&-1 ubeshort x (2 byte new length encoding, %d bytes)
+>>>&(&-1.S-48959) use cert_packet_3
+>&0 ubyte =255
+#>>&0 belong x (5 byte new length encoding, %d bytes)
+>>&(&-4.L) use cert_packet_3
+# Partial body encoding (only valid for container packets).
+# >&0 ubyte >224
+# >>&0 ubyte <255 partial body encoding
+
+0 name sig_or_component_1_length_old
+#>&0 ubyte x (ctb: %x)
+>&0 ubyte&0x3 =0
+#>>&0 ubyte x (1 byte old length encoding, %d bytes)
+>>&(&0.B+1) use cert_packet_3
+>&0 ubyte&0x3 =1
+#>>&0 ubeshort x (2 byte old length encoding, %d bytes)
+>>&(&0.S+2) use cert_packet_3
+>&0 ubyte&0x3 =2
+#>>&0 ubelong x (4 byte old length encoding, %d bytes)
+>>&(&0.L+4) use cert_packet_3
+
+# Copy of above.
+0 name cert_packet_3
+#>0 ubyte x (ctb: %x)
+>&0 ubyte =0xC2
+>>0 ubyte x \b; Signature
+>>&0 use cert_packet_3_length_new
+>&0 ubyte =0xCD
+>>0 ubyte x \b; User ID
+>>&0 use cert_packet_3_length_new
+>&0 ubyte =0xCE
+>>0 ubyte x \b; Public Subkey
+>>&0 use cert_packet_3_length_new
+>&0 ubyte =0xC7
+>>0 ubyte x \b; Secret Subkey
+>>&0 use cert_packet_3_length_new
+>&0 ubyte =0xD1
+>>0 ubyte x \b; User Attribute
+>>&0 use cert_packet_3_length_new
+>&0 ubyte&0xFC =0x88
+>>0 ubyte x \b; Signature
+>>&-1 use cert_packet_3_length_old
+>&0 ubyte&0xFC =0xB4
+>>0 ubyte x \b; User ID
+>>&-1 use cert_packet_3_length_old
+>&0 ubyte&0xFC =0xB8
+>>0 ubyte x \b; Public Subkey
+>>&-1 use cert_packet_3_length_old
+>&0 ubyte&0xFC =0x9C
+>>0 ubyte x \b; Secret Subkey
+>>&-1 use cert_packet_3_length_old
+
+# Copy of above.
+0 name cert_packet_3_length_new
+>&0 ubyte <192
+#>>&0 ubyte x (1 byte new length encoding, %d bytes)
+>>&(&-1.B) use pgp_binary_keys_end
+>&0 ubyte >191
+>>&-1 ubyte <225
+# offset = ((offset[0] - 192) << 8) + offset[1] + 192 + 1 (for the length header)
+# raw - (192 * 256 - 192 - 1)
+# = 48959
+#>>>&-1 ubeshort x (2 byte new length encoding, %d bytes)
+>>>&(&-1.S-48959) use pgp_binary_keys_end
+>&0 ubyte =255
+#>>&0 belong x (5 byte new length encoding, %d bytes)
+>>&(&-4.L) use pgp_binary_keys_end
+
+0 name cert_packet_3_length_old
+#>&0 ubyte x (ctb: %x)
+>&0 ubyte&0x3 =0
+#>>&0 ubyte x (1 byte old length encoding, %d bytes)
+>>&(&0.B+1) use pgp_binary_keys_end
+>&0 ubyte&0x3 =1
+#>>&0 ubeshort x (2 byte old length encoding, %d bytes)
+>>&(&0.S+2) use pgp_binary_keys_end
+>&0 ubyte&0x3 =2
+#>>&0 ubelong x (4 byte old length encoding, %d bytes)
+>>&(&0.L+4) use pgp_binary_keys_end
+
+# We managed to parse the first three packets of the certificate. Declare
+# victory.
+0 name pgp_binary_keys_end
+>0 byte x \b; OpenPGP Certificate
+!:mime application/pgp-keys
+!:ext pgp/gpg/pkr/asd
diff --git a/magic/Magdir/plan9 b/magic/Magdir/plan9
index da5eb66650ac..db068479c2d7 100644
--- a/magic/Magdir/plan9
+++ b/magic/Magdir/plan9
@@ -1,10 +1,11 @@
#------------------------------------------------------------------------------
-# $File: plan9,v 1.5 2009/09/19 16:28:11 christos Exp $
-# plan9: file(1) magic for AT&T Bell Labs' Plan 9 executables
+# $File: plan9,v 1.6 2021/07/30 12:25:13 christos Exp $
+# plan9: file(1) magic for AT&T Bell Labs' Plan 9 executables and object files
# From: "Stefan A. Haubenthal" <polluks@web.de>
#
0 belong 0x00000107 Plan 9 executable, Motorola 68k
+0 belong 0x00000197 Plan 9 executable, AT&T Hobbit
0 belong 0x000001EB Plan 9 executable, Intel 386
0 belong 0x00000247 Plan 9 executable, Intel 960
0 belong 0x000002AB Plan 9 executable, SPARC
@@ -16,3 +17,9 @@
0 belong 0x000006EB Plan 9 executable, PowerPC
0 belong 0x00000797 Plan 9 executable, MIPS R4000 LE
0 belong 0x0000084B Plan 9 executable, DEC Alpha
+
+0 belong 0x3A11013C Plan 9 object file, MIPS R3000
+0 belong 0x430D013C Plan 9 object file, AT&T Hobbit
+0 belong 0x4D013201 Plan 9 object file, Motorola 68k
+0 belong 0x7410013C Plan 9 object file, SPARC
+0 belong 0x7E004501 Plan 9 object file, Intel 386
diff --git a/magic/Magdir/pmem b/magic/Magdir/pmem
index 4c36275ea96f..c0ead7316b2c 100644
--- a/magic/Magdir/pmem
+++ b/magic/Magdir/pmem
@@ -1,31 +1,31 @@
#------------------------------------------------------------------------------
-# $File: pmem,v 1.3 2019/06/13 11:45:44 christos Exp $
+# $File: pmem,v 1.4 2021/04/26 15:56:00 christos Exp $
# pmem: file(1) magic for Persistent Memory Development Kit pool files
#
0 string PMEM
>4 string POOLSET Persistent Memory Poolset file
>>11 search REPLICA with replica
>4 regex LOG|BLK|OBJ Persistent Memory Pool file, type: %s,
->>8 lelong >0 version: 0x%x,
->>12 lelong x compat: 0x%x,
->>16 lelong x incompat: 0x%x,
->>20 lelong x ro_compat: 0x%x,
+>>8 lelong >0 version: %#x,
+>>12 lelong x compat: %#x,
+>>16 lelong x incompat: %#x,
+>>20 lelong x ro_compat: %#x,
>>120 leqldate x crtime: %s,
->>128 lequad x alignment_desc: 0x%016llx,
+>>128 lequad x alignment_desc: %#016llx,
>>136 clear x
>>136 byte 2 machine_class: 64-bit,
>>136 default x machine_class: unknown
->>>136 byte x (0x%d),
+>>>136 byte x (%#d),
>>137 clear x
>>137 byte 1 data: little-endian,
>>137 byte 2 data: big-endian,
>>137 default x data: unknown
->>>137 byte x (0x%d),
+>>>137 byte x (%#d),
>>138 byte !0 reserved[0]: %d,
>>139 byte !0 reserved[1]: %d,
@@ -36,7 +36,7 @@
>>142 leshort 62 machine: x86_64
>>142 leshort 183 machine: aarch64
>>142 default x machine: unknown
->>>142 leshort x (0x%d)
+>>>142 leshort x (%#d)
>4 string BLK
>>4096 lelong x \b, blk.bsize: %d
diff --git a/magic/Magdir/puzzle b/magic/Magdir/puzzle
new file mode 100644
index 000000000000..ac983f32b8e6
--- /dev/null
+++ b/magic/Magdir/puzzle
@@ -0,0 +1,17 @@
+
+#------------------------------------------------------------------------------
+# $File: puzzle,v 1.2 2021/10/07 15:40:40 christos Exp $
+# wsdl: Magic for various puzzles
+
+# PUZ crossword puzzles from Alan De Smet
+# Test files can be found at
+# https://theworld.com/~wij/puzzles/wij-themed.html or using the
+# "Universal" or "WS Journal" links on the right side of
+# https://www.cruciverb.com/ .
+
+2 string ACROSS&DOWN PUZ crossword puzzle
+>0x2c byte x %d x
+>0x2d byte x %d,
+>0x2e leshort x %d clues,
+>0x1e leshort 0x0000 plain text solution
+>0x1e leshort !0x0000 scrambled solution
diff --git a/magic/Magdir/python b/magic/Magdir/python
index 9d306c062529..80a59959bea2 100644
--- a/magic/Magdir/python
+++ b/magic/Magdir/python
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: python,v 1.42 2020/06/04 00:22:50 christos Exp $
+# $File: python,v 1.43 2021/05/25 15:12:03 christos Exp $
# python: file(1) magic for python
#
# Outlook puts """ too for urgent messages
@@ -10,211 +10,211 @@
# MAGIC as specified in Python/import.c (1.0 to 3.7)
# two bytes of magic followed by "\r\n" in little endian order
0 belong 0x02099900 python 1.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x03099900 python 1.1/1.2 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x892e0d0a python 1.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x04170d0a python 1.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x994e0d0a python 1.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xfcc40d0a python 1.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xfdc40d0a python 1.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x87c60d0a python 2.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x88c60d0a python 2.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2aeb0d0a python 2.1 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2beb0d0a python 2.1 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2ded0d0a python 2.2 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2eed0d0a python 2.2 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x3bf20d0a python 2.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x3cf20d0a python 2.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x45f20d0a python 2.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x59f20d0a python 2.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x63f20d0a python 2.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x6df20d0a python 2.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x6ef20d0a python 2.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x77f20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x81f20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x8bf20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x8cf20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x95f20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x9ff20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xa9f20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xb3f20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xb4f20d0a python 2.5 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xc7f20d0a python 2.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xd1f20d0a python 2.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xd2f20d0a python 2.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xdbf20d0a python 2.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xe5f20d0a python 2.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xeff20d0a python 2.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xf9f20d0a python 2.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x03f30d0a python 2.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x04f30d0a python 2.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xb80b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xc20b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xcc0b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xd60b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xe00b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xea0b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xf40b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xf50b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xff0b0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x090c0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x130c0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x1d0c0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x1f0c0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x270c0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x3b0c0d0a python 3.0 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x450c0d0a python 3.1 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x4f0c0d0a python 3.1 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x580c0d0a python 3.2 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x620c0d0a python 3.2 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x6c0c0d0a python 3.2 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x760c0d0a python 3.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x800c0d0a python 3.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x8a0c0d0a python 3.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x940c0d0a python 3.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x9e0c0d0a python 3.3 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xb20c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xbc0c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xc60c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xd00c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xda0c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xe40c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xee0c0d0a python 3.4 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0xf80c0d0a python 3.5.1- byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x020d0d0a python 3.5.1- byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x0c0d0d0a python 3.5.1- byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x160d0d0a python 3.5.1- byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x170d0d0a python 3.5.2+ byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x200d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x210d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2a0d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2b0d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2c0d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2d0d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x2f0d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x300d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x310d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x320d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x330d0d0a python 3.6 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x3e0d0d0a python 3.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x3f0d0d0a python 3.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x400d0d0a python 3.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x410d0d0a python 3.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x420d0d0a python 3.7 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x480d0d0a python 3.8 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x490d0d0a python 3.8 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x520d0d0a python 3.8 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x530d0d0a python 3.8 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x540d0d0a python 3.8 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x550d0d0a python 3.8 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x5c0d0d0a python 3.9 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x5d0d0d0a python 3.9 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x5e0d0d0a python 3.9 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x5f0d0d0a python 3.9 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x600d0d0a python 3.9 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 belong 0x610d0d0a python 3.9 byte-compiled
-!:mime text/x-bytecode.python
+!:mime application/x-bytecode.python
0 search/1/w #!\040/usr/bin/python Python script text executable
!:strength + 15
diff --git a/magic/Magdir/riff b/magic/Magdir/riff
index 33d31fe75a74..39a5acbe23b9 100644
--- a/magic/Magdir/riff
+++ b/magic/Magdir/riff
@@ -1,28 +1,122 @@
#------------------------------------------------------------------------------
-# $File: riff,v 1.35 2020/06/05 17:15:03 christos Exp $
+# $File: riff,v 1.43 2021/04/26 15:56:00 christos Exp $
# riff: file(1) magic for RIFF format
# See
#
# https://www.seanet.com/users/matts/riffmci/riffmci.htm
# http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf
+# https://www.iana.org/assignments/wave-avi-codec-registry/wave-avi-codec-registry.xml
#
# audio format tag. Assume limits: max 1024 bit, 128 channels, 1 MHz
0 name riff-wave
->0 leshort 1 \b, Microsoft PCM
+>0 leshort 0x01 \b, Microsoft PCM
>>14 leshort >0
>>>14 leshort <1024 \b, %d bit
->0 leshort 2 \b, Microsoft ADPCM
->0 leshort 6 \b, ITU G.711 A-law
->0 leshort 7 \b, ITU G.711 mu-law
->0 leshort 8 \b, Microsoft DTS
->0 leshort 17 \b, IMA ADPCM
->0 leshort 20 \b, ITU G.723 ADPCM (Yamaha)
->0 leshort 49 \b, GSM 6.10
->0 leshort 64 \b, ITU G.721 ADPCM
->0 leshort 80 \b, MPEG
->0 leshort 85 \b, MPEG Layer 3
+>0 leshort 0x02 \b, Microsoft ADPCM
+>0 leshort 0x03 \b, IEEE Float
+>0 leshort 0x04 \b, Compaq VSELP
+>0 leshort 0x05 \b, IBM CVSD
+>0 leshort 0x06 \b, ITU G.711 A-law
+>0 leshort 0x07 \b, ITU G.711 mu-law
+>0 leshort 0x08 \b, Microsoft DTS
+>0 leshort 0x10 \b, OKI ADPCM
+>0 leshort 0x11 \b, IMA ADPCM
+>0 leshort 0x12 \b, MediaSpace ADPCM
+>0 leshort 0x13 \b, Sierra ADPCM
+>0 leshort 0x14 \b, ITU G.723 ADPCM (Yamaha)
+>0 leshort 0x15 \b, DSP Solutions DIGISTD
+>0 leshort 0x16 \b, DSP Solutions DIGIFIX
+>0 leshort 0x17 \b, Dialogic OKI ADPCM
+>0 leshort 0x18 \b, MediaVision ADPCM
+>0 leshort 0x19 \b, HP CU
+>0 leshort 0x20 \b, Yamaha ADPCM
+>0 leshort 0x21 \b, Speech Compression SONARC
+>0 leshort 0x22 \b, DSP Group True Speech
+>0 leshort 0x23 \b, Echo Speech EchoSC1
+>0 leshort 0x24 \b, AudioFile AF36
+>0 leshort 0x25 \b, APTX
+>0 leshort 0x26 \b, AudioFile AF10
+>0 leshort 0x27 \b, Prosody 1612
+>0 leshort 0x28 \b, LRC
+>0 leshort 0x30 \b, Dolby AC2
+>0 leshort 0x31 \b, GSM 6.10
+>0 leshort 0x32 \b, MSN Audio
+>0 leshort 0x33 \b, Antex ADPCME
+>0 leshort 0x34 \b, Control Res VQLPC
+>0 leshort 0x35 \b, Digireal
+>0 leshort 0x36 \b, DigiADPCM
+>0 leshort 0x37 \b, Control Res CR10
+>0 leshort 0x38 \b, NMS VBXADPCM
+>0 leshort 0x39 \b, Roland RDAC
+>0 leshort 0x3A \b, Echo Speech EchoSC3
+>0 leshort 0x3B \b, Rockwell ADPCM
+>0 leshort 0x3C \b, Rockwell Digitalk
+>0 leshort 0x3D \b, Xebec
+>0 leshort 0x40 \b, ITU G.721 ADPCM
+>0 leshort 0x41 \b, ITU G.728 CELP
+>0 leshort 0x42 \b, MSG723
+>0 leshort 0x50 \b, MPEG
+>0 leshort 0x52 \b, RT24
+>0 leshort 0x53 \b, PAC
+>0 leshort 0x55 \b, MPEG Layer 3
+>0 leshort 0x59 \b, Lucent G.723
+>0 leshort 0x60 \b, Cirrus
+>0 leshort 0x61 \b, ESPCM
+>0 leshort 0x62 \b, Voxware
+>0 leshort 0x63 \b, Canopus Atrac
+>0 leshort 0x64 \b, ITU G.726 ADPCM
+>0 leshort 0x65 \b, ITU G.722 ADPCM
+>0 leshort 0x66 \b, DSAT
+>0 leshort 0x67 \b, DSAT Display
+>0 leshort 0x69 \b, Voxware Byte Aligned
+>0 leshort 0x70 \b, Voxware AC8
+>0 leshort 0x71 \b, Voxware AC10
+>0 leshort 0x72 \b, Voxware AC16
+>0 leshort 0x73 \b, Voxware AC20
+>0 leshort 0x74 \b, Voxware MetaVoice
+>0 leshort 0x75 \b, Voxware MetaSound
+>0 leshort 0x76 \b, Voxware RT29HW
+>0 leshort 0x77 \b, Voxware VR12
+>0 leshort 0x78 \b, Voxware VR18
+>0 leshort 0x79 \b, Voxware TQ40
+>0 leshort 0x80 \b, Softsound
+>0 leshort 0x81 \b, Voxware TQ60
+>0 leshort 0x82 \b, MSRT24
+>0 leshort 0x83 \b, ITU G.729A
+>0 leshort 0x84 \b, MVI MV12
+>0 leshort 0x85 \b, DF G.726
+>0 leshort 0x86 \b, DF GSM610
+>0 leshort 0x88 \b, ISIAudio
+>0 leshort 0x89 \b, Onlive
+>0 leshort 0x91 \b, SBC24
+>0 leshort 0x92 \b, Dolby AC3 S/PDIF
+>0 leshort 0x97 \b, ZyXEL ADPCM
+>0 leshort 0x98 \b, Philips LPCBB
+>0 leshort 0x99 \b, Packed
+>0 leshort 0x100 \b, Rhetorex ADPCM
+>0 leshort 0x101 \b, BeCubed Software IRAT
+>0 leshort 0x111 \b, Vivo G.723
+>0 leshort 0x112 \b, Vivo Siren
+>0 leshort 0x123 \b, Digital G.723
+>0 leshort 0x200 \b, Creative ADPCM
+>0 leshort 0x202 \b, Creative FastSpeech8
+>0 leshort 0x203 \b, Creative FastSpeech10
+>0 leshort 0x220 \b, Quarterdeck
+>0 leshort 0x300 \b, FM Towns Snd
+>0 leshort 0x400 \b, BTV Digital
+>0 leshort 0x680 \b, VME VMPCM
+>0 leshort 0x1000 \b, OLIGSM
+>0 leshort 0x1001 \b, OLIADPCM
+>0 leshort 0x1002 \b, OLICELP
+>0 leshort 0x1003 \b, OLISBC
+>0 leshort 0x1004 \b, OLIOPR
+>0 leshort 0x1100 \b, LH Codec
+>0 leshort 0x1400 \b, Norris
+>0 leshort 0x1401 \b, ISIAudio
+>0 leshort 0x1500 \b, Soundspace Music Compression
+>0 leshort 0x2000 \b, AC3 DVM
>0 leshort 0x2001 \b, DTS
>2 leshort =1 \b, mono
>2 leshort =2 \b, stereo
@@ -34,7 +128,7 @@
# try to find "fmt "
0 name riff-walk
>0 string fmt\x20
->>4 lelong <0x80
+>>4 lelong >15
>>>8 use riff-wave
>0 string LIST
>>&(4.l+4) use riff-walk
@@ -74,6 +168,7 @@
# Update: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/Resource_Interchange_File_Format
# Reference: https://worms2d.info/Palette_file
+# WAVE/AVI codec registry: https://www.iana.org/assignments/wave-avi-codec-registry/wave-avi-codec-registry.xml
>8 string PAL\ \b, palette
!:mime application/x-riff
# color palette by Microsoft Corporation
@@ -87,7 +182,7 @@
# data chunk size = color entries * 4 + 4 + sometimes extra (4) appended bytes
>>>16 ulelong x \b, data size %u
# palVersion is always 0x0300
-#>>>20 leshort x \b, version 0x%4.4x
+#>>>20 leshort x \b, version %#4.4x
# palNumEntries specifies the number of palette color entries
>>>22 uleshort x \b, %u entries
# after palPalEntry sized (number of color entries * 4 ) vector
@@ -95,9 +190,11 @@
# jump relative 22 ( 8 + 16) bytes forward points after end of file or to
# appended extra bytes like in http://safecolours.rigdenage.com/set(ms).zip/Protan(MS).pal
>>>>&16 ubelong x \b, extra bytes
->>>>>&-4 ubelong >0 0x%8.8x
+>>>>>&-4 ubelong >0 %#8.8x
# RIFF Device Independent Bitmap format
+# URL: http://fileformats.archiveteam.org/wiki/RDIB
>8 string RDIB \b, device-independent bitmap
+!:ext rdi/dib
>>16 string BM
>>>30 leshort 12 \b, OS/2 1.x format
>>>>34 leshort x \b, %d x
@@ -110,14 +207,28 @@
>>>>38 lelong x %d x
>>>>44 leshort x %d
# RIFF MIDI format
+# URL: http://fileformats.archiveteam.org/wiki/RIFF_MIDI
>8 string RMID \b, MIDI
+# http://extension.nirsoft.net/rmi
+!:mime audio/mid
+#!:mime audio/x-rmid
+!:ext rmi
# RIFF Multimedia Movie File format
+# URL: http://fileformats.archiveteam.org/wiki/RIFF_Multimedia_Movie
>8 string RMMP \b, multimedia movie
+!:mime video/x-mmm
+!:ext mmm
# RIFF wrapper for MP3
>8 string RMP3 \b, MPEG Layer 3 audio
+#!:mime audio/x-rmp3
# Microsoft WAVE format (*.wav)
+# URL: http://fileformats.archiveteam.org/wiki/WAV
>8 string WAVE \b, WAVE audio
+#!:mime audio/vnd.wave
!:mime audio/x-wav
+# https://www.macdisk.com/macsigen.php
+#!:apple ????WAVE
+!:ext wav/wave
>>12 string >\0
>>>12 use riff-walk
# Update: Joerg Jenderek
@@ -147,10 +258,26 @@
# pattern created by newer software start with RIFF type PAT
>8 string PAT
>>0 use corel-draw
+# From: Joerg Jenderek
+# URL: https://en.wikipedia.org/wiki/Corel_Designer
+# Reference: http://fileformats.archiveteam.org/wiki/Corel_Designer
+>8 string DES
+>>8 string !DESC
+>>>0 use corel-des
+# Corel Draw templates with version 12.5 or Corel Designer illustration 12
+>>8 string =DESC
+# MORE TESTS NEEDED HERE!
+#>>>0 use corel-des
+#>>>0 use corel-draw
>8 string NUNDROOT \b, Steinberg CuBase
# AVI == Audio Video Interleave
+# Reference: http://fileformats.archiveteam.org/wiki/AVI
>8 string AVI\040 \b, AVI
+# https://reposcope.com/mimetype/video/x-msvideo
!:mime video/x-msvideo
+# https://www.iana.org/assignments/wave-avi-codec-registry/wave-avi-codec-registry.xml
+#!:mime video/vnd.avi
+!:ext avi/divx
>>12 string LIST
>>>20 string hdrlavih
>>>>&36 lelong x \b, %u x
@@ -214,15 +341,126 @@
# skip past vids strh
>>>>>>(104.l+108) string strf
>>>>>>>(104.l+132) lelong 1 RLE 8bpp
+>>>>>>>(104.l+132) string/c anim Intel RDX
+>>>>>>>(104.l+132) string/c aur2 AuraVision Aura 2
+>>>>>>>(104.l+132) string/c aura AuraVision Aura
+>>>>>>>(104.l+132) string/c bt20 Brooktree MediaStream
+>>>>>>>(104.l+132) string/c btcv Brooktree Composite Video
+>>>>>>>(104.l+132) string/c cc12 Intel YUV12
+>>>>>>>(104.l+132) string/c cdvc Canopus DV
+>>>>>>>(104.l+132) string/c cham Winnov Caviara Cham
+>>>>>>>(104.l+132) string/c cljr Proprietary YUV 4 pixels
+>>>>>>>(104.l+132) string/c cmyk Common Data Format in Printing
+>>>>>>>(104.l+132) string/c cpla Weitek 4:2:0 YUV Planar
>>>>>>>(104.l+132) string/c cvid Cinepak
+>>>>>>>(104.l+132) string/c cwlt Microsoft Color WLT DIB
+>>>>>>>(104.l+132) string/c cyuv Creative Labs YUV
+>>>>>>>(104.l+132) string/c d261 H.261
+>>>>>>>(104.l+132) string/c d263 H.263
+>>>>>>>(104.l+132) string/c duck TrueMotion 1.0
+>>>>>>>(104.l+132) string/c dve2 DVE-2 Videoconferencing
+>>>>>>>(104.l+132) string/c fljp Field Encoded Motion JPEG
+>>>>>>>(104.l+132) string/c fvf1 Fractal Video Frame
+>>>>>>>(104.l+132) string/c gwlt Microsoft Greyscale WLT DIB
+>>>>>>>(104.l+132) string/c h260 H.260
+>>>>>>>(104.l+132) string/c h261 H.261
+>>>>>>>(104.l+132) string/c h262 H.262
+>>>>>>>(104.l+132) string/c h263 H.263
+>>>>>>>(104.l+132) string/c h264 H.264
+>>>>>>>(104.l+132) string/c h265 H.265
+>>>>>>>(104.l+132) string/c h266 H.266
+>>>>>>>(104.l+132) string/c h267 H.267
+>>>>>>>(104.l+132) string/c h268 H.268
+>>>>>>>(104.l+132) string/c h269 H.269
>>>>>>>(104.l+132) string/c i263 Intel I.263
->>>>>>>(104.l+132) string/c iv32 Indeo 3.2
->>>>>>>(104.l+132) string/c iv41 Indeo 4.1
->>>>>>>(104.l+132) string/c iv50 Indeo 5.0
+>>>>>>>(104.l+132) string/c i420 Intel Indeo 4
+>>>>>>>(104.l+132) string/c ian Intel RDX
+>>>>>>>(104.l+132) string/c iclb CellB Videoconferencing Codec
+>>>>>>>(104.l+132) string/c ilvc Intel Layered Video
+>>>>>>>(104.l+132) string/c ilvr ITU-T H.263+
+>>>>>>>(104.l+132) string/c iraw Intel YUV Uncompressed
+>>>>>>>(104.l+132) string/c iv30 Intel Indeo 3
+>>>>>>>(104.l+132) string/c iv31 Intel Indeo 3.1
+>>>>>>>(104.l+132) string/c iv32 Intel Indeo 3.2
+>>>>>>>(104.l+132) string/c iv33 Intel Indeo 3.3
+>>>>>>>(104.l+132) string/c iv34 Intel Indeo 3.4
+>>>>>>>(104.l+132) string/c iv35 Intel Indeo 3.5
+>>>>>>>(104.l+132) string/c iv36 Intel Indeo 3.6
+>>>>>>>(104.l+132) string/c iv37 Intel Indeo 3.7
+>>>>>>>(104.l+132) string/c iv38 Intel Indeo 3.8
+>>>>>>>(104.l+132) string/c iv39 Intel Indeo 3.9
+>>>>>>>(104.l+132) string/c iv40 Intel Indeo 4.0
+>>>>>>>(104.l+132) string/c iv41 Intel Indeo 4.1
+>>>>>>>(104.l+132) string/c iv42 Intel Indeo 4.2
+>>>>>>>(104.l+132) string/c iv43 Intel Indeo 4.3
+>>>>>>>(104.l+132) string/c iv44 Intel Indeo 4.4
+>>>>>>>(104.l+132) string/c iv45 Intel Indeo 4.5
+>>>>>>>(104.l+132) string/c iv46 Intel Indeo 4.6
+>>>>>>>(104.l+132) string/c iv47 Intel Indeo 4.7
+>>>>>>>(104.l+132) string/c iv48 Intel Indeo 4.8
+>>>>>>>(104.l+132) string/c iv49 Intel Indeo 4.9
+>>>>>>>(104.l+132) string/c iv50 Intel Indeo 5.0
+>>>>>>>(104.l+132) string/c mpeg MPEG 1 Video Frame
+>>>>>>>(104.l+132) string/c mjpg Motion JPEG
>>>>>>>(104.l+132) string/c mp42 Microsoft MPEG-4 v2
>>>>>>>(104.l+132) string/c mp43 Microsoft MPEG-4 v3
+>>>>>>>(104.l+132) string/c mrca MR Codec
+>>>>>>>(104.l+132) string/c mrle Run Length Encoding
+>>>>>>>(104.l+132) string/c msvc Microsoft Video 1
+>>>>>>>(104.l+132) string/c phmo Photomotion
+>>>>>>>(104.l+132) string/c qpeq QPEG 1.1 Format Video
+>>>>>>>(104.l+132) string/c rgbt RGBT
+>>>>>>>(104.l+132) string/c rle4 Run Length Encoded 4
+>>>>>>>(104.l+132) string/c rle8 Run Length Encoded 8
+>>>>>>>(104.l+132) string/c rt21 Intel Indeo 2.1
+>>>>>>>(104.l+132) string/c rvx Intel RDX
+>>>>>>>(104.l+132) string/c sdcc Sun Digital Camera Codec
+>>>>>>>(104.l+132) string/c sfmc Crystal Net SFM Codec
+>>>>>>>(104.l+132) string/c smsc SMSC
+>>>>>>>(104.l+132) string/c smsd SMSD
+>>>>>>>(104.l+132) string/c splc Splash Studios ACM Audio Codec
+>>>>>>>(104.l+132) string/c sqz2 Microsoft VXtreme Video Codec
+>>>>>>>(104.l+132) string/c sv10 Sorenson Video R1
+>>>>>>>(104.l+132) string/c tlms TeraLogic Motion Intraframe Codec A
+>>>>>>>(104.l+132) string/c tlst TeraLogic Motion Intraframe Codec B
+>>>>>>>(104.l+132) string/c tm20 TrueMotion 2.0
+>>>>>>>(104.l+132) string/c tmic TeraLogic Motion Intraframe Codec 2
+>>>>>>>(104.l+132) string/c tmot TrueMotion Video Compression
+>>>>>>>(104.l+132) string/c tr20 TrueMotion RT 2.0
+>>>>>>>(104.l+132) string/c ulti Ultimotion
+>>>>>>>(104.l+132) string/c uyvy UYVY 4:2:2 byte ordering
+>>>>>>>(104.l+132) string/c v422 24-bit YUV 4:2:2 format
+>>>>>>>(104.l+132) string/c v655 16-bit YUV 4:2:2 format
+>>>>>>>(104.l+132) string/c vcr1 ATI VCR 1.0
+>>>>>>>(104.l+132) string/c vcr2 ATI VCR 2.0
+>>>>>>>(104.l+132) string/c vcr3 ATI VCR 3.0
+>>>>>>>(104.l+132) string/c vcr4 ATI VCR 4.0
+>>>>>>>(104.l+132) string/c vcr5 ATI VCR 5.0
+>>>>>>>(104.l+132) string/c vcr6 ATI VCR 6.0
+>>>>>>>(104.l+132) string/c vcr7 ATI VCR 7.0
+>>>>>>>(104.l+132) string/c vcr8 ATI VCR 8.0
+>>>>>>>(104.l+132) string/c vcr9 ATI VCR 9.0
+>>>>>>>(104.l+132) string/c vdct Video Maker Pro DIB
+>>>>>>>(104.l+132) string/c vids YUV 4:2:2 CCIR 601 for V422
+>>>>>>>(104.l+132) string/c vivo Vivo H.263
+>>>>>>>(104.l+132) string/c vixl VIXL
+>>>>>>>(104.l+132) string/c vlv1 VLCAP.DRV
+>>>>>>>(104.l+132) string/c wbvc W9960
+>>>>>>>(104.l+132) string/c x263 mmioFOURCC('X','2','6','3')
+>>>>>>>(104.l+132) string/c xlv0 XL Video Decoder
+>>>>>>>(104.l+132) string/c y211 YUV 2:1:1 Packed
+>>>>>>>(104.l+132) string/c y411 YUV 4:1:1 Packed
+>>>>>>>(104.l+132) string/c y41b YUV 4:1:1 Planar
+>>>>>>>(104.l+132) string/c y41p PC1 4:1:1
+>>>>>>>(104.l+132) string/c y41t PC1 4:1:1 with transparency
+>>>>>>>(104.l+132) string/c y42b YUV 4:2:2 Planar
+>>>>>>>(104.l+132) string/c y42t PC1 4:2:2 with transparency
+>>>>>>>(104.l+132) string/c yc12 Intel YUV12 Codec
+>>>>>>>(104.l+132) string/c yuv8 Winnov Caviar YUV8
+>>>>>>>(104.l+132) string/c yuv9 YUV9
+>>>>>>>(104.l+132) string/c yuy2 YUY2 4:2:2 byte ordering packed
+>>>>>>>(104.l+132) string/c yuyv BI_YUYV, Canopus
>>>>>>>(104.l+132) string/c fmp4 FFMpeg MPEG-4
->>>>>>>(104.l+132) string/c mjpg Motion JPEG
>>>>>>>(104.l+132) string/c div3 DivX 3
>>>>>>>>112 string/c div3 Low-Motion
>>>>>>>>112 string/c div4 Fast-Motion
@@ -248,7 +486,7 @@
>>>>>>>>(92.l+180) leshort 0x0055 MPEG-1 Layer 3
>>>>>>>>(92.l+180) leshort 0x2000 Dolby AC3
>>>>>>>>(92.l+180) leshort 0x0161 DivX
-##>>>>>>>>(92.l+180) leshort x (0x%.4x)
+##>>>>>>>>(92.l+180) leshort x (%#.4x)
>>>>>>>>(92.l+182) leshort 1 (mono,
>>>>>>>>(92.l+182) leshort 2 (stereo,
>>>>>>>>(92.l+182) leshort >2 (%d channels,
@@ -260,24 +498,74 @@
>>>>>>>>(92.l+188) leshort 0x0055 MPEG-1 Layer 3
>>>>>>>>(92.l+188) leshort 0x2000 Dolby AC3
>>>>>>>>(92.l+188) leshort 0x0161 DivX
-##>>>>>>>>(92.l+188) leshort x (0x%.4x)
+##>>>>>>>>(92.l+188) leshort x (%#.4x)
>>>>>>>>(92.l+190) leshort 1 (mono,
>>>>>>>>(92.l+190) leshort 2 (stereo,
>>>>>>>>(92.l+190) leshort >2 (%d channels,
>>>>>>>>(92.l+192) lelong x %d Hz)
+# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/VDR_(VirtualDub)
+# Reference: http://sourceforge.net/projects/virtualdub/files/virtualdub-win/
+# 1.10.4.35491/VirtualDub-1.10.4-src.7z/src/vdremote/Main.cpp
+# VirtualDub link handler
+>8 string VDRM \b, VirtualDub link
+!:mime video/x-vdr
+!:ext vdr
+>>12 string PATH \b, PATH
+# remote-path to video file
+>>16 pstring/l x %s
# Animated Cursor format
+# Update: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/Windows_Animated_Cursor
+# Reference: https://www.gdgsoft.com/anituner/help/aniformat.htm
>8 string ACON \b, animated cursor
+!:mime application/x-navi-animation
+# http://extension.nirsoft.net/ani
+#!:mime image/ani
+!:ext ani
+# INAM tag followed by length of title
+>>24 string INAM
+>>>28 pstring/l x "%s"
+# IART tag followed by length of author
+>>>(28.l+32) ubelong 0x49415254
+>>>>&0 pstring/l x %s
# SoundFont 2 <mpruett@sgi.com>
->8 string sfbk SoundFont/Bank
+# URL: http://fileformats.archiveteam.org/wiki/SoundFont_2.0
+>8 string sfbk \b, SoundFont/Bank
+!:mime audio/x-sfbk
+!:ext sf2
# MPEG-1 wrapped in a RIFF, apparently
+# URL: http://file.fyicenter.com/17_Video_.DAT_File_Extension_for_VCD_Files.html
>8 string CDXA \b, wrapped MPEG-1 (CDXA)
+!:mime video/x-cdxa
+!:ext mpg/dat
+# URL: http://fileformats.archiveteam.org/wiki/4X_IMA_ADPCM
>8 string 4XMV \b, 4X Movie file
+!:mime video/x-4xmv
+!:ext 4xm/4xa
# AMV-type AVI file: https://wiki.multimedia.cx/index.php?title=AMV
>8 string AMV\040 \b, AMV
+# http://fileformats.archiveteam.org/wiki/MTV_Video_(.AMV)
+!:mime video/x-amv
+!:ext amv
+#!:ext amv/mtv
+# URL: http://fileformats.archiveteam.org/wiki/WebP
>8 string WEBP \b, Web/P image
!:mime image/webp
+!:ext webp
>>12 use riff-walk
# From: Joerg Jenderek
+# URL: http://fileformats.archiveteam.org/wiki/RIFF_MIDS
+>8 string MIDS \b, MIDI Stream
+!:mime audio/x-mids
+!:ext mds
+# From: Joerg Jenderek
+# URL: http://mark0.net/soft-trid-e.html
+# Reference: http://fileformats.archiveteam.org/wiki/Trd_(TRID)
+>8 string TRID \b, TrID defs package
+!:mime application/x-trid-trd
+!:ext trd
+# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/CorelDRAW
# Reference: http://fileformats.archiveteam.org/wiki/CorelDRAW
# Note: Since version 3 CorelDraw Pictures are RIFF based
@@ -351,13 +639,43 @@
>>20 uleshort%100 >0 \b.%u
# for debugging purpose display next chunk like: DISP LIST
#>>22 string x \b, 4th "%-4.4s"
-#>>26 ulelong x \b, 4th SIZE 0x%x
+#>>26 ulelong x \b, 4th SIZE %#x
# for debugging purpose display 5th chunk like: LIST DISP ccmm osfp
#>>(26.l+30) string x \b, 5th "%-4.4s"
# 1st data chunk length 10h implies 16 byte content with version info
>16 ulelong 0x10
>>34 ubyte x %u
>>>33 ubyte >0 \b.%u
+# display information of RIFF based Corel Design formats
+0 name corel-des
+# display second chunk for debugging
+#>8 string x \b, [8]=%.8s
+>12 string x \b, Corel DESIGNER
+!:mime image/x-corel-des
+#!:mime application/x-vnd.corel.designer.document
+# used by Corel Designer with newer versions since 16
+>12 string =fver graphics (root.dat)
+!:ext dat
+# used by Corel Designer templates with older versions with vrsn tag
+>12 string !fver
+# used by Corel Designer with versions 14-15
+>>11 string >D graphics (riffData.cdr)
+!:ext cdr
+# used by Corel Designer with versions 10-12
+>>11 string <E graphics
+!:ext des
+# version indicated by last ASCII char of second chunk tag
+>11 string x \b, version '%-.1s'
+# but vrsn short content is not always version indicator
+# exceptions: 'A'~11.4 'B'~12 'C'~12.5
+>11 string >D
+>>0 use corel-version
+# for debugging purpose display next chunk like: DISP LIST
+#>>22 string x \b, 4th "%-4.4s"
+#>>26 ulelong x \b, 4th SIZE %#x
+# for debugging purpose display 5th chunk like: LIST osfp
+#>>(26.l+30) string x \b, 5th "%-4.4s"
+>4 ulelong+8 x \b, %u bytes
#
# XXX - some of the below may only appear in little-endian form.
#
diff --git a/magic/Magdir/rtf b/magic/Magdir/rtf
index c2e1f273bb02..48a1f28af467 100644
--- a/magic/Magdir/rtf
+++ b/magic/Magdir/rtf
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: rtf,v 1.8 2020/05/17 19:28:49 christos Exp $
+# $File: rtf,v 1.9 2020/12/12 20:01:47 christos Exp $
# rtf: file(1) magic for Rich Text Format (RTF)
#
# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk
@@ -33,7 +33,7 @@
#>6 search/105 \\ansi \b, ANSI
>6 search/502 \\ansi \b, ANSI
>6 default x \b, unknown character set
-# look for explict codepage keyword
+# look for explicit codepage keyword
# "Burow, Steffanie - Im Tal des Schneeleoparden.rtf"
#>5 search/110 \\ansicpg
>5 search/500 \\ansicpg
diff --git a/magic/Magdir/sccs b/magic/Magdir/sccs
index 4717948fdbfc..04e7929921fd 100644
--- a/magic/Magdir/sccs
+++ b/magic/Magdir/sccs
@@ -1,9 +1,9 @@
#------------------------------------------------------------------------------
-# $File: sccs,v 1.7 2017/03/17 21:35:28 christos Exp $
+# $File: sccs,v 1.8 2020/06/20 21:32:52 christos Exp $
# sccs: file(1) magic for SCCS archives
#
-# SCCS archive structure:
+# SCCS v4 archive structure:
# \001h01207
# \001s 00276/00000/00000
# \001d D 1.1 87/09/23 08:09:20 ian 1 0
@@ -17,6 +17,8 @@
# Maybe we should just switch everybody from SCCS to RCS!
# Further, you can't just say '\001h0', because the five-digit number
# is a checksum that could (presumably) have any leading digit,
-# and we don't have regular expression matching yet.
-# Hence the following official kludge:
-8 string \001s\ SCCS archive data
+# Fortunately we have regular expression matching:
+0 string \001h
+>2 regex [0-9][0-9][0-9][0-9][0-9]$
+>>8 string \001s\040 SCCS v4 archive data
+>2 string V6,sum= SCCS v6 archive data
diff --git a/magic/Magdir/sgi b/magic/Magdir/sgi
index 951920477392..fe532e00106d 100644
--- a/magic/Magdir/sgi
+++ b/magic/Magdir/sgi
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: sgi,v 1.23 2018/05/29 02:26:56 christos Exp $
+# $File: sgi,v 1.24 2021/09/13 13:23:53 christos Exp $
# sgi: file(1) magic for Silicon Graphics operating systems and applications
#
# Executable images are handled either in aout (for old-style a.out
@@ -74,25 +74,27 @@
0 string PmNs PCP compiled namespace (V.0)
0 string PmN PCP compiled namespace
>3 string >\0 (V.%1.1s)
-#3 lelong 0x84500526 PCP archive
3 belong 0x84500526 PCP archive
>7 byte x (V.%d)
-#>20 lelong -2 temporal index
-#>20 lelong -1 metadata
-#>20 lelong 0 log volume #0
-#>20 lelong >0 log volume #%d
>20 belong -2 temporal index
>20 belong -1 metadata
>20 belong 0 log volume #0
>20 belong >0 log volume #%d
>24 string >\0 host: %s
+3 belong 0x28500526 PCP archive
+>7 byte x (V.%d)
+>24 belong -2 temporal index
+>24 belong -1 metadata
+>24 belong 0 log volume #0
+>24 belong >0 log volume #%d
+>36 string >\0 host: %s
0 string PCPFolio PCP
>9 string Version: Archive Folio
>18 string >\0 (V.%s)
0 string #pmchart PCP pmchart view
>9 string Version
>17 string >\0 (V%-3.3s)
-0 string #kmchart PCP kmchart view
+0 string #kmchart PCP pmchart view
>9 string Version
>17 string >\0 (V.%s)
0 string pmview PCP pmview config
@@ -112,6 +114,10 @@
>16 string >\0 (V.%1.1s)
3 string pmieconf-pmie PCP pmie config
>17 string >\0 (V.%1.1s)
+0 string #pmlogconf-setup PCP pmlogconf config
+>17 string >\0 (V.%1.1s)
+1 string pmlogconf PCP pmlogger config
+>11 string >\0 (V.%1.1s)
0 string MMV PCP memory mapped values
>4 long x (V.%d)
diff --git a/magic/Magdir/sgml b/magic/Magdir/sgml
index 74ab855b927e..a1c0484ce4dd 100644
--- a/magic/Magdir/sgml
+++ b/magic/Magdir/sgml
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: sgml,v 1.41 2020/06/07 18:16:43 christos Exp $
+# $File: sgml,v 1.42 2020/12/12 20:01:47 christos Exp $
# Type: SVG Vectorial Graphics
# From: Noel Torres <tecnico@ejerciciosresueltos.com>
0 string \<?xml\ version=
@@ -43,7 +43,7 @@
# sgml: file(1) magic for Standard Generalized Markup Language
# HyperText Markup Language (HTML) is an SGML document type,
# from Daniel Quinlan (quinlan@yggdrasil.com)
-# adapted to string extenstions by Anthon van der Neut <anthon@mnt.org)
+# adapted to string extensions by Anthon van der Neut <anthon@mnt.org)
0 search/4096/cWt \<!doctype\ html HTML document text
!:mime text/html
!:strength + 5
diff --git a/magic/Magdir/sinclair b/magic/Magdir/sinclair
index 60088924f4a4..608d779d7b55 100644
--- a/magic/Magdir/sinclair
+++ b/magic/Magdir/sinclair
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: sinclair,v 1.6 2015/11/14 13:38:35 christos Exp $
+# $File: sinclair,v 1.7 2021/04/27 20:35:51 christos Exp $
# sinclair: file(1) sinclair QL
# additions to /etc/magic by Thomas M. Ott (ThMO)
@@ -31,6 +31,8 @@
# Sinclair QL executables (was ThMO)
4 belong 0x4AFB QDOS executable
>9 pstring x '%s'
+6 beshort 0x4AFB QDOS executable
+>9 pstring x '%s'
# Sinclair QL ROM (ThMO)
0 belong =0x4AFB0001 QL plugin-ROM data,
diff --git a/magic/Magdir/sniffer b/magic/Magdir/sniffer
index 25f5b83e3bbc..816ecb907a3e 100644
--- a/magic/Magdir/sniffer
+++ b/magic/Magdir/sniffer
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: sniffer,v 1.28 2020/03/13 16:47:29 christos Exp $
+# $File: sniffer,v 1.30 2021/07/03 13:51:56 christos Exp $
# sniffer: file(1) magic for packet capture files
#
# From: guy@alum.mit.edu (Guy Harris)
@@ -262,8 +262,14 @@
>20 belong&0x03FFFFFF 279 (Elektrobit High Speed Capture and Replay (EBHSCR)
>20 belong&0x03FFFFFF 281 (Broadcom tag
>20 belong&0x03FFFFFF 282 (Broadcom tag (prepended)
+>20 belong&0x03FFFFFF 283 (802.15.4 with TAP
>20 belong&0x03FFFFFF 284 (Marvell DSA
>20 belong&0x03FFFFFF 285 (Marvell EDSA
+>20 belong&0x03FFFFFF 286 (ELEE lawful intercept
+>20 belong&0x03FFFFFF 287 (Z-Wave serial
+>20 belong&0x03FFFFFF 288 (USB 2.0
+>20 belong&0x03FFFFFF 289 (ATSC ALP
+>20 belong&0x03FFFFFF 290 (Event Tracing for Windows
# print default match
>20 default x
>>20 belong x (linktype#%u
diff --git a/magic/Magdir/sosi b/magic/Magdir/sosi
index cfac5a3e2730..88ecc512badb 100644
--- a/magic/Magdir/sosi
+++ b/magic/Magdir/sosi
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: sosi,v 1.1 2019/05/20 17:25:09 christos Exp $
+# $File: sosi,v 1.2 2021/02/23 00:51:10 christos Exp $
# SOSI
# Summary: Systematic Organization of Spatial Information
# Long description: Norwegian text based map format
@@ -23,7 +23,7 @@
# version and a separator.
#
# FIXME figure out how to accept any of [space], [tab], [newline] and
-# [carrige return] as separators, not only line end.
+# [carriage return] as separators, not only line end.
# Not searching for full "OMR=C3=85DE" to match also for non-UTF-8
# character sets
diff --git a/magic/Magdir/spectrum b/magic/Magdir/spectrum
index e8304d7b8cdf..f295979ac48d 100644
--- a/magic/Magdir/spectrum
+++ b/magic/Magdir/spectrum
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: spectrum,v 1.8 2017/09/11 23:51:12 christos Exp $
+# $File: spectrum,v 1.9 2021/04/26 15:56:00 christos Exp $
# spectrum: file(1) magic for Spectrum emulator files.
#
# John Elliott <jce@seasip.demon.co.uk>
@@ -51,7 +51,7 @@
# Hard disk images
0 string RS-IDE\x1a Spectrum .HDF hard disk image
->7 byte x \b, version 0x%02x
+>7 byte x \b, version %#02x
# SZX snapshots (fuse and spectaculator)
# Martin M. S. Pedersen <martin@linux.com>
diff --git a/magic/Magdir/sql b/magic/Magdir/sql
index 28d89e63bf48..5f4629f4b4bf 100644
--- a/magic/Magdir/sql
+++ b/magic/Magdir/sql
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: sql,v 1.22 2019/04/19 00:42:27 christos Exp $
+# $File: sql,v 1.23 2021/07/30 14:53:38 christos Exp $
# sql: file(1) magic for SQL files
#
# From: "Marty Leisner" <mleisner@eng.mc.xerox.com>
@@ -91,32 +91,110 @@
# Version 2 used this format:
0 string **\ This\ file\ contains\ an\ SQLite SQLite 2.x database
+# URL: https://en.wikipedia.org/wiki/SQLite
+# Reference: https://www.sqlite.org/fileformat.html
+# Update: Joerg Jenderek
# Version 3 of SQLite allows applications to embed their own "user version"
# number in the database at offset 60. Later, SQLite added an "application id"
# at offset 68 that is preferred over "user version" for indicating the
# associated application.
#
-0 string SQLite\ format\ 3 SQLite 3.x database
-!:mime application/x-sqlite3
+0 string SQLite\ format\ 3
+# skip DROID fmt-729-signature-id-1053.sqlite by checking for valid page size
+>16 ubeshort >0 SQLite 3.x
+# deprecated
+#!:mime application/x-sqlite3
+!:mime application/vnd.sqlite3
# seldom found extension sqlite3 like in SyncData.sqlite3
# db
+# db3 like: AddrBook.db3 cgipcrvp.db3
+# https://www.maplesoft.com/support/help/Maple/view.aspx?path=worksheet%2freference%2fhelpdatabase
+# help is used for newer Maple help database
+# SQLite database weewx.sdb used by weather software weewx
+# https://www.weewx.com/docs/usersguide.htm
# Avira Antivir use extension "dbe" like in avevtdb.dbe, avguard_tchk.dbe
# Unfortunately extension sqlite also used for other databases starting with string
# "TTCONTAINER" like in tracks.sqlite contentconsumer.sqlite contentproducerrepository.sqlite
# and with string "ZV-zlib" in like extra.sqlite
-!:ext sqlite/sqlite3/db/dbe
->60 belong =0x5f4d544e (Monotone source repository)
->68 belong =0x0f055112 (Fossil checkout)
->68 belong =0x0f055113 (Fossil global configuration)
->68 belong =0x0f055111 (Fossil repository)
->68 belong =0x42654462 (Bentley Systems BeSQLite Database)
->68 belong =0x42654c6e (Bentley Systems Localization File)
->68 belong =0x47504b47 (OGC GeoPackage file)
->68 default x
->>68 belong !0 \b, application id %u
->>60 belong !0 \b, user version %d
->96 belong x \b, last written using SQLite version %d
-
+>>68 belong !0x5CDE09EF database
+!:ext sqlite/sqlite3/db/db3/dbe/sdb/help
+>>68 belong =0x5CDE09EF database
+# maple is used for Maple Workbook
+!:ext maple
+>>60 belong =0x5f4d544e (Monotone source repository)
+# if no known user version then check for Application IDs with default clause
+>>60 belong !0x5f4d544e
+# The "Application ID" set by PRAGMA application_id
+>>>68 belong =0x0f055112 (Fossil checkout)
+>>>68 belong =0x0f055113 (Fossil global configuration)
+>>>68 belong =0x0f055111 (Fossil repository)
+>>>68 belong =0x42654462 (Bentley Systems BeSQLite Database)
+>>>68 belong =0x42654c6e (Bentley Systems Localization File)
+>>>68 belong =0x47504b47 (OGC GeoPackage file)
+# https://www.sqlite.org/src/artifact?ci=trunk&filename=magic.txt
+>>>68 belong =0x47503130 (OGC GeoPackage version 1.0 file)
+>>>68 belong =0x45737269 (Esri Spatially-Enabled Database)
+>>>68 belong =0x4d504258 (MBTiles tileset)
+# https://www.maplesoft.com/support/help/errors/view.aspx?path=Formats/Maple
+>>>68 belong =0x5CDE09EF (Maple Workbook)
+# unknown application ID
+>>>68 default x
+>>>>68 belong !0 \b, application id %u
+# The "user version" as read and set by the user_version pragma like:
+# 1 2 4 5 7 9 10 25 36 43 53 400 416 131073 131074 131075
+>>60 belong !0 \b, user version %d
+# SQLITE_VERSION_NUMBER like: 0 3008011 3016002 3007014 3017000 3022000 3028000 3031001
+>>96 belong x \b, last written using SQLite version %d
+# database page size in bytes; a power of two between 512 and 32768, or 1 for 65536
+# like: 512 1024 often 4096 32768
+>>16 ubeshort !4096 \b, page size %u
+# File format write version. 1 for legacy; 2 for WAL; 0 for corruptDB.sqlite
+>>18 ubyte !1 \b, writer version %u
+# File format read version. 1 for legacy; 2 for WAL; 4 for corruptDB.sqlite
+>>19 ubyte !1 \b, read version %u
+# Bytes of unused "reserved" space at the end of each page. Usually 0
+>>20 ubyte !0 \b, unused bytes %u
+# maximum embedded payload fraction. Must be 64; 1 for corruptDB.sqlite
+>>21 ubyte !64 \b, maximum payload %u
+# Minimum embedded payload fraction. Must be 32; 1 for corruptDB.sqlite
+>>22 ubyte !32 \b, minimum payload %u
+# Leaf payload fraction. Must be 32; 0 for corruptDB.sqlite
+>>23 ubyte !32 \b, leaf payload %u
+# file change counter
+>>24 ubelong x \b, file counter %u
+# Size of the database file in pages
+>>28 ubelong x \b, database pages %u
+# page number of the first freelist trunk page like: 0 2 3 4 5 9
+# 10 13 14 15 16 17 18 19 23 36 39 46 50 136 190 217 307 505 516 561 883 1659
+>>32 ubelong !0 \b, 1st free page %u
+# total number of freelist pages
+>>36 ubelong !0 \b, free pages %u
+# The schema cookie like: 2 3 4 6 7 9 A D E F 13 14 1C 25 2A 2F 33 44 4B 53 5A 5F 62 86 87 8F 91 A8
+>>40 ubelong x \b, cookie %#x
+# the schema format number. Supported formats are 1 2 3 and often 4
+# 3328 for corruptDB.sqlite and 0 for 512 byte storage.sqlite (TorBrowser Firefox Thunderbird)
+>>44 ubelong x \b, schema %u
+# Suggested cache size like: 0 2000
+>>48 ubelong !0 \b, cache page size %u
+# The page number of the largest root b-tree page when in auto-vacuum or incremental-vacuum modes, or zero otherwise.
+>>52 ubelong !0 \b, largest root page %u
+# The database text encoding; a value of 1 means UTF-8; 2 means UTF-16le; 3 means UTF-16be
+#>>56 ubelong x \b, encoding %u
+>>56 ubelong x
+>>>56 ubelong =1 \b, UTF-8
+>>>56 ubelong =2 \b, UTF-16 little endian
+>>>56 ubelong =3 \b, UTF-16 big endian
+# 0 for corruptDB.sqlite and for storage.sqlite with database pages 1 (TorBrowser Firefox Thunderbird)
+# https://mozilla.github.io/firefox-browser-architecture/text/0010-firefox-data-stores.html
+>>>56 default x
+>>>>56 ubelong x \b, unknown %#x encoding
+# True (non-zero) for incremental-vacuum mode; false (zero) otherwiseqy
+>>64 ubelong !0 \b, vacuum mode %u
+# Reserved for expansion. Must be zero
+>>72 uquad !0 \b, reserved %#llx
+# The version-valid-for number like:
+# 1 2 3 4 C F 68h 95h 266h A99h 3DCDh B7CEh
+>>92 ubelong x \b, version-valid-for %u
# SQLite Write-Ahead Log from SQLite version >= 3.7.0
# https://www.sqlite.org/fileformat.html#walformat
diff --git a/magic/Magdir/statistics b/magic/Magdir/statistics
new file mode 100644
index 000000000000..0ceb82cd272f
--- /dev/null
+++ b/magic/Magdir/statistics
@@ -0,0 +1,45 @@
+
+#------------------------------------------------------------------------------
+# $File: statistics,v 1.2 2020/10/08 17:51:53 christos Exp $
+# statistics: file(1) magic for statistics related software
+#
+
+# From Remy Rampin
+
+# Stata is a statistical software tool that was created in 1985. While I
+# don't personally use it, data files in its native (proprietary) format
+# are common (.dta files).
+#
+# Because they are so common, especially in statistical and social
+# sciences, Stata files and SPSS files can be opened by a lot of modern
+# software, for example Python's pandas package provides built-in
+# support for them (read_stata() and read_spss()).
+#
+# I noticed that the magic database includes an entry for SPSS files but
+# not Stata files. Stata files for Stata 13 and newer (formats 117, 118,
+# and 119) always begin with the string "<stata_dta><header>" as per
+# https://www.stata.com/help.cgi?dta#definition
+#
+# The format version number always follows, for example:
+# <stata_dta><header><release>117</release>
+# <stata_dta><header><release>118</release>
+#
+# Therefore the following line would do the trick:
+# 0 string <stata_dta><header> Stata Data File
+#
+# (I'm sure the version number could be captured as well but I did not
+# manage this without a regex)
+#
+# Unfortunately the previous formats (created by Stata before 13, which
+# was released 2013) are harder to recognize. Format 115 starts with the
+# four bytes 0x73010100 or 0x73020100, format 114 with 0x72010100 or
+# 0x72020100, format 113 with 0x71010101 or 0x71020101.
+#
+# For additional reference, the Library of Congress website has an entry
+# for the Stata Data File Format 118:
+# https://www.loc.gov/preservation/digital/formats/fdd/fdd000471.shtml
+#
+# Example of those files can be found on Zenodo:
+# https://zenodo.org/search?page=1&size=20&q=&file_type=dta
+0 string \<stata_dta\>\<header\>\<release\> Stata Data File
+>&0 regex [0-9]* (Release %s)
diff --git a/magic/Magdir/terminfo b/magic/Magdir/terminfo
index fc3bf7458ecd..1b036935b6e0 100644
--- a/magic/Magdir/terminfo
+++ b/magic/Magdir/terminfo
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: terminfo,v 1.11 2019/04/19 00:42:27 christos Exp $
+# $File: terminfo,v 1.12 2021/02/23 00:51:10 christos Exp $
# terminfo: file(1) magic for terminfo
#
# URL: https://invisible-island.net/ncurses/man/term.5.html
@@ -30,7 +30,7 @@
>>12 regex \^[a-zA-Z0-9][a-zA-Z0-9.][^|]* Compiled 32-bit terminfo entry "%-s"
!:mime application/x-terminfo2
#
-# While the compiled terminfo uses little-endian format irregardless of
+# While the compiled terminfo uses little-endian format regardless of
# platform, SystemV screen dumps do not. They came later, and that detail was
# overlooked.
#
diff --git a/magic/Magdir/timezone b/magic/Magdir/timezone
index 9381a0cdd3f9..84e908166769 100644
--- a/magic/Magdir/timezone
+++ b/magic/Magdir/timezone
@@ -1,19 +1,19 @@
#------------------------------------------------------------------------------
-# $File: timezone,v 1.11 2009/09/19 16:28:12 christos Exp $
+# $File: timezone,v 1.13 2021/07/21 17:57:20 christos Exp $
# timezone: file(1) magic for timezone data
#
# from Daniel Quinlan (quinlan@yggdrasil.com)
# this should work on Linux, SunOS, and maybe others
# Added new official magic number for recent versions of the Olson code
-0 string TZif timezone data
+0 name timezone
>4 byte 0 \b, old version
>4 byte >0 \b, version %c
>20 belong 0 \b, no gmt time flags
>20 belong 1 \b, 1 gmt time flag
>20 belong >1 \b, %d gmt time flags
>24 belong 0 \b, no std time flags
->20 belong 1 \b, 1 std time flag
+>24 belong 1 \b, 1 std time flag
>24 belong >1 \b, %d std time flags
>28 belong 0 \b, no leap seconds
>28 belong 1 \b, 1 leap second
@@ -21,9 +21,19 @@
>32 belong 0 \b, no transition times
>32 belong 1 \b, 1 transition time
>32 belong >1 \b, %d transition times
->36 belong 0 \b, no abbreviation chars
->36 belong 1 \b, 1 abbreviation char
->36 belong >1 \b, %d abbreviation chars
+>36 belong 0 \b, no local time types
+>36 belong 1 \b, 1 local time type
+>36 belong >1 \b, %d local time types
+>40 belong 0 \b, no abbreviation chars
+>40 belong 1 \b, 1 abbreviation char
+>40 belong >1 \b, %d abbreviation chars
+
+0 string TZif timezone data
+>51 string TZif \b(slim)
+>>51 use timezone
+>51 default x \b(fat)
+>>0 use timezone
+
0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0 old timezone data
0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0 old timezone data
0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0 old timezone data
diff --git a/magic/Magdir/tplink b/magic/Magdir/tplink
index fcd105dede00..971f428103ba 100644
--- a/magic/Magdir/tplink
+++ b/magic/Magdir/tplink
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: tplink,v 1.5 2020/03/28 23:14:26 christos Exp $
+# $File: tplink,v 1.7 2021/04/26 15:56:00 christos Exp $
# tplink: File magic for openwrt firmware files
# URL: https://wiki.openwrt.org/doc/techref/header
@@ -45,44 +45,44 @@
# total length of the firmware. not always true
>0x7C ubelong x \b, %u bytes or less
# unknown 1
->0x48 ubelong !0 \b, UNKNOWN1 0x%x
+>0x48 ubelong !0 \b, UNKNOWN1 %#x
# md5sum1[16]
#>0x4c ubequad x \b, MD5 %llx
#>>0x54 ubequad x \b%llx
# unknown 2
->0x5c ubelong !0 \b, UNKNOWN2 0x%x
+>0x5c ubelong !0 \b, UNKNOWN2 %#x
# md5sum2[16]
#>0x60 ubequad !0 \b, 2nd MD5 %llx
#>>0x68 ubequad x \b%llx
# unknown 3
->0x70 ubelong !0 \b, UNKNOWN3 0x%x
+>0x70 ubelong !0 \b, UNKNOWN3 %#x
# kernel load address
-#>0x74 ubelong x \b, 0x%x load
+#>0x74 ubelong x \b, %#x load
# kernel entry point
-#>0x78 ubelong x \b, 0x%x entry
+#>0x78 ubelong x \b, %#x entry
# kernel data offset. 200h means direct after header
->0x80 ubelong x \b, at 0x%x
+>0x80 ubelong x \b, at %#x
# kernel data length and 1 space
>0x84 ubelong x %u bytes
# look for kernel type (gzip compressed vmlinux.bin by ./compress)
>(0x80.L) indirect x
# root file system data offset
# WRONG in 5.35 with above indirect expression
->0x88 ubelong x \b, at 0x%x
+>0x88 ubelong x \b, at %#x
# rootfs data length and 1 space
>0x8C ubelong x %u bytes
# in 5.32 only true for offset ~< FILE_BYTES_MAX=9 MB defined in ../../src/file.h
>(0x88.L) indirect x
# 'qshs' for wr940nv1_en_3_13_7_up(111228).bin
#>(0x88.L) string x \b, file system '%.4s'
-#>(0x88.L) ubequad x \b, file system 0x%llx
+#>(0x88.L) ubequad x \b, file system %#llx
# bootloader data offset
->0x90 ubelong !0 \b, at 0x%x
-# bootloader data length only resonable if bootloader offset not null
+>0x90 ubelong !0 \b, at %#x
+# bootloader data length only reasonable if bootloader offset not null
>>0x94 ubelong !0 %u bytes
# pad[354] should be 354 null bytes.
-#>0x9E ubequad !0 \b, padding 0x%llx
+#>0x9E ubequad !0 \b, padding %#llx
# But at 0x120 18 non null bytes in examples like
# wr940nv4_eu_3_16_9_up_boot(160620).bin
# wr940nv6_us_3_18_1_up_boot(171030).bin
-#>0x120 ubequad !0 \b, other padding 0x%llx
+#>0x120 ubequad !0 \b, other padding %#llx
diff --git a/magic/Magdir/uf2 b/magic/Magdir/uf2
new file mode 100644
index 000000000000..49a86d7640c1
--- /dev/null
+++ b/magic/Magdir/uf2
@@ -0,0 +1,72 @@
+
+#------------------------------------------------------------------------------
+# $File: uf2,v 1.3 2021/04/28 01:00:31 christos Exp $
+# uf2: file(1) magic for UF2 firmware image files
+#
+# https://github.com/microsoft/uf2
+#
+# Created by Blake Ramsdell <blaker@gmail.com>
+
+0 string UF2\n UF2 firmware image
+!:ext uf2
+# This is for checking the other magic numbers, do we want to do that?
+#>4 lelong 0x9E5D5157 howdy
+#>>508 lelong 0x0AB16F30 doody
+>8 lelong &0x0001 \b, not main flash
+>8 lelong &0x1000 \b, file container
+>8 lelong &0x2000 \b, family
+
+# To update the UF2 family data, use this fine command
+#
+# families=`curl \
+# https://raw.githubusercontent.com/microsoft/uf2/master/utils/uf2families.json \
+# | jq -r '.[] | ">>28\tlelong\t\(.id)\t\(.description)"' | sort -n -k 3` && \
+# perl -0777 -i -pe \
+# "s/(### BEGIN UF2 FAMILIES\\n).*(\\n### END UF2 FAMILIES)/\$1$families\$2/s" \
+# uf2
+
+### BEGIN UF2 FAMILIES
+>>28 lelong 0x00ff6919 ST STM32L4xx
+>>28 lelong 0x04240bdf ST STM32L5xx
+>>28 lelong 0x16573617 Microchip (Atmel) ATmega32
+>>28 lelong 0x1851780a Microchip (Atmel) SAML21
+>>28 lelong 0x1b57745f Nordic NRF52
+>>28 lelong 0x1c5f21b0 ESP32
+>>28 lelong 0x1e1f432d ST STM32L1xx
+>>28 lelong 0x202e3a91 ST STM32L0xx
+>>28 lelong 0x21460ff0 ST STM32WLxx
+>>28 lelong 0x2abc77ec NXP LPC55xx
+>>28 lelong 0x300f5633 ST STM32G0xx
+>>28 lelong 0x31d228c6 GD32F350
+>>28 lelong 0x4c71240a ST STM32G4xx
+>>28 lelong 0x4fb2d5bd NXP i.MX RT10XX
+>>28 lelong 0x53b80f00 ST STM32F7xx
+>>28 lelong 0x55114460 Microchip (Atmel) SAMD51
+>>28 lelong 0x57755a57 ST STM32F401
+>>28 lelong 0x5a18069b Cypress FX2
+>>28 lelong 0x5d1a0a2e ST STM32F2xx
+>>28 lelong 0x5ee21072 ST STM32F103
+>>28 lelong 0x647824b6 ST STM32F0xx
+>>28 lelong 0x68ed2b88 Microchip (Atmel) SAMD21
+>>28 lelong 0x6b846188 ST STM32F3xx
+>>28 lelong 0x6d0922fa ST STM32F407
+>>28 lelong 0x6db66082 ST STM32H7xx
+>>28 lelong 0x70d16653 ST STM32WBxx
+>>28 lelong 0x7eab61ed ESP8266
+>>28 lelong 0x7f83e793 NXP KL32L2x
+>>28 lelong 0x8fb060fe ST STM32F407VG
+>>28 lelong 0xada52840 Nordic NRF52840
+>>28 lelong 0xbfdd4eee ESP32-S2
+>>28 lelong 0xc47e5767 ESP32-S3
+>>28 lelong 0xd42ba06c ESP32-C3
+>>28 lelong 0xe48bff56 Raspberry Pi RP2040
+### END UF2 FAMILIES
+
+>>28 default x
+>>>28 lelong x %#08x
+>8 lelong&0x2000 0 \b, file size
+>>28 lelong x %#08x
+>8 lelong &0x4000 \b, MD5 checksum present
+>8 lelong &0x8000 \b, extension tags present
+>12 lelong x \b, address %#08x
+>24 lelong x \b, %u total blocks
diff --git a/magic/Magdir/virtual b/magic/Magdir/virtual
index e947ee33d29c..86fe9fcd36d0 100644
--- a/magic/Magdir/virtual
+++ b/magic/Magdir/virtual
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: virtual,v 1.12 2020/02/15 01:20:15 christos Exp $
+# $File: virtual,v 1.14 2021/04/26 15:56:00 christos Exp $
# From: James Nobis <quel@quelrod.net>
# Microsoft hard disk images for:
# Virtual Server
@@ -9,25 +9,25 @@
# URL: http://fileformats.archiveteam.org/wiki/VHD_(Virtual_Hard_Disk)
# Reference: https://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/
# Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc
-0 string conectix Microsoft Disk Image, Virtual Server or Virtual PC
+0 string connectix Microsoft Disk Image, Virtual Server or Virtual PC
# alternative shorter names
-#0 string conectix Microsoft Virtual Hard Disk image
-#0 string conectix Microsoft Virtual HD image
+#0 string connectix Microsoft Virtual Hard Disk image
+#0 string connectix Microsoft Virtual HD image
!:mime application/x-virtualbox-vhd
!:ext vhd
# Features is a bit field used to indicate specific feature support
-#>8 ubelong !0x00000002 \b, Features 0x%x
+#>8 ubelong !0x00000002 \b, Features %#x
# Reserved. This bit must always be set to 1.
-#>8 ubelong &0x00000002 \b, Reserved 0x%x
+#>8 ubelong &0x00000002 \b, Reserved %#x
# File Format Version for the current specification 0x00010000
-#>12 ubelong !0x00010000 \b, Version 0x%8.8x
+#>12 ubelong !0x00010000 \b, Version %#8.8x
# Data Offset only found 0x200
-#>16 ubequad !0x200 \b, Data Offset 0x%llx
-#>16 ubequad x \b, at 0x%llx
+#>16 ubequad !0x200 \b, Data Offset %#llx
+#>16 ubequad x \b, at %#llx
# Dynamic Disk Header cookie like cxsparse
#>(16.Q) string x "%-.8s"
# This field contains a Unicode string (UTF-16) of the parent hard disk filename
-#>(16.Q+64) ubequad x \b, parent name 0x%llx
+#>(16.Q+64) ubequad x \b, parent name %#llx
# Creator Application
# vpc~Microsoft Virtual PC, vs~Microsoft Virtual Server, vbox~VirtualBox, d2v~disk2vhd
>28 string x \b, Creator %-4.4s
@@ -35,7 +35,7 @@
# holds the major/minor version of the application that created the image
>32 ubeshort x %x
>34 ubeshort x \b.%x
-#>32 ubelong x \b, Version 0x%8.8x
+#>32 ubelong x \b, Version %#8.8x
# Creator Host OS: 0x5769326B~Windows (Wi2k), 0x4D616320~Macintosh (Mac)
>36 ubelong x (
>>36 ubelong 0x5769326B \bW2k
@@ -45,30 +45,30 @@
# creation Time in seconds since 1 Jan 2000 UTC~946684800 sec. since Unix Epoch
>24 bedate+946684800 x \b) %s
# Original Size
-#>40 ubequad x \b, o.-Size 0x%llx
+#>40 ubequad x \b, o.-Size %#llx
# Current Size is same as original size, but change when disk is expanded
-#>48 ubequad x \b, Size 0x%llx
+#>48 ubequad x \b, Size %#llx
>48 ubequad x \b, %llu bytes
# Disk Geometry: cylinder, heads, and sectors/track for hard disk
-#>56 ubeshort x \b, Cylinder 0x%x
+#>56 ubeshort x \b, Cylinder %#x
>56 ubeshort x \b, CHS %u
# Heads
-#>58 ubyte x \b, Heads 0x%x
+#>58 ubyte x \b, Heads %#x
>58 ubyte x \b/%u
# Sectors per track
-#>59 ubyte x \b, Sectors 0x%x
+#>59 ubyte x \b, Sectors %#x
>59 ubyte x \b/%u
# Disk Type: 3~Dynamic hard disk
->60 ubelong !0x3 \b, type 0x%x
+>60 ubelong !0x3 \b, type %#x
# Checksum
-#>64 ubelong x \b, cksum 0x%x
+#>64 ubelong x \b, cksum %#x
# universally unique identifier (UUID) to associate a parent with its differencing image
-#>68 ubequad x \b, id 0x%16.16llx
+#>68 ubequad x \b, id %#16.16llx
#>76 ubequad x \b-%16.16llx
# Saved State: 1~Saved State
->84 ubyte !0 \b, State 0x%x
+>84 ubyte !0 \b, State %#x
# Reserved 427 bytes with nils
-#>85 ubequad !0 \b, Reserved 0x%16.16llx
+#>85 ubequad !0 \b, Reserved %#16.16llx
# From: Joerg Jenderek
# URL: https://msdn.microsoft.com/en-us/library/mt740058.aspx
@@ -88,43 +88,43 @@
# Creator[256] like "QEMU v3.0.0", "Microsoft Windows 6.3.9600.18512"
>>8 lestring16 x \b, by %.256s
# The Checksum field is a CRC-32C hash over the entire 4 KB structure
-#>>0x10004 ulelong x \b, CRC 0x%x
+#>>0x10004 ulelong x \b, CRC %#x
# SequenceNumber
->>0x10008 ulequad x \b, sequence 0x%llx
+>>0x10008 ulequad x \b, sequence %#llx
# FileWriteGuid
-#>>0x10010 ubequad x \b, file id 0x%llx
+#>>0x10010 ubequad x \b, file id %#llx
#>>>0x10018 ubequad x \b-%llx
# DataWriteGuid
-#>>0x10020 ubequad x \b, data id 0x%llx
+#>>0x10020 ubequad x \b, data id %#llx
#>>>0x10028 ubequad x \b-%llx
# LogGuid. If this field is zero, then the log is empty or has no valid entries
->>0x10030 ubequad >0 \b, log id 0x%llx
+>>0x10030 ubequad >0 \b, log id %#llx
>>>0x10038 ubequad x \b-%llx
# LogVersion. If not 0 there is a log to replay
->>0x10040 uleshort >0 \b, LogVersion 0x%x
+>>0x10040 uleshort >0 \b, LogVersion %#x
# Version. This field must be set to 1
->>0x10042 uleshort !1 \b, Version 0x%x
+>>0x10042 uleshort !1 \b, Version %#x
# LogLength must be multiples of 1 MB
>>0x10044 ulelong/1048576 >1 \b, LogLength %u MB
# LogOffset (normally 0x100000 when log direct after header); multiples of 1 MB
->>0x10048 ulequad !0x100000 \b, LogOffset 0x%llx
+>>0x10048 ulequad !0x100000 \b, LogOffset %#llx
# Log Entry Signature must be 0x65676F6C~loge
>>(0x10048.q) ulelong !0x65676F6C \b, NO Log Signature
>>(0x10048.q) ulelong =0x65676F6C \b; LOG
# Log Entry Checksum
-#>>>(0x10048.q+4) ulelong x \b, Log CRC 0x%x
+#>>>(0x10048.q+4) ulelong x \b, Log CRC %#x
# Log Entry Length must be a multiple of 4 KB
>>>(0x10048.q+8) ulelong/1024 >4 \b, EntryLength %u KB
# Log Entry Tail must be a multiple of 4 KB
-#>>>(0x10048.q+12) ulelong x \b, Tail 0x%x
+#>>>(0x10048.q+12) ulelong x \b, Tail %#x
# Log Entry SequenceNumber
-#>>>(0x10048.q+16) ulequad x \b, # 0x%llx
+#>>>(0x10048.q+16) ulequad x \b, # %#llx
# Log Entry DescriptorCount may be zero. only 4 bytes in other docs instead 8
-#>>>(0x10048.q+24) ulelong x \b, DescriptorCount 0x%llx
+#>>>(0x10048.q+24) ulelong x \b, DescriptorCount %#llx
# Log Entry Reserved must be set to 0
->>>(0x10048.q+28) ulelong !0 \b, Reserved 0x%x
+>>>(0x10048.q+28) ulelong !0 \b, Reserved %#x
# Log Entry LogGuid
-#>>>(0x10048.q+32) ubequad x \b, Log id 0x%llx
+#>>>(0x10048.q+32) ubequad x \b, Log id %#llx
#>>>(0x10048.q+40) ubequad x \b-%llx
# Log Entry FlushedFileOffset should VHDX size when entry is written.
#>>>(0x10048.q+48) ulequad x \b, FlushedFileOffset %llu
@@ -133,28 +133,28 @@
# filling
#>>>(0x10048.q+64) ulequad >0 \b, filling %llx
# Reserved[4016]
-#>>0x10050 ulequad >0 \b, Reserved 0x%llx
+#>>0x10050 ulequad >0 \b, Reserved %#llx
# VHDX_REGION_TABLE_HEADER Signature 0x69676572~regi at offset 192 KB and 256 KB
>0x30000 ulelong !0x69676572 \b, 1st region INVALID
>0x30000 ulelong =0x69676572 \b; region
# region Checksum. CRC-32C hash over the entire 64-KB table
-#>>0x30004 ulelong x \b, CRC 0x%x
+#>>0x30004 ulelong x \b, CRC %#x
# The EntryCount specifies number of valid entries; Found 2; This must be =< 2047.
>>0x30008 ulelong x \b, %u entries
# reserved must be zero
-#>>0x3000C ulelong !0 \b, RESERVED 0x%x
+#>>0x3000C ulelong !0 \b, RESERVED %#x
# Region Table Entry starts with identifier for the object. often BAT id
>>0x30010 use vhdx-id
# FileOffset
->>0x30020 ulequad x \b, at 0x%llx
+>>0x30020 ulequad x \b, at %#llx
# Length. Specifies the length of the object within the file
-#>>0x30028 ulelong x \b, Length 0x%x
+#>>0x30028 ulelong x \b, Length %#x
# 1 means region entry is required. if region not recognized, then REFUSE to load VHDX
>>0x3002C ulelong x \b, Required %u
# 2nd region entry often metadata id
>>0x30030 use vhdx-id
# 2nd entry FileOffset
->>0x30040 ulequad x \b, at 0x%llx
+>>0x30040 ulequad x \b, at %#llx
# 1 means region entry is required. if region not recognized, then REFUSE to load VHDX
>>0x3004C ulelong x \b, Required %u
# 2nd region
@@ -189,7 +189,7 @@
>>0 use vhdx-id-hex
# in vhdx images show id as hexadecimal
0 name vhdx-id-hex
->0 ubequad x \b, ID 0x%16.16llx
+>0 ubequad x \b, ID %#16.16llx
>8 ubequad x \b-%16.16llx
#
# libvirt
diff --git a/magic/Magdir/vorbis b/magic/Magdir/vorbis
index b4a8f33abdb4..49e75cb2d2e5 100644
--- a/magic/Magdir/vorbis
+++ b/magic/Magdir/vorbis
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: vorbis,v 1.24 2018/03/14 04:38:44 christos Exp $
+# $File: vorbis,v 1.26 2020/08/22 18:30:55 christos Exp $
# vorbis: file(1) magic for Ogg/Vorbis files
#
# From Felix von Leitner <leitner@fefe.de>
@@ -132,11 +132,11 @@
>>>>>>(84.b+117) string 20140122 (1.3.4)
>>>>>>(84.b+117) string 20150105 (1.3.5)
-# non-Vorbis content: Opus https://tools.ietf.org/html/draft-ietf-codec-oggopus-06#section-5
+# non-Vorbis content: Opus https://tools.ietf.org/html/rfc7845#section-5
>>28 string OpusHead \b, Opus audio,
!:mime audio/ogg
>>>36 ubyte >0x0F UNKNOWN VERSION %u,
->>>36 ubyte &0x0F version 0.%d
+>>>36 ubyte&0x0F !0 version 0.%u,
>>>>46 ubyte >1
>>>>>46 ubyte !255 unknown channel mapping family %u,
>>>>>37 ubyte x %u channels
@@ -152,4 +152,4 @@
>>>>>37 ubyte 6 5.1 surround
>>>>>37 ubyte 7 6.1 surround
>>>>>37 ubyte 8 7.1 surround
->>>>40 lelong !0 \b, %u Hz
+>>>>40 lelong !0 \b, %u Hz (Input Sample Rate) \ No newline at end of file
diff --git a/magic/Magdir/windows b/magic/Magdir/windows
index 8a7923fc1c73..4ec0af3e32d6 100644
--- a/magic/Magdir/windows
+++ b/magic/Magdir/windows
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: windows,v 1.31 2020/03/15 16:44:37 christos Exp $
+# $File: windows,v 1.37 2021/04/26 15:56:00 christos Exp $
# windows: file(1) magic for Microsoft Windows
#
# This file is mainly reserved for files where programs
@@ -67,53 +67,53 @@
# \Boot\boot.sdi
!:ext sdi
# MDBtype: 0~Unspecified 1~RAM 2~ROM
->>8 ulequad !0 \b, MDBtype 0x%llx
+>>8 ulequad !0 \b, MDBtype %#llx
# BootCodeOffset
->>16 ulequad !0 \b, BootCodeOffset 0x%llx
+>>16 ulequad !0 \b, BootCodeOffset %#llx
# BootCodeSize
->>24 ulequad !0 \b, BootCodeSize 0x%llx
+>>24 ulequad !0 \b, BootCodeSize %#llx
# VendorID
->>32 ulequad !0 \b, VendorID 0x%llx
+>>32 ulequad !0 \b, VendorID %#llx
# DeviceID
->>40 ulequad !0 \b, DeviceID 0x%llx
+>>40 ulequad !0 \b, DeviceID %#llx
# DeviceModel
->>48 ulequad !0 \b, DeviceModel 0x%llx
+>>48 ulequad !0 \b, DeviceModel %#llx
>>>56 ulequad !0 \b%llx
# DeviceRole
->>64 ulequad !0 \b, DeviceRole 0x%llx
+>>64 ulequad !0 \b, DeviceRole %#llx
# Reserved1; reserved fields and gaps between BLOBs are padded with \0
-#>>72 ulequad !0 \b, Reserved1 0x%llx
+#>>72 ulequad !0 \b, Reserved1 %#llx
# RuntimeGUID
->>80 ulequad !0 \b, RuntimeGUID 0x%llx
+>>80 ulequad !0 \b, RuntimeGUID %#llx
>>>88 ulequad !0 \b%llx
# RuntimeOEMrev
->>96 ulequad !0 \b, RuntimeOEMrev 0x%llx
+>>96 ulequad !0 \b, RuntimeOEMrev %#llx
# Reserved2
-#>>104 ulequad !0 \b, Reserved2 0x%llx
+#>>104 ulequad !0 \b, Reserved2 %#llx
# BLOB alignment value in pages, as specified in sdimgr /pack: 1~4K 2~8k
>>112 ulequad !0 \b, PageAlignment %llu
# Reserved3[48]
-#>>120 ulequad !0 \b, Reserved3 0x%llx
+#>>120 ulequad !0 \b, Reserved3 %#llx
# SDI checksum 39h
->>0x1f8 ulequad x \b, checksum 0x%llx
+>>0x1f8 ulequad x \b, checksum %#llx
# BLOBtype[8] \0-padded: PART, WIM , BOOT, LOAD, DISK
>>0x400 string >\0 \b, type %-3.8s
# 0~non-filesystem 7~NTFS 6~BIGFAT
->>>0x420 ulequad !0 (0x%llx)
+>>>0x420 ulequad !0 (%#llx)
# ATTRibutes
->>>0x408 ulequad !0 0x%llx attributes
+>>>0x408 ulequad !0 %#llx attributes
# Offset
->>>0x410 ulequad x at 0x%llx
+>>>0x410 ulequad x at %#llx
# print 1 space after size and then handles NTFS boot sector by ./filesystems
>>>0x418 ulequad >0 %llu bytes
>>>>(0x410.l) indirect x
# 2nd BLOB: WIM
>>0x440 string >\0 \b, type %-3.8s
->>>0x428 ulequad !0 (0x%llx)
+>>>0x428 ulequad !0 (%#llx)
# ATTRibutes
->>>0x448 ulequad !0 0x%llx attributes
+>>>0x448 ulequad !0 %#llx attributes
# Offset
->>>0x450 ulequad x at 0x%llx
+>>>0x450 ulequad x at %#llx
>>>0x458 ulequad >0 %llu bytes
>>>>(0x450.l) indirect x
# 3rd BLOB
@@ -139,13 +139,13 @@
# apparently a version number: 2 for older like Vista, 3, 4 Windows 10
>0 ulelong >2 \b, version %u
# apparently the size of the header: often 10h in older Windows, 14h, 18h
->4 ulelong !0x10 \b, header size 0x%x
+>4 ulelong !0x10 \b, header size %#x
#>4 ulelong !0x10 \b, header size %u
# apparently the size of the file: always 0x00010000~64KiB
# the file is acceptable to BOOTMGR only if it is exactly 64 KiB
->8 ulelong !0x00010000 \b, file size 0x%x
+>8 ulelong !0x00010000 \b, file size %#x
# size of valid data, in bytes: C8h 50h 172h 5D5Ch
->0xc ulelong x \b, 0x%x valid bytes
+>0xc ulelong x \b, %#x valid bytes
# skip header and jump to first bootstat entry and display information
>(0x4.l-1) ubyte x
>>&0 use bootstat-entry
@@ -164,24 +164,24 @@
#>0x00 ubequad x \b, ENTRY %16.16llx
# size of entry, in bytes: 40h(init) 78h(launced) 9Ch
#>0x18 ulelong x \b; entry size %u
->0x18 ulelong x \b; entry size 0x%x
+>0x18 ulelong x \b; entry size %#x
# time stamp, in seconds
->0x00 ulelong x \b, 0x%x seconds
+>0x00 ulelong x \b, %#x seconds
# always zero, significance unknown
>0x04 ulelong !0 \b, not null %u
# GUID of event source; but empty if event source is BOOTMGR
->0x08 ubequad !0 \b, GUID 0x%16.16llx
+>0x08 ubequad !0 \b, GUID %#16.16llx
>>0x10 ubequad x \b%16.16llx
# severity code: 1~informational 3~errors
->0x1C ulelong !1 \b, severity 0x%x
+>0x1C ulelong !1 \b, severity %#x
# apparently a version number: 2
>0x20 ulelong !2 \b, version %u
# event identifier 1~log file initialised 11h~boot application launched
-#>0x24 ulelong x \b, event 0x%x
+#>0x24 ulelong x \b, event %#x
>0x24 ulelong !1
->>0x24 ulelong !0x11 \b, event 0x%x
+>>0x24 ulelong !0x11 \b, event %#x
# entry data; size depends on event identifier
-#>0x28 ubequad x \b, data 0x%16.16llx
+#>0x28 ubequad x \b, data %#16.16llx
>0x24 ulelong =0x1 \b, Init
# always 0, significance unknown
>>0x34 uleshort !0 \b, not null %u
@@ -248,7 +248,7 @@
>>>2 leshort 0x27 x.y
>>>2 leshort 0x33 95
>>>2 default x y.z
->>>>2 leshort x 0x%x
+>>>>2 leshort x %#x
# to complete message string like "MS Windows 3.x help file"
>>>2 leshort x help
# GenDate often older than file creation date
@@ -307,39 +307,39 @@
!:mime application/x-winhelp
!:ext bmk
## FirstFreeBlock normally FFFFFFFFh 10h for *ANN
-##>>8 lelong x \b, FirstFreeBlock 0x%8.8x
+##>>8 lelong x \b, FirstFreeBlock %#8.8x
# EntireFileSize
>>12 lelong x \b, %d bytes
## ReservedSpace normally 042Fh AFh for *.ANN
-#>>(4.l) lelong x \b, ReservedSpace 0x%8.8x
+#>>(4.l) lelong x \b, ReservedSpace %#8.8x
## UsedSpace normally 0426h A6h for *.ANN
-#>>(4.l+4) lelong x \b, UsedSpace 0x%8.8x
+#>>(4.l+4) lelong x \b, UsedSpace %#8.8x
## FileFlags normally 04...
-#>>(4.l+5) lelong x \b, FileFlags 0x%8.8x
+#>>(4.l+5) lelong x \b, FileFlags %#8.8x
## file header magic 0x293B
-#>>(4.l+9) uleshort x \b, file header magic 0x%4.4x
+#>>(4.l+9) uleshort x \b, file header magic %#4.4x
## file header Flags 0x0402
-#>>(4.l+11) uleshort x \b, file header Flags 0x%4.4x
+#>>(4.l+11) uleshort x \b, file header Flags %#4.4x
## file header PageSize 0400h 80h for *.ANN
-#>>(4.l+13) uleshort x \b, PageSize 0x%4.4x
+#>>(4.l+13) uleshort x \b, PageSize %#4.4x
## Structure[16] z4
#>>(4.l+15) string >\0 \b, Structure_"%-.16s"
## MustBeZero 0
-#>>(4.l+31) uleshort x \b, MustBeZero 0x%4.4x
+#>>(4.l+31) uleshort x \b, MustBeZero %#4.4x
## PageSplits
-#>>(4.l+33) uleshort x \b, PageSplits 0x%4.4x
+#>>(4.l+33) uleshort x \b, PageSplits %#4.4x
## RootPage
-#>>(4.l+35) uleshort x \b, RootPage 0x%4.4x
+#>>(4.l+35) uleshort x \b, RootPage %#4.4x
## MustBeNegOne 0xffff
-#>>(4.l+37) uleshort x \b, MustBeNegOne 0x%4.4x
+#>>(4.l+37) uleshort x \b, MustBeNegOne %#4.4x
## TotalPages 1
-#>>(4.l+39) uleshort x \b, TotalPages 0x%4.4x
+#>>(4.l+39) uleshort x \b, TotalPages %#4.4x
## NLevels 0x0001
-#>>(4.l+41) uleshort x \b, NLevels 0x%4.4x
+#>>(4.l+41) uleshort x \b, NLevels %#4.4x
## TotalBtreeEntries
-#>>(4.l+43) ulelong x \b, TotalBtreeEntries 0x%8.8x
+#>>(4.l+43) ulelong x \b, TotalBtreeEntries %#8.8x
## pages of the B+ tree
-#>>(4.l+47) ubequad x \b, PageStart 0x%16.16llx
+#>>(4.l+47) ubequad x \b, PageStart %#16.16llx
# start with colon or semicolon for comment line like Back2Life.cnt
0 regex \^(:|;)
@@ -576,6 +576,13 @@
>>&0 regex/c \^(options)]\r\n Microsoft HTML Help Project
!:mime text/plain
!:ext hhp
+# From: Joerg Jenderek
+# URL: https://documentation.basis.com/BASISHelp/WebHelp/b3odbc/obdcdriv_character_translation.htm
+# Reference: https://www.garykessler.net/library/file_sigs.html
+# Note: stored in directory %WINDIR%\SysWOW64 or %WINDIR%\system
+>>&0 regex/c \^(Windows\ Latin) Windows codepage translator
+!:mime text/plain
+!:ext cpx
# unknown keyword after opening bracket
>>&0 default x
#>>>&0 string/c x UNKNOWN [%s
@@ -590,7 +597,7 @@
>>>>>&0 ubyte x
# characters, digits, underscore and white space followed by right bracket
# terminated by CR implies section line to skip BOOTLOG.TXT DETLOG.TXT
->>>>>>&-1 regex \^([A-Za-z0-9_\(\)\ ]+)\]\r Generic INItialization configuration [%-.40s
+>>>>>>&-1 regex/T \^([A-Za-z0-9_\(\)\ ]+)\]\r Generic INItialization configuration [%-.40s
# NETDEF.INF multiarc.ini
#!:mime application/x-setupscript
!:mime application/x-wine-extension-ini
@@ -660,7 +667,7 @@
# UNKNOWN1 0x01000000
# UNKNOWN2 0x02000000
>4 ulelong&0x03000180 >0 \b, flags
->>4 ulelong x 0x%x
+>>4 ulelong x %#x
>4 ulelong&0x00000001 0x00000001 \b, unicoded
>4 ulelong&0x00000002 0x00000002 \b, has strings
>4 ulelong&0x00000004 0x00000004 \b, src URL
@@ -671,16 +678,16 @@
# >4 ulelong&0x00000100 0x00000100 \b, UNKNOWN
# >4 ulelong&0x01000000 0x01000000 \b, UNKNOWN1
# >4 ulelong&0x02000000 0x02000000 \b, UNKNOWN2
-#>8 ulelong x \b, InfSubstValueListOffset 0x%x
+#>8 ulelong x \b, InfSubstValueListOffset %#x
# many 0, 1 lmouusb.PNF, 2 linkfx10.PNF , f webfdr16.PNF
# , 6 bth.PNF, 9 usbport.PNF, d netnwifi.PNF, 10h nettcpip.PNF
-#>12 uleshort x \b, InfSubstValueCount 0x%x
+#>12 uleshort x \b, InfSubstValueCount %#x
# only < 9 found: 8 hcw85b64.PNF
-#>14 uleshort x \b, InfVersionDatumCount 0x%x
+#>14 uleshort x \b, InfVersionDatumCount %#x
# only found values lower 0x0000ffff ??
-#>16 ulelong x \b, InfVersionDataSize 0x%x
+#>16 ulelong x \b, InfVersionDataSize %#x
# only found positive values lower 0x00ffFFff for InfVersionDataOffset
->20 ulelong x \b, at 0x%x
+>20 ulelong x \b, at %#x
>4 ulelong&0x00000001 =0x00000001
# case independent: CatalogFile Class DriverVer layoutfile LayoutFile SetupClass signature Signature
>>(20.l) lestring16 x "%s"
@@ -693,18 +700,18 @@
>0 uleshort <0x0102
# only found values lower 0x00ffFFff
# often 70 but also 78h for corelist.PNF
-# >>32 ulelong x \b, StringTableBlockOffset 0x%x
-# >>36 ulelong x \b, StringTableBlockSize 0x%x
-# >>40 ulelong x \b, InfSectionCount 0x%x
-# >>44 ulelong x \b, InfSectionBlockOffset 0x%x
-# >>48 ulelong x \b, InfSectionBlockSize 0x%x
-# >>52 ulelong x \b, InfLineBlockOffset 0x%x
-# >>56 ulelong x \b, InfLineBlockSize 0x%x
-# >>60 ulelong x \b, InfValueBlockOffset 0x%x
-# >>64 ulelong x \b, InfValueBlockSize 0x%x
+# >>32 ulelong x \b, StringTableBlockOffset %#x
+# >>36 ulelong x \b, StringTableBlockSize %#x
+# >>40 ulelong x \b, InfSectionCount %#x
+# >>44 ulelong x \b, InfSectionBlockOffset %#x
+# >>48 ulelong x \b, InfSectionBlockSize %#x
+# >>52 ulelong x \b, InfLineBlockOffset %#x
+# >>56 ulelong x \b, InfLineBlockSize %#x
+# >>60 ulelong x \b, InfValueBlockOffset %#x
+# >>64 ulelong x \b, InfValueBlockSize %#x
# WinDirPathOffset
# like 58h, which means direct after PNF header
-#>>68 ulelong x \b, at 0x%x
+#>>68 ulelong x \b, at %#x
>>68 ulelong x
>>>4 ulelong&0x00000001 =0x00000001
#>>>>(68.l) ubequad =0x43003a005c005700
@@ -725,18 +732,18 @@
# seldom C:\ instead empty
>>>>>(72.l) string x OsLoaderPath "%s"
# 1fdh
-#>>>76 uleshort x \b, StringTableHashBucketCount 0x%x
+#>>>76 uleshort x \b, StringTableHashBucketCount %#x
# only 407h found
>>>78 uleshort !0x409 \b, LanguageID %x
#>>>78 uleshort =0x409 \b, LanguageID %x
# InfSourcePathOffset often 0
->>>80 ulelong >0 \b, at 0x%x
+>>>80 ulelong >0 \b, at %#x
>>>>4 ulelong&0x00000001 =0x00000001
>>>>>(80.l) lestring16 x SourcePath "%s"
>>>>4 ulelong&0x00000001 !0x00000001
>>>>>(80.l) string >\0 SourcePath "%s"
# OriginalInfNameOffset often 0
->>>84 ulelong >0 \b, at 0x%x
+>>>84 ulelong >0 \b, at %#x
>>>>4 ulelong&0x00000001 =0x00000001
>>>>>(84.l) lestring16 x InfName "%s"
>>>>4 ulelong&0x00000001 !0x00000001
@@ -744,7 +751,7 @@
# for newer Windows like Vista, 7 , 8.1 , 10
>0 uleshort >0x0101
->>80 ulelong x \b, at 0x%x WinDirPath
+>>80 ulelong x \b, at %#x WinDirPath
>>>4 ulelong&0x00000001 0x00000001
# normally unicoded C:\Windows
#>>>>(80.l) ubequad =0x43003a005c005700
@@ -754,7 +761,7 @@
# language id: 0 407h~german 409h~English_US
>>90 uleshort !0x409 \b, LanguageID %x
#>>90 uleshort =0x409 \b, LanguageID %x
->>92 ulelong >0 \b, at 0x%x
+>>92 ulelong >0 \b, at %#x
>>>4 ulelong&0x00000001 0x00000001
# language string like: de-DE en-US
>>>>(92.l) lestring16 x language %s
@@ -809,7 +816,7 @@
# Media Sequence Number
>>>>>60 uleshort >1 \b, sequence %u
# Password Encryption Algorithm (3)
->>>>>62 uleshort >0 \b, 0x%x encrypted
+>>>>>62 uleshort >0 \b, %#x encrypted
# Soft Filemark Block Size * 512 (2)
#>>>>>64 uleshort =2 \b, soft size %u*512
>>>>>64 uleshort !2 \b, soft size %u*512
@@ -838,7 +845,7 @@
# size of password name (0,1Ch)
#>>>>>76 uleshort >0 \b, password size %4.4x
# Software Vendor ID (CBEh)
->>>>>86 uleshort x \b, software (0x%x)
+>>>>>86 uleshort x \b, software (%#x)
# size of Software Name (6Eh)
>>>>>80 uleshort >0
# offset of Software Name (1C8h,1CAh,1D0h)
@@ -890,9 +897,9 @@
>0x40 ubyte 0x7b
>>0x40 string x %-.38s
# do not know how this log version correlates to program version
->0x140 ulelong x \b, version 0x%x
+>0x140 ulelong x \b, version %#x
# NumRecs
-#>0x144 ulelong x \b, 0x%4.4x records
+#>0x144 ulelong x \b, %#4.4x records
# EndOffset means files size
>0x148 ulelong x \b, %u bytes
# Flags 5 25h 35h
@@ -918,9 +925,39 @@
# directory like C:\Program Files\GIMP 2
>>>>&0 lestring16 x \b, %-.42s
+# URL: https://jrsoftware.org/ishelp/index.php?topic=setup_signeduninstaller
+# Reference:https://github.com/jrsoftware/issrc/blob/main/Projects/Struct.pas
+# From: Joerg Jenderek
+0 string Inno\ Setup\ Messages\ (
+# null padded til 0x40 boundary
+>0x38 quad 0 InnoSetup messages
+!:mime application/x-innosetup-msg
+# unins000.msg, unins001.msg, ...
+!:ext msg
+# version like 5.1.1 5.1.11 5.5.0 5.5.3 6.0.0
+>>0x15 string x \b, version %.5s
+# look for 6th char of version string or terminating right parentheses
+>>>0x1a ubyte !0x29 \b%c
+# NumMessages
+>>0x40 ulelong x \b, %u messages
+# TotalSize: Cardinal;
+#>>0x44 ulelong x \b, TotalSize %u
+# NotTotalSize: Cardinal;
+#>>0x48 ulelong x \b, NotTotalSize %u
+# CRCMessages: Longint;
+#>>0x4C ulelong x \b, CRC %#x
+>>0x40 ulelong x
+# (u) after version means unicoded messages
+>>>0x1c search/2 (u) (UTF-16),
+>>>>0x50 lestring16 x %s
+# ASCII coded message
+>>>0x1c default x (ASCII),
+>>>>0x50 string x %s
+
# Windows Imaging (WIM) Image
-# Update: Joerg Jenderek at Mar 2019
+# Update: Joerg Jenderek at Mar 2019, 2021
# URL: https://en.wikipedia.org/wiki/Windows_Imaging_Format
+# http://fileformats.archiveteam.org/wiki/Windows_Imaging_Format
# Reference: https://download.microsoft.com/download/f/e/f/
# fefdc36e-392d-4678-9e4e-771ffa2692ab/Windows%20Imaging%20File%20Format.rtf
# Note: verified by like `7z t boot.wim` `wiminfo install.esd --header`
@@ -936,21 +973,27 @@
# TO avoid in file version 5.36 error like
# Magdir/windows, 760: Warning: Current entry does not yet have a description
# file: could not find any valid magic files! (No error)
-# splitted WIM
+# split WIM
>16 ulelong &0x00000008 (SWM
!:ext swm
# usPartNumber; 1, unless the file was split into multiple parts
>>40 uleshort x \b %u
# usTotalParts; The total number of WIM file parts in a spanned set
>>42 uleshort x \b of %u) image
-# non splitted WIM
+# non split WIM
>16 ulelong ^0x00000008
# https://wimlib.net/man1/wimmount.html
# solid WIMs; version 3584; usually contain LZMS-compressed and the .esd extension
>>12 ulelong 3584 (ESD) image
!:ext esd
->>12 ulelong !3584 (WIM) image
-!:ext wim
+>>12 ulelong !3584 (
+# look for archive member RunTime.xml like in Microsoft.Windows.Cosa.Desktop.Client.ppkg
+>>>156 search/68233/s RunTime.xml \bWindows provisioning package)
+!:ext ppkg
+# if is is not a Windows provisioning package, then it is a WIM
+>>>156 default x \bWIM) image
+# second disk image part created by Microsoft's RecoveryDrive.exe has name Reconstruct.WIM2
+!:ext wim/wim2
>0 string/b WLPWM\000\000\000 \b, wimlib pipable format
# cbSize size of the WIM header in bytes like 208
#>8 ulelong x \b, headersize %u
@@ -963,7 +1006,7 @@
# 1-based index of the bootable image of the WIM, or 0 if no image is bootable
>0x78 ulelong >0 \b, bootable no. %u
# dwFlags
-#>16 ulelong x \b, flags 0x%8.8x
+#>16 ulelong x \b, flags %#8.8x
#define FLAG_HEADER_COMPRESSION 0x00000002
#define FLAG_HEADER_READONLY 0x00000004
#define FLAG_HEADER_SPANNED 0x00000008
@@ -990,21 +1033,21 @@
# dwCompressionSize; Uncompressed chunk size for resources or 0 if uncompressed
#>20 ulelong >0 \b, chunk size %u bytes
# gWIMGuid
-#>24 ubequad x \b, GUID 0x%16.16llx
+#>24 ubequad x \b, GUID %#16.16llx
#>>32 ubequad x \b%16.16llx
# rhOffsetTable; the location of the resource lookup table
# wim_reshdr_disk[24]= u8 size_in_wim[7] + u8 flags + le64 offset_in_wim + le64 uncompressed_size
-#>48 ubequad x \b, rhOffsetTable 0x%16.16llx
+#>48 ubequad x \b, rhOffsetTable %#16.16llx
# rhXmlData; the location of the XML data
-#>0x50 ulelong x \b, at 0x%8.8x
+#>0x50 ulelong x \b, at %#8.8x
# NOT WORKING \xff\xfe<\0W\0I\0M\0
#>(0x50.l) ubequad x \b, xml=%16.16llx
# rhBootMetadata; the location of the metadata resource
-#>0x60 ubequad x \b, rhBootMetadata 0x%16.16llx
+#>0x60 ubequad x \b, rhBootMetadata %#16.16llx
# rhIntegrity; the location of integrity table used to verify files
-#>0x7c ubequad x \b, rhIntegrity 0x%16.16llx
+#>0x7c ubequad x \b, rhIntegrity %#16.16llx
# Unused[60]
-#>148 ubequad !0 \b,unused 0x%16.16llx
+#>148 ubequad !0 \b,unused %#16.16llx
#
# From: Joerg Jenderek
@@ -1018,7 +1061,7 @@
!:ext mig
>0x18 string =MRTS without password
# data offset with 1 space at end
->>0x1c ulelong+0x38 x \b, at 0x%x
+>>0x1c ulelong+0x38 x \b, at %#x
# look for zlib compressed data by ./compress
>>(0x1c.l+0x38) ubyte x
>>>&-1 indirect x
diff --git a/magic/Magdir/wordprocessors b/magic/Magdir/wordprocessors
index 7f3c4e8a429e..297addfb114c 100644
--- a/magic/Magdir/wordprocessors
+++ b/magic/Magdir/wordprocessors
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: wordprocessors,v 1.24 2020/05/22 19:28:47 christos Exp $
+# $File: wordprocessors,v 1.26 2021/08/21 12:45:34 christos Exp $
# wordprocessors: file(1) magic fo word processors.
#
####### PWP file format used on Smith Corona Personal Word Processors:
@@ -275,10 +275,13 @@
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/StarOffice
+# Reference: http://mark0.net/download/triddefs_xml.7z
+# /defs/t/thm-staroffice.trid.xml
# Note: used in Star-, Open- and Libre-Office
# named as soffice.StarConfigFile.6 or OpenOffice.org configuration by others
0 ubeshort 0x0400
-#>(2.s+8) ubequad x \b, gap 0x%16.16llx
+# non nil gap
+#>(2.s+8) ubequad x \b, gap %#16.16llx
# test for null value in gap after theme name maybe unreliable
#>(2.s+9) ubyte 0 \b, 0-byte
# look for keyword GALRESRV near the end
@@ -288,19 +291,27 @@
#>0 search/19299 GALRESRV \b, GALRESRV FOUND
#>2 uleshort x \b, name length %u
# skip file2147.chk by check for positive name length like for sg16.thm "3D"
->2 uleshort >0 StarOffice Gallery theme
+>2 uleshort >0
+# skip dBase printer form T6.PRF with misidentified gallery
+# name :\DBASE\IV\T6.txts by check for 1st object name or RESRV keyword
+# https://www.clicketyclick.dk/databases/xbase/xbase/dbase_ex.zip
+# template/t6/with_data/T6.PRF
+# by first char of object name or RESRV part of keyword GALRESRV
+>>(2.s+13) ubyte >0x1F StarOffice Gallery theme
!:mime application/x-stargallery-thm
+# thm is also used for JPEG thumbnail images
!:ext thm
-# gallery name
->>2 pstring/h x %s
+# gallery name often 1 word like: 3D sounds Diagrams Flussdiagramme Fotos
+# or like private://gallery/hidden/imgppt "Cisco - WAN - LAN"
+>>>2 pstring/h x %s
# number of objects
->>(2.s+4) ulelong x \b, %u object
+>>>(2.s+4) ulelong x \b, %u object
# plural s
->>(2.s+4) ulelong !1 \bs
+>>>(2.s+4) ulelong !1 \bs
# if available then display first object name
->>(2.s+4) ulelong >0
+>>>(2.s+4) ulelong >0
# partial file name, URL or internal name like "dd2*" of 1st object or RESRV
->>>(2.s+11) pstring/h x \b, 1st %s
+>>>>(2.s+11) pstring/h x \b, 1st %s
# From: Joerg Jenderek
# URL: http://fileformats.archiveteam.org/wiki/StarOffice_Gallery
@@ -309,7 +320,7 @@
# $HOME/.config/libreoffice/4/user/gallery
0 string SGA3 StarOffice Gallery thumbnails
# Unknown like 0x04000?0001000142
-#>4 ubequad x \b, UNKNOWN 0x%16.16llx
+#>4 ubequad x \b, UNKNOWN %#16.16llx
#!:mime application/x-sdg
!:mime application/x-stargallery-sdg
!:ext sdg
diff --git a/magic/Magdir/wsdl b/magic/Magdir/wsdl
index 35edafc2f535..1c9e60aaa29d 100644
--- a/magic/Magdir/wsdl
+++ b/magic/Magdir/wsdl
@@ -1,13 +1,13 @@
#------------------------------------------------------------------------------
-# $File: wsdl,v 1.5 2019/04/19 00:42:27 christos Exp $
+# $File: wsdl,v 1.6 2021/04/26 15:56:00 christos Exp $
# wsdl: PHP WSDL Cache, https://www.php.net/manual/en/book.soap.php
# Cache format extracted from source:
# https://svn.php.net/viewvc/php/php-src/trunk/ext/soap/php_sdl.c?revision=HEAD&view=markup
# Requires file >= 5.05
# By Elan Ruusamae <glen@delfi.ee>, Patryk Zawadzki <patrys@pld-linux.org>, 2010-2011
0 string wsdl PHP WSDL cache,
->4 byte x version 0x%02x
+>4 byte x version %#02x
>6 ledate x \b, created %s
# uri
diff --git a/magic/Magdir/xenix b/magic/Magdir/xenix
index fb83faa876ed..01d894ca9d98 100644
--- a/magic/Magdir/xenix
+++ b/magic/Magdir/xenix
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: xenix,v 1.11 2017/03/17 21:35:28 christos Exp $
+# $File: xenix,v 1.14 2021/04/26 15:56:00 christos Exp $
# xenix: file(1) magic for Microsoft Xenix
#
# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
@@ -13,25 +13,35 @@
#
0 string core core file (Xenix)
# URL: http://www.polarhome.com/service/man/?qf=86rel&tf=2&of=Xenix
+# http://fileformats.archiveteam.org/wiki/OMF
# Reference: http://www.azillionmonkeys.com/qed/Omfg.pdf
# Update: Joerg Jenderek
# recordtype~TranslatorHEADerRecord
0 byte 0x80
-# GRR: line above is too general as it catches also Extensible storage engine DataBase
+# GRR: line above is too general as it catches also Extensible storage engine DataBase,
+# all lif files like forth.lif hpcc88.lif lex90b.lif ( See ./lif)
+# and all compressed DEGAS low-res bitmaps like: MUNCHIE.PC1 PIDER1.PC1
# skip examples like GENA.SND Switch.Snd by looking for record length maximal 1024-3
>1 uleshort <1022
-# skip examples like GAME.PICTURE Strange.Pic by looking for positiv record length
+# skip examples like GAME.PICTURE Strange.Pic by looking for positive record length
>>1 uleshort >0
-# skip examples like Xtable.Data FRACTAL.GEN SHR.VIEW by looking for positiv string length
+# skip examples like Xtable.Data FRACTAL.GEN SHR.VIEW by looking for positive string length
>>>3 ubyte >0
-# skip examples like OMBRE.6 with "UUUUUU" by looking for filename like "hello.c"
->>>>4 regex [a-zA-Z_/]{1,8}[.] 8086 relocatable (Microsoft)
+# skip examples like OMBRE.6 with "UUUUUU" name by looking for valid high second record type
+>>>>(1.s+3) ubyte >0x6D 8086 relocatable (Microsoft)
#!:mime application/octet-stream
!:mime application/x-object
-!:ext o/a
+!:ext obj/o/a
+# T-module name often source name like "hello.c" or "jmppm32.asm" in JMPPM32.OBJ or
+# "kbhit" in KBHITS.OBJ or "CAUSEWAY_KERNAL" in CWAPI.OBJ
>>>>>3 pstring x \b, "%s"
+# data length probably lower 256 according to TrID obj_omf.trid.xml
+>>>>>1 uleshort x \b, 1st record data length %u
# checksum
-#>>>>>(3.b+4) ubyte x \b, checksum 0x%2.2x
+#>>>>>(3.b+4) ubyte x \b, checksum %#2.2x
+# second recordtype: 96h~LNAMES 88h~COMENT 8CH~EXTDEF
+>>>>>(1.s+3) ubyte x \b, 2nd record type %#x
+>>>>>(1.s+4) uleshort x \b, 2nd record data length %u
0 leshort 0xff65 x.out
>2 string __.SYMDEF randomized
>0 byte x archive
diff --git a/magic/Magdir/xilinx b/magic/Magdir/xilinx
index a5219778d390..b5443cbfd278 100644
--- a/magic/Magdir/xilinx
+++ b/magic/Magdir/xilinx
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: xilinx,v 1.8 2017/03/17 21:35:28 christos Exp $
+# $File: xilinx,v 1.9 2021/04/26 15:56:00 christos Exp $
# This is Aaron's attempt at a MAGIC file for Xilinx .bit files.
# Xilinx-Magic@RevRagnarok.com
# Got the info from FPGA-FAQ 0026
@@ -33,7 +33,7 @@
# Then 'e'
>>>>>>>>>>>&1 string e
# And length of data
->>>>>>>>>>>>&0 belong x - data length 0x%x
+>>>>>>>>>>>>&0 belong x - data length %#x
# Raw bitstream files
0 long 0xffffffff
diff --git a/magic/Magdir/xwindows b/magic/Magdir/xwindows
index 7118cadd05ef..37ed8744c5b8 100644
--- a/magic/Magdir/xwindows
+++ b/magic/Magdir/xwindows
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: xwindows,v 1.11 2019/04/19 00:42:27 christos Exp $
+# $File: xwindows,v 1.12 2021/08/24 08:31:10 christos Exp $
# xwindows: file(1) magic for various X/Window system file formats.
# Compiled X Keymap
@@ -33,3 +33,11 @@
!:mime image/x-xcursor
>10 leshort x version %d
>>8 leshort x \b.%d
+
+# X bitmap https://en.wikipedia.org/wiki/X_BitMap
+0 search/2048 #define\040
+>&0 regex [a-zA-Z0-9]+_width\040 xbm image
+>>&0 regex [0-9]* (%sx
+>>>&0 string \n#define\040
+>>>>&0 regex [a-zA-Z0-9]+_height\040
+>>>>>&0 regex [0-9]* \b%s)
diff --git a/magic/Magdir/yara b/magic/Magdir/yara
index e581c433a56a..6156cc63bc3d 100644
--- a/magic/Magdir/yara
+++ b/magic/Magdir/yara
@@ -1,7 +1,7 @@
#------------------------------------------------------------------------------
-# $File: yara,v 1.3 2019/04/19 00:42:27 christos Exp $
+# $File: yara,v 1.4 2021/04/26 15:56:00 christos Exp $
# yara: file(1) magic for https://virustotal.github.io/yara/
#
@@ -14,4 +14,4 @@
>>8 byte 8 created with version 3.4.0
>>8 byte 11 created with version 3.5.0
>>8 default x
->>>8 byte x development version 0x%02x
+>>>8 byte x development version %#02x
diff --git a/magic/Magdir/zfs b/magic/Magdir/zfs
index 77675ed7196f..5cb0fdd180be 100644
--- a/magic/Magdir/zfs
+++ b/magic/Magdir/zfs
@@ -36,7 +36,7 @@
# full 64-bit values.
# Big-endian values
-8 string \000\000\000\002\365\272\313\254 ZFS shapshot (big-endian machine),
+8 string \000\000\000\002\365\272\313\254 ZFS snapshot (big-endian machine),
>20 belong x version %u,
>32 belong 0 type: NONE,
>32 belong 1 type: META,
@@ -66,7 +66,7 @@
>56 string >\0 name: '%s'
# Little-endian values
-8 string \254\313\272\365\002\000\000\000 ZFS shapshot (little-endian machine),
+8 string \254\313\272\365\002\000\000\000 ZFS snapshot (little-endian machine),
>16 lelong x version %u,
>32 lelong 0 type: NONE,
>32 lelong 1 type: META,
diff --git a/magic/Magdir/zip b/magic/Magdir/zip
index cea7ceaac074..d70434db0f29 100644
--- a/magic/Magdir/zip
+++ b/magic/Magdir/zip
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: zip,v 1.4 2020/03/03 13:46:52 christos Exp $
+# $File: zip,v 1.7 2021/04/26 15:56:00 christos Exp $
# zip: file(1) magic for zip files; this is not use
# Note the version of magic in archive is currently stronger, this is
# just an example until negative offsets are supported better
@@ -7,6 +7,7 @@
# Zip Central Directory record
0 name zipcd
>0 string PK\001\002 Zip archive data
+!:mime application/zip
>>4 leshort x \b, made by
>>4 use zipversion
>>4 use ziphost
@@ -18,7 +19,7 @@
>>10 use zipcompression
# URL: https://en.wikipedia.org/wiki/Zip_(file_format)
-# reference: https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.6.TXT
+# reference: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT (Version: 6.3.9)
# Zip known compressions
0 name zipcompression
>0 leshort 0 \bstore
@@ -33,11 +34,12 @@
#>0 leshort 13 \bReserved by PKWARE
>0 leshort 14 \blzma
#>0 leshort 15 \bReserved by PKWARE
->0 leshort 16 \bCMPSC Compression
+>0 leshort 16 \bCMPSC (IBM z/OS)
#>0 leshort 17 \bReserved by PKWARE
>0 leshort 18 \bIBM TERSE
->0 leshort 19 \bIBM LZ77
-# https://support.winzip.com/hc/en-us/articles/115012122828-Compression-method-used-for-this-file-is-94
+>0 leshort 19 \bIBM LZ77 (z/Architecture)
+>0 leshort 20 \bZstd (deprecated)
+>0 leshort 93 \bZstd
>0 leshort 94 \bMP3
>0 leshort 95 \bxz
>0 leshort 96 \bJpeg
@@ -97,7 +99,7 @@
>1 ubyte 18 OS/400
>1 ubyte 19 OS X
# unused
-#>1 ubyte >19 unused 0x%x
+#>1 ubyte >19 unused %#x
# Zip End Of Central Directory record
-22 string PK\005\006
diff --git a/magic/Makefile.am b/magic/Makefile.am
index 510c7eb3b6de..ab8c43287ef8 100644
--- a/magic/Makefile.am
+++ b/magic/Makefile.am
@@ -1,5 +1,5 @@
#
-# $File: Makefile.am,v 1.157 2020/05/21 16:22:47 christos Exp $
+# $File: Makefile.am,v 1.172 2021/10/07 15:41:22 christos Exp $
#
MAGIC_FRAGMENT_BASE = Magdir
MAGIC_DIR = $(top_srcdir)/magic
@@ -7,12 +7,13 @@ MAGIC_FRAGMENT_DIR = $(MAGIC_DIR)/$(MAGIC_FRAGMENT_BASE)
pkgdata_DATA = magic.mgc
-EXTRA_DIST = \
+MAGIC_FRAGMENTS = \
$(MAGIC_DIR)/Header \
$(MAGIC_DIR)/Localstuff \
$(MAGIC_FRAGMENT_DIR)/acorn \
$(MAGIC_FRAGMENT_DIR)/adi \
$(MAGIC_FRAGMENT_DIR)/adventure \
+$(MAGIC_FRAGMENT_DIR)/aes \
$(MAGIC_FRAGMENT_DIR)/algol68 \
$(MAGIC_FRAGMENT_DIR)/allegro \
$(MAGIC_FRAGMENT_DIR)/alliant \
@@ -28,11 +29,13 @@ $(MAGIC_FRAGMENT_DIR)/application \
$(MAGIC_FRAGMENT_DIR)/applix \
$(MAGIC_FRAGMENT_DIR)/apt \
$(MAGIC_FRAGMENT_DIR)/archive \
+$(MAGIC_FRAGMENT_DIR)/arm \
$(MAGIC_FRAGMENT_DIR)/asf \
$(MAGIC_FRAGMENT_DIR)/assembler \
$(MAGIC_FRAGMENT_DIR)/asterix \
$(MAGIC_FRAGMENT_DIR)/att3b \
$(MAGIC_FRAGMENT_DIR)/audio \
+$(MAGIC_FRAGMENT_DIR)/avm \
$(MAGIC_FRAGMENT_DIR)/basis \
$(MAGIC_FRAGMENT_DIR)/beetle \
$(MAGIC_FRAGMENT_DIR)/ber \
@@ -44,10 +47,12 @@ $(MAGIC_FRAGMENT_DIR)/blackberry \
$(MAGIC_FRAGMENT_DIR)/blcr \
$(MAGIC_FRAGMENT_DIR)/blender \
$(MAGIC_FRAGMENT_DIR)/blit \
+$(MAGIC_FRAGMENT_DIR)/bm \
$(MAGIC_FRAGMENT_DIR)/bout \
$(MAGIC_FRAGMENT_DIR)/bsdi \
$(MAGIC_FRAGMENT_DIR)/bsi \
$(MAGIC_FRAGMENT_DIR)/btsnoop \
+$(MAGIC_FRAGMENT_DIR)/bytecode \
$(MAGIC_FRAGMENT_DIR)/c-lang \
$(MAGIC_FRAGMENT_DIR)/c64 \
$(MAGIC_FRAGMENT_DIR)/cad \
@@ -69,6 +74,7 @@ $(MAGIC_FRAGMENT_DIR)/console \
$(MAGIC_FRAGMENT_DIR)/convex \
$(MAGIC_FRAGMENT_DIR)/coverage \
$(MAGIC_FRAGMENT_DIR)/cracklib \
+$(MAGIC_FRAGMENT_DIR)/crypto \
$(MAGIC_FRAGMENT_DIR)/ctags \
$(MAGIC_FRAGMENT_DIR)/ctf \
$(MAGIC_FRAGMENT_DIR)/cubemap \
@@ -123,7 +129,6 @@ $(MAGIC_FRAGMENT_DIR)/gpu \
$(MAGIC_FRAGMENT_DIR)/grace \
$(MAGIC_FRAGMENT_DIR)/graphviz \
$(MAGIC_FRAGMENT_DIR)/gringotts \
-$(MAGIC_FRAGMENT_DIR)/guile \
$(MAGIC_FRAGMENT_DIR)/hardware \
$(MAGIC_FRAGMENT_DIR)/hitachi-sh \
$(MAGIC_FRAGMENT_DIR)/hp \
@@ -148,12 +153,14 @@ $(MAGIC_FRAGMENT_DIR)/keepass \
$(MAGIC_FRAGMENT_DIR)/kerberos \
$(MAGIC_FRAGMENT_DIR)/kicad \
$(MAGIC_FRAGMENT_DIR)/kml \
+$(MAGIC_FRAGMENT_DIR)/lammps \
$(MAGIC_FRAGMENT_DIR)/lecter \
$(MAGIC_FRAGMENT_DIR)/lex \
$(MAGIC_FRAGMENT_DIR)/lif \
$(MAGIC_FRAGMENT_DIR)/linux \
$(MAGIC_FRAGMENT_DIR)/lisp \
$(MAGIC_FRAGMENT_DIR)/llvm \
+$(MAGIC_FRAGMENT_DIR)/locoscript \
$(MAGIC_FRAGMENT_DIR)/lua \
$(MAGIC_FRAGMENT_DIR)/luks \
$(MAGIC_FRAGMENT_DIR)/m4 \
@@ -195,11 +202,11 @@ $(MAGIC_FRAGMENT_DIR)/music \
$(MAGIC_FRAGMENT_DIR)/nasa \
$(MAGIC_FRAGMENT_DIR)/natinst \
$(MAGIC_FRAGMENT_DIR)/ncr \
-$(MAGIC_FRAGMENT_DIR)/neko \
$(MAGIC_FRAGMENT_DIR)/netbsd \
$(MAGIC_FRAGMENT_DIR)/netscape \
$(MAGIC_FRAGMENT_DIR)/netware \
$(MAGIC_FRAGMENT_DIR)/news \
+$(MAGIC_FRAGMENT_DIR)/nim-lang \
$(MAGIC_FRAGMENT_DIR)/nitpicker \
$(MAGIC_FRAGMENT_DIR)/numpy \
$(MAGIC_FRAGMENT_DIR)/oasis \
@@ -221,11 +228,13 @@ $(MAGIC_FRAGMENT_DIR)/pbf \
$(MAGIC_FRAGMENT_DIR)/pbm \
$(MAGIC_FRAGMENT_DIR)/pc88 \
$(MAGIC_FRAGMENT_DIR)/pc98 \
+$(MAGIC_FRAGMENT_DIR)/pcjr \
$(MAGIC_FRAGMENT_DIR)/pdf \
$(MAGIC_FRAGMENT_DIR)/pdp \
$(MAGIC_FRAGMENT_DIR)/perl \
$(MAGIC_FRAGMENT_DIR)/pgf \
$(MAGIC_FRAGMENT_DIR)/pgp \
+$(MAGIC_FRAGMENT_DIR)/pgp-binary-keys \
$(MAGIC_FRAGMENT_DIR)/pkgadd \
$(MAGIC_FRAGMENT_DIR)/plan9 \
$(MAGIC_FRAGMENT_DIR)/plus5 \
@@ -236,6 +245,7 @@ $(MAGIC_FRAGMENT_DIR)/project \
$(MAGIC_FRAGMENT_DIR)/psdbms \
$(MAGIC_FRAGMENT_DIR)/psl \
$(MAGIC_FRAGMENT_DIR)/pulsar \
+$(MAGIC_FRAGMENT_DIR)/puzzle \
$(MAGIC_FRAGMENT_DIR)/pwsafe \
$(MAGIC_FRAGMENT_DIR)/pyramid \
$(MAGIC_FRAGMENT_DIR)/python \
@@ -272,6 +282,7 @@ $(MAGIC_FRAGMENT_DIR)/spectrum \
$(MAGIC_FRAGMENT_DIR)/sql \
$(MAGIC_FRAGMENT_DIR)/ssh \
$(MAGIC_FRAGMENT_DIR)/ssl \
+$(MAGIC_FRAGMENT_DIR)/statistics \
$(MAGIC_FRAGMENT_DIR)/sun \
$(MAGIC_FRAGMENT_DIR)/sylk \
$(MAGIC_FRAGMENT_DIR)/symbos \
@@ -287,6 +298,7 @@ $(MAGIC_FRAGMENT_DIR)/tplink \
$(MAGIC_FRAGMENT_DIR)/troff \
$(MAGIC_FRAGMENT_DIR)/tuxedo \
$(MAGIC_FRAGMENT_DIR)/typeset \
+$(MAGIC_FRAGMENT_DIR)/uf2 \
$(MAGIC_FRAGMENT_DIR)/unicode \
$(MAGIC_FRAGMENT_DIR)/unisig \
$(MAGIC_FRAGMENT_DIR)/unknown \
@@ -325,6 +337,11 @@ $(MAGIC_FRAGMENT_DIR)/zilog \
$(MAGIC_FRAGMENT_DIR)/zip \
$(MAGIC_FRAGMENT_DIR)/zyxel
+EXTRA_DIST = \
+$(MAGIC_DIR)/scripts/create_filemagic_flac \
+$(MAGIC_FRAGMENTS)
+
+
MAGIC = magic.mgc
CLEANFILES = ${MAGIC} $(MAGIC_FRAGMENT_DIR)/Localstuff
@@ -338,9 +355,9 @@ FILE_COMPILE = $(top_builddir)/src/file${EXEEXT}
FILE_COMPILE_DEP = $(FILE_COMPILE)
endif
-${MAGIC}: $(EXTRA_DIST) $(FILE_COMPILE_DEP)
+${MAGIC}: $(MAGIC_FRAGMENTS) $(FILE_COMPILE_DEP)
@rm -fr magic
- @mkdir magic && cp -p $(EXTRA_DIST) magic
+ @mkdir magic && cp -p $(MAGIC_FRAGMENTS) magic
@(if expr "${FILE_COMPILE}" : '.*/.*' > /dev/null; then \
echo "Using ${FILE_COMPILE} to generate ${MAGIC}" > /dev/null; \
else \
diff --git a/magic/Makefile.in b/magic/Makefile.in
index 26b863df142f..71eb168d0a2e 100644
--- a/magic/Makefile.in
+++ b/magic/Makefile.in
@@ -92,7 +92,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -274,18 +275,19 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
#
-# $File: Makefile.am,v 1.157 2020/05/21 16:22:47 christos Exp $
+# $File: Makefile.am,v 1.172 2021/10/07 15:41:22 christos Exp $
#
MAGIC_FRAGMENT_BASE = Magdir
MAGIC_DIR = $(top_srcdir)/magic
MAGIC_FRAGMENT_DIR = $(MAGIC_DIR)/$(MAGIC_FRAGMENT_BASE)
pkgdata_DATA = magic.mgc
-EXTRA_DIST = \
+MAGIC_FRAGMENTS = \
$(MAGIC_DIR)/Header \
$(MAGIC_DIR)/Localstuff \
$(MAGIC_FRAGMENT_DIR)/acorn \
$(MAGIC_FRAGMENT_DIR)/adi \
$(MAGIC_FRAGMENT_DIR)/adventure \
+$(MAGIC_FRAGMENT_DIR)/aes \
$(MAGIC_FRAGMENT_DIR)/algol68 \
$(MAGIC_FRAGMENT_DIR)/allegro \
$(MAGIC_FRAGMENT_DIR)/alliant \
@@ -301,11 +303,13 @@ $(MAGIC_FRAGMENT_DIR)/application \
$(MAGIC_FRAGMENT_DIR)/applix \
$(MAGIC_FRAGMENT_DIR)/apt \
$(MAGIC_FRAGMENT_DIR)/archive \
+$(MAGIC_FRAGMENT_DIR)/arm \
$(MAGIC_FRAGMENT_DIR)/asf \
$(MAGIC_FRAGMENT_DIR)/assembler \
$(MAGIC_FRAGMENT_DIR)/asterix \
$(MAGIC_FRAGMENT_DIR)/att3b \
$(MAGIC_FRAGMENT_DIR)/audio \
+$(MAGIC_FRAGMENT_DIR)/avm \
$(MAGIC_FRAGMENT_DIR)/basis \
$(MAGIC_FRAGMENT_DIR)/beetle \
$(MAGIC_FRAGMENT_DIR)/ber \
@@ -317,10 +321,12 @@ $(MAGIC_FRAGMENT_DIR)/blackberry \
$(MAGIC_FRAGMENT_DIR)/blcr \
$(MAGIC_FRAGMENT_DIR)/blender \
$(MAGIC_FRAGMENT_DIR)/blit \
+$(MAGIC_FRAGMENT_DIR)/bm \
$(MAGIC_FRAGMENT_DIR)/bout \
$(MAGIC_FRAGMENT_DIR)/bsdi \
$(MAGIC_FRAGMENT_DIR)/bsi \
$(MAGIC_FRAGMENT_DIR)/btsnoop \
+$(MAGIC_FRAGMENT_DIR)/bytecode \
$(MAGIC_FRAGMENT_DIR)/c-lang \
$(MAGIC_FRAGMENT_DIR)/c64 \
$(MAGIC_FRAGMENT_DIR)/cad \
@@ -342,6 +348,7 @@ $(MAGIC_FRAGMENT_DIR)/console \
$(MAGIC_FRAGMENT_DIR)/convex \
$(MAGIC_FRAGMENT_DIR)/coverage \
$(MAGIC_FRAGMENT_DIR)/cracklib \
+$(MAGIC_FRAGMENT_DIR)/crypto \
$(MAGIC_FRAGMENT_DIR)/ctags \
$(MAGIC_FRAGMENT_DIR)/ctf \
$(MAGIC_FRAGMENT_DIR)/cubemap \
@@ -396,7 +403,6 @@ $(MAGIC_FRAGMENT_DIR)/gpu \
$(MAGIC_FRAGMENT_DIR)/grace \
$(MAGIC_FRAGMENT_DIR)/graphviz \
$(MAGIC_FRAGMENT_DIR)/gringotts \
-$(MAGIC_FRAGMENT_DIR)/guile \
$(MAGIC_FRAGMENT_DIR)/hardware \
$(MAGIC_FRAGMENT_DIR)/hitachi-sh \
$(MAGIC_FRAGMENT_DIR)/hp \
@@ -421,12 +427,14 @@ $(MAGIC_FRAGMENT_DIR)/keepass \
$(MAGIC_FRAGMENT_DIR)/kerberos \
$(MAGIC_FRAGMENT_DIR)/kicad \
$(MAGIC_FRAGMENT_DIR)/kml \
+$(MAGIC_FRAGMENT_DIR)/lammps \
$(MAGIC_FRAGMENT_DIR)/lecter \
$(MAGIC_FRAGMENT_DIR)/lex \
$(MAGIC_FRAGMENT_DIR)/lif \
$(MAGIC_FRAGMENT_DIR)/linux \
$(MAGIC_FRAGMENT_DIR)/lisp \
$(MAGIC_FRAGMENT_DIR)/llvm \
+$(MAGIC_FRAGMENT_DIR)/locoscript \
$(MAGIC_FRAGMENT_DIR)/lua \
$(MAGIC_FRAGMENT_DIR)/luks \
$(MAGIC_FRAGMENT_DIR)/m4 \
@@ -468,11 +476,11 @@ $(MAGIC_FRAGMENT_DIR)/music \
$(MAGIC_FRAGMENT_DIR)/nasa \
$(MAGIC_FRAGMENT_DIR)/natinst \
$(MAGIC_FRAGMENT_DIR)/ncr \
-$(MAGIC_FRAGMENT_DIR)/neko \
$(MAGIC_FRAGMENT_DIR)/netbsd \
$(MAGIC_FRAGMENT_DIR)/netscape \
$(MAGIC_FRAGMENT_DIR)/netware \
$(MAGIC_FRAGMENT_DIR)/news \
+$(MAGIC_FRAGMENT_DIR)/nim-lang \
$(MAGIC_FRAGMENT_DIR)/nitpicker \
$(MAGIC_FRAGMENT_DIR)/numpy \
$(MAGIC_FRAGMENT_DIR)/oasis \
@@ -494,11 +502,13 @@ $(MAGIC_FRAGMENT_DIR)/pbf \
$(MAGIC_FRAGMENT_DIR)/pbm \
$(MAGIC_FRAGMENT_DIR)/pc88 \
$(MAGIC_FRAGMENT_DIR)/pc98 \
+$(MAGIC_FRAGMENT_DIR)/pcjr \
$(MAGIC_FRAGMENT_DIR)/pdf \
$(MAGIC_FRAGMENT_DIR)/pdp \
$(MAGIC_FRAGMENT_DIR)/perl \
$(MAGIC_FRAGMENT_DIR)/pgf \
$(MAGIC_FRAGMENT_DIR)/pgp \
+$(MAGIC_FRAGMENT_DIR)/pgp-binary-keys \
$(MAGIC_FRAGMENT_DIR)/pkgadd \
$(MAGIC_FRAGMENT_DIR)/plan9 \
$(MAGIC_FRAGMENT_DIR)/plus5 \
@@ -509,6 +519,7 @@ $(MAGIC_FRAGMENT_DIR)/project \
$(MAGIC_FRAGMENT_DIR)/psdbms \
$(MAGIC_FRAGMENT_DIR)/psl \
$(MAGIC_FRAGMENT_DIR)/pulsar \
+$(MAGIC_FRAGMENT_DIR)/puzzle \
$(MAGIC_FRAGMENT_DIR)/pwsafe \
$(MAGIC_FRAGMENT_DIR)/pyramid \
$(MAGIC_FRAGMENT_DIR)/python \
@@ -545,6 +556,7 @@ $(MAGIC_FRAGMENT_DIR)/spectrum \
$(MAGIC_FRAGMENT_DIR)/sql \
$(MAGIC_FRAGMENT_DIR)/ssh \
$(MAGIC_FRAGMENT_DIR)/ssl \
+$(MAGIC_FRAGMENT_DIR)/statistics \
$(MAGIC_FRAGMENT_DIR)/sun \
$(MAGIC_FRAGMENT_DIR)/sylk \
$(MAGIC_FRAGMENT_DIR)/symbos \
@@ -560,6 +572,7 @@ $(MAGIC_FRAGMENT_DIR)/tplink \
$(MAGIC_FRAGMENT_DIR)/troff \
$(MAGIC_FRAGMENT_DIR)/tuxedo \
$(MAGIC_FRAGMENT_DIR)/typeset \
+$(MAGIC_FRAGMENT_DIR)/uf2 \
$(MAGIC_FRAGMENT_DIR)/unicode \
$(MAGIC_FRAGMENT_DIR)/unisig \
$(MAGIC_FRAGMENT_DIR)/unknown \
@@ -598,6 +611,10 @@ $(MAGIC_FRAGMENT_DIR)/zilog \
$(MAGIC_FRAGMENT_DIR)/zip \
$(MAGIC_FRAGMENT_DIR)/zyxel
+EXTRA_DIST = \
+$(MAGIC_DIR)/scripts/create_filemagic_flac \
+$(MAGIC_FRAGMENTS)
+
MAGIC = magic.mgc
CLEANFILES = ${MAGIC} $(MAGIC_FRAGMENT_DIR)/Localstuff
@IS_CROSS_COMPILE_FALSE@FILE_COMPILE = $(top_builddir)/src/file${EXEEXT}
@@ -827,9 +844,9 @@ uninstall-am: uninstall-pkgdataDATA
.PRECIOUS: Makefile
-${MAGIC}: $(EXTRA_DIST) $(FILE_COMPILE_DEP)
+${MAGIC}: $(MAGIC_FRAGMENTS) $(FILE_COMPILE_DEP)
@rm -fr magic
- @mkdir magic && cp -p $(EXTRA_DIST) magic
+ @mkdir magic && cp -p $(MAGIC_FRAGMENTS) magic
@(if expr "${FILE_COMPILE}" : '.*/.*' > /dev/null; then \
echo "Using ${FILE_COMPILE} to generate ${MAGIC}" > /dev/null; \
else \
diff --git a/magic/scripts/create_filemagic_flac b/magic/scripts/create_filemagic_flac
new file mode 100755
index 000000000000..0ecfb17277b6
--- /dev/null
+++ b/magic/scripts/create_filemagic_flac
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+
+## bash script to generate file magic support for flac.
+## https://github.com/file/file/blob/master/magic/Magdir/audio
+## below "#some common sample rates" (line 471), ie:
+## >>17 belong&0xfffff0 0x2ee000 \b, 192 kHz
+
+LANG=C
+
+target=magic/Magdir/audio
+
+## construct static list of sample rates based on standard crystal
+## oscillator frequencies.
+## 16.384 MHz Unknown audio application
+## (16384 kHz = 32 kHz * 512 = 32 * 2^9)
+## 22.5792 MHz Redbook/CD
+## (22579.2 kHz = 44.1kHz * 512 = 44.1 * 2^9)
+## also used: 11.2896, 16.9344, 33.8688 and 45.1584
+## 24.576 MHz DAT/Video
+## (24576 kHz = 48 kHz * 512 = 48 * 2^9)
+## also used: 49.1520
+
+## 33.8688 > 16.9344
+## 36.864 > 18.432000
+declare -a a_ground_fs=(16384000 22579200 24576000)
+
+## multiply ground clock frequencies by 1953 to get usable base
+## frequencies, for instance:
+## DAT/video: 24.576 MHz * 1000000 / 512 = 48000Hz
+## Redbook/CD: 22.5792 MHz * 1000000 / 512 = 44100Hz
+## use base rates for calculating derived rates
+declare -a samplerates
+## min divider: fs/n
+def_fs_n=512
+min_fs_n=4
+## start at base_fs/(def_fs*min_fs)
+## add each derived sample rate to the array
+for base_fs in "${a_ground_fs[@]}"; do
+ min_fs=$( echo "${base_fs} / ( ${def_fs_n} * ${min_fs_n} )" | bc)
+ ## max multiplier: fs*n*min_fs
+ max_fs_n=$(( 8 * min_fs_n ))
+ n=${max_fs_n}
+ while [[ ${n} -ge 1 ]]; do
+ sample_rate=$(( min_fs * n ))
+ samplerates+=(${sample_rate})
+ n=$(( n / 2 ))
+ done
+done
+
+declare -a stripped_rates
+declare -a lines
+for samplerate in "${samplerates[@]}"; do
+ ## use bc with sed to convert and format Hz to kHz
+ stripped_rate="$(LANG=C bc <<< "scale=5; ${samplerate} / 1000" | \
+ sed 's#[0\.]*$##g')"
+ ## only add uniq sample rates (should be necessary
+ if [[ ! "${stripped_rates[@]}" =~ ${stripped_rate} ]]; then
+ printf -v line ">>17\tbelong&%#-15x\t%#08x\t%s, %s kHz\n" \
+ "16777200" \
+ "$(( samplerate * 16 ))" \
+ "\b" \
+ "${stripped_rate}"
+ stripped_rates+=("${stripped_rate}")
+ lines+=("${line}")
+ fi
+
+done
+printf "## start cutting >>> \n"
+## print out the formatted lines
+printf "%s" "${lines[@]}" | sort -k5 -n
+printf "## <<< stop cutting\n"
diff --git a/python/CHANGELOG.md b/python/CHANGELOG.md
index ac3c0c0e9455..2634986b9234 100644
--- a/python/CHANGELOG.md
+++ b/python/CHANGELOG.md
@@ -1,5 +1,10 @@
# Python `file-magic` Log of Changes
+## `0.4.1`
+
+- Create threadlocal objects so that the `detect_from_*` methods work properly
+
+
## `0.4.0`
- Sync with current version of file:
diff --git a/python/Makefile.am b/python/Makefile.am
index f2d3412b8658..9588f085df0f 100644
--- a/python/Makefile.am
+++ b/python/Makefile.am
@@ -1,4 +1,4 @@
EXTRA_DIST = LICENSE CHANGELOG.md README.md example.py magic.py setup.py \
- tests.py
+ tests.py file_magic/__init__.py
diff --git a/python/Makefile.in b/python/Makefile.in
index 9a9c880b7ba6..759bd2b648c9 100644
--- a/python/Makefile.in
+++ b/python/Makefile.in
@@ -91,7 +91,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -243,7 +244,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
EXTRA_DIST = LICENSE CHANGELOG.md README.md example.py magic.py setup.py \
- tests.py
+ tests.py file_magic/__init__.py
all: all-am
diff --git a/python/file_magic/__init__.py b/python/file_magic/__init__.py
new file mode 100644
index 000000000000..c71f1242950a
--- /dev/null
+++ b/python/file_magic/__init__.py
@@ -0,0 +1 @@
+name = 'file_magic'
diff --git a/python/magic.py b/python/magic.py
index 4c1ff7a7de7a..4b074f31c6ca 100644
--- a/python/magic.py
+++ b/python/magic.py
@@ -5,6 +5,7 @@ Python bindings for libmagic
'''
import ctypes
+import threading
from collections import namedtuple
@@ -50,6 +51,14 @@ MAGIC_NO_CHECK_ENCODING = NO_CHECK_ENCODING = 2097152
MAGIC_NO_CHECK_BUILTIN = NO_CHECK_BUILTIN = 4173824
+MAGIC_PARAM_INDIR_MAX = PARAM_INDIR_MAX = 0
+MAGIC_PARAM_NAME_MAX = PARAM_NAME_MAX = 1
+MAGIC_PARAM_ELF_PHNUM_MAX = PARAM_ELF_PHNUM_MAX = 2
+MAGIC_PARAM_ELF_SHNUM_MAX = PARAM_ELF_SHNUM_MAX = 3
+MAGIC_PARAM_ELF_NOTES_MAX = PARAM_ELF_NOTES_MAX = 4
+MAGIC_PARAM_REGEX_MAX = PARAM_REGEX_MAX = 5
+MAGIC_PARAM_BYTES_MAX = PARAM_BYTES_MAX = 6
+
FileMagic = namedtuple('FileMagic', ('mime_type', 'encoding', 'name'))
@@ -106,6 +115,14 @@ _errno = _libraries['magic'].magic_errno
_errno.restype = c_int
_errno.argtypes = [magic_t]
+_getparam = _libraries['magic'].magic_getparam
+_getparam.restype = c_int
+_getparam.argtypes = [magic_t, c_int, c_void_p]
+
+_setparam = _libraries['magic'].magic_setparam
+_setparam.restype = c_int
+_setparam.argtypes = [magic_t, c_int, c_void_p]
+
class Magic(object):
def __init__(self, ms):
@@ -231,6 +248,24 @@ class Magic(object):
"""
return _errno(self._magic_t)
+ def getparam(self, param):
+ """
+ Returns the param value if successful and -1 if the parameter
+ was unknown.
+ """
+ v = c_int()
+ i = _getparam(self._magic_t, param, byref(v))
+ if i == -1:
+ return -1
+ return v.value
+
+ def setparam(self, param, value):
+ """
+ Returns 0 if successful and -1 if the parameter was unknown.
+ """
+ v = c_int(value)
+ return _setparam(self._magic_t, param, byref(v))
+
def open(flags):
"""
@@ -241,11 +276,25 @@ def open(flags):
# Objects used by `detect_from_` functions
-mime_magic = Magic(_open(MAGIC_MIME))
-mime_magic.load()
-none_magic = Magic(_open(MAGIC_NONE))
-none_magic.load()
-
+class MagicDetect(object):
+ def __init__(self):
+ self.mime_magic = Magic(_open(MAGIC_MIME))
+ self.mime_magic.load()
+ self.none_magic = Magic(_open(MAGIC_NONE))
+ self.none_magic.load()
+
+ def __del__(self):
+ self.mime_magic.close()
+ self.none_magic.close()
+
+threadlocal = threading.local()
+
+def _detect_make():
+ v = getattr(threadlocal, "magic_instance", None)
+ if v is None:
+ v = MagicDetect()
+ setattr(threadlocal, "magic_instance", v)
+ return v
def _create_filemagic(mime_detected, type_detected):
try:
@@ -262,9 +311,9 @@ def detect_from_filename(filename):
Returns a `FileMagic` namedtuple.
'''
-
- return _create_filemagic(mime_magic.file(filename),
- none_magic.file(filename))
+ x = _detect_make()
+ return _create_filemagic(x.mime_magic.file(filename),
+ x.none_magic.file(filename))
def detect_from_fobj(fobj):
@@ -274,8 +323,9 @@ def detect_from_fobj(fobj):
'''
file_descriptor = fobj.fileno()
- return _create_filemagic(mime_magic.descriptor(file_descriptor),
- none_magic.descriptor(file_descriptor))
+ x = _detect_make()
+ return _create_filemagic(x.mime_magic.descriptor(file_descriptor),
+ x.none_magic.descriptor(file_descriptor))
def detect_from_content(byte_content):
@@ -284,5 +334,6 @@ def detect_from_content(byte_content):
Returns a `FileMagic` namedtuple.
'''
- return _create_filemagic(mime_magic.buffer(byte_content),
- none_magic.buffer(byte_content))
+ x = _detect_make()
+ return _create_filemagic(x.mime_magic.buffer(byte_content),
+ x.none_magic.buffer(byte_content))
diff --git a/src/BNF b/src/BNF
new file mode 100644
index 000000000000..243532f99df7
--- /dev/null
+++ b/src/BNF
@@ -0,0 +1,151 @@
+This is a first attempt to document the grammar used by magic(5), with
+hopes of eventually incorporating something like this into the manpage.
+
+Note: Currently, the parser varies slightly from this, but only in
+very minor ways, e.g., the strflags maybe separated by '/' characters
+and at most one strcount is allowed; likewise for regflags.
+
+------------------------------------------------------------------------
+magic = 1*query
+
+query = line *( 1*level line )
+
+level = ">" ;; Increment the level by 1.
+ ;; The first line of a query is at level 0.
+
+line = offset HWS type HWS test HWS message EOL
+
+------------------------------------------------------------------------
+offset = absoffset | reloffset | indoffset
+ ;; The offset in the file at which to apply
+ ;; the <test>.
+
+absoffset = NUMBER ;; An absolute offset from the start of the file.
+
+reloffset = "&" NUMBER ;; The offset relative to the last match offset
+ ;; at one level up.
+ ;; Not allowed at level == 0.
+
+indoffset = indoff | relindoff
+
+indoff = "(" offset1 [ "." size ] [ op disp ] ")"
+ ;; Read the file at <offset1> of width <size>.
+ ;; If size is not specified, assume a long.
+ ;; If <op> is given, then preform that
+ ;; operation on the result and the <disp>.
+
+offset1 = absoffset | reloffset
+
+size = byte | leshort | beshort | lelong | belong | melong
+
+byte = "B" | "b" | "C" | "c" ;; A one-byte value.
+leshort = "s" | "h" ;; A two-byte little-endian value.
+beshort = "S" | "H" ;; A two-byte big-endian value.
+lelong = "l" ;; A four-byte little-endian value.
+belong = "L" ;; A four-byte big-endian value.
+melong = "m" ;; A four-byte middle-endian value.
+
+op = [ invert ] ( "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" )
+
+invert = "~" ;; Flip the bits on result of the <op>.
+
+disp = NUMBER | memvalue
+
+memvalue = "(" NUMBER ")"
+ ;; NUMBER is interpreted as an absolute or
+ ;; relative offset matching that of <offset1>.
+ ;; Read the file at the resulting offset with
+ ;; the same size as <offset1>
+
+relindoff = "&" indoff ;; add <indoff> to the last match offset at
+ ;; one level up.
+
+------------------------------------------------------------------------
+type = [ unsigned ] ( numeric | strtype | default )
+
+unsigned = "u" ;; The value is unsigned.
+ ;; This affects the sign extension of numeric
+ ;; types and the '<' and '>' compares. It is
+ ;; intended for numeric types, but allowed on
+ ;; all types.
+
+numeric = ( numtype | datatype ) [ nummask ]
+
+numtype = byte | short | long | quad
+
+byte = "byte"
+short = "short" | "beshort" | "leshort"
+long = "long" | "lelong" | "belong" | "melong"
+quad = "quad" | "lequad" | "bequad"
+
+datetype = udate32 | ldate32 | udate64 | ldate64
+
+udate32 = "date" | "bedate" | "ledate" | "medate" ;; UTC dates
+ldate32 = "ldate" | "beldate" | "leldate" | "meldate" ;; local dates
+udate64 = "qdate" | "leqdate" | "beqdate" ;; UTC dates
+ldate64 = "qldate" | "leqldate" | "beqldate" ;; local dates
+
+nummask = op NUMBER
+
+strtype = regex | search | string8 | string16
+
+regex = "regex" [ "/" 1*regflag ]
+
+regflag = "c" | "s" | linecnt
+
+linecnt = NUMBER ;; The number of lines to search. If this
+ ;; is missing or zero, the rest of the
+ ;; file is searched.
+
+search = "string" [ "/" 1*srchflag ]
+
+srchflag = strflag | srchcnt
+
+srchcnt = NUMBER ;; The number of search tries. If this
+ ;; is missing or zero, the rest of the
+ ;; file is searched.
+
+string8 = ( "string" | "pstring" ) [ "/" 1*strflag ]
+
+strflag = "b" | "B" | "c" | "C"
+
+string16 = "bestring16" | "lestring16"
+
+default = "default" ;; This is intended to be used with the
+ ;; <truetest> ("x" below). It is matched if
+ ;; there has been no previous match at its
+ ;; level or none since the last default at
+ ;; that level. It is useful for implementing
+ ;; switch-like and if/else constructions.
+
+------------------------------------------------------------------------
+test = numtest | strtest | truetest
+ ;; Test to preform on <type> read from file.
+
+numtest = [ compare ] NUMBER ;; If compare is missing, "=" is assumed.
+
+strtest = [ compare ] STRING ;; If compare is missing, "=" is assumed.
+ ;; Note: If the STRING begins with a <compare>
+ ;; character, the <compare> field cannot be
+ ;; omitted.
+
+compare = "=" | "!" | "<" | ">" | "&" | "^"
+
+truetest = "x" ;; This always returns true.
+ ;; To test for the string "x" use "=x".
+
+------------------------------------------------------------------------
+message = [ nospflag ] ( STRING | FMT_STRING )
+ ;; Message to print if test result is true.
+
+nospflag = %x08 | "\\b" ;; Do not insert a space before the message.
+ ;; By default, messages are separated by a " ".
+
+------------------------------------------------------------------------
+HWS = <horizontal white space>
+EOL = <end of line marker>
+NUMBER = <C-style unsigned number>
+STRING = <C-style string without delimiting quotes>
+FMTSTR = <printf format string with exactly one % construct>
+
+------------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index 3f67f2cf3490..75c1f77b142d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -22,7 +22,7 @@ libmagic_la_LIBADD = $(LTLIBOBJS) $(MINGWLIBS)
file_SOURCES = file.c seccomp.c
file_LDADD = libmagic.la
CLEANFILES = magic.h
-EXTRA_DIST = magic.h.in
+EXTRA_DIST = magic.h.in cdf.mk BNF memtest.c
HDR= $(top_srcdir)/src/magic.h.in
BUILT_SOURCES = magic.h
diff --git a/src/Makefile.in b/src/Makefile.in
index 59f3b5e42072..5503b10f51cf 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -95,7 +95,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -373,7 +374,7 @@ libmagic_la_LIBADD = $(LTLIBOBJS) $(MINGWLIBS)
file_SOURCES = file.c seccomp.c
file_LDADD = libmagic.la
CLEANFILES = magic.h
-EXTRA_DIST = magic.h.in
+EXTRA_DIST = magic.h.in cdf.mk BNF memtest.c
HDR = $(top_srcdir)/src/magic.h.in
BUILT_SOURCES = magic.h
all: $(BUILT_SOURCES)
diff --git a/src/apprentice.c b/src/apprentice.c
index 1437bcc1179e..eb3b4a594e75 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -32,7 +32,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: apprentice.c,v 1.297 2020/05/09 18:57:15 christos Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.309 2021/09/24 13:59:19 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -268,6 +268,8 @@ static const struct type_tbl_s type_tbl[] = {
{ XX("der"), FILE_DER, FILE_FMT_STR },
{ XX("guid"), FILE_GUID, FILE_FMT_STR },
{ XX("offset"), FILE_OFFSET, FILE_FMT_QUAD },
+ { XX("bevarint"), FILE_BEVARINT, FILE_FMT_STR },
+ { XX("levarint"), FILE_LEVARINT, FILE_FMT_STR },
{ XX_NULL, FILE_INVALID, FILE_FMT_NONE },
};
@@ -543,6 +545,7 @@ file_ms_alloc(int flags)
ms->elf_notes_max = FILE_ELF_NOTES_MAX;
ms->regex_max = FILE_REGEX_MAX;
ms->bytes_max = FILE_BYTES_MAX;
+ ms->encoding_max = FILE_ENCODING_MAX;
return ms;
free:
free(ms);
@@ -553,6 +556,7 @@ private void
apprentice_unmap(struct magic_map *map)
{
size_t i;
+ char *p;
if (map == NULL)
return;
@@ -560,15 +564,14 @@ apprentice_unmap(struct magic_map *map)
case MAP_TYPE_USER:
break;
case MAP_TYPE_MALLOC:
+ p = CAST(char *, map->p);
for (i = 0; i < MAGIC_SETS; i++) {
- void *b = map->magic[i];
- void *p = map->p;
- if (CAST(char *, b) >= CAST(char *, p) &&
- CAST(char *, b) <= CAST(char *, p) + map->len)
+ char *b = RCAST(char *, map->magic[i]);
+ if (p != NULL && b >= p && b <= p + map->len)
continue;
- free(map->magic[i]);
+ free(b);
}
- free(map->p);
+ free(p);
break;
#ifdef QUICK
case MAP_TYPE_MMAP:
@@ -851,6 +854,8 @@ typesize(int type)
case FILE_BEDOUBLE:
case FILE_LEDOUBLE:
case FILE_OFFSET:
+ case FILE_BEVARINT:
+ case FILE_LEVARINT:
return 8;
case FILE_GUID:
@@ -911,6 +916,8 @@ apprentice_magic_strength(const struct magic *m)
case FILE_DOUBLE:
case FILE_BEDOUBLE:
case FILE_LEDOUBLE:
+ case FILE_BEVARINT:
+ case FILE_LEVARINT:
case FILE_GUID:
case FILE_OFFSET:
ts = typesize(m->type);
@@ -1104,6 +1111,8 @@ set_test_type(struct magic *mstart, struct magic *m)
case FILE_DOUBLE:
case FILE_BEDOUBLE:
case FILE_LEDOUBLE:
+ case FILE_BEVARINT:
+ case FILE_LEVARINT:
case FILE_DER:
case FILE_GUID:
case FILE_OFFSET:
@@ -1334,6 +1343,12 @@ coalesce_entries(struct magic_set *ms, struct magic_entry *me, uint32_t nme,
for (i = 0; i < nme; i++)
mentrycount += me[i].cont_count;
+ if (mentrycount == 0) {
+ *ma = NULL;
+ *nma = 0;
+ return 0;
+ }
+
slen = sizeof(**ma) * mentrycount;
if ((*ma = CAST(struct magic *, malloc(slen))) == NULL) {
file_oomem(ms, slen);
@@ -1461,7 +1476,10 @@ apprentice_load(struct magic_set *ms, const char *fn, int action)
*/
set_last_default(ms, mset[j].me, mset[j].count);
- /* coalesce per file arrays into a single one */
+ /* coalesce per file arrays into a single one, if needed */
+ if (mset[j].count == 0)
+ continue;
+
if (coalesce_entries(ms, mset[j].me, mset[j].count,
&map->magic[j], &map->nmagic[j]) == -1) {
errs++;
@@ -1535,6 +1553,8 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
case FILE_BEDOUBLE:
case FILE_LEDOUBLE:
case FILE_OFFSET:
+ case FILE_BEVARINT:
+ case FILE_LEVARINT:
v = CAST(int64_t, v);
break;
case FILE_STRING:
@@ -1799,6 +1819,9 @@ parse_string_modifier(struct magic_set *ms, struct magic *m, const char **lp)
case CHAR_TRIM:
m->str_flags |= STRING_TRIM;
break;
+ case CHAR_FULL_WORD:
+ m->str_flags |= STRING_FULL_WORD;
+ break;
case CHAR_PSTRING_1_LE:
#define SET_LENGTH(a) m->str_flags = (m->str_flags & ~PSTRING_LEN) | (a)
if (m->type != FILE_PSTRING)
@@ -2132,6 +2155,13 @@ parse(struct magic_set *ms, struct magic_entry *me, const char *line,
return -1;
}
+ if (m->type == FILE_NAME && cont_level != 0) {
+ if (ms->flags & MAGIC_CHECK)
+ file_magwarn(ms, "`name%s' entries can only be "
+ "declared at top level", l);
+ return -1;
+ }
+
/* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */
/* New and improved: ~ & | ^ + - * / % -- exciting, isn't it? */
@@ -2401,7 +2431,7 @@ parse_ext(struct magic_set *ms, struct magic_entry *me, const char *line,
return parse_extra(ms, me, line, len,
CAST(off_t, offsetof(struct magic, ext)),
- sizeof(m->ext), "EXTENSION", ",!+-/@?_$", 0);
+ sizeof(m->ext), "EXTENSION", ",!+-/@?_$&", 0); /* & for b&w */
}
/*
@@ -2459,11 +2489,7 @@ check_format_type(const char *ptr, int type, const char **estr)
}
} else
h = 0;
- if (*ptr == '-')
- ptr++;
- if (*ptr == '.')
- ptr++;
- if (*ptr == '#')
+ while (*ptr && strchr("-.#", *ptr) != NULL)
ptr++;
#define CHECKLEN() do { \
for (len = cnt = 0; isdigit(CAST(unsigned char, *ptr)); ptr++, cnt++) \
@@ -2741,7 +2767,7 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
ull = CAST(uint64_t, strtoull(*p, &ep, 0));
m->value.q = file_signextend(ms, m, ull);
if (*p == ep) {
- file_magwarn(ms, "Unparseable number `%s'", *p);
+ file_magwarn(ms, "Unparsable number `%s'", *p);
} else {
size_t ts = typesize(m->type);
uint64_t x;
@@ -3390,6 +3416,36 @@ swap8(uint64_t sv)
return rv;
}
+protected uintmax_t
+file_varint2uintmax_t(const unsigned char *us, int t, size_t *l)
+{
+ uintmax_t x = 0;
+ const unsigned char *c;
+ if (t == FILE_LEVARINT) {
+ for (c = us; *c; c++) {
+ if ((*c & 0x80) == 0)
+ break;
+ }
+ if (l)
+ *l = c - us + 1;
+ for (; c >= us; c--) {
+ x |= *c & 0x7f;
+ x <<= 7;
+ }
+ } else {
+ for (c = us; *c; c++) {
+ x |= *c & 0x7f;
+ if ((*c & 0x80) == 0)
+ break;
+ x <<= 7;
+ }
+ if (l)
+ *l = c - us + 1;
+ }
+ return x;
+}
+
+
/*
* byteswap a single magic entry
*/
diff --git a/src/ascmagic.c b/src/ascmagic.c
index 9d383be32163..9e64e7c3ff76 100644
--- a/src/ascmagic.c
+++ b/src/ascmagic.c
@@ -35,7 +35,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: ascmagic.c,v 1.107 2020/06/08 19:58:36 christos Exp $")
+FILE_RCSID("@(#)$File: ascmagic.c,v 1.109 2021/02/05 23:01:40 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -50,7 +50,8 @@ FILE_RCSID("@(#)$File: ascmagic.c,v 1.107 2020/06/08 19:58:36 christos Exp $")
#define ISSPC(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n' \
|| (x) == 0x85 || (x) == '\f')
-private unsigned char *encode_utf8(unsigned char *, size_t, unichar *, size_t);
+private unsigned char *encode_utf8(unsigned char *, size_t, file_unichar_t *,
+ size_t);
private size_t trim_nuls(const unsigned char *, size_t);
/*
@@ -69,7 +70,7 @@ trim_nuls(const unsigned char *buf, size_t nbytes)
protected int
file_ascmagic(struct magic_set *ms, const struct buffer *b, int text)
{
- unichar *ubuf = NULL;
+ file_unichar_t *ubuf = NULL;
size_t ulen = 0;
int rv = 1;
struct buffer bb;
@@ -101,9 +102,9 @@ file_ascmagic(struct magic_set *ms, const struct buffer *b, int text)
}
protected int
-file_ascmagic_with_encoding(struct magic_set *ms,
- const struct buffer *b, unichar *ubuf, size_t ulen, const char *code,
- const char *type, int text)
+file_ascmagic_with_encoding(struct magic_set *ms, const struct buffer *b,
+ file_unichar_t *ubuf, size_t ulen, const char *code, const char *type,
+ int text)
{
struct buffer bb;
const unsigned char *buf = CAST(const unsigned char *, b->fbuf);
@@ -127,7 +128,7 @@ file_ascmagic_with_encoding(struct magic_set *ms,
int executable = 0;
size_t last_line_end = CAST(size_t, -1);
- int has_long_lines = 0;
+ size_t has_long_lines = 0;
nbytes = trim_nuls(buf, nbytes);
@@ -190,8 +191,11 @@ file_ascmagic_with_encoding(struct magic_set *ms,
}
/* If this line is _longer_ than MAXLINELEN, remember it. */
- if (i > last_line_end + MAXLINELEN)
- has_long_lines = 1;
+ if (i > last_line_end + MAXLINELEN) {
+ size_t ll = i - last_line_end;
+ if (ll > has_long_lines)
+ has_long_lines = ll;
+ }
if (ubuf[i] == '\033')
has_escapes = 1;
@@ -269,7 +273,8 @@ file_ascmagic_with_encoding(struct magic_set *ms,
goto done;
if (has_long_lines)
- if (file_printf(ms, ", with very long lines") == -1)
+ if (file_printf(ms, ", with very long lines (%zu)",
+ has_long_lines) == -1)
goto done;
/*
@@ -281,7 +286,8 @@ file_ascmagic_with_encoding(struct magic_set *ms,
if (file_printf(ms, ", with") == -1)
goto done;
- if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) {
+ if (n_crlf == 0 && n_cr == 0 &&
+ n_nel == 0 && n_lf == 0) {
if (file_printf(ms, " no") == -1)
goto done;
} else {
@@ -334,7 +340,7 @@ done:
* after end of string, or NULL if an invalid character is found.
*/
private unsigned char *
-encode_utf8(unsigned char *buf, size_t len, unichar *ubuf, size_t ulen)
+encode_utf8(unsigned char *buf, size_t len, file_unichar_t *ubuf, size_t ulen)
{
size_t i;
unsigned char *end = buf + len;
@@ -344,43 +350,45 @@ encode_utf8(unsigned char *buf, size_t len, unichar *ubuf, size_t ulen)
if (end - buf < 1)
return NULL;
*buf++ = CAST(unsigned char, ubuf[i]);
- } else if (ubuf[i] <= 0x7ff) {
+ continue;
+ }
+ if (ubuf[i] <= 0x7ff) {
if (end - buf < 2)
return NULL;
*buf++ = CAST(unsigned char, (ubuf[i] >> 6) + 0xc0);
- *buf++ = CAST(unsigned char, (ubuf[i] & 0x3f) + 0x80);
- } else if (ubuf[i] <= 0xffff) {
+ goto out1;
+ }
+ if (ubuf[i] <= 0xffff) {
if (end - buf < 3)
return NULL;
*buf++ = CAST(unsigned char, (ubuf[i] >> 12) + 0xe0);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 6) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, (ubuf[i] & 0x3f) + 0x80);
- } else if (ubuf[i] <= 0x1fffff) {
+ goto out2;
+ }
+ if (ubuf[i] <= 0x1fffff) {
if (end - buf < 4)
return NULL;
*buf++ = CAST(unsigned char, (ubuf[i] >> 18) + 0xf0);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 12) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 6) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, (ubuf[i] & 0x3f) + 0x80);
- } else if (ubuf[i] <= 0x3ffffff) {
+ goto out3;
+ }
+ if (ubuf[i] <= 0x3ffffff) {
if (end - buf < 5)
return NULL;
*buf++ = CAST(unsigned char, (ubuf[i] >> 24) + 0xf8);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 18) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 12) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 6) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, (ubuf[i] & 0x3f) + 0x80);
- } else if (ubuf[i] <= 0x7fffffff) {
+ goto out4;
+ }
+ if (ubuf[i] <= 0x7fffffff) {
if (end - buf < 6)
return NULL;
*buf++ = CAST(unsigned char, (ubuf[i] >> 30) + 0xfc);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 24) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 18) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 12) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, ((ubuf[i] >> 6) & 0x3f) + 0x80);
- *buf++ = CAST(unsigned char, (ubuf[i] & 0x3f) + 0x80);
- } else /* Invalid character */
- return NULL;
+ goto out5;
+ }
+ /* Invalid character */
+ return NULL;
+ out5: *buf++ = CAST(unsigned char, ((ubuf[i] >> 24) & 0x3f) + 0x80);
+ out4: *buf++ = CAST(unsigned char, ((ubuf[i] >> 18) & 0x3f) + 0x80);
+ out3: *buf++ = CAST(unsigned char, ((ubuf[i] >> 12) & 0x3f) + 0x80);
+ out2: *buf++ = CAST(unsigned char, ((ubuf[i] >> 6) & 0x3f) + 0x80);
+ out1: *buf++ = CAST(unsigned char, ((ubuf[i] >> 0) & 0x3f) + 0x80);
}
return buf;
diff --git a/src/cdf.c b/src/cdf.c
index bb81d6374194..b5ad2f6adb6c 100644
--- a/src/cdf.c
+++ b/src/cdf.c
@@ -35,7 +35,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.116 2019/08/26 14:31:39 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.120 2021/09/24 13:59:19 christos Exp $")
#endif
#include <assert.h>
@@ -97,6 +97,8 @@ cdf_malloc(const char *file __attribute__((__unused__)),
{
DPRINTF(("%s,%" SIZE_T_FORMAT "u: %s %" SIZE_T_FORMAT "u\n",
file, line, __func__, n));
+ if (n == 0)
+ n++;
return malloc(n);
}
@@ -117,6 +119,8 @@ cdf_calloc(const char *file __attribute__((__unused__)),
{
DPRINTF(("%s,%" SIZE_T_FORMAT "u: %s %" SIZE_T_FORMAT "u %"
SIZE_T_FORMAT "u\n", file, line, __func__, n, u));
+ if (n == 0)
+ n++;
return calloc(n, u);
}
@@ -888,29 +892,29 @@ cdf_get_property_info_pos(const cdf_stream_t *sst, const cdf_header_t *h,
{
size_t tail = (i << 1) + 1;
size_t ofs;
- const uint8_t *q;
if (p >= e) {
DPRINTF(("Past end %p < %p\n", e, p));
return NULL;
}
+
if (cdf_check_stream_offset(sst, h, p, (tail + 1) * sizeof(uint32_t),
__LINE__) == -1)
return NULL;
- ofs = CDF_GETUINT32(p, tail);
- q = CAST(const uint8_t *, cdf_offset(CAST(const void *, p),
- ofs - 2 * sizeof(uint32_t)));
- if (q < p) {
- DPRINTF(("Wrapped around %p < %p\n", q, p));
+ ofs = CDF_GETUINT32(p, tail);
+ if (ofs < 2 * sizeof(uint32_t)) {
+ DPRINTF(("Offset too small %zu\n", ofs));
return NULL;
}
- if (q >= e) {
- DPRINTF(("Ran off the end %p >= %p\n", q, e));
+ ofs -= 2 * sizeof(uint32_t);
+ if (ofs > CAST(size_t, e - p)) {
+ DPRINTF(("Offset too big %zu %td\n", ofs, e - p));
return NULL;
}
- return q;
+
+ return CAST(const uint8_t *, cdf_offset(CAST(const void *, p), ofs));
}
static cdf_property_info_t *
@@ -1090,8 +1094,9 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
DPRINTF(("o=%" SIZE_T_FORMAT "u l=%d(%"
SIZE_T_FORMAT "u), t=%" SIZE_T_FORMAT
- "u s=%s\n", o4, l, CDF_ROUND(l, sizeof(l)),
- left, inp[i].pi_str.s_buf));
+ "u s=%.*s\n", o4, l,
+ CDF_ROUND(l, sizeof(l)),
+ left, (int)l, inp[i].pi_str.s_buf));
if (l & 1)
l++;
diff --git a/src/cdf.mk b/src/cdf.mk
new file mode 100644
index 000000000000..681616aee3c9
--- /dev/null
+++ b/src/cdf.mk
@@ -0,0 +1,3 @@
+CFLAGS+=-DTEST -DCDF_DEBUG -g -DHAVE_CONFIG_H -I..
+cdf: cdf.o cdf_time.o
+ ${CC} ${CFLAGS} -o $@ $>
diff --git a/src/compress.c b/src/compress.c
index 67f21583c1a0..9f65e4fa19e0 100644
--- a/src/compress.c
+++ b/src/compress.c
@@ -35,7 +35,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.127 2020/05/31 00:11:06 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.129 2020/12/08 21:26:00 christos Exp $")
#endif
#include "magic.h"
@@ -71,7 +71,7 @@ typedef void (*sig_t)(int);
#include <bzlib.h>
#endif
-#if defined(HAVE_XZLIB_H) && defined(XZLIBSUPPORT)
+#if defined(HAVE_LZMA_H) && defined(XZLIBSUPPORT)
#define BUILTIN_XZLIB
#include <lzma.h>
#endif
@@ -844,8 +844,23 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, const unsigned char *old,
for (i = 0; i < __arraycount(fdp); i++)
fdp[i][0] = fdp[i][1] = -1;
- if ((fd == -1 && pipe(fdp[STDIN_FILENO]) == -1) ||
- pipe(fdp[STDOUT_FILENO]) == -1 || pipe(fdp[STDERR_FILENO]) == -1) {
+ /*
+ * There are multithreaded users who run magic_file()
+ * from dozens of threads. If two parallel magic_file() calls
+ * analyze two large compressed files, both will spawn
+ * an uncompressing child here, which writes out uncompressed data.
+ * We read some portion, then close the pipe, then waitpid() the child.
+ * If uncompressed data is larger, child shound get EPIPE and exit.
+ * However, with *parallel* calls OTHER child may unintentionally
+ * inherit pipe fds, thus keeping pipe open and making writes in
+ * our child block instead of failing with EPIPE!
+ * (For the bug to occur, two threads must mutually inherit their pipes,
+ * and both must have large outputs. Thus it happens not that often).
+ * To avoid this, be sure to create pipes with O_CLOEXEC.
+ */
+ if ((fd == -1 && file_pipe_closexec(fdp[STDIN_FILENO]) == -1) ||
+ file_pipe_closexec(fdp[STDOUT_FILENO]) == -1 ||
+ file_pipe_closexec(fdp[STDERR_FILENO]) == -1) {
closep(fdp[STDIN_FILENO]);
closep(fdp[STDOUT_FILENO]);
return makeerror(newch, n, "Cannot create pipe, %s",
@@ -876,16 +891,20 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, const unsigned char *old,
if (fdp[STDIN_FILENO][1] > 2)
(void) close(fdp[STDIN_FILENO][1]);
}
+ file_clear_closexec(STDIN_FILENO);
+
///FIXME: if one of the fdp[i][j] is 0 or 1, this can bomb spectacularly
if (copydesc(STDOUT_FILENO, fdp[STDOUT_FILENO][1]))
(void) close(fdp[STDOUT_FILENO][1]);
if (fdp[STDOUT_FILENO][0] > 2)
(void) close(fdp[STDOUT_FILENO][0]);
+ file_clear_closexec(STDOUT_FILENO);
if (copydesc(STDERR_FILENO, fdp[STDERR_FILENO][1]))
(void) close(fdp[STDERR_FILENO][1]);
if (fdp[STDERR_FILENO][0] > 2)
(void) close(fdp[STDERR_FILENO][0]);
+ file_clear_closexec(STDERR_FILENO);
(void)execvp(compr[method].argv[0],
RCAST(char *const *, RCAST(intptr_t, compr[method].argv)));
diff --git a/src/der.c b/src/der.c
index 78a056b90d7e..4bee9f169ebc 100644
--- a/src/der.c
+++ b/src/der.c
@@ -35,7 +35,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: der.c,v 1.20 2020/06/07 19:10:37 christos Exp $")
+FILE_RCSID("@(#)$File: der.c,v 1.21 2020/06/15 00:58:10 christos Exp $")
#endif
#else
#define SIZE_T_FORMAT "z"
@@ -247,7 +247,6 @@ der_data(char *buf, size_t blen, uint32_t tag, const void *q, uint32_t len)
return snprintf(buf, blen,
"20%c%c-%c%c-%c%c %c%c:%c%c:%c%c GMT", d[0], d[1], d[2],
d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11]);
- break;
default:
break;
}
diff --git a/src/encoding.c b/src/encoding.c
index c3f3343150b3..3647a481d47d 100644
--- a/src/encoding.c
+++ b/src/encoding.c
@@ -35,7 +35,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: encoding.c,v 1.21 2019/06/08 20:49:14 christos Exp $")
+FILE_RCSID("@(#)$File: encoding.c,v 1.32 2021/04/27 19:37:14 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -43,14 +43,20 @@ FILE_RCSID("@(#)$File: encoding.c,v 1.21 2019/06/08 20:49:14 christos Exp $")
#include <stdlib.h>
-private int looks_ascii(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_utf8_with_BOM(const unsigned char *, size_t, unichar *,
+private int looks_ascii(const unsigned char *, size_t, file_unichar_t *,
+ size_t *);
+private int looks_utf8_with_BOM(const unsigned char *, size_t, file_unichar_t *,
+ size_t *);
+private int looks_utf7(const unsigned char *, size_t, file_unichar_t *,
+ size_t *);
+private int looks_ucs16(const unsigned char *, size_t, file_unichar_t *,
+ size_t *);
+private int looks_ucs32(const unsigned char *, size_t, file_unichar_t *,
+ size_t *);
+private int looks_latin1(const unsigned char *, size_t, file_unichar_t *,
+ size_t *);
+private int looks_extended(const unsigned char *, size_t, file_unichar_t *,
size_t *);
-private int looks_utf7(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_ucs16(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_ucs32(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_latin1(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_extended(const unsigned char *, size_t, unichar *, size_t *);
private void from_ebcdic(const unsigned char *, size_t, unsigned char *);
#ifdef DEBUG_ENCODING
@@ -62,19 +68,20 @@ private void from_ebcdic(const unsigned char *, size_t, unsigned char *);
/*
* Try to determine whether text is in some character code we can
* identify. Each of these tests, if it succeeds, will leave
- * the text converted into one-unichar-per-character Unicode in
+ * the text converted into one-file_unichar_t-per-character Unicode in
* ubuf, and the number of characters converted in ulen.
*/
protected int
-file_encoding(struct magic_set *ms, const struct buffer *b, unichar **ubuf,
- size_t *ulen, const char **code, const char **code_mime, const char **type)
+file_encoding(struct magic_set *ms, const struct buffer *b,
+ file_unichar_t **ubuf, size_t *ulen, const char **code,
+ const char **code_mime, const char **type)
{
const unsigned char *buf = CAST(const unsigned char *, b->fbuf);
size_t nbytes = b->flen;
size_t mlen;
int rv = 1, ucs_type;
unsigned char *nbuf = NULL;
- unichar *udefbuf;
+ file_unichar_t *udefbuf;
size_t udeflen;
if (ubuf == NULL)
@@ -87,8 +94,12 @@ file_encoding(struct magic_set *ms, const struct buffer *b, unichar **ubuf,
*code = "unknown";
*code_mime = "binary";
+ if (nbytes > ms->encoding_max)
+ nbytes = ms->encoding_max;
+
mlen = (nbytes + 1) * sizeof((*ubuf)[0]);
- if ((*ubuf = CAST(unichar *, calloc(CAST(size_t, 1), mlen))) == NULL) {
+ *ubuf = CAST(file_unichar_t *, calloc(CAST(size_t, 1), mlen));
+ if (*ubuf == NULL) {
file_oomem(ms, mlen);
goto done;
}
@@ -102,7 +113,7 @@ file_encoding(struct magic_set *ms, const struct buffer *b, unichar **ubuf,
if (looks_ascii(buf, nbytes, *ubuf, ulen)) {
if (looks_utf7(buf, nbytes, *ubuf, ulen) > 0) {
DPRINTF(("utf-7 %" SIZE_T_FORMAT "u\n", *ulen));
- *code = "UTF-7 Unicode";
+ *code = "Unicode text, UTF-7";
*code_mime = "utf-7";
} else {
DPRINTF(("ascii %" SIZE_T_FORMAT "u\n", *ulen));
@@ -111,27 +122,27 @@ file_encoding(struct magic_set *ms, const struct buffer *b, unichar **ubuf,
}
} else if (looks_utf8_with_BOM(buf, nbytes, *ubuf, ulen) > 0) {
DPRINTF(("utf8/bom %" SIZE_T_FORMAT "u\n", *ulen));
- *code = "UTF-8 Unicode (with BOM)";
+ *code = "Unicode text, UTF-8 (with BOM)";
*code_mime = "utf-8";
} else if (file_looks_utf8(buf, nbytes, *ubuf, ulen) > 1) {
DPRINTF(("utf8 %" SIZE_T_FORMAT "u\n", *ulen));
- *code = "UTF-8 Unicode";
+ *code = "Unicode text, UTF-8";
*code_mime = "utf-8";
} else if ((ucs_type = looks_ucs32(buf, nbytes, *ubuf, ulen)) != 0) {
if (ucs_type == 1) {
- *code = "Little-endian UTF-32 Unicode";
+ *code = "Unicode text, UTF-32, little-endian";
*code_mime = "utf-32le";
} else {
- *code = "Big-endian UTF-32 Unicode";
+ *code = "Unicode text, UTF-32, big-endian";
*code_mime = "utf-32be";
}
DPRINTF(("ucs32 %" SIZE_T_FORMAT "u\n", *ulen));
} else if ((ucs_type = looks_ucs16(buf, nbytes, *ubuf, ulen)) != 0) {
if (ucs_type == 1) {
- *code = "Little-endian UTF-16 Unicode";
+ *code = "Unicode text, UTF-16, little-endian";
*code_mime = "utf-16le";
} else {
- *code = "Big-endian UTF-16 Unicode";
+ *code = "Unicode text, UTF-16, big-endian";
*code_mime = "utf-16be";
}
DPRINTF(("ucs16 %" SIZE_T_FORMAT "u\n", *ulen));
@@ -249,64 +260,29 @@ private char text_chars[256] = {
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I /* 0xfX */
};
-private int
-looks_ascii(const unsigned char *buf, size_t nbytes, unichar *ubuf,
- size_t *ulen)
-{
- size_t i;
-
- *ulen = 0;
-
- for (i = 0; i < nbytes; i++) {
- int t = text_chars[buf[i]];
-
- if (t != T)
- return 0;
-
- ubuf[(*ulen)++] = buf[i];
- }
-
- return 1;
+#define LOOKS(NAME, COND) \
+private int \
+looks_ ## NAME(const unsigned char *buf, size_t nbytes, file_unichar_t *ubuf, \
+ size_t *ulen) \
+{ \
+ size_t i; \
+\
+ *ulen = 0; \
+\
+ for (i = 0; i < nbytes; i++) { \
+ int t = text_chars[buf[i]]; \
+\
+ if (COND) \
+ return 0; \
+\
+ ubuf[(*ulen)++] = buf[i]; \
+ } \
+ return 1; \
}
-private int
-looks_latin1(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
-{
- size_t i;
-
- *ulen = 0;
-
- for (i = 0; i < nbytes; i++) {
- int t = text_chars[buf[i]];
-
- if (t != T && t != I)
- return 0;
-
- ubuf[(*ulen)++] = buf[i];
- }
-
- return 1;
-}
-
-private int
-looks_extended(const unsigned char *buf, size_t nbytes, unichar *ubuf,
- size_t *ulen)
-{
- size_t i;
-
- *ulen = 0;
-
- for (i = 0; i < nbytes; i++) {
- int t = text_chars[buf[i]];
-
- if (t != T && t != I && t != X)
- return 0;
-
- ubuf[(*ulen)++] = buf[i];
- }
-
- return 1;
-}
+LOOKS(ascii, t != T)
+LOOKS(latin1, t != T && t != I)
+LOOKS(extended, t != T && t != I && t != X)
/*
* Decide whether some text looks like UTF-8. Returns:
@@ -319,12 +295,65 @@ looks_extended(const unsigned char *buf, size_t nbytes, unichar *ubuf,
* If ubuf is non-NULL on entry, text is decoded into ubuf, *ulen;
* ubuf must be big enough!
*/
+
+// from: https://golang.org/src/unicode/utf8/utf8.go
+
+#define XX 0xF1 // invalid: size 1
+#define AS 0xF0 // ASCII: size 1
+#define S1 0x02 // accept 0, size 2
+#define S2 0x13 // accept 1, size 3
+#define S3 0x03 // accept 0, size 3
+#define S4 0x23 // accept 2, size 3
+#define S5 0x34 // accept 3, size 4
+#define S6 0x04 // accept 0, size 4
+#define S7 0x44 // accept 4, size 4
+
+#define LOCB 0x80
+#define HICB 0xBF
+
+// first is information about the first byte in a UTF-8 sequence.
+static const uint8_t first[] = {
+ // 1 2 3 4 5 6 7 8 9 A B C D E F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x00-0x0F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x10-0x1F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x20-0x2F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x30-0x3F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x40-0x4F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x50-0x5F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x60-0x6F
+ AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, AS, // 0x70-0x7F
+ // 1 2 3 4 5 6 7 8 9 A B C D E F
+ XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, // 0x80-0x8F
+ XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, // 0x90-0x9F
+ XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, // 0xA0-0xAF
+ XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, // 0xB0-0xBF
+ XX, XX, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, // 0xC0-0xCF
+ S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, S1, // 0xD0-0xDF
+ S2, S3, S3, S3, S3, S3, S3, S3, S3, S3, S3, S3, S3, S4, S3, S3, // 0xE0-0xEF
+ S5, S6, S6, S6, S7, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, // 0xF0-0xFF
+};
+
+// acceptRange gives the range of valid values for the second byte in a UTF-8
+// sequence.
+struct accept_range {
+ uint8_t lo; // lowest value for second byte.
+ uint8_t hi; // highest value for second byte.
+} accept_ranges[16] = {
+// acceptRanges has size 16 to avoid bounds checks in the code that uses it.
+ { LOCB, HICB },
+ { 0xA0, HICB },
+ { LOCB, 0x9F },
+ { 0x90, HICB },
+ { LOCB, 0x8F },
+};
+
protected int
-file_looks_utf8(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
+file_looks_utf8(const unsigned char *buf, size_t nbytes, file_unichar_t *ubuf,
+ size_t *ulen)
{
size_t i;
int n;
- unichar c;
+ file_unichar_t c;
int gotone = 0, ctrl = 0;
if (ubuf)
@@ -346,6 +375,11 @@ file_looks_utf8(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *
return -1;
} else { /* 11xxxxxx begins UTF-8 */
int following;
+ uint8_t x = first[buf[i]];
+ const struct accept_range *ar =
+ &accept_ranges[(unsigned int)x >> 4];
+ if (x == XX)
+ return -1;
if ((buf[i] & 0x20) == 0) { /* 110xxxxx */
c = buf[i] & 0x1f;
@@ -370,6 +404,10 @@ file_looks_utf8(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *
if (i >= nbytes)
goto done;
+ if (n == 0 &&
+ (buf[i] < ar->lo || buf[i] > ar->hi))
+ return -1;
+
if ((buf[i] & 0x80) == 0 || (buf[i] & 0x40))
return -1;
@@ -391,8 +429,8 @@ done:
* rest of the text.
*/
private int
-looks_utf8_with_BOM(const unsigned char *buf, size_t nbytes, unichar *ubuf,
- size_t *ulen)
+looks_utf8_with_BOM(const unsigned char *buf, size_t nbytes,
+ file_unichar_t *ubuf, size_t *ulen)
{
if (nbytes > 3 && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
return file_looks_utf8(buf + 3, nbytes - 3, ubuf, ulen);
@@ -401,7 +439,8 @@ looks_utf8_with_BOM(const unsigned char *buf, size_t nbytes, unichar *ubuf,
}
private int
-looks_utf7(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
+looks_utf7(const unsigned char *buf, size_t nbytes, file_unichar_t *ubuf,
+ size_t *ulen)
{
if (nbytes > 4 && buf[0] == '+' && buf[1] == '/' && buf[2] == 'v')
switch (buf[3]) {
@@ -420,7 +459,7 @@ looks_utf7(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
}
private int
-looks_ucs16(const unsigned char *bf, size_t nbytes, unichar *ubf,
+looks_ucs16(const unsigned char *bf, size_t nbytes, file_unichar_t *ubf,
size_t *ulen)
{
int bigend;
@@ -443,10 +482,10 @@ looks_ucs16(const unsigned char *bf, size_t nbytes, unichar *ubf,
if (bigend)
ubf[(*ulen)++] = bf[i + 1]
- | (CAST(unichar, bf[i]) << 8);
+ | (CAST(file_unichar_t, bf[i]) << 8);
else
ubf[(*ulen)++] = bf[i]
- | (CAST(unichar, bf[i + 1]) << 8);
+ | (CAST(file_unichar_t, bf[i + 1]) << 8);
if (ubf[*ulen - 1] == 0xfffe)
return 0;
@@ -459,7 +498,7 @@ looks_ucs16(const unsigned char *bf, size_t nbytes, unichar *ubf,
}
private int
-looks_ucs32(const unsigned char *bf, size_t nbytes, unichar *ubf,
+looks_ucs32(const unsigned char *bf, size_t nbytes, file_unichar_t *ubf,
size_t *ulen)
{
int bigend;
@@ -481,15 +520,15 @@ looks_ucs32(const unsigned char *bf, size_t nbytes, unichar *ubf,
/* XXX fix to properly handle chars > 65536 */
if (bigend)
- ubf[(*ulen)++] = CAST(unichar, bf[i + 3])
- | (CAST(unichar, bf[i + 2]) << 8)
- | (CAST(unichar, bf[i + 1]) << 16)
- | (CAST(unichar, bf[i]) << 24);
+ ubf[(*ulen)++] = CAST(file_unichar_t, bf[i + 3])
+ | (CAST(file_unichar_t, bf[i + 2]) << 8)
+ | (CAST(file_unichar_t, bf[i + 1]) << 16)
+ | (CAST(file_unichar_t, bf[i]) << 24);
else
- ubf[(*ulen)++] = CAST(unichar, bf[i + 0])
- | (CAST(unichar, bf[i + 1]) << 8)
- | (CAST(unichar, bf[i + 2]) << 16)
- | (CAST(unichar, bf[i + 3]) << 24);
+ ubf[(*ulen)++] = CAST(file_unichar_t, bf[i + 0])
+ | (CAST(file_unichar_t, bf[i + 1]) << 8)
+ | (CAST(file_unichar_t, bf[i + 2]) << 16)
+ | (CAST(file_unichar_t, bf[i + 3]) << 24);
if (ubf[*ulen - 1] == 0xfffe)
return 0;
diff --git a/src/file.c b/src/file.c
index aca585216373..2f4f7a6d6337 100644
--- a/src/file.c
+++ b/src/file.c
@@ -32,7 +32,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: file.c,v 1.187 2020/06/07 17:38:30 christos Exp $")
+FILE_RCSID("@(#)$File: file.c,v 1.190 2021/09/24 14:14:26 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -132,26 +132,28 @@ private const struct {
private struct {
const char *name;
- int tag;
size_t value;
- int set;
size_t def;
const char *desc;
+ int tag;
+ int set;
} pm[] = {
- { "bytes", MAGIC_PARAM_BYTES_MAX, 0, 0, FILE_BYTES_MAX,
- "max bytes to look inside file" },
- { "elf_notes", MAGIC_PARAM_ELF_NOTES_MAX, 0, 0, FILE_ELF_NOTES_MAX,
- "max ELF notes processed" },
- { "elf_phnum", MAGIC_PARAM_ELF_PHNUM_MAX, 0, 0, FILE_ELF_PHNUM_MAX,
- "max ELF prog sections processed" },
- { "elf_shnum", MAGIC_PARAM_ELF_SHNUM_MAX, 0, 0, FILE_ELF_SHNUM_MAX,
- "max ELF sections processed" },
- { "indir", MAGIC_PARAM_INDIR_MAX, 0, 0, FILE_INDIR_MAX,
- "recursion limit for indirection" },
- { "name", MAGIC_PARAM_NAME_MAX, 0, 0, FILE_NAME_MAX,
- "use limit for name/use magic" },
- { "regex", MAGIC_PARAM_REGEX_MAX, 0, 0, FILE_REGEX_MAX,
- "length limit for REGEX searches" },
+ { "bytes", 0, FILE_BYTES_MAX, "max bytes to look inside file",
+ MAGIC_PARAM_BYTES_MAX, 0 },
+ { "elf_notes", 0, FILE_ELF_NOTES_MAX, "max ELF notes processed",
+ MAGIC_PARAM_ELF_NOTES_MAX, 0 },
+ { "elf_phnum", 0, FILE_ELF_PHNUM_MAX, "max ELF prog sections processed",
+ MAGIC_PARAM_ELF_PHNUM_MAX, 0 },
+ { "elf_shnum", 0, FILE_ELF_SHNUM_MAX, "max ELF sections processed",
+ MAGIC_PARAM_ELF_SHNUM_MAX, 0 },
+ { "encoding", 0, FILE_ENCODING_MAX, "max bytes to scan for encoding",
+ MAGIC_PARAM_ENCODING_MAX, 0 },
+ { "indir", 0, FILE_INDIR_MAX, "recursion limit for indirection",
+ MAGIC_PARAM_INDIR_MAX, 0 },
+ { "name", 0, FILE_NAME_MAX, "use limit for name/use magic",
+ MAGIC_PARAM_NAME_MAX, 0 },
+ { "regex", 0, FILE_REGEX_MAX, "length limit for REGEX searches",
+ MAGIC_PARAM_REGEX_MAX, 0 },
};
private int posixly;
@@ -523,8 +525,6 @@ unwrap(struct magic_set *ms, const char *fn)
if (line[len - 1] == '\n')
line[len - 1] = '\0';
e |= process(ms, line, wid);
- if(nobuffer)
- (void)fflush(stdout);
}
free(line);
@@ -556,11 +556,12 @@ process(struct magic_set *ms, const char *inname, int wid)
if (type == NULL) {
(void)printf("ERROR: %s%c", magic_error(ms), c);
- return 1;
} else {
(void)printf("%s%c", type, c);
- return 0;
}
+ if (nobuffer)
+ (void)fflush(stdout);
+ return type == NULL;
}
protected size_t
diff --git a/src/file.h b/src/file.h
index 28ebc0c18ace..28a05e17a6ff 100644
--- a/src/file.h
+++ b/src/file.h
@@ -27,7 +27,7 @@
*/
/*
* file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.220 2020/06/08 17:38:27 christos Exp $
+ * @(#)$File: file.h,v 1.227 2021/06/30 10:08:48 christos Exp $
*/
#ifndef __file_h__
@@ -143,6 +143,14 @@
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+#ifndef FD_CLOEXEC
+# define FD_CLOEXEC 1
+#endif
+
#define FILE_BADSIZE CAST(size_t, ~0ul)
#define MAXDESC 64 /* max len of text description/MIME type */
#define MAXMIME 80 /* max len of text MIME type */
@@ -256,7 +264,9 @@ struct magic {
#define FILE_DER 48
#define FILE_GUID 49
#define FILE_OFFSET 50
-#define FILE_NAMES_SIZE 51 /* size of array to contain all names */
+#define FILE_BEVARINT 51
+#define FILE_LEVARINT 52
+#define FILE_NAMES_SIZE 53 /* size of array to contain all names */
#define IS_STRING(t) \
((t) == FILE_STRING || \
@@ -362,6 +372,7 @@ struct magic {
(PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE)
#define PSTRING_LENGTH_INCLUDES_ITSELF BIT(12)
#define STRING_TRIM BIT(13)
+#define STRING_FULL_WORD BIT(14)
#define CHAR_COMPACT_WHITESPACE 'W'
#define CHAR_COMPACT_OPTIONAL_WHITESPACE 'w'
#define CHAR_IGNORE_LOWERCASE 'c'
@@ -369,6 +380,7 @@ struct magic {
#define CHAR_REGEX_OFFSET_START 's'
#define CHAR_TEXTTEST 't'
#define CHAR_TRIM 'T'
+#define CHAR_FULL_WORD 'f'
#define CHAR_BINTEST 'b'
#define CHAR_PSTRING_1_BE 'B'
#define CHAR_PSTRING_1_LE 'B'
@@ -410,14 +422,16 @@ struct level_info {
#endif
};
+struct cont {
+ size_t len;
+ struct level_info *li;
+};
+
#define MAGIC_SETS 2
struct magic_set {
struct mlist *mlist[MAGIC_SETS]; /* list of regular entries */
- struct cont {
- size_t len;
- struct level_info *li;
- } c;
+ struct cont c;
struct out {
char *buf; /* Accumulation buffer */
size_t blen; /* Length of buffer */
@@ -452,6 +466,7 @@ struct magic_set {
uint16_t elf_notes_max;
uint16_t regex_max;
size_t bytes_max; /* number of bytes to read from file */
+ size_t encoding_max; /* bytes to look for encoding */
#ifndef FILE_BYTES_MAX
# define FILE_BYTES_MAX (1024 * 1024) /* how much of the file to look at */
#endif
@@ -461,15 +476,18 @@ struct magic_set {
#define FILE_INDIR_MAX 50
#define FILE_NAME_MAX 50
#define FILE_REGEX_MAX 8192
+#define FILE_ENCODING_MAX (64 * 1024)
};
/* Type for Unicode characters */
-typedef unsigned long unichar;
+typedef unsigned long file_unichar_t;
struct stat;
#define FILE_T_LOCAL 1
#define FILE_T_WINDOWS 2
protected const char *file_fmttime(char *, size_t, uint64_t, int);
+protected const char *file_fmtvarint(const unsigned char *, int, char *,
+ size_t);
protected struct magic_set *file_ms_alloc(int);
protected void file_ms_free(struct magic_set *);
protected int file_default(struct magic_set *, size_t);
@@ -498,9 +516,9 @@ protected int file_zmagic(struct magic_set *, const struct buffer *,
protected int file_ascmagic(struct magic_set *, const struct buffer *,
int);
protected int file_ascmagic_with_encoding(struct magic_set *,
- const struct buffer *, unichar *, size_t, const char *, const char *, int);
+ const struct buffer *, file_unichar_t *, size_t, const char *, const char *, int);
protected int file_encoding(struct magic_set *, const struct buffer *,
- unichar **, size_t *, const char **, const char **, const char **);
+ file_unichar_t **, size_t *, const char **, const char **, const char **);
protected int file_is_json(struct magic_set *, const struct buffer *);
protected int file_is_csv(struct magic_set *, const struct buffer *, int);
protected int file_is_tar(struct magic_set *, const struct buffer *);
@@ -512,6 +530,8 @@ protected int buffer_apprentice(struct magic_set *, struct magic **,
protected int file_magicfind(struct magic_set *, const char *, struct mlist *);
protected uint64_t file_signextend(struct magic_set *, struct magic *,
uint64_t);
+protected uintmax_t file_varint2uintmax_t(const unsigned char *, int, size_t *);
+
protected void file_badread(struct magic_set *);
protected void file_badseek(struct magic_set *);
protected void file_oomem(struct magic_set *, size_t);
@@ -527,17 +547,21 @@ protected size_t file_mbswidth(const char *);
protected const char *file_getbuffer(struct magic_set *);
protected ssize_t sread(int, void *, size_t, int);
protected int file_check_mem(struct magic_set *, unsigned int);
-protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
+protected int file_looks_utf8(const unsigned char *, size_t, file_unichar_t *,
size_t *);
protected size_t file_pstring_length_size(struct magic_set *,
const struct magic *);
protected size_t file_pstring_get_length(struct magic_set *,
const struct magic *, const char *);
-protected char * file_printable(char *, size_t, const char *, size_t);
+protected char * file_printable(struct magic_set *, char *, size_t,
+ const char *, size_t);
#ifdef __EMX__
protected int file_os2_apptype(struct magic_set *, const char *, const void *,
size_t);
#endif /* __EMX__ */
+protected int file_pipe_closexec(int *);
+protected int file_clear_closexec(int);
+protected char *file_strtrim(char *);
protected void buffer_init(struct buffer *, int, const struct stat *,
const void *, size_t);
diff --git a/src/file_opts.h b/src/file_opts.h
index 24909917fe1b..1254afe482df 100644
--- a/src/file_opts.h
+++ b/src/file_opts.h
@@ -4,7 +4,7 @@
* The first column specifies the short name, if any, or 0 if none.
* The second column specifies the long name.
* The third column specifies whether it takes a parameter.
- * The fourth colums specifies whether is is marked as "default"
+ * The fourth columns specifies whether is is marked as "default"
* if POSIXLY_CORRECT is defined: 1,
* if POSIXLY_CORRECT is not defined: 2.
* The fifth column is the documentation.
diff --git a/src/funcs.c b/src/funcs.c
index 09b965e9a9c2..33c3f85a71a7 100644
--- a/src/funcs.c
+++ b/src/funcs.c
@@ -27,7 +27,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.115 2020/02/20 15:50:20 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.122 2021/06/30 10:08:48 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -36,6 +36,9 @@ FILE_RCSID("@(#)$File: funcs.c,v 1.115 2020/02/20 15:50:20 christos Exp $")
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for pipe2() */
+#endif
#if defined(HAVE_WCHAR_H)
#include <wchar.h>
#endif
@@ -93,7 +96,7 @@ file_checkfmt(char *msg, size_t mlen, const char *fmt)
if (*++p == '%')
continue;
// Skip uninteresting.
- while (strchr("0.'+- ", *p) != NULL)
+ while (strchr("#0.'+- ", *p) != NULL)
p++;
if (*p == '*') {
if (msg)
@@ -245,11 +248,31 @@ file_badread(struct magic_set *ms)
}
#ifndef COMPILE_ONLY
+#define FILE_SEPARATOR "\n- "
protected int
file_separator(struct magic_set *ms)
{
- return file_printf(ms, "\n- ");
+ return file_printf(ms, FILE_SEPARATOR);
+}
+
+static void
+trim_separator(struct magic_set *ms)
+{
+ size_t l;
+
+ if (ms->o.buf == NULL)
+ return;
+
+ l = strlen(ms->o.buf);
+ if (l < sizeof(FILE_SEPARATOR))
+ return;
+
+ l -= sizeof(FILE_SEPARATOR) - 1;
+ if (strcmp(ms->o.buf + l, FILE_SEPARATOR) != 0)
+ return;
+
+ ms->o.buf[l] = '\0';
}
static int
@@ -453,6 +476,7 @@ simple:
rv = -1;
}
done:
+ trim_separator(ms);
if ((ms->flags & MAGIC_MIME_ENCODING) != 0) {
if (ms->flags & MAGIC_MIME_TYPE)
if (file_printf(ms, "; charset=") == -1)
@@ -732,14 +756,15 @@ file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
* convert string to ascii printable format.
*/
protected char *
-file_printable(char *buf, size_t bufsiz, const char *str, size_t slen)
+file_printable(struct magic_set *ms, char *buf, size_t bufsiz,
+ const char *str, size_t slen)
{
char *ptr, *eptr = buf + bufsiz - 1;
const unsigned char *s = RCAST(const unsigned char *, str);
const unsigned char *es = s + slen;
for (ptr = buf; ptr < eptr && s < es && *s; s++) {
- if (isprint(*s)) {
+ if ((ms->flags & MAGIC_RAW) != 0 || isprint(*s)) {
*ptr++ = *s;
continue;
}
@@ -764,7 +789,7 @@ struct guid {
protected int
file_parse_guid(const char *s, uint64_t *guid)
{
- struct guid *g = CAST(struct guid *, guid);
+ struct guid *g = CAST(struct guid *, CAST(void *, guid));
return sscanf(s,
"%8x-%4hx-%4hx-%2hhx%2hhx-%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
&g->data1, &g->data2, &g->data3, &g->data4[0], &g->data4[1],
@@ -775,7 +800,8 @@ file_parse_guid(const char *s, uint64_t *guid)
protected int
file_print_guid(char *str, size_t len, const uint64_t *guid)
{
- const struct guid *g = CAST(const struct guid *, guid);
+ const struct guid *g = CAST(const struct guid *,
+ CAST(const void *, guid));
return snprintf(str, len, "%.8X-%.4hX-%.4hX-%.2hhX%.2hhX-"
"%.2hhX%.2hhX%.2hhX%.2hhX%.2hhX%.2hhX",
@@ -783,3 +809,39 @@ file_print_guid(char *str, size_t len, const uint64_t *guid)
g->data4[2], g->data4[3], g->data4[4], g->data4[5],
g->data4[6], g->data4[7]);
}
+
+protected int
+file_pipe_closexec(int *fds)
+{
+#ifdef HAVE_PIPE2
+ return pipe2(fds, O_CLOEXEC);
+#else
+ if (pipe(fds) == -1)
+ return -1;
+ (void)fcntl(fds[0], F_SETFD, FD_CLOEXEC);
+ (void)fcntl(fds[1], F_SETFD, FD_CLOEXEC);
+ return 0;
+#endif
+}
+
+protected int
+file_clear_closexec(int fd) {
+ return fcntl(fd, F_SETFD, 0);
+}
+
+protected char *
+file_strtrim(char *str)
+{
+ char *last;
+
+ while (isspace(CAST(unsigned char, *str)))
+ str++;
+ last = str;
+ while (*last)
+ last++;
+ --last;
+ while (isspace(CAST(unsigned char, *last)))
+ last--;
+ *++last = '\0';
+ return str;
+}
diff --git a/src/is_csv.c b/src/is_csv.c
index 0081088c80ec..937ab5f401ff 100644
--- a/src/is_csv.c
+++ b/src/is_csv.c
@@ -32,7 +32,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: is_csv.c,v 1.4 2019/06/26 20:31:31 christos Exp $")
+FILE_RCSID("@(#)$File: is_csv.c,v 1.6 2020/08/09 16:43:36 christos Exp $")
#endif
#include <string.h>
@@ -94,8 +94,7 @@ csv_parse(const unsigned char *uc, const unsigned char *ue)
size_t nf = 0, tf = 0, nl = 0;
while (uc < ue) {
- unsigned char c;
- switch (c = *uc++) {
+ switch (*uc++) {
case '"':
// Eat until the matching quote
uc = eatquote(uc, ue);
@@ -150,7 +149,7 @@ file_is_csv(struct magic_set *ms, const struct buffer *b, int looks_text)
return 1;
if (mime) {
- if (file_printf(ms, "application/csv") == -1)
+ if (file_printf(ms, "text/csv") == -1)
return -1;
return 1;
}
diff --git a/src/magic.c b/src/magic.c
index 17a7077d8428..03a456bc9a0d 100644
--- a/src/magic.c
+++ b/src/magic.c
@@ -33,7 +33,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: magic.c,v 1.112 2020/06/08 19:44:10 christos Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.115 2021/09/20 17:45:41 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -156,6 +156,7 @@ out:
free(dllpath);
}
+#ifndef BUILD_AS_WINDOWS_STATIC_LIBARAY
/* Placate GCC by offering a sacrificial previous prototype */
BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
@@ -168,6 +169,7 @@ DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
return 1;
}
#endif
+#endif
private const char *
get_default_magic(void)
@@ -436,7 +438,7 @@ file_or_fd(struct magic_set *ms, const char *inname, int fd)
_setmode(STDIN_FILENO, O_BINARY);
#endif
if (inname != NULL) {
- int flags = O_RDONLY|O_BINARY|O_NONBLOCK;
+ int flags = O_RDONLY|O_BINARY|O_NONBLOCK|O_CLOEXEC;
errno = 0;
if ((fd = open(inname, flags)) < 0) {
okstat = stat(inname, &sb) == 0;
@@ -460,6 +462,9 @@ file_or_fd(struct magic_set *ms, const char *inname, int fd)
rv = 0;
goto done;
}
+#if O_CLOEXEC == 0
+ (void)fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
}
if (fd != -1) {
@@ -614,6 +619,9 @@ magic_setparam(struct magic_set *ms, int param, const void *val)
case MAGIC_PARAM_BYTES_MAX:
ms->bytes_max = *CAST(const size_t *, val);
return 0;
+ case MAGIC_PARAM_ENCODING_MAX:
+ ms->encoding_max = *CAST(const size_t *, val);
+ return 0;
default:
errno = EINVAL;
return -1;
@@ -647,6 +655,9 @@ magic_getparam(struct magic_set *ms, int param, void *val)
case MAGIC_PARAM_BYTES_MAX:
*CAST(size_t *, val) = ms->bytes_max;
return 0;
+ case MAGIC_PARAM_ENCODING_MAX:
+ *CAST(size_t *, val) = ms->encoding_max;
+ return 0;
default:
errno = EINVAL;
return -1;
diff --git a/src/magic.h.in b/src/magic.h.in
index d189a73c248e..389cf2edf914 100644
--- a/src/magic.h.in
+++ b/src/magic.h.in
@@ -149,6 +149,7 @@ int magic_errno(magic_t);
#define MAGIC_PARAM_ELF_NOTES_MAX 4
#define MAGIC_PARAM_REGEX_MAX 5
#define MAGIC_PARAM_BYTES_MAX 6
+#define MAGIC_PARAM_ENCODING_MAX 7
int magic_setparam(magic_t, int, const void *);
int magic_getparam(magic_t, int, void *);
diff --git a/src/memtest.c b/src/memtest.c
new file mode 100644
index 000000000000..f9506f6ea2a7
--- /dev/null
+++ b/src/memtest.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) Christos Zoulas 2021.
+ * All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice immediately at the beginning of the file, without modification,
+ * this list of conditions, and the following disclaimer.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <err.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <magic.h>
+
+void *
+malloc(size_t len)
+{
+ char buf[512];
+ void *(*orig)(size_t) = dlsym(RTLD_NEXT, "malloc");
+ void *p = (*orig)(len);
+ int l = snprintf(buf, sizeof(buf), "malloc %zu %p\n", len, p);
+ write(2, buf, l);
+ return p;
+}
+
+void
+free(void *p)
+{
+ char buf[512];
+ void (*orig)(void *) = dlsym(RTLD_NEXT, "free");
+ (*orig)(p);
+ int l = snprintf(buf, sizeof(buf), "free %p\n", p);
+ write(2, buf, l);
+}
+
+void *
+calloc(size_t len, size_t nitems)
+{
+ char buf[512];
+ void *(*orig)(size_t, size_t) = dlsym(RTLD_NEXT, "calloc");
+ void *p = (*orig)(len, nitems);
+ size_t tot = len * nitems;
+ int l = snprintf(buf, sizeof(buf), "calloc %zu %p\n", tot, p);
+ write(2, buf, l);
+ return p;
+}
+void *
+realloc(void *q, size_t len)
+{
+ char buf[512];
+ void *(*orig)(void *, size_t) = dlsym(RTLD_NEXT, "realloc");
+ void *p = (*orig)(q, len);
+ int l = snprintf(buf, sizeof(buf), "realloc %zu %p\n", len, p);
+ write(2, buf, l);
+ return p;
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "Usage: test [-b] <filename>\n");
+ exit(EXIT_FAILURE);
+}
+
+int
+main(int argc, char *argv[])
+{
+ bool buf = false;
+ int c;
+
+ while ((c = getopt(argc, argv, "b")) != -1)
+ switch (c) {
+ case 'b':
+ buf = true;
+ break;
+ default:
+ usage();
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc == 0)
+ usage();
+
+ magic_t m = magic_open(0);
+ if (m == NULL)
+ err(EXIT_FAILURE, "magic_open");
+
+ magic_load(m, NULL);
+
+ const char *r;
+ if (buf) {
+ int fd = open(argv[0], O_RDONLY);
+ if (fd == -1)
+ err(EXIT_FAILURE, "Cannot open `%s'", argv[0]);
+
+ struct stat st;
+ if (fstat(fd, &st) == -1)
+ err(EXIT_FAILURE, "Cannot stat `%s'", argv[0]);
+ size_t l = (size_t)st.st_size;
+ void *p = mmap(NULL, l, PROT_READ, MAP_FILE | MAP_PRIVATE, fd,
+ (off_t)0);
+ if (p == MAP_FAILED)
+ err(EXIT_FAILURE, "Cannot map `%s'", argv[0]);
+ close(fd);
+ r = magic_buffer(m, p, l);
+ munmap(p, l);
+ } else {
+ r = magic_file(m, argv[0]);
+ }
+ magic_close(m);
+
+ printf("%s\n", r ? r : "(null)");
+
+ return 0;
+}
diff --git a/src/print.c b/src/print.c
index 09f6481136c4..6d9816ad5f56 100644
--- a/src/print.c
+++ b/src/print.c
@@ -32,7 +32,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: print.c,v 1.88 2020/05/09 18:57:15 christos Exp $")
+FILE_RCSID("@(#)$File: print.c,v 1.89 2021/06/30 10:08:48 christos Exp $")
#endif /* lint */
#include <string.h>
@@ -197,6 +197,11 @@ file_mdump(struct magic *m)
case FILE_LEDOUBLE:
(void) fprintf(stderr, "%G", m->value.d);
break;
+ case FILE_LEVARINT:
+ case FILE_BEVARINT:
+ (void)fprintf(stderr, "%s", file_fmtvarint(
+ m->value.us, m->type, tbuf, sizeof(tbuf)));
+ break;
case FILE_DEFAULT:
/* XXX - do anything here? */
break;
@@ -240,6 +245,13 @@ file_magwarn(struct magic_set *ms, const char *f, ...)
}
protected const char *
+file_fmtvarint(const unsigned char *us, int t, char *buf, size_t blen)
+{
+ snprintf(buf, blen, "%jd", file_varint2uintmax_t(us, t, NULL));
+ return buf;
+}
+
+protected const char *
file_fmttime(char *buf, size_t bsize, uint64_t v, int flags)
{
char *pp;
diff --git a/src/readelf.c b/src/readelf.c
index cf1dc91b7101..7dbef58af804 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -27,7 +27,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: readelf.c,v 1.173 2020/06/07 22:12:54 christos Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.178 2021/06/30 10:08:48 christos Exp $")
#endif
#ifdef BUILTIN_ELF
@@ -354,7 +354,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
size_t offset, len;
unsigned char nbuf[BUFSIZ];
ssize_t bufsize;
- off_t ph_off = off;
+ off_t ph_off = off, offs;
int ph_num = num;
if (ms->flags & MAGIC_MIME)
@@ -377,8 +377,11 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
for ( ; num; num--) {
if (pread(fd, xph_addr, xph_sizeof, off) <
CAST(ssize_t, xph_sizeof)) {
- file_badread(ms);
- return -1;
+ if (file_printf(ms,
+ ", can't read elf program headers at %jd",
+ (intmax_t)off) == -1)
+ return -1;
+ return 0;
}
off += size;
@@ -395,9 +398,12 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
* in the section.
*/
len = xph_filesz < sizeof(nbuf) ? xph_filesz : sizeof(nbuf);
- if ((bufsize = pread(fd, nbuf, len, xph_offset)) == -1) {
- file_badread(ms);
- return -1;
+ offs = xph_offset;
+ if ((bufsize = pread(fd, nbuf, len, offs)) == -1) {
+ if (file_printf(ms, " can't read note section at %jd",
+ (intmax_t)offs) == -1)
+ return -1;
+ return 0;
}
offset = 0;
for (;;) {
@@ -778,7 +784,7 @@ do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
if (file_printf(ms, ", from '%.31s', pid=%u, uid=%u, "
"gid=%u, nlwps=%u, lwp=%u (signal %u/code %u)",
- file_printable(sbuf, sizeof(sbuf),
+ file_printable(ms, sbuf, sizeof(sbuf),
RCAST(char *, pi.cpi_name), sizeof(pi.cpi_name)),
elf_getu32(swap, CAST(uint32_t, pi.cpi_pid)),
elf_getu32(swap, pi.cpi_euid),
@@ -912,7 +918,7 @@ do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
if (file_printf(ms, ", from '%s'",
file_copystr(buf, sizeof(buf),
CAST(size_t, cp - cname),
- CAST(const char *, cname))) == -1)
+ RCAST(char *, cname))) == -1)
return -1;
*flags |= FLAGS_DID_CORE;
return 1;
@@ -941,8 +947,12 @@ get_offset_from_virtaddr(struct magic_set *ms, int swap, int clazz, int fd,
for ( ; num; num--) {
if (pread(fd, xph_addr, xph_sizeof, off) <
CAST(ssize_t, xph_sizeof)) {
- file_badread(ms);
- return -1;
+ if (file_printf(ms,
+ ", can't read elf program header at %jd",
+ (intmax_t)off) == -1)
+ return -1;
+ return 0;
+
}
off += xph_sizeof;
@@ -972,7 +982,8 @@ get_string_on_virtaddr(struct magic_set *ms,
fsize, virtaddr);
if (offset < 0 ||
(buflen = pread(fd, buf, CAST(size_t, buflen), offset)) <= 0) {
- file_badread(ms);
+ (void)file_printf(ms, ", can't read elf string at %jd",
+ (intmax_t)offset);
return 0;
}
@@ -1099,7 +1110,7 @@ do_auxv_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
private size_t
dodynamic(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
- int clazz, int swap)
+ int clazz, int swap, int *pie, size_t *need)
{
Elf32_Dyn dh32;
Elf64_Dyn dh64;
@@ -1117,11 +1128,15 @@ dodynamic(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
switch (xdh_tag) {
case DT_FLAGS_1:
+ *pie = 1;
if (xdh_val & DF_1_PIE)
ms->mode |= 0111;
else
ms->mode &= ~0111;
break;
+ case DT_NEEDED:
+ (*need)++;
+ break;
default:
break;
}
@@ -1169,17 +1184,15 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
}
if (namesz & 0x80000000) {
- if (file_printf(ms, ", bad note name size %#lx",
- CAST(unsigned long, namesz)) == -1)
- return -1;
+ (void)file_printf(ms, ", bad note name size %#lx",
+ CAST(unsigned long, namesz));
return 0;
}
if (descsz & 0x80000000) {
- if (file_printf(ms, ", bad note description size %#lx",
- CAST(unsigned long, descsz)) == -1)
- return -1;
- return 0;
+ (void)file_printf(ms, ", bad note description size %#lx",
+ CAST(unsigned long, descsz));
+ return 0;
}
noff = offset;
@@ -1334,7 +1347,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
int stripped = 1, has_debug_info = 0;
size_t nbadcap = 0;
void *nbuf;
- off_t noff, coff, name_off;
+ off_t noff, coff, name_off, offs;
uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilities */
uint64_t cap_sf1 = 0; /* SunOS 5.x software capabilities */
char name[50];
@@ -1355,9 +1368,10 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
}
/* Read offset of name section to be able to read section names later */
- if (pread(fd, xsh_addr, xsh_sizeof, CAST(off_t, (off + size * strtab)))
- < CAST(ssize_t, xsh_sizeof)) {
- if (file_printf(ms, ", missing section headers") == -1)
+ offs = CAST(off_t, (off + size * strtab));
+ if (pread(fd, xsh_addr, xsh_sizeof, offs) < CAST(ssize_t, xsh_sizeof)) {
+ if (file_printf(ms, ", missing section headers at %jd",
+ (intmax_t)offs) == -1)
return -1;
return 0;
}
@@ -1372,10 +1386,14 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
for ( ; num; num--) {
/* Read the name of this section. */
- if ((namesize = pread(fd, name, sizeof(name) - 1,
- name_off + xsh_name)) == -1) {
- file_badread(ms);
- return -1;
+ offs = name_off + xsh_name;
+ if ((namesize = pread(fd, name, sizeof(name) - 1, offs))
+ == -1) {
+ if (file_printf(ms,
+ ", can't read name of elf section at %jd",
+ (intmax_t)offs) == -1)
+ return -1;
+ return 0;
}
name[namesize] = '\0';
if (strcmp(name, ".debug_info") == 0) {
@@ -1385,8 +1403,10 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
if (pread(fd, xsh_addr, xsh_sizeof, off) <
CAST(ssize_t, xsh_sizeof)) {
- file_badread(ms);
- return -1;
+ if (file_printf(ms, ", can't read elf section at %jd",
+ (intmax_t)off) == -1)
+ return -1;
+ return 0;
}
off += size;
@@ -1427,11 +1447,15 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
" for note");
return -1;
}
- if (pread(fd, nbuf, xsh_size, xsh_offset) <
+ offs = xsh_offset;
+ if (pread(fd, nbuf, xsh_size, offs) <
CAST(ssize_t, xsh_size)) {
- file_badread(ms);
free(nbuf);
- return -1;
+ if (file_printf(ms,
+ ", can't read elf note at %jd",
+ (intmax_t)offs) == -1)
+ return -1;
+ return 0;
}
noff = 0;
@@ -1608,9 +1632,10 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
}
/*
- * Look through the program headers of an executable image, searching
- * for a PT_INTERP section; if one is found, it's dynamically linked,
- * otherwise it's statically linked.
+ * Look through the program headers of an executable image, to determine
+ * if it is statically or dynamically linked. If it has a dynamic section,
+ * it is pie, and does not have an interpreter or needed libraries, we
+ * call it static pie.
*/
private int
dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
@@ -1619,12 +1644,13 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
- const char *linking_style = "statically";
+ const char *linking_style;
unsigned char nbuf[BUFSIZ];
char ibuf[BUFSIZ];
char interp[BUFSIZ];
ssize_t bufsize;
- size_t offset, align, len;
+ size_t offset, align, len, need = 0;
+ int pie = 0, dynamic = 0;
if (num == 0) {
if (file_printf(ms, ", no program header") == -1)
@@ -1642,8 +1668,11 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
int doread;
if (pread(fd, xph_addr, xph_sizeof, off) <
CAST(ssize_t, xph_sizeof)) {
- file_badread(ms);
- return -1;
+ if (file_printf(ms,
+ ", can't read elf program headers at %jd",
+ (intmax_t)off) == -1)
+ return -1;
+ return 0;
}
off += size;
@@ -1654,7 +1683,6 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
switch (xph_type) {
case PT_DYNAMIC:
doread = 1;
- linking_style = "dynamically";
break;
case PT_NOTE:
if (sh_num) /* Did this through section headers */
@@ -1683,10 +1711,14 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (doread) {
len = xph_filesz < sizeof(nbuf) ? xph_filesz
: sizeof(nbuf);
- bufsize = pread(fd, nbuf, len, xph_offset);
+ off_t offs = xph_offset;
+ bufsize = pread(fd, nbuf, len, offs);
if (bufsize == -1) {
- file_badread(ms);
- return -1;
+ if (file_printf(ms,
+ ", can't read section at %jd",
+ (intmax_t)offs) == -1)
+ return -1;
+ return 0;
}
} else
len = 0;
@@ -1694,6 +1726,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
/* Things we can determine when we seek */
switch (xph_type) {
case PT_DYNAMIC:
+ dynamic = 1;
offset = 0;
// Let DF_1 determine if we are PIE or not.
ms->mode &= ~0111;
@@ -1701,7 +1734,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (offset >= CAST(size_t, bufsize))
break;
offset = dodynamic(ms, nbuf, offset,
- CAST(size_t, bufsize), clazz, swap);
+ CAST(size_t, bufsize), clazz, swap,
+ &pie, &need);
if (offset == 0)
break;
}
@@ -1710,6 +1744,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
break;
case PT_INTERP:
+ need++;
if (ms->flags & MAGIC_MIME)
continue;
if (bufsize && nbuf[0]) {
@@ -1744,13 +1779,19 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
}
if (ms->flags & MAGIC_MIME)
return 0;
- if (file_printf(ms, ", %s linked", linking_style)
- == -1)
+ if (dynamic) {
+ if (pie && need == 0)
+ linking_style = "static-pie";
+ else
+ linking_style = "dynamically";
+ } else {
+ linking_style = "statically";
+ }
+ if (file_printf(ms, ", %s linked", linking_style) == -1)
return -1;
if (interp[0])
- if (file_printf(ms, ", interpreter %s",
- file_printable(ibuf, sizeof(ibuf), interp, sizeof(interp)))
- == -1)
+ if (file_printf(ms, ", interpreter %s", file_printable(ms,
+ ibuf, sizeof(ibuf), interp, sizeof(interp))) == -1)
return -1;
return 0;
}
diff --git a/src/seccomp.c b/src/seccomp.c
index e667adfe4e3c..f354f7abc4a3 100644
--- a/src/seccomp.c
+++ b/src/seccomp.c
@@ -27,7 +27,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: seccomp.c,v 1.15 2020/05/30 23:56:26 christos Exp $")
+FILE_RCSID("@(#)$File: seccomp.c,v 1.21 2021/09/24 14:17:24 christos Exp $")
#endif /* lint */
#if HAVE_LIBSECCOMP
@@ -35,6 +35,7 @@ FILE_RCSID("@(#)$File: seccomp.c,v 1.15 2020/05/30 23:56:26 christos Exp $")
#include <sys/prctl.h> /* prctl */
#include <sys/ioctl.h>
#include <sys/socket.h>
+#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
@@ -53,7 +54,8 @@ FILE_RCSID("@(#)$File: seccomp.c,v 1.15 2020/05/30 23:56:26 christos Exp $")
#define ALLOW_IOCTL_RULE(param) \
do \
if (seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(ioctl), 1, \
- SCMP_CMP(1, SCMP_CMP_EQ, param)) == -1) \
+ SCMP_CMP(1, SCMP_CMP_EQ, (scmp_datum_t)param, \
+ (scmp_datum_t)0)) == -1) \
goto out; \
while (/*CONSTCOND*/0)
@@ -170,13 +172,17 @@ enable_sandbox_full(void)
ALLOW_RULE(dup2);
ALLOW_RULE(exit);
ALLOW_RULE(exit_group);
+#ifdef __NR_faccessat
+ ALLOW_RULE(faccessat);
+#endif
ALLOW_RULE(fcntl);
ALLOW_RULE(fcntl64);
ALLOW_RULE(fstat);
ALLOW_RULE(fstat64);
-#ifdef XZLIBSUPPORT
- ALLOW_RULE(futex);
+#ifdef __NR_fstatat64
+ ALLOW_RULE(fstatat64);
#endif
+ ALLOW_RULE(futex);
ALLOW_RULE(getdents);
#ifdef __NR_getdents64
ALLOW_RULE(getdents64);
@@ -219,12 +225,14 @@ enable_sandbox_full(void)
ALLOW_RULE(rt_sigreturn);
ALLOW_RULE(select);
ALLOW_RULE(stat);
+ ALLOW_RULE(statx);
ALLOW_RULE(stat64);
ALLOW_RULE(sysinfo);
ALLOW_RULE(umask); // Used in file_pipe2file()
ALLOW_RULE(getpid); // Used by glibc in file_pipe2file()
ALLOW_RULE(unlink);
ALLOW_RULE(write);
+ ALLOW_RULE(writev);
#if 0
diff --git a/src/softmagic.c b/src/softmagic.c
index 95061e56fc89..8d2d7b725cad 100644
--- a/src/softmagic.c
+++ b/src/softmagic.c
@@ -32,7 +32,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.299 2020/06/07 21:58:01 christos Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.315 2021/09/03 13:17:52 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -277,11 +277,9 @@ flush:
goto flush;
}
- if (*m->desc)
- *found_match = 1;
-
if ((e = handle_annotation(ms, m, firstline)) != 0)
{
+ *found_match = 1;
*need_separator = 1;
*printed_something = 1;
*returnval = 1;
@@ -292,14 +290,17 @@ flush:
* If we are going to print something, we'll need to print
* a blank before we print something else.
*/
- if (print && *m->desc) {
- *need_separator = 1;
- *printed_something = 1;
- *returnval = 1;
- if (print_sep(ms, firstline) == -1)
- return -1;
- if (mprint(ms, m) == -1)
- return -1;
+ if (*m->desc) {
+ *found_match = 1;
+ if (print) {
+ *returnval = 1;
+ *need_separator = 1;
+ *printed_something = 1;
+ if (print_sep(ms, firstline) == -1)
+ return -1;
+ if (mprint(ms, m) == -1)
+ return -1;
+ }
}
switch (moffset(ms, m, &bb, &ms->c.li[cont_level].off)) {
@@ -390,17 +391,19 @@ flush:
} else
ms->c.li[cont_level].got_match = 1;
- if (*m->desc)
- *found_match = 1;
-
if ((e = handle_annotation(ms, m, firstline))
!= 0) {
+ *found_match = 1;
*need_separator = 1;
*printed_something = 1;
*returnval = 1;
return e;
}
+ if (*m->desc) {
+ *found_match = 1;
+ }
if (print && *m->desc) {
+ *returnval = 1;
/*
* This continuation matched. Print
* its message, with a blank before it
@@ -424,8 +427,6 @@ flush:
if (file_printf(ms, " ") == -1)
return -1;
}
- *returnval = 1;
- *need_separator = 0;
if (mprint(ms, m) == -1)
return -1;
*need_separator = 1;
@@ -456,15 +457,15 @@ flush:
firstline = 0;
}
if (*found_match) {
- if ((ms->flags & MAGIC_CONTINUE) == 0)
- return *returnval; /* don't keep searching */
- // So that we print a separator
- *printed_something = 0;
- firstline = 0;
+ if ((ms->flags & MAGIC_CONTINUE) == 0)
+ return *returnval;
+ // So that we print a separator
+ *printed_something = 0;
+ firstline = 0;
}
cont_level = 0;
}
- return *returnval; /* This is hit if -k is set or there is no match */
+ return *returnval;
}
private int
@@ -487,8 +488,8 @@ check_fmt(struct magic_set *ms, const char *fmt)
return rv;
}
-#if !defined(HAVE_STRNDUP) || defined(__aiws__)
-# ifdef __aiws__
+#if !defined(HAVE_STRNDUP) || defined(__aiws__) || defined(_AIX)
+# if defined(__aiws__) || defined(_AIX)
# define strndup aix_strndup /* aix is broken */
# endif
char *strndup(const char *, size_t);
@@ -580,94 +581,57 @@ mprint(struct magic_set *ms, struct magic *m)
else
desc = ebuf;
+#define PRINTER(value, format, stype, utype) \
+ v = file_signextend(ms, m, CAST(uint64_t, value)); \
+ switch (check_fmt(ms, desc)) { \
+ case -1: \
+ return -1; \
+ case 1: \
+ if (m->flag & UNSIGNED) { \
+ (void)snprintf(buf, sizeof(buf), "%" format "u", \
+ CAST(utype, v)); \
+ } else { \
+ (void)snprintf(buf, sizeof(buf), "%" format "d", \
+ CAST(stype, v)); \
+ } \
+ if (file_printf(ms, F(ms, desc, "%s"), buf) == -1) \
+ return -1; \
+ break; \
+ default: \
+ if (m->flag & UNSIGNED) { \
+ if (file_printf(ms, F(ms, desc, "%" format "u"), \
+ CAST(utype, v)) == -1) \
+ return -1; \
+ } else { \
+ if (file_printf(ms, F(ms, desc, "%" format "d"), \
+ CAST(stype, v)) == -1) \
+ return -1; \
+ } \
+ break; \
+ } \
+ t = ms->offset + sizeof(stype); \
+ break
+
switch (m->type) {
case FILE_BYTE:
- v = file_signextend(ms, m, CAST(uint64_t, p->b));
- switch (check_fmt(ms, desc)) {
- case -1:
- return -1;
- case 1:
- (void)snprintf(buf, sizeof(buf), "%d",
- CAST(unsigned char, v));
- if (file_printf(ms, F(ms, desc, "%s"), buf) == -1)
- return -1;
- break;
- default:
- if (file_printf(ms, F(ms, desc, "%d"),
- CAST(unsigned char, v)) == -1)
- return -1;
- break;
- }
- t = ms->offset + sizeof(char);
- break;
+ PRINTER(p->b, "", int8_t, uint8_t);
case FILE_SHORT:
case FILE_BESHORT:
case FILE_LESHORT:
- v = file_signextend(ms, m, CAST(uint64_t, p->h));
- switch (check_fmt(ms, desc)) {
- case -1:
- return -1;
- case 1:
- (void)snprintf(buf, sizeof(buf), "%u",
- CAST(unsigned short, v));
- if (file_printf(ms, F(ms, desc, "%s"), buf) == -1)
- return -1;
- break;
- default:
- if (file_printf(ms, F(ms, desc, "%u"),
- CAST(unsigned short, v)) == -1)
- return -1;
- break;
- }
- t = ms->offset + sizeof(short);
- break;
+ PRINTER(p->h, "", int16_t, uint16_t);
case FILE_LONG:
case FILE_BELONG:
case FILE_LELONG:
case FILE_MELONG:
- v = file_signextend(ms, m, CAST(uint64_t, p->l));
- switch (check_fmt(ms, desc)) {
- case -1:
- return -1;
- case 1:
- (void)snprintf(buf, sizeof(buf), "%u",
- CAST(uint32_t, v));
- if (file_printf(ms, F(ms, desc, "%s"), buf) == -1)
- return -1;
- break;
- default:
- if (file_printf(ms, F(ms, desc, "%u"),
- CAST(uint32_t, v)) == -1)
- return -1;
- break;
- }
- t = ms->offset + sizeof(int32_t);
- break;
+ PRINTER(p->l, "", int32_t, uint32_t);
case FILE_QUAD:
case FILE_BEQUAD:
case FILE_LEQUAD:
case FILE_OFFSET:
- v = file_signextend(ms, m, p->q);
- switch (check_fmt(ms, desc)) {
- case -1:
- return -1;
- case 1:
- (void)snprintf(buf, sizeof(buf), "%" INT64_T_FORMAT "u",
- CAST(unsigned long long, v));
- if (file_printf(ms, F(ms, desc, "%s"), buf) == -1)
- return -1;
- break;
- default:
- if (file_printf(ms, F(ms, desc, "%" INT64_T_FORMAT "u"),
- CAST(unsigned long long, v)) == -1)
- return -1;
- break;
- }
- t = ms->offset + sizeof(int64_t);
- break;
+ PRINTER(p->q, INT64_T_FORMAT, long long, unsigned long long);
case FILE_STRING:
case FILE_PSTRING:
@@ -675,7 +639,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_LESTRING16:
if (m->reln == '=' || m->reln == '!') {
if (file_printf(ms, F(ms, desc, "%s"),
- file_printable(sbuf, sizeof(sbuf), m->value.s,
+ file_printable(ms, sbuf, sizeof(sbuf), m->value.s,
sizeof(m->value.s))) == -1)
return -1;
t = ms->offset + m->vallen;
@@ -689,21 +653,11 @@ mprint(struct magic_set *ms, struct magic *m)
if (*m->value.s == '\0')
str[strcspn(str, "\r\n")] = '\0';
- if (m->str_flags & STRING_TRIM) {
- char *last;
- while (isspace(CAST(unsigned char, *str)))
- str++;
- last = str;
- while (*last)
- last++;
- --last;
- while (isspace(CAST(unsigned char, *last)))
- last--;
- *++last = '\0';
- }
-
+ if (m->str_flags & STRING_TRIM)
+ str = file_strtrim(str);
+
if (file_printf(ms, F(ms, desc, "%s"),
- file_printable(sbuf, sizeof(sbuf), str,
+ file_printable(ms, sbuf, sizeof(sbuf), str,
sizeof(p->s) - (str - p->s))) == -1)
return -1;
@@ -806,7 +760,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_SEARCH:
case FILE_REGEX: {
- char *cp;
+ char *cp, *scp;
int rval;
cp = strndup(RCAST(const char *, ms->search.s),
@@ -815,8 +769,10 @@ mprint(struct magic_set *ms, struct magic *m)
file_oomem(ms, ms->search.rm_len);
return -1;
}
- rval = file_printf(ms, F(ms, desc, "%s"),
- file_printable(sbuf, sizeof(sbuf), cp, ms->search.rm_len));
+ scp = (m->str_flags & STRING_TRIM) ? file_strtrim(cp) : cp;
+
+ rval = file_printf(ms, F(ms, desc, "%s"), file_printable(ms,
+ sbuf, sizeof(sbuf), scp, ms->search.rm_len));
free(cp);
if (rval == -1)
@@ -843,7 +799,7 @@ mprint(struct magic_set *ms, struct magic *m)
break;
case FILE_DER:
if (file_printf(ms, F(ms, desc, "%s"),
- file_printable(sbuf, sizeof(sbuf), ms->ms_value.s,
+ file_printable(ms, sbuf, sizeof(sbuf), ms->ms_value.s,
sizeof(ms->ms_value.s))) == -1)
return -1;
t = ms->offset;
@@ -970,6 +926,7 @@ moffset(struct magic_set *ms, struct magic *m, const struct buffer *b,
case FILE_DEFAULT:
case FILE_INDIRECT:
case FILE_OFFSET:
+ case FILE_USE:
o = ms->offset;
break;
@@ -1557,20 +1514,43 @@ normal:
}
private int
+save_cont(struct magic_set *ms, struct cont *c)
+{
+ size_t len;
+ *c = ms->c;
+ len = c->len * sizeof(*c->li);
+ ms->c.li = CAST(struct level_info *, malloc(len));
+ if (ms->c.li == NULL) {
+ ms->c = *c;
+ return -1;
+ }
+ memcpy(ms->c.li, c->li, len);
+ return 0;
+}
+
+private void
+restore_cont(struct magic_set *ms, struct cont *c)
+{
+ free(ms->c.li);
+ ms->c = *c;
+}
+
+private int
mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
const unsigned char *s, size_t nbytes, size_t o, unsigned int cont_level,
int mode, int text, int flip, uint16_t *indir_count, uint16_t *name_count,
int *printed_something, int *need_separator, int *returnval,
int *found_match)
{
- uint32_t offset = ms->offset;
+ uint32_t eoffset, offset = ms->offset;
struct buffer bb;
intmax_t lhs;
file_pushbuf_t *pb;
- int rv, oneed_separator, in_type;
+ int rv, oneed_separator, in_type, nfound_match;
char *rbuf;
union VALUETYPE *p = &ms->ms_value;
- struct mlist ml;
+ struct mlist ml, *mlp;
+ struct cont c;
if (*indir_count >= ms->indir_max) {
file_error(ms, 0, "indirect count (%hu) exceeded",
@@ -1839,8 +1819,15 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
bb = *b;
bb.fbuf = s + offset;
bb.flen = nbytes - offset;
- rv = file_softmagic(ms, &bb,
- indir_count, name_count, BINTEST, text);
+ for (mlp = ms->mlist[0]->next; mlp != ms->mlist[0];
+ mlp = mlp->next)
+ {
+ if ((rv = match(ms, mlp->magic, mlp->nmagic, &bb, 0,
+ BINTEST, text, 0, indir_count, name_count,
+ printed_something, need_separator, NULL,
+ NULL)) != 0)
+ break;
+ }
if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv);
@@ -1876,16 +1863,32 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
file_error(ms, 0, "cannot find entry `%s'", rbuf);
return -1;
}
- (*name_count)++;
+ if (save_cont(ms, &c) == -1) {
+ file_error(ms, errno, "can't allocate continuation");
+ return -1;
+ }
+
oneed_separator = *need_separator;
if (m->flag & NOSPACE)
*need_separator = 0;
+
+ nfound_match = 0;
+ (*name_count)++;
+ eoffset = ms->eoffset;
rv = match(ms, ml.magic, ml.nmagic, b, offset + o,
mode, text, flip, indir_count, name_count,
- printed_something, need_separator, returnval, found_match);
+ printed_something, need_separator, returnval,
+ &nfound_match);
+ ms->ms_value.q = nfound_match;
(*name_count)--;
+ *found_match |= nfound_match;
+
+ restore_cont(ms, &c);
+
if (rv != 1)
*need_separator = oneed_separator;
+ ms->offset = offset;
+ ms->eoffset = eoffset;
return rv;
case FILE_NAME:
@@ -1927,13 +1930,14 @@ file_strncmp(const char *s1, const char *s2, size_t len, size_t maxlen,
* but ignoring any nulls.
*/
v = 0;
+ len++;
if (0L == flags) { /* normal string: do it fast */
- while (len-- > 0)
+ while (--len > 0)
if ((v = *b++ - *a++) != '\0')
break;
}
else { /* combine the others */
- while (len-- > 0) {
+ while (--len > 0) {
if (b >= eb) {
v = 1;
break;
@@ -1951,7 +1955,8 @@ file_strncmp(const char *s1, const char *s2, size_t len, size_t maxlen,
else if ((flags & STRING_COMPACT_WHITESPACE) &&
isspace(*a)) {
a++;
- if (isspace(*b++)) {
+ if (isspace(*b)) {
+ b++;
if (!isspace(*a))
while (b < eb && isspace(*b))
b++;
@@ -1972,6 +1977,10 @@ file_strncmp(const char *s1, const char *s2, size_t len, size_t maxlen,
break;
}
}
+ if (len == 0 && v == 0 && (flags & STRING_FULL_WORD)) {
+ if (*b && !isspace(*b))
+ v = 1;
+ }
}
return v;
}
@@ -2144,8 +2153,10 @@ magiccheck(struct magic_set *ms, struct magic *m)
idx = ms->search.s_len;
found = CAST(const char *, memmem(ms->search.s, idx,
m->value.s, slen));
- if (!found)
- return 0;
+ if (!found) {
+ v = 1;
+ break;
+ }
idx = found - ms->search.s;
ms->search.offset += idx;
ms->search.rm_len = ms->search.s_len - idx;
@@ -2154,8 +2165,10 @@ magiccheck(struct magic_set *ms, struct magic *m)
#endif
for (idx = 0; m->str_range == 0 || idx < m->str_range; idx++) {
- if (slen + idx > ms->search.s_len)
- return 0;
+ if (slen + idx > ms->search.s_len) {
+ v = 1;
+ break;
+ }
v = file_strncmp(m->value.s, ms->search.s + idx, slen,
ms->search.s_len - idx, m->str_flags);
@@ -2229,9 +2242,10 @@ magiccheck(struct magic_set *ms, struct magic *m)
return -1;
break;
}
- case FILE_INDIRECT:
case FILE_USE:
+ return ms->ms_value.q != 0;
case FILE_NAME:
+ case FILE_INDIRECT:
return 1;
case FILE_DER:
matched = der_cmp(ms, m);
diff --git a/src/vasprintf.c b/src/vasprintf.c
index 49d33d4a4ac2..9b2cecb3ca75 100644
--- a/src/vasprintf.c
+++ b/src/vasprintf.c
@@ -108,7 +108,7 @@ you use strange formats.
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: vasprintf.c,v 1.17 2019/11/15 21:03:14 christos Exp $")
+FILE_RCSID("@(#)$File: vasprintf.c,v 1.19 2021/02/23 00:51:11 christos Exp $")
#endif /* lint */
#include <assert.h>
@@ -131,7 +131,7 @@ FILE_RCSID("@(#)$File: vasprintf.c,v 1.17 2019/11/15 21:03:14 christos Exp $")
* structure, which is passed among nearly every sub-functions.
*/
typedef struct {
- const char * src_string; /* current position into intput string */
+ const char * src_string; /* current position into input string */
char * buffer_base; /* output buffer */
char * dest_string; /* current position into output string */
size_t buffer_len; /* length of output buffer */
@@ -146,7 +146,7 @@ typedef struct {
/*
* Realloc buffer if needed
* Return value: 0 = ok
- * EOF = not enought memory
+ * EOF = not enough memory
*/
static int realloc_buff(xprintf_struct *s, size_t len)
{
@@ -178,7 +178,7 @@ static int usual_char(xprintf_struct * s)
{
size_t len;
- len = strcspn(s->src_string, "%"); /* reachs the next '%' or end of input string */
+ len = strcspn(s->src_string, "%"); /* reaches the next '%' or end of input string */
/* note: 'len' is never 0 because the presence of '%' */
/* or end-of-line is checked in the calling function */
@@ -245,7 +245,7 @@ static int type_s(xprintf_struct *s, int width, int prec,
if (arg_string == NULL)
return print_it(s, (size_t)6, "(null)", 0);
- /* hand-made strlen() whitch stops when 'prec' is reached. */
+ /* hand-made strlen() which stops when 'prec' is reached. */
/* if 'prec' is -1 then it is never reached. */
string_len = 0;
while (arg_string[string_len] != 0 && (size_t)prec != string_len)
@@ -258,7 +258,7 @@ static int type_s(xprintf_struct *s, int width, int prec,
}
/*
- * Read a serie of digits. Stop when non-digit is found.
+ * Read a series of digits. Stop when non-digit is found.
* Return value: the value read (between 0 and 32767).
* Note: no checks are made against overflow. If the string contain a big
* number, then the return value won't be what we want (but, in this case,
diff --git a/tests/JW07022A.mp3.result b/tests/JW07022A.mp3.result
index 8a3e11952ea0..f5911910ddb6 100644
--- a/tests/JW07022A.mp3.result
+++ b/tests/JW07022A.mp3.result
@@ -1 +1 @@
-Audio file with ID3 version 2.2.0, contains:MPEG ADTS, layer III, v1, 96 kbps, 44.1 kHz, Monaural \ No newline at end of file
+Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 96 kbps, 44.1 kHz, Monaural \ No newline at end of file
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e84ca13642a2..b44944346c0c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -3,48 +3,63 @@ test_LDADD = $(top_builddir)/src/libmagic.la
test_CPPFLAGS = -I$(top_builddir)/src
EXTRA_DIST = \
-regex-eol.magic \
-CVE-2014-1943.testfile \
-JW07022A.mp3.testfile \
-escapevel.testfile \
-fit-map-data.testfile \
-gedcom.testfile \
-hddrawcopytool.testfile \
-issue311docx.testfile \
-issue359xlsx.testfile \
-json1.testfile \
-json2.testfile \
-json3.testfile \
-regex-eol.testfile \
-zstd-v0.2-FF.testfile \
-zstd-v0.3-FF.testfile \
-zstd-v0.4-FF.testfile \
-zstd-v0.5-FF.testfile \
-zstd-v0.6-FF.testfile \
-zstd-v0.7-21.testfile \
-zstd-v0.7-22.testfile \
-zstd-v0.8-01.testfile \
-zstd-v0.8-02.testfile \
-zstd-v0.8-03.testfile \
-zstd-v0.8-16.testfile \
-zstd-v0.8-20.testfile \
-zstd-v0.8-21.testfile \
-zstd-v0.8-22.testfile \
-zstd-v0.8-23.testfile \
-zstd-v0.8-F4.testfile \
-zstd-v0.8-FF.testfile \
+android-vdex-1.result \
+android-vdex-1.testfile \
+android-vdex-2.result \
+android-vdex-2.testfile \
CVE-2014-1943.result \
+CVE-2014-1943.testfile \
JW07022A.mp3.result \
+JW07022A.mp3.testfile \
+bcachefs.result \
+bcachefs.testfile \
+cl8m8ocofedso.result \
+cl8m8ocofedso.testfile \
escapevel.result \
+escapevel.testfile \
+ext4.result \
+ext4.testfile \
fit-map-data.result \
+fit-map-data.testfile \
gedcom.result \
+gedcom.testfile \
hddrawcopytool.result \
+hddrawcopytool.testfile \
issue311docx.result \
+issue311docx.testfile \
issue359xlsx.result \
+issue359xlsx.testfile \
json1.result \
+json1.testfile \
json2.result \
+json2.testfile \
json3.result \
+json3.testfile \
+matilde.arm.result \
+matilde.arm.testfile \
+pcjr.result \
+pcjr.testfile \
+pgp-binary-key-v2-phil.result \
+pgp-binary-key-v2-phil.testfile \
+pgp-binary-key-v3-lutz.result \
+pgp-binary-key-v3-lutz.testfile \
+pgp-binary-key-v4-dsa.result \
+pgp-binary-key-v4-dsa.testfile \
+pgp-binary-key-v4-ecc-no-userid-secret.result \
+pgp-binary-key-v4-ecc-no-userid-secret.testfile \
+pgp-binary-key-v4-ecc-secret-key.result \
+pgp-binary-key-v4-ecc-secret-key.testfile \
+pgp-binary-key-v4-rsa-key.result \
+pgp-binary-key-v4-rsa-key.testfile \
+pgp-binary-key-v4-rsa-no-userid-secret.result \
+pgp-binary-key-v4-rsa-no-userid-secret.testfile \
+pgp-binary-key-v4-rsa-secret-key.result \
+pgp-binary-key-v4-rsa-secret-key.testfile \
+regex-eol.magic \
regex-eol.result \
+regex-eol.testfile \
+uf2.result \
+uf2.testfile \
zstd-3-skippable-frames.result \
zstd-dictionary-0.result \
zstd-dictionary-1.result \
@@ -54,24 +69,41 @@ zstd-skippable-frame-4.result \
zstd-skippable-frame-8.result \
zstd-skippable-frame-C.result \
zstd-v0.2-FF.result \
+zstd-v0.2-FF.testfile \
zstd-v0.3-FF.result \
+zstd-v0.3-FF.testfile \
zstd-v0.4-FF.result \
+zstd-v0.4-FF.testfile \
zstd-v0.5-FF.result \
+zstd-v0.5-FF.testfile \
zstd-v0.6-FF.result \
+zstd-v0.6-FF.testfile \
zstd-v0.7-00.result \
zstd-v0.7-21.result \
+zstd-v0.7-21.testfile \
zstd-v0.7-22.result \
+zstd-v0.7-22.testfile \
zstd-v0.8-00.result \
zstd-v0.8-01.result \
+zstd-v0.8-01.testfile \
zstd-v0.8-02.result \
+zstd-v0.8-02.testfile \
zstd-v0.8-03.result \
+zstd-v0.8-03.testfile \
zstd-v0.8-16.result \
+zstd-v0.8-16.testfile \
zstd-v0.8-20.result \
+zstd-v0.8-20.testfile \
zstd-v0.8-21.result \
+zstd-v0.8-21.testfile \
zstd-v0.8-22.result \
+zstd-v0.8-22.testfile \
zstd-v0.8-23.result \
+zstd-v0.8-23.testfile \
zstd-v0.8-F4.result \
-zstd-v0.8-FF.result
+zstd-v0.8-F4.testfile \
+zstd-v0.8-FF.result \
+zstd-v0.8-FF.testfile
T = $(top_srcdir)/tests
check-local:
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 2b0fa75be746..99264d83f5e4 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -92,7 +92,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -294,48 +295,63 @@ top_srcdir = @top_srcdir@
test_LDADD = $(top_builddir)/src/libmagic.la
test_CPPFLAGS = -I$(top_builddir)/src
EXTRA_DIST = \
-regex-eol.magic \
-CVE-2014-1943.testfile \
-JW07022A.mp3.testfile \
-escapevel.testfile \
-fit-map-data.testfile \
-gedcom.testfile \
-hddrawcopytool.testfile \
-issue311docx.testfile \
-issue359xlsx.testfile \
-json1.testfile \
-json2.testfile \
-json3.testfile \
-regex-eol.testfile \
-zstd-v0.2-FF.testfile \
-zstd-v0.3-FF.testfile \
-zstd-v0.4-FF.testfile \
-zstd-v0.5-FF.testfile \
-zstd-v0.6-FF.testfile \
-zstd-v0.7-21.testfile \
-zstd-v0.7-22.testfile \
-zstd-v0.8-01.testfile \
-zstd-v0.8-02.testfile \
-zstd-v0.8-03.testfile \
-zstd-v0.8-16.testfile \
-zstd-v0.8-20.testfile \
-zstd-v0.8-21.testfile \
-zstd-v0.8-22.testfile \
-zstd-v0.8-23.testfile \
-zstd-v0.8-F4.testfile \
-zstd-v0.8-FF.testfile \
+android-vdex-1.result \
+android-vdex-1.testfile \
+android-vdex-2.result \
+android-vdex-2.testfile \
CVE-2014-1943.result \
+CVE-2014-1943.testfile \
JW07022A.mp3.result \
+JW07022A.mp3.testfile \
+bcachefs.result \
+bcachefs.testfile \
+cl8m8ocofedso.result \
+cl8m8ocofedso.testfile \
escapevel.result \
+escapevel.testfile \
+ext4.result \
+ext4.testfile \
fit-map-data.result \
+fit-map-data.testfile \
gedcom.result \
+gedcom.testfile \
hddrawcopytool.result \
+hddrawcopytool.testfile \
issue311docx.result \
+issue311docx.testfile \
issue359xlsx.result \
+issue359xlsx.testfile \
json1.result \
+json1.testfile \
json2.result \
+json2.testfile \
json3.result \
+json3.testfile \
+matilde.arm.result \
+matilde.arm.testfile \
+pcjr.result \
+pcjr.testfile \
+pgp-binary-key-v2-phil.result \
+pgp-binary-key-v2-phil.testfile \
+pgp-binary-key-v3-lutz.result \
+pgp-binary-key-v3-lutz.testfile \
+pgp-binary-key-v4-dsa.result \
+pgp-binary-key-v4-dsa.testfile \
+pgp-binary-key-v4-ecc-no-userid-secret.result \
+pgp-binary-key-v4-ecc-no-userid-secret.testfile \
+pgp-binary-key-v4-ecc-secret-key.result \
+pgp-binary-key-v4-ecc-secret-key.testfile \
+pgp-binary-key-v4-rsa-key.result \
+pgp-binary-key-v4-rsa-key.testfile \
+pgp-binary-key-v4-rsa-no-userid-secret.result \
+pgp-binary-key-v4-rsa-no-userid-secret.testfile \
+pgp-binary-key-v4-rsa-secret-key.result \
+pgp-binary-key-v4-rsa-secret-key.testfile \
+regex-eol.magic \
regex-eol.result \
+regex-eol.testfile \
+uf2.result \
+uf2.testfile \
zstd-3-skippable-frames.result \
zstd-dictionary-0.result \
zstd-dictionary-1.result \
@@ -345,24 +361,41 @@ zstd-skippable-frame-4.result \
zstd-skippable-frame-8.result \
zstd-skippable-frame-C.result \
zstd-v0.2-FF.result \
+zstd-v0.2-FF.testfile \
zstd-v0.3-FF.result \
+zstd-v0.3-FF.testfile \
zstd-v0.4-FF.result \
+zstd-v0.4-FF.testfile \
zstd-v0.5-FF.result \
+zstd-v0.5-FF.testfile \
zstd-v0.6-FF.result \
+zstd-v0.6-FF.testfile \
zstd-v0.7-00.result \
zstd-v0.7-21.result \
+zstd-v0.7-21.testfile \
zstd-v0.7-22.result \
+zstd-v0.7-22.testfile \
zstd-v0.8-00.result \
zstd-v0.8-01.result \
+zstd-v0.8-01.testfile \
zstd-v0.8-02.result \
+zstd-v0.8-02.testfile \
zstd-v0.8-03.result \
+zstd-v0.8-03.testfile \
zstd-v0.8-16.result \
+zstd-v0.8-16.testfile \
zstd-v0.8-20.result \
+zstd-v0.8-20.testfile \
zstd-v0.8-21.result \
+zstd-v0.8-21.testfile \
zstd-v0.8-22.result \
+zstd-v0.8-22.testfile \
zstd-v0.8-23.result \
+zstd-v0.8-23.testfile \
zstd-v0.8-F4.result \
-zstd-v0.8-FF.result
+zstd-v0.8-F4.testfile \
+zstd-v0.8-FF.result \
+zstd-v0.8-FF.testfile
T = $(top_srcdir)/tests
all: all-am
diff --git a/tests/android-vdex-1.result b/tests/android-vdex-1.result
new file mode 100644
index 000000000000..2a4ef6d6b2cb
--- /dev/null
+++ b/tests/android-vdex-1.result
@@ -0,0 +1 @@
+Android vdex file, verifier deps version: 021, dex section version: 002, number of dex files: 4, verifier deps size: 106328 \ No newline at end of file
diff --git a/tests/android-vdex-1.testfile b/tests/android-vdex-1.testfile
new file mode 100644
index 000000000000..25f4f06ef91f
--- /dev/null
+++ b/tests/android-vdex-1.testfile
Binary files differ
diff --git a/tests/android-vdex-2.result b/tests/android-vdex-2.result
new file mode 100644
index 000000000000..498ae97c7b18
--- /dev/null
+++ b/tests/android-vdex-2.result
@@ -0,0 +1 @@
+Android vdex file, being processed by dex2oat, verifier deps version: 019, dex section version: 002, number of dex files: 1, verifier deps size: 1016 \ No newline at end of file
diff --git a/tests/android-vdex-2.testfile b/tests/android-vdex-2.testfile
new file mode 100644
index 000000000000..7e7761d7f359
--- /dev/null
+++ b/tests/android-vdex-2.testfile
Binary files differ
diff --git a/tests/bcachefs.result b/tests/bcachefs.result
new file mode 100644
index 000000000000..6f31de2ae9d5
--- /dev/null
+++ b/tests/bcachefs.result
@@ -0,0 +1 @@
+bcachefs, UUID=46bd306f-80ad-4cd0-af4f-147e7d85f393, label "Label", version 13, min version 13, device 0/UUID=72a60ede-4cb6-4374-aa70-cb38a50af5ef, 1 devices \ No newline at end of file
diff --git a/tests/bcachefs.testfile b/tests/bcachefs.testfile
new file mode 100644
index 000000000000..4e8a3949b821
--- /dev/null
+++ b/tests/bcachefs.testfile
Binary files differ
diff --git a/tests/cl8m8ocofedso.result b/tests/cl8m8ocofedso.result
new file mode 100644
index 000000000000..323c31a8e231
--- /dev/null
+++ b/tests/cl8m8ocofedso.result
@@ -0,0 +1 @@
+Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo \ No newline at end of file
diff --git a/tests/cl8m8ocofedso.testfile b/tests/cl8m8ocofedso.testfile
new file mode 100644
index 000000000000..4b1651bccc08
--- /dev/null
+++ b/tests/cl8m8ocofedso.testfile
Binary files differ
diff --git a/tests/ext4.result b/tests/ext4.result
new file mode 100644
index 000000000000..e48ac193380c
--- /dev/null
+++ b/tests/ext4.result
@@ -0,0 +1 @@
+Linux rev 1.0 ext4 filesystem data, UUID=d32bbb08-3a76-4510-a064-3045f887dbdf (extents) (64bit) (large files) (huge files) \ No newline at end of file
diff --git a/tests/ext4.testfile b/tests/ext4.testfile
new file mode 100644
index 000000000000..6add6b92a62f
--- /dev/null
+++ b/tests/ext4.testfile
Binary files differ
diff --git a/tests/matilde.arm.result b/tests/matilde.arm.result
new file mode 100644
index 000000000000..4d9190d9d319
--- /dev/null
+++ b/tests/matilde.arm.result
@@ -0,0 +1 @@
+Adaptive Multi-Rate Codec (GSM telephony) \ No newline at end of file
diff --git a/tests/matilde.arm.testfile b/tests/matilde.arm.testfile
new file mode 100644
index 000000000000..56ffab16e6fc
--- /dev/null
+++ b/tests/matilde.arm.testfile
Binary files differ
diff --git a/tests/pcjr.result b/tests/pcjr.result
new file mode 100644
index 000000000000..955c8c7750af
--- /dev/null
+++ b/tests/pcjr.result
@@ -0,0 +1 @@
+PCjr Cartridge image \ No newline at end of file
diff --git a/tests/pcjr.testfile b/tests/pcjr.testfile
new file mode 100644
index 000000000000..f8091d517084
--- /dev/null
+++ b/tests/pcjr.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v2-phil.result b/tests/pgp-binary-key-v2-phil.result
new file mode 100644
index 000000000000..9a0c0959b69d
--- /dev/null
+++ b/tests/pgp-binary-key-v2-phil.result
@@ -0,0 +1 @@
+OpenPGP Public Key Version 2, Created Fri May 21 05:20:00 1993, RSA (Encrypt or Sign, 1024 bits); User ID; Signature; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v2-phil.testfile b/tests/pgp-binary-key-v2-phil.testfile
new file mode 100644
index 000000000000..7c0952e64c5f
--- /dev/null
+++ b/tests/pgp-binary-key-v2-phil.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v3-lutz.result b/tests/pgp-binary-key-v3-lutz.result
new file mode 100644
index 000000000000..5a8dba9622af
--- /dev/null
+++ b/tests/pgp-binary-key-v3-lutz.result
@@ -0,0 +1 @@
+OpenPGP Public Key Version 3, Created Mon Mar 17 11:14:30 1997, RSA (Encrypt or Sign, 1127 bits); User ID; Signature; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v3-lutz.testfile b/tests/pgp-binary-key-v3-lutz.testfile
new file mode 100644
index 000000000000..90aa2dcc36ac
--- /dev/null
+++ b/tests/pgp-binary-key-v3-lutz.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v4-dsa.result b/tests/pgp-binary-key-v4-dsa.result
new file mode 100644
index 000000000000..e309526e7eea
--- /dev/null
+++ b/tests/pgp-binary-key-v4-dsa.result
@@ -0,0 +1 @@
+OpenPGP Public Key Version 4, Created Mon Apr 7 22:23:01 1997, DSA (1024 bits); User ID; Signature; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v4-dsa.testfile b/tests/pgp-binary-key-v4-dsa.testfile
new file mode 100644
index 000000000000..310efce0a091
--- /dev/null
+++ b/tests/pgp-binary-key-v4-dsa.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v4-ecc-no-userid-secret.result b/tests/pgp-binary-key-v4-ecc-no-userid-secret.result
new file mode 100644
index 000000000000..9d075017f7ed
--- /dev/null
+++ b/tests/pgp-binary-key-v4-ecc-no-userid-secret.result
@@ -0,0 +1 @@
+OpenPGP Secret Key Version 4, Created Wed Aug 26 20:52:13 2020, EdDSA; Signature; Secret Subkey; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v4-ecc-no-userid-secret.testfile b/tests/pgp-binary-key-v4-ecc-no-userid-secret.testfile
new file mode 100644
index 000000000000..289a291542e5
--- /dev/null
+++ b/tests/pgp-binary-key-v4-ecc-no-userid-secret.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v4-ecc-secret-key.result b/tests/pgp-binary-key-v4-ecc-secret-key.result
new file mode 100644
index 000000000000..ff323a7a22b0
--- /dev/null
+++ b/tests/pgp-binary-key-v4-ecc-secret-key.result
@@ -0,0 +1 @@
+OpenPGP Secret Key Version 4, Created Sat Aug 22 14:07:46 2020, EdDSA; User ID; Signature; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v4-ecc-secret-key.testfile b/tests/pgp-binary-key-v4-ecc-secret-key.testfile
new file mode 100644
index 000000000000..f53f47af95a7
--- /dev/null
+++ b/tests/pgp-binary-key-v4-ecc-secret-key.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v4-rsa-key.result b/tests/pgp-binary-key-v4-rsa-key.result
new file mode 100644
index 000000000000..c22310fb9dde
--- /dev/null
+++ b/tests/pgp-binary-key-v4-rsa-key.result
@@ -0,0 +1 @@
+OpenPGP Secret Key Version 4, Created Sat Aug 22 14:05:57 2020, RSA (Encrypt or Sign, 3072 bits); User ID; Signature; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v4-rsa-key.testfile b/tests/pgp-binary-key-v4-rsa-key.testfile
new file mode 100644
index 000000000000..7b70497d27f2
--- /dev/null
+++ b/tests/pgp-binary-key-v4-rsa-key.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v4-rsa-no-userid-secret.result b/tests/pgp-binary-key-v4-rsa-no-userid-secret.result
new file mode 100644
index 000000000000..c3c2ae22819f
--- /dev/null
+++ b/tests/pgp-binary-key-v4-rsa-no-userid-secret.result
@@ -0,0 +1 @@
+OpenPGP Secret Key Version 4, Created Sat Aug 22 20:13:52 2020, RSA (Encrypt or Sign, 3072 bits); Signature; Secret Subkey; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v4-rsa-no-userid-secret.testfile b/tests/pgp-binary-key-v4-rsa-no-userid-secret.testfile
new file mode 100644
index 000000000000..7d5a7b465f40
--- /dev/null
+++ b/tests/pgp-binary-key-v4-rsa-no-userid-secret.testfile
Binary files differ
diff --git a/tests/pgp-binary-key-v4-rsa-secret-key.result b/tests/pgp-binary-key-v4-rsa-secret-key.result
new file mode 100644
index 000000000000..c22310fb9dde
--- /dev/null
+++ b/tests/pgp-binary-key-v4-rsa-secret-key.result
@@ -0,0 +1 @@
+OpenPGP Secret Key Version 4, Created Sat Aug 22 14:05:57 2020, RSA (Encrypt or Sign, 3072 bits); User ID; Signature; OpenPGP Certificate \ No newline at end of file
diff --git a/tests/pgp-binary-key-v4-rsa-secret-key.testfile b/tests/pgp-binary-key-v4-rsa-secret-key.testfile
new file mode 100644
index 000000000000..7b70497d27f2
--- /dev/null
+++ b/tests/pgp-binary-key-v4-rsa-secret-key.testfile
Binary files differ
diff --git a/tests/test.c b/tests/test.c
index 502522f9d12c..468c9847209e 100644
--- a/tests/test.c
+++ b/tests/test.c
@@ -28,14 +28,19 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
+
#include "magic.h"
+static const char *prog;
+
static void *
xrealloc(void *p, size_t n)
{
p = realloc(p, n);
if (p == NULL) {
- (void)fprintf(stderr, "ERROR slurping file: out of memory\n");
+ (void)fprintf(stderr, "%s ERROR slurping file: %s\n",
+ prog, strerror(errno));
exit(10);
}
return p;
@@ -50,7 +55,7 @@ slurp(FILE *fp, size_t *final_len)
for (c = getc(fp); c != EOF; c = getc(fp)) {
if (s == l + len) {
- l = (char *)xrealloc(l, len * 2);
+ l = xrealloc(l, len * 2);
len *= 2;
}
*s++ = c;
@@ -69,47 +74,64 @@ main(int argc, char **argv)
{
struct magic_set *ms;
const char *result;
- char *desired;
- size_t desired_len;
- int i;
+ size_t result_len, desired_len;
+ char *desired = NULL;
+ int e = EXIT_FAILURE;
FILE *fp;
+
+ prog = strrchr(argv[0], '/');
+ if (prog)
+ prog++;
+ else
+ prog = argv[0];
+
ms = magic_open(MAGIC_NONE);
if (ms == NULL) {
- (void)fprintf(stderr, "ERROR opening MAGIC_NONE: out of memory\n");
- return 10;
+ (void)fprintf(stderr, "%s: ERROR opening MAGIC_NONE: %s\n",
+ prog, strerror(errno));
+ return e;
}
if (magic_load(ms, NULL) == -1) {
- (void)fprintf(stderr, "ERROR loading with NULL file: %s\n",
- magic_error(ms));
- return 11;
+ (void)fprintf(stderr, "%s: ERROR loading with NULL file: %s\n",
+ prog, magic_error(ms));
+ goto bad;
}
- if (argc > 1) {
- if (argc != 3) {
- (void)fprintf(stderr, "Usage: test TEST-FILE RESULT\n");
- } else {
- if ((result = magic_file(ms, argv[1])) == NULL) {
- (void)fprintf(stderr, "ERROR loading file %s: %s\n", argv[1], magic_error(ms));
- return 12;
- } else {
- fp = fopen(argv[2], "r");
- if (fp == NULL) {
- (void)fprintf(stderr, "ERROR opening `%s': ", argv[2]);
- perror(NULL);
- return 13;
- }
- desired = slurp(fp, &desired_len);
- fclose(fp);
- (void)printf("%s: %s\n", argv[1], result);
- if (strcmp(result, desired) != 0) {
- (void)fprintf(stderr, "Error: result was\n%s\nexpected:\n%s\n", result, desired);
- return 1;
- }
- }
- }
+ if (argc == 1) {
+ e = 0;
+ goto bad;
}
+ if (argc != 3) {
+ (void)fprintf(stderr, "Usage: %s TEST-FILE RESULT\n", prog);
+ magic_close(ms);
+ goto bad;
+ }
+ if ((result = magic_file(ms, argv[1])) == NULL) {
+ (void)fprintf(stderr, "%s: ERROR loading file %s: %s\n",
+ prog, argv[1], magic_error(ms));
+ goto bad;
+ }
+ fp = fopen(argv[2], "r");
+ if (fp == NULL) {
+ (void)fprintf(stderr, "%s: ERROR opening `%s': %s",
+ prog, argv[2], strerror(errno));
+ goto bad;
+ }
+ desired = slurp(fp, &desired_len);
+ fclose(fp);
+ (void)printf("%s: %s\n", argv[1], result);
+ if (strcmp(result, desired) != 0) {
+ result_len = strlen(result);
+ (void)fprintf(stderr, "%s: ERROR: result was (len %zu)\n%s\n"
+ "expected (len %zu)\n%s\n", prog, result_len, result,
+ desired_len, desired);
+ goto bad;
+ }
+ e = 0;
+bad:
+ free(desired);
magic_close(ms);
- return 0;
+ return e;
}
diff --git a/tests/uf2.result b/tests/uf2.result
new file mode 100644
index 000000000000..8dae28d47c03
--- /dev/null
+++ b/tests/uf2.result
@@ -0,0 +1 @@
+UF2 firmware image, family ESP32-S2, address 00000000, 4829 total blocks \ No newline at end of file
diff --git a/tests/uf2.testfile b/tests/uf2.testfile
new file mode 100644
index 000000000000..be95440392d4
--- /dev/null
+++ b/tests/uf2.testfile
Binary files differ