Module Name:    src
Committed By:   christos
Date:           Fri Apr  9 19:11:42 UTC 2021

Modified Files:
        src/external/bsd/file/dist: ChangeLog config.guess config.h.in
            configure configure.ac
        src/external/bsd/file/dist/doc: file.1 magic.5
        src/external/bsd/file/dist/magic: Makefile.am Makefile.in
        src/external/bsd/file/dist/magic/magdir: archive cad coff commands diff
            elf filesystems games jpeg linux mail.news msdos pgp xenix
        src/external/bsd/file/dist/python: Makefile.in
        src/external/bsd/file/dist/src: apprentice.c compress.c der.c
            encoding.c file.c file.h funcs.c is_csv.c magic.c readelf.c
            softmagic.c
        src/external/bsd/file/dist/tests: Makefile.in
        src/external/bsd/file/include: config.h

Log Message:
merge local changes between 5.39 and 5.40 and add magic entries from HEAD.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/external/bsd/file/dist/ChangeLog
cvs rdiff -u -r1.14 -r1.15 src/external/bsd/file/dist/config.guess
cvs rdiff -u -r1.15 -r1.16 src/external/bsd/file/dist/config.h.in
cvs rdiff -u -r1.23 -r1.24 src/external/bsd/file/dist/configure
cvs rdiff -u -r1.19 -r1.20 src/external/bsd/file/dist/configure.ac
cvs rdiff -u -r1.25 -r1.26 src/external/bsd/file/dist/doc/file.1
cvs rdiff -u -r1.22 -r1.23 src/external/bsd/file/dist/doc/magic.5
cvs rdiff -u -r1.19 -r1.20 src/external/bsd/file/dist/magic/Makefile.am
cvs rdiff -u -r1.22 -r1.23 src/external/bsd/file/dist/magic/Makefile.in
cvs rdiff -u -r1.18 -r1.19 src/external/bsd/file/dist/magic/magdir/archive
cvs rdiff -u -r1.1.1.12 -r1.2 src/external/bsd/file/dist/magic/magdir/cad
cvs rdiff -u -r1.1.1.4 -r1.2 src/external/bsd/file/dist/magic/magdir/coff
cvs rdiff -u -r1.1.1.14 -r1.2 \
    src/external/bsd/file/dist/magic/magdir/commands
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/file/dist/magic/magdir/diff \
    src/external/bsd/file/dist/magic/magdir/jpeg
cvs rdiff -u -r1.19 -r1.20 src/external/bsd/file/dist/magic/magdir/elf
cvs rdiff -u -r1.17 -r1.18 \
    src/external/bsd/file/dist/magic/magdir/filesystems
cvs rdiff -u -r1.1.1.10 -r1.2 src/external/bsd/file/dist/magic/magdir/games
cvs rdiff -u -r1.1.1.16 -r1.2 src/external/bsd/file/dist/magic/magdir/linux \
    src/external/bsd/file/dist/magic/magdir/msdos
cvs rdiff -u -r1.1.1.9 -r1.2 \
    src/external/bsd/file/dist/magic/magdir/mail.news
cvs rdiff -u -r1.8 -r1.9 src/external/bsd/file/dist/magic/magdir/pgp
cvs rdiff -u -r1.1.1.5 -r1.2 src/external/bsd/file/dist/magic/magdir/xenix
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/file/dist/python/Makefile.in
cvs rdiff -u -r1.25 -r1.26 src/external/bsd/file/dist/src/apprentice.c \
    src/external/bsd/file/dist/src/file.h
cvs rdiff -u -r1.20 -r1.21 src/external/bsd/file/dist/src/compress.c
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/file/dist/src/der.c
cvs rdiff -u -r1.9 -r1.10 src/external/bsd/file/dist/src/encoding.c
cvs rdiff -u -r1.15 -r1.16 src/external/bsd/file/dist/src/file.c \
    src/external/bsd/file/dist/src/magic.c
cvs rdiff -u -r1.18 -r1.19 src/external/bsd/file/dist/src/funcs.c
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/file/dist/src/is_csv.c
cvs rdiff -u -r1.24 -r1.25 src/external/bsd/file/dist/src/readelf.c
cvs rdiff -u -r1.23 -r1.24 src/external/bsd/file/dist/src/softmagic.c
cvs rdiff -u -r1.15 -r1.16 src/external/bsd/file/dist/tests/Makefile.in
cvs rdiff -u -r1.16 -r1.17 src/external/bsd/file/include/config.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/file/dist/ChangeLog
diff -u src/external/bsd/file/dist/ChangeLog:1.11 src/external/bsd/file/dist/ChangeLog:1.12
--- src/external/bsd/file/dist/ChangeLog:1.11	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/ChangeLog	Fri Apr  9 15:11:41 2021
@@ -1,3 +1,33 @@
+2021-03-30  20:21  Christos Zoulas <chris...@zoulas.com>
+
+	* release 5.40
+
+2021-02-05  16:31  Christos Zoulas <chris...@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 <chris...@zoulas.com>
+	* PR/77: Trim trailing separator.
+
+2020-12-17  15:44  Christos Zoulas <chris...@zoulas.com>
+
+	* PR/211: Convert system read errors from corrupt ELF
+	  files into human readable error messages
+
+2020-12-08  16:24  Christos Zoulas <chris...@zoulas.com>
+	
+	* fix multithreaded decompression file descriptor issue
+	  by using close-on-exec (Denys Vlasenko)
+
+2020-06-27  11:58  Christos Zoulas <chris...@zoulas.com>
+
+	* Exclude surrogate pairs from utf-8 detection (Michael Liu)
+
+2020-06-25  12:53  Christos Zoulas <chris...@zoulas.com>
+	
+	* Include # to the list of ignored format chars (Werner Fink)
+
 2020-06-14  20:02  Christos Zoulas <chris...@zoulas.com>
 
 	* release 5.39

Index: src/external/bsd/file/dist/config.guess
diff -u src/external/bsd/file/dist/config.guess:1.14 src/external/bsd/file/dist/config.guess:1.15
--- src/external/bsd/file/dist/config.guess:1.14	Tue Nov 17 05:35:11 2020
+++ src/external/bsd/file/dist/config.guess	Fri Apr  9 15:11:41 2021
@@ -188,10 +188,8 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
-	    earm*)
-		arch="${UNAME_MACHINE_ARCH#e}"
-		arch="${arch%eb}"
-		arch="${arch%hf}"
+	    earmv*)
+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
 		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
 		machine="${arch}${endian}"-unknown
 		;;
