gzexe: port to macOS mktemp
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 6 Jan 2018 22:59:47 +0000 (14:59 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 6 Jan 2018 23:02:02 +0000 (15:02 -0800)
Problem reported by Jeffrey Walton (Bug#30000).
* gzexe.in, zdiff.in, zgrep.in:
Don’t assume that mktemp works when given no arguments,
as this is not true for macOS.  Instead, use a syntax
that should work with coreutils, NetBSD, and macOS.
While we’re in the neighborhood, be more consistent about how program
names are used in temporary file names.  Also, watch out for TMPDIR
values that are not absolute file names, since they can cause problems
(e.g., leading "-").

gzexe.in
zdiff.in
zgrep.in

index 62f896064c6bf42e461dc60038a118d12c907e36..6c6118389b7140680f33a21a001ab9137acdaee9 100644 (file)
--- a/gzexe.in
+++ b/gzexe.in
@@ -119,10 +119,14 @@ for i do
     type mktemp >/dev/null 2>&1
     mktemp_status=$?
   fi
+  case $dir in
+    */) ;;
+    *) dir=$dir/;;
+  esac
   if test $mktemp_status -eq 0; then
-    tmp=`TMPDIR=$dir mktemp`
+    tmp=`mktemp "${dir}gzexeXXXXXXXXX"`
   else
-    tmp=$dir/gzexe$$
+    tmp=${dir}gzexe$$
   fi && { cp -p "$file" "$tmp" 2>/dev/null || cp "$file" "$tmp"; } || {
     res=$?
     printf >&2 '%s\n' "$0: cannot copy $file"
@@ -157,10 +161,15 @@ trap 'res=$?
   (exit $res); exit $res
 ' 0 1 2 3 5 10 13 15
 
+case $TMPDIR in
+  / | /*/) ;;
+  /*) TMPDIR=$TMPDIR/;;
+  *) TMPDIR=/tmp/;;
+esac
 if type mktemp >/dev/null 2>&1; then
-  gztmpdir=`mktemp -d`
+  gztmpdir=`mktemp -d "${TMPDIR}gztmpXXXXXXXXX"`
 else
-  gztmpdir=/tmp/gztmp$$; mkdir $gztmpdir
+  gztmpdir=${TMPDIR}gztmp$$; mkdir $gztmpdir
 fi || { (exit 127); exit 127; }
 
 gztmp=$gztmpdir/$0
index bf644ddbef46548b2552ac170f5259141aa8bb50..960bf86131dc6ed6d28dfc16e38dfab8ba680b76 100644 (file)
--- a/zdiff.in
+++ b/zdiff.in
@@ -116,12 +116,17 @@ elif test $# -eq 2; then
                           test -n "$tmp" && rm -f "$tmp"
                           (exit 2); exit 2
                         ' HUP INT PIPE TERM 0
+                        case $TMPDIR in
+                          / | /*/) ;;
+                          /*) TMPDIR=$TMPDIR/;;
+                          *) TMPDIR=/tmp/;;
+                        esac
                         if type mktemp >/dev/null 2>&1; then
-                          tmp=`mktemp` || exit 2
+                          tmp=`mktemp "${TMPDIR}zdiffXXXXXXXXX"` ||
+                            exit 2
                         else
-                          F=`expr "/$2" : '.*/\(.*\)[-.][zZtga]*$'` || F=$prog
                           set -C
-                          tmp=${TMPDIR-/tmp}/$F.$$
+                          tmp=${TMPDIR}zdiff$$
                         fi
                         gzip -cdfq -- "$2" > "$tmp" || exit 2
                         gzip_status=$(
index 3e08452c9db5d41289849560b5c36fc7ae2b251c..7a4a2d485b47fa805f6aae818019ba5ff839d2c4 100644 (file)
--- a/zgrep.in
+++ b/zgrep.in
@@ -133,11 +133,16 @@ while test $# -ne 0; do
         test -n "$pattmp" && rm -f "$pattmp"
         (exit 2); exit 2
       ' HUP INT PIPE TERM 0
+      case $TMPDIR in
+        / | /*/) ;;
+        /*) TMPDIR=$TMPDIR/;;
+        *) TMPDIR=/tmp/;;
+      esac
       if type mktemp >/dev/null 2>&1; then
-        pattmp=$(mktemp) || exit 2
+        pattmp=$(mktemp "${TMPDIR}zgrepXXXXXXXXX") || exit 2
       else
         set -C
-        pattmp=${TMPDIR-/tmp}/zgrep.$$
+        pattmp=${TMPDIR}zgrep$$
       fi
       eval "cat --$optarg" >"$pattmp" || exit 2
       optarg=' "$pattmp"'