Mercurial > hg > octave-jordi > gnulib-hg
annotate build-aux/mktempd @ 17921:58c1b50299a6
getopt: give accurate ambiguity diagnostic on mem exhaustion
* lib/getopt.c (_getopt_internal_r): The previous commit broke
out the loop too early, which could give a false indication
of ambiguous options under memory exhaustion.
author | Pádraig Brady <P@draigBrady.com> |
---|---|
date | Wed, 18 Feb 2015 22:37:31 +0000 |
parents | ab58d4870664 |
children |
rev | line source |
---|---|
9799
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
1 #!/bin/sh |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
2 # Create a temporary directory, much like mktemp -d does. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
3 |
17848 | 4 # Copyright (C) 2007-2015 Free Software Foundation, Inc. |
9799
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
5 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
7 # it under the terms of the GNU General Public License as published by |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
9 # (at your option) any later version. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
10 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
14 # GNU General Public License for more details. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
15 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU General Public License |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
18 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
19 # Written by Jim Meyering. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
20 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
21 # Usage: mktempd /tmp phoey.XXXXXXXXXX |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
22 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
23 # First, try to use the mktemp program. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
24 # Failing that, we'll roll our own mktemp-like function: |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
25 # - try to get random bytes from /dev/urandom |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
26 # - failing that, generate output from a combination of quickly-varying |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
27 # sources and gzip. Ignore non-varying gzip header, and extract |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
28 # "random" bits from there. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
29 # - given those bits, map to file-name bytes using tr, and try to create |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
30 # the desired directory. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
31 # - make only $MAX_TRIES attempts |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
32 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
33 ME=`basename "$0"` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
34 die() { echo >&2 "$ME: $@"; exit 1; } |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
35 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
36 MAX_TRIES=4 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
37 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
38 rand_bytes() |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
39 { |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
40 n=$1 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
41 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
42 chars=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
43 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
44 dev_rand=/dev/urandom |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
45 if test -r "$dev_rand"; then |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
46 # Note: 256-length($chars) == 194; 3 copies of $chars is 186 + 8 = 194. |
16139 | 47 dd ibs=$n count=1 if="$dev_rand" 2>/dev/null \ |
48 | tr -c $chars 01234567$chars$chars$chars | |
9799
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
49 return |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
50 fi |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
51 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
52 cmds='date; date +%N; free; who -a; w; ps auxww; ps ef; netstat -n' |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
53 data=` (eval "$cmds") 2>&1 | gzip ` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
54 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
55 n_plus_50=`expr $n + 50` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
56 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
57 # Ensure that $data has length at least 50+$n |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
58 while :; do |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
59 len=`echo "$data"|wc -c` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
60 test $n_plus_50 -le $len && break; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
61 data=` (echo "$data"; eval "$cmds") 2>&1 | gzip ` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
62 done |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
63 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
64 echo "$data" \ |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
65 | dd bs=1 skip=50 count=$n 2>/dev/null \ |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
66 | tr -c $chars 01234567$chars$chars$chars |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
67 } |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
68 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
69 mktempd() |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
70 { |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
71 case $# in |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
72 2);; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
73 *) die "Usage: $ME DIR TEMPLATE";; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
74 esac |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
75 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
76 destdir=$1 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
77 template=$2 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
78 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
79 # Disallow any trailing slash on specified destdir: |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
80 # it would subvert the post-mktemp "case"-based destdir test. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
81 case $destdir in |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
82 /) ;; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
83 */) die "invalid destination dir: remove trailing slash(es)";; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
84 esac |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
85 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
86 case $template in |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
87 *XXXX) ;; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
88 *) die "invalid template: $template (must have a suffix of at least 4 X's)";; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
89 esac |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
90 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
91 fail=0 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
92 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
93 # First, try to use mktemp. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
94 d=`env -u TMPDIR mktemp -d -t -p "$destdir" "$template" 2>/dev/null` \ |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
95 || fail=1 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
96 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
97 # The resulting name must be in the specified directory. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
98 case $d in "$destdir"*);; *) fail=1;; esac |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
99 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
100 # It must have created the directory. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
101 test -d "$d" || fail=1 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
102 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
103 # It must have 0700 permissions. Handle sticky "S" bits. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
104 perms=`ls -dgo "$d" 2>/dev/null|tr S -` || fail=1 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
105 case $perms in drwx------*) ;; *) fail=1;; esac |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
106 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
107 test $fail = 0 && { |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
108 echo "$d" |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
109 return |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
110 } |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
111 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
112 # If we reach this point, we'll have to create a directory manually. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
113 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
114 # Get a copy of the template without its suffix of X's. |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
115 base_template=`echo "$template"|sed 's/XX*$//'` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
116 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
117 # Calculate how many X's we've just removed. |
10072
318ffe3ae81d
use "echo STR|wc -c" rather than unportable "expr length STR"
Lasse Collin <lasse.collin@tukaani.org>
parents:
10071
diff
changeset
|
118 template_length=`echo "$template" | wc -c` |
318ffe3ae81d
use "echo STR|wc -c" rather than unportable "expr length STR"
Lasse Collin <lasse.collin@tukaani.org>
parents:
10071
diff
changeset
|
119 nx=`echo "$base_template" | wc -c` |
318ffe3ae81d
use "echo STR|wc -c" rather than unportable "expr length STR"
Lasse Collin <lasse.collin@tukaani.org>
parents:
10071
diff
changeset
|
120 nx=`expr $template_length - $nx` |
9799
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
121 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
122 err= |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
123 i=1 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
124 while :; do |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
125 X=`rand_bytes $nx` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
126 candidate_dir="$destdir/$base_template$X" |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
127 err=`mkdir -m 0700 "$candidate_dir" 2>&1` \ |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
128 && { echo "$candidate_dir"; return; } |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
129 test $MAX_TRIES -le $i && break; |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
130 i=`expr $i + 1` |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
131 done |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
132 die "$err" |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
133 } |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
134 |
55aec4615f6d
New script and module: mktempd
Jim Meyering <meyering@redhat.com>
parents:
diff
changeset
|
135 mktempd "$@" |