@@ -222,7 +220,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM
 	# Determine ABI tags.
 	case "$UNAME_MACHINE_ARCH" in
 	    earm*)
-		expr='s/v[0-9]//;s/earm/-eabi/;s/eb$//'
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
 		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
 		;;
 	esac

Index: src/external/bsd/file/dist/config.h.in
diff -u src/external/bsd/file/dist/config.h.in:1.15 src/external/bsd/file/dist/config.h.in:1.16
--- src/external/bsd/file/dist/config.h.in:1.15	Mon Dec 16 21:31:05 2019
+++ src/external/bsd/file/dist/config.h.in	Fri Apr  9 15:11:41 2021
@@ -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
 

Index: src/external/bsd/file/dist/configure
diff -u src/external/bsd/file/dist/configure:1.23 src/external/bsd/file/dist/configure:1.24
--- src/external/bsd/file/dist/configure:1.23	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/configure	Fri Apr  9 15:11:41 2021
@@ -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.40.
 #
 # Report bugs to <chris...@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.40'
+PACKAGE_STRING='file 5.40'
 PACKAGE_BUGREPORT='chris...@astron.com'
 PACKAGE_URL=''
 
@@ -1338,7 +1338,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.40 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1408,7 +1408,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.40:";;
    esac
   cat <<\_ACEOF
 
@@ -1531,7 +1531,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-file configure 5.39
+file configure 5.40
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2187,7 +2187,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.40, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3075,7 +3075,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='file'
- VERSION='5.39'
+ VERSION='5.40'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -14721,7 +14721,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"
@@ -15745,7 +15745,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
 # 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.40, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15811,7 +15811,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.40
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Index: src/external/bsd/file/dist/configure.ac
diff -u src/external/bsd/file/dist/configure.ac:1.19 src/external/bsd/file/dist/configure.ac:1.20
--- src/external/bsd/file/dist/configure.ac:1.19	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/configure.ac	Fri Apr  9 15:11:41 2021
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT([file],[5.39],[chris...@astron.com])
+AC_INIT([file],[5.40],[chris...@astron.com])
 AM_INIT_AUTOMAKE([subdir-objects foreign])
 AM_MAINTAINER_MODE(disable)
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -167,7 +167,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)

Index: src/external/bsd/file/dist/doc/file.1
diff -u src/external/bsd/file/dist/doc/file.1:1.25 src/external/bsd/file/dist/doc/file.1:1.26
--- src/external/bsd/file/dist/doc/file.1:1.25	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/doc/file.1	Fri Apr  9 15:11:41 2021
@@ -1,7 +1,7 @@
-.\"	$NetBSD: file.1,v 1.25 2020/06/15 00:37:24 christos Exp $
+.\"	$NetBSD: file.1,v 1.26 2021/04/09 19:11:41 christos Exp $
 .\"
-.\" $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 1
 .Os
 .Sh NAME
@@ -29,7 +29,7 @@
 .Nm
 .Op Fl Fl help
 .Sh DESCRIPTION
-This manual page documents version 5.39 of the
+This manual page documents version 5.40 of the
 .Nm
 command.
 .Pp
@@ -61,7 +61,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
@@ -93,14 +93,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.
@@ -170,7 +170,9 @@ in any of the character sets listed abov
 .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.
@@ -186,7 +188,7 @@ output file that contains a pre-parsed v
 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
@@ -238,7 +240,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.
@@ -272,13 +274,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
@@ -308,7 +312,7 @@ which is used for the matching (see also
 .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
@@ -341,6 +345,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
@@ -375,11 +380,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.
@@ -458,9 +465,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)
 
@@ -482,8 +489,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
 
@@ -508,7 +515,7 @@ is that this version treats any white sp
 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
@@ -555,7 +562,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.
@@ -667,7 +674,7 @@ and printing \e012- between entries is c
 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.
@@ -720,9 +727,13 @@ If the offsets specified internally in t
 .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

Index: src/external/bsd/file/dist/doc/magic.5
diff -u src/external/bsd/file/dist/doc/magic.5:1.22 src/external/bsd/file/dist/doc/magic.5:1.23
--- src/external/bsd/file/dist/doc/magic.5:1.22	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/doc/magic.5	Fri Apr  9 15:11:41 2021
@@ -1,4 +1,4 @@
-.\"	$NetBSD: magic.5,v 1.22 2020/06/15 00:37:24 christos Exp $
+.\"	$NetBSD: magic.5,v 1.23 2021/04/09 19:11:41 christos Exp $
 .\"
 .\" $File: magic.man,v 1.98 2020/05/09 18:55:23 christos Exp $
 .Dd May 9, 2020
@@ -12,7 +12,7 @@
 This manual page documents the format of magic files as
 used by the
 .Xr file 1
-command, version 5.39.
+command, version 5.40.
 The
 .Xr file 1
 command identifies the type of a file using,

Index: src/external/bsd/file/dist/magic/Makefile.am
diff -u src/external/bsd/file/dist/magic/Makefile.am:1.19 src/external/bsd/file/dist/magic/Makefile.am:1.20
--- src/external/bsd/file/dist/magic/Makefile.am:1.19	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/magic/Makefile.am	Fri Apr  9 15:11:41 2021
@@ -1,5 +1,5 @@
 #
-# $File: Makefile.am,v 1.157 2020/05/21 16:22:47 christos Exp $
+# $File: Makefile.am,v 1.166 2021/03/14 16:24:18 christos Exp $
 #
 MAGIC_FRAGMENT_BASE = magdir
 MAGIC_DIR = $(top_srcdir)/magic
