717 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			717 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | #!/bin/sh | ||
|  | ## | ||
|  | ##  GNU shtool -- The GNU Portable Shell Tool | ||
|  | ##  Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com> | ||
|  | ## | ||
|  | ##  See http://www.gnu.org/software/shtool/ for more information. | ||
|  | ##  See ftp://ftp.gnu.org/gnu/shtool/ for latest version. | ||
|  | ## | ||
|  | ##  Version 1.4.9 (16-Apr-2000) | ||
|  | ##  Ingredients: 3/17 available modules | ||
|  | ## | ||
|  | 
 | ||
|  | ## | ||
|  | ##  This program is free software; you can redistribute it and/or modify | ||
|  | ##  it under the terms of the GNU General Public License as published by | ||
|  | ##  the Free Software Foundation; either version 2 of the License, or | ||
|  | ##  (at your option) any later version. | ||
|  | ## | ||
|  | ##  This program is distributed in the hope that it will be useful, | ||
|  | ##  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  | ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
|  | ##  General Public License for more details. | ||
|  | ## | ||
|  | ##  You should have received a copy of the GNU General Public License | ||
|  | ##  along with this program; if not, write to the Free Software | ||
|  | ##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
|  | ##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>. | ||
|  | ## | ||
|  | ##  Notice: Given that you include this file verbatim into your own | ||
|  | ##  source tree, you are justified in saying that it remains separate | ||
|  | ##  from your package, and that this way you are simply just using GNU | ||
|  | ##  shtool. So, in this situation, there is no requirement that your | ||
|  | ##  package itself is licensed under the GNU General Public License in | ||
|  | ##  order to take advantage of GNU shtool. | ||
|  | ## | ||
|  | 
 | ||
|  | ## | ||
|  | ##  Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]] | ||
|  | ## | ||
|  | ##  Available commands: | ||
|  | ##    echo       Print string with optional construct expansion | ||
|  | ##    install    Install a program, script or datafile | ||
|  | ##    mkdir      Make one or more directories | ||
|  | ## | ||
|  | ##  Not available commands (because module was not built-in): | ||
|  | ##    mdate      Pretty-print modification time of a file or dir | ||
|  | ##    table      Pretty-print a field-separated list as a table | ||
|  | ##    prop       Display progress with a running propeller | ||
|  | ##    move       Move files with simultaneous substitution | ||
|  | ##    mkln       Make link with calculation of relative paths | ||
|  | ##    mkshadow   Make a shadow tree through symbolic links | ||
|  | ##    fixperm    Fix file permissions inside a source tree | ||
|  | ##    tarball    Roll distribution tarballs | ||
|  | ##    guessos    Simple operating system guesser | ||
|  | ##    arx        Extended archive command | ||
|  | ##    slo        Separate linker options by library class | ||
|  | ##    scpp       Sharing C Pre-Processor | ||
|  | ##    version    Generate and maintain a version information file | ||
|  | ##    path       Deal with program paths | ||
|  | ## | ||
|  | 
 | ||
