Mon, 28 Jan 2013 17:37:18 +0100
Correct socket error reporting improvement with IPv6 portable code,
after helpful recommendation by Saúl Ibarra Corretgé on OSips devlist.
michael@13 | 1 | #!/bin/sh |
michael@13 | 2 | ## |
michael@13 | 3 | ## GNU shtool -- The GNU Portable Shell Tool |
michael@428 | 4 | ## Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 5 | ## |
michael@13 | 6 | ## See http://www.gnu.org/software/shtool/ for more information. |
michael@13 | 7 | ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. |
michael@13 | 8 | ## |
michael@428 | 9 | ## Version: 2.0.8 (18-Jul-2008) |
michael@13 | 10 | ## Contents: all available modules |
michael@13 | 11 | ## |
michael@13 | 12 | |
michael@13 | 13 | ## |
michael@13 | 14 | ## This program is free software; you can redistribute it and/or modify |
michael@13 | 15 | ## it under the terms of the GNU General Public License as published by |
michael@13 | 16 | ## the Free Software Foundation; either version 2 of the License, or |
michael@13 | 17 | ## (at your option) any later version. |
michael@13 | 18 | ## |
michael@13 | 19 | ## This program is distributed in the hope that it will be useful, |
michael@13 | 20 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
michael@13 | 21 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
michael@13 | 22 | ## General Public License for more details. |
michael@13 | 23 | ## |
michael@13 | 24 | ## You should have received a copy of the GNU General Public License |
michael@13 | 25 | ## along with this program; if not, write to the Free Software |
michael@13 | 26 | ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
michael@13 | 27 | ## USA, or contact Ralf S. Engelschall <rse@engelschall.com>. |
michael@13 | 28 | ## |
michael@13 | 29 | ## NOTICE: Given that you include this file verbatim into your own |
michael@13 | 30 | ## source tree, you are justified in saying that it remains separate |
michael@13 | 31 | ## from your package, and that this way you are simply just using GNU |
michael@13 | 32 | ## shtool. So, in this situation, there is no requirement that your |
michael@13 | 33 | ## package itself is licensed under the GNU General Public License in |
michael@13 | 34 | ## order to take advantage of GNU shtool. |
michael@13 | 35 | ## |
michael@13 | 36 | |
michael@13 | 37 | ## |
michael@13 | 38 | ## Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]] |
michael@13 | 39 | ## |
michael@13 | 40 | ## Available commands: |
michael@13 | 41 | ## echo Print string with optional construct expansion |
michael@13 | 42 | ## mdate Pretty-print modification time of a file or dir |
michael@13 | 43 | ## table Pretty-print a field-separated list as a table |
michael@13 | 44 | ## prop Display progress with a running propeller |
michael@13 | 45 | ## move Move files with simultaneous substitution |
michael@13 | 46 | ## install Install a program, script or datafile |
michael@13 | 47 | ## mkdir Make one or more directories |
michael@13 | 48 | ## mkln Make link with calculation of relative paths |
michael@13 | 49 | ## mkshadow Make a shadow tree through symbolic links |
michael@13 | 50 | ## fixperm Fix file permissions inside a source tree |
michael@13 | 51 | ## rotate Logfile rotation |
michael@13 | 52 | ## tarball Roll distribution tarballs |
michael@13 | 53 | ## subst Apply sed(1) substitution operations |
michael@13 | 54 | ## platform Platform Identification Utility |
michael@13 | 55 | ## arx Extended archive command |
michael@13 | 56 | ## slo Separate linker options by library class |
michael@13 | 57 | ## scpp Sharing C Pre-Processor |
michael@13 | 58 | ## version Maintain a version information file |
michael@13 | 59 | ## path Deal with program paths |
michael@13 | 60 | ## |
michael@13 | 61 | |
michael@13 | 62 | # maximum Bourne-Shell compatibility |
michael@13 | 63 | if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then |
michael@13 | 64 | # reconfigure zsh(1) |
michael@13 | 65 | emulate sh |
michael@13 | 66 | NULLCMD=: |
michael@13 | 67 | alias -g '${1+"$@"}'='"$@"' |
michael@13 | 68 | elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then |
michael@13 | 69 | # reconfigure bash(1) |
michael@13 | 70 | set -o posix |
michael@13 | 71 | fi |
michael@13 | 72 | |
michael@13 | 73 | # maximum independence of NLS nuisances |
michael@13 | 74 | for var in \ |
michael@13 | 75 | LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ |
michael@13 | 76 | LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ |
michael@13 | 77 | LC_TELEPHONE LC_TIME |
michael@13 | 78 | do |
michael@13 | 79 | if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then |
michael@13 | 80 | eval $var=C; export $var |
michael@13 | 81 | else |
michael@13 | 82 | unset $var |
michael@13 | 83 | fi |
michael@13 | 84 | done |
michael@13 | 85 | |
michael@13 | 86 | # initial command line handling |
michael@13 | 87 | if [ $# -eq 0 ]; then |
michael@13 | 88 | echo "$0:Error: invalid command line" 1>&2 |
michael@13 | 89 | echo "$0:Hint: run \`$0 -h' for usage" 1>&2 |
michael@13 | 90 | exit 1 |
michael@13 | 91 | fi |
michael@13 | 92 | if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then |
michael@428 | 93 | echo "This is GNU shtool, version 2.0.8 (18-Jul-2008)" |
michael@428 | 94 | echo 'Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>' |
michael@13 | 95 | echo 'Report bugs to <bug-shtool@gnu.org>' |
michael@13 | 96 | echo '' |
michael@13 | 97 | echo 'Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]' |
michael@13 | 98 | echo '' |
michael@13 | 99 | echo 'Available global <options>:' |
michael@13 | 100 | echo ' -v, --version display shtool version information' |
michael@13 | 101 | echo ' -h, --help display shtool usage help page (this one)' |
michael@13 | 102 | echo ' -d, --debug display shell trace information' |
michael@13 | 103 | echo ' -r, --recreate recreate this shtool script via shtoolize' |
michael@13 | 104 | echo '' |
michael@13 | 105 | echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:' |
michael@13 | 106 | echo ' echo [-n|--newline] [-e|--expand] [<string> ...]' |
michael@13 | 107 | echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' |
michael@13 | 108 | echo ' [-f|--field-sep <str>] [-o|--order <spec>] <path>' |
michael@13 | 109 | echo ' table [-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns' |
michael@13 | 110 | echo ' <cols>] [-s|--strip <strip>] <str><sep><str>...' |
michael@13 | 111 | echo ' prop [-p|--prefix <str>]' |
michael@13 | 112 | echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' |
michael@13 | 113 | echo ' <src-file> <dst-file>' |
michael@13 | 114 | echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' |
michael@13 | 115 | echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>]' |
michael@13 | 116 | echo ' [-o|--owner <owner>] [-g|--group <group>] [-e|--exec' |
michael@13 | 117 | echo ' <sed-cmd>] <file> [<file> ...] <path>' |
michael@13 | 118 | echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' |
michael@13 | 119 | echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir>' |
michael@13 | 120 | echo ' [<dir> ...]' |
michael@13 | 121 | echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] <src-path>' |
michael@13 | 122 | echo ' [<src-path> ...] <dst-path>' |
michael@13 | 123 | echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>' |
michael@13 | 124 | echo ' fixperm [-v|--verbose] [-t|--trace] <path> [<path> ...]' |
michael@13 | 125 | echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' |
michael@13 | 126 | echo ' <count>] [-s|--size <size>] [-c|--copy] [-r|--remove]' |
michael@13 | 127 | echo ' [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>]' |
michael@13 | 128 | echo ' [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode' |
michael@13 | 129 | echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate' |
michael@13 | 130 | echo ' <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]' |
michael@13 | 131 | echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output <tarball>]' |
michael@13 | 132 | echo ' [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user' |
michael@13 | 133 | echo ' <user>] [-g|--group <group>] [-e|--exclude <pattern>]' |
michael@13 | 134 | echo ' <path> [<path> ...]' |
michael@13 | 135 | echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]' |
michael@13 | 136 | echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup' |
michael@13 | 137 | echo ' <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>]' |
michael@13 | 138 | echo ' [...]' |
michael@13 | 139 | echo ' platform [-F|--format <format>] [-S|--sep <string>] [-C|--conc' |
michael@13 | 140 | echo ' <string>] [-L|--lower] [-U|--upper] [-v|--verbose]' |
michael@13 | 141 | echo ' [-c|--concise] [-n|--no-newline] [-t|--type <type>]' |
michael@13 | 142 | echo ' [-V|--version] [-h|--help]' |
michael@13 | 143 | echo ' arx [-t|--trace] [-C|--command <cmd>] <op> <archive> [<file>' |
michael@13 | 144 | echo ' ...]' |
michael@13 | 145 | echo ' slo [-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib>' |
michael@13 | 146 | echo ' ...]' |
michael@13 | 147 | echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter <filter>]' |
michael@13 | 148 | echo ' [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark' |
michael@13 | 149 | echo ' <mark>] [-D|--define <dname>] [-C|--class <cname>]' |
michael@13 | 150 | echo ' <file> [<file> ...]' |
michael@13 | 151 | echo ' version [-l|--language <lang>] [-n|--name <name>] [-p|--prefix' |
michael@13 | 152 | echo ' <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase' |
michael@13 | 153 | echo ' <knob>] [-d|--display <type>] <file>' |
michael@13 | 154 | echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]' |
michael@13 | 155 | echo ' [-m|--magic] [-p|--path <path>] <str> [<str> ...]' |
michael@13 | 156 | echo '' |
michael@13 | 157 | exit 0 |
michael@13 | 158 | fi |
michael@13 | 159 | if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then |
michael@428 | 160 | echo "GNU shtool 2.0.8 (18-Jul-2008)" |
michael@13 | 161 | exit 0 |
michael@13 | 162 | fi |
michael@13 | 163 | if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then |
michael@13 | 164 | shtoolize -oshtool all |
michael@13 | 165 | exit 0 |
michael@13 | 166 | fi |
michael@13 | 167 | if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then |
michael@13 | 168 | shift |
michael@13 | 169 | set -x |
michael@13 | 170 | fi |
michael@13 | 171 | name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` |
michael@13 | 172 | case "$name" in |
michael@13 | 173 | echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|rotate|tarball|subst|platform|arx|slo|scpp|version|path ) |
michael@13 | 174 | # implicit tool command selection |
michael@13 | 175 | tool="$name" |
michael@13 | 176 | ;; |
michael@13 | 177 | * ) |
michael@13 | 178 | # explicit tool command selection |
michael@13 | 179 | tool="$1" |
michael@13 | 180 | shift |
michael@13 | 181 | ;; |
michael@13 | 182 | esac |
michael@13 | 183 | arg_spec="" |
michael@13 | 184 | opt_spec="" |
michael@13 | 185 | gen_tmpfile=no |
michael@13 | 186 | |
michael@13 | 187 | ## |
michael@13 | 188 | ## DISPATCH INTO SCRIPT PROLOG |
michael@13 | 189 | ## |
michael@13 | 190 | |
michael@13 | 191 | case $tool in |
michael@13 | 192 | echo ) |
michael@13 | 193 | str_tool="echo" |
michael@13 | 194 | str_usage="[-n|--newline] [-e|--expand] [<string> ...]" |
michael@13 | 195 | arg_spec="0+" |
michael@13 | 196 | opt_spec="n.e." |
michael@13 | 197 | opt_alias="n:newline,e:expand" |
michael@13 | 198 | opt_n=no |
michael@13 | 199 | opt_e=no |
michael@13 | 200 | ;; |
michael@13 | 201 | mdate ) |
michael@13 | 202 | str_tool="mdate" |
michael@13 | 203 | str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep <str>] [-o|--order <spec>] <path>" |
michael@13 | 204 | arg_spec="1=" |
michael@13 | 205 | opt_spec="n.z.s.d.f:o:" |
michael@13 | 206 | opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order" |
michael@13 | 207 | opt_n=no |
michael@13 | 208 | opt_z=no |
michael@13 | 209 | opt_s=no |
michael@13 | 210 | opt_d=no |
michael@13 | 211 | opt_f=" " |
michael@13 | 212 | opt_o="dmy" |
michael@13 | 213 | ;; |
michael@13 | 214 | table ) |
michael@13 | 215 | str_tool="table" |
michael@13 | 216 | str_usage="[-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns <cols>] [-s|--strip <strip>] <str><sep><str>..." |
michael@13 | 217 | arg_spec="1+" |
michael@13 | 218 | opt_spec="F:w:c:s:" |
michael@13 | 219 | opt_alias="F:field-sep,w:width,c:columns,s:strip" |
michael@13 | 220 | opt_F=":" |
michael@13 | 221 | opt_w=15 |
michael@13 | 222 | opt_c=3 |
michael@13 | 223 | opt_s=79 |
michael@13 | 224 | ;; |
michael@13 | 225 | prop ) |
michael@13 | 226 | str_tool="prop" |
michael@13 | 227 | str_usage="[-p|--prefix <str>]" |
michael@13 | 228 | arg_spec="0=" |
michael@13 | 229 | opt_spec="p:" |
michael@13 | 230 | opt_alias="p:prefix" |
michael@13 | 231 | opt_p="" |
michael@13 | 232 | ;; |
michael@13 | 233 | move ) |
michael@13 | 234 | str_tool="move" |
michael@13 | 235 | str_usage="[-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] <src-file> <dst-file>" |
michael@13 | 236 | arg_spec="2=" |
michael@13 | 237 | opt_spec="v.t.e.p." |
michael@13 | 238 | opt_alias="v:verbose,t:trace,e:expand,p:preserve" |
michael@13 | 239 | opt_v=no |
michael@13 | 240 | opt_t=no |
michael@13 | 241 | opt_e=no |
michael@13 | 242 | opt_p=no |
michael@13 | 243 | ;; |
michael@13 | 244 | install ) |
michael@13 | 245 | str_tool="install" |
michael@13 | 246 | 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>" |
michael@13 | 247 | arg_spec="1+" |
michael@13 | 248 | opt_spec="v.t.d.c.C.s.m:o:g:e+" |
michael@13 | 249 | opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" |
michael@13 | 250 | opt_v=no |
michael@13 | 251 | opt_t=no |
michael@13 | 252 | opt_d=no |
michael@13 | 253 | opt_c=no |
michael@13 | 254 | opt_C=no |
michael@13 | 255 | opt_s=no |
michael@13 | 256 | opt_m="0755" |
michael@13 | 257 | opt_o="" |
michael@13 | 258 | opt_g="" |
michael@13 | 259 | opt_e="" |
michael@13 | 260 | ;; |
michael@13 | 261 | mkdir ) |
michael@13 | 262 | str_tool="mkdir" |
michael@13 | 263 | str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir> [<dir> ...]" |
michael@13 | 264 | arg_spec="1+" |
michael@13 | 265 | opt_spec="t.f.p.m:o:g:" |
michael@13 | 266 | opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" |
michael@13 | 267 | opt_t=no |
michael@13 | 268 | opt_f=no |
michael@13 | 269 | opt_p=no |
michael@13 | 270 | opt_m="" |
michael@13 | 271 | opt_o="" |
michael@13 | 272 | opt_g="" |
michael@13 | 273 | ;; |
michael@13 | 274 | mkln ) |
michael@13 | 275 | str_tool="mkln" |
michael@13 | 276 | str_usage="[-t|--trace] [-f|--force] [-s|--symbolic] <src-path> [<src-path> ...] <dst-path>" |
michael@13 | 277 | arg_spec="2+" |
michael@13 | 278 | opt_spec="t.f.s." |
michael@13 | 279 | opt_alias="t:trace,f:force,s:symbolic" |
michael@13 | 280 | opt_t=no |
michael@13 | 281 | opt_f=no |
michael@13 | 282 | opt_s=no |
michael@13 | 283 | ;; |
michael@13 | 284 | mkshadow ) |
michael@13 | 285 | str_tool="mkshadow" |
michael@13 | 286 | str_usage="[-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>" |
michael@13 | 287 | arg_spec="2=" |
michael@13 | 288 | opt_spec="v.t.a." |
michael@13 | 289 | opt_alias="v:verbose,t:trace,a:all" |
michael@13 | 290 | opt_v=no |
michael@13 | 291 | opt_t=no |
michael@13 | 292 | opt_a=no |
michael@13 | 293 | ;; |
michael@13 | 294 | fixperm ) |
michael@13 | 295 | str_tool="fixperm" |
michael@13 | 296 | str_usage="[-v|--verbose] [-t|--trace] <path> [<path> ...]" |
michael@13 | 297 | arg_spec="1+" |
michael@13 | 298 | opt_spec="v.t." |
michael@13 | 299 | opt_alias="v:verbose,t:trace" |
michael@13 | 300 | opt_v=no |
michael@13 | 301 | opt_t=no |
michael@13 | 302 | ;; |
michael@13 | 303 | rotate ) |
michael@13 | 304 | str_tool="rotate" |
michael@13 | 305 | str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files <count>] [-s|--size <size>] [-c|--copy] [-r|--remove] [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>] [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]" |
michael@13 | 306 | arg_spec="1+" |
michael@13 | 307 | opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:" |
michael@13 | 308 | opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog" |
michael@13 | 309 | opt_v=no |
michael@13 | 310 | opt_t=no |
michael@13 | 311 | opt_f=no |
michael@13 | 312 | opt_n=10 |
michael@13 | 313 | opt_s="" |
michael@13 | 314 | opt_c=no |
michael@13 | 315 | opt_r=no |
michael@13 | 316 | opt_a="" |
michael@13 | 317 | opt_z="" |
michael@13 | 318 | opt_b=no |
michael@13 | 319 | opt_d=no |
michael@13 | 320 | opt_p=1 |
michael@13 | 321 | opt_o="" |
michael@13 | 322 | opt_g="" |
michael@13 | 323 | opt_m="" |
michael@13 | 324 | opt_M="" |
michael@13 | 325 | opt_P="" |
michael@13 | 326 | opt_E="" |
michael@13 | 327 | ;; |
michael@13 | 328 | tarball ) |
michael@13 | 329 | str_tool="tarball" |
michael@13 | 330 | str_usage="[-t|--trace] [-v|--verbose] [-o|--output <tarball>] [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user <user>] [-g|--group <group>] [-e|--exclude <pattern>] <path> [<path> ...]" |
michael@13 | 331 | gen_tmpfile=yes |
michael@13 | 332 | arg_spec="1+" |
michael@13 | 333 | opt_spec="t.v.o:c:d:u:g:e:" |
michael@13 | 334 | opt_alias="t:trace,v:verbose,o:output,c:compress,d:directory,u:user,g:group,e:exclude" |
michael@13 | 335 | opt_t=no |
michael@13 | 336 | opt_v=no |
michael@13 | 337 | opt_o="" |
michael@13 | 338 | opt_c="" |
michael@13 | 339 | opt_d="" |
michael@13 | 340 | opt_u="" |
michael@13 | 341 | opt_g="" |
michael@13 | 342 | opt_e="CVS,\\.cvsignore,\\.svn,\\.[oa]\$" |
michael@13 | 343 | ;; |
michael@13 | 344 | subst ) |
michael@13 | 345 | str_tool="subst" |
michael@13 | 346 | str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning] [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>] [...]" |
michael@13 | 347 | gen_tmpfile=yes |
michael@13 | 348 | arg_spec="0+" |
michael@13 | 349 | opt_spec="v.t.n.w.q.s.i.b:e+f:" |
michael@13 | 350 | opt_alias="v:verbose,t:trace,n:nop,w:warning,q:quiet,s:stealth,i:interactive,b:backup,e:exec,f:file" |
michael@13 | 351 | opt_v=no |
michael@13 | 352 | opt_t=no |
michael@13 | 353 | opt_n=no |
michael@13 | 354 | opt_w=no |
michael@13 | 355 | opt_q=no |
michael@13 | 356 | opt_s=no |
michael@13 | 357 | opt_i=no |
michael@13 | 358 | opt_b="" |
michael@13 | 359 | opt_e="" |
michael@13 | 360 | opt_f="" |
michael@13 | 361 | ;; |
michael@13 | 362 | platform ) |
michael@13 | 363 | str_tool="platform" |
michael@13 | 364 | 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]" |
michael@13 | 365 | arg_spec="0=" |
michael@13 | 366 | opt_spec="F:S:C:L.U.v.c.n.t:d.V.h." |
michael@13 | 367 | 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" |
michael@13 | 368 | opt_F="%{sp} (%{ap})" |
michael@13 | 369 | opt_S=" " |
michael@13 | 370 | opt_C="/" |
michael@13 | 371 | opt_L=no |
michael@13 | 372 | opt_U=no |
michael@13 | 373 | opt_t="" |
michael@13 | 374 | opt_v=no |
michael@13 | 375 | opt_c=no |
michael@13 | 376 | opt_n=no |
michael@13 | 377 | opt_V=no |
michael@13 | 378 | opt_h=no |
michael@13 | 379 | ;; |
michael@13 | 380 | arx ) |
michael@13 | 381 | str_tool="arx" |
michael@13 | 382 | str_usage="[-t|--trace] [-C|--command <cmd>] <op> <archive> [<file> ...]" |
michael@13 | 383 | arg_spec="2+" |
michael@13 | 384 | opt_spec="t.C:" |
michael@13 | 385 | opt_alias="t:trace,C:command" |
michael@13 | 386 | opt_t=no |
michael@13 | 387 | opt_C="ar" |
michael@13 | 388 | ;; |
michael@13 | 389 | slo ) |
michael@13 | 390 | str_tool="slo" |
michael@13 | 391 | str_usage="[-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]" |
michael@13 | 392 | arg_spec="1+" |
michael@13 | 393 | opt_spec="p:" |
michael@13 | 394 | opt_alias="p:prefix" |
michael@13 | 395 | opt_p="SLO_" |
michael@13 | 396 | ;; |
michael@13 | 397 | scpp ) |
michael@13 | 398 | str_tool="scpp" |
michael@13 | 399 | str_usage="[-v|--verbose] [-p|--preserve] [-f|--filter <filter>] [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark <mark>] [-D|--define <dname>] [-C|--class <cname>] <file> [<file> ...]" |
michael@13 | 400 | gen_tmpfile=yes |
michael@13 | 401 | arg_spec="1+" |
michael@13 | 402 | opt_spec="v.p.f+o:t:M:D:C:" |
michael@13 | 403 | opt_alias="v:verbose,p:preserve,f:filter,o:output,t:template,M:mark,D:define,C:class" |
michael@13 | 404 | opt_v=no |
michael@13 | 405 | opt_p=no |
michael@13 | 406 | opt_f="" |
michael@13 | 407 | opt_o="lib.h" |
michael@13 | 408 | opt_t="lib.h.in" |
michael@13 | 409 | opt_M="%%MARK%%" |
michael@13 | 410 | opt_D="cpp" |
michael@13 | 411 | opt_C="intern" |
michael@13 | 412 | ;; |
michael@13 | 413 | version ) |
michael@13 | 414 | str_tool="version" |
michael@13 | 415 | str_usage="[-l|--language <lang>] [-n|--name <name>] [-p|--prefix <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase <knob>] [-d|--display <type>] <file>" |
michael@13 | 416 | arg_spec="1=" |
michael@13 | 417 | opt_spec="l:n:p:s:i:e.d:" |
michael@13 | 418 | opt_alias="l:language,n:name,p:prefix,s:set,e:edit,i:increase,d:display" |
michael@13 | 419 | opt_l="txt" |
michael@13 | 420 | opt_n="unknown" |
michael@13 | 421 | opt_p="" |
michael@13 | 422 | opt_s="" |
michael@13 | 423 | opt_e="no" |
michael@13 | 424 | opt_i="" |
michael@13 | 425 | opt_d="short" |
michael@13 | 426 | ;; |
michael@13 | 427 | path ) |
michael@13 | 428 | str_tool="path" |
michael@13 | 429 | str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path <path>] <str> [<str> ...]" |
michael@13 | 430 | gen_tmpfile=yes |
michael@13 | 431 | arg_spec="1+" |
michael@13 | 432 | opt_spec="s.r.d.b.m.p:" |
michael@13 | 433 | opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path" |
michael@13 | 434 | opt_s=no |
michael@13 | 435 | opt_r=no |
michael@13 | 436 | opt_d=no |
michael@13 | 437 | opt_b=no |
michael@13 | 438 | opt_m=no |
michael@13 | 439 | opt_p="$PATH" |
michael@13 | 440 | ;; |
michael@13 | 441 | -* ) |
michael@13 | 442 | echo "$0:Error: unknown option \`$tool'" 2>&1 |
michael@13 | 443 | echo "$0:Hint: run \`$0 -h' for usage" 2>&1 |
michael@13 | 444 | exit 1 |
michael@13 | 445 | ;; |
michael@13 | 446 | * ) |
michael@13 | 447 | echo "$0:Error: unknown command \`$tool'" 2>&1 |
michael@13 | 448 | echo "$0:Hint: run \`$0 -h' for usage" 2>&1 |
michael@13 | 449 | exit 1 |
michael@13 | 450 | ;; |
michael@13 | 451 | esac |
michael@13 | 452 | |
michael@13 | 453 | ## |
michael@13 | 454 | ## COMMON UTILITY CODE |
michael@13 | 455 | ## |
michael@13 | 456 | |
michael@13 | 457 | # commonly used ASCII values |
michael@13 | 458 | ASC_TAB=" " |
michael@13 | 459 | ASC_NL=" |
michael@13 | 460 | " |
michael@13 | 461 | |
michael@13 | 462 | # determine name of tool |
michael@13 | 463 | if [ ".$tool" != . ]; then |
michael@13 | 464 | # used inside shtool script |
michael@13 | 465 | toolcmd="$0 $tool" |
michael@13 | 466 | toolcmdhelp="shtool $tool" |
michael@13 | 467 | msgprefix="shtool:$tool" |
michael@13 | 468 | else |
michael@13 | 469 | # used as standalone script |
michael@13 | 470 | toolcmd="$0" |
michael@13 | 471 | toolcmdhelp="sh $0" |
michael@13 | 472 | msgprefix="$str_tool" |
michael@13 | 473 | fi |
michael@13 | 474 | |
michael@13 | 475 | # parse argument specification string |
michael@13 | 476 | eval `echo $arg_spec |\ |
michael@13 | 477 | sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` |
michael@13 | 478 | |
michael@13 | 479 | # parse option specification string |
michael@13 | 480 | eval `echo h.$opt_spec |\ |
michael@13 | 481 | sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` |
michael@13 | 482 | |
michael@13 | 483 | # parse option alias string |
michael@13 | 484 | eval `echo h:help,$opt_alias |\ |
michael@13 | 485 | sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` |
michael@13 | 486 | |
michael@13 | 487 | # interate over argument line |
michael@13 | 488 | opt_PREV='' |
michael@13 | 489 | while [ $# -gt 0 ]; do |
michael@13 | 490 | # special option stops processing |
michael@13 | 491 | if [ ".$1" = ".--" ]; then |
michael@13 | 492 | shift |
michael@13 | 493 | break |
michael@13 | 494 | fi |
michael@13 | 495 | |
michael@13 | 496 | # determine option and argument |
michael@13 | 497 | opt_ARG_OK=no |
michael@13 | 498 | if [ ".$opt_PREV" != . ]; then |
michael@13 | 499 | # merge previous seen option with argument |
michael@13 | 500 | opt_OPT="$opt_PREV" |
michael@13 | 501 | opt_ARG="$1" |
michael@13 | 502 | opt_ARG_OK=yes |
michael@13 | 503 | opt_PREV='' |
michael@13 | 504 | else |
michael@13 | 505 | # split argument into option and argument |
michael@13 | 506 | case "$1" in |
michael@13 | 507 | --[a-zA-Z0-9]*=*) |
michael@13 | 508 | eval `echo "x$1" |\ |
michael@13 | 509 | sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` |
michael@13 | 510 | opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` |
michael@13 | 511 | eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" |
michael@13 | 512 | ;; |
michael@13 | 513 | --[a-zA-Z0-9]*) |
michael@13 | 514 | opt_OPT=`echo "x$1" | cut -c4-` |
michael@13 | 515 | opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` |
michael@13 | 516 | eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" |
michael@13 | 517 | opt_ARG='' |
michael@13 | 518 | ;; |
michael@13 | 519 | -[a-zA-Z0-9]*) |
michael@13 | 520 | eval `echo "x$1" |\ |
michael@13 | 521 | sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ |
michael@13 | 522 | -e 's/";\(.*\)$/"; opt_ARG="\1"/'` |
michael@13 | 523 | ;; |
michael@13 | 524 | -[a-zA-Z0-9]) |
michael@13 | 525 | opt_OPT=`echo "x$1" | cut -c3-` |
michael@13 | 526 | opt_ARG='' |
michael@13 | 527 | ;; |
michael@13 | 528 | *) |
michael@13 | 529 | break |
michael@13 | 530 | ;; |
michael@13 | 531 | esac |
michael@13 | 532 | fi |
michael@13 | 533 | |
michael@13 | 534 | # eat up option |
michael@13 | 535 | shift |
michael@13 | 536 | |
michael@13 | 537 | # determine whether option needs an argument |
michael@13 | 538 | eval "opt_MODE=\$opt_MODE_${opt_OPT}" |
michael@13 | 539 | if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then |
michael@13 | 540 | if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then |
michael@13 | 541 | opt_PREV="$opt_OPT" |
michael@13 | 542 | continue |
michael@13 | 543 | fi |
michael@13 | 544 | fi |
michael@13 | 545 | |
michael@13 | 546 | # process option |
michael@13 | 547 | case $opt_MODE in |
michael@13 | 548 | '.' ) |
michael@13 | 549 | # boolean option |
michael@13 | 550 | eval "opt_${opt_OPT}=yes" |
michael@13 | 551 | ;; |
michael@13 | 552 | ':' ) |
michael@13 | 553 | # option with argument (multiple occurances override) |
michael@13 | 554 | eval "opt_${opt_OPT}=\"\$opt_ARG\"" |
michael@13 | 555 | ;; |
michael@13 | 556 | '+' ) |
michael@13 | 557 | # option with argument (multiple occurances append) |
michael@13 | 558 | eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\"" |
michael@13 | 559 | ;; |
michael@13 | 560 | * ) |
michael@13 | 561 | echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2 |
michael@13 | 562 | echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 |
michael@13 | 563 | exit 1 |
michael@13 | 564 | ;; |
michael@13 | 565 | esac |
michael@13 | 566 | done |
michael@13 | 567 | if [ ".$opt_PREV" != . ]; then |
michael@13 | 568 | echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2 |
michael@13 | 569 | echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 |
michael@13 | 570 | exit 1 |
michael@13 | 571 | fi |
michael@13 | 572 | |
michael@13 | 573 | # process help option |
michael@13 | 574 | if [ ".$opt_h" = .yes ]; then |
michael@13 | 575 | echo "Usage: $toolcmdhelp $str_usage" |
michael@13 | 576 | exit 0 |
michael@13 | 577 | fi |
michael@13 | 578 | |
michael@13 | 579 | # complain about incorrect number of arguments |
michael@13 | 580 | case $arg_MODE in |
michael@13 | 581 | '=' ) |
michael@13 | 582 | if [ $# -ne $arg_NUMS ]; then |
michael@13 | 583 | echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 |
michael@13 | 584 | echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 |
michael@13 | 585 | exit 1 |
michael@13 | 586 | fi |
michael@13 | 587 | ;; |
michael@13 | 588 | '+' ) |
michael@13 | 589 | if [ $# -lt $arg_NUMS ]; then |
michael@13 | 590 | echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 |
michael@13 | 591 | echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 |
michael@13 | 592 | exit 1 |
michael@13 | 593 | fi |
michael@13 | 594 | ;; |
michael@13 | 595 | esac |
michael@13 | 596 | |
michael@13 | 597 | # establish a temporary file on request |
michael@13 | 598 | if [ ".$gen_tmpfile" = .yes ]; then |
michael@13 | 599 | # create (explicitly) secure temporary directory |
michael@13 | 600 | if [ ".$TMPDIR" != . ]; then |
michael@13 | 601 | tmpdir="$TMPDIR" |
michael@13 | 602 | elif [ ".$TEMPDIR" != . ]; then |
michael@13 | 603 | tmpdir="$TEMPDIR" |
michael@13 | 604 | else |
michael@13 | 605 | tmpdir="/tmp" |
michael@13 | 606 | fi |
michael@13 | 607 | tmpdir="$tmpdir/.shtool.$$" |
michael@13 | 608 | ( umask 077 |
michael@13 | 609 | rm -rf "$tmpdir" >/dev/null 2>&1 || true |
michael@13 | 610 | mkdir "$tmpdir" >/dev/null 2>&1 |
michael@13 | 611 | if [ $? -ne 0 ]; then |
michael@13 | 612 | echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2 |
michael@13 | 613 | exit 1 |
michael@13 | 614 | fi |
michael@13 | 615 | ) |
michael@13 | 616 | |
michael@13 | 617 | # create (implicitly) secure temporary file |
michael@13 | 618 | tmpfile="$tmpdir/shtool.tmp" |
michael@13 | 619 | touch "$tmpfile" |
michael@13 | 620 | fi |
michael@13 | 621 | |
michael@13 | 622 | # utility function: map string to lower case |
michael@13 | 623 | util_lower () { |
michael@13 | 624 | echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' |
michael@13 | 625 | } |
michael@13 | 626 | |
michael@13 | 627 | # utility function: map string to upper case |
michael@13 | 628 | util_upper () { |
michael@13 | 629 | echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
michael@13 | 630 | } |
michael@13 | 631 | |
michael@13 | 632 | # cleanup procedure |
michael@13 | 633 | shtool_exit () { |
michael@13 | 634 | rc="$1" |
michael@13 | 635 | if [ ".$gen_tmpfile" = .yes ]; then |
michael@13 | 636 | rm -rf "$tmpdir" >/dev/null 2>&1 || true |
michael@13 | 637 | fi |
michael@13 | 638 | exit $rc |
michael@13 | 639 | } |
michael@13 | 640 | |
michael@13 | 641 | ## |
michael@13 | 642 | ## DISPATCH INTO SCRIPT BODY |
michael@13 | 643 | ## |
michael@13 | 644 | |
michael@13 | 645 | case $tool in |
michael@13 | 646 | |
michael@13 | 647 | echo ) |
michael@13 | 648 | ## |
michael@13 | 649 | ## echo -- Print string with optional construct expansion |
michael@428 | 650 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 651 | ## |
michael@13 | 652 | |
michael@13 | 653 | text="$*" |
michael@13 | 654 | |
michael@13 | 655 | # check for broken escape sequence expansion |
michael@13 | 656 | seo='' |
michael@13 | 657 | bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` |
michael@13 | 658 | if [ ".$bytes" != .3 ]; then |
michael@13 | 659 | bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` |
michael@13 | 660 | if [ ".$bytes" = .3 ]; then |
michael@13 | 661 | seo='-E' |
michael@13 | 662 | fi |
michael@13 | 663 | fi |
michael@13 | 664 | |
michael@13 | 665 | # check for existing -n option (to suppress newline) |
michael@13 | 666 | minusn='' |
michael@13 | 667 | bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` |
michael@13 | 668 | if [ ".$bytes" = .3 ]; then |
michael@13 | 669 | minusn='-n' |
michael@13 | 670 | fi |
michael@13 | 671 | |
michael@13 | 672 | # determine terminal bold sequence |
michael@13 | 673 | term_bold='' |
michael@13 | 674 | term_norm='' |
michael@13 | 675 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then |
michael@13 | 676 | case $TERM in |
michael@13 | 677 | # for the most important terminal types we directly know the sequences |
michael@13 | 678 | xterm|xterm*|vt220|vt220*) |
michael@13 | 679 | term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null` |
michael@13 | 680 | term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null` |
michael@13 | 681 | ;; |
michael@13 | 682 | vt100|vt100*|cygwin) |
michael@13 | 683 | term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null` |
michael@13 | 684 | term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null` |
michael@13 | 685 | ;; |
michael@13 | 686 | # for all others, we try to use a possibly existing `tput' or `tcout' utility |
michael@13 | 687 | * ) |
michael@13 | 688 | paths=`echo $PATH | sed -e 's/:/ /g'` |
michael@13 | 689 | for tool in tput tcout; do |
michael@13 | 690 | for dir in $paths; do |
michael@13 | 691 | if [ -r "$dir/$tool" ]; then |
michael@13 | 692 | for seq in bold md smso; do # 'smso' is last |
michael@13 | 693 | bold="`$dir/$tool $seq 2>/dev/null`" |
michael@13 | 694 | if [ ".$bold" != . ]; then |
michael@13 | 695 | term_bold="$bold" |
michael@13 | 696 | break |
michael@13 | 697 | fi |
michael@13 | 698 | done |
michael@13 | 699 | if [ ".$term_bold" != . ]; then |
michael@13 | 700 | for seq in sgr0 me rmso init reset; do # 'reset' is last |
michael@13 | 701 | norm="`$dir/$tool $seq 2>/dev/null`" |
michael@13 | 702 | if [ ".$norm" != . ]; then |
michael@13 | 703 | term_norm="$norm" |
michael@13 | 704 | break |
michael@13 | 705 | fi |
michael@13 | 706 | done |
michael@13 | 707 | fi |
michael@13 | 708 | break |
michael@13 | 709 | fi |
michael@13 | 710 | done |
michael@13 | 711 | if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then |
michael@13 | 712 | break; |
michael@13 | 713 | fi |
michael@13 | 714 | done |
michael@13 | 715 | ;; |
michael@13 | 716 | esac |
michael@13 | 717 | if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then |
michael@13 | 718 | echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 |
michael@13 | 719 | term_bold='' |
michael@13 | 720 | term_norm='' |
michael@13 | 721 | fi |
michael@13 | 722 | fi |
michael@13 | 723 | |
michael@13 | 724 | # determine user name |
michael@13 | 725 | username='' |
michael@13 | 726 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then |
michael@13 | 727 | username="`(id -un) 2>/dev/null`" |
michael@13 | 728 | if [ ".$username" = . ]; then |
michael@13 | 729 | str="`(id) 2>/dev/null`" |
michael@13 | 730 | if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then |
michael@13 | 731 | username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` |
michael@13 | 732 | fi |
michael@13 | 733 | if [ ".$username" = . ]; then |
michael@13 | 734 | username="$LOGNAME" |
michael@13 | 735 | if [ ".$username" = . ]; then |
michael@13 | 736 | username="$USER" |
michael@13 | 737 | if [ ".$username" = . ]; then |
michael@13 | 738 | username="`(whoami) 2>/dev/null |\ |
michael@13 | 739 | awk '{ printf("%s", $1); }'`" |
michael@13 | 740 | if [ ".$username" = . ]; then |
michael@13 | 741 | username="`(who am i) 2>/dev/null |\ |
michael@13 | 742 | awk '{ printf("%s", $1); }'`" |
michael@13 | 743 | if [ ".$username" = . ]; then |
michael@13 | 744 | username='unknown' |
michael@13 | 745 | fi |
michael@13 | 746 | fi |
michael@13 | 747 | fi |
michael@13 | 748 | fi |
michael@13 | 749 | fi |
michael@13 | 750 | fi |
michael@13 | 751 | fi |
michael@13 | 752 | |
michael@13 | 753 | # determine user id |
michael@13 | 754 | userid='' |
michael@13 | 755 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then |
michael@13 | 756 | userid="`(id -u) 2>/dev/null`" |
michael@13 | 757 | if [ ".$userid" = . ]; then |
michael@13 | 758 | userid="`(id -u ${username}) 2>/dev/null`" |
michael@13 | 759 | if [ ".$userid" = . ]; then |
michael@13 | 760 | str="`(id) 2>/dev/null`" |
michael@13 | 761 | if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then |
michael@13 | 762 | userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'` |
michael@13 | 763 | fi |
michael@13 | 764 | if [ ".$userid" = . ]; then |
michael@13 | 765 | userid=`(getent passwd ${username}) 2>/dev/null | \ |
michael@13 | 766 | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 767 | if [ ".$userid" = . ]; then |
michael@13 | 768 | userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ |
michael@13 | 769 | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 770 | if [ ".$userid" = . ]; then |
michael@13 | 771 | userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ |
michael@13 | 772 | sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 773 | if [ ".$userid" = . ]; then |
michael@13 | 774 | userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ |
michael@13 | 775 | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 776 | if [ ".$userid" = . ]; then |
michael@13 | 777 | userid='?' |
michael@13 | 778 | fi |
michael@13 | 779 | fi |
michael@13 | 780 | fi |
michael@13 | 781 | fi |
michael@13 | 782 | fi |
michael@13 | 783 | fi |
michael@13 | 784 | fi |
michael@13 | 785 | fi |
michael@13 | 786 | |
michael@13 | 787 | # determine (primary) group id |
michael@13 | 788 | groupid='' |
michael@13 | 789 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then |
michael@13 | 790 | groupid="`(id -g ${username}) 2>/dev/null`" |
michael@13 | 791 | if [ ".$groupid" = . ]; then |
michael@13 | 792 | str="`(id) 2>/dev/null`" |
michael@13 | 793 | if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then |
michael@13 | 794 | groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'` |
michael@13 | 795 | fi |
michael@13 | 796 | if [ ".$groupid" = . ]; then |
michael@13 | 797 | groupid=`(getent passwd ${username}) 2>/dev/null | \ |
michael@13 | 798 | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 799 | if [ ".$groupid" = . ]; then |
michael@13 | 800 | groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ |
michael@13 | 801 | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 802 | if [ ".$groupid" = . ]; then |
michael@13 | 803 | groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \ |
michael@13 | 804 | sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 805 | if [ ".$groupid" = . ]; then |
michael@13 | 806 | groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \ |
michael@13 | 807 | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` |
michael@13 | 808 | if [ ".$groupid" = . ]; then |
michael@13 | 809 | groupid='?' |
michael@13 | 810 | fi |
michael@13 | 811 | fi |
michael@13 | 812 | fi |
michael@13 | 813 | fi |
michael@13 | 814 | fi |
michael@13 | 815 | fi |
michael@13 | 816 | fi |
michael@13 | 817 | |
michael@13 | 818 | # determine (primary) group name |
michael@13 | 819 | groupname='' |
michael@13 | 820 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then |
michael@13 | 821 | groupname="`(id -gn ${username}) 2>/dev/null`" |
michael@13 | 822 | if [ ".$groupname" = . ]; then |
michael@13 | 823 | str="`(id) 2>/dev/null`" |
michael@13 | 824 | if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then |
michael@13 | 825 | groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` |
michael@13 | 826 | fi |
michael@13 | 827 | if [ ".$groupname" = . ]; then |
michael@13 | 828 | groupname=`(getent group) 2>/dev/null | \ |
michael@13 | 829 | grep "^[^:]*:[^:]*:${groupid}:" | \ |
michael@13 | 830 | sed -e 's/:.*$//'` |
michael@13 | 831 | if [ ".$groupname" = . ]; then |
michael@13 | 832 | groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ |
michael@13 | 833 | sed -e 's/:.*$//'` |
michael@13 | 834 | if [ ".$groupname" = . ]; then |
michael@13 | 835 | groupname=`(ypcat group; niscat group) 2>/dev/null | \ |
michael@13 | 836 | sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \ |
michael@13 | 837 | sed -e 's/:.*$//'` |
michael@13 | 838 | if [ ".$groupname" = . ]; then |
michael@13 | 839 | groupname=`(nidump group .) 2>/dev/null | \ |
michael@13 | 840 | grep "^[^:]*:[^:]*:${groupid}:" | \ |
michael@13 | 841 | sed -e 's/:.*$//'` |
michael@13 | 842 | if [ ".$groupname" = . ]; then |
michael@13 | 843 | groupname='?' |
michael@13 | 844 | fi |
michael@13 | 845 | fi |
michael@13 | 846 | fi |
michael@13 | 847 | fi |
michael@13 | 848 | fi |
michael@13 | 849 | fi |
michael@13 | 850 | fi |
michael@13 | 851 | |
michael@13 | 852 | # determine host and domain name |
michael@13 | 853 | hostname='' |
michael@13 | 854 | domainname='' |
michael@13 | 855 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then |
michael@13 | 856 | hostname="`(uname -n) 2>/dev/null |\ |
michael@13 | 857 | awk '{ printf("%s", $1); }'`" |
michael@13 | 858 | if [ ".$hostname" = . ]; then |
michael@13 | 859 | hostname="`(hostname) 2>/dev/null |\ |
michael@13 | 860 | awk '{ printf("%s", $1); }'`" |
michael@13 | 861 | if [ ".$hostname" = . ]; then |
michael@13 | 862 | hostname='unknown' |
michael@13 | 863 | fi |
michael@13 | 864 | fi |
michael@13 | 865 | case $hostname in |
michael@13 | 866 | *.* ) |
michael@13 | 867 | domainname=".`echo $hostname | cut -d. -f2-`" |
michael@13 | 868 | hostname="`echo $hostname | cut -d. -f1`" |
michael@13 | 869 | ;; |
michael@13 | 870 | esac |
michael@13 | 871 | fi |
michael@13 | 872 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then |
michael@13 | 873 | if [ ".$domainname" = . ]; then |
michael@13 | 874 | if [ -f /etc/resolv.conf ]; then |
michael@13 | 875 | domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ |
michael@13 | 876 | sed -e 's/.*domain//' \ |
michael@13 | 877 | -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ |
michael@13 | 878 | -e 's/^\.//' -e 's/^/./' |\ |
michael@13 | 879 | awk '{ printf("%s", $1); }'`" |
michael@13 | 880 | if [ ".$domainname" = . ]; then |
michael@13 | 881 | domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ |
michael@13 | 882 | sed -e 's/.*search//' \ |
michael@13 | 883 | -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ |
michael@13 | 884 | -e 's/ .*//' -e 's/ .*//' \ |
michael@13 | 885 | -e 's/^\.//' -e 's/^/./' |\ |
michael@13 | 886 | awk '{ printf("%s", $1); }'`" |
michael@13 | 887 | fi |
michael@13 | 888 | fi |
michael@13 | 889 | fi |
michael@13 | 890 | fi |
michael@13 | 891 | |
michael@13 | 892 | # determine current time |
michael@13 | 893 | time_day='' |
michael@13 | 894 | time_month='' |
michael@13 | 895 | time_year='' |
michael@13 | 896 | time_monthname='' |
michael@13 | 897 | if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then |
michael@13 | 898 | time_day=`date '+%d'` |
michael@13 | 899 | time_month=`date '+%m'` |
michael@13 | 900 | time_year=`date '+%Y' 2>/dev/null` |
michael@13 | 901 | if [ ".$time_year" = . ]; then |
michael@13 | 902 | time_year=`date '+%y'` |
michael@13 | 903 | case $time_year in |
michael@13 | 904 | [5-9][0-9]) time_year="19$time_year" ;; |
michael@13 | 905 | [0-4][0-9]) time_year="20$time_year" ;; |
michael@13 | 906 | esac |
michael@13 | 907 | fi |
michael@13 | 908 | case $time_month in |
michael@13 | 909 | 1|01) time_monthname='Jan' ;; |
michael@13 | 910 | 2|02) time_monthname='Feb' ;; |
michael@13 | 911 | 3|03) time_monthname='Mar' ;; |
michael@13 | 912 | 4|04) time_monthname='Apr' ;; |
michael@13 | 913 | 5|05) time_monthname='May' ;; |
michael@13 | 914 | 6|06) time_monthname='Jun' ;; |
michael@13 | 915 | 7|07) time_monthname='Jul' ;; |
michael@13 | 916 | 8|08) time_monthname='Aug' ;; |
michael@13 | 917 | 9|09) time_monthname='Sep' ;; |
michael@13 | 918 | 10) time_monthname='Oct' ;; |
michael@13 | 919 | 11) time_monthname='Nov' ;; |
michael@13 | 920 | 12) time_monthname='Dec' ;; |
michael@13 | 921 | esac |
michael@13 | 922 | fi |
michael@13 | 923 | |
michael@13 | 924 | # expand special ``%x'' constructs |
michael@13 | 925 | if [ ".$opt_e" = .yes ]; then |
michael@13 | 926 | text=`echo $seo "$text" |\ |
michael@13 | 927 | sed -e "s/%B/${term_bold}/g" \ |
michael@13 | 928 | -e "s/%b/${term_norm}/g" \ |
michael@13 | 929 | -e "s/%u/${username}/g" \ |
michael@13 | 930 | -e "s/%U/${userid}/g" \ |
michael@13 | 931 | -e "s/%g/${groupname}/g" \ |
michael@13 | 932 | -e "s/%G/${groupid}/g" \ |
michael@13 | 933 | -e "s/%h/${hostname}/g" \ |
michael@13 | 934 | -e "s/%d/${domainname}/g" \ |
michael@13 | 935 | -e "s/%D/${time_day}/g" \ |
michael@13 | 936 | -e "s/%M/${time_month}/g" \ |
michael@13 | 937 | -e "s/%Y/${time_year}/g" \ |
michael@13 | 938 | -e "s/%m/${time_monthname}/g" 2>/dev/null` |
michael@13 | 939 | fi |
michael@13 | 940 | |
michael@13 | 941 | # create output |
michael@13 | 942 | if [ .$opt_n = .no ]; then |
michael@13 | 943 | echo $seo "$text" |
michael@13 | 944 | else |
michael@13 | 945 | # the harder part: echo -n is best, because |
michael@13 | 946 | # awk may complain about some \xx sequences. |
michael@13 | 947 | if [ ".$minusn" != . ]; then |
michael@13 | 948 | echo $seo $minusn "$text" |
michael@13 | 949 | else |
michael@13 | 950 | echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" |
michael@13 | 951 | fi |
michael@13 | 952 | fi |
michael@13 | 953 | |
michael@13 | 954 | shtool_exit 0 |
michael@13 | 955 | ;; |
michael@13 | 956 | |
michael@13 | 957 | mdate ) |
michael@13 | 958 | ## |
michael@13 | 959 | ## mdate -- Pretty-print modification time of a file or dir |
michael@13 | 960 | ## Copyright (c) 1995-1997 Free Software Foundation, Inc. |
michael@428 | 961 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 962 | ## |
michael@13 | 963 | |
michael@13 | 964 | fod="$1" |
michael@13 | 965 | case "$opt_o" in |
michael@13 | 966 | [dmy][dmy][dmy] ) |
michael@13 | 967 | ;; |
michael@13 | 968 | * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2 |
michael@13 | 969 | shtool_exit 1 |
michael@13 | 970 | ;; |
michael@13 | 971 | esac |
michael@13 | 972 | if [ ! -r "$fod" ]; then |
michael@13 | 973 | echo "$msgprefix:Error: file or directory not found: $fod" 1>&2 |
michael@13 | 974 | shtool_exit 1 |
michael@13 | 975 | fi |
michael@13 | 976 | |
michael@13 | 977 | # GNU ls changes its time format in response to the TIME_STYLE |
michael@13 | 978 | # variable. Since we cannot assume "unset" works, revert this |
michael@13 | 979 | # variable to its documented default. |
michael@13 | 980 | if [ ".$TIME_STYLE" != . ]; then |
michael@13 | 981 | TIME_STYLE=posix-long-iso |
michael@13 | 982 | export TIME_STYLE |
michael@13 | 983 | fi |
michael@13 | 984 | |
michael@13 | 985 | # get the extended ls output of the file or directory. |
michael@13 | 986 | if /bin/ls -L /dev/null >/dev/null 2>&1; then |
michael@13 | 987 | set - x`/bin/ls -L -l -d $fod` |
michael@13 | 988 | else |
michael@13 | 989 | set - x`/bin/ls -l -d $fod` |
michael@13 | 990 | fi |
michael@13 | 991 | |
michael@13 | 992 | # The month is at least the fourth argument |
michael@13 | 993 | # (3 shifts here, the next inside the loop). |
michael@13 | 994 | shift; shift; shift |
michael@13 | 995 | |
michael@13 | 996 | # Find the month. Next argument is day, followed by the year or time. |
michael@13 | 997 | month="" |
michael@13 | 998 | while [ ".$month" = . ]; do |
michael@13 | 999 | shift |
michael@13 | 1000 | case $1 in |
michael@13 | 1001 | Jan) month=January; nummonth=1 ;; |
michael@13 | 1002 | Feb) month=February; nummonth=2 ;; |
michael@13 | 1003 | Mar) month=March; nummonth=3 ;; |
michael@13 | 1004 | Apr) month=April; nummonth=4 ;; |
michael@13 | 1005 | May) month=May; nummonth=5 ;; |
michael@13 | 1006 | Jun) month=June; nummonth=6 ;; |
michael@13 | 1007 | Jul) month=July; nummonth=7 ;; |
michael@13 | 1008 | Aug) month=August; nummonth=8 ;; |
michael@13 | 1009 | Sep) month=September; nummonth=9 ;; |
michael@13 | 1010 | Oct) month=October; nummonth=10 ;; |
michael@13 | 1011 | Nov) month=November; nummonth=11 ;; |
michael@13 | 1012 | Dec) month=December; nummonth=12 ;; |
michael@13 | 1013 | esac |
michael@13 | 1014 | done |
michael@13 | 1015 | day="$2" |
michael@13 | 1016 | year="$3" |
michael@13 | 1017 | |
michael@13 | 1018 | # We finally have to deal with the problem that the "ls" output |
michael@13 | 1019 | # gives either the time of the day or the year. |
michael@13 | 1020 | case $year in |
michael@13 | 1021 | *:*) |
michael@13 | 1022 | this_year=`date '+%Y' 2>/dev/null` |
michael@13 | 1023 | if [ ".$this_year" = . ]; then |
michael@13 | 1024 | this_year=`date '+%y'` |
michael@13 | 1025 | case $this_year in |
michael@13 | 1026 | [5-9][0-9]) this_year="19$this_year" ;; |
michael@13 | 1027 | [0-4][0-9]) this_year="20$this_year" ;; |
michael@13 | 1028 | esac |
michael@13 | 1029 | fi |
michael@13 | 1030 | # for the following months of the last year the time notation |
michael@13 | 1031 | # is usually also used for files modified in the last year. |
michael@13 | 1032 | this_month=`date '+%m'` |
michael@13 | 1033 | if (expr $nummonth \> $this_month) >/dev/null; then |
michael@13 | 1034 | this_year=`expr $this_year - 1` |
michael@13 | 1035 | fi |
michael@13 | 1036 | year="$this_year" |
michael@13 | 1037 | ;; |
michael@13 | 1038 | esac |
michael@13 | 1039 | |
michael@13 | 1040 | # Optionally fill day and month with leeding zeros |
michael@13 | 1041 | if [ ".$opt_z" = .yes ]; then |
michael@13 | 1042 | case $day in |
michael@13 | 1043 | [0-9][0-9] ) ;; |
michael@13 | 1044 | [0-9] ) day="0$day" ;; |
michael@13 | 1045 | esac |
michael@13 | 1046 | case $nummonth in |
michael@13 | 1047 | [0-9][0-9] ) ;; |
michael@13 | 1048 | [0-9] ) nummonth="0$nummonth" ;; |
michael@13 | 1049 | esac |
michael@13 | 1050 | fi |
michael@13 | 1051 | |
michael@13 | 1052 | # Optionally use digits for month |
michael@13 | 1053 | if [ ".$opt_d" = .yes ]; then |
michael@13 | 1054 | month="$nummonth" |
michael@13 | 1055 | fi |
michael@13 | 1056 | |
michael@13 | 1057 | # Optionally shorten the month name to three characters |
michael@13 | 1058 | if [ ".$opt_s" = .yes ]; then |
michael@13 | 1059 | month=`echo $month | cut -c1-3` |
michael@13 | 1060 | fi |
michael@13 | 1061 | |
michael@13 | 1062 | # Output the resulting date string |
michael@13 | 1063 | echo dummy | awk '{ |
michael@13 | 1064 | for (i = 0; i < 3; i++) { |
michael@13 | 1065 | now = substr(order, 1, 1); |
michael@13 | 1066 | order = substr(order, 2); |
michael@13 | 1067 | if (now == "d") |
michael@13 | 1068 | out = day; |
michael@13 | 1069 | else if (now == "m") |
michael@13 | 1070 | out = month; |
michael@13 | 1071 | else if (now == "y") |
michael@13 | 1072 | out = year; |
michael@13 | 1073 | if (i < 2) |
michael@13 | 1074 | printf("%s%s", out, field); |
michael@13 | 1075 | else |
michael@13 | 1076 | printf("%s", out); |
michael@13 | 1077 | } |
michael@13 | 1078 | if (newline != "yes") |
michael@13 | 1079 | printf("\n"); |
michael@13 | 1080 | }' "day=$day" "month=$month" "year=$year" \ |
michael@13 | 1081 | "field=$opt_f" "order=$opt_o" "newline=$opt_n" |
michael@13 | 1082 | |
michael@13 | 1083 | shtool_exit 0 |
michael@13 | 1084 | ;; |
michael@13 | 1085 | |
michael@13 | 1086 | table ) |
michael@13 | 1087 | ## |
michael@13 | 1088 | ## table -- Pretty-print a field-separated list as a table |
michael@428 | 1089 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1090 | ## |
michael@13 | 1091 | |
michael@13 | 1092 | if [ $opt_c -gt 4 ]; then |
michael@13 | 1093 | echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2 |
michael@13 | 1094 | shtool_exit 1 |
michael@13 | 1095 | fi |
michael@13 | 1096 | case "x$opt_F" in |
michael@13 | 1097 | x? ) ;; |
michael@13 | 1098 | * ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_exit 1 ;; |
michael@13 | 1099 | esac |
michael@13 | 1100 | |
michael@13 | 1101 | # split the list into a table |
michael@13 | 1102 | list=` |
michael@13 | 1103 | IFS="$opt_F" |
michael@13 | 1104 | for entry in $*; do |
michael@13 | 1105 | if [ ".$entry" != . ]; then |
michael@13 | 1106 | echo "$entry" |
michael@13 | 1107 | fi |
michael@13 | 1108 | done |\ |
michael@13 | 1109 | awk " |
michael@13 | 1110 | BEGIN { list = \"\"; n = 0; } |
michael@13 | 1111 | { |
michael@13 | 1112 | list = list \\$1; |
michael@13 | 1113 | n = n + 1; |
michael@13 | 1114 | if (n < $opt_c) { |
michael@13 | 1115 | list = list \":\"; |
michael@13 | 1116 | } |
michael@13 | 1117 | if (n == $opt_c) { |
michael@13 | 1118 | list = list \"\\n\"; |
michael@13 | 1119 | n = 0; |
michael@13 | 1120 | } |
michael@13 | 1121 | } |
michael@13 | 1122 | END { print list; } |
michael@13 | 1123 | " |
michael@13 | 1124 | ` |
michael@13 | 1125 | |
michael@13 | 1126 | # format table cells and make sure table |
michael@13 | 1127 | # doesn't exceed maximum width |
michael@13 | 1128 | OIFS="$IFS" |
michael@13 | 1129 | IFS=' |
michael@13 | 1130 | ' |
michael@13 | 1131 | for entry in $list; do |
michael@13 | 1132 | case $opt_c in |
michael@13 | 1133 | 1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;; |
michael@13 | 1134 | 2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;; |
michael@13 | 1135 | 3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;; |
michael@13 | 1136 | 4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;; |
michael@13 | 1137 | esac |
michael@13 | 1138 | done |\ |
michael@13 | 1139 | awk "{ |
michael@13 | 1140 | if (length(\$0) > $opt_s) { |
michael@13 | 1141 | printf(\"%s\\n\", substr(\$0, 0, $opt_s-1)); |
michael@13 | 1142 | } else { |
michael@13 | 1143 | print \$0; |
michael@13 | 1144 | } |
michael@13 | 1145 | }" |
michael@13 | 1146 | IFS="$OIFS" |
michael@13 | 1147 | |
michael@13 | 1148 | shtool_exit 0 |
michael@13 | 1149 | ;; |
michael@13 | 1150 | |
michael@13 | 1151 | prop ) |
michael@13 | 1152 | ## |
michael@13 | 1153 | ## prop -- Display progress with a running propeller |
michael@428 | 1154 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1155 | ## |
michael@13 | 1156 | |
michael@13 | 1157 | perl='' |
michael@13 | 1158 | for dir in `echo $PATH | sed -e 's/:/ /g'` .; do |
michael@13 | 1159 | if [ -f "$dir/perl" ]; then |
michael@13 | 1160 | perl="$dir/perl" |
michael@13 | 1161 | break |
michael@13 | 1162 | fi |
michael@13 | 1163 | done |
michael@13 | 1164 | if [ ".$perl" != . ]; then |
michael@13 | 1165 | # Perl is preferred because writing to STDERR in |
michael@13 | 1166 | # Perl really writes immediately as one would expect |
michael@13 | 1167 | $perl -e ' |
michael@13 | 1168 | @p = ("|","/","-","\\"); |
michael@13 | 1169 | $i = 0; |
michael@13 | 1170 | while (<STDIN>) { |
michael@13 | 1171 | printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]); |
michael@13 | 1172 | $i = 0 if ($i > 3); |
michael@13 | 1173 | } |
michael@13 | 1174 | printf(STDERR "\r%s \n", $ARGV[0]); |
michael@13 | 1175 | ' "$opt_p" |
michael@13 | 1176 | else |
michael@13 | 1177 | # But if Perl doesn't exists we use Awk even |
michael@13 | 1178 | # some Awk's buffer even the /dev/stderr writing :-( |
michael@13 | 1179 | awk ' |
michael@13 | 1180 | BEGIN { |
michael@13 | 1181 | split("|#/#-#\\", p, "#"); |
michael@13 | 1182 | i = 1; |
michael@13 | 1183 | } |
michael@13 | 1184 | { |
michael@13 | 1185 | printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr"; |
michael@13 | 1186 | if (i > 4) { i = 1; } |
michael@13 | 1187 | } |
michael@13 | 1188 | END { |
michael@13 | 1189 | printf("\r%s \n", prefix) > "/dev/stderr"; |
michael@13 | 1190 | } |
michael@13 | 1191 | ' "prefix=$opt_p" |
michael@13 | 1192 | fi |
michael@13 | 1193 | |
michael@13 | 1194 | shtool_exit 0 |
michael@13 | 1195 | ;; |
michael@13 | 1196 | |
michael@13 | 1197 | move ) |
michael@13 | 1198 | ## |
michael@13 | 1199 | ## move -- Move files with simultaneous substitution |
michael@428 | 1200 | ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1201 | ## |
michael@13 | 1202 | |
michael@13 | 1203 | src="$1" |
michael@13 | 1204 | dst="$2" |
michael@13 | 1205 | |
michael@13 | 1206 | # consistency checks |
michael@13 | 1207 | if [ ".$src" = . ] || [ ".$dst" = . ]; then |
michael@13 | 1208 | echo "$msgprefix:Error: Invalid arguments" 1>&2 |
michael@13 | 1209 | shtool_exit 1 |
michael@13 | 1210 | fi |
michael@13 | 1211 | if [ ".$src" = ".$dst" ]; then |
michael@13 | 1212 | echo "$msgprefix:Error: Source and destination files are the same" 1>&2 |
michael@13 | 1213 | shtool_exit 1 |
michael@13 | 1214 | fi |
michael@13 | 1215 | expsrc="$src" |
michael@13 | 1216 | if [ ".$opt_e" = .yes ]; then |
michael@13 | 1217 | expsrc="`echo $expsrc`" |
michael@13 | 1218 | fi |
michael@13 | 1219 | if [ ".$opt_e" = .yes ]; then |
michael@13 | 1220 | if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then |
michael@13 | 1221 | echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2 |
michael@13 | 1222 | shtool_exit 1 |
michael@13 | 1223 | fi |
michael@13 | 1224 | if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then |
michael@13 | 1225 | echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2 |
michael@13 | 1226 | shtool_exit 1 |
michael@13 | 1227 | fi |
michael@13 | 1228 | if [ ".$expsrc" = ".$src" ]; then |
michael@13 | 1229 | echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2 |
michael@13 | 1230 | shtool_exit 1 |
michael@13 | 1231 | fi |
michael@13 | 1232 | else |
michael@13 | 1233 | if [ ! -r "$src" ]; then |
michael@13 | 1234 | echo "$msgprefix:Error: Source not found: $src" 1>&2 |
michael@13 | 1235 | shtool_exit 1 |
michael@13 | 1236 | fi |
michael@13 | 1237 | fi |
michael@13 | 1238 | |
michael@13 | 1239 | # determine substitution patterns |
michael@13 | 1240 | if [ ".$opt_e" = .yes ]; then |
michael@13 | 1241 | srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'` |
michael@13 | 1242 | dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'` |
michael@13 | 1243 | fi |
michael@13 | 1244 | |
michael@13 | 1245 | # iterate over source(s) |
michael@13 | 1246 | for onesrc in $expsrc; do |
michael@13 | 1247 | if [ .$opt_e = .yes ]; then |
michael@13 | 1248 | onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"` |
michael@13 | 1249 | else |
michael@13 | 1250 | onedst="$dst" |
michael@13 | 1251 | fi |
michael@13 | 1252 | errorstatus=0 |
michael@13 | 1253 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1254 | echo "$onesrc -> $onedst" |
michael@13 | 1255 | fi |
michael@13 | 1256 | if [ ".$opt_p" = .yes ]; then |
michael@13 | 1257 | if [ -r $onedst ]; then |
michael@13 | 1258 | if cmp -s $onesrc $onedst; then |
michael@13 | 1259 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1260 | echo "rm -f $onesrc" 1>&2 |
michael@13 | 1261 | fi |
michael@13 | 1262 | rm -f $onesrc || errorstatus=$? |
michael@13 | 1263 | else |
michael@13 | 1264 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1265 | echo "mv -f $onesrc $onedst" 1>&2 |
michael@13 | 1266 | fi |
michael@13 | 1267 | mv -f $onesrc $onedst || errorstatus=$? |
michael@13 | 1268 | fi |
michael@13 | 1269 | else |
michael@13 | 1270 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1271 | echo "mv -f $onesrc $onedst" 1>&2 |
michael@13 | 1272 | fi |
michael@13 | 1273 | mv -f $onesrc $onedst || errorstatus=$? |
michael@13 | 1274 | fi |
michael@13 | 1275 | else |
michael@13 | 1276 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1277 | echo "mv -f $onesrc $onedst" 1>&2 |
michael@13 | 1278 | fi |
michael@13 | 1279 | mv -f $onesrc $onedst || errorstatus=$? |
michael@13 | 1280 | fi |
michael@13 | 1281 | if [ $errorstatus -ne 0 ]; then |
michael@13 | 1282 | break; |
michael@13 | 1283 | fi |
michael@13 | 1284 | done |
michael@13 | 1285 | |
michael@13 | 1286 | shtool_exit $errorstatus |
michael@13 | 1287 | ;; |
michael@13 | 1288 | |
michael@13 | 1289 | install ) |
michael@13 | 1290 | ## |
michael@13 | 1291 | ## install -- Install a program, script or datafile |
michael@428 | 1292 | ## Copyright (c) 1997-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1293 | ## |
michael@13 | 1294 | |
michael@13 | 1295 | # special case: "shtool install -d <dir> [...]" internally |
michael@13 | 1296 | # maps to "shtool mkdir -f -p -m 755 <dir> [...]" |
michael@13 | 1297 | if [ "$opt_d" = yes ]; then |
michael@13 | 1298 | cmd="$0 mkdir -f -p -m 755" |
michael@13 | 1299 | if [ ".$opt_o" != . ]; then |
michael@13 | 1300 | cmd="$cmd -o '$opt_o'" |
michael@13 | 1301 | fi |
michael@13 | 1302 | if [ ".$opt_g" != . ]; then |
michael@13 | 1303 | cmd="$cmd -g '$opt_g'" |
michael@13 | 1304 | fi |
michael@13 | 1305 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1306 | cmd="$cmd -v" |
michael@13 | 1307 | fi |
michael@13 | 1308 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1309 | cmd="$cmd -t" |
michael@13 | 1310 | fi |
michael@13 | 1311 | for dir in "$@"; do |
michael@13 | 1312 | eval "$cmd $dir" || shtool_exit $? |
michael@13 | 1313 | done |
michael@13 | 1314 | shtool_exit 0 |
michael@13 | 1315 | fi |
michael@13 | 1316 | |
michael@13 | 1317 | # determine source(s) and destination |
michael@13 | 1318 | argc=$# |
michael@13 | 1319 | srcs="" |
michael@13 | 1320 | while [ $# -gt 1 ]; do |
michael@13 | 1321 | srcs="$srcs $1" |
michael@13 | 1322 | shift |
michael@13 | 1323 | done |
michael@13 | 1324 | dstpath="$1" |
michael@13 | 1325 | |
michael@13 | 1326 | # type check for destination |
michael@13 | 1327 | dstisdir=0 |
michael@13 | 1328 | if [ -d $dstpath ]; then |
michael@13 | 1329 | dstpath=`echo "$dstpath" | sed -e 's:/$::'` |
michael@13 | 1330 | dstisdir=1 |
michael@13 | 1331 | fi |
michael@13 | 1332 | |
michael@13 | 1333 | # consistency check for destination |
michael@13 | 1334 | if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then |
michael@13 | 1335 | echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 |
michael@13 | 1336 | shtool_exit 1 |
michael@13 | 1337 | fi |
michael@13 | 1338 | |
michael@13 | 1339 | # iterate over all source(s) |
michael@13 | 1340 | for src in $srcs; do |
michael@13 | 1341 | dst=$dstpath |
michael@13 | 1342 | |
michael@13 | 1343 | # if destination is a directory, append the input filename |
michael@13 | 1344 | if [ $dstisdir = 1 ]; then |
michael@13 | 1345 | dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 1346 | dst="$dst/$dstfile" |
michael@13 | 1347 | fi |
michael@13 | 1348 | |
michael@13 | 1349 | # check for correct arguments |
michael@13 | 1350 | if [ ".$src" = ".$dst" ]; then |
michael@13 | 1351 | echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 |
michael@13 | 1352 | continue |
michael@13 | 1353 | fi |
michael@13 | 1354 | if [ -d "$src" ]; then |
michael@13 | 1355 | echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 |
michael@13 | 1356 | continue |
michael@13 | 1357 | fi |
michael@13 | 1358 | |
michael@13 | 1359 | # make a temp file name in the destination directory |
michael@13 | 1360 | dsttmp=`echo $dst |\ |
michael@13 | 1361 | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ |
michael@13 | 1362 | -e "s;\$;/#INST@$$#;"` |
michael@13 | 1363 | |
michael@13 | 1364 | # verbosity |
michael@13 | 1365 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1366 | echo "$src -> $dst" 1>&2 |
michael@13 | 1367 | fi |
michael@13 | 1368 | |
michael@13 | 1369 | # copy or move the file name to the temp name |
michael@13 | 1370 | # (because we might be not allowed to change the source) |
michael@13 | 1371 | if [ ".$opt_C" = .yes ]; then |
michael@13 | 1372 | opt_c=yes |
michael@13 | 1373 | fi |
michael@13 | 1374 | if [ ".$opt_c" = .yes ]; then |
michael@13 | 1375 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1376 | echo "cp $src $dsttmp" 1>&2 |
michael@13 | 1377 | fi |
michael@13 | 1378 | cp "$src" "$dsttmp" || shtool_exit $? |
michael@13 | 1379 | else |
michael@13 | 1380 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1381 | echo "mv $src $dsttmp" 1>&2 |
michael@13 | 1382 | fi |
michael@13 | 1383 | mv "$src" "$dsttmp" || shtool_exit $? |
michael@13 | 1384 | fi |
michael@13 | 1385 | |
michael@13 | 1386 | # adjust the target file |
michael@13 | 1387 | if [ ".$opt_e" != . ]; then |
michael@13 | 1388 | sed='sed' |
michael@13 | 1389 | OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" |
michael@13 | 1390 | for e |
michael@13 | 1391 | do |
michael@13 | 1392 | sed="$sed -e '$e'" |
michael@13 | 1393 | done |
michael@13 | 1394 | cp "$dsttmp" "$dsttmp.old" |
michael@13 | 1395 | chmod u+w $dsttmp |
michael@13 | 1396 | eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $? |
michael@13 | 1397 | rm -f $dsttmp.old |
michael@13 | 1398 | fi |
michael@13 | 1399 | if [ ".$opt_s" = .yes ]; then |
michael@13 | 1400 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1401 | echo "strip $dsttmp" 1>&2 |
michael@13 | 1402 | fi |
michael@13 | 1403 | strip $dsttmp || shtool_exit $? |
michael@13 | 1404 | fi |
michael@13 | 1405 | if [ ".$opt_o" != . ]; then |
michael@13 | 1406 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1407 | echo "chown $opt_o $dsttmp" 1>&2 |
michael@13 | 1408 | fi |
michael@13 | 1409 | chown $opt_o $dsttmp || shtool_exit $? |
michael@13 | 1410 | fi |
michael@13 | 1411 | if [ ".$opt_g" != . ]; then |
michael@13 | 1412 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1413 | echo "chgrp $opt_g $dsttmp" 1>&2 |
michael@13 | 1414 | fi |
michael@13 | 1415 | chgrp $opt_g $dsttmp || shtool_exit $? |
michael@13 | 1416 | fi |
michael@13 | 1417 | if [ ".$opt_m" != ".-" ]; then |
michael@13 | 1418 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1419 | echo "chmod $opt_m $dsttmp" 1>&2 |
michael@13 | 1420 | fi |
michael@13 | 1421 | chmod $opt_m $dsttmp || shtool_exit $? |
michael@13 | 1422 | fi |
michael@13 | 1423 | |
michael@13 | 1424 | # determine whether to do a quick install |
michael@13 | 1425 | # (has to be done _after_ the strip was already done) |
michael@13 | 1426 | quick=no |
michael@13 | 1427 | if [ ".$opt_C" = .yes ]; then |
michael@13 | 1428 | if [ -r $dst ]; then |
michael@13 | 1429 | if cmp -s "$src" "$dst"; then |
michael@13 | 1430 | quick=yes |
michael@13 | 1431 | fi |
michael@13 | 1432 | fi |
michael@13 | 1433 | fi |
michael@13 | 1434 | |
michael@13 | 1435 | # finally, install the file to the real destination |
michael@13 | 1436 | if [ $quick = yes ]; then |
michael@13 | 1437 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1438 | echo "rm -f $dsttmp" 1>&2 |
michael@13 | 1439 | fi |
michael@13 | 1440 | rm -f $dsttmp |
michael@13 | 1441 | else |
michael@13 | 1442 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1443 | echo "rm -f $dst && mv $dsttmp $dst" 1>&2 |
michael@13 | 1444 | fi |
michael@13 | 1445 | rm -f $dst && mv $dsttmp $dst |
michael@13 | 1446 | fi |
michael@13 | 1447 | done |
michael@13 | 1448 | |
michael@13 | 1449 | shtool_exit 0 |
michael@13 | 1450 | ;; |
michael@13 | 1451 | |
michael@13 | 1452 | mkdir ) |
michael@13 | 1453 | ## |
michael@13 | 1454 | ## mkdir -- Make one or more directories |
michael@428 | 1455 | ## Copyright (c) 1996-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1456 | ## |
michael@13 | 1457 | |
michael@13 | 1458 | errstatus=0 |
michael@13 | 1459 | for p in ${1+"$@"}; do |
michael@13 | 1460 | # if the directory already exists... |
michael@13 | 1461 | if [ -d "$p" ]; then |
michael@13 | 1462 | if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then |
michael@13 | 1463 | echo "$msgprefix:Error: directory already exists: $p" 1>&2 |
michael@13 | 1464 | errstatus=1 |
michael@13 | 1465 | break |
michael@13 | 1466 | else |
michael@13 | 1467 | continue |
michael@13 | 1468 | fi |
michael@13 | 1469 | fi |
michael@13 | 1470 | # if the directory has to be created... |
michael@13 | 1471 | if [ ".$opt_p" = .no ]; then |
michael@13 | 1472 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1473 | echo "mkdir $p" 1>&2 |
michael@13 | 1474 | fi |
michael@13 | 1475 | mkdir $p || errstatus=$? |
michael@13 | 1476 | if [ ".$opt_o" != . ]; then |
michael@13 | 1477 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1478 | echo "chown $opt_o $p" 1>&2 |
michael@13 | 1479 | fi |
michael@13 | 1480 | chown $opt_o $p || errstatus=$? |
michael@13 | 1481 | fi |
michael@13 | 1482 | if [ ".$opt_g" != . ]; then |
michael@13 | 1483 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1484 | echo "chgrp $opt_g $p" 1>&2 |
michael@13 | 1485 | fi |
michael@13 | 1486 | chgrp $opt_g $p || errstatus=$? |
michael@13 | 1487 | fi |
michael@13 | 1488 | if [ ".$opt_m" != . ]; then |
michael@13 | 1489 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1490 | echo "chmod $opt_m $p" 1>&2 |
michael@13 | 1491 | fi |
michael@13 | 1492 | chmod $opt_m $p || errstatus=$? |
michael@13 | 1493 | fi |
michael@13 | 1494 | else |
michael@13 | 1495 | # the smart situation |
michael@13 | 1496 | set fnord `echo ":$p" |\ |
michael@13 | 1497 | sed -e 's/^:\//%/' \ |
michael@13 | 1498 | -e 's/^://' \ |
michael@13 | 1499 | -e 's/\// /g' \ |
michael@13 | 1500 | -e 's/^%/\//'` |
michael@13 | 1501 | shift |
michael@13 | 1502 | pathcomp='' |
michael@13 | 1503 | for d in ${1+"$@"}; do |
michael@13 | 1504 | pathcomp="$pathcomp$d" |
michael@13 | 1505 | case "$pathcomp" in |
michael@13 | 1506 | -* ) pathcomp="./$pathcomp" ;; |
michael@13 | 1507 | esac |
michael@13 | 1508 | if [ ! -d "$pathcomp" ]; then |
michael@13 | 1509 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1510 | echo "mkdir $pathcomp" 1>&2 |
michael@13 | 1511 | fi |
michael@13 | 1512 | mkdir $pathcomp || errstatus=$? |
michael@13 | 1513 | if [ ".$opt_o" != . ]; then |
michael@13 | 1514 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1515 | echo "chown $opt_o $pathcomp" 1>&2 |
michael@13 | 1516 | fi |
michael@13 | 1517 | chown $opt_o $pathcomp || errstatus=$? |
michael@13 | 1518 | fi |
michael@13 | 1519 | if [ ".$opt_g" != . ]; then |
michael@13 | 1520 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1521 | echo "chgrp $opt_g $pathcomp" 1>&2 |
michael@13 | 1522 | fi |
michael@13 | 1523 | chgrp $opt_g $pathcomp || errstatus=$? |
michael@13 | 1524 | fi |
michael@13 | 1525 | if [ ".$opt_m" != . ]; then |
michael@13 | 1526 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1527 | echo "chmod $opt_m $pathcomp" 1>&2 |
michael@13 | 1528 | fi |
michael@13 | 1529 | chmod $opt_m $pathcomp || errstatus=$? |
michael@13 | 1530 | fi |
michael@13 | 1531 | fi |
michael@13 | 1532 | pathcomp="$pathcomp/" |
michael@13 | 1533 | done |
michael@13 | 1534 | fi |
michael@13 | 1535 | done |
michael@13 | 1536 | |
michael@13 | 1537 | shtool_exit $errstatus |
michael@13 | 1538 | ;; |
michael@13 | 1539 | |
michael@13 | 1540 | mkln ) |
michael@13 | 1541 | ## |
michael@13 | 1542 | ## mkln -- Make link with calculation of relative paths |
michael@428 | 1543 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1544 | ## |
michael@13 | 1545 | |
michael@13 | 1546 | # determine source(s) and destination |
michael@428 | 1547 | args=$# |
michael@13 | 1548 | srcs="" |
michael@13 | 1549 | while [ $# -gt 1 ]; do |
michael@13 | 1550 | srcs="$srcs $1" |
michael@13 | 1551 | shift |
michael@13 | 1552 | done |
michael@13 | 1553 | dst="$1" |
michael@13 | 1554 | if [ ! -d $dst ]; then |
michael@13 | 1555 | if [ $args -gt 2 ]; then |
michael@13 | 1556 | echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2 |
michael@13 | 1557 | shtool_exit 1 |
michael@13 | 1558 | fi |
michael@13 | 1559 | fi |
michael@13 | 1560 | |
michael@13 | 1561 | # determine link options |
michael@13 | 1562 | lnopt="" |
michael@13 | 1563 | if [ ".$opt_f" = .yes ]; then |
michael@13 | 1564 | lnopt="$lnopt -f" |
michael@13 | 1565 | fi |
michael@13 | 1566 | if [ ".$opt_s" = .yes ]; then |
michael@13 | 1567 | lnopt="$lnopt -s" |
michael@13 | 1568 | fi |
michael@13 | 1569 | |
michael@13 | 1570 | # iterate over sources |
michael@13 | 1571 | for src in $srcs; do |
michael@13 | 1572 | # determine if one of the paths is an absolute path, |
michael@13 | 1573 | # because then we _have_ to use an absolute symlink |
michael@13 | 1574 | oneisabs=0 |
michael@13 | 1575 | srcisabs=0 |
michael@13 | 1576 | dstisabs=0 |
michael@13 | 1577 | case $src in |
michael@13 | 1578 | /* ) oneisabs=1; srcisabs=1 ;; |
michael@13 | 1579 | esac |
michael@13 | 1580 | case $dst in |
michael@13 | 1581 | /* ) oneisabs=1; dstisabs=1 ;; |
michael@13 | 1582 | esac |
michael@13 | 1583 | |
michael@13 | 1584 | # split source and destination into dir and base name |
michael@13 | 1585 | if [ -d $src ]; then |
michael@13 | 1586 | srcdir=`echo $src | sed -e 's;/*$;;'` |
michael@13 | 1587 | srcbase="" |
michael@13 | 1588 | else |
michael@13 | 1589 | srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` |
michael@13 | 1590 | srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 1591 | fi |
michael@13 | 1592 | if [ -d $dst ]; then |
michael@13 | 1593 | dstdir=`echo $dst | sed -e 's;/*$;;'` |
michael@13 | 1594 | dstbase="" |
michael@13 | 1595 | else |
michael@13 | 1596 | dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` |
michael@13 | 1597 | dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 1598 | fi |
michael@13 | 1599 | |
michael@13 | 1600 | # consistency check |
michael@13 | 1601 | if [ ".$dstdir" != . ]; then |
michael@13 | 1602 | if [ ! -d $dstdir ]; then |
michael@13 | 1603 | echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2 |
michael@13 | 1604 | shtool_exit 1 |
michael@13 | 1605 | fi |
michael@13 | 1606 | fi |
michael@13 | 1607 | |
michael@13 | 1608 | # make sure the source is reachable from the destination |
michael@13 | 1609 | if [ $dstisabs = 1 ]; then |
michael@13 | 1610 | if [ $srcisabs = 0 ]; then |
michael@13 | 1611 | if [ ".$srcdir" = . ]; then |
michael@13 | 1612 | srcdir="`pwd | sed -e 's;/*$;;'`" |
michael@13 | 1613 | srcisabs=1 |
michael@13 | 1614 | oneisabs=1 |
michael@13 | 1615 | elif [ -d $srcdir ]; then |
michael@13 | 1616 | srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`" |
michael@13 | 1617 | srcisabs=1 |
michael@13 | 1618 | oneisabs=1 |
michael@13 | 1619 | fi |
michael@13 | 1620 | fi |
michael@13 | 1621 | fi |
michael@13 | 1622 | |
michael@13 | 1623 | # split away a common prefix |
michael@13 | 1624 | prefix="" |
michael@13 | 1625 | if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then |
michael@13 | 1626 | prefix="$srcdir/" |
michael@13 | 1627 | srcdir="" |
michael@13 | 1628 | dstdir="" |
michael@13 | 1629 | else |
michael@13 | 1630 | while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do |
michael@428 | 1631 | presrc=`echo $srcdir | sed -e 's;^\([^/][^/]*\)/.*;\1;'` |
michael@428 | 1632 | predst=`echo $dstdir | sed -e 's;^\([^/][^/]*\)/.*;\1;'` |
michael@13 | 1633 | if [ ".$presrc" != ".$predst" ]; then |
michael@13 | 1634 | break |
michael@13 | 1635 | fi |
michael@13 | 1636 | prefix="$prefix$presrc/" |
michael@428 | 1637 | srcdir=`echo $srcdir | sed -e 's;^[^/][^/]*/*;;'` |
michael@428 | 1638 | dstdir=`echo $dstdir | sed -e 's;^[^/][^/]*/*;;'` |
michael@13 | 1639 | done |
michael@13 | 1640 | fi |
michael@13 | 1641 | |
michael@13 | 1642 | # destination prefix is just the common prefix |
michael@13 | 1643 | dstpre="$prefix" |
michael@13 | 1644 | |
michael@13 | 1645 | # determine source prefix which is the reverse directory |
michael@13 | 1646 | # step-up corresponding to the destination directory |
michael@13 | 1647 | srcpre="" |
michael@13 | 1648 | allow_relative_srcpre=no |
michael@13 | 1649 | if [ ".$prefix" != . ] && [ ".$prefix" != ./ ]; then |
michael@13 | 1650 | allow_relative_srcpre=yes |
michael@428 | 1651 | fi |
michael@13 | 1652 | if [ $oneisabs = 0 ]; then |
michael@13 | 1653 | allow_relative_srcpre=yes |
michael@428 | 1654 | fi |
michael@13 | 1655 | if [ ".$opt_s" != .yes ]; then |
michael@13 | 1656 | allow_relative_srcpre=no |
michael@428 | 1657 | fi |
michael@13 | 1658 | if [ ".$allow_relative_srcpre" = .yes ]; then |
michael@13 | 1659 | pl="$dstdir/" |
michael@13 | 1660 | OIFS="$IFS"; IFS='/' |
michael@13 | 1661 | for pe in $pl; do |
michael@13 | 1662 | [ ".$pe" = . ] && continue |
michael@13 | 1663 | [ ".$pe" = .. ] && continue |
michael@13 | 1664 | srcpre="../$srcpre" |
michael@13 | 1665 | done |
michael@13 | 1666 | IFS="$OIFS" |
michael@13 | 1667 | else |
michael@13 | 1668 | if [ $srcisabs = 1 ]; then |
michael@13 | 1669 | srcpre="$prefix" |
michael@13 | 1670 | fi |
michael@13 | 1671 | fi |
michael@13 | 1672 | |
michael@13 | 1673 | # determine destination symlink name |
michael@13 | 1674 | if [ ".$dstbase" = . ]; then |
michael@13 | 1675 | if [ ".$srcbase" != . ]; then |
michael@13 | 1676 | dstbase="$srcbase" |
michael@13 | 1677 | else |
michael@13 | 1678 | dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 1679 | fi |
michael@13 | 1680 | fi |
michael@13 | 1681 | |
michael@428 | 1682 | # special case (usually on "mkln -s /foo /foo/bar", etc) |
michael@428 | 1683 | if [ ".$srcpre$srcdir$srcbase" = . ]; then |
michael@428 | 1684 | srcdir="." |
michael@428 | 1685 | fi |
michael@428 | 1686 | |
michael@13 | 1687 | # now finalize source and destination directory paths |
michael@13 | 1688 | srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'` |
michael@13 | 1689 | dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'` |
michael@13 | 1690 | |
michael@13 | 1691 | # run the final link command |
michael@13 | 1692 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1693 | echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase" |
michael@13 | 1694 | fi |
michael@13 | 1695 | eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase |
michael@13 | 1696 | done |
michael@13 | 1697 | |
michael@13 | 1698 | shtool_exit 0 |
michael@13 | 1699 | ;; |
michael@13 | 1700 | |
michael@13 | 1701 | mkshadow ) |
michael@13 | 1702 | ## |
michael@13 | 1703 | ## mkshadow -- Make a shadow tree through symbolic links |
michael@428 | 1704 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1705 | ## |
michael@13 | 1706 | |
michael@13 | 1707 | # source and destination directory |
michael@13 | 1708 | src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` |
michael@13 | 1709 | dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` |
michael@13 | 1710 | |
michael@13 | 1711 | # check whether source exists |
michael@13 | 1712 | if [ ! -d $src ]; then |
michael@13 | 1713 | echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2 |
michael@13 | 1714 | shtool_exit 1 |
michael@13 | 1715 | fi |
michael@13 | 1716 | |
michael@13 | 1717 | # determine if one of the paths is an absolute path, |
michael@13 | 1718 | # because then we have to use an absolute symlink |
michael@13 | 1719 | oneisabs=0 |
michael@13 | 1720 | case $src in |
michael@13 | 1721 | /* ) oneisabs=1 ;; |
michael@13 | 1722 | esac |
michael@13 | 1723 | case $dst in |
michael@13 | 1724 | /* ) oneisabs=1 ;; |
michael@13 | 1725 | esac |
michael@13 | 1726 | |
michael@13 | 1727 | # determine reverse directory for destination directory |
michael@13 | 1728 | dstrevdir='' |
michael@13 | 1729 | if [ $oneisabs = 0 ]; then |
michael@13 | 1730 | # derive reverse path from forward path |
michael@13 | 1731 | pwd=`pwd` |
michael@13 | 1732 | OIFS="$IFS"; IFS='/' |
michael@13 | 1733 | for pe in $dst; do |
michael@13 | 1734 | if [ "x$pe" = "x.." ]; then |
michael@13 | 1735 | OIFS2="$IFS"; IFS="$DIFS" |
michael@13 | 1736 | eval `echo "$pwd" |\ |
michael@13 | 1737 | sed -e 's:\([^/]*\)$:; dir="\1":' \ |
michael@13 | 1738 | -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\ |
michael@13 | 1739 | -e 's:^;:pwd="";:'` |
michael@13 | 1740 | dstrevdir="$dir/$dstrevdir" |
michael@13 | 1741 | IFS="$OIFS2" |
michael@13 | 1742 | else |
michael@13 | 1743 | dstrevdir="../$dstrevdir" |
michael@13 | 1744 | fi |
michael@13 | 1745 | done |
michael@13 | 1746 | IFS="$OIFS" |
michael@13 | 1747 | else |
michael@13 | 1748 | src="`cd $src; pwd`"; |
michael@13 | 1749 | fi |
michael@13 | 1750 | |
michael@13 | 1751 | # create directory tree at destination |
michael@13 | 1752 | if [ ! -d $dst ]; then |
michael@13 | 1753 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1754 | echo "mkdir $dst" 1>&2 |
michael@13 | 1755 | fi |
michael@13 | 1756 | mkdir $dst |
michael@13 | 1757 | fi |
michael@13 | 1758 | if [ ".$opt_a" = .yes ]; then |
michael@13 | 1759 | DIRS=`cd $src; find . -type d -print |\ |
michael@13 | 1760 | sed -e '/^\.$/d' -e 's:^\./::'` |
michael@13 | 1761 | else |
michael@13 | 1762 | DIRS=`cd $src; find . -type d -print |\ |
michael@13 | 1763 | sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'` |
michael@13 | 1764 | fi |
michael@13 | 1765 | for dir in $DIRS; do |
michael@13 | 1766 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1767 | echo "mkdir $dst/$dir" 1>&2 |
michael@13 | 1768 | fi |
michael@13 | 1769 | mkdir $dst/$dir |
michael@13 | 1770 | done |
michael@13 | 1771 | |
michael@13 | 1772 | # fill directory tree with symlinks to files |
michael@13 | 1773 | if [ ".$opt_a" = .yes ]; then |
michael@13 | 1774 | FILES="`cd $src; find . -depth -print |\ |
michael@13 | 1775 | sed -e 's/^\.\///'`" |
michael@13 | 1776 | else |
michael@13 | 1777 | FILES="`cd $src; find . -depth -print |\ |
michael@13 | 1778 | sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \ |
michael@13 | 1779 | -e '/\.cvsignore$/d' -e '/\/CVS/d' \ |
michael@13 | 1780 | -e '/\/\.#/d' -e '/\.orig$/d' \ |
michael@13 | 1781 | -e 's/^\.\///'`" |
michael@13 | 1782 | fi |
michael@13 | 1783 | for file in $FILES; do |
michael@13 | 1784 | # don't use `-type f' above for find because of symlinks |
michael@13 | 1785 | if [ -d "$src/$file" ]; then |
michael@13 | 1786 | continue |
michael@13 | 1787 | fi |
michael@13 | 1788 | basename=`echo $file | sed -e 's:^.*/::'` |
michael@13 | 1789 | dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'` |
michael@13 | 1790 | from=`echo "$src/$file" | sed -e 's/^\.\///'` |
michael@13 | 1791 | to="$dst/$dir$basename" |
michael@13 | 1792 | if [ $oneisabs = 0 ]; then |
michael@13 | 1793 | if [ ".$dir" != . ]; then |
michael@13 | 1794 | subdir=`echo $dir | sed -e 's:/$::'` |
michael@13 | 1795 | # derive reverse path from forward path |
michael@13 | 1796 | revdir='' |
michael@13 | 1797 | OIFS="$IFS"; IFS='/' |
michael@13 | 1798 | for pe in $subdir; do |
michael@13 | 1799 | revdir="../$revdir" |
michael@13 | 1800 | done |
michael@13 | 1801 | IFS="$OIFS" |
michael@13 | 1802 | # finalize from |
michael@13 | 1803 | from="$revdir$from" |
michael@13 | 1804 | fi |
michael@13 | 1805 | from="$dstrevdir$from" |
michael@13 | 1806 | fi |
michael@13 | 1807 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1808 | echo " $to" 1>&2 |
michael@13 | 1809 | fi |
michael@13 | 1810 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1811 | echo "ln -s $from $to" 1>&2 |
michael@13 | 1812 | fi |
michael@13 | 1813 | ln -s $from $to |
michael@13 | 1814 | done |
michael@13 | 1815 | |
michael@13 | 1816 | shtool_exit 0 |
michael@13 | 1817 | ;; |
michael@13 | 1818 | |
michael@13 | 1819 | fixperm ) |
michael@13 | 1820 | ## |
michael@13 | 1821 | ## fixperm -- Fix file permissions inside a source tree |
michael@428 | 1822 | ## Copyright (c) 1996-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1823 | ## |
michael@13 | 1824 | |
michael@13 | 1825 | paths="$*" |
michael@13 | 1826 | |
michael@13 | 1827 | # check whether the test command supports the -x option |
michael@13 | 1828 | if [ -x /bin/sh ] 2>/dev/null; then |
michael@13 | 1829 | minusx="-x" |
michael@13 | 1830 | else |
michael@13 | 1831 | minusx="-r" |
michael@13 | 1832 | fi |
michael@13 | 1833 | |
michael@13 | 1834 | # iterate over paths |
michael@13 | 1835 | for p in $paths; do |
michael@13 | 1836 | for file in `find $p -depth -print`; do |
michael@13 | 1837 | if [ -f $file ]; then |
michael@13 | 1838 | if [ $minusx $file ]; then |
michael@13 | 1839 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1840 | echo "-rwxr-xr-x $file" 2>&1 |
michael@13 | 1841 | fi |
michael@13 | 1842 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1843 | echo "chmod 755 $file" 2>&1 |
michael@13 | 1844 | fi |
michael@13 | 1845 | chmod 755 $file |
michael@13 | 1846 | else |
michael@13 | 1847 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1848 | echo "-rw-r--r-- $file" 2>&1 |
michael@13 | 1849 | fi |
michael@13 | 1850 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1851 | echo "chmod 644 $file" 2>&1 |
michael@13 | 1852 | fi |
michael@13 | 1853 | chmod 644 $file |
michael@13 | 1854 | fi |
michael@13 | 1855 | continue |
michael@13 | 1856 | fi |
michael@13 | 1857 | if [ -d $file ]; then |
michael@13 | 1858 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1859 | echo "drwxr-xr-x $file" 2>&1 |
michael@13 | 1860 | fi |
michael@13 | 1861 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 1862 | echo "chmod 755 $file" 2>&1 |
michael@13 | 1863 | fi |
michael@13 | 1864 | chmod 755 $file |
michael@13 | 1865 | continue |
michael@13 | 1866 | fi |
michael@13 | 1867 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 1868 | echo "?????????? $file" 2>&1 |
michael@13 | 1869 | fi |
michael@13 | 1870 | done |
michael@13 | 1871 | done |
michael@13 | 1872 | |
michael@13 | 1873 | shtool_exit 0 |
michael@13 | 1874 | ;; |
michael@13 | 1875 | |
michael@13 | 1876 | rotate ) |
michael@13 | 1877 | ## |
michael@13 | 1878 | ## rotate -- Logfile rotation |
michael@428 | 1879 | ## Copyright (c) 2001-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 1880 | ## |
michael@13 | 1881 | |
michael@13 | 1882 | # make sure we have at least one file to rotate |
michael@13 | 1883 | if [ ".$opt_n" = .0 ]; then |
michael@13 | 1884 | echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2 |
michael@13 | 1885 | shtool_exit 1 |
michael@13 | 1886 | fi |
michael@13 | 1887 | |
michael@13 | 1888 | # canonicalize -s option argument |
michael@13 | 1889 | if [ ".$opt_s" != . ]; then |
michael@13 | 1890 | if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then |
michael@13 | 1891 | : |
michael@13 | 1892 | elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then |
michael@13 | 1893 | opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'` |
michael@13 | 1894 | opt_s=`expr $opt_s \* 1024` |
michael@13 | 1895 | elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then |
michael@13 | 1896 | opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'` |
michael@13 | 1897 | opt_s=`expr $opt_s \* 1048576` # 1024*1024 |
michael@13 | 1898 | elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then |
michael@13 | 1899 | opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'` |
michael@13 | 1900 | opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024 |
michael@13 | 1901 | else |
michael@13 | 1902 | echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2 |
michael@13 | 1903 | shtool_exit 1 |
michael@13 | 1904 | fi |
michael@13 | 1905 | fi |
michael@13 | 1906 | |
michael@13 | 1907 | # option -d/-z consistency |
michael@13 | 1908 | if [ ".$opt_d" = .yes ] && [ ".$opt_z" = . ]; then |
michael@13 | 1909 | echo "$msgprefix:Error: option -d requires option -z." 1>&2 |
michael@13 | 1910 | shtool_exit 1 |
michael@13 | 1911 | fi |
michael@13 | 1912 | |
michael@13 | 1913 | # make sure target directory exists |
michael@13 | 1914 | if [ ".$opt_a" != . ]; then |
michael@13 | 1915 | if [ ! -d $opt_a ]; then |
michael@13 | 1916 | if [ ".$opt_f" = .no ]; then |
michael@13 | 1917 | echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2 |
michael@13 | 1918 | shtool_exit 1 |
michael@13 | 1919 | fi |
michael@13 | 1920 | mkdir $opt_a || shtool_exit $? |
michael@13 | 1921 | chmod 755 $opt_a |
michael@13 | 1922 | fi |
michael@13 | 1923 | if [ ! -w $opt_a ]; then |
michael@13 | 1924 | echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2 |
michael@13 | 1925 | shtool_exit 1 |
michael@13 | 1926 | fi |
michael@13 | 1927 | fi |
michael@13 | 1928 | |
michael@13 | 1929 | # determine compression approach |
michael@13 | 1930 | if [ ".$opt_z" != . ]; then |
michael@13 | 1931 | comp_lvl="$opt_z" |
michael@13 | 1932 | comp_prg="" |
michael@13 | 1933 | case $comp_lvl in |
michael@13 | 1934 | *:* ) eval `echo $comp_lvl |\ |
michael@13 | 1935 | sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;; |
michael@13 | 1936 | esac |
michael@13 | 1937 | |
michael@13 | 1938 | # compression level consistency |
michael@13 | 1939 | case $comp_lvl in |
michael@13 | 1940 | [0-9] ) |
michael@13 | 1941 | ;; |
michael@13 | 1942 | * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2 |
michael@13 | 1943 | shtool_exit 1 |
michael@13 | 1944 | ;; |
michael@13 | 1945 | esac |
michael@13 | 1946 | |
michael@13 | 1947 | # determine a suitable compression tool |
michael@13 | 1948 | if [ ".$comp_prg" = . ]; then |
michael@13 | 1949 | # check whether the test command supports the -x option |
michael@13 | 1950 | if [ -x /bin/sh ] 2>/dev/null; then |
michael@13 | 1951 | minusx="-x" |
michael@13 | 1952 | else |
michael@13 | 1953 | minusx="-r" |
michael@13 | 1954 | fi |
michael@13 | 1955 | # search for tools in $PATH |
michael@13 | 1956 | paths="`echo $PATH |\ |
michael@13 | 1957 | sed -e 's%/*:%:%g' -e 's%/*$%%' \ |
michael@13 | 1958 | -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ |
michael@13 | 1959 | -e 's/:/ /g'`" |
michael@13 | 1960 | for prg in bzip2 gzip compress; do |
michael@13 | 1961 | for path in $paths; do |
michael@13 | 1962 | if [ $minusx "$path/$prg" ] && [ ! -d "$path/$prg" ]; then |
michael@13 | 1963 | comp_prg="$prg" |
michael@13 | 1964 | break |
michael@13 | 1965 | fi |
michael@13 | 1966 | done |
michael@13 | 1967 | if [ ".$comp_prg" != . ]; then |
michael@13 | 1968 | break |
michael@13 | 1969 | fi |
michael@13 | 1970 | done |
michael@13 | 1971 | if [ ".$comp_prg" = . ]; then |
michael@13 | 1972 | echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2 |
michael@13 | 1973 | shtool_exit 1 |
michael@13 | 1974 | fi |
michael@13 | 1975 | fi |
michael@13 | 1976 | |
michael@13 | 1977 | # determine standard compression extension |
michael@13 | 1978 | # and make sure it is a known tool |
michael@13 | 1979 | case $comp_prg in |
michael@13 | 1980 | */bzip2 | bzip2 ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;; |
michael@13 | 1981 | */gzip | gzip ) comp_ext="gz" comp_lvl="-$comp_lvl" ;; |
michael@13 | 1982 | */compress | compress ) comp_ext="Z"; comp_lvl="" ;; |
michael@13 | 1983 | * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2 |
michael@13 | 1984 | shtool_exit 1 |
michael@13 | 1985 | ;; |
michael@13 | 1986 | esac |
michael@13 | 1987 | comp_suf=".$comp_ext" |
michael@13 | 1988 | fi |
michael@13 | 1989 | |
michael@13 | 1990 | # iterate over all given logfile arguments |
michael@13 | 1991 | for file in $*; do |
michael@13 | 1992 | # make sure the logfile exists |
michael@13 | 1993 | if [ ! -f $file ]; then |
michael@13 | 1994 | if [ ".$opt_f" = .yes ]; then |
michael@13 | 1995 | continue |
michael@13 | 1996 | fi |
michael@13 | 1997 | echo "$msgprefix:Error: logfile \`$file' not found" 1>&2 |
michael@13 | 1998 | shtool_exit 1 |
michael@13 | 1999 | fi |
michael@13 | 2000 | |
michael@13 | 2001 | # determine log directory (where original logfile is placed) |
michael@13 | 2002 | ldir="." |
michael@13 | 2003 | case $file in |
michael@13 | 2004 | */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;; |
michael@13 | 2005 | esac |
michael@13 | 2006 | |
michael@13 | 2007 | # determine archive directory (where rotated logfiles are placed) |
michael@13 | 2008 | adir="$ldir" |
michael@13 | 2009 | if [ ".$opt_a" != . ]; then |
michael@13 | 2010 | case "$opt_a" in |
michael@13 | 2011 | /* | ./* ) adir="$opt_a" ;; |
michael@13 | 2012 | * ) adir="$ldir/$opt_a" ;; |
michael@13 | 2013 | esac |
michael@13 | 2014 | fi |
michael@13 | 2015 | |
michael@13 | 2016 | # optionally take logfile size into account |
michael@13 | 2017 | if [ ".$opt_s" != . ]; then |
michael@13 | 2018 | # determine size of logfile |
michael@13 | 2019 | set -- `env -i /bin/ls -l "$ldir/$file" | sed -e "s;$ldir/$file;;" |\ |
michael@13 | 2020 | sed -e 's; -> .*$;;' -e 's;[ ][ ]*; ;g'` |
michael@13 | 2021 | n=`expr $# - 3` |
michael@13 | 2022 | eval "size=\`echo \${$n}\`" |
michael@13 | 2023 | |
michael@13 | 2024 | # skip logfile if size is still too small |
michael@13 | 2025 | if [ $size -lt $opt_s ]; then |
michael@13 | 2026 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 2027 | echo "$ldir/$file: still too small in size -- skipping" |
michael@13 | 2028 | fi |
michael@13 | 2029 | continue |
michael@13 | 2030 | fi |
michael@13 | 2031 | fi |
michael@13 | 2032 | |
michael@13 | 2033 | # verbosity |
michael@13 | 2034 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 2035 | echo "rotating $ldir/$file" |
michael@13 | 2036 | fi |
michael@13 | 2037 | |
michael@13 | 2038 | # execute prolog |
michael@13 | 2039 | if [ ".$opt_P" != . ]; then |
michael@428 | 2040 | # pass current log file name to prolog |
michael@428 | 2041 | # prolog cannot be handed an argument as it may be |
michael@428 | 2042 | # called as "prolog && something" |
michael@428 | 2043 | SHTOOL_ROTATE_LOGFILE="$ldir/$file" |
michael@428 | 2044 | export SHTOOL_ROTATE_LOGFILE |
michael@13 | 2045 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2046 | echo "$opt_P" |
michael@13 | 2047 | fi |
michael@13 | 2048 | eval $opt_P |
michael@13 | 2049 | [ $? -ne 0 ] && shtool_exit $? |
michael@13 | 2050 | fi |
michael@13 | 2051 | |
michael@13 | 2052 | # kick away out-rotated logfile |
michael@13 | 2053 | n=`expr $opt_n - 1` |
michael@13 | 2054 | n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` |
michael@13 | 2055 | if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then |
michael@13 | 2056 | # optionally migrate away the out-rotated logfile |
michael@13 | 2057 | if [ ".$opt_M" != . ]; then |
michael@13 | 2058 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2059 | echo "$opt_M ${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2060 | fi |
michael@13 | 2061 | eval "$opt_M ${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2062 | [ $? -ne 0 ] && shtool_exit $? |
michael@13 | 2063 | fi |
michael@13 | 2064 | # finally get rid of the out-rotated logfile |
michael@13 | 2065 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2066 | echo "rm -f ${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2067 | fi |
michael@13 | 2068 | rm -f ${adir}/${file}.${n}${comp_suf} || shtool_exit $? |
michael@13 | 2069 | fi |
michael@13 | 2070 | |
michael@13 | 2071 | # rotate already archived logfiles |
michael@13 | 2072 | while [ $n -gt 0 ]; do |
michael@13 | 2073 | m=$n |
michael@13 | 2074 | n=`expr $n - 1` |
michael@13 | 2075 | n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` |
michael@13 | 2076 | if [ $n -eq 0 ] && [ ".$opt_d" = .yes ]; then |
michael@13 | 2077 | # special case: first rotation file under delayed compression situation |
michael@13 | 2078 | if [ ! -f "${adir}/${file}.${n}" ]; then |
michael@13 | 2079 | continue |
michael@13 | 2080 | fi |
michael@13 | 2081 | |
michael@13 | 2082 | # compress file (delayed) |
michael@13 | 2083 | if [ ".$opt_b" = .yes ]; then |
michael@13 | 2084 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2085 | echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}" |
michael@13 | 2086 | fi |
michael@13 | 2087 | mv ${adir}/${file}.${n} ${adir}/${file}.${m} || shtool_exit $? |
michael@13 | 2088 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2089 | echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &" |
michael@13 | 2090 | fi |
michael@13 | 2091 | ( ${comp_prg} ${comp_lvl} \ |
michael@13 | 2092 | <${adir}/${file}.${m} \ |
michael@13 | 2093 | >${adir}/${file}.${m}${comp_suf} || shtool_exit $? |
michael@13 | 2094 | rm -f ${adir}/${file}.${m} || shtool_exit $? |
michael@13 | 2095 | ) </dev/null >/dev/null 2>&1 & |
michael@13 | 2096 | else |
michael@13 | 2097 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2098 | echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}" |
michael@13 | 2099 | fi |
michael@13 | 2100 | ${comp_prg} ${comp_lvl} \ |
michael@13 | 2101 | <${adir}/${file}.${n} \ |
michael@13 | 2102 | >${adir}/${file}.${m}${comp_suf} || shtool_exit $? |
michael@13 | 2103 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2104 | echo "rm -f ${adir}/${file}.${n}" |
michael@13 | 2105 | fi |
michael@13 | 2106 | rm -f ${adir}/${file}.${n} || shtool_exit $? |
michael@13 | 2107 | fi |
michael@13 | 2108 | |
michael@13 | 2109 | # fix file attributes |
michael@13 | 2110 | if [ ".$opt_o" != . ]; then |
michael@13 | 2111 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2112 | echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}" |
michael@13 | 2113 | fi |
michael@13 | 2114 | chown $opt_o ${adir}/${file}.${m}${comp_suf} || shtool_exit $? |
michael@13 | 2115 | fi |
michael@13 | 2116 | if [ ".$opt_g" != . ]; then |
michael@13 | 2117 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2118 | echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}" |
michael@13 | 2119 | fi |
michael@13 | 2120 | chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || shtool_exit $? |
michael@13 | 2121 | fi |
michael@13 | 2122 | if [ ".$opt_m" != . ]; then |
michael@13 | 2123 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2124 | echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}" |
michael@13 | 2125 | fi |
michael@13 | 2126 | chmod $opt_m ${adir}/${file}.${m}${comp_suf} || shtool_exit $? |
michael@13 | 2127 | fi |
michael@13 | 2128 | else |
michael@13 | 2129 | # standard case: second and following rotation file |
michael@13 | 2130 | if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then |
michael@13 | 2131 | continue |
michael@13 | 2132 | fi |
michael@13 | 2133 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2134 | echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}" |
michael@13 | 2135 | fi |
michael@13 | 2136 | mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || shtool_exit $? |
michael@13 | 2137 | fi |
michael@13 | 2138 | done |
michael@13 | 2139 | |
michael@13 | 2140 | # move away current logfile |
michael@13 | 2141 | if [ ".$opt_c" = .yes ]; then |
michael@13 | 2142 | # approach: copy[+truncate] |
michael@13 | 2143 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2144 | echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}" |
michael@13 | 2145 | fi |
michael@13 | 2146 | cp -p ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $? |
michael@13 | 2147 | if [ ".$opt_r" = .no ]; then |
michael@13 | 2148 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2149 | echo "cp /dev/null ${ldir}/${file}" |
michael@13 | 2150 | fi |
michael@13 | 2151 | cp /dev/null ${ldir}/${file} || shtool_exit $? |
michael@13 | 2152 | fi |
michael@13 | 2153 | else |
michael@13 | 2154 | # approach: move[+touch] |
michael@13 | 2155 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2156 | echo "mv ${ldir}/${file} ${adir}/${file}.${n}" |
michael@13 | 2157 | fi |
michael@13 | 2158 | mv ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $? |
michael@13 | 2159 | if [ ".$opt_r" = .no ]; then |
michael@13 | 2160 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2161 | echo "touch ${ldir}/${file}" |
michael@13 | 2162 | fi |
michael@13 | 2163 | touch ${ldir}/${file} || shtool_exit $? |
michael@13 | 2164 | # fix file attributes |
michael@13 | 2165 | if [ ".$opt_o" != . ]; then |
michael@13 | 2166 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2167 | echo "chown $opt_o ${ldir}/${file}" |
michael@13 | 2168 | fi |
michael@13 | 2169 | chown $opt_o ${ldir}/${file} || shtool_exit $? |
michael@13 | 2170 | fi |
michael@13 | 2171 | if [ ".$opt_g" != . ]; then |
michael@13 | 2172 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2173 | echo "chgrp $opt_g ${ldir}/${file}" |
michael@13 | 2174 | fi |
michael@13 | 2175 | chgrp $opt_g ${ldir}/${file} || shtool_exit $? |
michael@13 | 2176 | fi |
michael@13 | 2177 | if [ ".$opt_m" != . ]; then |
michael@13 | 2178 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2179 | echo "chmod $opt_m ${ldir}/${file}" |
michael@13 | 2180 | fi |
michael@13 | 2181 | chmod $opt_m ${ldir}/${file} || shtool_exit $? |
michael@13 | 2182 | fi |
michael@13 | 2183 | fi |
michael@13 | 2184 | fi |
michael@13 | 2185 | |
michael@13 | 2186 | # regular compression step |
michael@13 | 2187 | if [ ".$opt_z" != . ] && [ ".$opt_d" = .no ]; then |
michael@13 | 2188 | # compress file |
michael@13 | 2189 | if [ ".$opt_b" = .yes ]; then |
michael@13 | 2190 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2191 | echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &" |
michael@13 | 2192 | fi |
michael@13 | 2193 | ( ${comp_prg} ${comp_lvl} \ |
michael@13 | 2194 | <${adir}/${file}.${n} \ |
michael@13 | 2195 | >${adir}/${file}.${n}${comp_suf} || shtool_exit $? |
michael@13 | 2196 | rm -f ${adir}/${file}.${n} || shtool_exit $? |
michael@13 | 2197 | ) </dev/null >/dev/null 2>&1 & |
michael@13 | 2198 | else |
michael@13 | 2199 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2200 | echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2201 | fi |
michael@13 | 2202 | ${comp_prg} ${comp_lvl} \ |
michael@13 | 2203 | <${adir}/${file}.${n} \ |
michael@13 | 2204 | >${adir}/${file}.${n}${comp_suf} || shtool_exit $? |
michael@13 | 2205 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2206 | echo "rm -f ${opt_a}${file}.${n}" |
michael@13 | 2207 | fi |
michael@13 | 2208 | rm -f ${adir}/${file}.${n} || shtool_exit $? |
michael@13 | 2209 | fi |
michael@13 | 2210 | |
michael@13 | 2211 | # fix file attributes |
michael@13 | 2212 | if [ ".$opt_o" != . ]; then |
michael@13 | 2213 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2214 | echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2215 | fi |
michael@13 | 2216 | chown $opt_o ${adir}/${file}.${n}${comp_suf} || shtool_exit $? |
michael@13 | 2217 | fi |
michael@13 | 2218 | if [ ".$opt_g" != . ]; then |
michael@13 | 2219 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2220 | echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2221 | fi |
michael@13 | 2222 | chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || shtool_exit $? |
michael@13 | 2223 | fi |
michael@13 | 2224 | if [ ".$opt_m" != . ]; then |
michael@13 | 2225 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2226 | echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}" |
michael@13 | 2227 | fi |
michael@13 | 2228 | chmod $opt_m ${adir}/${file}.${n}${comp_suf} || shtool_exit $? |
michael@13 | 2229 | fi |
michael@13 | 2230 | fi |
michael@13 | 2231 | |
michael@13 | 2232 | # execute epilog |
michael@13 | 2233 | if [ ".$opt_E" != . ]; then |
michael@428 | 2234 | # pass archive file name to epilog command |
michael@428 | 2235 | # epilog cannot be handed an argument as it is often |
michael@428 | 2236 | # called as "epilog && something" |
michael@428 | 2237 | SHTOOL_ROTATE_LOGFILE="${adir}/${file}" |
michael@428 | 2238 | export SHTOOL_ROTATE_LOGFILE |
michael@13 | 2239 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2240 | echo "$opt_E" |
michael@13 | 2241 | fi |
michael@13 | 2242 | eval $opt_E |
michael@13 | 2243 | [ $? -ne 0 ] && shtool_exit $? |
michael@13 | 2244 | fi |
michael@13 | 2245 | done |
michael@13 | 2246 | |
michael@13 | 2247 | shtool_exit 0 |
michael@13 | 2248 | ;; |
michael@13 | 2249 | |
michael@13 | 2250 | tarball ) |
michael@13 | 2251 | ## |
michael@13 | 2252 | ## tarball -- Roll distribution tarballs |
michael@428 | 2253 | ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 2254 | ## |
michael@13 | 2255 | |
michael@13 | 2256 | srcs="$*" |
michael@13 | 2257 | |
michael@13 | 2258 | # check whether the test command supports the -x option |
michael@13 | 2259 | if [ -x /bin/sh ] 2>/dev/null; then |
michael@13 | 2260 | minusx="-x" |
michael@13 | 2261 | else |
michael@13 | 2262 | minusx="-r" |
michael@13 | 2263 | fi |
michael@13 | 2264 | |
michael@13 | 2265 | # find the tools |
michael@13 | 2266 | paths="`echo $PATH |\ |
michael@13 | 2267 | sed -e 's%/*:%:%g' -e 's%/*$%%' \ |
michael@13 | 2268 | -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ |
michael@13 | 2269 | -e 's/:/ /g'`" |
michael@13 | 2270 | for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do |
michael@13 | 2271 | prg=`echo $spec | sed -e 's/:.*$//'` |
michael@13 | 2272 | tools=`echo $spec | sed -e 's/^.*://'` |
michael@13 | 2273 | eval "prg_${prg}=''" |
michael@13 | 2274 | # iterate over tools |
michael@13 | 2275 | for tool in `echo $tools | sed -e 's/,/ /g'`; do |
michael@13 | 2276 | # iterate over paths |
michael@13 | 2277 | for path in $paths; do |
michael@13 | 2278 | if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then |
michael@13 | 2279 | eval "prg_${prg}=\"$path/$tool\"" |
michael@13 | 2280 | break |
michael@13 | 2281 | fi |
michael@13 | 2282 | done |
michael@13 | 2283 | eval "val=\$prg_${prg}" |
michael@13 | 2284 | if [ ".$val" != . ]; then |
michael@13 | 2285 | break |
michael@13 | 2286 | fi |
michael@13 | 2287 | done |
michael@13 | 2288 | done |
michael@13 | 2289 | |
michael@13 | 2290 | # expand source paths |
michael@13 | 2291 | exclude='' |
michael@13 | 2292 | for pat in `echo $opt_e | sed 's/,/ /g'`; do |
michael@13 | 2293 | exclude="$exclude | grep -v '$pat'" |
michael@13 | 2294 | done |
michael@13 | 2295 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2296 | echo "cp /dev/null $tmpfile.lst" 1>&2 |
michael@13 | 2297 | fi |
michael@13 | 2298 | cp /dev/null $tmpfile.lst |
michael@13 | 2299 | for src in $srcs; do |
michael@13 | 2300 | if [ -d $src ]; then |
michael@13 | 2301 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2302 | echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2 |
michael@13 | 2303 | fi |
michael@13 | 2304 | (cd $src && $prg_find . -type f -depth -print) |\ |
michael@13 | 2305 | sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst |
michael@13 | 2306 | else |
michael@13 | 2307 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2308 | echo "echo $src >>$tmpfile.lst" 1>&2 |
michael@13 | 2309 | fi |
michael@13 | 2310 | echo $src >>$tmpfile.lst |
michael@13 | 2311 | fi |
michael@13 | 2312 | done |
michael@13 | 2313 | sort <$tmpfile.lst >$tmpfile.lst.n |
michael@13 | 2314 | mv $tmpfile.lst.n $tmpfile.lst |
michael@13 | 2315 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 2316 | cat $tmpfile.lst | sed -e 's/^/ /' 1>&2 |
michael@13 | 2317 | fi |
michael@13 | 2318 | |
michael@13 | 2319 | # determine tarball file and directory name |
michael@13 | 2320 | if [ ".$opt_o" != . ]; then |
michael@13 | 2321 | tarfile="$opt_o" |
michael@13 | 2322 | if [ ".$opt_d" != . ]; then |
michael@13 | 2323 | tarname="$opt_d" |
michael@13 | 2324 | else |
michael@13 | 2325 | tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 2326 | fi |
michael@13 | 2327 | else |
michael@13 | 2328 | if [ ".$opt_d" != . ]; then |
michael@13 | 2329 | tarname="$opt_d" |
michael@13 | 2330 | elif [ -d "$from" ]; then |
michael@13 | 2331 | tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 2332 | else |
michael@13 | 2333 | tarname="out" |
michael@13 | 2334 | fi |
michael@13 | 2335 | tarfile="$tarname.tar" |
michael@13 | 2336 | fi |
michael@13 | 2337 | |
michael@13 | 2338 | # roll the tarball |
michael@13 | 2339 | compress='' |
michael@13 | 2340 | if [ ".$opt_c" != . ]; then |
michael@13 | 2341 | compress="| $opt_c" |
michael@13 | 2342 | fi |
michael@13 | 2343 | if [ ".$prg_tardy" != . ]; then |
michael@13 | 2344 | # the elegant hackers way |
michael@13 | 2345 | tardy_opt="--prefix=$tarname" |
michael@13 | 2346 | tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security! |
michael@13 | 2347 | if [ ".$opt_u" != . ]; then |
michael@13 | 2348 | tardy_opt="$tardy_opt --user_name=$opt_u" |
michael@13 | 2349 | fi |
michael@13 | 2350 | if [ ".$opt_g" != . ]; then |
michael@13 | 2351 | tardy_opt="$tardy_opt --group_name=$opt_g" |
michael@13 | 2352 | fi |
michael@13 | 2353 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2354 | echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2 |
michael@13 | 2355 | fi |
michael@13 | 2356 | cat $tmpfile.lst |\ |
michael@13 | 2357 | xargs $prg_tar cf - |\ |
michael@13 | 2358 | $prg_tardy $tardy_opt |\ |
michael@13 | 2359 | eval cat $compress >$tmpfile.out |
michael@13 | 2360 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2361 | echo "cp $tmpfile.out $tarfile" 1>&2 |
michael@13 | 2362 | fi |
michael@13 | 2363 | cp $tmpfile.out $tarfile |
michael@13 | 2364 | else |
michael@13 | 2365 | # the portable standard way |
michael@13 | 2366 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2367 | echo "mkdir $tmpdir/$tarname" 1>&2 |
michael@13 | 2368 | fi |
michael@13 | 2369 | mkdir $tmpdir/$tarname || shtool_exit 1 |
michael@13 | 2370 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2371 | echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2 |
michael@13 | 2372 | fi |
michael@13 | 2373 | cat $tmpfile.lst |\ |
michael@13 | 2374 | xargs $prg_tar cf - |\ |
michael@13 | 2375 | (cd $tmpdir/$tarname && $prg_tar xf -) |
michael@13 | 2376 | if [ ".$opt_u" != . ]; then |
michael@13 | 2377 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2378 | echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1 |
michael@13 | 2379 | fi |
michael@13 | 2380 | chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\ |
michael@13 | 2381 | echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root privileges)" |
michael@13 | 2382 | fi |
michael@13 | 2383 | if [ ".$opt_g" != . ]; then |
michael@13 | 2384 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2385 | echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1 |
michael@13 | 2386 | fi |
michael@13 | 2387 | chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\ |
michael@13 | 2388 | echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root privileges)" |
michael@13 | 2389 | fi |
michael@13 | 2390 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2391 | echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2 |
michael@13 | 2392 | fi |
michael@13 | 2393 | (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\ |
michael@13 | 2394 | eval cat $compress >$tmpfile.out |
michael@13 | 2395 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2396 | echo "cp $tmpfile.out $tarfile" 1>&2 |
michael@13 | 2397 | fi |
michael@13 | 2398 | cp $tmpfile.out $tarfile |
michael@13 | 2399 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2400 | echo "rm -rf $tmpdir/$tarname" 1>&2 |
michael@13 | 2401 | fi |
michael@13 | 2402 | rm -rf $tmpdir/$tarname |
michael@13 | 2403 | fi |
michael@13 | 2404 | |
michael@13 | 2405 | # cleanup |
michael@13 | 2406 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2407 | echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2 |
michael@13 | 2408 | fi |
michael@13 | 2409 | rm -f $tmpfile.lst $tmpfile.out |
michael@13 | 2410 | |
michael@13 | 2411 | shtool_exit 0 |
michael@13 | 2412 | ;; |
michael@13 | 2413 | |
michael@13 | 2414 | subst ) |
michael@13 | 2415 | ## |
michael@13 | 2416 | ## subst -- Apply sed(1) substitution operations |
michael@428 | 2417 | ## Copyright (c) 2001-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 2418 | ## |
michael@13 | 2419 | |
michael@13 | 2420 | # remember optional list of file(s) |
michael@13 | 2421 | files="$*" |
michael@13 | 2422 | files_num="$#" |
michael@13 | 2423 | |
michael@13 | 2424 | # parameter consistency check |
michael@13 | 2425 | if [ $# -eq 0 ] && [ ".$opt_b" != . ]; then |
michael@13 | 2426 | echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2 |
michael@13 | 2427 | shtool_exit 1 |
michael@13 | 2428 | fi |
michael@13 | 2429 | if [ $# -eq 0 ] && [ ".$opt_s" = .yes ]; then |
michael@13 | 2430 | echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2 |
michael@13 | 2431 | shtool_exit 1 |
michael@13 | 2432 | fi |
michael@13 | 2433 | |
michael@13 | 2434 | # build underlying sed(1) command |
michael@13 | 2435 | sedcmd='sed' |
michael@13 | 2436 | if [ ".$opt_e" != . ]; then |
michael@13 | 2437 | OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" |
michael@13 | 2438 | for e |
michael@13 | 2439 | do |
michael@13 | 2440 | sedcmd="$sedcmd -e '$e'" |
michael@13 | 2441 | done |
michael@13 | 2442 | elif [ ".$opt_f" != . ]; then |
michael@13 | 2443 | if [ ! -f $opt_f ]; then |
michael@13 | 2444 | echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2 |
michael@13 | 2445 | shtool_exit 1 |
michael@13 | 2446 | fi |
michael@13 | 2447 | sedcmd="$sedcmd -f '$opt_f'" |
michael@13 | 2448 | else |
michael@13 | 2449 | echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2 |
michael@13 | 2450 | shtool_exit 1 |
michael@13 | 2451 | fi |
michael@13 | 2452 | |
michael@13 | 2453 | # determine extension for original file |
michael@13 | 2454 | orig=".orig" |
michael@13 | 2455 | if [ ".$opt_b" != . ]; then |
michael@13 | 2456 | orig="$opt_b" |
michael@13 | 2457 | fi |
michael@13 | 2458 | |
michael@13 | 2459 | # apply sed(1) operation(s) |
michael@13 | 2460 | if [ ".$files" != . ]; then |
michael@13 | 2461 | # apply operation(s) to files |
michael@13 | 2462 | substdone=no |
michael@13 | 2463 | for file in $files; do |
michael@13 | 2464 | test ".$file" = . && continue |
michael@13 | 2465 | if [ ! -f $file ]; then |
michael@13 | 2466 | echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2 |
michael@13 | 2467 | continue |
michael@13 | 2468 | fi |
michael@13 | 2469 | |
michael@13 | 2470 | # handle interactive mode |
michael@13 | 2471 | if [ ".$opt_i" = .yes ]; then |
michael@13 | 2472 | eval "$sedcmd <$file >$file.new" |
michael@13 | 2473 | skip=no |
michael@13 | 2474 | if cmp $file $file.new >/dev/null 2>&1; then |
michael@13 | 2475 | rm -f $file.new |
michael@13 | 2476 | skip=yes |
michael@13 | 2477 | else |
michael@13 | 2478 | (diff -U1 $file $file.new >$tmpfile) 2>/dev/null |
michael@13 | 2479 | if [ ".`cat $tmpfile`" = . ]; then |
michael@13 | 2480 | (diff -C1 $file $file.new >$tmpfile) 2>/dev/null |
michael@13 | 2481 | if [ ".`cat $tmpfile`" = . ]; then |
michael@13 | 2482 | echo "$msgprefix:Warning: unable to show difference for file \`$file'" 1>&2 |
michael@13 | 2483 | cp /dev/null $tmpfile |
michael@13 | 2484 | fi |
michael@13 | 2485 | fi |
michael@13 | 2486 | rm -f $file.new |
michael@13 | 2487 | cat $tmpfile |
michael@13 | 2488 | echo dummy | awk '{ printf("%s", TEXT); }' TEXT=">>> Apply [Y/n]: " |
michael@13 | 2489 | read input |
michael@13 | 2490 | if [ ".$input" != .Y ] &&\ |
michael@13 | 2491 | [ ".$input" != .y ] &&\ |
michael@13 | 2492 | [ ".$input" != . ]; then |
michael@13 | 2493 | skip=yes |
michael@13 | 2494 | fi |
michael@13 | 2495 | fi |
michael@13 | 2496 | if [ ".$skip" = .yes ]; then |
michael@13 | 2497 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 2498 | echo "file \`$file' -- skipped" 1>&2 |
michael@13 | 2499 | fi |
michael@13 | 2500 | continue |
michael@13 | 2501 | fi |
michael@13 | 2502 | fi |
michael@13 | 2503 | |
michael@13 | 2504 | # apply sed(1) operation(s) |
michael@13 | 2505 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 2506 | echo "patching \`$file'" 1>&2 |
michael@13 | 2507 | fi |
michael@13 | 2508 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2509 | echo "\$ cp -p $file $file$orig" |
michael@13 | 2510 | echo "\$ chmod u+w $file" |
michael@13 | 2511 | echo "\$ $sedcmd <$file$orig >$file" |
michael@13 | 2512 | fi |
michael@13 | 2513 | if [ ".$opt_n" = .no ]; then |
michael@13 | 2514 | cp -p $file $file$orig |
michael@13 | 2515 | chmod u+w $file >/dev/null 2>&1 || true |
michael@13 | 2516 | eval "$sedcmd <$file$orig >$file" |
michael@13 | 2517 | fi |
michael@13 | 2518 | |
michael@13 | 2519 | # optionally fix timestamp |
michael@13 | 2520 | if [ ".$opt_s" = .yes ]; then |
michael@13 | 2521 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2522 | echo "\$ touch -r $file$orig $file" |
michael@13 | 2523 | fi |
michael@13 | 2524 | if [ ".$opt_n" = .no ]; then |
michael@13 | 2525 | touch -r $file$orig $file |
michael@13 | 2526 | fi |
michael@13 | 2527 | fi |
michael@13 | 2528 | |
michael@428 | 2529 | # optionally check whether any content change actually occurred |
michael@13 | 2530 | if [ ".$opt_q" = .no ]; then |
michael@13 | 2531 | if cmp $file$orig $file >/dev/null 2>&1; then |
michael@13 | 2532 | if [ ".$opt_w" = .yes ]; then |
michael@13 | 2533 | echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 |
michael@13 | 2534 | fi |
michael@13 | 2535 | else |
michael@13 | 2536 | substdone=yes |
michael@13 | 2537 | fi |
michael@13 | 2538 | fi |
michael@13 | 2539 | |
michael@13 | 2540 | # optionally remove preserved original file |
michael@13 | 2541 | if [ ".$opt_b" = . ]; then |
michael@13 | 2542 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2543 | echo "\$ rm -f $file$orig" |
michael@13 | 2544 | fi |
michael@13 | 2545 | if [ ".$opt_n" = .no ]; then |
michael@13 | 2546 | rm -f $file$orig |
michael@13 | 2547 | fi |
michael@13 | 2548 | fi |
michael@13 | 2549 | done |
michael@13 | 2550 | if [ ".$opt_q" = .no ] && [ ".$opt_w" = .no ]; then |
michael@13 | 2551 | if [ ".$substdone" = .no ]; then |
michael@13 | 2552 | if [ ".$files_num" = .1 ]; then |
michael@13 | 2553 | echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2 |
michael@13 | 2554 | else |
michael@13 | 2555 | echo "$msgprefix:Warning: substitution resulted in no content change on any file" 1>&2 |
michael@13 | 2556 | fi |
michael@13 | 2557 | fi |
michael@13 | 2558 | fi |
michael@13 | 2559 | else |
michael@13 | 2560 | # apply operation(s) to stdin/stdout |
michael@13 | 2561 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 2562 | echo "patching <stdin>" 1>&2 |
michael@13 | 2563 | fi |
michael@13 | 2564 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 2565 | echo "\$ $sedcmd" |
michael@13 | 2566 | fi |
michael@13 | 2567 | if [ ".$opt_n" = .no ]; then |
michael@13 | 2568 | eval "$sedcmd" |
michael@13 | 2569 | fi |
michael@13 | 2570 | fi |
michael@13 | 2571 | |
michael@13 | 2572 | shtool_exit 0 |
michael@13 | 2573 | ;; |
michael@13 | 2574 | |
michael@13 | 2575 | platform ) |
michael@13 | 2576 | ## |
michael@13 | 2577 | ## platform -- Platform Identification Utility |
michael@428 | 2578 | ## Copyright (c) 2003-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 2579 | ## |
michael@13 | 2580 | |
michael@13 | 2581 | # option post-processing |
michael@13 | 2582 | if [ ".$opt_t" != . ]; then |
michael@13 | 2583 | case "$opt_t" in |
michael@13 | 2584 | binary ) |
michael@13 | 2585 | # binary package id (OpenPKG RPM) |
michael@13 | 2586 | opt_F="%<ap>-%<sp>" |
michael@13 | 2587 | opt_L=yes |
michael@13 | 2588 | opt_S="" |
michael@13 | 2589 | opt_C="+" |
michael@13 | 2590 | ;; |
michael@13 | 2591 | build ) |
michael@13 | 2592 | # build time checking (OpenPKG RPM) |
michael@13 | 2593 | opt_F="%<at>-%<st>" |
michael@13 | 2594 | opt_L=yes |
michael@13 | 2595 | opt_S="" |
michael@13 | 2596 | opt_C="+" |
michael@13 | 2597 | ;; |
michael@13 | 2598 | gnu ) |
michael@13 | 2599 | # GNU config.guess style <arch>-<vendor>-<os><osversion> |
michael@13 | 2600 | opt_F="%<at>-unknown-%<st>" |
michael@13 | 2601 | opt_L=yes |
michael@13 | 2602 | opt_S="" |
michael@13 | 2603 | opt_C="+" |
michael@13 | 2604 | ;; |
michael@13 | 2605 | web ) |
michael@13 | 2606 | # non-whitespace HTTP Server-header id |
michael@13 | 2607 | opt_F="%<sp>-%<ap>" |
michael@13 | 2608 | opt_S="/" |
michael@13 | 2609 | opt_C="+" |
michael@13 | 2610 | ;; |
michael@13 | 2611 | summary) |
michael@13 | 2612 | # human readable verbose summary information |
michael@13 | 2613 | opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])" |
michael@13 | 2614 | opt_S=" " |
michael@13 | 2615 | opt_C="/" |
michael@13 | 2616 | ;; |
michael@13 | 2617 | all-in-one ) |
michael@13 | 2618 | # full-table all-in-one information |
michael@13 | 2619 | opt_F="" |
michael@13 | 2620 | opt_F="${opt_F}concise architecture class: %<ac>\\n" |
michael@13 | 2621 | opt_F="${opt_F}regular architecture class: %{ac}\\n" |
michael@13 | 2622 | opt_F="${opt_F}verbose architecture class: %[ac]\\n" |
michael@13 | 2623 | opt_F="${opt_F}concise architecture product: %<ap>\\n" |
michael@13 | 2624 | opt_F="${opt_F}regular architecture product: %{ap}\\n" |
michael@13 | 2625 | opt_F="${opt_F}verbose architecture product: %[ap]\\n" |
michael@13 | 2626 | opt_F="${opt_F}concise architecture technology: %<at>\\n" |
michael@13 | 2627 | opt_F="${opt_F}regular architecture technology: %{at}\\n" |
michael@13 | 2628 | opt_F="${opt_F}verbose architecture technology: %[at]\\n" |
michael@13 | 2629 | opt_F="${opt_F}concise system class: %<sc>\\n" |
michael@13 | 2630 | opt_F="${opt_F}regular system class: %{sc}\\n" |
michael@13 | 2631 | opt_F="${opt_F}verbose system class: %[sc]\\n" |
michael@13 | 2632 | opt_F="${opt_F}concise system product: %<sp>\\n" |
michael@13 | 2633 | opt_F="${opt_F}regular system product: %{sp}\\n" |
michael@13 | 2634 | opt_F="${opt_F}verbose system product: %[sp]\\n" |
michael@13 | 2635 | opt_F="${opt_F}concise system technology: %<st>\\n" |
michael@13 | 2636 | opt_F="${opt_F}regular system technology: %{st}\\n" |
michael@13 | 2637 | opt_F="${opt_F}verbose system technology: %[st]" |
michael@13 | 2638 | ;; |
michael@13 | 2639 | * ) |
michael@13 | 2640 | echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2 |
michael@13 | 2641 | exit 1 |
michael@13 | 2642 | ;; |
michael@13 | 2643 | esac |
michael@13 | 2644 | fi |
michael@13 | 2645 | |
michael@13 | 2646 | # assemble initial platform information |
michael@13 | 2647 | UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\ |
michael@13 | 2648 | UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\ |
michael@13 | 2649 | UNAME_MACHINE='unknown' |
michael@13 | 2650 | UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\ |
michael@13 | 2651 | UNAME_SYSTEM='unknown' |
michael@13 | 2652 | UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\ |
michael@13 | 2653 | UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\ |
michael@13 | 2654 | UNAME_RELEASE='unknown' |
michael@13 | 2655 | |
michael@13 | 2656 | UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}" |
michael@13 | 2657 | |
michael@13 | 2658 | AC=""; AP=""; AT="" |
michael@13 | 2659 | SC=""; SP=""; ST="" |
michael@13 | 2660 | |
michael@13 | 2661 | # dispatch into platform specific sections |
michael@13 | 2662 | case "${UNAME}" in |
michael@13 | 2663 | |
michael@13 | 2664 | # FreeBSD |
michael@13 | 2665 | *:FreeBSD:* ) |
michael@13 | 2666 | # determine architecture |
michael@13 | 2667 | AC="${UNAME_MACHINE}" |
michael@13 | 2668 | case "${AC}" in |
michael@13 | 2669 | i386 ) AC="iX86" ;; |
michael@13 | 2670 | esac |
michael@13 | 2671 | AP="${AC}" |
michael@13 | 2672 | AT="${AP}" |
michael@13 | 2673 | if [ ".${AT}" = ".iX86" ]; then |
michael@13 | 2674 | case "`(/sbin/sysctl -n hw.model) 2>&1`" in |
michael@13 | 2675 | *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;; |
michael@13 | 2676 | *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;; |
michael@13 | 2677 | *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;; |
michael@13 | 2678 | esac |
michael@13 | 2679 | fi |
michael@13 | 2680 | # determine system |
michael@13 | 2681 | r=`echo "${UNAME_RELEASE}" |\ |
michael@13 | 2682 | sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'` |
michael@13 | 2683 | ST="FreeBSD ${r}" |
michael@13 | 2684 | SP="${ST}" |
michael@13 | 2685 | case "${r}" in |
michael@13 | 2686 | 1.* ) SC="4.3BSD" ;; |
michael@13 | 2687 | * ) SC="4.4BSD" ;; |
michael@13 | 2688 | esac |
michael@13 | 2689 | ;; |
michael@13 | 2690 | |
michael@13 | 2691 | # NetBSD |
michael@13 | 2692 | *:NetBSD:* ) |
michael@13 | 2693 | # determine architecture |
michael@13 | 2694 | AT="${UNAME_MACHINE}" |
michael@13 | 2695 | AP="${AT}" |
michael@13 | 2696 | case "${AP}" in |
michael@13 | 2697 | i[3-6]86 ) AP="iX86" ;; |
michael@13 | 2698 | esac |
michael@13 | 2699 | AC="${AP}" |
michael@13 | 2700 | # determine system |
michael@13 | 2701 | r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` |
michael@13 | 2702 | ST="NetBSD ${r}" |
michael@13 | 2703 | SP="${ST}" |
michael@13 | 2704 | case "${r}" in |
michael@13 | 2705 | 0.* ) SC="4.3BSD" ;; |
michael@13 | 2706 | * ) SC="4.4BSD" ;; |
michael@13 | 2707 | esac |
michael@13 | 2708 | ;; |
michael@13 | 2709 | |
michael@13 | 2710 | # OpenBSD |
michael@13 | 2711 | *:OpenBSD:* ) |
michael@13 | 2712 | # determine architecture |
michael@13 | 2713 | AT="${UNAME_MACHINE}" |
michael@13 | 2714 | AP="${AT}" |
michael@13 | 2715 | case "${AP}" in |
michael@13 | 2716 | i[3-6]86 ) AP="iX86" ;; |
michael@13 | 2717 | esac |
michael@13 | 2718 | AC="${AP}" |
michael@13 | 2719 | # determine system |
michael@13 | 2720 | r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` |
michael@13 | 2721 | ST="OpenBSD ${r}" |
michael@13 | 2722 | SP="${ST}" |
michael@13 | 2723 | SC="4.4BSD" |
michael@13 | 2724 | ;; |
michael@13 | 2725 | |
michael@428 | 2726 | # DragonFly BSD |
michael@428 | 2727 | *:DragonFly:* ) |
michael@428 | 2728 | # determine architecture |
michael@428 | 2729 | AT="${UNAME_MACHINE}" |
michael@428 | 2730 | AP="${AT}" |
michael@428 | 2731 | case "${AP}" in |
michael@428 | 2732 | i[3-6]86 ) AP="iX86" ;; |
michael@428 | 2733 | esac |
michael@428 | 2734 | AC="${AP}" |
michael@428 | 2735 | # determine system |
michael@428 | 2736 | r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'` |
michael@428 | 2737 | ST="DragonFly ${r}" |
michael@428 | 2738 | SP="${ST}" |
michael@428 | 2739 | SC="4.4BSD" |
michael@428 | 2740 | ;; |
michael@428 | 2741 | |
michael@13 | 2742 | # GNU/Linux |
michael@13 | 2743 | *:Linux:* ) |
michael@13 | 2744 | # determine architecture |
michael@13 | 2745 | AT="${UNAME_MACHINE}" |
michael@13 | 2746 | case "${AT}" in |
michael@13 | 2747 | ia64 ) AT="IA64" ;; |
michael@13 | 2748 | x86_64 ) AT='AMD64' ;; |
michael@13 | 2749 | parisc ) AT="HPPA32" ;; |
michael@13 | 2750 | parisc64 ) AT="HPPA64" ;; |
michael@13 | 2751 | esac |
michael@13 | 2752 | AP="${AT}" |
michael@13 | 2753 | case "${AP}" in |
michael@13 | 2754 | i[3-6]86 ) AP='iX86' ;; |
michael@13 | 2755 | esac |
michael@13 | 2756 | AC="${AP}" |
michael@13 | 2757 | # determine system |
michael@13 | 2758 | v_kern=`echo "${UNAME_RELEASE}" |\ |
michael@13 | 2759 | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'` |
michael@13 | 2760 | v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\ |
michael@13 | 2761 | env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null` |
michael@13 | 2762 | ST="GNU/<Linux >${v_libc}/<${v_kern}>" |
michael@13 | 2763 | if [ -f /etc/lsb-release ]; then |
michael@13 | 2764 | eval `( . /etc/lsb-release |
michael@13 | 2765 | echo "SC=\"LSB${LSB_VERSION}\"" |
michael@13 | 2766 | if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then |
michael@13 | 2767 | echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\"" |
michael@13 | 2768 | fi |
michael@13 | 2769 | ) 2>/dev/null` |
michael@13 | 2770 | fi |
michael@13 | 2771 | if [ ".$SP" = . ]; then |
michael@13 | 2772 | for tagfile in x \ |
michael@13 | 2773 | `cd /etc && \ |
michael@13 | 2774 | /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \ |
michael@13 | 2775 | sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \ |
michael@13 | 2776 | echo redhat-release lsb-release` |
michael@13 | 2777 | do |
michael@13 | 2778 | [ ".${tagfile}" = .x ] && continue |
michael@13 | 2779 | [ ! -f "/etc/${tagfile}" ] && continue |
michael@13 | 2780 | n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'` |
michael@13 | 2781 | v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\ |
michael@13 | 2782 | sed -e 's/^/#/' \ |
michael@428 | 2783 | -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\).*$/\1[\2]/' \ |
michael@13 | 2784 | -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ |
michael@13 | 2785 | -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ |
michael@13 | 2786 | -e 's/^#.*$//'` |
michael@13 | 2787 | case "`util_lower ${n}`" in |
michael@13 | 2788 | redhat ) |
michael@13 | 2789 | if [ ".`egrep '(Red Hat Enterprise Linux|CentOS)' /etc/${tagfile}`" != . ]; then |
michael@13 | 2790 | n="<R>ed <H>at <E>nterprise <L>inux" |
michael@13 | 2791 | else |
michael@13 | 2792 | n="<R>ed <H>at <L>inux" |
michael@13 | 2793 | fi |
michael@13 | 2794 | ;; |
michael@13 | 2795 | debian ) n="Debian[ GNU/Linux]" ;; |
michael@13 | 2796 | ubuntu ) n="Ubuntu[ GNU/Linux]" ;; |
michael@13 | 2797 | fedora ) n="<Fedora> Core[ GNU/Linux]" ;; |
michael@13 | 2798 | suse ) n="[Novell ]SUSE[ Linux]" ;; |
michael@13 | 2799 | mandrake*|mandriva ) n="Mandriva[ Linux]" ;; |
michael@13 | 2800 | gentoo ) n="Gentoo[ GNU/Linux]" ;; |
michael@13 | 2801 | slackware ) n="Slackware[ Linux]" ;; |
michael@13 | 2802 | turbolinux ) n="TurboLinux" ;; |
michael@13 | 2803 | unitedlinux ) n="UnitedLinux" ;; |
michael@13 | 2804 | * ) n="${n}[ GNU/Linux]" ;; |
michael@13 | 2805 | esac |
michael@13 | 2806 | case "$n" in |
michael@13 | 2807 | *"<"*">"* ) SP="$n <$v>" ;; |
michael@13 | 2808 | * ) SP="$n $v" ;; |
michael@13 | 2809 | esac |
michael@13 | 2810 | break |
michael@13 | 2811 | done |
michael@13 | 2812 | fi |
michael@13 | 2813 | [ ".$SP" = . ] && SP="${ST}" |
michael@13 | 2814 | [ ".$SC" = . ] && SC="LSB" |
michael@13 | 2815 | ;; |
michael@13 | 2816 | |
michael@13 | 2817 | # Sun Solaris |
michael@13 | 2818 | *:SunOS:* ) |
michael@13 | 2819 | # determine architecture |
michael@13 | 2820 | AT="${UNAME_MACHINE}" |
michael@13 | 2821 | case "${AT}" in |
michael@13 | 2822 | i86pc ) |
michael@13 | 2823 | AT="iX86" |
michael@13 | 2824 | case "`(/bin/isainfo -k) 2>&1`" in |
michael@13 | 2825 | amd64 ) AT="AMD64" ;; |
michael@13 | 2826 | esac |
michael@13 | 2827 | ;; |
michael@13 | 2828 | esac |
michael@13 | 2829 | AP="${AT}" |
michael@13 | 2830 | case "${AP}" in |
michael@13 | 2831 | sun4[cdm] ) AP="SPARC32" ;; |
michael@13 | 2832 | sun4[uv] ) AP="SPARC64" ;; |
michael@13 | 2833 | sun4* ) AP="SPARC" ;; |
michael@13 | 2834 | esac |
michael@13 | 2835 | AC="${AP}" |
michael@13 | 2836 | case "${AC}" in |
michael@13 | 2837 | SPARC* ) AC="SPARC" ;; |
michael@13 | 2838 | esac |
michael@13 | 2839 | # determine system |
michael@13 | 2840 | ST="[Sun ]SunOS ${UNAME_RELEASE}" |
michael@13 | 2841 | v=`echo "${UNAME_RELEASE}" |\ |
michael@13 | 2842 | sed -e 's;^4\.;1.;' \ |
michael@13 | 2843 | -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \ |
michael@13 | 2844 | -e 's;^5\.\([0-9][0-9]*\).*;\1;'` |
michael@13 | 2845 | SP="[Sun ]Solaris $v" |
michael@13 | 2846 | case "${UNAME_RELEASE}" in |
michael@13 | 2847 | 4.* ) SC="4.3BSD" ;; |
michael@13 | 2848 | 5.* ) SC="SVR4" ;; |
michael@13 | 2849 | esac |
michael@13 | 2850 | ;; |
michael@13 | 2851 | |
michael@13 | 2852 | # SCO UnixWare |
michael@13 | 2853 | *:UnixWare:* ) |
michael@13 | 2854 | # determine architecture |
michael@13 | 2855 | AT="${UNAME_MACHINE}" |
michael@13 | 2856 | case "${AT}" in |
michael@13 | 2857 | i[3-6]86 | ix86at ) AT="iX86" ;; |
michael@13 | 2858 | esac |
michael@13 | 2859 | AP="${AT}" |
michael@13 | 2860 | # determine system |
michael@13 | 2861 | v=`/sbin/uname -v` |
michael@13 | 2862 | ST="[SCO ]UnixWare ${v}" |
michael@13 | 2863 | SP="${ST}" |
michael@13 | 2864 | SC="SVR${UNAME_RELEASE}" |
michael@13 | 2865 | ;; |
michael@13 | 2866 | |
michael@13 | 2867 | # QNX |
michael@13 | 2868 | *:QNX:* ) |
michael@13 | 2869 | # determine architecture |
michael@13 | 2870 | AT="${UNAME_MACHINE}" |
michael@13 | 2871 | case "${AT}" in |
michael@13 | 2872 | x86pc ) AT="iX86" ;; |
michael@13 | 2873 | esac |
michael@13 | 2874 | AP="${AT}" |
michael@13 | 2875 | # determine system |
michael@13 | 2876 | v="${UNAME_RELEASE}" |
michael@13 | 2877 | ST="QNX[ Neutrino RTOS] ${v}" |
michael@13 | 2878 | v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'` |
michael@13 | 2879 | SP="QNX[ Neutrino RTOS] ${v}" |
michael@13 | 2880 | SC="QNX" |
michael@13 | 2881 | ;; |
michael@13 | 2882 | |
michael@13 | 2883 | # SGI IRIX |
michael@13 | 2884 | *:IRIX*:* ) |
michael@13 | 2885 | # determine architecture |
michael@13 | 2886 | AT="${UNAME_MACHINE}" |
michael@13 | 2887 | AP="${AT}" |
michael@13 | 2888 | case "${AP}:${UNAME_SYSTEM}" in |
michael@13 | 2889 | IP*:IRIX64 ) AP="MIPS64" ;; |
michael@13 | 2890 | IP*:* ) AP="MIPS" ;; |
michael@13 | 2891 | esac |
michael@13 | 2892 | AC="${AP}" |
michael@13 | 2893 | # determine system |
michael@13 | 2894 | v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'` |
michael@13 | 2895 | ST="[SGI ]IRIX ${v}" |
michael@13 | 2896 | v="${UNAME_RELEASE}" |
michael@13 | 2897 | SP="[SGI ]IRIX ${v}" |
michael@13 | 2898 | SC="4.2BSD/SVR3" |
michael@13 | 2899 | ;; |
michael@13 | 2900 | |
michael@13 | 2901 | # HP HP-UX |
michael@13 | 2902 | *:HP-UX:* ) |
michael@13 | 2903 | # determine architecture |
michael@13 | 2904 | AT="${UNAME_MACHINE}" |
michael@13 | 2905 | case "${AT}" in |
michael@13 | 2906 | ia64 ) AT="IA64" ;; |
michael@13 | 2907 | 9000/[34]?? ) AT=M68K ;; |
michael@13 | 2908 | 9000/[678][0-9][0-9]) |
michael@13 | 2909 | sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` |
michael@13 | 2910 | sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` |
michael@13 | 2911 | case "${sc_cpu_version}" in |
michael@13 | 2912 | 523 ) AT="HPPA1.0" ;; |
michael@13 | 2913 | 528 ) AT="HPPA1.1" ;; |
michael@13 | 2914 | 532 ) AT="HPPA2.0" |
michael@13 | 2915 | case "${sc_kernel_bits}" in |
michael@13 | 2916 | 32 ) AT="${AT}n" ;; |
michael@13 | 2917 | 64 ) AT="${AT}w" ;; |
michael@13 | 2918 | esac |
michael@13 | 2919 | ;; |
michael@13 | 2920 | esac |
michael@13 | 2921 | ;; |
michael@13 | 2922 | esac |
michael@13 | 2923 | AP="${AT}" |
michael@13 | 2924 | case "${AP}" in |
michael@13 | 2925 | HPPA* ) AP="HPPA" ;; |
michael@13 | 2926 | esac |
michael@13 | 2927 | AC="${AP}" |
michael@13 | 2928 | # determine system |
michael@13 | 2929 | v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'` |
michael@13 | 2930 | ST="[HP ]<HP>-<UX ${v}>" |
michael@13 | 2931 | SP="${ST}" |
michael@13 | 2932 | case "${v}" in |
michael@13 | 2933 | 10.* ) SC="SVR4.2" ;; |
michael@13 | 2934 | [7-9]* ) SC="SVR4" ;; |
michael@13 | 2935 | esac |
michael@13 | 2936 | ;; |
michael@13 | 2937 | |
michael@13 | 2938 | # HP Tru64 (OSF1) |
michael@13 | 2939 | *:OSF1:* ) |
michael@13 | 2940 | # determine architecture |
michael@13 | 2941 | AP="${UNAME_MACHINE}" |
michael@13 | 2942 | case "${AP}" in |
michael@13 | 2943 | alpha ) AP="Alpha" ;; |
michael@13 | 2944 | esac |
michael@13 | 2945 | alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\ |
michael@13 | 2946 | sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'` |
michael@13 | 2947 | AT="${AP}${alpha_type}" |
michael@13 | 2948 | AC="${AP}" |
michael@13 | 2949 | # determine system |
michael@13 | 2950 | v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'` |
michael@13 | 2951 | ST="[HP ]Tru64 ${v}" |
michael@13 | 2952 | SP="${ST}" |
michael@13 | 2953 | SC="OSF1" |
michael@13 | 2954 | ;; |
michael@13 | 2955 | |
michael@13 | 2956 | # IBM AIX |
michael@13 | 2957 | *:AIX:* ) |
michael@13 | 2958 | # determine architecture |
michael@428 | 2959 | cpu_arch=RS6000 |
michael@13 | 2960 | if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then |
michael@13 | 2961 | cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` |
michael@13 | 2962 | if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then |
michael@428 | 2963 | cpu_arch=PPC |
michael@13 | 2964 | fi |
michael@13 | 2965 | elif [ -d /QOpenSys ]; then |
michael@13 | 2966 | # IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment) |
michael@428 | 2967 | cpu_arch=PPC |
michael@13 | 2968 | fi |
michael@13 | 2969 | if [ -x /usr/bin/oslevel ]; then |
michael@13 | 2970 | os_level=`/usr/bin/oslevel` |
michael@13 | 2971 | else |
michael@13 | 2972 | os_level="`uname -v`.`uname -r`" |
michael@13 | 2973 | fi |
michael@13 | 2974 | os_level=`echo "${os_level}" |\ |
michael@13 | 2975 | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \ |
michael@13 | 2976 | -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'` |
michael@13 | 2977 | AT="${cpu_arch}" |
michael@13 | 2978 | AP="${AT}" |
michael@13 | 2979 | AC="${AP}" |
michael@13 | 2980 | # determine system |
michael@13 | 2981 | ST="[IBM ]<AIX >${os_level}" |
michael@13 | 2982 | SP="${ST}" |
michael@13 | 2983 | case "${os_level}" in |
michael@13 | 2984 | [12]* ) SC="SVR2" ;; |
michael@13 | 2985 | * ) SC="SVR4" ;; |
michael@13 | 2986 | esac |
michael@13 | 2987 | ;; |
michael@13 | 2988 | |
michael@13 | 2989 | # Apple Mac OS X (Darwin) |
michael@13 | 2990 | *:Darwin:* ) |
michael@13 | 2991 | # determine architecture |
michael@13 | 2992 | AT="`uname -p`" |
michael@13 | 2993 | case "${AT}" in |
michael@13 | 2994 | powerpc ) AT="PPC" ;; |
michael@13 | 2995 | esac |
michael@13 | 2996 | AP="${AT}" |
michael@13 | 2997 | case "${AP}" in |
michael@13 | 2998 | i?86 ) AP="iX86" ;; |
michael@13 | 2999 | esac |
michael@13 | 3000 | AC="${AP}" |
michael@13 | 3001 | # determine system |
michael@13 | 3002 | unset v1; unset v2; unset v3 |
michael@13 | 3003 | eval `echo "${UNAME_RELEASE}" |\ |
michael@13 | 3004 | sed -e 's/^/#/' \ |
michael@13 | 3005 | -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ |
michael@13 | 3006 | -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ |
michael@13 | 3007 | -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ |
michael@13 | 3008 | -e 's/^#.*$/v1="0"/'` |
michael@13 | 3009 | ST="[Apple ]<${UNAME_SYSTEM} ${v1}>${v2+.$v2}${v3+[.$v3]}" |
michael@13 | 3010 | SP="$ST" |
michael@13 | 3011 | v="`(sw_vers) 2>/dev/null | grep 'ProductVersion:' | sed -e 's/^ProductVersion:[^0-9]*\([0-9][0-9.]*\).*$/\1/'`" |
michael@13 | 3012 | if [ ".$v" = . ]; then |
michael@13 | 3013 | for name in System Server; do |
michael@13 | 3014 | if [ -f /System/Library/CoreServices/${name}Version.plist ]; then |
michael@13 | 3015 | v=`(defaults read "/System/Library/CoreServices/${name}Version" "ProductVersion") 2>/dev/null` |
michael@13 | 3016 | [ ".$v" != . ] && break |
michael@13 | 3017 | fi |
michael@13 | 3018 | done |
michael@13 | 3019 | fi |
michael@13 | 3020 | if [ ".$v" != . ]; then |
michael@13 | 3021 | unset v1; unset v2; unset v3 |
michael@13 | 3022 | eval `echo "${v}" |\ |
michael@13 | 3023 | sed -e 's/^/#/' \ |
michael@13 | 3024 | -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ |
michael@13 | 3025 | -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ |
michael@13 | 3026 | -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ |
michael@13 | 3027 | -e 's/^#.*$/v1="0"/'` |
michael@13 | 3028 | SP="[Apple ]Mac OS X ${v1}${v2+.$v2}${v3+[.$v3]}" |
michael@13 | 3029 | fi |
michael@13 | 3030 | SC="4.4BSD/Mach3.0" |
michael@13 | 3031 | ;; |
michael@13 | 3032 | |
michael@428 | 3033 | # Windows/Cygwin |
michael@428 | 3034 | *:CYGWIN*:* ) |
michael@428 | 3035 | # determine architecture |
michael@428 | 3036 | AT="`uname -m`" |
michael@428 | 3037 | AP="${AT}" |
michael@428 | 3038 | case "${AP}" in |
michael@428 | 3039 | i?86 ) AP="iX86" ;; |
michael@428 | 3040 | esac |
michael@428 | 3041 | AC="${AP}" |
michael@428 | 3042 | # determine system |
michael@428 | 3043 | unset v1; unset v2; unset v3 |
michael@428 | 3044 | eval `echo "${UNAME_RELEASE}" |\ |
michael@428 | 3045 | sed -e 's/^/#/' \ |
michael@428 | 3046 | -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \ |
michael@428 | 3047 | -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \ |
michael@428 | 3048 | -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \ |
michael@428 | 3049 | -e 's/^#.*$/v1="0"/'` |
michael@428 | 3050 | ST="Cygwin ${v1}${v2+.$v2}${v3+[.$v3]}" |
michael@428 | 3051 | SP="$ST" |
michael@428 | 3052 | SC="Windows" |
michael@428 | 3053 | v=`echo "${UNAME_SYSTEM}" | sed -e 's/^CYGWIN_NT-//' |\ |
michael@428 | 3054 | sed -e 's/^/#/' -e 's/^#\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' -e 's/^#.*$//'` |
michael@428 | 3055 | case "$v" in |
michael@428 | 3056 | 4.0 ) SC="$SC[ NT]" ;; |
michael@428 | 3057 | 5.0 ) SC="$SC[ 2000]" ;; |
michael@428 | 3058 | 5.1 ) SC="$SC[ XP]" ;; |
michael@428 | 3059 | 6.0 ) SC="$SC[ Vista]" ;; |
michael@428 | 3060 | esac |
michael@428 | 3061 | ;; |
michael@428 | 3062 | |
michael@13 | 3063 | # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO |
michael@13 | 3064 | # *:XXX:* ) |
michael@13 | 3065 | # ... |
michael@13 | 3066 | # ;; |
michael@13 | 3067 | |
michael@13 | 3068 | # ...A STILL UNKNOWN PLATFORM... |
michael@13 | 3069 | * ) |
michael@13 | 3070 | AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"` |
michael@13 | 3071 | AP="${AT}" |
michael@13 | 3072 | AC="${AP}" |
michael@13 | 3073 | v=`echo "${UNAME_RELEASE}" |\ |
michael@13 | 3074 | sed -e 's/^/#/' \ |
michael@13 | 3075 | -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ |
michael@13 | 3076 | -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \ |
michael@13 | 3077 | -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \ |
michael@13 | 3078 | -e 's/^#.*$/?/'` |
michael@13 | 3079 | ST="${UNAME_SYSTEM} ${v}" |
michael@13 | 3080 | SP="${ST}" |
michael@13 | 3081 | SC="${SP}" |
michael@13 | 3082 | ;; |
michael@13 | 3083 | |
michael@13 | 3084 | esac |
michael@13 | 3085 | |
michael@13 | 3086 | # provide fallback values |
michael@13 | 3087 | [ ".$AT" = . ] && AT="${AP:-${AC}}" |
michael@13 | 3088 | [ ".$AP" = . ] && AP="${AT:-${AC}}" |
michael@13 | 3089 | [ ".$AC" = . ] && AC="${AP:-${AT}}" |
michael@13 | 3090 | [ ".$ST" = . ] && ST="${SP:-${SC}}" |
michael@13 | 3091 | [ ".$SP" = . ] && SP="${ST:-${SC}}" |
michael@13 | 3092 | [ ".$SC" = . ] && SC="${SP:-${ST}}" |
michael@13 | 3093 | |
michael@13 | 3094 | # support explicit enforced verbose/concise output |
michael@13 | 3095 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 3096 | opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'` |
michael@13 | 3097 | elif [ ".$opt_c" = .yes ]; then |
michael@13 | 3098 | opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'` |
michael@13 | 3099 | fi |
michael@13 | 3100 | |
michael@13 | 3101 | # provide verbose and concise variants |
michael@13 | 3102 | AC_V=""; AC_N=""; AC_C="" |
michael@13 | 3103 | AP_V=""; AP_N=""; AP_C="" |
michael@13 | 3104 | AT_V=""; AT_N=""; AT_C="" |
michael@13 | 3105 | SC_V=""; SC_N=""; SC_C="" |
michael@13 | 3106 | SP_V=""; SP_N=""; SP_C="" |
michael@13 | 3107 | ST_V=""; ST_N=""; ST_C="" |
michael@13 | 3108 | for var_lc in at ap ac st sp sc; do |
michael@13 | 3109 | case "$opt_F" in |
michael@13 | 3110 | *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* ) |
michael@13 | 3111 | var_uc=`util_upper "$var_lc"` |
michael@13 | 3112 | eval "val=\"\$${var_uc}\"" |
michael@13 | 3113 | val_V=""; val_N=""; val_C="" |
michael@13 | 3114 | case "$opt_F" in |
michael@13 | 3115 | *"%[${var_lc}]"* ) |
michael@13 | 3116 | val_V=`echo ":$val" | \ |
michael@13 | 3117 | sed -e 's/^://' \ |
michael@13 | 3118 | -e 's;\[\([^]]*\)\];\1;g' \ |
michael@13 | 3119 | -e 's;<\([^>]*\)>;\1;g' \ |
michael@13 | 3120 | -e "s; ;§§;g" \ |
michael@13 | 3121 | -e "s;/;%%;g" \ |
michael@13 | 3122 | -e "s;§§;${opt_S};g" \ |
michael@13 | 3123 | -e "s;%%;${opt_C};g"` |
michael@13 | 3124 | eval "${var_uc}_V=\"\${val_V}\"" |
michael@13 | 3125 | ;; |
michael@13 | 3126 | esac |
michael@13 | 3127 | case "$opt_F" in |
michael@13 | 3128 | *"%{${var_lc}}"* | *"%${var_lc}"* ) |
michael@13 | 3129 | val_N=`echo ":$val" | \ |
michael@13 | 3130 | sed -e 's/^://' \ |
michael@13 | 3131 | -e 's;\[\([^]]*\)\];;g' \ |
michael@13 | 3132 | -e 's;<\([^>]*\)>;\1;g' \ |
michael@13 | 3133 | -e "s; ;§§;g" \ |
michael@13 | 3134 | -e "s;/;%%;g" \ |
michael@13 | 3135 | -e "s;§§;${opt_S};g" \ |
michael@13 | 3136 | -e "s;%%;${opt_C};g"` |
michael@13 | 3137 | eval "${var_uc}_N=\"\${val_N}\"" |
michael@13 | 3138 | ;; |
michael@13 | 3139 | esac |
michael@13 | 3140 | case "$opt_F" in |
michael@13 | 3141 | *"%<${var_lc}>"* ) |
michael@13 | 3142 | val_C=`echo ":$val" | \ |
michael@13 | 3143 | sed -e 's/^://' \ |
michael@13 | 3144 | -e 's;\[\([^]]*\)\];;g' \ |
michael@13 | 3145 | -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \ |
michael@13 | 3146 | -e "s; ;§§;g" \ |
michael@13 | 3147 | -e "s;/;%%;g" \ |
michael@13 | 3148 | -e "s;§§;${opt_S};g" \ |
michael@13 | 3149 | -e "s;%%;${opt_C};g"` |
michael@13 | 3150 | eval "${var_uc}_C=\"\${val_C}\"" |
michael@13 | 3151 | ;; |
michael@13 | 3152 | esac |
michael@13 | 3153 | ;; |
michael@13 | 3154 | esac |
michael@13 | 3155 | done |
michael@13 | 3156 | |
michael@13 | 3157 | # create output string |
michael@13 | 3158 | output=`echo ":$opt_F" |\ |
michael@13 | 3159 | sed -e "s/^://" \ |
michael@13 | 3160 | -e "s;%\\[ac\\];${AC_V};g" \ |
michael@13 | 3161 | -e "s;%{ac};${AC_N};g" \ |
michael@13 | 3162 | -e "s;%ac;${AC_N};g" \ |
michael@13 | 3163 | -e "s;%<ac>;${AC_C};g" \ |
michael@13 | 3164 | -e "s;%\\[ap\\];${AP_V};g" \ |
michael@13 | 3165 | -e "s;%{ap};${AP_N};g" \ |
michael@13 | 3166 | -e "s;%ap;${AP_N};g" \ |
michael@13 | 3167 | -e "s;%<ap>;${AP_C};g" \ |
michael@13 | 3168 | -e "s;%\\[at\\];${AT_V};g" \ |
michael@13 | 3169 | -e "s;%{at};${AT_N};g" \ |
michael@13 | 3170 | -e "s;%at;${AT_N};g" \ |
michael@13 | 3171 | -e "s;%<at>;${AT_C};g" \ |
michael@13 | 3172 | -e "s;%\\[sc\\];${SC_V};g" \ |
michael@13 | 3173 | -e "s;%{sc};${SC_N};g" \ |
michael@13 | 3174 | -e "s;%sc;${SC_N};g" \ |
michael@13 | 3175 | -e "s;%<sc>;${SC_C};g" \ |
michael@13 | 3176 | -e "s;%\\[sp\\];${SP_V};g" \ |
michael@13 | 3177 | -e "s;%{sp};${SP_N};g" \ |
michael@13 | 3178 | -e "s;%sp;${SP_N};g" \ |
michael@13 | 3179 | -e "s;%<sp>;${SP_C};g" \ |
michael@13 | 3180 | -e "s;%\\[st\\];${ST_V};g" \ |
michael@13 | 3181 | -e "s;%{st};${ST_N};g" \ |
michael@13 | 3182 | -e "s;%st;${ST_N};g" \ |
michael@13 | 3183 | -e "s;%<st>;${ST_C};g" \ |
michael@13 | 3184 | -e 's/\\\\n/^/g' |\ |
michael@13 | 3185 | tr '^' '\012'` |
michael@13 | 3186 | |
michael@13 | 3187 | # support lower/upper-case mapping |
michael@13 | 3188 | if [ ".$opt_L" = .yes ]; then |
michael@13 | 3189 | output=`util_lower "$output"` |
michael@13 | 3190 | elif [ ".$opt_U" = .yes ]; then |
michael@13 | 3191 | output=`util_upper "$output"` |
michael@13 | 3192 | fi |
michael@13 | 3193 | |
michael@13 | 3194 | # display output string |
michael@13 | 3195 | if [ ".$opt_n" = .yes ]; then |
michael@13 | 3196 | echo . | awk '{ printf("%s", output); }' output="$output" |
michael@13 | 3197 | else |
michael@13 | 3198 | echo "$output" |
michael@13 | 3199 | fi |
michael@13 | 3200 | |
michael@13 | 3201 | shtool_exit 0 |
michael@13 | 3202 | ;; |
michael@13 | 3203 | |
michael@13 | 3204 | arx ) |
michael@13 | 3205 | ## |
michael@13 | 3206 | ## arx -- Extended archive command |
michael@428 | 3207 | ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 3208 | ## |
michael@13 | 3209 | |
michael@13 | 3210 | ar_prg="$opt_C" |
michael@13 | 3211 | ar_cmd="$1"; shift |
michael@13 | 3212 | archive="$1"; shift |
michael@13 | 3213 | files="$*" |
michael@13 | 3214 | |
michael@13 | 3215 | # walk through the file list and expand archives members |
michael@13 | 3216 | ar_tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'` |
michael@13 | 3217 | nfiles='' |
michael@13 | 3218 | if [ ".$files" != . ]; then |
michael@13 | 3219 | for file in $files; do |
michael@13 | 3220 | if [ ! -f $file ]; then |
michael@13 | 3221 | echo "$msgprefix:Error: input file not found: $file" 1>&2 |
michael@13 | 3222 | shtool_exit 1 |
michael@13 | 3223 | fi |
michael@13 | 3224 | case $file in |
michael@13 | 3225 | *.a ) |
michael@13 | 3226 | if [ ! -d $ar_tmpdir ]; then |
michael@13 | 3227 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 3228 | echo "mkdir $ar_tmpdir" 1>&2 |
michael@13 | 3229 | fi |
michael@13 | 3230 | mkdir $ar_tmpdir |
michael@13 | 3231 | fi |
michael@13 | 3232 | case $ar_tmpdir in |
michael@13 | 3233 | .arx ) |
michael@13 | 3234 | from="../$file" |
michael@13 | 3235 | ;; |
michael@13 | 3236 | * ) |
michael@13 | 3237 | dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'` |
michael@13 | 3238 | base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'` |
michael@13 | 3239 | from="`cd $dir; pwd`/$base" |
michael@13 | 3240 | ;; |
michael@13 | 3241 | esac |
michael@13 | 3242 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 3243 | echo "(cd $ar_tmpdir && $ar_prg x $from)" 1>&2 |
michael@13 | 3244 | fi |
michael@13 | 3245 | (cd $ar_tmpdir && eval $ar_prg x $from) |
michael@13 | 3246 | if [ $? -ne 0 ]; then |
michael@13 | 3247 | echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2 |
michael@13 | 3248 | shtool_exit 1 |
michael@13 | 3249 | fi |
michael@13 | 3250 | for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do |
michael@13 | 3251 | [ ".$member" = .- ] && continue |
michael@13 | 3252 | nfiles="$nfiles $ar_tmpdir/$member" |
michael@13 | 3253 | done |
michael@13 | 3254 | ;; |
michael@13 | 3255 | * ) |
michael@13 | 3256 | nfiles="$nfiles $file" |
michael@13 | 3257 | ;; |
michael@13 | 3258 | esac |
michael@13 | 3259 | done |
michael@13 | 3260 | fi |
michael@13 | 3261 | |
michael@13 | 3262 | # run the final archive command |
michael@13 | 3263 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 3264 | echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2 |
michael@13 | 3265 | fi |
michael@13 | 3266 | eval $ar_prg $ar_cmd $archive $nfiles |
michael@13 | 3267 | if [ $? -ne 0 ]; then |
michael@13 | 3268 | echo "$msgprefix:Error: archive command failed" 1>&2 |
michael@13 | 3269 | shtool_exit $? |
michael@13 | 3270 | fi |
michael@13 | 3271 | |
michael@13 | 3272 | # cleanup and die gracefully |
michael@13 | 3273 | if [ -d $ar_tmpdir ]; then |
michael@13 | 3274 | if [ ".$opt_t" = .yes ]; then |
michael@13 | 3275 | echo "rm -rf $ar_tmpdir" 1>&2 |
michael@13 | 3276 | fi |
michael@13 | 3277 | rm -rf $ar_tmpdir |
michael@13 | 3278 | fi |
michael@13 | 3279 | |
michael@13 | 3280 | shtool_exit 0 |
michael@13 | 3281 | ;; |
michael@13 | 3282 | |
michael@13 | 3283 | slo ) |
michael@13 | 3284 | ## |
michael@13 | 3285 | ## slo -- Separate linker options by library class |
michael@428 | 3286 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 3287 | ## |
michael@13 | 3288 | |
michael@13 | 3289 | DIFS="$IFS" |
michael@13 | 3290 | |
michael@13 | 3291 | # parse out -L and -l options from command line |
michael@13 | 3292 | DIRS='' |
michael@13 | 3293 | LIBS='' |
michael@13 | 3294 | ARGV='' |
michael@13 | 3295 | optprev='' |
michael@13 | 3296 | for opt |
michael@13 | 3297 | do |
michael@13 | 3298 | # concatenate with previous option if exists |
michael@13 | 3299 | if [ ".$optprev" != . ]; then |
michael@13 | 3300 | opt="${optprev}${opt}"; |
michael@13 | 3301 | optprev='' |
michael@13 | 3302 | fi |
michael@13 | 3303 | # remember options for arg if used stand-alone |
michael@13 | 3304 | if [ ".$opt" = ".-L" ] || [ ".$opt" = ".-l" ]; then |
michael@13 | 3305 | optprev="$opt" |
michael@13 | 3306 | continue; |
michael@13 | 3307 | fi |
michael@13 | 3308 | # split argument into option plus option argument |
michael@13 | 3309 | arg="`echo $opt | cut -c3-`" |
michael@13 | 3310 | opt="`echo $opt | cut -c1-2`" |
michael@13 | 3311 | # store into containers |
michael@13 | 3312 | case $opt in |
michael@13 | 3313 | -L) DIRS="$DIRS:$arg" ;; |
michael@13 | 3314 | -l) LIBS="$LIBS:$arg" ;; |
michael@13 | 3315 | *) ARGV="$ARGV $opt" ;; |
michael@13 | 3316 | esac |
michael@13 | 3317 | done |
michael@13 | 3318 | |
michael@13 | 3319 | # set linker default directories |
michael@13 | 3320 | DIRS_DEFAULT='/lib:/usr/lib' |
michael@13 | 3321 | if [ ".$LD_LIBRARY_PATH" != . ]; then |
michael@13 | 3322 | DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH" |
michael@13 | 3323 | fi |
michael@13 | 3324 | |
michael@13 | 3325 | # sort options by class |
michael@13 | 3326 | DIRS_OBJ='' |
michael@13 | 3327 | LIBS_OBJ='' |
michael@13 | 3328 | DIRS_PIC='' |
michael@13 | 3329 | LIBS_PIC='' |
michael@13 | 3330 | DIRS_DSO='' |
michael@13 | 3331 | LIBS_DSO='' |
michael@13 | 3332 | |
michael@13 | 3333 | # for each library... |
michael@13 | 3334 | OIFS="$IFS"; IFS=':' |
michael@13 | 3335 | for lib in $LIBS; do |
michael@13 | 3336 | [ ".$lib" = . ] && continue |
michael@13 | 3337 | |
michael@13 | 3338 | found='no' |
michael@13 | 3339 | found_indefdir='no' |
michael@13 | 3340 | found_type='' |
michael@13 | 3341 | found_dir='' |
michael@13 | 3342 | |
michael@13 | 3343 | # for each directory... |
michael@13 | 3344 | OIFS2="$IFS"; IFS=":$DIFS" |
michael@13 | 3345 | for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do |
michael@13 | 3346 | [ ".$dir" = . ] && continue |
michael@13 | 3347 | [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes |
michael@13 | 3348 | [ ! -d $dir ] && continue |
michael@13 | 3349 | |
michael@13 | 3350 | # search the file |
michael@13 | 3351 | OIFS3="$IFS"; IFS="$DIFS" |
michael@13 | 3352 | for file in '' `cd $dir && env -i /bin/ls lib${lib}.* 2>/dev/null`; do |
michael@13 | 3353 | [ ".$file" = . ] && continue |
michael@13 | 3354 | case $file in |
michael@13 | 3355 | *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* ) |
michael@13 | 3356 | found=yes; |
michael@13 | 3357 | found_type=DSO; |
michael@13 | 3358 | break |
michael@13 | 3359 | ;; |
michael@13 | 3360 | *.lo|*.la ) |
michael@13 | 3361 | found=yes; |
michael@13 | 3362 | found_type=PIC |
michael@13 | 3363 | ;; |
michael@13 | 3364 | *.a ) |
michael@13 | 3365 | if [ ".$found_type" = . ]; then |
michael@13 | 3366 | found=yes |
michael@13 | 3367 | found_type=OBJ |
michael@13 | 3368 | fi |
michael@13 | 3369 | ;; |
michael@13 | 3370 | esac |
michael@13 | 3371 | done |
michael@13 | 3372 | IFS="$OIFS3" |
michael@13 | 3373 | if [ ".$found" = .yes ]; then |
michael@13 | 3374 | found_dir="$dir" |
michael@13 | 3375 | break |
michael@13 | 3376 | fi |
michael@13 | 3377 | done |
michael@13 | 3378 | IFS="$OIFS2" |
michael@13 | 3379 | |
michael@13 | 3380 | if [ ".$found" = .yes ]; then |
michael@13 | 3381 | if [ ".$found_indefdir" != .yes ]; then |
michael@13 | 3382 | eval "dirlist=\"\${DIRS_${found_type}}:\"" |
michael@13 | 3383 | case "$dirlist" in |
michael@13 | 3384 | *:$found_dir:* ) ;; |
michael@13 | 3385 | * ) eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\"" ;; |
michael@13 | 3386 | esac |
michael@13 | 3387 | eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" |
michael@13 | 3388 | else |
michael@13 | 3389 | eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" |
michael@13 | 3390 | fi |
michael@13 | 3391 | else |
michael@13 | 3392 | LIBS_OBJ="$LIBS_OBJ:$lib" |
michael@13 | 3393 | #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`" |
michael@13 | 3394 | #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1 |
michael@13 | 3395 | #echo "slo:Warning: $dirlist" 1>&1 |
michael@13 | 3396 | fi |
michael@13 | 3397 | done |
michael@13 | 3398 | IFS="$OIFS" |
michael@13 | 3399 | |
michael@13 | 3400 | # also pass-through unused dirs even if it's useless |
michael@13 | 3401 | OIFS="$IFS"; IFS=':' |
michael@13 | 3402 | for dir in $DIRS; do |
michael@13 | 3403 | dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:" |
michael@13 | 3404 | case "$dirlist" in |
michael@13 | 3405 | *:$dir:* ) ;; |
michael@13 | 3406 | * ) DIRS_OBJ="$DIRS_OBJ:$dir" ;; |
michael@13 | 3407 | esac |
michael@13 | 3408 | done |
michael@13 | 3409 | IFS="$OIFS" |
michael@13 | 3410 | |
michael@13 | 3411 | # reassemble the options but separated by type |
michael@13 | 3412 | for type in OBJ PIC DSO; do |
michael@13 | 3413 | OIFS="$IFS"; IFS=':' |
michael@13 | 3414 | eval "libs=\"\$LIBS_${type}\"" |
michael@13 | 3415 | opts='' |
michael@13 | 3416 | for lib in $libs; do |
michael@13 | 3417 | [ ".$lib" = . ] && continue |
michael@13 | 3418 | opts="$opts -l$lib" |
michael@13 | 3419 | done |
michael@13 | 3420 | eval "LIBS_${type}=\"$opts\"" |
michael@13 | 3421 | |
michael@13 | 3422 | eval "dirs=\"\$DIRS_${type}\"" |
michael@13 | 3423 | opts='' |
michael@13 | 3424 | for dir in $dirs; do |
michael@13 | 3425 | [ ".$dir" = . ] && continue |
michael@13 | 3426 | opts="$opts -L$dir" |
michael@13 | 3427 | done |
michael@13 | 3428 | eval "DIRS_${type}=\"$opts\"" |
michael@13 | 3429 | IFS="$OIFS" |
michael@13 | 3430 | done |
michael@13 | 3431 | |
michael@13 | 3432 | # give back results |
michael@13 | 3433 | for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do |
michael@13 | 3434 | eval "val=\"\$${var}\"" |
michael@13 | 3435 | val="`echo $val | sed -e 's/^ *//'`" |
michael@13 | 3436 | echo "${opt_p}${var}=\"${val}\"" |
michael@13 | 3437 | done |
michael@13 | 3438 | |
michael@13 | 3439 | shtool_exit 0 |
michael@13 | 3440 | ;; |
michael@13 | 3441 | |
michael@13 | 3442 | scpp ) |
michael@13 | 3443 | ## |
michael@13 | 3444 | ## scpp -- Sharing C Pre-Processor |
michael@428 | 3445 | ## Copyright (c) 1999-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 3446 | ## |
michael@13 | 3447 | |
michael@13 | 3448 | srcs="$*" |
michael@13 | 3449 | output="${opt_o}.n" |
michael@13 | 3450 | |
michael@13 | 3451 | # find a reasonable Awk |
michael@13 | 3452 | awk='' |
michael@13 | 3453 | paths=`echo $PATH |\ |
michael@13 | 3454 | sed -e 's%/*:%:%g' -e 's%/$%%' \ |
michael@13 | 3455 | -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ |
michael@13 | 3456 | -e 's/:/ /g'` |
michael@13 | 3457 | for name in gawk nawk awk; do |
michael@13 | 3458 | for path in $paths; do |
michael@13 | 3459 | if [ -r "$path/$name" ]; then |
michael@13 | 3460 | awk="$path/$name" |
michael@13 | 3461 | break |
michael@13 | 3462 | fi |
michael@13 | 3463 | done |
michael@13 | 3464 | if [ ".$awk" != . ]; then |
michael@13 | 3465 | break |
michael@13 | 3466 | fi |
michael@13 | 3467 | done |
michael@13 | 3468 | if [ ".$awk" = . ]; then |
michael@13 | 3469 | echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2 |
michael@13 | 3470 | shtool_exit 1 |
michael@13 | 3471 | fi |
michael@13 | 3472 | |
michael@13 | 3473 | # parse source file(s) |
michael@13 | 3474 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 3475 | echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2 |
michael@13 | 3476 | fi |
michael@13 | 3477 | for src in $srcs; do |
michael@13 | 3478 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 3479 | echo $src | $awk '{ printf(" %s", $0); }' 1>&2 |
michael@13 | 3480 | fi |
michael@13 | 3481 | if [ ".$opt_f" != . ]; then |
michael@13 | 3482 | inputcmd="sed" |
michael@13 | 3483 | OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_f; IFS="$OIFS" |
michael@13 | 3484 | for e |
michael@13 | 3485 | do |
michael@13 | 3486 | inputcmd="$inputcmd -e '$e'" |
michael@13 | 3487 | done |
michael@13 | 3488 | inputcmd="$inputcmd '$src'" |
michael@13 | 3489 | else |
michael@13 | 3490 | inputcmd="cat '$src'" |
michael@13 | 3491 | fi |
michael@13 | 3492 | eval $inputcmd |\ |
michael@13 | 3493 | $awk ' |
michael@13 | 3494 | BEGIN { |
michael@13 | 3495 | ln = 0; |
michael@13 | 3496 | fln = 0; |
michael@13 | 3497 | level = 0; |
michael@13 | 3498 | mode = ""; |
michael@13 | 3499 | store = ""; |
michael@13 | 3500 | } |
michael@13 | 3501 | { |
michael@13 | 3502 | ln++; |
michael@13 | 3503 | } |
michael@13 | 3504 | /^#if.*/ { |
michael@13 | 3505 | level++; |
michael@13 | 3506 | } |
michael@13 | 3507 | /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ { |
michael@13 | 3508 | if ($2 == define) { |
michael@13 | 3509 | mode = "D"; |
michael@13 | 3510 | printf("D:#line %d \"%s\"\n", ln, src); |
michael@13 | 3511 | next; |
michael@13 | 3512 | } |
michael@13 | 3513 | } |
michael@13 | 3514 | /^#endif.*/ { |
michael@13 | 3515 | level--; |
michael@13 | 3516 | if (mode == "D" && level == 0) { |
michael@13 | 3517 | mode = ""; |
michael@13 | 3518 | next; |
michael@13 | 3519 | } |
michael@13 | 3520 | } |
michael@13 | 3521 | /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ { |
michael@13 | 3522 | if ($1 == class) { |
michael@13 | 3523 | printf("V:#line %d \"%s\"\n", ln, src); |
michael@13 | 3524 | printf("V:%s\n", $0); |
michael@13 | 3525 | printf("J:%s\n", $0); |
michael@13 | 3526 | next; |
michael@13 | 3527 | } |
michael@13 | 3528 | } |
michael@13 | 3529 | /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ { |
michael@13 | 3530 | if ($1 == class) { |
michael@13 | 3531 | printf("V:#line %d \"%s\"\n", ln, src); |
michael@13 | 3532 | printf("V:%s\n", $0); |
michael@13 | 3533 | printf("J:%s\n", $0); |
michael@13 | 3534 | next; |
michael@13 | 3535 | } |
michael@13 | 3536 | } |
michael@13 | 3537 | /^[a-zA-Z_][a-zA-Z0-9_]*/ { |
michael@13 | 3538 | if ($1 == class) { |
michael@13 | 3539 | fln = ln; |
michael@13 | 3540 | store = $0; |
michael@13 | 3541 | mode = "F"; |
michael@13 | 3542 | next; |
michael@13 | 3543 | } |
michael@13 | 3544 | } |
michael@13 | 3545 | /^\{ *$/ { |
michael@13 | 3546 | if (mode == "F") { |
michael@13 | 3547 | printf("F:#line %d \"%s\"\n", fln, src); |
michael@13 | 3548 | printf("F:%s;\n", store); |
michael@13 | 3549 | printf("I:%s;\n", store); |
michael@13 | 3550 | store = ""; |
michael@13 | 3551 | mode = ""; |
michael@13 | 3552 | next; |
michael@13 | 3553 | } |
michael@13 | 3554 | } |
michael@13 | 3555 | { |
michael@13 | 3556 | if (mode == "D") |
michael@13 | 3557 | printf("D:%s\n", $0); |
michael@13 | 3558 | else if (mode == "F") |
michael@13 | 3559 | store = store " " $0; |
michael@13 | 3560 | } |
michael@13 | 3561 | ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile |
michael@13 | 3562 | done |
michael@13 | 3563 | if [ ".$opt_v" = .yes ]; then |
michael@13 | 3564 | echo "" 1>&2 |
michael@13 | 3565 | fi |
michael@13 | 3566 | |
michael@13 | 3567 | # start generating output header |
michael@13 | 3568 | echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output |
michael@13 | 3569 | echo "#line 1 \"$opt_t\"" >>$output |
michael@13 | 3570 | sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\ |
michael@13 | 3571 | sed -e "/^${opt_M} *\$/d" >>$output |
michael@13 | 3572 | |
michael@13 | 3573 | # merge in the define blocks |
michael@13 | 3574 | grep '^D:' $tmpfile | sed -e 's/^D://' >>$output |
michael@13 | 3575 | |
michael@13 | 3576 | # generate standard prolog |
michael@13 | 3577 | echo "#line 1 \"_ON_THE_FLY_\"" >>$output |
michael@13 | 3578 | echo "" >>$output |
michael@13 | 3579 | echo "/* make sure the scpp source extensions are skipped */" >>$output |
michael@13 | 3580 | echo "#define $opt_D 0" >>$output |
michael@13 | 3581 | echo "#define $opt_C /**/" >>$output |
michael@13 | 3582 | |
michael@13 | 3583 | # generate namespace hiding for variables |
michael@13 | 3584 | echo "" >>$output |
michael@13 | 3585 | echo "/* move intern variables to hidden namespace */" >>$output |
michael@13 | 3586 | grep '^J:' $tmpfile | sed >>$output \ |
michael@13 | 3587 | -e 's/^J://' \ |
michael@13 | 3588 | -e 's/ */ /g' \ |
michael@13 | 3589 | -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \ |
michael@13 | 3590 | -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \ |
michael@13 | 3591 | -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \ |
michael@13 | 3592 | -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/' |
michael@13 | 3593 | |
michael@13 | 3594 | # generate namespace hiding for functions |
michael@13 | 3595 | echo "" >>$output |
michael@13 | 3596 | echo "/* move intern functions to hidden namespace */" >>$output |
michael@13 | 3597 | grep '^I:' $tmpfile | sed >>$output \ |
michael@13 | 3598 | -e 's/^I://' \ |
michael@13 | 3599 | -e 's/\([ (]\) */\1/g' \ |
michael@13 | 3600 | -e 's/ *\([),]\)/\1/g' \ |
michael@13 | 3601 | -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/' |
michael@13 | 3602 | |
michael@13 | 3603 | # generate prototypes for variables |
michael@13 | 3604 | echo "" >>$output |
michael@13 | 3605 | echo "/* prototypes for intern variables */" >>$output |
michael@13 | 3606 | grep '^V:' $tmpfile | sed >>$output \ |
michael@13 | 3607 | -e 's/^V://' \ |
michael@13 | 3608 | -e 's/ */ /g' \ |
michael@13 | 3609 | -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \ |
michael@13 | 3610 | -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \ |
michael@13 | 3611 | -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \ |
michael@13 | 3612 | -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \ |
michael@13 | 3613 | -e 's/ ;/;/g' \ |
michael@13 | 3614 | -e "s/^$opt_C /extern /" |
michael@13 | 3615 | |
michael@13 | 3616 | # generate prototypes for functions |
michael@13 | 3617 | echo "" >>$output |
michael@13 | 3618 | echo "/* prototypes for intern functions */" >>$output |
michael@13 | 3619 | grep '^F:' $tmpfile | sed >>$output \ |
michael@13 | 3620 | -e 's/^F://' \ |
michael@13 | 3621 | -e 's/\([ (]\) */\1/g' \ |
michael@13 | 3622 | -e 's/ *\([),]\)/\1/g' \ |
michael@13 | 3623 | -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \ |
michael@13 | 3624 | -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \ |
michael@13 | 3625 | -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \ |
michael@13 | 3626 | -e 's/\([ (]\) */\1/g' \ |
michael@13 | 3627 | -e 's/ *\([),]\)/\1/g' \ |
michael@13 | 3628 | -e "s/^$opt_C /extern /" |
michael@13 | 3629 | |
michael@13 | 3630 | # finish generating output header |
michael@13 | 3631 | n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\ |
michael@13 | 3632 | wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'` |
michael@13 | 3633 | echo "#line $n \"$opt_t\"" >>$output |
michael@13 | 3634 | sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\ |
michael@13 | 3635 | sed -e "/^${opt_M} *\$/d" >>$output |
michael@13 | 3636 | |
michael@13 | 3637 | # create final output file |
michael@13 | 3638 | if [ -f $opt_o ]; then |
michael@13 | 3639 | if [ ".$opt_p" = .yes ]; then |
michael@13 | 3640 | grep -v '^#line' $opt_o >$tmpfile.o |
michael@13 | 3641 | grep -v '^#line' $output >$tmpfile.n |
michael@13 | 3642 | out_old="$tmpfile.o" |
michael@13 | 3643 | out_new="$tmpfile.n" |
michael@13 | 3644 | else |
michael@13 | 3645 | out_old="$opt_o" |
michael@13 | 3646 | out_new="$output" |
michael@13 | 3647 | fi |
michael@13 | 3648 | if cmp -s $out_old $out_new; then |
michael@13 | 3649 | : |
michael@13 | 3650 | else |
michael@13 | 3651 | cp $output $opt_o |
michael@13 | 3652 | fi |
michael@13 | 3653 | else |
michael@13 | 3654 | cp $output $opt_o |
michael@13 | 3655 | fi |
michael@13 | 3656 | rm -f $output |
michael@13 | 3657 | rm -f $tmpfile $tmpfile.* >/dev/null 2>&1 |
michael@13 | 3658 | |
michael@13 | 3659 | shtool_exit 0 |
michael@13 | 3660 | ;; |
michael@13 | 3661 | |
michael@13 | 3662 | version ) |
michael@13 | 3663 | ## |
michael@13 | 3664 | ## version -- Maintain a version information file |
michael@428 | 3665 | ## Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 3666 | ## |
michael@13 | 3667 | |
michael@13 | 3668 | file="$1" |
michael@13 | 3669 | |
michael@13 | 3670 | # determine prefix and name |
michael@13 | 3671 | name="$opt_n" |
michael@13 | 3672 | prefix="$opt_p" |
michael@13 | 3673 | |
michael@13 | 3674 | # determine current version |
michael@13 | 3675 | triple="$opt_s" |
michael@13 | 3676 | if [ ".$triple" != . ]; then |
michael@13 | 3677 | # use given triple |
michael@13 | 3678 | if [ ".`echo $triple | grep '[0-9]*.[0-9]*[sabp.][0-9]*'`" = . ]; then |
michael@13 | 3679 | echo "$msgprefix:Error: invalid argument to option \`-s': \`$opt_s'" 1>&2 |
michael@13 | 3680 | shtool_exit 1 |
michael@13 | 3681 | fi |
michael@13 | 3682 | eval `echo $triple |\ |
michael@13 | 3683 | sed -e 's%\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\).*%\ |
michael@13 | 3684 | ver="\1";rev="\2";typ="\3";lev="\4"%'` |
michael@13 | 3685 | tim=calc |
michael@13 | 3686 | elif [ -r $file ]; then |
michael@13 | 3687 | # determine triple from given file |
michael@13 | 3688 | eval `grep 'Version [0-9]*.[0-9]*[sabp.][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $file |\ |
michael@13 | 3689 | sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\ |
michael@13 | 3690 | ver="\1";rev="\2";typ="\3";lev="\4";tim="\5"%' -e 'q'` |
michael@13 | 3691 | else |
michael@13 | 3692 | # intialise to first version |
michael@13 | 3693 | ver=0 |
michael@13 | 3694 | rev=1 |
michael@13 | 3695 | typ=. |
michael@13 | 3696 | lev=0 |
michael@13 | 3697 | tim=calc |
michael@13 | 3698 | fi |
michael@13 | 3699 | |
michael@13 | 3700 | # determine new version in batch |
michael@13 | 3701 | if [ ".$opt_i" != . ]; then |
michael@13 | 3702 | case $opt_i in |
michael@13 | 3703 | v ) ver=`expr $ver + 1` |
michael@13 | 3704 | rev=0 |
michael@13 | 3705 | lev=0 |
michael@13 | 3706 | ;; |
michael@13 | 3707 | r ) rev=`expr $rev + 1` |
michael@13 | 3708 | lev=0 |
michael@13 | 3709 | ;; |
michael@13 | 3710 | l ) lev=`expr $lev + 1` |
michael@13 | 3711 | ;; |
michael@13 | 3712 | * ) echo "$msgprefix:Error: invalid argument to option \`-i': \`$opt_i'" 1>&2 |
michael@13 | 3713 | shtool_exit 1 |
michael@13 | 3714 | ;; |
michael@13 | 3715 | esac |
michael@13 | 3716 | tim=calc |
michael@13 | 3717 | fi |
michael@13 | 3718 | |
michael@13 | 3719 | # determine new version interactively |
michael@13 | 3720 | if [ ".$opt_e" = .yes ]; then |
michael@13 | 3721 | echo "old version: ${ver}.${rev}${typ}${lev}" |
michael@13 | 3722 | while [ 1 ]; do |
michael@13 | 3723 | echo dummy | awk '{ printf("new version: "); }' |
michael@13 | 3724 | read triple |
michael@13 | 3725 | case $triple in |
michael@13 | 3726 | [0-9]*.[0-9]*[sabp.][0-9]* ) |
michael@13 | 3727 | ;; |
michael@13 | 3728 | * ) echo "$msgprefix:Error: invalid version string entered: \`$triple'" 1>&2 |
michael@13 | 3729 | continue |
michael@13 | 3730 | ;; |
michael@13 | 3731 | esac |
michael@13 | 3732 | break |
michael@13 | 3733 | done |
michael@13 | 3734 | eval `echo $triple |\ |
michael@13 | 3735 | sed -e 's%^\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\)$%\ |
michael@13 | 3736 | ver="\1";rev="\2";typ="\3";lev="\4"%'` |
michael@13 | 3737 | tim=calc |
michael@13 | 3738 | fi |
michael@13 | 3739 | |
michael@13 | 3740 | # determine hexadecimal and libtool value of version |
michael@13 | 3741 | case $typ in |
michael@13 | 3742 | a ) typnum=0; levnum=$lev ;; |
michael@13 | 3743 | b ) typnum=1; levnum=$lev ;; |
michael@13 | 3744 | p | . ) typnum=2; levnum=$lev ;; |
michael@13 | 3745 | s ) typnum=15; levnum=255 ;; # snapshots are special |
michael@13 | 3746 | esac |
michael@13 | 3747 | hex=`echo "$ver:$rev:$typnum:$levnum" |\ |
michael@13 | 3748 | awk -F: '{ printf("0x%x%02x%1x%02x", $1, $2, $3, $4); }' |\ |
michael@13 | 3749 | tr 'abcdef' 'ABCDEF'` |
michael@13 | 3750 | ltv=`echo "$ver:$rev:$typnum:$levnum" |\ |
michael@13 | 3751 | awk -F: '{ printf("%d:%d", $1*10 + $2, $3*10 + $4); }'` |
michael@13 | 3752 | |
michael@13 | 3753 | # determine date |
michael@13 | 3754 | if [ ".$tim" = .calc ]; then |
michael@13 | 3755 | day=`date '+%d'` |
michael@13 | 3756 | month=`date '+%m'` |
michael@13 | 3757 | year=`date '+%Y' 2>/dev/null` |
michael@13 | 3758 | if [ ".$time_year" = . ]; then |
michael@13 | 3759 | year=`date '+%y'` |
michael@13 | 3760 | case $year in |
michael@13 | 3761 | [5-9][0-9]) year="19$year" ;; |
michael@13 | 3762 | [0-4][0-9]) year="20$year" ;; |
michael@13 | 3763 | esac |
michael@13 | 3764 | fi |
michael@13 | 3765 | case $month in |
michael@13 | 3766 | 1|01) month='Jan' ;; |
michael@13 | 3767 | 2|02) month='Feb' ;; |
michael@13 | 3768 | 3|03) month='Mar' ;; |
michael@13 | 3769 | 4|04) month='Apr' ;; |
michael@13 | 3770 | 5|05) month='May' ;; |
michael@13 | 3771 | 6|06) month='Jun' ;; |
michael@13 | 3772 | 7|07) month='Jul' ;; |
michael@13 | 3773 | 8|08) month='Aug' ;; |
michael@13 | 3774 | 9|09) month='Sep' ;; |
michael@13 | 3775 | 10) month='Oct' ;; |
michael@13 | 3776 | 11) month='Nov' ;; |
michael@13 | 3777 | 12) month='Dec' ;; |
michael@13 | 3778 | esac |
michael@13 | 3779 | tim="${day}-${month}-${year}" |
michael@13 | 3780 | fi |
michael@13 | 3781 | |
michael@13 | 3782 | # perform result actions |
michael@13 | 3783 | mode=show |
michael@13 | 3784 | if [ ".$opt_i" != . ]; then |
michael@13 | 3785 | mode=edit |
michael@13 | 3786 | elif [ ".$opt_e" = .yes ]; then |
michael@13 | 3787 | mode=edit |
michael@13 | 3788 | elif [ ".$opt_s" != . ]; then |
michael@13 | 3789 | mode=edit |
michael@13 | 3790 | fi |
michael@13 | 3791 | if [ ".$mode" = .show ]; then |
michael@13 | 3792 | # just display the current version |
michael@13 | 3793 | case $opt_d in |
michael@13 | 3794 | short ) |
michael@13 | 3795 | echo "${ver}.${rev}${typ}${lev}" |
michael@13 | 3796 | ;; |
michael@13 | 3797 | long ) |
michael@13 | 3798 | echo "${ver}.${rev}${typ}${lev} ($tim)" |
michael@13 | 3799 | ;; |
michael@13 | 3800 | libtool ) |
michael@13 | 3801 | echo "${ltv}" |
michael@13 | 3802 | ;; |
michael@13 | 3803 | hex ) |
michael@13 | 3804 | echo "${hex}" |
michael@13 | 3805 | ;; |
michael@13 | 3806 | * ) echo "$msgprefix:Error: invalid argument to option \`-d': \`$opt_d'" 1>&2 |
michael@13 | 3807 | shtool_exit 1 |
michael@13 | 3808 | ;; |
michael@13 | 3809 | esac |
michael@13 | 3810 | else |
michael@13 | 3811 | # update the version file |
michael@13 | 3812 | |
michael@13 | 3813 | # pre-generate various strings |
michael@13 | 3814 | triple="${ver}.${rev}${typ}${lev}" |
michael@13 | 3815 | vHex="$hex" |
michael@13 | 3816 | vShort="${triple}" |
michael@13 | 3817 | vLong="${triple} (${tim})" |
michael@13 | 3818 | vTeX="This is ${name}, Version ${triple} (${tim})" |
michael@13 | 3819 | vGNU="${name} ${triple} (${tim})" |
michael@13 | 3820 | vWeb="${name}/${triple}" |
michael@13 | 3821 | vSCCS="@(#)${name} ${triple} (${tim})" |
michael@13 | 3822 | vRCS="\$Id: ${name} ${triple} (${tim}) \$" |
michael@13 | 3823 | |
michael@13 | 3824 | # determine string out of filename |
michael@13 | 3825 | # (do NOT try to optimize this in any way because of portability) |
michael@13 | 3826 | filestr=`util_upper "$file" | tr './%+' '____' | sed -e 's/-/_/g'` |
michael@13 | 3827 | |
michael@13 | 3828 | # generate uppercase prefix |
michael@13 | 3829 | prefixupper=`util_upper "$prefix"` |
michael@13 | 3830 | |
michael@13 | 3831 | # create the version file according the the selected language |
michael@13 | 3832 | echo "new version: ${vLong}" |
michael@13 | 3833 | |
michael@13 | 3834 | cp /dev/null $file |
michael@13 | 3835 | case $opt_l in |
michael@13 | 3836 | txt ) |
michael@13 | 3837 | echo >>$file "" |
michael@13 | 3838 | echo >>$file " ${file} -- Version Information for ${name} (syntax: Text)" |
michael@13 | 3839 | echo >>$file " [automatically generated and maintained by GNU shtool]" |
michael@13 | 3840 | echo >>$file "" |
michael@13 | 3841 | echo >>$file " $vTeX" |
michael@13 | 3842 | echo >>$file "" |
michael@13 | 3843 | ;; |
michael@13 | 3844 | c ) |
michael@13 | 3845 | echo >>$file "/*" |
michael@13 | 3846 | echo >>$file "** ${file} -- Version Information for ${name} (syntax: C/C++)" |
michael@13 | 3847 | echo >>$file "** [automatically generated and maintained by GNU shtool]" |
michael@13 | 3848 | echo >>$file "*/" |
michael@13 | 3849 | echo >>$file "" |
michael@13 | 3850 | echo >>$file "#ifdef _${filestr}_AS_HEADER_" |
michael@13 | 3851 | echo >>$file "" |
michael@13 | 3852 | echo >>$file "#ifndef _${filestr}_" |
michael@13 | 3853 | echo >>$file "#define _${filestr}_" |
michael@13 | 3854 | echo >>$file "" |
michael@13 | 3855 | echo >>$file "#define ${prefixupper}VERSION ${vHex}" |
michael@13 | 3856 | echo >>$file "" |
michael@13 | 3857 | echo >>$file "typedef struct {" |
michael@13 | 3858 | echo >>$file " const int v_hex;" |
michael@13 | 3859 | echo >>$file " const char *v_short;" |
michael@13 | 3860 | echo >>$file " const char *v_long;" |
michael@13 | 3861 | echo >>$file " const char *v_tex;" |
michael@13 | 3862 | echo >>$file " const char *v_gnu;" |
michael@13 | 3863 | echo >>$file " const char *v_web;" |
michael@13 | 3864 | echo >>$file " const char *v_sccs;" |
michael@13 | 3865 | echo >>$file " const char *v_rcs;" |
michael@13 | 3866 | echo >>$file "} ${prefix}version_t;" |
michael@13 | 3867 | echo >>$file "" |
michael@13 | 3868 | echo >>$file "extern ${prefix}version_t ${prefix}version;" |
michael@13 | 3869 | echo >>$file "" |
michael@13 | 3870 | echo >>$file "#endif /* _${filestr}_ */" |
michael@13 | 3871 | echo >>$file "" |
michael@13 | 3872 | echo >>$file "#else /* _${filestr}_AS_HEADER_ */" |
michael@13 | 3873 | echo >>$file "" |
michael@13 | 3874 | echo >>$file "#define _${filestr}_AS_HEADER_" |
michael@13 | 3875 | echo >>$file "#include \"${file}\"" |
michael@13 | 3876 | echo >>$file "#undef _${filestr}_AS_HEADER_" |
michael@13 | 3877 | echo >>$file "" |
michael@13 | 3878 | echo >>$file "${prefix}version_t ${prefix}version = {" |
michael@13 | 3879 | echo >>$file " ${vHex}," |
michael@13 | 3880 | echo >>$file " \"${vShort}\"," |
michael@13 | 3881 | echo >>$file " \"${vLong}\"," |
michael@13 | 3882 | echo >>$file " \"${vTeX}\"," |
michael@13 | 3883 | echo >>$file " \"${vGNU}\"," |
michael@13 | 3884 | echo >>$file " \"${vWeb}\"," |
michael@13 | 3885 | echo >>$file " \"${vSCCS}\"," |
michael@13 | 3886 | echo >>$file " \"${vRCS}\"" |
michael@13 | 3887 | echo >>$file "};" |
michael@13 | 3888 | echo >>$file "" |
michael@13 | 3889 | echo >>$file "#endif /* _${filestr}_AS_HEADER_ */" |
michael@13 | 3890 | echo >>$file "" |
michael@13 | 3891 | ;; |
michael@13 | 3892 | m4 ) |
michael@13 | 3893 | echo >>$file "##" |
michael@13 | 3894 | echo >>$file "## ${file} -- Version Information for ${name} (syntax: M4)" |
michael@13 | 3895 | echo >>$file "## [automatically generated and maintained by GNU shtool]" |
michael@13 | 3896 | echo >>$file "##" |
michael@13 | 3897 | echo >>$file "" |
michael@13 | 3898 | echo >>$file "m4_define([v_hex], [${vHex}])" |
michael@13 | 3899 | echo >>$file "m4_define([v_short], [${vShort}])" |
michael@13 | 3900 | echo >>$file "m4_define([v_long], [${vLong}])" |
michael@13 | 3901 | echo >>$file "m4_define([v_tex], [${vTeX}])" |
michael@13 | 3902 | echo >>$file "m4_define([v_gnu], [${vGNU}])" |
michael@13 | 3903 | echo >>$file "m4_define([v_web], [${vWeb}])" |
michael@13 | 3904 | echo >>$file "m4_define([v_sccs], [${vSCCS}])" |
michael@13 | 3905 | echo >>$file "m4_define([v_rcs], [${vRCS}])" |
michael@13 | 3906 | echo >>$file "" |
michael@13 | 3907 | ;; |
michael@13 | 3908 | perl ) |
michael@13 | 3909 | echo >>$file "##" |
michael@13 | 3910 | echo >>$file "## ${file} -- Version Information for ${name} (syntax: Perl)" |
michael@13 | 3911 | echo >>$file "## [automatically generated and maintained by GNU shtool]" |
michael@13 | 3912 | echo >>$file "##" |
michael@13 | 3913 | echo >>$file "" |
michael@13 | 3914 | echo >>$file "our \$${prefix}version = {" |
michael@13 | 3915 | echo >>$file " 'v_hex' => ${vHex}," |
michael@13 | 3916 | echo >>$file " 'v_short' => \"${vShort}\"," |
michael@13 | 3917 | echo >>$file " 'v_long' => \"${vLong}\"," |
michael@13 | 3918 | echo >>$file " 'v_tex' => \"${vTeX}\"," |
michael@13 | 3919 | echo >>$file " 'v_gnu' => \"${vGNU}\"," |
michael@13 | 3920 | echo >>$file " 'v_web' => \"${vWeb}\"," |
michael@13 | 3921 | echo >>$file " 'v_sccs' => \"${vSCCS}\"," |
michael@13 | 3922 | echo >>$file " 'v_rcs' => \"\\${vRCS}/\"" |
michael@13 | 3923 | echo >>$file "};" |
michael@13 | 3924 | echo >>$file "" |
michael@13 | 3925 | echo >>$file "1;" |
michael@13 | 3926 | echo >>$file "" |
michael@13 | 3927 | ;; |
michael@13 | 3928 | python ) |
michael@13 | 3929 | echo >>$file "##" |
michael@13 | 3930 | echo >>$file "## ${file} -- Version Information for ${name} (syntax: Python)" |
michael@13 | 3931 | echo >>$file "## [automatically generated and maintained by GNU shtool]" |
michael@13 | 3932 | echo >>$file "##" |
michael@13 | 3933 | echo >>$file "" |
michael@13 | 3934 | echo >>$file "class ${prefix}version:" |
michael@13 | 3935 | echo >>$file " v_hex = ${vHex}" |
michael@13 | 3936 | echo >>$file " v_short = \"${vShort}\"" |
michael@13 | 3937 | echo >>$file " v_long = \"${vLong}\"" |
michael@13 | 3938 | echo >>$file " v_tex = \"${vTeX}\"" |
michael@13 | 3939 | echo >>$file " v_gnu = \"${vGNU}\"" |
michael@13 | 3940 | echo >>$file " v_web = \"${vWeb}\"" |
michael@13 | 3941 | echo >>$file " v_sccs = \"${vSCCS}\"" |
michael@13 | 3942 | echo >>$file " v_rcs = \"${vRCS}\"" |
michael@13 | 3943 | echo >>$file "" |
michael@13 | 3944 | ;; |
michael@13 | 3945 | * ) echo "$msgprefix:Error: invalid argument to option \`-l': \`$opt_l'" 1>&2 |
michael@13 | 3946 | shtool_exit 1 |
michael@13 | 3947 | ;; |
michael@13 | 3948 | esac |
michael@13 | 3949 | fi |
michael@13 | 3950 | |
michael@13 | 3951 | shtool_exit 0 |
michael@13 | 3952 | ;; |
michael@13 | 3953 | |
michael@13 | 3954 | path ) |
michael@13 | 3955 | ## |
michael@13 | 3956 | ## path -- Deal with program paths |
michael@428 | 3957 | ## Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com> |
michael@13 | 3958 | ## |
michael@13 | 3959 | |
michael@13 | 3960 | namelist="$*" |
michael@13 | 3961 | |
michael@13 | 3962 | # check whether the test command supports the -x option |
michael@13 | 3963 | if [ -x /bin/sh ] 2>/dev/null; then |
michael@13 | 3964 | minusx="-x" |
michael@13 | 3965 | else |
michael@13 | 3966 | minusx="-r" |
michael@13 | 3967 | fi |
michael@13 | 3968 | |
michael@13 | 3969 | # split path string |
michael@13 | 3970 | paths="`echo $opt_p |\ |
michael@13 | 3971 | sed -e 's/^:/.:/' \ |
michael@13 | 3972 | -e 's/::/:.:/g' \ |
michael@13 | 3973 | -e 's/:$/:./' \ |
michael@13 | 3974 | -e 's/:/ /g'`" |
michael@13 | 3975 | |
michael@13 | 3976 | # SPECIAL REQUEST |
michael@13 | 3977 | # translate forward to reverse path |
michael@13 | 3978 | if [ ".$opt_r" = .yes ]; then |
michael@13 | 3979 | if [ "x$namelist" = "x." ]; then |
michael@13 | 3980 | rp='.' |
michael@13 | 3981 | else |
michael@13 | 3982 | rp='' |
michael@13 | 3983 | for pe in `IFS="$IFS/"; echo $namelist`; do |
michael@13 | 3984 | rp="../$rp" |
michael@13 | 3985 | done |
michael@13 | 3986 | fi |
michael@13 | 3987 | echo $rp | sed -e 's:/$::' |
michael@13 | 3988 | shtool_exit 0 |
michael@13 | 3989 | fi |
michael@13 | 3990 | |
michael@13 | 3991 | # SPECIAL REQUEST |
michael@13 | 3992 | # strip out directory or base name |
michael@13 | 3993 | if [ ".$opt_d" = .yes ]; then |
michael@13 | 3994 | echo "$namelist" |\ |
michael@13 | 3995 | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' |
michael@13 | 3996 | shtool_exit 0 |
michael@13 | 3997 | fi |
michael@13 | 3998 | if [ ".$opt_b" = .yes ]; then |
michael@13 | 3999 | echo "$namelist" |\ |
michael@13 | 4000 | sed -e 's;.*/\([^/]*\)$;\1;' |
michael@13 | 4001 | shtool_exit 0 |
michael@13 | 4002 | fi |
michael@13 | 4003 | |
michael@13 | 4004 | # MAGIC SITUATION |
michael@13 | 4005 | # Perl Interpreter (perl) |
michael@13 | 4006 | if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then |
michael@13 | 4007 | rm -f $tmpfile >/dev/null 2>&1 |
michael@13 | 4008 | touch $tmpfile |
michael@13 | 4009 | found=0 |
michael@13 | 4010 | pc=99 |
michael@13 | 4011 | for dir in $paths; do |
michael@13 | 4012 | dir=`echo $dir | sed -e 's;/*$;;'` |
michael@13 | 4013 | nc=99 |
michael@13 | 4014 | for name in perl perl5 miniperl; do |
michael@13 | 4015 | if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then |
michael@13 | 4016 | perl="$dir/$name" |
michael@13 | 4017 | pv=`$perl -e 'printf("%.3f", $]);'` |
michael@13 | 4018 | echo "$pv:$pc:$nc:$perl" >>$tmpfile |
michael@13 | 4019 | found=1 |
michael@13 | 4020 | fi |
michael@13 | 4021 | nc=`expr $nc - 1` |
michael@13 | 4022 | done |
michael@13 | 4023 | pc=`expr $pc - 1` |
michael@13 | 4024 | done |
michael@13 | 4025 | if [ $found = 1 ]; then |
michael@13 | 4026 | perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`" |
michael@13 | 4027 | rm -f $tmpfile >/dev/null 2>&1 |
michael@13 | 4028 | echo "$perl" |
michael@13 | 4029 | shtool_exit 0 |
michael@13 | 4030 | fi |
michael@13 | 4031 | rm -f $tmpfile >/dev/null 2>&1 |
michael@13 | 4032 | shtool_exit 1 |
michael@13 | 4033 | fi |
michael@13 | 4034 | |
michael@13 | 4035 | # MAGIC SITUATION |
michael@13 | 4036 | # C pre-processor (cpp) |
michael@13 | 4037 | if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then |
michael@13 | 4038 | echo >$tmpfile.c "#include <assert.h>" |
michael@13 | 4039 | echo >>$tmpfile.c "Syntax Error" |
michael@13 | 4040 | # 1. try the standard cc -E approach |
michael@13 | 4041 | cpp="${CC-cc} -E" |
michael@13 | 4042 | (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out |
michael@13 | 4043 | my_error=`grep -v '^ *+' $tmpfile.out` |
michael@13 | 4044 | if [ ".$my_error" != . ]; then |
michael@13 | 4045 | # 2. try the cc -E approach and GCC's -traditional-ccp option |
michael@13 | 4046 | cpp="${CC-cc} -E -traditional-cpp" |
michael@13 | 4047 | (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out |
michael@13 | 4048 | my_error=`grep -v '^ *+' $tmpfile.out` |
michael@13 | 4049 | if [ ".$my_error" != . ]; then |
michael@13 | 4050 | # 3. try a standalone cpp command in path and lib dirs |
michael@13 | 4051 | for path in $paths /lib /usr/lib /usr/local/lib; do |
michael@13 | 4052 | path=`echo $path | sed -e 's;/*$;;'` |
michael@13 | 4053 | if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then |
michael@13 | 4054 | cpp="$path/cpp" |
michael@13 | 4055 | break |
michael@13 | 4056 | fi |
michael@13 | 4057 | done |
michael@13 | 4058 | if [ ".$cpp" != . ]; then |
michael@13 | 4059 | (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out |
michael@13 | 4060 | my_error=`grep -v '^ *+' $tmpfile.out` |
michael@13 | 4061 | if [ ".$my_error" != . ]; then |
michael@13 | 4062 | # ok, we gave up... |
michael@13 | 4063 | cpp='' |
michael@13 | 4064 | fi |
michael@13 | 4065 | fi |
michael@13 | 4066 | fi |
michael@13 | 4067 | fi |
michael@13 | 4068 | rm -f $tmpfile >/dev/null 2>&1 |
michael@13 | 4069 | rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1 |
michael@13 | 4070 | if [ ".$cpp" != . ]; then |
michael@13 | 4071 | echo "$cpp" |
michael@13 | 4072 | shtool_exit 0 |
michael@13 | 4073 | fi |
michael@13 | 4074 | shtool_exit 1 |
michael@13 | 4075 | fi |
michael@13 | 4076 | |
michael@13 | 4077 | # STANDARD SITUATION |
michael@13 | 4078 | # iterate over names |
michael@13 | 4079 | for name in $namelist; do |
michael@13 | 4080 | # iterate over paths |
michael@13 | 4081 | for path in $paths; do |
michael@13 | 4082 | path=`echo $path | sed -e 's;/*$;;'` |
michael@13 | 4083 | if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then |
michael@13 | 4084 | if [ ".$opt_s" != .yes ]; then |
michael@13 | 4085 | echo "$path/$name" |
michael@13 | 4086 | fi |
michael@13 | 4087 | shtool_exit 0 |
michael@13 | 4088 | fi |
michael@13 | 4089 | done |
michael@13 | 4090 | done |
michael@13 | 4091 | |
michael@13 | 4092 | shtool_exit 1 |
michael@13 | 4093 | ;; |
michael@13 | 4094 | |
michael@13 | 4095 | esac |
michael@13 | 4096 | |
michael@13 | 4097 | shtool_exit 0 |
michael@13 | 4098 |