@@ -13,6 +13,7 @@ $(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 \
@@ -33,6 +34,7 @@ $(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,6 +46,7 @@ $(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 \
@@ -69,6 +72,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 \
@@ -148,12 +152,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 \
@@ -221,11 +227,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 \
@@ -272,6 +280,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 \

Index: src/external/bsd/file/dist/magic/Makefile.in
diff -u src/external/bsd/file/dist/magic/Makefile.in:1.22 src/external/bsd/file/dist/magic/Makefile.in:1.23
--- src/external/bsd/file/dist/magic/Makefile.in:1.22	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/magic/Makefile.in	Fri Apr  9 15:11:41 2021
@@ -274,7 +274,7 @@ 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.166 2021/03/14 16:24:18 christos Exp $
 #
 MAGIC_FRAGMENT_BASE = magdir
 MAGIC_DIR = $(top_srcdir)/magic
@@ -286,6 +286,7 @@ $(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 \
@@ -306,6 +307,7 @@ $(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,6 +319,7 @@ $(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 \
@@ -342,6 +345,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 \
@@ -421,12 +425,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 \
@@ -494,11 +500,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 \
@@ -545,6 +553,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 \

Index: src/external/bsd/file/dist/magic/magdir/archive
diff -u src/external/bsd/file/dist/magic/magdir/archive:1.18 src/external/bsd/file/dist/magic/magdir/archive:1.19
--- src/external/bsd/file/dist/magic/magdir/archive:1.18	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/magic/magdir/archive	Fri Apr  9 15:11:41 2021
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------
-# $File: archive,v 1.138 2020/06/07 23:29:26 christos Exp $
+# $File: archive,v 1.146 2021/04/08 23:54:36 christos Exp $
 # archive:  file(1) magic for archive formats (see also "msdos" for self-
 #           extracting compressed archives)
 #
@@ -240,7 +240,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 +261,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
@@ -453,30 +453,45 @@
 # 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	(0x%8.8x)
 # tag size in bytes
->>0x44	ubelong		>0	\b, 0x%x tag size
+>0x44	ubelong		>0	\b, 0x%x tag size
 # data checksum
-#>>0x48	ubelong		x	\b, 0x%x checksum
+#>0x48	ubelong		x	\b, 0x%x checksum
 # tag checksum
-#>>0x4c	ubelong		x	\b, 0x%x tag checksum
+#>0x4c	ubelong		x	\b, 0x%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, 0x%x encoding
 # format byte
->>0x51	ubyte		x	\b, 0x%x format
-#>>0x54	ubequad		x	\b, data 0x%16.16llx
+>0x51	ubyte		x	\b, 0x%x format
+#>0x54	ubequad		x	\b, data 0x%16.16llx
 # ESP, could this conflict with Easy Software Products' (e.g.ESP ghostscript) documentation?
 0	string	ESP ESP archive data
 # ZPack
@@ -603,6 +618,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 0x%x
+# probably orginal 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
@@ -923,7 +953,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)
@@ -1331,6 +1361,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 +1504,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 <til...@code-monkey.de>
@@ -1719,3 +1760,24 @@
 # path[CXBTFFile[MaximumPathLength=256]
 >>9	string	x		\b, 1st %s
 
+# ALZIP archive
+# by Hyungjun Park <hyungjun.p...@worksmobile.com>, Hajin Jang <hajin_j...@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

Index: src/external/bsd/file/dist/magic/magdir/cad
diff -u src/external/bsd/file/dist/magic/magdir/cad:1.1.1.12 src/external/bsd/file/dist/magic/magdir/cad:1.2
--- src/external/bsd/file/dist/magic/magdir/cad:1.1.1.12	Fri Apr  9 14:58:01 2021
+++ src/external/bsd/file/dist/magic/magdir/cad	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: cad,v 1.25 2021/02/23 00:51:10 christos Exp $
+# $File: cad,v 1.26 2021/04/08 22:50:22 christos Exp $
 # autocad:  file(1) magic for cad files
 #
 
@@ -330,3 +330,10 @@
 
 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). The specification is at
+# https://github.com/KhronosGroup/glTF
+0	string		glTF		glTF binary asset
+>4	lelong		x		\b, version %d
+>8	lelong		x		\b, length %d bytes.
+!:mime	model/gltf-binary

Index: src/external/bsd/file/dist/magic/magdir/coff
diff -u src/external/bsd/file/dist/magic/magdir/coff:1.1.1.4 src/external/bsd/file/dist/magic/magdir/coff:1.2
--- src/external/bsd/file/dist/magic/magdir/coff:1.1.1.4	Fri Apr  9 14:58:01 2021
+++ src/external/bsd/file/dist/magic/magdir/coff	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: coff,v 1.4 2021/02/10 00:37:02 christos Exp $
+# $File: coff,v 1.5 2021/04/04 18:24:34 christos Exp $
 # coff: file(1) magic for Common Object Files not specific to known cpu types or manufactures
 #
 # COFF
@@ -34,6 +34,11 @@
 # https://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx
 >>>>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

Index: src/external/bsd/file/dist/magic/magdir/commands
diff -u src/external/bsd/file/dist/magic/magdir/commands:1.1.1.14 src/external/bsd/file/dist/magic/magdir/commands:1.2
--- src/external/bsd/file/dist/magic/magdir/commands:1.1.1.14	Sun Jun 14 20:18:48 2020
+++ src/external/bsd/file/dist/magic/magdir/commands	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: commands,v 1.63 2020/06/06 15:36:30 christos Exp $
+# $File: commands,v 1.64 2021/04/06 15:43:11 christos Exp $
 # commands:  file(1) magic for various shells and interpreters
 #
 #0	string/w	:			shell archive or script for antique kernel text
@@ -38,6 +38,10 @@
 0	search/1	#!/usr/bin/env\ zsh	Paul Falstad's zsh script text executable
 !:mime	text/x-shellscript
 
+0	string/wt	#!\ /bin/ash		Neil Brown's ash script text executable
+!:mime	text/x-shellscript
+0	string/wt	#!\ /usr/bin/ash	Neil Brown's ash script text executable
+!:mime	text/x-shellscript
 0	string/wt	#!\ /usr/local/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

Index: src/external/bsd/file/dist/magic/magdir/diff
diff -u src/external/bsd/file/dist/magic/magdir/diff:1.5 src/external/bsd/file/dist/magic/magdir/diff:1.6
--- src/external/bsd/file/dist/magic/magdir/diff:1.5	Wed May 24 20:11:26 2017
+++ src/external/bsd/file/dist/magic/magdir/diff	Fri Apr  9 15:11:41 2021
@@ -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
 
Index: src/external/bsd/file/dist/magic/magdir/jpeg
diff -u src/external/bsd/file/dist/magic/magdir/jpeg:1.5 src/external/bsd/file/dist/magic/magdir/jpeg:1.6
--- src/external/bsd/file/dist/magic/magdir/jpeg:1.5	Thu Oct 18 20:11:48 2018
+++ src/external/bsd/file/dist/magic/magdir/jpeg	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: jpeg,v 1.32 2018/10/01 18:58:29 christos Exp $
+# $File: jpeg,v 1.33 2021/03/21 15:04:50 christos Exp $
 # JPEG images
 # SunOS 5.5.1 had
 #
@@ -124,3 +124,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

Index: src/external/bsd/file/dist/magic/magdir/elf
diff -u src/external/bsd/file/dist/magic/magdir/elf:1.19 src/external/bsd/file/dist/magic/magdir/elf:1.20
--- src/external/bsd/file/dist/magic/magdir/elf:1.19	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/magic/magdir/elf	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: elf,v 1.80 2020/02/12 22:17:33 christos Exp $
+# $File: elf,v 1.85 2021/03/27 20:18:38 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		Loongson Loongarch,
+>18	leshort		259		ChipON KungFu32,
 >18	leshort		0x1057		AVR (unofficial),
 >18	leshort		0x1059		MSP430 (unofficial),
 >18	leshort		0x1223		Adapteva Epiphany (unofficial),

Index: src/external/bsd/file/dist/magic/magdir/filesystems
diff -u src/external/bsd/file/dist/magic/magdir/filesystems:1.17 src/external/bsd/file/dist/magic/magdir/filesystems:1.18
--- src/external/bsd/file/dist/magic/magdir/filesystems:1.17	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/magic/magdir/filesystems	Fri Apr  9 15:11:41 2021
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------
-# $File: filesystems,v 1.133 2020/05/17 19:32:00 christos Exp $
+# $File: filesystems,v 1.141 2021/04/04 17:46:17 christos Exp $
 # filesystems:  file(1) magic for different filesystems
 #
 0	name	partid
@@ -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 0x%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
@@ -491,7 +503,7 @@
 # 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
@@ -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
@@ -1296,7 +1308,7 @@
 # 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
@@ -1358,7 +1370,7 @@
 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
@@ -1421,7 +1433,7 @@
 # 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
+# extended boot signature value is 0x80 for NTFS, 0x28 or 0x29 for others
 >>>>>>>>38	ubyte		!0x29		\b, dos < 4.0 BootSector (0x%x)
 >>>>>>>>38	ubyte&0xFE	=0x28
 >>>>>>>>>39	ulelong		x		\b, serial number 0x%x
@@ -1727,12 +1739,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 +1767,12 @@
 
 # f2fs filesystem - Tuomas Tynkkynen <tuomas.tynkky...@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 <cespe...@debian.org>
@@ -1980,11 +1992,14 @@
 # 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
@@ -2281,20 +2296,20 @@
 >>0x10060        string          >\0             lockproto %s)
 
 # Russell Coker <russ...@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" <nao...@gmail.com>
@@ -2433,3 +2448,28 @@
 >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

Index: src/external/bsd/file/dist/magic/magdir/games
diff -u src/external/bsd/file/dist/magic/magdir/games:1.1.1.10 src/external/bsd/file/dist/magic/magdir/games:1.2
--- src/external/bsd/file/dist/magic/magdir/games:1.1.1.10	Fri Apr  9 14:58:02 2021
+++ src/external/bsd/file/dist/magic/magdir/games	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: games,v 1.22 2021/02/23 00:51:10 christos Exp $
+# $File: games,v 1.23 2021/04/06 21:58:26 christos Exp $
 # games:  file(1) for games
 
 # Fabio Bonelli <fabiobone...@libero.it>
@@ -320,3 +320,201 @@
 !: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 <o...@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

Index: src/external/bsd/file/dist/magic/magdir/linux
diff -u src/external/bsd/file/dist/magic/magdir/linux:1.1.1.16 src/external/bsd/file/dist/magic/magdir/linux:1.2
--- src/external/bsd/file/dist/magic/magdir/linux:1.1.1.16	Fri Apr  9 14:58:02 2021
+++ src/external/bsd/file/dist/magic/magdir/linux	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: linux,v 1.77 2021/02/24 23:05:02 christos Exp $
+# $File: linux,v 1.78 2021/04/04 17:46:17 christos Exp $
 # linux:  file(1) magic for Linux files
 #
 # Values for Linux/i386 binaries, from Daniel Quinlan <quin...@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
Index: src/external/bsd/file/dist/magic/magdir/msdos
diff -u src/external/bsd/file/dist/magic/magdir/msdos:1.1.1.16 src/external/bsd/file/dist/magic/magdir/msdos:1.2
--- src/external/bsd/file/dist/magic/magdir/msdos:1.1.1.16	Fri Apr  9 14:58:02 2021
+++ src/external/bsd/file/dist/magic/magdir/msdos	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: msdos,v 1.145 2021/02/23 00:51:10 christos Exp $
+# $File: msdos,v 1.147 2021/04/08 12:09:58 christos Exp $
 # msdos:  file(1) magic for MS-DOS files
 #
 
@@ -364,6 +364,87 @@
 >>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 0x%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

Index: src/external/bsd/file/dist/magic/magdir/mail.news
diff -u src/external/bsd/file/dist/magic/magdir/mail.news:1.1.1.9 src/external/bsd/file/dist/magic/magdir/mail.news:1.2
--- src/external/bsd/file/dist/magic/magdir/mail.news:1.1.1.9	Fri Apr  9 14:58:02 2021
+++ src/external/bsd/file/dist/magic/magdir/mail.news	Fri Apr  9 15:11:41 2021
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------
-# $File: mail.news,v 1.26 2021/03/21 14:37:03 christos Exp $
+# $File: mail.news,v 1.27 2021/04/05 16:36:14 christos Exp $
 # mail.news:  file(1) magic for mail and news
 #
 # Unfortunately, saved netnews also has From line added in some news software.
@@ -81,4 +81,4 @@
 # File format spec: https://wiki.dovecot.org/Design/Dcrypt/#File_format
 # From: Stephen Gildea
 0	string	CRYPTED\003\007		Dovecot encrypted message
->9	byte	xu			\b, dcrypt version %d
+>9	byte	x			\b, dcrypt version %d

Index: src/external/bsd/file/dist/magic/magdir/pgp
diff -u src/external/bsd/file/dist/magic/magdir/pgp:1.8 src/external/bsd/file/dist/magic/magdir/pgp:1.9
--- src/external/bsd/file/dist/magic/magdir/pgp:1.8	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/magic/magdir/pgp	Fri Apr  9 15:11:41 2021
@@ -1,54 +1,11 @@
 
 #------------------------------------------------------------------------------
-# $File: pgp,v 1.21 2020/03/20 17:11:05 christos Exp $
+# $File: pgp,v 1.24 2020/10/14 21:07:29 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

Index: src/external/bsd/file/dist/magic/magdir/xenix
diff -u src/external/bsd/file/dist/magic/magdir/xenix:1.1.1.5 src/external/bsd/file/dist/magic/magdir/xenix:1.2
--- src/external/bsd/file/dist/magic/magdir/xenix:1.1.1.5	Fri Apr  9 14:58:02 2021
+++ src/external/bsd/file/dist/magic/magdir/xenix	Fri Apr  9 15:11:41 2021
@@ -1,6 +1,6 @@
 
 #------------------------------------------------------------------------------
-# $File: xenix,v 1.12 2021/02/23 00:51:10 christos Exp $
+# $File: xenix,v 1.13 2021/03/31 19:51:14 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 positive record length
 >>1	uleshort	>0
 # 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
+# second recordtype: 96h~LNAMES 88h~COMENT 8CH~EXTDEF
+>>>>>(1.s+3)	ubyte	x		\b, 2nd record type 0x%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

Index: src/external/bsd/file/dist/python/Makefile.in
diff -u src/external/bsd/file/dist/python/Makefile.in:1.13 src/external/bsd/file/dist/python/Makefile.in:1.14
--- src/external/bsd/file/dist/python/Makefile.in:1.13	Mon Dec 16 21:31:05 2019
+++ src/external/bsd/file/dist/python/Makefile.in	Fri Apr  9 15:11:42 2021
@@ -119,7 +119,7 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
+am__DIST_COMMON = $(srcdir)/Makefile.in README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 pkgdatadir = @pkgdatadir@
 ACLOCAL = @ACLOCAL@

Index: src/external/bsd/file/dist/src/apprentice.c
diff -u src/external/bsd/file/dist/src/apprentice.c:1.25 src/external/bsd/file/dist/src/apprentice.c:1.26
--- src/external/bsd/file/dist/src/apprentice.c:1.25	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/apprentice.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: apprentice.c,v 1.25 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: apprentice.c,v 1.26 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Ian F. Darwin 1986-1995.
@@ -35,9 +35,9 @@
 
 #ifndef	lint
 #if 0
-FILE_RCSID("@(#)$File: apprentice.c,v 1.297 2020/05/09 18:57:15 christos Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.301 2021/02/23 00:51:11 christos Exp $")
 #else
-__RCSID("$NetBSD: apprentice.c,v 1.25 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: apprentice.c,v 1.26 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif	/* lint */
 
@@ -549,6 +549,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);
@@ -1467,7 +1468,10 @@ apprentice_load(struct magic_set *ms, co
 		 */
 		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++;
@@ -2138,6 +2142,13 @@ parse(struct magic_set *ms, struct magic
 		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? */
 
@@ -2747,7 +2758,7 @@ getvalue(struct magic_set *ms, struct ma
 		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;
Index: src/external/bsd/file/dist/src/file.h
diff -u src/external/bsd/file/dist/src/file.h:1.25 src/external/bsd/file/dist/src/file.h:1.26
--- src/external/bsd/file/dist/src/file.h:1.25	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/file.h	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: file.h,v 1.25 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: file.h,v 1.26 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Ian F. Darwin 1986-1995.
@@ -29,7 +29,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.225 2021/02/05 22:29:07 christos Exp $
  */
 
 #ifndef __file_h__
@@ -145,6 +145,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 */
@@ -412,14 +420,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 */
@@ -454,6 +464,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
@@ -463,10 +474,11 @@ 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
@@ -500,9 +512,9 @@ protected int file_zmagic(struct magic_s
 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 *);
@@ -529,7 +541,7 @@ protected size_t file_mbswidth(const cha
 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 *);
@@ -540,6 +552,9 @@ protected char * file_printable(char *, 
 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);

Index: src/external/bsd/file/dist/src/compress.c
diff -u src/external/bsd/file/dist/src/compress.c:1.20 src/external/bsd/file/dist/src/compress.c:1.21
--- src/external/bsd/file/dist/src/compress.c:1.20	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/compress.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: compress.c,v 1.20 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: compress.c,v 1.21 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Ian F. Darwin 1986-1995.
@@ -38,9 +38,9 @@
 
 #ifndef lint
 #if 0
-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 $")
 #else
-__RCSID("$NetBSD: compress.c,v 1.20 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: compress.c,v 1.21 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif
 
@@ -77,7 +77,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
@@ -850,8 +850,23 @@ uncompressbuf(int fd, size_t bytes_max, 
 	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",
@@ -882,16 +897,20 @@ uncompressbuf(int fd, size_t bytes_max, 
 			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)));

Index: src/external/bsd/file/dist/src/der.c
diff -u src/external/bsd/file/dist/src/der.c:1.6 src/external/bsd/file/dist/src/der.c:1.7
--- src/external/bsd/file/dist/src/der.c:1.6	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/der.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: der.c,v 1.6 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: der.c,v 1.7 2021/04/09 19:11:42 christos Exp $	*/
 
 /*-
  * Copyright (c) 2016 Christos Zoulas
@@ -38,9 +38,9 @@
 
 #ifndef lint
 #if 0
-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 $")
 #else
-__RCSID("$NetBSD: der.c,v 1.6 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: der.c,v 1.7 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif
 #else

Index: src/external/bsd/file/dist/src/encoding.c
diff -u src/external/bsd/file/dist/src/encoding.c:1.9 src/external/bsd/file/dist/src/encoding.c:1.10
--- src/external/bsd/file/dist/src/encoding.c:1.9	Mon Dec 16 21:31:05 2019
+++ src/external/bsd/file/dist/src/encoding.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: encoding.c,v 1.9 2019/12/17 02:31:05 christos Exp $	*/
+/*	$NetBSD: encoding.c,v 1.10 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Ian F. Darwin 1986-1995.
@@ -38,9 +38,9 @@
 
 #ifndef	lint
 #if 0
-FILE_RCSID("@(#)$File: encoding.c,v 1.21 2019/06/08 20:49:14 christos Exp $")
+FILE_RCSID("@(#)$File: encoding.c,v 1.27 2021/02/05 21:33:49 christos Exp $")
 #else
-__RCSID("$NetBSD: encoding.c,v 1.9 2019/12/17 02:31:05 christos Exp $");
+__RCSID("$NetBSD: encoding.c,v 1.10 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif	/* lint */
 
@@ -49,14 +49,20 @@ __RCSID("$NetBSD: encoding.c,v 1.9 2019/
 #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
@@ -68,19 +74,20 @@ private void from_ebcdic(const unsigned 
 /*
  * 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)
@@ -93,8 +100,12 @@ file_encoding(struct magic_set *ms, cons
 	*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;
 	}
@@ -108,7 +119,7 @@ file_encoding(struct magic_set *ms, cons
 	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));
@@ -117,27 +128,27 @@ file_encoding(struct magic_set *ms, cons
 		}
 	} 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));
@@ -255,64 +266,40 @@ 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;
-}
-
-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;
+#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, u; \
+	unsigned char dist[256]; \
+	memset(dist, 0, sizeof(dist)); \
+\
+	*ulen = 0; \
+\
+	for (i = 0; i < nbytes; i++) { \
+		int t = text_chars[buf[i]]; \
+\
+		if (COND) \
+			return 0; \
+\
+		ubuf[(*ulen)++] = buf[i]; \
+		dist[buf[i]]++; \
+	} \
+	u = 0; \
+	for (i = 0; i < __arraycount(dist); i++) { \
+		if (dist[i]) \
+			u++; \
+	} \
+	if (u < 3) \
+		return 0; \
+\
+	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:
@@ -325,12 +312,65 @@ looks_extended(const unsigned char *buf,
  * 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)
@@ -352,6 +392,11 @@ file_looks_utf8(const unsigned char *buf
 			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;
@@ -376,6 +421,10 @@ file_looks_utf8(const unsigned char *buf
 				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;
 
@@ -397,8 +446,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);
@@ -407,7 +456,8 @@ looks_utf8_with_BOM(const unsigned char 
 }
 
 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]) {
@@ -426,7 +476,7 @@ looks_utf7(const unsigned char *buf, siz
 }
 
 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;
@@ -449,10 +499,10 @@ looks_ucs16(const unsigned char *bf, siz
 
 		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;
@@ -465,7 +515,7 @@ looks_ucs16(const unsigned char *bf, siz
 }
 
 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;
@@ -487,15 +537,15 @@ looks_ucs32(const unsigned char *bf, siz
 		/* 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;

Index: src/external/bsd/file/dist/src/file.c
diff -u src/external/bsd/file/dist/src/file.c:1.15 src/external/bsd/file/dist/src/file.c:1.16
--- src/external/bsd/file/dist/src/file.c:1.15	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/file.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: file.c,v 1.15 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: file.c,v 1.16 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Ian F. Darwin 1986-1995.
@@ -35,9 +35,9 @@
 
 #ifndef	lint
 #if 0
-FILE_RCSID("@(#)$File: file.c,v 1.187 2020/06/07 17:38:30 christos Exp $")
+FILE_RCSID("@(#)$File: file.c,v 1.189 2021/02/05 21:33:49 christos Exp $")
 #else
-__RCSID("$NetBSD: file.c,v 1.15 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: file.c,v 1.16 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif	/* lint */
 
@@ -152,6 +152,8 @@ private struct {
 	    "max ELF prog sections processed" },
 	{ "elf_shnum",	MAGIC_PARAM_ELF_SHNUM_MAX, 0, 0, FILE_ELF_SHNUM_MAX,
 	    "max ELF sections processed" },
+	{ "encoding",	MAGIC_PARAM_ENCODING_MAX, 0, 0, FILE_ENCODING_MAX,
+	    "max bytes to scan for encoding" },
 	{ "indir",	MAGIC_PARAM_INDIR_MAX, 0, 0, FILE_INDIR_MAX,
 	    "recursion limit for indirection" },
 	{ "name",	MAGIC_PARAM_NAME_MAX, 0, 0, FILE_NAME_MAX,
@@ -529,8 +531,6 @@ unwrap(struct magic_set *ms, const char 
 		if (line[len - 1] == '\n')
 			line[len - 1] = '\0';
 		e |= process(ms, line, wid);
-		if(nobuffer)
-			(void)fflush(stdout);
 	}
 
 	free(line);
@@ -562,11 +562,12 @@ process(struct magic_set *ms, const char
 
 	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
Index: src/external/bsd/file/dist/src/magic.c
diff -u src/external/bsd/file/dist/src/magic.c:1.15 src/external/bsd/file/dist/src/magic.c:1.16
--- src/external/bsd/file/dist/src/magic.c:1.15	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/magic.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: magic.c,v 1.15 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: magic.c,v 1.16 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Christos Zoulas 2003.
@@ -36,9 +36,9 @@
 
 #ifndef	lint
 #if 0
-FILE_RCSID("@(#)$File: magic.c,v 1.112 2020/06/08 19:44:10 christos Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.114 2021/02/05 21:33:49 christos Exp $")
 #else
-__RCSID("$NetBSD: magic.c,v 1.15 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: magic.c,v 1.16 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif	/* lint */
 
@@ -442,7 +442,7 @@ file_or_fd(struct magic_set *ms, const c
 		_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;
@@ -466,6 +466,9 @@ file_or_fd(struct magic_set *ms, const c
 			rv = 0;
 			goto done;
 		}
+#if O_CLOEXEC == 0
+		(void)fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
 	}
 
 	if (fd != -1) {
@@ -620,6 +623,9 @@ magic_setparam(struct magic_set *ms, int
 	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;
@@ -653,6 +659,9 @@ magic_getparam(struct magic_set *ms, int
 	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;

Index: src/external/bsd/file/dist/src/funcs.c
diff -u src/external/bsd/file/dist/src/funcs.c:1.18 src/external/bsd/file/dist/src/funcs.c:1.19
--- src/external/bsd/file/dist/src/funcs.c:1.18	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/funcs.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: funcs.c,v 1.18 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: funcs.c,v 1.19 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Christos Zoulas 2003.
@@ -30,9 +30,9 @@
 
 #ifndef	lint
 #if 0
-FILE_RCSID("@(#)$File: funcs.c,v 1.115 2020/02/20 15:50:20 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.121 2021/02/05 22:29:07 christos Exp $")
 #else
-__RCSID("$NetBSD: funcs.c,v 1.18 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: funcs.c,v 1.19 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif	/* lint */
 
@@ -42,6 +42,9 @@ __RCSID("$NetBSD: funcs.c,v 1.18 2020/06
 #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
@@ -99,7 +102,7 @@ file_checkfmt(char *msg, size_t mlen, co
 		if (*++p == '%')
 			continue;
 		// Skip uninteresting.
-		while (strchr("0.'+- ", *p) != NULL)
+		while (strchr("#0.'+- ", *p) != NULL)
 			p++;
 		if (*p == '*') {
 			if (msg)
@@ -251,11 +254,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
@@ -459,6 +482,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)
@@ -790,3 +814,39 @@ file_print_guid(char *str, size_t len, c
 	    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;
+}

Index: src/external/bsd/file/dist/src/is_csv.c
diff -u src/external/bsd/file/dist/src/is_csv.c:1.2 src/external/bsd/file/dist/src/is_csv.c:1.3
--- src/external/bsd/file/dist/src/is_csv.c:1.2	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/is_csv.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: is_csv.c,v 1.2 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: is_csv.c,v 1.3 2021/04/09 19:11:42 christos Exp $	*/
 
 /*-
  * Copyright (c) 2019 Christos Zoulas
@@ -35,9 +35,9 @@
 
 #ifndef lint
 #if 0
-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 $")
 #else
-__RCSID("$NetBSD: is_csv.c,v 1.2 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: is_csv.c,v 1.3 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif
 
@@ -155,7 +155,7 @@ file_is_csv(struct magic_set *ms, const 
 		return 1;
 
 	if (mime) {
-		if (file_printf(ms, "application/csv") == -1)
+		if (file_printf(ms, "text/csv") == -1)
 			return -1;
 		return 1;
 	}

Index: src/external/bsd/file/dist/src/readelf.c
diff -u src/external/bsd/file/dist/src/readelf.c:1.24 src/external/bsd/file/dist/src/readelf.c:1.25
--- src/external/bsd/file/dist/src/readelf.c:1.24	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/readelf.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: readelf.c,v 1.24 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: readelf.c,v 1.25 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Christos Zoulas 2003.
@@ -30,9 +30,9 @@
 
 #ifndef lint
 #if 0
-FILE_RCSID("@(#)$File: readelf.c,v 1.173 2020/06/07 22:12:54 christos Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.175 2020/12/17 20:43:37 christos Exp $")
 #else
-__RCSID("$NetBSD: readelf.c,v 1.24 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: readelf.c,v 1.25 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif
 
@@ -360,7 +360,7 @@ dophn_core(struct magic_set *ms, int cla
 	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)
@@ -383,8 +383,11 @@ dophn_core(struct magic_set *ms, int cla
 	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;
 
@@ -401,9 +404,12 @@ dophn_core(struct magic_set *ms, int cla
 		 * 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 (;;) {
@@ -947,8 +953,12 @@ get_offset_from_virtaddr(struct magic_se
 	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;
 
@@ -978,7 +988,9 @@ get_string_on_virtaddr(struct magic_set 
 	    fsize, virtaddr);
 	if (offset < 0 ||
 	    (buflen = pread(fd, buf, CAST(size_t, buflen), offset)) <= 0) {
-		file_badread(ms);
+		if (file_printf(ms, ", can't read elf string at %jd",
+		    (intmax_t)offset) == -1)
+			return 0;
 		return 0;
 	}
 
@@ -1105,7 +1117,7 @@ do_auxv_note(struct magic_set *ms, unsig
 
 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;
@@ -1123,11 +1135,15 @@ dodynamic(struct magic_set *ms, void *vb
 
 	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;
 	}
@@ -1340,7 +1356,7 @@ doshn(struct magic_set *ms, int clazz, i
 	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];
@@ -1361,9 +1377,10 @@ doshn(struct magic_set *ms, int clazz, i
 	}
 
 	/* 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;
 	}
@@ -1378,10 +1395,14 @@ doshn(struct magic_set *ms, int clazz, i
 
 	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) {
@@ -1391,8 +1412,10 @@ doshn(struct magic_set *ms, int clazz, i
 
 		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;
 
@@ -1433,11 +1456,15 @@ doshn(struct magic_set *ms, int clazz, i
 				    " 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;
@@ -1614,9 +1641,10 @@ doshn(struct magic_set *ms, int clazz, i
 }
 
 /*
- * 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,
@@ -1625,12 +1653,13 @@ dophn_exec(struct magic_set *ms, int cla
 {
 	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)
@@ -1648,8 +1677,11 @@ dophn_exec(struct magic_set *ms, int cla
 		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;
@@ -1660,7 +1692,6 @@ dophn_exec(struct magic_set *ms, int cla
 		switch (xph_type) {
 		case PT_DYNAMIC:
 			doread = 1;
-			linking_style = "dynamically";
 			break;
 		case PT_NOTE:
 			if (sh_num)	/* Did this through section headers */
@@ -1689,10 +1720,14 @@ dophn_exec(struct magic_set *ms, int cla
 		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;
@@ -1700,6 +1735,7 @@ dophn_exec(struct magic_set *ms, int cla
 		/* 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;
@@ -1707,7 +1743,8 @@ dophn_exec(struct magic_set *ms, int cla
 				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;
 			}
@@ -1716,6 +1753,7 @@ dophn_exec(struct magic_set *ms, int cla
 			break;
 
 		case PT_INTERP:
+			need++;
 			if (ms->flags & MAGIC_MIME)
 				continue;
 			if (bufsize && nbuf[0]) {
@@ -1750,8 +1788,15 @@ dophn_exec(struct magic_set *ms, int cla
 	}
 	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",

Index: src/external/bsd/file/dist/src/softmagic.c
diff -u src/external/bsd/file/dist/src/softmagic.c:1.23 src/external/bsd/file/dist/src/softmagic.c:1.24
--- src/external/bsd/file/dist/src/softmagic.c:1.23	Sun Jun 14 20:37:24 2020
+++ src/external/bsd/file/dist/src/softmagic.c	Fri Apr  9 15:11:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: softmagic.c,v 1.23 2020/06/15 00:37:24 christos Exp $	*/
+/*	$NetBSD: softmagic.c,v 1.24 2021/04/09 19:11:42 christos Exp $	*/
 
 /*
  * Copyright (c) Ian F. Darwin 1986-1995.
@@ -35,9 +35,9 @@
 
 #ifndef	lint
 #if 0
-FILE_RCSID("@(#)$File: softmagic.c,v 1.299 2020/06/07 21:58:01 christos Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.309 2021/02/05 22:29:07 christos Exp $")
 #else
-__RCSID("$NetBSD: softmagic.c,v 1.23 2020/06/15 00:37:24 christos Exp $");
+__RCSID("$NetBSD: softmagic.c,v 1.24 2021/04/09 19:11:42 christos Exp $");
 #endif
 #endif	/* lint */
 
@@ -283,11 +283,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;
@@ -298,14 +296,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;
+		if (*m->desc) {
+			*found_match = 1;
 			*returnval = 1;
-			if (print_sep(ms, firstline) == -1)
-				return -1;
-			if (mprint(ms, m) == -1)
-				return -1;
+			if (print) {
+				*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)) {
@@ -396,16 +397,18 @@ 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;
+					*returnval = 1;
+				}
 				if (print && *m->desc) {
 					/*
 					 * This continuation matched.  Print
@@ -430,7 +433,6 @@ flush:
 						if (file_printf(ms, " ") == -1)
 							return -1;
 					}
-					*returnval = 1;
 					*need_separator = 0;
 					if (mprint(ms, m) == -1)
 						return -1;
@@ -462,14 +464,23 @@ 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)
+				goto out;
+			// So that we print a separator
+			*printed_something = 0;
+			firstline = 0;
 		}
 		cont_level = 0;
 	}
+out:
+	/*
+	 * If we are not printing (we are doing mime etc.)
+	 * and we did not find a mime entry, and we are at 0 level
+	 * we want to return 0 so that the default mime printer
+	 * takes over and prints "application/octet-stream"
+	 */
+	if (! print && ! *printed_something && ! *name_count)
+		return 0;
 	return *returnval;  /* This is hit if -k is set or there is no match */
 }
 
@@ -493,8 +504,8 @@ check_fmt(struct magic_set *ms, const ch
 	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);
@@ -586,94 +597,57 @@ mprint(struct magic_set *ms, struct magi
 	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:
@@ -695,19 +669,9 @@ mprint(struct magic_set *ms, struct magi
 			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,
 				sizeof(p->s) - (str - p->s))) == -1)
@@ -812,7 +776,7 @@ mprint(struct magic_set *ms, struct magi
 
 	case FILE_SEARCH:
 	case FILE_REGEX: {
-		char *cp;
+		char *cp, *scp;
 		int rval;
 
 		cp = strndup(RCAST(const char *, ms->search.s),
@@ -821,8 +785,10 @@ mprint(struct magic_set *ms, struct magi
 			file_oomem(ms, ms->search.rm_len);
 			return -1;
 		}
+		scp = (m->str_flags & STRING_TRIM) ? file_strtrim(cp) : cp;
+					
 		rval = file_printf(ms, F(ms, desc, "%s"),
-		    file_printable(sbuf, sizeof(sbuf), cp, ms->search.rm_len));
+		    file_printable(sbuf, sizeof(sbuf), scp, ms->search.rm_len));
 		free(cp);
 
 		if (rval == -1)
@@ -976,6 +942,7 @@ moffset(struct magic_set *ms, struct mag
 	case FILE_DEFAULT:
 	case FILE_INDIRECT:
 	case FILE_OFFSET:
+	case FILE_USE:
 		o = ms->offset;
 		break;
 
@@ -1563,20 +1530,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 cont c;
 
 	if (*indir_count >= ms->indir_max) {
 		file_error(ms, 0, "indirect count (%hu) exceeded",
@@ -1882,16 +1872,32 @@ mget(struct magic_set *ms, struct magic 
 			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:
@@ -2235,9 +2241,10 @@ magiccheck(struct magic_set *ms, struct 
 			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);

Index: src/external/bsd/file/dist/tests/Makefile.in
diff -u src/external/bsd/file/dist/tests/Makefile.in:1.15 src/external/bsd/file/dist/tests/Makefile.in:1.16
--- src/external/bsd/file/dist/tests/Makefile.in:1.15	Mon Dec 16 21:31:05 2019
+++ src/external/bsd/file/dist/tests/Makefile.in	Fri Apr  9 15:11:42 2021
@@ -324,6 +324,14 @@ zstd-v0.8-22.testfile \
 zstd-v0.8-23.testfile \
 zstd-v0.8-F4.testfile \
 zstd-v0.8-FF.testfile \
+pgp-binary-key-v2-phil.testfile \
+pgp-binary-key-v3-lutz.testfile \
+pgp-binary-key-v4-dsa.testfile \
+pgp-binary-key-v4-ecc-no-userid-secret.testfile \
+pgp-binary-key-v4-ecc-secret-key.testfile \
+pgp-binary-key-v4-rsa-key.testfile \
+pgp-binary-key-v4-rsa-no-userid-secret.testfile \
+pgp-binary-key-v4-rsa-secret-key.testfile \
 CVE-2014-1943.result \
 JW07022A.mp3.result \
 escapevel.result \
@@ -362,7 +370,15 @@ zstd-v0.8-21.result \
 zstd-v0.8-22.result \
 zstd-v0.8-23.result \
 zstd-v0.8-F4.result \
-zstd-v0.8-FF.result
+zstd-v0.8-FF.result \
+pgp-binary-key-v2-phil.result \
+pgp-binary-key-v3-lutz.result \
+pgp-binary-key-v4-dsa.result \
+pgp-binary-key-v4-ecc-no-userid-secret.result \
+pgp-binary-key-v4-ecc-secret-key.result \
+pgp-binary-key-v4-rsa-key.result \
+pgp-binary-key-v4-rsa-no-userid-secret.result \
+pgp-binary-key-v4-rsa-secret-key.result
 
 T = $(top_srcdir)/tests
 all: all-am

Index: src/external/bsd/file/include/config.h
diff -u src/external/bsd/file/include/config.h:1.16 src/external/bsd/file/include/config.h:1.17
--- src/external/bsd/file/include/config.h:1.16	Sun Jun 14 20:37:25 2020
+++ src/external/bsd/file/include/config.h	Fri Apr  9 15:11:42 2021
@@ -126,6 +126,9 @@
 /* Define to 1 if you have the `newlocale' function. */
 #define HAVE_NEWLOCALE 1
 
+/* Define to 1 if you have the `pipe2' function. */
+#define HAVE_PIPE2 1
+
 /* Define to 1 if you have the `pread' function. */
 #define HAVE_PREAD 1
 
@@ -277,7 +280,7 @@
 #define PACKAGE_NAME "file"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "file 5.39"
+#define PACKAGE_STRING "file 5.40"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "file"
@@ -286,7 +289,7 @@
 #define PACKAGE_URL ""
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "5.39"
+#define PACKAGE_VERSION "5.40"
 
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
@@ -317,7 +320,7 @@
 
 
 /* Version number of package */
-#define VERSION "5.39"
+#define VERSION "5.40"
 
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    significant byte first (like Motorola and SPARC, unlike Intel). */

Reply via email to