From a69bdc0ef63343373773995f7e87d11a29ed4259 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Sat, 16 Sep 2023 16:48:04 -0400 Subject: sbopkglint: refactor gzip detection. --- sbopkglint | 6 ++++++ sbopkglint.d/30-manpages.t.sh | 6 ++---- sbopkglint.d/60-usr_info.t.sh | 11 ++--------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/sbopkglint b/sbopkglint index fd458c4..2e86174 100755 --- a/sbopkglint +++ b/sbopkglint @@ -584,6 +584,12 @@ find_warnfiles() { rm -f $output } +# return true if the file is gzipped, otherwise false. +# faster than using file(1). +is_gzipped() { + [ "$( hexdump -n 2 -e '"%2x"' "$1" )" = '8b1f' ] +} + # N.B. these need to match the template (and they do) TMP=${TMP:-/tmp/SBo} OUTPUT=${OUTPUT:-/tmp} diff --git a/sbopkglint.d/30-manpages.t.sh b/sbopkglint.d/30-manpages.t.sh index 4264d86..0bc4a96 100644 --- a/sbopkglint.d/30-manpages.t.sh +++ b/sbopkglint.d/30-manpages.t.sh @@ -35,9 +35,7 @@ check_gzipped_page() { BADPERMS+="$f " fi - if [ "$( file -L -b --mime-type "$f" )" != "application/gzip" ]; then - NOTGZIPPED+="$f " - fi + is_gzipped "$f" || NOTGZIPPED+="$f " # I have ~42,000 man pages on my dev box, file(1) fails to identify # 12 of them as troff, but adding the check for .T catches them all. @@ -134,7 +132,7 @@ if [ -d usr/man ]; then [ -n "$BADDIRPERMS" ] && warn "bad man directory owner/permissions (should be 0755, root:root)" && ls -ld $BADDIRPERMS [ -n "$BADDIRS" ] && warn "bad directory names in /usr/man:" && ls -ld $BADDIRS [ -n "$BADNAMES" ] && warn "bad man page names (not *.gz):" && ls -ld $BADNAMES - [ -n "$NOTGZIPPED" ] && warn "non-gzip (but named *.gz) man pages:" && ls -ld $NOTGZIPPED + [ -n "$NOTGZIPPED" ] && warn "non-gzipiped (but named *.gz) man pages:" && ls -ld $NOTGZIPPED [ -n "$NONTROFF" ] && warn "invalid man pages (not troff):" && ls -ld $NONTROFF [ -n "$WRONGSECT" ] && warn "man pages in wrong section:" && ls -ld $WRONGSECT fi diff --git a/sbopkglint.d/60-usr_info.t.sh b/sbopkglint.d/60-usr_info.t.sh index b839180..3f3ffd5 100644 --- a/sbopkglint.d/60-usr_info.t.sh +++ b/sbopkglint.d/60-usr_info.t.sh @@ -36,18 +36,11 @@ NONINFO="" NONGZIP="" # 2 args: $1 is the file to check, $2 is 1 for .gz name, 0 otherwise. -# The LANG=C is because we're grepping for raw bytes, not characters -# in e.g. UTF-8 encoding. Believe it or not, using head and grep is -# quite a bit faster than using the file command... though we could -# make file faster with "file -m /etc/file/magic/compress". check_info() { - local is_gzip=0 - head -c2 "$1" | LANG=C grep -Pq '\x1f\x8b' && is_gzip=1 - if [ "$2" = 0 ]; then - [ "$is_gzip" = "1" ] && warn "$i is gzipped but lacks .gz extension" + is_gzipped "$1" && warn "$i is gzipped but lacks .gz extension" else - [ "$is_gzip" = "0" ] && warn "$i has .gz extension but is not gzipped" + is_gzipped "$1" || warn "$i has .gz extension but is not gzipped" fi LANG=C zgrep -Pq '\x1f' "$1" || NONINFO+="$1 " -- cgit v1.2.3