|  | if [ $# -eq 0 ]; then | ||
|  |     echo "$0:Error: invalid command line" 1>&2 | ||
|  |     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.4.9 (16-Apr-2000)" | ||
|  |     echo "Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com>" | ||
|  |     echo "Report bugs to <bug-shtool@gnu.org>" | ||
|  |     echo '' | ||
|  |     echo "Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]"  | ||
|  |     echo '' | ||
|  |     echo 'Available global <options>:' | ||
|  |     echo '  -v, --version   display shtool version information' | ||
|  |     echo '  -h, --help      display shtool usage help page (this one)' | ||
|  |     echo '  -d, --debug     display shell trace information' | ||
|  |     echo '' | ||
|  |     echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:' | ||
|  |     echo '  echo     [-n] [-e] [<str> ...]' | ||
|  |     echo '  install  [-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>]' | ||
|  |     echo '           [-e<ext>] <file> <path>' | ||
|  |     echo '  mkdir    [-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]' | ||
|  |     echo '' | ||
|  |     echo 'Not available <cmd-name> (because module was not built-in):' | ||
|  |     echo '  mdate    [-n] [-z] [-s] [-d] [-f<str>] [-o<spec>] <path>' | ||
|  |     echo '  table    [-F<sep>] [-w<width>] [-c<cols>] [-s<strip>] <str><sep><str>...' | ||
|  |     echo '  prop     [-p<str>]' | ||
|  |     echo '  move     [-v] [-t] [-e] [-p] <src-file> <dst-file>' | ||
|  |     echo '  mkln     [-t] [-f] [-s] <src-path> [<src-path> ...] <dst-path>' | ||
|  |     echo '  mkshadow [-v] [-t] [-a] <src-dir> <dst-dir>' | ||
|  |     echo '  fixperm  [-v] [-t] <path> [<path> ...]' | ||
|  |     echo '  tarball  [-t] [-v] [-o <tarball>] [-c <prog>] [-d <dir>] [-u' | ||
|  |     echo '           <user>] [-g <group>] [-e <pattern>] <path> [<path> ...]' | ||
|  |     echo '  guessos  ' | ||
|  |     echo '  arx      [-t] [-C<cmd>] <op> <archive> [<file> ...]' | ||
|  |     echo '  slo      [-p<str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]' | ||
|  |     echo '  scpp     [-v] [-p] [-f<filter>] [-o<ofile>] [-t<tfile>] [-M<mark>]' | ||
|  |     echo '           [-D<dname>] [-C<cname>] <file> [<file> ...]' | ||
|  |     echo '  version  [-l<lang>] [-n<name>] [-p<prefix>] [-s<version>] [-i<knob>]' | ||
|  |     echo '           [-d<type>] <file>' | ||
|  |     echo '  path     [-s] [-r] [-d] [-b] [-m] [-p<path>] <str> [<str> ...]' | ||
|  |     echo '' | ||
|  |     exit 0 | ||
|  | fi | ||
|  | if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then | ||
|  |     echo "GNU shtool 1.4.9 (16-Apr-2000)" | ||
|  |     exit 0 | ||
|  | fi | ||
|  | if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then | ||
|  |     shift | ||
|  |     set -x | ||
|  | fi | ||
|  | name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` | ||
|  | case "$name" in | ||
|  |     echo|install|mkdir ) | ||
|  |         #   implicit tool command selection | ||
|  |         tool="$name" | ||
|  |         ;; | ||
|  |     * ) | ||
|  |         #   explicit tool command selection | ||
|  |         tool="$1" | ||
|  |         shift | ||
|  |         ;; | ||
|  | esac | ||
|  | arg_spec="" | ||
|  | opt_spec="" | ||
|  | gen_tmpfile=no | ||
|  | 
 | ||
|  | ## | ||
|  | ##  DISPATCH INTO SCRIPT PROLOG | ||
|  | ## | ||
|  | 
 | ||
|  | case $tool in | ||
|  |     echo ) | ||
|  |         str_tool="echo" | ||
|  |         str_usage="[-n] [-e] [<str> ...]" | ||
|  |         arg_spec="0+" | ||
|  |         opt_spec="n.e." | ||
|  |         opt_n=no | ||
|  |         opt_e=no | ||
|  |         ;; | ||
|  |     install ) | ||
|  |         str_tool="install" | ||
|  |         str_usage="[-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>] [-e<ext>] <file> <path>" | ||
|  |         arg_spec="2=" | ||
|  |         opt_spec="v.t.c.C.s.m:o:g:e:" | ||
|  |         opt_v=no | ||
|  |         opt_t=no | ||
|  |         opt_c=no | ||
|  |         opt_C=no | ||
|  |         opt_s=no | ||
|  |         opt_m="" | ||
|  |         opt_o="" | ||
|  |         opt_g="" | ||
|  |         opt_e="" | ||
|  |         ;; | ||
|  |     mkdir ) | ||
|  |         str_tool="mkdir" | ||
|  |         str_usage="[-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]" | ||
|  |         arg_spec="1+" | ||
|  |         opt_spec="t.f.p.m:" | ||
|  |         opt_t=no | ||
|  |         opt_f=no | ||
|  |         opt_p=no | ||
|  |         opt_m="" | ||
|  |         ;; | ||
|  |     -* ) | ||
|  |         echo "$0:Error: unknown option \`$tool'" 2>&1 | ||
|  |         echo "$0:Hint:  run \`$0 -h' for usage" 2>&1 | ||
|  |         exit 1 | ||
|  |         ;; | ||
|  |     * ) | ||
|  |         echo "$0:Error: unknown command \`$tool'" 2>&1 | ||
|  |         echo "$0:Hint:  run \`$0 -h' for usage" 2>&1 | ||
|  |         exit 1 | ||
|  |         ;; | ||
|  | esac | ||
|  | 
 | ||
|  | ## | ||
|  | ##  COMMON UTILITY CODE | ||
|  | ## | ||
|  | 
 | ||
|  | #   determine name of tool | ||
|  | if [ ".$tool" != . ]; then | ||
|  |     #   used inside shtool script | ||
|  |     toolcmd="$0 $tool" | ||
|  |     toolcmdhelp="shtool $tool" | ||
|  |     msgprefix="shtool:$tool" | ||
|  | else | ||
|  |     #   used as standalone script | ||
|  |     toolcmd="$0" | ||
|  |     toolcmdhelp="sh $0" | ||
|  |     msgprefix="$str_tool" | ||
|  | fi | ||
|  | 
 | ||
|  | #   parse argument specification string | ||
|  | eval `echo $arg_spec |\ | ||
|  |       sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` | ||
|  | 
 | ||
|  | #   parse option specification string | ||
|  | eval `echo h.$opt_spec |\ | ||
|  |       sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` | ||
|  | 
 | ||
|  | #   interate over argument line | ||
|  | opt_PREV='' | ||
|  | while [ $# -gt 0 ]; do | ||
|  |     #   special option stops processing | ||
|  |     if [ ".$1" = ".--" ]; then | ||
|  |         shift | ||
|  |         break | ||
|  |     fi | ||
|  | 
 | ||
|  |     #   determine option and argument | ||
|  |     opt_ARG_OK=no | ||
|  |     if [ ".$opt_PREV" != . ]; then | ||
|  |         #   merge previous seen option with argument | ||
|  |         opt_OPT="$opt_PREV" | ||
|  |         opt_ARG="$1" | ||
|  |         opt_ARG_OK=yes | ||
|  |         opt_PREV='' | ||
|  |     else | ||
|  |         #   split argument into option and argument | ||
|  |         case "$1" in | ||
|  |             -[a-zA-Z0-9]*) | ||
|  |                 eval `echo "x$1" |\ | ||
|  |                       sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ | ||
|  |                           -e 's/";\(.*\)$/"; opt_ARG="\1"/'` | ||
|  |                 ;; | ||
|  |             -[a-zA-Z0-9]) | ||
|  |                 opt_OPT=`echo "x$1" | cut -c3-` | ||
|  |                 opt_ARG='' | ||
|  |                 ;; | ||
|  |             *) | ||
|  |                 break | ||
|  |                 ;; | ||
|  |         esac | ||
|  |     fi | ||
|  | 
 | ||
|  |     #   eat up option | ||
|  |     shift | ||
|  | 
 | ||
|  |     #   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 | ||
|  |             opt_PREV="$opt_OPT" | ||
|  |             continue | ||
|  |         fi | ||
|  |     fi | ||
|  | 
 | ||
|  |     #   process option | ||
|  |     case $opt_MODE in | ||
|  |         '.' ) | ||
|  |             #   boolean option | ||
|  |             eval "opt_${opt_OPT}=yes" | ||
|  |             ;; | ||
|  |         ':' ) | ||
|  |             #   option with argument (multiple occurances override) | ||
|  |             eval "opt_${opt_OPT}=\"\$opt_ARG\"" | ||
|  |             ;; | ||
|  |         '+' ) | ||
|  |             #   option with argument (multiple occurances append) | ||
|  |             eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" | ||
|  |             ;; | ||
|  |         * ) | ||
|  |             echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2 | ||
|  |             echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 | ||
|  |             exit 1 | ||
|  |             ;; | ||
|  |     esac | ||
|  | done | ||
|  | if [ ".$opt_PREV" != . ]; then | ||
|  |     echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2 | ||
|  |     echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 | ||
|  |     exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | #   process help option | ||
|  | if [ ".$opt_h" = .yes ]; then | ||
|  |     echo "Usage: $toolcmdhelp $str_usage" | ||
|  |     exit 0 | ||
|  | fi | ||
|  | 
 | ||
|  | #   complain about incorrect number of arguments | ||
|  | case $arg_MODE in | ||
|  |     '=' ) | ||
|  |         if [ $# -ne $arg_NUMS ]; then | ||
|  |             echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 | ||
|  |             echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2 | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |         ;; | ||
|  |     '+' ) | ||
|  |         if [ $# -lt $arg_NUMS ]; then | ||
|  |             echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 | ||
|  |             echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2 | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |         ;; | ||
|  | esac | ||
|  | 
 | ||
|  | #   establish a temporary file on request | ||
|  | if [ ".$gen_tmpfile" = .yes ]; then | ||
|  |     if [ ".$TMPDIR" != . ]; then | ||
|  |         tmpdir="$TMPDIR" | ||
|  |     elif [ ".$TEMPDIR" != . ]; then | ||
|  |         tmpdir="$TEMPDIR" | ||
|  |     else | ||
|  |         tmpdir="/tmp" | ||
|  |     fi | ||
|  |     tmpfile="$tmpdir/.shtool.$$" | ||
|  |     rm -f $tmpfile >/dev/null 2>&1 | ||
|  |     touch $tmpfile | ||
|  | fi | ||
|  | 
 | ||
|  | ## | ||
|  | ##  DISPATCH INTO SCRIPT BODY | ||
|  | ## | ||
|  | 
 | ||
|  | case $tool in | ||
|  | 
 | ||
|  | echo ) | ||
|  |     ## | ||
|  |     ##  echo -- Print string with optional construct expansion | ||
|  |     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com> | ||
|  |     ##  Originally written for WML as buildinfo | ||
|  |     ## | ||
|  |      | ||
|  |     text="$*" | ||
|  |      | ||
|  |     #   check for broken escape sequence expansion | ||
|  |     seo='' | ||
|  |     bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` | ||
|  |     if [ ".$bytes" != .3 ]; then | ||
|  |         bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` | ||
|  |         if [ ".$bytes" = .3 ]; then | ||
|  |             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 | ||
|  |         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 2>/dev/null` | ||
|  |                 term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null` | ||
|  |                 ;; | ||
|  |             vt100|vt100*) | ||
|  |                 term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null` | ||
|  |                 term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null` | ||
|  |                 ;; | ||
|  |             #   for all others, we try to use a possibly existing `tput' or `tcout' utility | ||
|  |             * ) | ||
|  |                 paths=`echo $PATH | sed -e 's/:/ /g'` | ||
|  |                 for tool in tput tcout; do | ||
|  |                     for dir in $paths; do | ||
|  |                         if [ -r "$dir/$tool" ]; then | ||
|  |                             for seq in bold md smso; do # 'smso' is last | ||
|  |                                 bold="`$dir/$tool $seq 2>/dev/null`" | ||
|  |                                 if [ ".$bold" != . ]; then | ||
|  |                                     term_bold="$bold" | ||
|  |                                     break | ||
|  |                                 fi | ||
|  |                             done | ||
|  |                             if [ ".$term_bold" != . ]; then | ||
|  |                                 for seq in sgr0 me rmso reset; do # 'reset' is last | ||
|  |                                     norm="`$dir/$tool $seq 2>/dev/null`" | ||
|  |                                     if [ ".$norm" != . ]; then | ||
|  |                                         term_norm="$norm" | ||
|  |                                         break | ||
|  |                                     fi | ||
|  |                                 done | ||
|  |                             fi | ||
|  |                             break | ||
|  |                         fi | ||
|  |                     done | ||
|  |                     if [ ".$term_bold" != . -a ".$term_norm" != . ]; then | ||
|  |                         break; | ||
|  |                     fi | ||
|  |                 done | ||
|  |                 ;; | ||
|  |         esac | ||
|  |         if [ ".$term_bold" = . -o ".$term_norm" = . ]; then | ||
|  |             echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 | ||
|  |         fi | ||
|  |     fi | ||
|  |      | ||
|  |     #   determine user name | ||
|  |     username='' | ||
|  |     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uU]'`" != . ]; then | ||
|  |         username="$LOGNAME" | ||
|  |         if [ ".$username" = . ]; then | ||
|  |             username="$USER" | ||
|  |             if [ ".$username" = . ]; then | ||
|  |                 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 | ||
|  |      | ||
|  |     #   determine user id | ||
|  |     userid='' | ||
|  |     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%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 | ||
|  |             if [ ".$userid" = . ]; then | ||
|  |                 userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ | ||
|  |                         sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` | ||
|  |                 if [ ".$userid" = . ]; then | ||
|  |                     userid=`(ypcat passwd) 2>/dev/null | | ||
|  |                             egrep "^${username}:" | \ | ||
|  |                             sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` | ||
|  |                     if [ ".$userid" = . ]; then | ||
|  |                         userid='?' | ||
|  |                     fi | ||
|  |                 fi | ||
|  |             fi | ||
|  |         fi | ||
|  |     fi | ||
|  |      | ||
|  |     #   determine host name | ||
|  |     hostname='' | ||
|  |     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then | ||
|  |         hostname="`(uname -n) 2>/dev/null |\ | ||
|  |                    awk '{ printf("%s", $1); }'`" | ||
|  |         if [ ".$hostname" = . ]; then | ||
|  |             hostname="`(hostname) 2>/dev/null |\ | ||
|  |                        awk '{ printf("%s", $1); }'`" | ||
|  |             if [ ".$hostname" = . ]; then | ||
|  |                 hostname='unknown' | ||
|  |             fi | ||
|  |         fi | ||
|  |         case $hostname in | ||
|  |             *.* ) | ||
|  |                 domainname=".`echo $hostname | cut -d. -f2-`" | ||
|  |                 hostname="`echo $hostname | cut -d. -f1`" | ||
|  |                 ;; | ||
|  |         esac | ||
|  |     fi | ||
|  |      | ||
|  |     #   determine domain name | ||
|  |     domainname='' | ||
|  |     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then | ||
|  |         if [ ".$domainname" = . ]; then | ||
|  |             if [ -f /etc/resolv.conf ]; then | ||
|  |                 domainname="`egrep '^[ 	]*domain' /etc/resolv.conf | head -1 |\ | ||
|  |                              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 |\ | ||
|  |                                  sed -e 's/.*search//' \ | ||
|  |                                      -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \ | ||
|  |                                      -e 's/ .*//' -e 's/	.*//' \ | ||
|  |                                      -e 's/^\.//' -e 's/^/./' |\ | ||
|  |                                  awk '{ printf("%s", $1); }'`" | ||
|  |                 fi | ||
|  |             fi | ||
|  |         fi | ||
|  |     fi | ||
|  |      | ||
|  |     #   determine current time | ||
|  |     time_day='' | ||
|  |     time_month='' | ||
|  |     time_year='' | ||
|  |     time_monthname='' | ||
|  |     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then | ||
|  |         time_day=`date '+%d'` | ||
|  |         time_month=`date '+%m'` | ||
|  |         time_year=`date '+%Y' 2>/dev/null` | ||
|  |         if [ ".$time_year" = . ]; then | ||
|  |             time_year=`date '+%y'` | ||
|  |             case $time_year in | ||
|  |                 [5-9][0-9]) time_year="19$time_year" ;; | ||
|  |                 [0-4][0-9]) time_year="20$time_year" ;; | ||
|  |             esac | ||
|  |         fi | ||
|  |         case $time_month in | ||
|  |             1|01) time_monthname='Jan' ;; | ||
|  |             2|02) time_monthname='Feb' ;; | ||
|  |             3|03) time_monthname='Mar' ;; | ||
|  |             4|04) time_monthname='Apr' ;; | ||
|  |             5|05) time_monthname='May' ;; | ||
|  |             6|06) time_monthname='Jun' ;; | ||
|  |             7|07) time_monthname='Jul' ;; | ||
|  |             8|08) time_monthname='Aug' ;; | ||
|  |             9|09) time_monthname='Sep' ;; | ||
|  |               10) time_monthname='Oct' ;; | ||
|  |               11) time_monthname='Nov' ;; | ||
|  |               12) time_monthname='Dec' ;; | ||
|  |         esac | ||
|  |     fi | ||
|  |      | ||
|  |     #   expand special ``%x'' constructs | ||
|  |     if [ ".$opt_e" = .yes ]; then | ||
|  |         text=`echo $seo "$text" |\ | ||
|  |               sed -e "s/%B/${term_bold}/g" \ | ||
|  |                   -e "s/%b/${term_norm}/g" \ | ||
|  |                   -e "s/%u/${username}/g" \ | ||
|  |                   -e "s/%U/${userid}/g" \ | ||
|  |                   -e "s/%h/${hostname}/g" \ | ||
|  |                   -e "s/%d/${domainname}/g" \ | ||
|  |                   -e "s/%D/${time_day}/g" \ | ||
|  |                   -e "s/%M/${time_month}/g" \ | ||
|  |                   -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" | ||
|  |     else | ||
|  |         #   the harder part: echo -n is best, because | ||
|  |         #   awk may complain about some \xx sequences. | ||
|  |         if [ ".$minusn" != . ]; then | ||
|  |             echo $seo $minusn "$text" | ||
|  |         else | ||
|  |             echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" | ||
|  |         fi | ||
|  |     fi | ||
|  |     ;; | ||
|  | 
 | ||
