1#!/bin/sh 2## 3## GNU shtool -- The GNU Portable Shell Tool 4## Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com> 5## 6## See http://www.gnu.org/software/shtool/ for more information. 7## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. 8## 9## Version: 2.0.8 (18-Jul-2008) 10## Contents: 5/19 available modules 11## 12 13## 14## This program is free software; you can redistribute it and/or modify 15## it under the terms of the GNU General Public License as published by 16## the Free Software Foundation; either version 2 of the License, or 17## (at your option) any later version. 18## 19## This program is distributed in the hope that it will be useful, 20## but WITHOUT ANY WARRANTY; without even the implied warranty of 21## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22## General Public License for more details. 23## 24## You should have received a copy of the GNU General Public License 25## along with this program; if not, write to the Free Software 26## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 27## USA, or contact Ralf S. Engelschall <rse@engelschall.com>. 28## 29## NOTICE: Given that you include this file verbatim into your own 30## source tree, you are justified in saying that it remains separate 31## from your package, and that this way you are simply just using GNU 32## shtool. So, in this situation, there is no requirement that your 33## package itself is licensed under the GNU General Public License in 34## order to take advantage of GNU shtool. 35## 36 37## 38## Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]] 39## 40## Available commands: 41## echo Print string with optional construct expansion 42## install Install a program, script or datafile 43## mkdir Make one or more directories 44## platform Platform Identification Utility 45## path Deal with program paths 46## 47## Not available commands (because module was not built-in): 48## mdate Pretty-print modification time of a file or dir 49## table Pretty-print a field-separated list as a table 50## prop Display progress with a running propeller 51## move Move files with simultaneous substitution 52## mkln Make link with calculation of relative paths 53## mkshadow Make a shadow tree through symbolic links 54## fixperm Fix file permissions inside a source tree 55## rotate Logfile rotation 56## tarball Roll distribution tarballs 57## subst Apply sed(1) substitution operations 58## arx Extended archive command 59## slo Separate linker options by library class 60## scpp Sharing C Pre-Processor 61## version Maintain a version information file 62## 63 64# maximum Bourne-Shell compatibility 65if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then 66 # reconfigure zsh(1) 67 emulate sh 68 NULLCMD=: 69 alias -g '${1+"$@"}'='"$@"' 70elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then 71 # reconfigure bash(1) 72 set -o posix 73fi 74 75# maximum independence of NLS nuisances 76for var in \ 77 LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ 78 LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ 79 LC_TELEPHONE LC_TIME 80do 81 if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then 82 eval $var=C; export $var 83 else 84 unset $var 85 fi 86done 87 88# initial command line handling 89if [ $# -eq 0 ]; then 90 echo "$0:Error: invalid command line" 1>&2 91 echo "$0:Hint: run \`$0 -h' for usage" 1>&2 92 exit 1 93fi 94if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then 95 echo "This is GNU shtool, version 2.0.8 (18-Jul-2008)" 96 echo 'Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>' 97 echo 'Report bugs to <bug-shtool@gnu.org>' 98 echo '' 99 echo 'Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]' 100 echo '' 101 echo 'Available global <options>:' 102 echo ' -v, --version display shtool version information' 103 echo ' -h, --help display shtool usage help page (this one)' 104 echo ' -d, --debug display shell trace information' 105 echo ' -r, --recreate recreate this shtool script via shtoolize' 106 echo '' 107 echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:' 108 echo ' echo [-n|--newline] [-e|--expand] [<string> ...]' 109 echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' 110 echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>]' 111 echo ' [-o|--owner <owner>] [-g|--group <group>] [-e|--exec' 112 echo ' <sed-cmd>] <file> [<file> ...] <path>' 113 echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' 114 echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir>' 115 echo ' [<dir> ...]' 116 echo ' platform [-F|--format <format>] [-S|--sep <string>] [-C|--conc' 117 echo ' <string>] [-L|--lower] [-U|--upper] [-v|--verbose]' 118 echo ' [-c|--concise] [-n|--no-newline] [-t|--type <type>]' 119 echo ' [-V|--version] [-h|--help]' 120 echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]' 121 echo ' [-m|--magic] [-p|--path <path>] <str> [<str> ...]' 122 echo '' 123 echo 'Not available <cmd-name> (because module was not built-in):' 124 echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' 125 echo ' [-f|--field-sep <str>] [-o|--order <spec>] <path>' 126 echo ' table [-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns' 127 echo ' <cols>] [-s|--strip <strip>] <str><sep><str>...' 128 echo ' prop [-p|--prefix <str>]' 129 echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' 130 echo ' <src-file> <dst-file>' 131 echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] <src-path>' 132 echo ' [<src-path> ...] <dst-path>' 133 echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>' 134 echo ' fixperm [-v|--verbose] [-t|--trace] <path> [<path> ...]' 135 echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' 136 echo ' <count>] [-s|--size <size>] [-c|--copy] [-r|--remove]' 137 echo ' [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>]' 138 echo ' [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode' 139 echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate' 140 echo ' <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]' 141 echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output <tarball>]' 142 echo ' [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user' 143 echo ' <user>] [-g|--group <group>] [-e|--exclude <pattern>]' 144 echo ' <path> [<path> ...]' 145 echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]' 146 echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup' 147 echo ' <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>]' 148 echo ' [...]' 149 echo ' arx [-t|--trace] [-C|--command <cmd>] <op> <archive> [<file>' 150 echo ' ...]' 151 echo ' slo [-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib>' 152 echo ' ...]' 153 echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter <filter>]' 154 echo ' [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark' 155 echo ' <mark>] [-D|--define <dname>] [-C|--class <cname>]' 156 echo ' <file> [<file> ...]' 157 echo ' version [-l|--language <lang>] [-n|--name <name>] [-p|--prefix' 158 echo ' <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase' 159 echo ' <knob>] [-d|--display <type>] <file>' 160 echo '' 161 exit 0 162fi 163if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then 164 echo "GNU shtool 2.0.8 (18-Jul-2008)" 165 exit 0 166fi 167if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then 168 shtoolize -obuild/shtool echo install mkdir platform path 169 exit 0 170fi 171if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then 172 shift 173 set -x 174fi 175name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` 176case "$name" in 177 echo|install|mkdir|platform|path ) 178 # implicit tool command selection 179 tool="$name" 180 ;; 181 * ) 182 # explicit tool command selection 183 tool="$1" 184 shift 185 ;; 186esac 187arg_spec="" 188opt_spec="" 189gen_tmpfile=no 190 191## 192## DISPATCH INTO SCRIPT PROLOG 193## 194 195case $tool in 196 echo ) 197 str_tool="echo" 198 str_usage="[-n|--newline] [-e|--expand] [<string> ...]" 199 arg_spec="0+" 200 opt_spec="n.e." 201 opt_alias="n:newline,e:expand" 202 opt_n=no 203 opt_e=no 204 ;; 205 install ) 206 str_tool="install" 207 str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-e|--exec <sed-cmd>] <file> [<file> ...] <path>" 208 arg_spec="1+" 209 opt_spec="v.t.d.c.C.s.m:o:g:e+" 210 opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" 211 opt_v=no 212 opt_t=no 213 opt_d=no 214 opt_c=no 215 opt_C=no 216 opt_s=no 217 opt_m="0755" 218 opt_o="" 219 opt_g="" 220 opt_e="" 221 ;; 222 mkdir ) 223 str_tool="mkdir" 224 str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir> [<dir> ...]" 225 arg_spec="1+" 226 opt_spec="t.f.p.m:o:g:" 227 opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" 228 opt_t=no 229 opt_f=no 230 opt_p=no 231 opt_m="" 232 opt_o="" 233 opt_g="" 234 ;; 235 platform ) 236 str_tool="platform" 237 str_usage="[-F|--format <format>] [-S|--sep <string>] [-C|--conc <string>] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type <type>] [-V|--version] [-h|--help]" 238 arg_spec="0=" 239 opt_spec="F:S:C:L.U.v.c.n.t:d.V.h." 240 opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,V:version,h:help" 241 opt_F="%{sp} (%{ap})" 242 opt_S=" " 243 opt_C="/" 244 opt_L=no 245 opt_U=no 246 opt_t="" 247 opt_v=no 248 opt_c=no 249 opt_n=no 250 opt_V=no 251 opt_h=no 252 ;; 253 path ) 254 str_tool="path" 255 str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path <path>] <str> [<str> ...]" 256 gen_tmpfile=yes 257 arg_spec="1+" 258 opt_spec="s.r.d.b.m.p:" 259 opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path" 260 opt_s=no 261 opt_r=no 262 opt_d=no 263 opt_b=no 264 opt_m=no 265 opt_p="$PATH" 266 ;; 267 -* ) 268 echo "$0:Error: unknown option \`$tool'" 2>&1 269 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 270 exit 1 271 ;; 272 * ) 273 echo "$0:Error: unknown command \`$tool'" 2>&1 274 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 275 exit 1 276 ;; 277esac 278 279## 280## COMMON UTILITY CODE 281## 282 283# commonly used ASCII values 284ASC_TAB=" " 285ASC_NL=" 286" 287 288# determine name of tool 289if [ ".$tool" != . ]; then 290 # used inside shtool script 291 toolcmd="$0 $tool" 292 toolcmdhelp="shtool $tool" 293 msgprefix="shtool:$tool" 294else 295 # used as standalone script 296 toolcmd="$0" 297 toolcmdhelp="sh $0" 298 msgprefix="$str_tool" 299fi 300 301# parse argument specification string 302eval `echo $arg_spec |\ 303 sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` 304 305# parse option specification string 306eval `echo h.$opt_spec |\ 307 sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` 308 309# parse option alias string 310eval `echo h:help,$opt_alias |\ 311 sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` 312 313# interate over argument line 314opt_PREV='' 315while [ $# -gt 0 ]; do 316 # special option stops processing 317 if [ ".$1" = ".--" ]; then 318 shift 319 break 320 fi 321 322 # determine option and argument 323 opt_ARG_OK=no 324 if [ ".$opt_PREV" != . ]; then 325 # merge previous seen option with argument 326 opt_OPT="$opt_PREV" 327 opt_ARG="$1" 328 opt_ARG_OK=yes 329 opt_PREV='' 330 else 331 # split argument into option and argument 332 case "$1" in 333 --[a-zA-Z0-9]*=*) 334 eval `echo "x$1" |\ 335 sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` 336 opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` 337 eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" 338 ;; 339 --[a-zA-Z0-9]*) 340 opt_OPT=`echo "x$1" | cut -c4-` 341 opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` 342 eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" 343 opt_ARG='' 344 ;; 345 -[a-zA-Z0-9]*) 346 eval `echo "x$1" |\ 347 sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ 348 -e 's/";\(.*\)$/"; opt_ARG="\1"/'` 349 ;; 350 -[a-zA-Z0-9]) 351 opt_OPT=`echo "x$1" | cut -c3-` 352 opt_ARG='' 353 ;; 354 *) 355 break 356 ;; 357 esac 358 fi 359 360 # eat up option 361 shift 362 363 # determine whether option needs an argument 364 eval "opt_MODE=\$opt_MODE_${opt_OPT}" 365 if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then 366 if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then 367 opt_PREV="$opt_OPT" 368 continue 369 fi 370 fi 371 372 # process option 373 case $opt_MODE in 374 '.' ) 375 # boolean option 376 eval "opt_${opt_OPT}=yes" 377 ;; 378 ':' ) 379 # option with argument (multiple occurrences override) 380 eval "opt_${opt_OPT}=\"\$opt_ARG\"" 381 ;; 382 '+' ) 383 # option with argument (multiple occurrences append) 384 eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\"" 385 ;; 386 * ) 387 echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2 388 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 389 exit 1 390 ;; 391 esac 392done 393if [ ".$opt_PREV" != . ]; then 394 echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2 395 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 396 exit 1 397fi 398 399# process help option 400if [ ".$opt_h" = .yes ]; then 401 echo "Usage: $toolcmdhelp $str_usage" 402 exit 0 403fi 404 405# complain about incorrect number of arguments 406case $arg_MODE in 407 '=' ) 408 if [ $# -ne $arg_NUMS ]; then 409 echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 410 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 411 exit 1 412 fi 413 ;; 414 '+' ) 415 if [ $# -lt $arg_NUMS ]; then 416 echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 417 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 418 exit 1 419 fi 420 ;; 421esac 422 423# establish a temporary file on request 424if [ ".$gen_tmpfile" = .yes ]; then 425 # create (explicitly) secure temporary directory 426 if [ ".$TMPDIR" != . ]; then 427 tmpdir="$TMPDIR" 428 elif [ ".$TEMPDIR" != . ]; then 429 tmpdir="$TEMPDIR" 430 else 431 tmpdir="/tmp" 432 fi 433 tmpdir="$tmpdir/.shtool.$$" 434 ( umask 077 435 rm -rf "$tmpdir" >/dev/null 2>&1 || true 436 mkdir "$tmpdir" >/dev/null 2>&1 437 if [ $? -ne 0 ]; then 438 echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2 439 exit 1 440 fi 441 ) 442 443 # create (implicitly) secure temporary file 444 tmpfile="$tmpdir/shtool.tmp" 445 touch "$tmpfile" 446fi 447 448# utility function: map string to lower case 449util_lower () { 450 echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' 451} 452 453# utility function: map string to upper case 454util_upper () { 455 echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 456} 457 458# cleanup procedure 459shtool_exit () { 460 rc="$1" 461 if [ ".$gen_tmpfile" = .yes ]; then 462 rm -rf "$tmpdir" >/dev/null 2>&1 || true 463 fi 464 exit $rc 465} 466 467## 468## DISPATCH INTO SCRIPT BODY 469## 470 471case $tool in 472 473echo ) 474 ## 475 ## echo -- Print string with optional construct expansion 476 ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> 477 ## 478 479 text="$*" 480 481 # check for broken escape sequence expansion 482 seo='' 483 bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` 484 if [ ".$bytes" != .3 ]; then 485 bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` 486 if [ ".$bytes" = .3 ]; then 487 seo='-E' 488 fi 489 fi 490 491 # check for existing -n option (to suppress newline) 492 minusn='' 493 bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` 494 if [ ".$bytes" = .3 ]; then 495 minusn='-n' 496 fi 497 498 # determine terminal bold sequence 499 term_bold='' 500 term_norm='' 501 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then 502 case $TERM in 503 # for the most important terminal types we directly know the sequences 504 xterm|xterm*|vt220|vt220*) 505 term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null` 506 term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null` 507 ;; 508 vt100|vt100*|cygwin) 509 term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null` 510 term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null` 511 ;; 512 # for all others, we try to use a possibly existing `tput' or `tcout' utility 513 * ) 514 paths=`echo $PATH | sed -e 's/:/ /g'` 515 for tool in tput tcout; do 516 for dir in $paths; do 517 if [ -r "$dir/$tool" ]; then 518 for seq in bold md smso; do # 'smso' is last 519 bold="`$dir/$tool $seq 2>/dev/null`" 520 if [ ".$bold" != . ]; then 521 term_bold="$bold" 522 break 523 fi 524 done 525 if [ ".$term_bold" != . ]; then 526 for seq in sgr0 me rmso init reset; do # 'reset' is last 527 norm="`$dir/$tool $seq 2>/dev/null`" 528 if [ ".$norm" != . ]; then 529 term_norm="$norm" 530 break 531 fi 532 done 533 fi 534 break 535 fi 536 done 537 if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then 538 break; 539 fi 540 done 541 ;; 542 esac 543 if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then 544 echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 545 term_bold='' 546 term_norm='' 547 fi 548 fi 549 550 # determine user name 551 username='' 552 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then 553 username="`(id -un) 2>/dev/null`" 554 if [ ".$username" = . ]; then 555 str="`(id) 2>/dev/null`" 556 if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then 557 username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` 558 fi 559 if [ ".$username" = . ]; then 560 username="$LOGNAME" 561 if [ ".$username" = . ]; then 562 username="$USER" 563 if [ ".$username" = . ]; then 564 username="`(whoami) 2>/dev/null |\ 565 awk '{ printf("%s", $1); }'`" 566 if [ ".$username" = . ]; then 567 username="`(who am i) 2>/dev/null |\ 568 awk '{ printf("%s", $1); }'`" 569 if [ ".$username" = . ]; then 570 username='unknown' 571 fi 572 fi 573 fi 574 fi 575 fi 576 fi 577 fi 578 579 # determine user id 580 userid='' 581 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then 582 userid="`(id -u) 2>/dev/null`" 583 if [ ".$userid" = . ]; then 584 userid="`(id -u ${username}) 2>/dev/null`" 585 if [ ".$userid" = . ]; then 586 str="`(id) 2>/dev/null`" 587 if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then 588 userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'` 589 fi 590 if [ ".$userid" = . ]; then 591 userid=`(getent passwd ${username}) 2>/dev/null | \ 592 sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` 593 if [ ".$userid" = . ]; then 594 userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ 595 sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` 596 if [ ".$userid" = . ]; then 597 userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ 598 sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` 599 if [ ".$userid" = . ]; then 600 userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ 601 sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` 602 if [ ".$userid" = . ]; then 603 userid='?' 604 fi 605 fi 606 fi 607 fi 608 fi 609 fi 610 fi 611 fi 612 613 # determine (primary) group id 614 groupid='' 615 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then 616 groupid="`(id -g ${username}) 2>/dev/null`" 617 if [ ".$groupid" = . ]; then 618 str="`(id) 2>/dev/null`" 619 if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then 620 groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'` 621 fi 622 if [ ".$groupid" = . ]; then 623 groupid=`(getent passwd ${username}) 2>/dev/null | \ 624 sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` 625 if [ ".$groupid" = . ]; then 626 groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ 627 sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` 628 if [ ".$groupid" = . ]; then 629 groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ 630 sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` 631 if [ ".$groupid" = . ]; then 632 groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ 633 sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` 634 if [ ".$groupid" = . ]; then 635 groupid='?' 636 fi 637 fi 638 fi 639 fi 640 fi 641 fi 642 fi 643 644 # determine (primary) group name 645 groupname='' 646 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then 647 groupname="`(id -gn ${username}) 2>/dev/null`" 648 if [ ".$groupname" = . ]; then 649 str="`(id) 2>/dev/null`" 650 if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then 651 groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` 652 fi 653 if [ ".$groupname" = . ]; then 654 groupname=`(getent group) 2>/dev/null | \ 655 grep "^[^:]*:[^:]*:${groupid}:" | \ 656 sed -e 's/:.*$//'` 657 if [ ".$groupname" = . ]; then 658 groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ 659 sed -e 's/:.*$//'` 660 if [ ".$groupname" = . ]; then 661 groupname=`(ypcat group; niscat group) 2>/dev/null | \ 662 sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \ 663 sed -e 's/:.*$//'` 664 if [ ".$groupname" = . ]; then 665 groupname=`(nidump group .) 2>/dev/null | \ 666 grep "^[^:]*:[^:]*:${groupid}:" | \ 667 sed -e 's/:.*$//'` 668 if [ ".$groupname" = . ]; then 669 groupname='?' 670 fi 671 fi 672 fi 673 fi 674 fi 675 fi 676 fi 677 678 # determine host and domain name 679 hostname='' 680 domainname='' 681 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then 682 hostname="`(uname -n) 2>/dev/null |\ 683 awk '{ printf("%s", $1); }'`" 684 if [ ".$hostname" = . ]; then 685 hostname="`(hostname) 2>/dev/null |\ 686 awk '{ printf("%s", $1); }'`" 687 if [ ".$hostname" = . ]; then 688 hostname='unknown' 689 fi 690 fi 691 case $hostname in 692 *.* ) 693 domainname=".`echo $hostname | cut -d. -f2-`" 694 hostname="`echo $hostname | cut -d. -f1`" 695 ;; 696 esac 697 fi 698 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then 699 if [ ".$domainname" = . ]; then 700 if [ -f /etc/resolv.conf ]; then 701 domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ 702 sed -e 's/.*domain//' \ 703 -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ 704 -e 's/^\.//' -e 's/^/./' |\ 705 awk '{ printf("%s", $1); }'`" 706 if [ ".$domainname" = . ]; then 707 domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ 708 sed -e 's/.*search//' \ 709 -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ 710 -e 's/ .*//' -e 's/ .*//' \ 711 -e 's/^\.//' -e 's/^/./' |\ 712 awk '{ printf("%s", $1); }'`" 713 fi 714 fi 715 fi 716 fi 717 718 # determine current time 719 time_day='' 720 time_month='' 721 time_year='' 722 time_monthname='' 723 if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then 724 time_day=`date '+%d'` 725 time_month=`date '+%m'` 726 time_year=`date '+%Y' 2>/dev/null` 727 if [ ".$time_year" = . ]; then 728 time_year=`date '+%y'` 729 case $time_year in 730 [5-9][0-9]) time_year="19$time_year" ;; 731 [0-4][0-9]) time_year="20$time_year" ;; 732 esac 733 fi 734 case $time_month in 735 1|01) time_monthname='Jan' ;; 736 2|02) time_monthname='Feb' ;; 737 3|03) time_monthname='Mar' ;; 738 4|04) time_monthname='Apr' ;; 739 5|05) time_monthname='May' ;; 740 6|06) time_monthname='Jun' ;; 741 7|07) time_monthname='Jul' ;; 742 8|08) time_monthname='Aug' ;; 743 9|09) time_monthname='Sep' ;; 744 10) time_monthname='Oct' ;; 745 11) time_monthname='Nov' ;; 746 12) time_monthname='Dec' ;; 747 esac 748 fi 749 750 # expand special ``%x'' constructs 751 if [ ".$opt_e" = .yes ]; then 752 text=`echo $seo "$text" |\ 753 sed -e "s/%B/${term_bold}/g" \ 754 -e "s/%b/${term_norm}/g" \ 755 -e "s/%u/${username}/g" \ 756 -e "s/%U/${userid}/g" \ 757 -e "s/%g/${groupname}/g" \ 758 -e "s/%G/${groupid}/g" \ 759 -e "s/%h/${hostname}/g" \ 760 -e "s/%d/${domainname}/g" \ 761 -e "s/%D/${time_day}/g" \ 762 -e "s/%M/${time_month}/g" \ 763 -e "s/%Y/${time_year}/g" \ 764 -e "s/%m/${time_monthname}/g" 2>/dev/null` 765 fi 766 767 # create output 768 if [ .$opt_n = .no ]; then 769 echo $seo "$text" 770 else 771 # the harder part: echo -n is best, because 772 # awk may complain about some \xx sequences. 773 if [ ".$minusn" != . ]; then 774 echo $seo $minusn "$text" 775 else 776 echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" 777 fi 778 fi 779 780 shtool_exit 0 781 ;; 782 783install ) 784 ## 785 ## install -- Install a program, script or datafile 786 ## Copyright (c) 1997-2008 Ralf S. Engelschall <rse@engelschall.com> 787 ## 788 789 # special case: "shtool install -d <dir> [...]" internally 790 # maps to "shtool mkdir -f -p -m 755 <dir> [...]" 791 if [ "$opt_d" = yes ]; then 792 cmd="$0 mkdir -f -p -m 755" 793 if [ ".$opt_o" != . ]; then 794 cmd="$cmd -o '$opt_o'" 795 fi 796 if [ ".$opt_g" != . ]; then 797 cmd="$cmd -g '$opt_g'" 798 fi 799 if [ ".$opt_v" = .yes ]; then 800 cmd="$cmd -v" 801 fi 802 if [ ".$opt_t" = .yes ]; then 803 cmd="$cmd -t" 804 fi 805 for dir in "$@"; do 806 eval "$cmd $dir" || shtool_exit $? 807 done 808 shtool_exit 0 809 fi 810 811 # determine source(s) and destination 812 argc=$# 813 srcs="" 814 while [ $# -gt 1 ]; do 815 srcs="$srcs $1" 816 shift 817 done 818 dstpath="$1" 819 820 # type check for destination 821 dstisdir=0 822 if [ -d $dstpath ]; then 823 dstpath=`echo "$dstpath" | sed -e 's:/$::'` 824 dstisdir=1 825 fi 826 827 # consistency check for destination 828 if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then 829 echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 830 shtool_exit 1 831 fi 832 833 # iterate over all source(s) 834 for src in $srcs; do 835 dst=$dstpath 836 837 # if destination is a directory, append the input filename 838 if [ $dstisdir = 1 ]; then 839 dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` 840 dst="$dst/$dstfile" 841 fi 842 843 # check for correct arguments 844 if [ ".$src" = ".$dst" ]; then 845 echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 846 continue 847 fi 848 if [ -d "$src" ]; then 849 echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 850 continue 851 fi 852 853 # make a temp file name in the destination directory 854 dsttmp=`echo $dst |\ 855 sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ 856 -e "s;\$;/#INST@$$#;"` 857 858 # verbosity 859 if [ ".$opt_v" = .yes ]; then 860 echo "$src -> $dst" 1>&2 861 fi 862 863 # copy or move the file name to the temp name 864 # (because we might be not allowed to change the source) 865 if [ ".$opt_C" = .yes ]; then 866 opt_c=yes 867 fi 868 if [ ".$opt_c" = .yes ]; then 869 if [ ".$opt_t" = .yes ]; then 870 echo "cp $src $dsttmp" 1>&2 871 fi 872 cp "$src" "$dsttmp" || shtool_exit $? 873 else 874 if [ ".$opt_t" = .yes ]; then 875 echo "mv $src $dsttmp" 1>&2 876 fi 877 mv "$src" "$dsttmp" || shtool_exit $? 878 fi 879 880 # adjust the target file 881 if [ ".$opt_e" != . ]; then 882 sed='sed' 883 OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" 884 for e 885 do 886 sed="$sed -e '$e'" 887 done 888 cp "$dsttmp" "$dsttmp.old" 889 chmod u+w $dsttmp 890 eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $? 891 rm -f $dsttmp.old 892 fi 893 if [ ".$opt_s" = .yes ]; then 894 if [ ".$opt_t" = .yes ]; then 895 echo "strip $dsttmp" 1>&2 896 fi 897 strip $dsttmp || shtool_exit $? 898 fi 899 if [ ".$opt_o" != . ]; then 900 if [ ".$opt_t" = .yes ]; then 901 echo "chown $opt_o $dsttmp" 1>&2 902 fi 903 chown $opt_o $dsttmp || shtool_exit $? 904 fi 905 if [ ".$opt_g" != . ]; then 906 if [ ".$opt_t" = .yes ]; then 907 echo "chgrp $opt_g $dsttmp" 1>&2 908 fi 909 chgrp $opt_g $dsttmp || shtool_exit $? 910 fi 911 if [ ".$opt_m" != ".-" ]; then 912 if [ ".$opt_t" = .yes ]; then 913 echo "chmod $opt_m $dsttmp" 1>&2 914 fi 915 chmod $opt_m $dsttmp || shtool_exit $? 916 fi 917 918 # determine whether to do a quick install 919 # (has to be done _after_ the strip was already done) 920 quick=no 921 if [ ".$opt_C" = .yes ]; then 922 if [ -r $dst ]; then 923 if cmp -s "$src" "$dst"; then 924 quick=yes 925 fi 926 fi 927 fi 928 929 # finally, install the file to the real destination 930 if [ $quick = yes ]; then 931 if [ ".$opt_t" = .yes ]; then 932 echo "rm -f $dsttmp" 1>&2 933 fi 934 rm -f $dsttmp 935 else 936 if [ ".$opt_t" = .yes ]; then 937 echo "rm -f $dst && mv $dsttmp $dst" 1>&2 938 fi 939 rm -f $dst && mv $dsttmp $dst 940 fi 941 done 942 943 shtool_exit 0 944 ;; 945 946mkdir ) 947 ## 948 ## mkdir -- Make one or more directories 949 ## Copyright (c) 1996-2008 Ralf S. Engelschall <rse@engelschall.com> 950 ## 951 952 errstatus=0 953 for p in ${1+"$@"}; do 954 # if the directory already exists... 955 if [ -d "$p" ]; then 956 if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then 957 echo "$msgprefix:Error: directory already exists: $p" 1>&2 958 errstatus=1 959 break 960 else 961 continue 962 fi 963 fi 964 # if the directory has to be created... 965 if [ ".$opt_p" = .no ]; then 966 if [ ".$opt_t" = .yes ]; then 967 echo "mkdir $p" 1>&2 968 fi 969 mkdir $p || errstatus=$? 970 if [ ".$opt_o" != . ]; then 971 if [ ".$opt_t" = .yes ]; then 972 echo "chown $opt_o $p" 1>&2 973 fi 974 chown $opt_o $p || errstatus=$? 975 fi 976 if [ ".$opt_g" != . ]; then 977 if [ ".$opt_t" = .yes ]; then 978 echo "chgrp $opt_g $p" 1>&2 979 fi 980 chgrp $opt_g $p || errstatus=$? 981 fi 982 if [ ".$opt_m" != . ]; then 983 if [ ".$opt_t" = .yes ]; then 984 echo "chmod $opt_m $p" 1>&2 985 fi 986 chmod $opt_m $p || errstatus=$? 987 fi 988 else 989 # the smart situation 990 set fnord `echo ":$p" |\ 991 sed -e 's/^:\//%/' \ 992 -e 's/^://' \ 993 -e 's/\// /g' \ 994 -e 's/^%/\//'` 995 shift 996 pathcomp='' 997 for d in ${1+"$@"}; do 998 pathcomp="$pathcomp$d" 999 case "$pathcomp" in 1000 -* ) pathcomp="./$pathcomp" ;; 1001 esac 1002 if [ ! -d "$pathcomp" ]; then 1003 if [ ".$opt_t" = .yes ]; then 1004 echo "mkdir $pathcomp" 1>&2 1005 fi 1006 mkdir $pathcomp || errstatus=$? 1007 if [ ".$opt_o" != . ]; then 1008 if [ ".$opt_t" = .yes ]; then 1009 echo "chown $opt_o $pathcomp" 1>&2 1010 fi 1011 chown $opt_o $pathcomp || errstatus=$? 1012 fi 1013 if [ ".$opt_g" != . ]; then 1014 if [ ".$opt_t" = .yes ]; then 1015 echo "chgrp $opt_g $pathcomp" 1>&2 1016 fi 1017 chgrp $opt_g $pathcomp || errstatus=$? 1018 fi 1019 if [ ".$opt_m" != . ]; then 1020 if [ ".$opt_t" = .yes ]; then 1021 echo "chmod $opt_m $pathcomp" 1>&2 1022 fi 1023 chmod $opt_m $pathcomp || errstatus=$? 1024 fi 1025 fi 1026 pathcomp="$pathcomp/" 1027 done 1028 fi 1029 done 1030 1031 shtool_exit $errstatus 1032 ;; 1033 1034platform ) 1035 ## 1036 ## platform -- Platform Identification Utility 1037 ## Copyright (c) 2003-2008 Ralf S. Engelschall <rse@engelschall.com> 1038 ## 1039 1040 # option post-processing 1041 if [ ".$opt_t" != . ]; then 1042 case "$opt_t" in 1043 binary ) 1044 # binary package id (OpenPKG RPM) 1045 opt_F="%<ap>-%<sp>" 1046 opt_L=yes 1047 opt_S="" 1048 opt_C="+" 1049 ;; 1050 build ) 1051 # build time checking (OpenPKG RPM) 1052 opt_F="%<at>-%<st>" 1053 opt_L=yes 1054 opt_S="" 1055 opt_C="+" 1056 ;; 1057 gnu ) 1058 # GNU config.guess style <arch>-<vendor>-<os><osversion> 1059 opt_F="%<at>-unknown-%<st>" 1060 opt_L=yes 1061 opt_S="" 1062 opt_C="+" 1063 ;; 1064 web ) 1065 # non-whitespace HTTP Server-header id 1066 opt_F="%<sp>-%<ap>" 1067 opt_S="/" 1068 opt_C="+" 1069 ;; 1070 summary) 1071 # human readable verbose summary information 1072 opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])" 1073 opt_S=" " 1074 opt_C="/" 1075 ;; 1076 all-in-one ) 1077 # full-table all-in-one information 1078 opt_F="" 1079 opt_F="${opt_F}concise architecture class: %<ac>\\n" 1080 opt_F="${opt_F}regular architecture class: %{ac}\\n" 1081 opt_F="${opt_F}verbose architecture class: %[ac]\\n" 1082 opt_F="${opt_F}concise architecture product: %<ap>\\n" 1083 opt_F="${opt_F}regular architecture product: %{ap}\\n" 1084 opt_F="${opt_F}verbose architecture product: %[ap]\\n" 1085 opt_F="${opt_F}concise architecture technology: %<at>\\n" 1086 opt_F="${opt_F}regular architecture technology: %{at}\\n" 1087 opt_F="${opt_F}verbose architecture technology: %[at]\\n" 1088 opt_F="${opt_F}concise system class: %<sc>\\n" 1089 opt_F="${opt_F}regular system class: %{sc}\\n" 1090 opt_F="${opt_F}verbose system class: %[sc]\\n" 1091 opt_F="${opt_F}concise system product: %<sp>\\n" 1092 opt_F="${opt_F}regular system product: %{sp}\\n" 1093 opt_F="${opt_F}verbose system product: %[sp]\\n" 1094 opt_F="${opt_F}concise system technology: %<st>\\n" 1095 opt_F="${opt_F}regular system technology: %{st}\\n" 1096 opt_F="${opt_F}verbose system technology: %[st]" 1097 ;; 1098 * ) 1099 echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2 1100 exit 1 1101 ;; 1102 esac 1103 fi 1104 1105 # assemble initial platform information 1106 UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\ 1107 UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\ 1108 UNAME_MACHINE='unknown' 1109 UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\ 1110 UNAME_SYSTEM='unknown' 1111 UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\ 1112 UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\ 1113 UNAME_RELEASE='unknown' 1114 1115 UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}" 1116 1117 AC=""; AP=""; AT="" 1118 SC=""; SP=""; ST="" 1119 1120 # dispatch into platform specific sections 1121 case "${UNAME}" in 1122 1123 # FreeBSD 1124 *:FreeBSD:* ) 1125 # determine architecture 1126 AC="${UNAME_MACHINE}" 1127 case "${AC}" in 1128 i386 ) AC="iX86" ;; 1129 esac 1130 AP="${AC}" 1131 AT="${AP}" 1132 if [ ".${AT}" = ".iX86" ]; then 1133 case "`(/sbin/sysctl -n hw.model) 2>&1`" in 1134 *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;; 1135 *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;; 1136 *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;; 1137 esac 1138 fi 1139 # determine system 1140 r=`echo "${UNAME_RELEASE}" |\ 1141 sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'` 1142 ST="FreeBSD ${r}" 1143 SP="${ST}" 1144 case "${r}" in 1145 1.* ) SC="4.3BSD" ;; 1146 * ) SC="4.4BSD" ;; 1147 esac 1148 ;; 1149 1150 # NetBSD 1151 *:NetBSD:* ) 1152 # determine architecture 1153 AT="${UNAME_MACHINE}" 1154 AP="${AT}" 1155 case "${AP}" in 1156 i[3-6]86 ) AP="iX86" ;; 1157 esac 1158 AC="${AP}" 1159 # determine system 1160 r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` 1161 ST="NetBSD ${r}" 1162 SP="${ST}" 1163 case "${r}" in 1164 0.* ) SC="4.3BSD" ;; 1165 * ) SC="4.4BSD" ;; 1166 esac 1167 ;; 1168 1169 # OpenBSD 1170 *:OpenBSD:* ) 1171 # determine architecture 1172 AT="${UNAME_MACHINE}" 1173 AP="${AT}" 1174 case "${AP}" in 1175 i[3-6]86 ) AP="iX86" ;; 1176 esac 1177 AC="${AP}" 1178 # determine system 1179 r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` 1180 ST="OpenBSD ${r}" 1181 SP="${ST}" 1182 SC="4.4BSD" 1183 ;; 1184 1185 # DragonFly BSD 1186 *:DragonFly:* ) 1187 # determine architecture 1188 AT="${UNAME_MACHINE}" 1189 AP="${AT}" 1190 case "${AP}" in 1191 i[3-6]86 ) AP="iX86" ;; 1192 esac 1193 AC="${AP}" 1194 # determine system 1195 r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` 1196 ST="DragonFly ${r}" 1197 SP="${ST}" 1198 SC="4.4BSD" 1199 ;; 1200 1201 # GNU/Linux 1202 *:Linux:* ) 1203 # determine architecture 1204 AT="${UNAME_MACHINE}" 1205 case "${AT}" in 1206 ia64 ) AT="IA64" ;; 1207 x86_64 ) AT='AMD64' ;; 1208 parisc ) AT="HPPA32" ;; 1209 parisc64 ) AT="HPPA64" ;; 1210 esac 1211 AP="${AT}" 1212 case "${AP}" in 1213 i[3-6]86 ) AP='iX86' ;; 1214 esac 1215 AC="${AP}" 1216 # determine system 1217 v_kern=`echo "${UNAME_RELEASE}" |\ 1218 sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'` 1219 v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\ 1220 env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null` 1221 ST="GNU/<Linux >${v_libc}/<${v_kern}>" 1222 if [ -f /etc/lsb-release ]; then 1223 eval `( . /etc/lsb-release 1224 echo "SC=\"LSB${LSB_VERSION}\"" 1225 if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then 1226 echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\"" 1227 fi 1228 ) 2>/dev/null` 1229 fi 1230 if [ ".$SP" = . ]; then 1231 for tagfile in x \ 1232 `cd /etc && \ 1233 /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \ 1234 sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \ 1235 echo redhat-release lsb-release` 1236 do 1237 [ ".${tagfile}" = .x ] && continue 1238 [ ! -f "/etc/${tagfile}" ] && continue 1239 n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'` 1240 v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\ 1241 sed -e 's/^/#/' \ 1242 -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ 1243 -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ 1244 -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ 1245 -e 's/^#.*$//'` 1246 case "`util_lower ${n}`" in 1247 redhat ) 1248 if [ ".`egrep '(Red Hat Enterprise Linux|CentOS)' /etc/${tagfile}`" != . ]; then 1249 n="<R>ed <H>at <E>nterprise <L>inux" 1250 else 1251 n="<R>ed <H>at <L>inux" 1252 fi 1253 ;; 1254 debian ) n="Debian[ GNU/Linux]" ;; 1255 ubuntu ) n="Ubuntu[ GNU/Linux]" ;; 1256 fedora ) n="<Fedora> Core[ GNU/Linux]" ;; 1257 suse ) n="[Novell ]SUSE[ Linux]" ;; 1258 mandrake*|mandriva ) n="Mandriva[ Linux]" ;; 1259 gentoo ) n="Gentoo[ GNU/Linux]" ;; 1260 slackware ) n="Slackware[ Linux]" ;; 1261 turbolinux ) n="TurboLinux" ;; 1262 unitedlinux ) n="UnitedLinux" ;; 1263 * ) n="${n}[ GNU/Linux]" ;; 1264 esac 1265 case "$n" in 1266 *"<"*">"* ) SP="$n <$v>" ;; 1267 * ) SP="$n $v" ;; 1268 esac 1269 break 1270 done 1271 fi 1272 [ ".$SP" = . ] && SP="${ST}" 1273 [ ".$SC" = . ] && SC="LSB" 1274 ;; 1275 1276 # Sun Solaris 1277 *:SunOS:* ) 1278 # determine architecture 1279 AT="${UNAME_MACHINE}" 1280 case "${AT}" in 1281 i86pc ) 1282 AT="iX86" 1283 case "`(/bin/isainfo -k) 2>&1`" in 1284 amd64 ) AT="AMD64" ;; 1285 esac 1286 ;; 1287 esac 1288 AP="${AT}" 1289 case "${AP}" in 1290 sun4[cdm] ) AP="SPARC32" ;; 1291 sun4[uv] ) AP="SPARC64" ;; 1292 sun4* ) AP="SPARC" ;; 1293 esac 1294 AC="${AP}" 1295 case "${AC}" in 1296 SPARC* ) AC="SPARC" ;; 1297 esac 1298 # determine system 1299 ST="[Sun ]SunOS ${UNAME_RELEASE}" 1300 v=`echo "${UNAME_RELEASE}" |\ 1301 sed -e 's;^4\.;1.;' \ 1302 -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \ 1303 -e 's;^5\.\([0-9][0-9]*\).*;\1;'` 1304 SP="[Sun ]Solaris $v" 1305 case "${UNAME_RELEASE}" in 1306 4.* ) SC="4.3BSD" ;; 1307 5.* ) SC="SVR4" ;; 1308 esac 1309 ;; 1310 1311 # SCO UnixWare 1312 *:UnixWare:* ) 1313 # determine architecture 1314 AT="${UNAME_MACHINE}" 1315 case "${AT}" in 1316 i[3-6]86 | ix86at ) AT="iX86" ;; 1317 esac 1318 AP="${AT}" 1319 # determine system 1320 v=`/sbin/uname -v` 1321 ST="[SCO ]UnixWare ${v}" 1322 SP="${ST}" 1323 SC="SVR${UNAME_RELEASE}" 1324 ;; 1325 1326 # QNX 1327 *:QNX:* ) 1328 # determine architecture 1329 AT="${UNAME_MACHINE}" 1330 case "${AT}" in 1331 x86pc ) AT="iX86" ;; 1332 esac 1333 AP="${AT}" 1334 # determine system 1335 v="${UNAME_RELEASE}" 1336 ST="QNX[ Neutrino RTOS] ${v}" 1337 v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'` 1338 SP="QNX[ Neutrino RTOS] ${v}" 1339 SC="QNX" 1340 ;; 1341 1342 # SGI IRIX 1343 *:IRIX*:* ) 1344 # determine architecture 1345 AT="${UNAME_MACHINE}" 1346 AP="${AT}" 1347 case "${AP}:${UNAME_SYSTEM}" in 1348 IP*:IRIX64 ) AP="MIPS64" ;; 1349 IP*:* ) AP="MIPS" ;; 1350 esac 1351 AC="${AP}" 1352 # determine system 1353 v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'` 1354 ST="[SGI ]IRIX ${v}" 1355 v="${UNAME_RELEASE}" 1356 SP="[SGI ]IRIX ${v}" 1357 SC="4.2BSD/SVR3" 1358 ;; 1359 1360 # HP HP-UX 1361 *:HP-UX:* ) 1362 # determine architecture 1363 AT="${UNAME_MACHINE}" 1364 case "${AT}" in 1365 ia64 ) AT="IA64" ;; 1366 9000/[34]?? ) AT=M68K ;; 1367 9000/[678][0-9][0-9]) 1368 sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` 1369 sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` 1370 case "${sc_cpu_version}" in 1371 523 ) AT="HPPA1.0" ;; 1372 528 ) AT="HPPA1.1" ;; 1373 532 ) AT="HPPA2.0" 1374 case "${sc_kernel_bits}" in 1375 32 ) AT="${AT}n" ;; 1376 64 ) AT="${AT}w" ;; 1377 esac 1378 ;; 1379 esac 1380 ;; 1381 esac 1382 AP="${AT}" 1383 case "${AP}" in 1384 HPPA* ) AP="HPPA" ;; 1385 esac 1386 AC="${AP}" 1387 # determine system 1388 v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'` 1389 ST="[HP ]<HP>-<UX ${v}>" 1390 SP="${ST}" 1391 case "${v}" in 1392 10.* ) SC="SVR4.2" ;; 1393 [7-9]* ) SC="SVR4" ;; 1394 esac 1395 ;; 1396 1397 # HP Tru64 (OSF1) 1398 *:OSF1:* ) 1399 # determine architecture 1400 AP="${UNAME_MACHINE}" 1401 case "${AP}" in 1402 alpha ) AP="Alpha" ;; 1403 esac 1404 alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\ 1405 sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'` 1406 AT="${AP}${alpha_type}" 1407 AC="${AP}" 1408 # determine system 1409 v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'` 1410 ST="[HP ]Tru64 ${v}" 1411 SP="${ST}" 1412 SC="OSF1" 1413 ;; 1414 1415 # IBM AIX 1416 *:AIX:* ) 1417 # determine architecture 1418 cpu_arch=RS6000 1419 if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then 1420 cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` 1421 if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then 1422 cpu_arch=PPC 1423 fi 1424 elif [ -d /QOpenSys ]; then 1425 # IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment) 1426 cpu_arch=PPC 1427 fi 1428 if [ -x /usr/bin/oslevel ]; then 1429 os_level=`/usr/bin/oslevel` 1430 else 1431 os_level="`uname -v`.`uname -r`" 1432 fi 1433 os_level=`echo "${os_level}" |\ 1434 sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \ 1435 -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'` 1436 AT="${cpu_arch}" 1437 AP="${AT}" 1438 AC="${AP}" 1439 # determine system 1440 ST="[IBM ]<AIX >${os_level}" 1441 SP="${ST}" 1442 case "${os_level}" in 1443 [12]* ) SC="SVR2" ;; 1444 * ) SC="SVR4" ;; 1445 esac 1446 ;; 1447 1448 # Apple Mac OS X (Darwin) 1449 *:Darwin:* ) 1450 # determine architecture 1451 AT="`uname -p`" 1452 case "${AT}" in 1453 powerpc ) AT="PPC" ;; 1454 esac 1455 AP="${AT}" 1456 case "${AP}" in 1457 i?86 ) AP="iX86" ;; 1458 esac 1459 AC="${AP}" 1460 # determine system 1461 unset v1; unset v2; unset v3 1462 eval `echo "${UNAME_RELEASE}" |\ 1463 sed -e 's/^/#/' \ 1464 -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ 1465 -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ 1466 -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ 1467 -e 's/^#.*$/v1="0"/'` 1468 ST="[Apple ]<${UNAME_SYSTEM} ${v1}>${v2+.$v2}${v3+[.$v3]}" 1469 SP="$ST" 1470 v="`(sw_vers) 2>/dev/null | grep 'ProductVersion:' | sed -e 's/^ProductVersion:[^0-9]*\([0-9][0-9.]*\).*$/\1/'`" 1471 if [ ".$v" = . ]; then 1472 for name in System Server; do 1473 if [ -f /System/Library/CoreServices/${name}Version.plist ]; then 1474 v=`(defaults read "/System/Library/CoreServices/${name}Version" "ProductVersion") 2>/dev/null` 1475 [ ".$v" != . ] && break 1476 fi 1477 done 1478 fi 1479 if [ ".$v" != . ]; then 1480 unset v1; unset v2; unset v3 1481 eval `echo "${v}" |\ 1482 sed -e 's/^/#/' \ 1483 -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ 1484 -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ 1485 -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ 1486 -e 's/^#.*$/v1="0"/'` 1487 SP="[Apple ]Mac OS X ${v1}${v2+.$v2}${v3+[.$v3]}" 1488 fi 1489 SC="4.4BSD/Mach3.0" 1490 ;; 1491 1492 # Windows/Cygwin 1493 *:CYGWIN*:* ) 1494 # determine architecture 1495 AT="`uname -m`" 1496 AP="${AT}" 1497 case "${AP}" in 1498 i?86 ) AP="iX86" ;; 1499 esac 1500 AC="${AP}" 1501 # determine system 1502 unset v1; unset v2; unset v3 1503 eval `echo "${UNAME_RELEASE}" |\ 1504 sed -e 's/^/#/' \ 1505 -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ 1506 -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ 1507 -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ 1508 -e 's/^#.*$/v1="0"/'` 1509 ST="Cygwin ${v1}${v2+.$v2}${v3+[.$v3]}" 1510 SP="$ST" 1511 SC="Windows" 1512 v=`echo "${UNAME_SYSTEM}" | sed -e 's/^CYGWIN_NT-//' |\ 1513 sed -e 's/^/#/' -e 's/^#\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' -e 's/^#.*$//'` 1514 case "$v" in 1515 4.0 ) SC="$SC[ NT]" ;; 1516 5.0 ) SC="$SC[ 2000]" ;; 1517 5.1 ) SC="$SC[ XP]" ;; 1518 6.0 ) SC="$SC[ Vista]" ;; 1519 esac 1520 ;; 1521 1522 # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO 1523 # *:XXX:* ) 1524 # ... 1525 # ;; 1526 1527 # ...A STILL UNKNOWN PLATFORM... 1528 * ) 1529 AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"` 1530 AP="${AT}" 1531 AC="${AP}" 1532 v=`echo "${UNAME_RELEASE}" |\ 1533 sed -e 's/^/#/' \ 1534 -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ 1535 -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ 1536 -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ 1537 -e 's/^#.*$/?/'` 1538 ST="${UNAME_SYSTEM} ${v}" 1539 SP="${ST}" 1540 SC="${SP}" 1541 ;; 1542 1543 esac 1544 1545 # provide fallback values 1546 [ ".$AT" = . ] && AT="${AP:-${AC}}" 1547 [ ".$AP" = . ] && AP="${AT:-${AC}}" 1548 [ ".$AC" = . ] && AC="${AP:-${AT}}" 1549 [ ".$ST" = . ] && ST="${SP:-${SC}}" 1550 [ ".$SP" = . ] && SP="${ST:-${SC}}" 1551 [ ".$SC" = . ] && SC="${SP:-${ST}}" 1552 1553 # support explicit enforced verbose/concise output 1554 if [ ".$opt_v" = .yes ]; then 1555 opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'` 1556 elif [ ".$opt_c" = .yes ]; then 1557 opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'` 1558 fi 1559 1560 # provide verbose and concise variants 1561 AC_V=""; AC_N=""; AC_C="" 1562 AP_V=""; AP_N=""; AP_C="" 1563 AT_V=""; AT_N=""; AT_C="" 1564 SC_V=""; SC_N=""; SC_C="" 1565 SP_V=""; SP_N=""; SP_C="" 1566 ST_V=""; ST_N=""; ST_C="" 1567 for var_lc in at ap ac st sp sc; do 1568 case "$opt_F" in 1569 *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* ) 1570 var_uc=`util_upper "$var_lc"` 1571 eval "val=\"\$${var_uc}\"" 1572 val_V=""; val_N=""; val_C="" 1573 case "$opt_F" in 1574 *"%[${var_lc}]"* ) 1575 val_V=`echo ":$val" | \ 1576 sed -e 's/^://' \ 1577 -e 's;\[\([^]]*\)\];\1;g' \ 1578 -e 's;<\([^>]*\)>;\1;g' \ 1579 -e "s; ;��;g" \ 1580 -e "s;/;%%;g" \ 1581 -e "s;��;${opt_S};g" \ 1582 -e "s;%%;${opt_C};g"` 1583 eval "${var_uc}_V=\"\${val_V}\"" 1584 ;; 1585 esac 1586 case "$opt_F" in 1587 *"%{${var_lc}}"* | *"%${var_lc}"* ) 1588 val_N=`echo ":$val" | \ 1589 sed -e 's/^://' \ 1590 -e 's;\[\([^]]*\)\];;g' \ 1591 -e 's;<\([^>]*\)>;\1;g' \ 1592 -e "s; ;��;g" \ 1593 -e "s;/;%%;g" \ 1594 -e "s;��;${opt_S};g" \ 1595 -e "s;%%;${opt_C};g"` 1596 eval "${var_uc}_N=\"\${val_N}\"" 1597 ;; 1598 esac 1599 case "$opt_F" in 1600 *"%<${var_lc}>"* ) 1601 val_C=`echo ":$val" | \ 1602 sed -e 's/^://' \ 1603 -e 's;\[\([^]]*\)\];;g' \ 1604 -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \ 1605 -e "s; ;��;g" \ 1606 -e "s;/;%%;g" \ 1607 -e "s;��;${opt_S};g" \ 1608 -e "s;%%;${opt_C};g"` 1609 eval "${var_uc}_C=\"\${val_C}\"" 1610 ;; 1611 esac 1612 ;; 1613 esac 1614 done 1615 1616 # create output string 1617 output=`echo ":$opt_F" |\ 1618 sed -e "s/^://" \ 1619 -e "s;%\\[ac\\];${AC_V};g" \ 1620 -e "s;%{ac};${AC_N};g" \ 1621 -e "s;%ac;${AC_N};g" \ 1622 -e "s;%<ac>;${AC_C};g" \ 1623 -e "s;%\\[ap\\];${AP_V};g" \ 1624 -e "s;%{ap};${AP_N};g" \ 1625 -e "s;%ap;${AP_N};g" \ 1626 -e "s;%<ap>;${AP_C};g" \ 1627 -e "s;%\\[at\\];${AT_V};g" \ 1628 -e "s;%{at};${AT_N};g" \ 1629 -e "s;%at;${AT_N};g" \ 1630 -e "s;%<at>;${AT_C};g" \ 1631 -e "s;%\\[sc\\];${SC_V};g" \ 1632 -e "s;%{sc};${SC_N};g" \ 1633 -e "s;%sc;${SC_N};g" \ 1634 -e "s;%<sc>;${SC_C};g" \ 1635 -e "s;%\\[sp\\];${SP_V};g" \ 1636 -e "s;%{sp};${SP_N};g" \ 1637 -e "s;%sp;${SP_N};g" \ 1638 -e "s;%<sp>;${SP_C};g" \ 1639 -e "s;%\\[st\\];${ST_V};g" \ 1640 -e "s;%{st};${ST_N};g" \ 1641 -e "s;%st;${ST_N};g" \ 1642 -e "s;%<st>;${ST_C};g" \ 1643 -e 's/\\\\n/^/g' |\ 1644 tr '^' '\012'` 1645 1646 # support lower/upper-case mapping 1647 if [ ".$opt_L" = .yes ]; then 1648 output=`util_lower "$output"` 1649 elif [ ".$opt_U" = .yes ]; then 1650 output=`util_upper "$output"` 1651 fi 1652 1653 # display output string 1654 if [ ".$opt_n" = .yes ]; then 1655 echo . | awk '{ printf("%s", output); }' output="$output" 1656 else 1657 echo "$output" 1658 fi 1659 1660 shtool_exit 0 1661 ;; 1662 1663path ) 1664 ## 1665 ## path -- Deal with program paths 1666 ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> 1667 ## 1668 1669 namelist="$*" 1670 1671 # check whether the test command supports the -x option 1672 if [ -x /bin/sh ] 2>/dev/null; then 1673 minusx="-x" 1674 else 1675 minusx="-r" 1676 fi 1677 1678 # split path string 1679 paths="`echo $opt_p |\ 1680 sed -e 's/^:/.:/' \ 1681 -e 's/::/:.:/g' \ 1682 -e 's/:$/:./' \ 1683 -e 's/:/ /g'`" 1684 1685 # SPECIAL REQUEST 1686 # translate forward to reverse path 1687 if [ ".$opt_r" = .yes ]; then 1688 if [ "x$namelist" = "x." ]; then 1689 rp='.' 1690 else 1691 rp='' 1692 for pe in `IFS="$IFS/"; echo $namelist`; do 1693 rp="../$rp" 1694 done 1695 fi 1696 echo $rp | sed -e 's:/$::' 1697 shtool_exit 0 1698 fi 1699 1700 # SPECIAL REQUEST 1701 # strip out directory or base name 1702 if [ ".$opt_d" = .yes ]; then 1703 echo "$namelist" |\ 1704 sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' 1705 shtool_exit 0 1706 fi 1707 if [ ".$opt_b" = .yes ]; then 1708 echo "$namelist" |\ 1709 sed -e 's;.*/\([^/]*\)$;\1;' 1710 shtool_exit 0 1711 fi 1712 1713 # MAGIC SITUATION 1714 # Perl Interpreter (perl) 1715 if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then 1716 rm -f $tmpfile >/dev/null 2>&1 1717 touch $tmpfile 1718 found=0 1719 pc=99 1720 for dir in $paths; do 1721 dir=`echo $dir | sed -e 's;/*$;;'` 1722 nc=99 1723 for name in perl perl5 miniperl; do 1724 if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then 1725 perl="$dir/$name" 1726 pv=`$perl -e 'printf("%.3f", $]);'` 1727 echo "$pv:$pc:$nc:$perl" >>$tmpfile 1728 found=1 1729 fi 1730 nc=`expr $nc - 1` 1731 done 1732 pc=`expr $pc - 1` 1733 done 1734 if [ $found = 1 ]; then 1735 perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`" 1736 rm -f $tmpfile >/dev/null 2>&1 1737 echo "$perl" 1738 shtool_exit 0 1739 fi 1740 rm -f $tmpfile >/dev/null 2>&1 1741 shtool_exit 1 1742 fi 1743 1744 # MAGIC SITUATION 1745 # C pre-processor (cpp) 1746 if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then 1747 echo >$tmpfile.c "#include <assert.h>" 1748 echo >>$tmpfile.c "Syntax Error" 1749 # 1. try the standard cc -E approach 1750 cpp="${CC-cc} -E" 1751 (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out 1752 my_error=`grep -v '^ *+' $tmpfile.out` 1753 if [ ".$my_error" != . ]; then 1754 # 2. try the cc -E approach and GCC's -traditional-ccp option 1755 cpp="${CC-cc} -E -traditional-cpp" 1756 (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out 1757 my_error=`grep -v '^ *+' $tmpfile.out` 1758 if [ ".$my_error" != . ]; then 1759 # 3. try a standalone cpp command in path and lib dirs 1760 for path in $paths /lib /usr/lib /usr/local/lib; do 1761 path=`echo $path | sed -e 's;/*$;;'` 1762 if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then 1763 cpp="$path/cpp" 1764 break 1765 fi 1766 done 1767 if [ ".$cpp" != . ]; then 1768 (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out 1769 my_error=`grep -v '^ *+' $tmpfile.out` 1770 if [ ".$my_error" != . ]; then 1771 # ok, we gave up... 1772 cpp='' 1773 fi 1774 fi 1775 fi 1776 fi 1777 rm -f $tmpfile >/dev/null 2>&1 1778 rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1 1779 if [ ".$cpp" != . ]; then 1780 echo "$cpp" 1781 shtool_exit 0 1782 fi 1783 shtool_exit 1 1784 fi 1785 1786 # STANDARD SITUATION 1787 # iterate over names 1788 for name in $namelist; do 1789 # iterate over paths 1790 for path in $paths; do 1791 path=`echo $path | sed -e 's;/*$;;'` 1792 if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then 1793 if [ ".$opt_s" != .yes ]; then 1794 echo "$path/$name" 1795 fi 1796 shtool_exit 0 1797 fi 1798 done 1799 done 1800 1801 shtool_exit 1 1802 ;; 1803 1804esac 1805 1806shtool_exit 0 1807 1808