| 1 |
#!/bin/sh |
| 2 |
## |
| 3 |
## GNU shtool -- The GNU Portable Shell Tool |
| 4 |
## Copyright (c) 1994-2001 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: 1.5.2 (27-Feb-2001) |
| 10 |
## Contents: 3/17 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 |
## install Install a program, script or datafile |
| 42 |
## mkdir Make one or more directories |
| 43 |
## mkshadow Make a shadow tree through symbolic links |
| 44 |
## |
| 45 |
## Not available commands (because module was not built-in): |
| 46 |
## echo Print string with optional construct expansion |
| 47 |
## mdate Pretty-print modification time of a file or dir |
| 48 |
## table Pretty-print a field-separated list as a table |
| 49 |
## prop Display progress with a running propeller |
| 50 |
## move Move files with simultaneous substitution |
| 51 |
## mkln Make link with calculation of relative paths |
| 52 |
## fixperm Fix file permissions inside a source tree |
| 53 |
## tarball Roll distribution tarballs |
| 54 |
## guessos Simple operating system guesser |
| 55 |
## arx Extended archive command |
| 56 |
## slo Separate linker options by library class |
| 57 |
## scpp Sharing C Pre-Processor |
| 58 |
## version Maintain a version information file |
| 59 |
## path Deal with program paths |
| 60 |
## |
| 61 |
|
| 62 |
if [ $# -eq 0 ]; then |
| 63 |
echo "$0:Error: invalid command line" 1>&2 |
| 64 |
echo "$0:Hint: run \`$0 -h' for usage" 1>&2 |
| 65 |
exit 1 |
| 66 |
fi |
| 67 |
if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then |
| 68 |
echo "This is GNU shtool, version 1.5.2 (27-Feb-2001)" |
| 69 |
echo "Copyright (c) 1994-2001 Ralf S. Engelschall <rse@engelschall.com>" |
| 70 |
echo "Report bugs to <bug-shtool@gnu.org>" |
| 71 |
echo '' |
| 72 |
echo "Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]" |
| 73 |
echo '' |
| 74 |
echo 'Available global <options>:' |
| 75 |
echo ' -v, --version display shtool version information' |
| 76 |
echo ' -h, --help display shtool usage help page (this one)' |
| 77 |
echo ' -d, --debug display shell trace information' |
| 78 |
echo ' -r, --recreate recreate this shtool script via shtoolize' |
| 79 |
echo '' |
| 80 |
echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:' |
| 81 |
echo ' install [-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>]' |
| 82 |
echo ' [-e<sed-cmd>] <file> [<file> ...] <path>' |
| 83 |
echo ' mkdir [-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]' |
| 84 |
echo ' mkshadow [-v] [-t] [-a] <src-dir> <dst-dir>' |
| 85 |
echo '' |
| 86 |
echo 'Not available <cmd-name> (because module was not built-in):' |
| 87 |
echo ' echo [-n] [-e] [<str> ...]' |
| 88 |
echo ' mdate [-n] [-z] [-s] [-d] [-f<str>] [-o<spec>] <path>' |
| 89 |
echo ' table [-F<sep>] [-w<width>] [-c<cols>] [-s<strip>] <str><sep><str>...' |
| 90 |
echo ' prop [-p<str>]' |
| 91 |
echo ' move [-v] [-t] [-e] [-p] <src-file> <dst-file>' |
| 92 |
echo ' mkln [-t] [-f] [-s] <src-path> [<src-path> ...] <dst-path>' |
| 93 |
echo ' fixperm [-v] [-t] <path> [<path> ...]' |
| 94 |
echo ' tarball [-t] [-v] [-o <tarball>] [-c <prog>] [-d <dir>] [-u' |
| 95 |
echo ' <user>] [-g <group>] [-e <pattern>] <path> [<path> ...]' |
| 96 |
echo ' guessos ' |
| 97 |
echo ' arx [-t] [-C<cmd>] <op> <archive> [<file> ...]' |
| 98 |
echo ' slo [-p<str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]' |
| 99 |
echo ' scpp [-v] [-p] [-f<filter>] [-o<ofile>] [-t<tfile>] [-M<mark>]' |
| 100 |
echo ' [-D<dname>] [-C<cname>] <file> [<file> ...]' |
| 101 |
echo ' version [-l<lang>] [-n<name>] [-p<prefix>] [-s<version>] [-e]' |
| 102 |
echo ' [-i<knob>] [-d<type>] <file>' |
| 103 |
echo ' path [-s] [-r] [-d] [-b] [-m] [-p<path>] <str> [<str> ...]' |
| 104 |
echo '' |
| 105 |
exit 0 |
| 106 |
fi |
| 107 |
if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then |
| 108 |
echo "GNU shtool 1.5.2 (27-Feb-2001)" |
| 109 |
exit 0 |
| 110 |
fi |
| 111 |
if [ ".$1" = ".-r" -o ".$1" = ."--recreate" ]; then |
| 112 |
shtoolize -oshtool install mkdir mkshadow |
| 113 |
exit 0 |
| 114 |
fi |
| 115 |
if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then |
| 116 |
shift |
| 117 |
set -x |
| 118 |
fi |
| 119 |
name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` |
| 120 |
case "$name" in |
| 121 |
install|mkdir|mkshadow ) |
| 122 |
# implicit tool command selection |
| 123 |
tool="$name" |
| 124 |
;; |
| 125 |
* ) |
| 126 |
# explicit tool command selection |
| 127 |
tool="$1" |
| 128 |
shift |
| 129 |
;; |
| 130 |
esac |
| 131 |
arg_spec="" |
| 132 |
opt_spec="" |
| 133 |
gen_tmpfile=no |
| 134 |
|
| 135 |
## |
| 136 |
## DISPATCH INTO SCRIPT PROLOG |
| 137 |
## |
| 138 |
|
| 139 |
case $tool in |
| 140 |
install ) |
| 141 |
str_tool="install" |
| 142 |
str_usage="[-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>] [-e<sed-cmd>] <file> [<file> ...] <path>" |
| 143 |
arg_spec="2+" |
| 144 |
opt_spec="v.t.c.C.s.m:o:g:e+" |
| 145 |
opt_v=no |
| 146 |
opt_t=no |
| 147 |
opt_c=no |
| 148 |
opt_C=no |
| 149 |
opt_s=no |
| 150 |
opt_m="0755" |
| 151 |
opt_o="" |
| 152 |
opt_g="" |
| 153 |
opt_e="" |
| 154 |
;; |
| 155 |
mkdir ) |
| 156 |
str_tool="mkdir" |
| 157 |
str_usage="[-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]" |
| 158 |
arg_spec="1+" |
| 159 |
opt_spec="t.f.p.m:" |
| 160 |
opt_t=no |
| 161 |
opt_f=no |
| 162 |
opt_p=no |
| 163 |
opt_m="" |
| 164 |
;; |
| 165 |
mkshadow ) |
| 166 |
str_tool="mkshadow" |
| 167 |
str_usage="[-v] [-t] [-a] <src-dir> <dst-dir>" |
| 168 |
arg_spec="2=" |
| 169 |
opt_spec="v.t.a." |
| 170 |
opt_v=no |
| 171 |
opt_t=no |
| 172 |
opt_a=no |
| 173 |
;; |
| 174 |
-* ) |
| 175 |
echo "$0:Error: unknown option \`$tool'" 2>&1 |
| 176 |
echo "$0:Hint: run \`$0 -h' for usage" 2>&1 |
| 177 |
exit 1 |
| 178 |
;; |
| 179 |
* ) |
| 180 |
echo "$0:Error: unknown command \`$tool'" 2>&1 |
| 181 |
echo "$0:Hint: run \`$0 -h' for usage" 2>&1 |
| 182 |
exit 1 |
| 183 |
;; |
| 184 |
esac |
| 185 |
|
| 186 |
## |
| 187 |
## COMMON UTILITY CODE |
| 188 |
## |
| 189 |
|
| 190 |
# determine name of tool |
| 191 |
if [ ".$tool" != . ]; then |
| 192 |
# used inside shtool script |
| 193 |
toolcmd="$0 $tool" |
| 194 |
toolcmdhelp="shtool $tool" |
| 195 |
msgprefix="shtool:$tool" |
| 196 |
else |
| 197 |
# used as standalone script |
| 198 |
toolcmd="$0" |
| 199 |
toolcmdhelp="sh $0" |
| 200 |
msgprefix="$str_tool" |
| 201 |
fi |
| 202 |
|
| 203 |
# parse argument specification string |
| 204 |
eval `echo $arg_spec |\ |
| 205 |
sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` |
| 206 |
|
| 207 |
# parse option specification string |
| 208 |
eval `echo h.$opt_spec |\ |
| 209 |
sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` |
| 210 |
|
| 211 |
# interate over argument line |
| 212 |
opt_PREV='' |
| 213 |
while [ $# -gt 0 ]; do |
| 214 |
# special option stops processing |
| 215 |
if [ ".$1" = ".--" ]; then |
| 216 |
shift |
| 217 |
break |
| 218 |
fi |
| 219 |
|
| 220 |
# determine option and argument |
| 221 |
opt_ARG_OK=no |
| 222 |
if [ ".$opt_PREV" != . ]; then |
| 223 |
# merge previous seen option with argument |
| 224 |
opt_OPT="$opt_PREV" |
| 225 |
opt_ARG="$1" |
| 226 |
opt_ARG_OK=yes |
| 227 |
opt_PREV='' |
| 228 |
else |
| 229 |
# split argument into option and argument |
| 230 |
case "$1" in |
| 231 |
-[a-zA-Z0-9]*) |
| 232 |
eval `echo "x$1" |\ |
| 233 |
sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ |
| 234 |
-e 's/";\(.*\)$/"; opt_ARG="\1"/'` |
| 235 |
;; |
| 236 |
-[a-zA-Z0-9]) |
| 237 |
opt_OPT=`echo "x$1" | cut -c3-` |
| 238 |
opt_ARG='' |
| 239 |
;; |
| 240 |
*) |
| 241 |
break |
| 242 |
;; |
| 243 |
esac |
| 244 |
fi |
| 245 |
|
| 246 |
# eat up option |
| 247 |
shift |
| 248 |
|
| 249 |
# determine whether option needs an argument |
| 250 |
eval "opt_MODE=\$opt_MODE_${opt_OPT}" |
| 251 |
if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then |
| 252 |
if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then |
| 253 |
opt_PREV="$opt_OPT" |
| 254 |
continue |
| 255 |
fi |
| 256 |
fi |
| 257 |
|
| 258 |
# process option |
| 259 |
case $opt_MODE in |
| 260 |
'.' ) |
| 261 |
# boolean option |
| 262 |
eval "opt_${opt_OPT}=yes" |
| 263 |
;; |
| 264 |
':' ) |
| 265 |
# option with argument (multiple occurances override) |
| 266 |
eval "opt_${opt_OPT}=\"\$opt_ARG\"" |
| 267 |
;; |
| 268 |
'+' ) |
| 269 |
# option with argument (multiple occurances append) |
| 270 |
eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" |
| 271 |
;; |
| 272 |
* ) |
| 273 |
echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2 |
| 274 |
echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 |
| 275 |
exit 1 |
| 276 |
;; |
| 277 |
esac |
| 278 |
done |
| 279 |
if [ ".$opt_PREV" != . ]; then |
| 280 |
echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2 |
| 281 |
echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 |
| 282 |
exit 1 |
| 283 |
fi |
| 284 |
|
| 285 |
# process help option |
| 286 |
if [ ".$opt_h" = .yes ]; then |
| 287 |
echo "Usage: $toolcmdhelp $str_usage" |
| 288 |
exit 0 |
| 289 |
fi |
| 290 |
|
| 291 |
# complain about incorrect number of arguments |
| 292 |
case $arg_MODE in |
| 293 |
'=' ) |
| 294 |
if [ $# -ne $arg_NUMS ]; then |
| 295 |
echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 |
| 296 |
echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 |
| 297 |
exit 1 |
| 298 |
fi |
| 299 |
;; |
| 300 |
'+' ) |
| 301 |
if [ $# -lt $arg_NUMS ]; then |
| 302 |
echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 |
| 303 |
echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 |
| 304 |
exit 1 |
| 305 |
fi |
| 306 |
;; |
| 307 |
esac |
| 308 |
|
| 309 |
# establish a temporary file on request |
| 310 |
if [ ".$gen_tmpfile" = .yes ]; then |
| 311 |
if [ ".$TMPDIR" != . ]; then |
| 312 |
tmpdir="$TMPDIR" |
| 313 |
elif [ ".$TEMPDIR" != . ]; then |
| 314 |
tmpdir="$TEMPDIR" |
| 315 |
else |
| 316 |
tmpdir="/tmp" |
| 317 |
fi |
| 318 |
tmpfile="$tmpdir/.shtool.$$" |
| 319 |
rm -f $tmpfile >/dev/null 2>&1 |
| 320 |
touch $tmpfile |
| 321 |
chmod 600 $tmpfile |
| 322 |
fi |
| 323 |
|
| 324 |
## |
| 325 |
## DISPATCH INTO SCRIPT BODY |
| 326 |
## |
| 327 |
|
| 328 |
case $tool in |
| 329 |
|
| 330 |
install ) |
| 331 |
## |
| 332 |
## install -- Install a program, script or datafile |
| 333 |
## Copyright (c) 1997-2001 Ralf S. Engelschall <rse@engelschall.com> |
| 334 |
## Originally written for shtool |
| 335 |
## |
| 336 |
|
| 337 |
# determine source(s) and destination |
| 338 |
argc=$# |
| 339 |
srcs="" |
| 340 |
while [ $# -gt 1 ]; do |
| 341 |
srcs="$srcs $1" |
| 342 |
shift |
| 343 |
done |
| 344 |
dstpath="$1" |
| 345 |
|
| 346 |
# type check for destination |
| 347 |
dstisdir=0 |
| 348 |
if [ -d $dstpath ]; then |
| 349 |
dstpath=`echo "$dstpath" | sed -e 's:/$::'` |
| 350 |
dstisdir=1 |
| 351 |
fi |
| 352 |
|
| 353 |
# consistency check for destination |
| 354 |
if [ $argc -gt 2 -a $dstisdir = 0 ]; then |
| 355 |
echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 |
| 356 |
exit 1 |
| 357 |
fi |
| 358 |
|
| 359 |
# iterate over all source(s) |
| 360 |
for src in $srcs; do |
| 361 |
dst=$dstpath |
| 362 |
|
| 363 |
# if destination is a directory, append the input filename |
| 364 |
if [ $dstisdir = 1 ]; then |
| 365 |
dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` |
| 366 |
dst="$dst/$dstfile" |
| 367 |
fi |
| 368 |
|
| 369 |
# check for correct arguments |
| 370 |
if [ ".$src" = ".$dst" ]; then |
| 371 |
echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 |
| 372 |
continue |
| 373 |
fi |
| 374 |
if [ -d "$src" ]; then |
| 375 |
echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 |
| 376 |
continue |
| 377 |
fi |
| 378 |
|
| 379 |
# make a temp file name in the destination directory |
| 380 |
dsttmp=`echo $dst |\ |
| 381 |
sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ |
| 382 |
-e "s;\$;/#INST@$$#;"` |
| 383 |
|
| 384 |
# verbosity |
| 385 |
if [ ".$opt_v" = .yes ]; then |
| 386 |
echo "$src -> $dst" 1>&2 |
| 387 |
fi |
| 388 |
|
| 389 |
# copy or move the file name to the temp name |
| 390 |
# (because we might be not allowed to change the source) |
| 391 |
if [ ".$opt_C" = .yes ]; then |
| 392 |
opt_c=yes |
| 393 |
fi |
| 394 |
if [ ".$opt_c" = .yes ]; then |
| 395 |
if [ ".$opt_t" = .yes ]; then |
| 396 |
echo "cp $src $dsttmp" 1>&2 |
| 397 |
fi |
| 398 |
cp $src $dsttmp || exit $? |
| 399 |
else |
| 400 |
if [ ".$opt_t" = .yes ]; then |
| 401 |
echo "mv $src $dsttmp" 1>&2 |
| 402 |
fi |
| 403 |
mv $src $dsttmp || exit $? |
| 404 |
fi |
| 405 |
|
| 406 |
# adjust the target file |
| 407 |
if [ ".$opt_e" != . ]; then |
| 408 |
sed='sed' |
| 409 |
for e in $opt_e; do |
| 410 |
sed="$sed -e '$e'" |
| 411 |
done |
| 412 |
cp $dsttmp $dsttmp.old |
| 413 |
eval "$sed <$dsttmp.old >$dsttmp" || exit $? |
| 414 |
rm -f $dsttmp.old |
| 415 |
fi |
| 416 |
if [ ".$opt_s" = .yes ]; then |
| 417 |
if [ ".$opt_t" = .yes ]; then |
| 418 |
echo "strip $dsttmp" 1>&2 |
| 419 |
fi |
| 420 |
strip $dsttmp || exit $? |
| 421 |
fi |
| 422 |
if [ ".$opt_o" != . ]; then |
| 423 |
if [ ".$opt_t" = .yes ]; then |
| 424 |
echo "chown $opt_o $dsttmp" 1>&2 |
| 425 |
fi |
| 426 |
chown $opt_o $dsttmp || exit $? |
| 427 |
fi |
| 428 |
if [ ".$opt_g" != . ]; then |
| 429 |
if [ ".$opt_t" = .yes ]; then |
| 430 |
echo "chgrp $opt_g $dsttmp" 1>&2 |
| 431 |
fi |
| 432 |
chgrp $opt_g $dsttmp || exit $? |
| 433 |
fi |
| 434 |
if [ ".$opt_m" != ".-" ]; then |
| 435 |
if [ ".$opt_t" = .yes ]; then |
| 436 |
echo "chmod $opt_m $dsttmp" 1>&2 |
| 437 |
fi |
| 438 |
chmod $opt_m $dsttmp || exit $? |
| 439 |
fi |
| 440 |
|
| 441 |
# determine whether to do a quick install |
| 442 |
# (has to be done _after_ the strip was already done) |
| 443 |
quick=no |
| 444 |
if [ ".$opt_C" = .yes ]; then |
| 445 |
if [ -r $dst ]; then |
| 446 |
if cmp -s $src $dst; then |
| 447 |
quick=yes |
| 448 |
fi |
| 449 |
fi |
| 450 |
fi |
| 451 |
|
| 452 |
# finally, install the file to the real destination |
| 453 |
if [ $quick = yes ]; then |
| 454 |
if [ ".$opt_t" = .yes ]; then |
| 455 |
echo "rm -f $dsttmp" 1>&2 |
| 456 |
fi |
| 457 |
rm -f $dsttmp |
| 458 |
else |
| 459 |
if [ ".$opt_t" = .yes ]; then |
| 460 |
echo "rm -f $dst && mv $dsttmp $dst" 1>&2 |
| 461 |
fi |
| 462 |
rm -f $dst && mv $dsttmp $dst |
| 463 |
fi |
| 464 |
done |
| 465 |
;; |
| 466 |
|
| 467 |
mkdir ) |
| 468 |
## |
| 469 |
## mkdir -- Make one or more directories |
| 470 |
## Copyright (c) 1996-2001 Ralf S. Engelschall <rse@engelschall.com> |
| 471 |
## Originally written for public domain by Noah Friedman <friedman@prep.ai.mit.edu> |
| 472 |
## Cleaned up and enhanced for shtool |
| 473 |
## |
| 474 |
|
| 475 |
errstatus=0 |
| 476 |
for p in ${1+"$@"}; do |
| 477 |
# if the directory already exists... |
| 478 |
if [ -d "$p" ]; then |
| 479 |
if [ ".$opt_f" = .no -a ".$opt_p" = .no ]; then |
| 480 |
echo "$msgprefix:Error: directory already exists: $p" 1>&2 |
| 481 |
errstatus=1 |
| 482 |
break |
| 483 |
else |
| 484 |
continue |
| 485 |
fi |
| 486 |
fi |
| 487 |
# if the directory has to be created... |
| 488 |
if [ ".$opt_p" = .no ]; then |
| 489 |
if [ ".$opt_t" = .yes ]; then |
| 490 |
echo "mkdir $p" 1>&2 |
| 491 |
fi |
| 492 |
mkdir $p || errstatus=$? |
| 493 |
else |
| 494 |
# the smart situation |
| 495 |
set fnord `echo ":$p" |\ |
| 496 |
sed -e 's/^:\//%/' \ |
| 497 |
-e 's/^://' \ |
| 498 |
-e 's/\// /g' \ |
| 499 |
-e 's/^%/\//'` |
| 500 |
shift |
| 501 |
pathcomp='' |
| 502 |
for d in ${1+"$@"}; do |
| 503 |
pathcomp="$pathcomp$d" |
| 504 |
case "$pathcomp" in |
| 505 |
-* ) pathcomp="./$pathcomp" ;; |
| 506 |
esac |
| 507 |
if [ ! -d "$pathcomp" ]; then |
| 508 |
if [ ".$opt_t" = .yes ]; then |
| 509 |
echo "mkdir $pathcomp" 1>&2 |
| 510 |
fi |
| 511 |
mkdir $pathcomp || errstatus=$? |
| 512 |
if [ ".$opt_m" != . ]; then |
| 513 |
if [ ".$opt_t" = .yes ]; then |
| 514 |
echo "chmod $opt_m $pathcomp" 1>&2 |
| 515 |
fi |
| 516 |
chmod $opt_m $pathcomp || errstatus=$? |
| 517 |
fi |
| 518 |
fi |
| 519 |
pathcomp="$pathcomp/" |
| 520 |
done |
| 521 |
fi |
| 522 |
done |
| 523 |
exit $errstatus |
| 524 |
;; |
| 525 |
|
| 526 |
mkshadow ) |
| 527 |
## |
| 528 |
## mkshadow -- Make a shadow tree through symbolic links |
| 529 |
## Copyright (c) 1998-2001 Ralf S. Engelschall <rse@engelschall.com> |
| 530 |
## Originally written for Apache |
| 531 |
## |
| 532 |
|
| 533 |
# source and destination directory |
| 534 |
src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` |
| 535 |
dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` |
| 536 |
|
| 537 |
# check whether source exists |
| 538 |
if [ ! -d $src ]; then |
| 539 |
echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2 |
| 540 |
exit 1 |
| 541 |
fi |
| 542 |
|
| 543 |
# determine if one of the paths is an absolute path, |
| 544 |
# because then we have to use an absolute symlink |
| 545 |
oneisabs=0 |
| 546 |
case $src in |
| 547 |
/* ) oneisabs=1 ;; |
| 548 |
esac |
| 549 |
case $dst in |
| 550 |
/* ) oneisabs=1 ;; |
| 551 |
esac |
| 552 |
|
| 553 |
# determine reverse directory for destination directory |
| 554 |
dstrevdir='' |
| 555 |
if [ $oneisabs = 0 ]; then |
| 556 |
# derive reverse path from forward path |
| 557 |
pwd=`pwd` |
| 558 |
OIFS="$IFS"; IFS='/' |
| 559 |
for pe in $dst; do |
| 560 |
if [ "x$pe" = "x.." ]; then |
| 561 |
OIFS2="$IFS"; IFS="$DIFS" |
| 562 |
eval `echo "$pwd" |\ |
| 563 |
sed -e 's:\([^/]*\)$:; dir="\1":' \ |
| 564 |
-e 's:^\(.*\)/[^/]*;:pwd="\1";:'\ |
| 565 |
-e 's:^;:pwd="";:'` |
| 566 |
dstrevdir="$dir/$dstrevdir" |
| 567 |
IFS="$OIFS2" |
| 568 |
else |
| 569 |
dstrevdir="../$dstrevdir" |
| 570 |
fi |
| 571 |
done |
| 572 |
IFS="$OIFS" |
| 573 |
else |
| 574 |
src="`cd $src; pwd`"; |
| 575 |
fi |
| 576 |
|
| 577 |
# create directory tree at destination |
| 578 |
if [ ! -d $dst ]; then |
| 579 |
if [ ".$opt_t" = .yes ]; then |
| 580 |
echo "mkdir $dst" 1>&2 |
| 581 |
fi |
| 582 |
mkdir $dst |
| 583 |
fi |
| 584 |
if [ ".$opt_a" = .yes ]; then |
| 585 |
DIRS=`cd $src; find . -type d -print |\ |
| 586 |
sed -e '/^\.$/d' -e 's:^\./::'` |
| 587 |
else |
| 588 |
DIRS=`cd $src; find . -type d -print |\ |
| 589 |
sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'` |
| 590 |
fi |
| 591 |
for dir in $DIRS; do |
| 592 |
if [ ".$opt_t" = .yes ]; then |
| 593 |
echo "mkdir $dst/$dir" 1>&2 |
| 594 |
fi |
| 595 |
mkdir $dst/$dir |
| 596 |
done |
| 597 |
|
| 598 |
# fill directory tree with symlinks to files |
| 599 |
if [ ".$opt_a" = .yes ]; then |
| 600 |
FILES="`cd $src; find . -depth -print |\ |
| 601 |
sed -e 's/^\.\///'`" |
| 602 |
else |
| 603 |
FILES="`cd $src; find . -depth -print |\ |
| 604 |
sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \ |
| 605 |
-e '/\.cvsignore$/d' -e '/\/CVS/d' \ |
| 606 |
-e '/\/\.#/d' -e '/\.orig$/d' \ |
| 607 |
-e 's/^\.\///'`" |
| 608 |
fi |
| 609 |
for file in $FILES; do |
| 610 |
# don't use `-type f' above for find because of symlinks |
| 611 |
if [ -d "$src/$file" ]; then |
| 612 |
continue |
| 613 |
fi |
| 614 |
basename=`echo $file | sed -e 's:^.*/::'` |
| 615 |
dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'` |
| 616 |
from=`echo "$src/$file" | sed -e 's/^\.\///'` |
| 617 |
to="$dst/$dir$basename" |
| 618 |
if [ $oneisabs = 0 ]; then |
| 619 |
if [ ".$dir" != . ]; then |
| 620 |
subdir=`echo $dir | sed -e 's:/$::'` |
| 621 |
# derive reverse path from forward path |
| 622 |
revdir='' |
| 623 |
OIFS="$IFS"; IFS='/' |
| 624 |
for pe in $subdir; do |
| 625 |
revdir="../$revdir" |
| 626 |
done |
| 627 |
IFS="$OIFS" |
| 628 |
# finalize from |
| 629 |
from="$revdir$from" |
| 630 |
fi |
| 631 |
from="$dstrevdir$from" |
| 632 |
fi |
| 633 |
if [ ".$opt_v" = .yes ]; then |
| 634 |
echo " $to" 1>&2 |
| 635 |
fi |
| 636 |
if [ ".$opt_t" = .yes ]; then |
| 637 |
echo "ln -s $from $to" 1>&2 |
| 638 |
fi |
| 639 |
ln -s $from $to |
| 640 |
done |
| 641 |
;; |
| 642 |
|
| 643 |
esac |
| 644 |
|
| 645 |
exit 0 |
| 646 |
|
| 647 |
##EOF## |