|  | install ) | ||
|  |     ## | ||
|  |     ##  install -- Install a program, script or datafile | ||
|  |     ##  Copyright (c) 1997-2000 Ralf S. Engelschall <rse@engelschall.com> | ||
|  |     ##  Originally written for shtool | ||
|  |     ## | ||
|  |      | ||
|  |     src="$1" | ||
|  |     dst="$2" | ||
|  |      | ||
|  |     #  If destination is a directory, append the input filename | ||
|  |     if [ -d $dst ]; then | ||
|  |         dst=`echo "$dst" | sed -e 's:/$::'` | ||
|  |         dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` | ||
|  |         dst="$dst/$dstfile" | ||
|  |     fi | ||
|  |      | ||
|  |     #  Add a possible extension to src and dst | ||
|  |     if [ ".$opt_e" != . ]; then | ||
|  |         src="$src$opt_e" | ||
|  |         dst="$dst$opt_e" | ||
|  |     fi | ||
|  |      | ||
|  |     #  Check for correct arguments | ||
|  |     if [ ".$src" = ".$dst" ]; then | ||
|  |         echo "$msgprefix:Error: source and destination are the same" 1>&2 | ||
|  |         exit 1 | ||
|  |     fi | ||
|  |      | ||
|  |     #  Make a temp file name in the destination directory | ||
|  |     dstdir=`echo $dst | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'` | ||
|  |     dsttmp="$dstdir/#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 | ||
|  |         opt_c=yes | ||
|  |     fi | ||
|  |     if [ ".$opt_c" = .yes ]; then | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "cp $src $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         cp $src $dsttmp || exit $? | ||
|  |     else | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "mv $src $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         mv $src $dsttmp || exit $? | ||
|  |     fi | ||
|  |      | ||
|  |     #  Adjust the target file | ||
|  |     #  (we do chmod last to preserve setuid bits) | ||
|  |     if [ ".$opt_s" = .yes ]; then | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "strip $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         strip $dsttmp || exit $? | ||
|  |     fi | ||
|  |     if [ ".$opt_o" != . ]; then | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "chown $opt_o $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         chown $opt_o $dsttmp || exit $? | ||
|  |     fi | ||
|  |     if [ ".$opt_g" != . ]; then | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "chgrp $opt_g $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         chgrp $opt_g $dsttmp || exit $? | ||
|  |     fi | ||
|  |     if [ ".$opt_m" != . ]; then | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "chmod $opt_m $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         chmod $opt_m $dsttmp || exit $? | ||
|  |     fi | ||
|  |      | ||
|  |     #   Determine whether to do a quick install | ||
|  |     #   (has to be done _after_ the strip was already done) | ||
|  |     quick=no | ||
|  |     if [ ".$opt_C" = .yes ]; then | ||
|  |         if [ -r $dst ]; then | ||
|  |             if cmp -s $src $dst; then | ||
|  |                 quick=yes | ||
|  |             fi | ||
|  |         fi | ||
|  |     fi | ||
|  |      | ||
|  |     #   Finally install the file to the real destination | ||
|  |     if [ $quick = yes ]; then | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "rm -f $dsttmp" 1>&2 | ||
|  |         fi | ||
|  |         rm -f $dsttmp | ||
|  |     else | ||
|  |         if [ ".$opt_t" = .yes ]; then | ||
|  |             echo "rm -f $dst && mv $dsttmp $dst" 1>&2 | ||
|  |         fi | ||
|  |         rm -f $dst && mv $dsttmp $dst | ||
|  |     fi | ||
|  |     ;; | ||
|  | 
 | ||
