X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=build%2Fshtool;h=2680d69380a752823343457f3273ce429255beb6;hb=7124ec615efcd6419db99d6f093b61607fa84934;hp=699d0194b89d0ed841841a0749df0266d2eff972;hpb=28a22d67856fc0cb4dafea2d9bc038411c363647;p=openldap diff --git a/build/shtool b/build/shtool index 699d0194b8..2680d69380 100755 --- a/build/shtool +++ b/build/shtool @@ -1,16 +1,12 @@ #!/bin/sh -# $OpenLDAP$ -# This file is distributed with OpenLDAP Software, but is an -# an independently licensed program. - ## ## GNU shtool -- The GNU Portable Shell Tool -## Copyright (c) 1994-2002 Ralf S. Engelschall +## Copyright (c) 1994-2005 Ralf S. Engelschall ## ## See http://www.gnu.org/software/shtool/ for more information. ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. ## -## Version: 1.6.0 (01-Feb-2002) +## Version: 2.0.2 (15-Jun-2005) ## Contents: 6/19 available modules ## @@ -57,7 +53,7 @@ ## fixperm Fix file permissions inside a source tree ## rotate Logfile rotation ## tarball Roll distribution tarballs -## guessos Simple operating system guesser +## platform Platform Identification Utility ## arx Extended archive command ## slo Separate linker options by library class ## scpp Sharing C Pre-Processor @@ -70,9 +66,9 @@ if [ $# -eq 0 ]; then echo "$0:Hint: run \`$0 -h' for usage" 1>&2 exit 1 fi -if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then - echo "This is GNU shtool, version 1.6.0 (01-Feb-2002)" - echo "Copyright (c) 1994-2002 Ralf S. Engelschall " +if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then + echo "This is GNU shtool, version 2.0.2 (15-Jun-2005)" + echo "Copyright (c) 1994-2005 Ralf S. Engelschall " echo "Report bugs to " echo '' echo "Usage: shtool [] [ [] []]" @@ -84,20 +80,22 @@ if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then echo ' -r, --recreate recreate this shtool script via shtoolize' echo '' echo 'Available [] []:' - echo ' echo [-n|--newline] [-e|--expand] [ ...]' + echo ' echo [-n|--newline] [-e|--expand] [ ...]' echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' echo ' ' - echo ' install [-v|--verbose] [-t|--trace] [-c|--copy] [-C|--compare-copy]' - echo ' [-s|--strip] [-m|--mode ] [-o|--owner ]' - echo ' [-g|--group ] [-e|--exec ] [' - echo ' ...] ' + echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' + echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode ]' + echo ' [-o|--owner ] [-g|--group ] [-e|--exec' + echo ' ] [ ...] ' echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' - echo ' ] [ ...]' + echo ' ] [-o|--owner ] [-g|--group ] ' + echo ' [ ...]' echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] ' echo ' [ ...] ' - echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-s|--stealth]' - echo ' [-i|--interactive] [-b|--backup ] [-e|--exec ]' - echo ' [-f|--file ] [] [...]' + echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]' + echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup' + echo ' ] [-e|--exec ] [-f|--file ] []' + echo ' [...]' echo '' echo 'Not available (because module was not built-in):' echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' @@ -108,16 +106,19 @@ if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] ' echo ' fixperm [-v|--verbose] [-t|--trace] [ ...]' echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' - echo ' ] [-s|--min-size ] [-c|--copy] [-r|--remove]' + echo ' ] [-s|--size ] [-c|--copy] [-r|--remove]' echo ' [-a|--archive-dir ] [-z|--compress [:]]' - echo ' [-b|--background] [-d|--delay] [-p|--pad ] [-o|--owner' - echo ' ] [-g|--group ] [-m|--mode ] [-M|--migrate' + echo ' [-b|--background] [-d|--delay] [-p|--pad ] [-m|--mode' + echo ' ] [-o|--owner ] [-g|--group ] [-M|--migrate' echo ' ] [-P|--prolog ] [-E|--epilog ] [...]' echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output ]' echo ' [-c|--compress ] [-d|--directory ] [-u|--user' echo ' ] [-g|--group ] [-e|--exclude ]' echo ' [ ...]' - echo ' guessos ' + echo ' platform [-F|--format ] [-S|--sep ] [-C|--conc' + echo ' ] [-L|--lower] [-U|--upper] [-v|--verbose]' + echo ' [-c|--concise] [-n|--no-newline] [-t|--type ]' + echo ' [-V|--version] [-h|--help]' echo ' arx [-t|--trace] [-C|--command ] [' echo ' ...]' echo ' slo [-p|--prefix ] -- -L -l [-L -l' @@ -134,15 +135,15 @@ if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then echo '' exit 0 fi -if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then - echo "GNU shtool 1.6.0 (01-Feb-2002)" +if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then + echo "GNU shtool 2.0.2 (15-Jun-2005)" exit 0 fi -if [ ".$1" = ".-r" -o ".$1" = ."--recreate" ]; then - shtoolize -obuild/shtool echo move install mkdir mkln subst +if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then + shtoolize -oshtool echo move install mkdir mkln subst exit 0 fi -if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then +if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then shift set -x fi @@ -169,7 +170,7 @@ gen_tmpfile=no case $tool in echo ) str_tool="echo" - str_usage="[-n|--newline] [-e|--expand] [ ...]" + str_usage="[-n|--newline] [-e|--expand] [ ...]" arg_spec="0+" opt_spec="n.e." opt_alias="n:newline,e:expand" @@ -189,12 +190,13 @@ case $tool in ;; install ) str_tool="install" - str_usage="[-v|--verbose] [-t|--trace] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode ] [-o|--owner ] [-g|--group ] [-e|--exec ] [ ...] " - arg_spec="2+" - opt_spec="v.t.c.C.s.m:o:g:e+" - opt_alias="v:verbose,t:trace,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" + str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode ] [-o|--owner ] [-g|--group ] [-e|--exec ] [ ...] " + arg_spec="1+" + opt_spec="v.t.d.c.C.s.m:o:g:e+" + opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" opt_v=no opt_t=no + opt_d=no opt_c=no opt_C=no opt_s=no @@ -205,14 +207,16 @@ case $tool in ;; mkdir ) str_tool="mkdir" - str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode ] [ ...]" + str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode ] [-o|--owner ] [-g|--group ] [ ...]" arg_spec="1+" - opt_spec="t.f.p.m:" - opt_alias="t:trace,f:force,p:parents,m:mode" + opt_spec="t.f.p.m:o:g:" + opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" opt_t=no opt_f=no opt_p=no opt_m="" + opt_o="" + opt_g="" ;; mkln ) str_tool="mkln" @@ -226,14 +230,16 @@ case $tool in ;; subst ) str_tool="subst" - str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-s|--stealth] [-i|--interactive] [-b|--backup ] [-e|--exec ] [-f|--file ] [] [...]" + str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning] [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup ] [-e|--exec ] [-f|--file ] [] [...]" gen_tmpfile=yes arg_spec="0+" - opt_spec="v.t.n.s.i.b:e+f:" - opt_alias="v:verbose,t:trace,n:nop,s:stealth,i:interactive,b:backup,e:exec,f:file" + opt_spec="v.t.n.w.q.s.i.b:e+f:" + opt_alias="v:verbose,t:trace,n:nop,w:warning,q:quiet,s:stealth,i:interactive,b:backup,e:exec,f:file" opt_v=no opt_t=no opt_n=no + opt_w=no + opt_q=no opt_s=no opt_i=no opt_b="" @@ -284,7 +290,7 @@ eval `echo h.$opt_spec |\ # parse option alias string eval `echo h:help,$opt_alias |\ - tr 'x-' 'x_' | sed -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` + sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` # interate over argument line opt_PREV='' @@ -309,12 +315,12 @@ while [ $# -gt 0 ]; do --[a-zA-Z0-9]*=*) eval `echo "x$1" |\ sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` - opt_STR=`echo $opt_OPT | tr 'x-' 'x_'` + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" ;; --[a-zA-Z0-9]*) opt_OPT=`echo "x$1" | cut -c4-` - opt_STR=`echo $opt_OPT | tr 'x-' 'x_'` + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" opt_ARG='' ;; @@ -338,8 +344,8 @@ while [ $# -gt 0 ]; do # determine whether option needs an argument eval "opt_MODE=\$opt_MODE_${opt_OPT}" - if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then - if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then + if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then + if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then opt_PREV="$opt_OPT" continue fi @@ -398,6 +404,7 @@ esac # establish a temporary file on request if [ ".$gen_tmpfile" = .yes ]; then + # create (explicitly) secure temporary directory if [ ".$TMPDIR" != . ]; then tmpdir="$TMPDIR" elif [ ".$TEMPDIR" != . ]; then @@ -405,12 +412,40 @@ if [ ".$gen_tmpfile" = .yes ]; then else tmpdir="/tmp" fi - tmpfile="$tmpdir/.shtool.$$" - rm -f $tmpfile >/dev/null 2>&1 - touch $tmpfile - chmod 600 $tmpfile + tmpdir="$tmpdir/.shtool.$$" + ( umask 077 + rm -rf "$tmpdir" >/dev/null 2>&1 || true + mkdir "$tmpdir" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2 + exit 1 + fi + ) + + # create (implicitly) secure temporary file + tmpfile="$tmpdir/shtool.tmp" + touch "$tmpfile" fi +# utility function: map string to lower case +util_lower () { + echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' +} + +# utility function: map string to upper case +util_upper () { + echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +} + +# cleanup procedure +shtool_exit () { + rc="$1" + if [ ".$gen_tmpfile" = .yes ]; then + rm -rf "$tmpdir" >/dev/null 2>&1 || true + fi + exit $rc +} + ## ## DISPATCH INTO SCRIPT BODY ## @@ -420,12 +455,11 @@ case $tool in echo ) ## ## echo -- Print string with optional construct expansion - ## Copyright (c) 1998-2002 Ralf S. Engelschall - ## Originally written for WML as buildinfo + ## Copyright (c) 1998-2005 Ralf S. Engelschall ## - + text="$*" - + # check for broken escape sequence expansion seo='' bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` @@ -435,25 +469,25 @@ echo ) seo='-E' fi fi - + # check for existing -n option (to suppress newline) minusn='' bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then minusn='-n' fi - + # determine terminal bold sequence term_bold='' term_norm='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then case $TERM in # for the most important terminal types we directly know the sequences xterm|xterm*|vt220|vt220*) term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` ;; - vt100|vt100*) + vt100|vt100*|cygwin) term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` ;; @@ -471,7 +505,7 @@ echo ) fi done if [ ".$term_bold" != . ]; then - for seq in sgr0 me rmso reset; do # 'reset' is last + for seq in sgr0 me rmso init reset; do # 'reset' is last norm="`$dir/$tool $seq 2>/dev/null`" if [ ".$norm" != . ]; then term_norm="$norm" @@ -482,94 +516,139 @@ echo ) break fi done - if [ ".$term_bold" != . -a ".$term_norm" != . ]; then + if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then break; fi done ;; esac - if [ ".$term_bold" = . -o ".$term_norm" = . ]; then + if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 + term_bold='' + term_norm='' fi fi - + # determine user name username='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uUgG]'`" != . ]; then - username="$LOGNAME" + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then + username="`(id -un) 2>/dev/null`" if [ ".$username" = . ]; then - username="$USER" + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then + username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` + fi if [ ".$username" = . ]; then - username="`(whoami) 2>/dev/null |\ - awk '{ printf("%s", $1); }'`" + username="$LOGNAME" if [ ".$username" = . ]; then - username="`(who am i) 2>/dev/null |\ - awk '{ printf("%s", $1); }'`" + username="$USER" if [ ".$username" = . ]; then - username='unknown' + username="`(whoami) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username="`(who am i) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username='unknown' + fi + fi fi fi fi fi fi - + # determine user id userid='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then userid="`(id -u) 2>/dev/null`" if [ ".$userid" = . ]; then - str="`(id) 2>/dev/null`" - if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then - userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*//'` - fi + userid="`(id -u ${username}) 2>/dev/null`" if [ ".$userid" = . ]; then - userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ - sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then + userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'` + fi if [ ".$userid" = . ]; then - userid=`(ypcat passwd) 2>/dev/null | - egrep "^${username}:" | \ + userid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then - userid='?' + userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid=`(ypcat passwd) 2>/dev/null | + grep "^${username}:" | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid='?' + fi + fi fi fi fi fi fi - + # determine (primary) group id groupid='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[gG]'`" != . ]; then - groupid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ - sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then + groupid="`(id -g ${username}) 2>/dev/null`" if [ ".$groupid" = . ]; then - groupid=`(ypcat passwd) 2>/dev/null | egrep "^${username}:" | \ - sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then + groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'` + fi if [ ".$groupid" = . ]; then - groupid='?' + groupid=`(getent passwd ${username}) 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$groupid" = . ]; then + groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$groupid" = . ]; then + groupid=`(ypcat passwd) 2>/dev/null | grep "^${username}:" | \ + sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$groupid" = . ]; then + groupid='?' + fi + fi + fi fi fi fi - + # determine (primary) group name groupname='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%g'`" != . ]; then - groupname=`egrep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ - sed -e 's/:.*$//'` + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then + groupname="`(id -gn ${username}) 2>/dev/null`" if [ ".$groupname" = . ]; then - groupname=`(ypcat group) 2>/dev/null | \ - egrep "^[^:]*:[^:]*:${groupid}:" | \ - sed -e 's/:.*$//'` + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then + groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` + fi if [ ".$groupname" = . ]; then - groupname='?' + groupname=`(getent group) 2>/dev/null | \ + grep "^[^:]*:[^:]*:${groupid}:" | \ + sed -e 's/:.*$//'` + if [ ".$groupname" = . ]; then + groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ + sed -e 's/:.*$//'` + if [ ".$groupname" = . ]; then + groupname=`(ypcat group) 2>/dev/null | \ + grep "^[^:]*:[^:]*:${groupid}:" | \ + sed -e 's/:.*$//'` + if [ ".$groupname" = . ]; then + groupname='?' + fi + fi + fi fi fi fi - + # determine host and domain name hostname='' domainname='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then hostname="`(uname -n) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then @@ -586,16 +665,16 @@ echo ) ;; esac fi - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then if [ ".$domainname" = . ]; then if [ -f /etc/resolv.conf ]; then - domainname="`egrep '^[ ]*domain' /etc/resolv.conf | head -1 |\ + domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*domain//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" if [ ".$domainname" = . ]; then - domainname="`egrep '^[ ]*search' /etc/resolv.conf | head -1 |\ + domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*search//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/ .*//' -e 's/ .*//' \ @@ -605,13 +684,13 @@ echo ) fi fi fi - + # determine current time time_day='' time_month='' time_year='' time_monthname='' - if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then + if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then time_day=`date '+%d'` time_month=`date '+%m'` time_year=`date '+%Y' 2>/dev/null` @@ -637,7 +716,7 @@ echo ) 12) time_monthname='Dec' ;; esac fi - + # expand special ``%x'' constructs if [ ".$opt_e" = .yes ]; then text=`echo $seo "$text" |\ @@ -654,7 +733,7 @@ echo ) -e "s/%Y/${time_year}/g" \ -e "s/%m/${time_monthname}/g" 2>/dev/null` fi - + # create output if [ .$opt_n = .no ]; then echo $seo "$text" @@ -667,26 +746,27 @@ echo ) echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" fi fi + + shtool_exit 0 ;; move ) ## ## move -- Move files with simultaneous substitution - ## Copyright (c) 1999-2002 Ralf S. Engelschall - ## Originally written for shtool + ## Copyright (c) 1999-2005 Ralf S. Engelschall ## - + src="$1" dst="$2" - + # consistency checks - if [ ".$src" = . -o ".$dst" = . ]; then + if [ ".$src" = . ] || [ ".$dst" = . ]; then echo "$msgprefix:Error: Invalid arguments" 1>&2 - exit 1 + shtool_exit 1 fi if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Error: Source and destination files are the same" 1>&2 - exit 1 + shtool_exit 1 fi expsrc="$src" if [ ".$opt_e" = .yes ]; then @@ -695,29 +775,29 @@ move ) if [ ".$opt_e" = .yes ]; then if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2 - exit 1 + shtool_exit 1 fi if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2 - exit 1 + shtool_exit 1 fi if [ ".$expsrc" = ".$src" ]; then echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2 - exit 1 + shtool_exit 1 fi else if [ ! -r "$src" ]; then echo "$msgprefix:Error: Source not found: $src" 1>&2 - exit 1 + shtool_exit 1 fi fi - + # determine substitution patterns if [ ".$opt_e" = .yes ]; then srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'` dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'` fi - + # iterate over source(s) for onesrc in $expsrc; do if [ .$opt_e = .yes ]; then @@ -758,16 +838,38 @@ move ) break; fi done - exit $errorstatus + + shtool_exit $errorstatus ;; install ) ## ## install -- Install a program, script or datafile - ## Copyright (c) 1997-2002 Ralf S. Engelschall - ## Originally written for shtool + ## Copyright (c) 1997-2005 Ralf S. Engelschall ## - + + # special case: "shtool install -d [...]" internally + # maps to "shtool mkdir -f -p -m 755 [...]" + if [ "$opt_d" = yes ]; then + cmd="$0 mkdir -f -p -m 755" + if [ ".$opt_o" != . ]; then + cmd="$cmd -o '$opt_o'" + fi + if [ ".$opt_g" != . ]; then + cmd="$cmd -g '$opt_g'" + fi + if [ ".$opt_v" = .yes ]; then + cmd="$cmd -v" + fi + if [ ".$opt_t" = .yes ]; then + cmd="$cmd -t" + fi + for dir in "$@"; do + eval "$cmd $dir" || shtool_exit $? + done + shtool_exit 0 + fi + # determine source(s) and destination argc=$# srcs="" @@ -776,30 +878,30 @@ install ) shift done dstpath="$1" - + # type check for destination dstisdir=0 if [ -d $dstpath ]; then dstpath=`echo "$dstpath" | sed -e 's:/$::'` dstisdir=1 fi - + # consistency check for destination - if [ $argc -gt 2 -a $dstisdir = 0 ]; then + if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 - exit 1 + shtool_exit 1 fi - + # iterate over all source(s) for src in $srcs; do dst=$dstpath - + # if destination is a directory, append the input filename if [ $dstisdir = 1 ]; then dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` dst="$dst/$dstfile" fi - + # check for correct arguments if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 @@ -809,17 +911,17 @@ install ) echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 continue fi - + # make a temp file name in the destination directory dsttmp=`echo $dst |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ -e "s;\$;/#INST@$$#;"` - + # verbosity if [ ".$opt_v" = .yes ]; then echo "$src -> $dst" 1>&2 fi - + # copy or move the file name to the temp name # (because we might be not allowed to change the source) if [ ".$opt_C" = .yes ]; then @@ -829,14 +931,14 @@ install ) if [ ".$opt_t" = .yes ]; then echo "cp $src $dsttmp" 1>&2 fi - cp $src $dsttmp || exit $? + cp $src $dsttmp || shtool_exit $? else if [ ".$opt_t" = .yes ]; then echo "mv $src $dsttmp" 1>&2 fi - mv $src $dsttmp || exit $? + mv $src $dsttmp || shtool_exit $? fi - + # adjust the target file if [ ".$opt_e" != . ]; then sed='sed' @@ -846,34 +948,35 @@ install ) sed="$sed -e '$e'" done cp $dsttmp $dsttmp.old - eval "$sed <$dsttmp.old >$dsttmp" || exit $? + chmod u+w $dsttmp + eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $? rm -f $dsttmp.old fi if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "strip $dsttmp" 1>&2 fi - strip $dsttmp || exit $? + strip $dsttmp || shtool_exit $? fi if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $dsttmp" 1>&2 fi - chown $opt_o $dsttmp || exit $? + chown $opt_o $dsttmp || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $dsttmp" 1>&2 fi - chgrp $opt_g $dsttmp || exit $? + chgrp $opt_g $dsttmp || shtool_exit $? fi if [ ".$opt_m" != ".-" ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $dsttmp" 1>&2 fi - chmod $opt_m $dsttmp || exit $? + chmod $opt_m $dsttmp || shtool_exit $? fi - + # determine whether to do a quick install # (has to be done _after_ the strip was already done) quick=no @@ -884,7 +987,7 @@ install ) fi fi fi - + # finally, install the file to the real destination if [ $quick = yes ]; then if [ ".$opt_t" = .yes ]; then @@ -898,21 +1001,21 @@ install ) rm -f $dst && mv $dsttmp $dst fi done + + shtool_exit 0 ;; mkdir ) ## ## mkdir -- Make one or more directories - ## Copyright (c) 1996-2002 Ralf S. Engelschall - ## Originally written for public domain by Noah Friedman - ## Cleaned up and enhanced for shtool + ## Copyright (c) 1996-2005 Ralf S. Engelschall ## - + errstatus=0 for p in ${1+"$@"}; do # if the directory already exists... if [ -d "$p" ]; then - if [ ".$opt_f" = .no -a ".$opt_p" = .no ]; then + if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then echo "$msgprefix:Error: directory already exists: $p" 1>&2 errstatus=1 break @@ -926,6 +1029,18 @@ mkdir ) echo "mkdir $p" 1>&2 fi mkdir $p || errstatus=$? + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $p" 1>&2 + fi + chown $opt_o $p || errstatus=$? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $p" 1>&2 + fi + chgrp $opt_g $p || errstatus=$? + fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $p" 1>&2 @@ -951,6 +1066,18 @@ mkdir ) echo "mkdir $pathcomp" 1>&2 fi mkdir $pathcomp || errstatus=$? + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $pathcomp" 1>&2 + fi + chown $opt_o $pathcomp || errstatus=$? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $pathcomp" 1>&2 + fi + chgrp $opt_g $pathcomp || errstatus=$? + fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $pathcomp" 1>&2 @@ -962,16 +1089,17 @@ mkdir ) done fi done - exit $errstatus + + shtool_exit $errstatus ;; mkln ) ## ## mkln -- Make link with calculation of relative paths - ## Copyright (c) 1999-2002 Ralf S. Engelschall - ## Originally written for shtool + ## Copyright (c) 1998-2005 Ralf S. Engelschall ## - + + # determine source(s) and destination args=$? srcs="" while [ $# -gt 1 ]; do @@ -982,10 +1110,10 @@ mkln ) if [ ! -d $dst ]; then if [ $args -gt 2 ]; then echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2 - exit 1 + shtool_exit 1 fi fi - + # determine link options lnopt="" if [ ".$opt_f" = .yes ]; then @@ -994,7 +1122,7 @@ mkln ) if [ ".$opt_s" = .yes ]; then lnopt="$lnopt -s" fi - + # iterate over sources for src in $srcs; do # determine if one of the paths is an absolute path, @@ -1008,7 +1136,7 @@ mkln ) case $dst in /* ) oneisabs=1; dstisabs=1 ;; esac - + # split source and destination into dir and base name if [ -d $src ]; then srcdir=`echo $src | sed -e 's;/*$;;'` @@ -1024,34 +1152,38 @@ mkln ) dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'` fi - + # consistency check if [ ".$dstdir" != . ]; then if [ ! -d $dstdir ]; then echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2 - exit 1 + shtool_exit 1 fi fi - + # make sure the source is reachable from the destination if [ $dstisabs = 1 ]; then if [ $srcisabs = 0 ]; then - if [ -d $srcdir ]; then + if [ ".$srcdir" = . ]; then + srcdir="`pwd | sed -e 's;/*$;;'`" + srcisabs=1 + oneisabs=1 + elif [ -d $srcdir ]; then srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`" srcisabs=1 oneisabs=1 fi fi fi - + # split away a common prefix prefix="" - if [ ".$srcdir" = ".$dstdir" -a ".$srcdir" != . ]; then + if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then prefix="$srcdir/" srcdir="" dstdir="" else - while [ ".$srcdir" != . -a ".$dstdir" != . ]; do + while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'` predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'` if [ ".$presrc" != ".$predst" ]; then @@ -1062,18 +1194,24 @@ mkln ) dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'` done fi - + # destination prefix is just the common prefix dstpre="$prefix" - + # determine source prefix which is the reverse directory # step-up corresponding to the destination directory srcpre="" - if [ $oneisabs = 0 ] || [ ".$prefix" != . -a ".$prefix" != ./ ]; then + + isroot=0 + if [ ".$prefix" = . ] || [ ".$prefix" = ./ ]; then + isroot=1 + fi + if [ $oneisabs = 0 ] || [ $isroot = 0 ]; then pl="$dstdir/" OIFS="$IFS"; IFS='/' for pe in $pl; do - [ ".$pe" = . ] && continue + [ ".$pe" = . ] && continue + [ ".$pe" = .. ] && continue srcpre="../$srcpre" done IFS="$OIFS" @@ -1082,7 +1220,7 @@ mkln ) srcpre="$prefix" fi fi - + # determine destination symlink name if [ ".$dstbase" = . ]; then if [ ".$srcbase" != . ]; then @@ -1091,74 +1229,77 @@ mkln ) dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'` fi fi - + # now finalize source and destination directory paths srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'` dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'` - + # run the final link command if [ ".$opt_t" = .yes ]; then echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase" fi eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase done + + shtool_exit 0 ;; subst ) ## ## subst -- Apply sed(1) substitution operations - ## Copyright (c) 2001-2002 Ralf S. Engelschall - ## Originally written for OpenPKG's rpmtool + ## Copyright (c) 2001-2005 Ralf S. Engelschall ## - + # remember optional list of file(s) files="$*" - + files_num="$#" + # parameter consistency check - if [ $# -eq 0 -a ".$opt_b" != . ]; then + if [ $# -eq 0 ] && [ ".$opt_b" != . ]; then echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2 - exit 1 + shtool_exit 1 fi - if [ $# -eq 0 -a ".$opt_s" = .yes ]; then + if [ $# -eq 0 ] && [ ".$opt_s" = .yes ]; then echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2 - exit 1 + shtool_exit 1 fi - + # build underlying sed(1) command sedcmd='sed' if [ ".$opt_e" != . ]; then OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" for e do - sedcmd="$sedcmd -e '$e'" + sedcmd="$sedcmd -e '$e'" done elif [ ".$opt_f" != . ]; then if [ ! -f $opt_f ]; then echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2 - exit 1 + shtool_exit 1 fi sedcmd="$sedcmd -f '$opt_f'" else echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2 - exit 1 + shtool_exit 1 fi - + # determine extension for original file orig=".orig" if [ ".$opt_b" != . ]; then orig="$opt_b" fi - + # apply sed(1) operation(s) if [ ".$files" != . ]; then # apply operation(s) to files + substdone=no for file in $files; do test ".$file" = . && continue if [ ! -f $file ]; then echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2 continue fi - + # handle interactive mode if [ ".$opt_i" = .yes ]; then eval "$sedcmd <$file >$file.new" @@ -1167,7 +1308,7 @@ subst ) rm -f $file.new skip=yes else - (diff -u1 $file $file.new >$tmpfile) 2>/dev/null + (diff -U1 $file $file.new >$tmpfile) 2>/dev/null if [ ".`cat $tmpfile`" = . ]; then (diff -C1 $file $file.new >$tmpfile) 2>/dev/null if [ ".`cat $tmpfile`" = . ]; then @@ -1192,20 +1333,22 @@ subst ) continue fi fi - + # apply sed(1) operation(s) if [ ".$opt_v" = .yes ]; then echo "patching \`$file'" 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "\$ cp -p $file $file$orig" + echo "\$ chmod u+w $file" echo "\$ $sedcmd <$file$orig >$file" fi if [ ".$opt_n" = .no ]; then cp -p $file $file$orig + chmod u+w $file >/dev/null 2>&1 || true eval "$sedcmd <$file$orig >$file" fi - + # optionally fix timestamp if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then @@ -1215,7 +1358,18 @@ subst ) touch -r $file$orig $file fi fi - + + # optionally check whether any content change actually occurred + if [ ".$opt_q" = .no ]; then + if cmp $file$orig $file >/dev/null 2>&1; then + if [ ".$opt_w" = .yes ]; then + echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 + fi + else + substdone=yes + fi + fi + # optionally remove preserved original file if [ ".$opt_b" = . ]; then if [ ".$opt_t" = .yes ]; then @@ -1226,6 +1380,15 @@ subst ) fi fi done + if [ ".$opt_q" = .no ] && [ ".$opt_w" = .no ]; then + if [ ".$substdone" = .no ]; then + if [ ".$files_num" = .1 ]; then + echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 + else + echo "$msgprefix:Warning: substitution resulted in no content change on any file" 1>&2 + fi + fi + fi else # apply operation(s) to stdin/stdout if [ ".$opt_v" = .yes ]; then @@ -1238,10 +1401,11 @@ subst ) eval "$sedcmd" fi fi + + shtool_exit 0 ;; esac -exit 0 +shtool_exit 0 -##EOF##