|  | mkdir ) | ||
|  |     ## | ||
|  |     ##  mkdir -- Make one or more directories | ||
|  |     ##  Copyright (c) 1996-2000 Ralf S. Engelschall <rse@engelschall.com> | ||
|  |     ##  Originally written for public domain by Noah Friedman <friedman@prep.ai.mit.edu> | ||
|  |     ##  Cleaned up and enhanced for shtool | ||
|  |     ## | ||
|  |      | ||
|  |     errstatus=0 | ||
|  |     for p in ${1+"$@"}; do | ||
|  |         #   if the directory already exists... | ||
|  |         if [ -d "$p" ]; then | ||
|  |             if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then | ||
|  |                 echo "$msgprefix:Error: directory already exists: $p" 1>&2 | ||
|  |                 errstatus=1 | ||
|  |                 break | ||
|  |             else | ||
|  |                 continue | ||
|  |             fi | ||
|  |         fi | ||
|  |         #   if the directory has to be created... | ||
|  |         if [ ".$opt_p" = .no ]; then | ||
|  |             if [ ".$opt_t" = .yes ]; then | ||
|  |                 echo "mkdir $p" 1>&2 | ||
|  |             fi | ||
|  |             mkdir $p || errstatus=$? | ||
|  |         else | ||
|  |             #   the smart situation | ||
|  |             set fnord `echo ":$p" |\ | ||
|  |                        sed -e 's/^:\//%/' \ | ||
|  |                            -e 's/^://' \ | ||
|  |                            -e 's/\// /g' \ | ||
|  |                            -e 's/^%/\//'` | ||
|  |             shift | ||
|  |             pathcomp='' | ||
|  |             for d in ${1+"$@"}; do | ||
|  |                 pathcomp="$pathcomp$d" | ||
|  |                 case "$pathcomp" in | ||
|  |                     -* ) pathcomp="./$pathcomp" ;; | ||
|  |                 esac | ||
|  |                 if [ ! -d "$pathcomp" ]; then | ||
|  |                     if [ ".$opt_t" = .yes ]; then | ||
|  |                         echo "mkdir $pathcomp" 1>&2 | ||
|  |                     fi | ||
|  |                     mkdir $pathcomp || errstatus=$? | ||
|  |                     if [ ".$opt_m" != . ]; then | ||
|  |                         if [ ".$opt_t" = .yes ]; then | ||
|  |                             echo "chmod $opt_m $pathcomp" 1>&2 | ||
|  |                         fi | ||
|  |                         chmod $opt_m $pathcomp || errstatus=$? | ||
|  |                     fi | ||
|  |                 fi | ||
|  |                 pathcomp="$pathcomp/" | ||
|  |             done | ||
|  |         fi | ||
|  |     done | ||
|  |     exit $errstatus | ||
|  |     ;; | ||
|  | 
 | ||
|  | esac | ||
|  | 
 | ||
|  | exit 0 | ||
|  | 
 | ||
|  | ##EOF## |