wok-next annotate xarchive/stuff/slitaz-wrap.sh @ rev 941

xarchive: enhance tar and cpio support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jun 24 13:47:32 2008 +0000 (2008-06-24)
parents 7c31f0d8f00c
children 19e156dfc1af
rev   line source
pascal@688 1 #!/bin/sh
pascal@688 2 # slitaz-wrap.sh - sh slitaz core wrapper for xarchive frontend
pascal@688 3 # Copyright (C) 2005 Lee Bigelow <ligelowbee@yahoo.com>
pascal@688 4 # Copyright (C) 2008 Pascal Bellard <pascal.bellard@slitaz.org>
pascal@688 5 #
pascal@688 6 # This program is free software; you can redistribute it and/or modify
pascal@688 7 # it under the terms of the GNU General Public License as published by
pascal@688 8 # the Free Software Foundation; either version 2 of the License, or
pascal@688 9 # (at your option) any later version.
pascal@688 10 #
pascal@688 11 # This program is distributed in the hope that it will be useful,
pascal@688 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
pascal@688 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
pascal@688 14 # GNU General Public License for more details.
pascal@688 15 #
pascal@688 16 # You should have received a copy of the GNU General Public License
pascal@688 17 # along with this program; if not, write to the Free Software
pascal@688 18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
pascal@688 19
pascal@688 20 # set up exit status variables
pascal@688 21 E_UNSUPPORTED=65
pascal@688 22
pascal@688 23 # Supported file extentions for tar
pascal@688 24 TAR_EXTS="tar"
pascal@688 25 GZIP_EXTS="tar.gz tgz"
pascal@688 26 LZMA_EXTS="tar.lz tar.lzma tlz"
pascal@688 27 BZIP2_EXTS="tar.bz tbz tar.bz2 tbz2"
pascal@688 28 COMPRESS_EXTS="tar.z tar.Z"
pascal@688 29 CPIO_EXTS="cpio"
pascal@688 30 CPIOGZ_EXTS="cpio.gz"
pascal@688 31 ZIP_EXTS="zip cbz jar"
pascal@688 32 RPM_EXTS="rpm"
pascal@688 33 DEB_EXTS="deb"
pascal@688 34 TAZPKG_EXTS="tazpkg"
pascal@688 35
pascal@688 36 # Setup awk program
pascal@688 37 AWK_PROGS="mawk gawk awk"
pascal@688 38 AWK_PROG=""
pascal@688 39 for awkprog in $AWK_PROGS; do
pascal@688 40 if [ "$(which $awkprog)" ]; then
pascal@688 41 AWK_PROG="$awkprog"
pascal@688 42 break
pascal@688 43 fi
pascal@688 44 done
pascal@688 45
pascal@688 46 # setup variables opt and archive.
pascal@688 47 # the shifting will leave the files passed as
pascal@688 48 # all the remaining args "$@"
pascal@688 49 opt="$1"
pascal@688 50 test -z $1 || shift 1
pascal@688 51 archive="$1"
pascal@688 52 test -z $1 || shift 1
pascal@688 53
pascal@688 54 # set up compression variables for our compression functions.
pascal@688 55 # translate archive name to lower case for pattern matching.
pascal@688 56 # use compressor -c option to output to stdout and direct it where we want
pascal@688 57 lc_archive="$(echo $archive|tr [:upper:] [:lower:])"
pascal@688 58 DECOMPRESS="cat"
pascal@688 59 COMPRESS="cat"
pascal@688 60 TAR_COMPRESS_OPT=""
pascal@688 61 for ext in $GZIP_EXTS $CPIOGZ_EXTS; do
pascal@688 62 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 63 DECOMPRESS="gzip -dc"
pascal@688 64 COMPRESS="gzip -c"
pascal@688 65 TAR_COMPRESS_OPT="z"
pascal@688 66 fi
pascal@688 67 done
pascal@688 68 for ext in $BZIP2_EXTS; do
pascal@688 69 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 70 DECOMPRESS="bzip2 -dc"
pascal@688 71 COMPRESS="bzip2 -c"
pascal@688 72 TAR_COMPRESS_OPT="j"
pascal@688 73 fi
pascal@688 74 done
pascal@688 75 for ext in $LZMA_EXTS; do
pascal@688 76 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 77 DECOMPRESS="unlzma -c"
pascal@941 78 COMPRESS="lzma e -si -so"
pascal@688 79 TAR_COMPRESS_OPT="a"
pascal@688 80 fi
pascal@688 81 done
pascal@688 82 for ext in $COMPRESS_EXTS; do
pascal@688 83 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 84 DECOMPRESS="uncompress -dc"
pascal@688 85 COMPRESS="compress -c"
pascal@688 86 TAR_COMPRESS_OPT="--use-compress-prog=compress"
pascal@688 87 fi
pascal@688 88 done
pascal@688 89
pascal@688 90 # Compression functions
pascal@688 91 decompress_func()
pascal@688 92 {
pascal@688 93 if [ "$DECOMPRESS" ]; then
pascal@688 94 tmpname="$(mktemp -t tartmp.XXXXXX)"
pascal@688 95 if [ -f "$archive" ]; then
pascal@688 96 $DECOMPRESS "$archive" > "$tmpname"
pascal@688 97 fi
pascal@688 98 # store old name for when we recompress
pascal@688 99 oldarch="$archive"
pascal@688 100 # change working file to decompressed tmp
pascal@688 101 archive="$tmpname"
pascal@688 102 fi
pascal@688 103 }
pascal@688 104
pascal@688 105 compress_func()
pascal@688 106 {
pascal@688 107 if [ "$COMPRESS" ] && [ "$oldarch" ]; then
pascal@688 108 [ -f "$oldarch" ] && rm "$oldarch"
pascal@941 109 if $COMPRESS < "$archive" > "$oldarch"; then
pascal@688 110 rm "$archive"
pascal@688 111 fi
pascal@688 112 fi
pascal@688 113 }
pascal@688 114
pascal@688 115 not_busybox()
pascal@688 116 {
pascal@688 117 case "$(readlink $(which $1))" in
pascal@688 118 *busybox*) return 1;;
pascal@688 119 esac
pascal@688 120 return 0
pascal@688 121 }
pascal@688 122
pascal@941 123 add_file()
pascal@941 124 {
pascal@941 125 ( cd $2 ; tar -cf - $1 ) | tar -xf -
pascal@941 126 }
pascal@941 127
pascal@941 128 remove_file()
pascal@941 129 {
pascal@941 130 rm -rf ./$1
pascal@941 131 }
pascal@941 132
pascal@941 133 update_tar_cpio()
pascal@941 134 {
pascal@941 135 action=$1
pascal@941 136 shift
pascal@941 137 tardir="$(dirname "$archive")"
pascal@941 138 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do
pascal@941 139 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@941 140 if [ "$action" = "new_archive" ]; then
pascal@941 141 decompress_func
pascal@941 142 cd "$tardir"
pascal@941 143 tar -cf "$archive" "${1#$tardir/}"
pascal@941 144 status=$?
pascal@941 145 compress_func
pascal@941 146 exit $status
pascal@941 147 fi
pascal@941 148 if not_busybox tar; then
pascal@941 149 decompress_func
pascal@941 150 case "$action" in
pascal@941 151 remove_file)
pascal@941 152 tar --delete -f "$archive" "$@";;
pascal@941 153 add_file)
pascal@941 154 cd "$tardir"
pascal@941 155 tar -rf "$archive" "${1#$tardir/}";;
pascal@941 156 *) false;;
pascal@941 157 esac
pascal@941 158 status=$?
pascal@941 159 compress_func
pascal@941 160 exit $status
pascal@941 161 fi
pascal@941 162 tmptar="$(mktemp -d -t tartmp.XXXXXX)"
pascal@941 163 here="$(pwd)"
pascal@941 164 cd $tmptar
pascal@941 165 $DECOMPRESS < "$archive" | tar -xf -
pascal@941 166 status=$?
pascal@941 167 if [ $status -eq 0 -a -n "$1" ]; then
pascal@941 168 while [ "$1" ]; do
pascal@941 169 $action "${1#$tardir/}" $here
pascal@941 170 shift
pascal@941 171 done
pascal@941 172 tar -cf - $(ls -a | grep -v ^\.$ | grep -v ^\.\.$) | \
pascal@941 173 $COMPRESS > "$archive"
pascal@941 174 status=$?
pascal@941 175 fi
pascal@941 176 cd $here
pascal@941 177 rm -rf $tmptar
pascal@941 178 exit $status
pascal@941 179 fi
pascal@941 180 done
pascal@941 181 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@941 182 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@941 183 if [ "$action" = "new_archive" ]; then
pascal@941 184 decompress_func
pascal@941 185 cd "$tardir"
pascal@941 186 echo "${1#$tardir/}" | cpio -o -H newc > "$archive"
pascal@941 187 status=$?
pascal@941 188 compress_func
pascal@941 189 exit $status
pascal@941 190 fi
pascal@941 191 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@941 192 here="$(pwd)"
pascal@941 193 cd $tmpcpio
pascal@941 194 $DECOMPRESS "$archive" | cpio -id > /dev/null
pascal@941 195 status=$?
pascal@941 196 if [ $status -eq 0 -a -n "$1" ]; then
pascal@941 197 while [ "$1" ]; do
pascal@941 198 $action "${1#$tardir/}" $here
pascal@941 199 shift
pascal@941 200 done
pascal@941 201 find . | cpio -o -H newc | $COMPRESS > "$archive"
pascal@941 202 status=$?
pascal@941 203 fi
pascal@941 204 cd $here
pascal@941 205 rm -rf $tmpcpio
pascal@941 206 exit $status
pascal@941 207 fi
pascal@941 208 done
pascal@941 209 }
pascal@941 210
pascal@688 211 # the option switches
pascal@688 212 case "$opt" in
pascal@688 213 -i) # info: output supported extentions for progs that exist
pascal@688 214 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS \
pascal@688 215 $CPIO_EXTS $CPIOGZ_EXTS $ZIP_EXTS $DEB_EXTS $RPM_EXTS \
pascal@688 216 $TAZPKG_EXTS ; do
pascal@688 217 printf "%s;" $ext
pascal@688 218 if [ "$ext" = "zip" -a ! "$(which zip)" ]; then
pascal@688 219 echo warning: zip not found, extract only >/dev/stderr
pascal@688 220 fi
pascal@688 221 done
pascal@688 222 printf "\n"
pascal@688 223 exit
pascal@688 224 ;;
pascal@688 225
pascal@688 226 -o) # open: mangle output of tar cmd for xarchive
pascal@688 227 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do
pascal@688 228 # format of tar output:
pascal@688 229 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 230 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 231 # 1 2 3 4 5 6
pascal@688 232 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 233 tar -tv${TAR_COMPRESS_OPT}f "$archive" | $AWK_PROG '
pascal@688 234 {
pascal@688 235 attr=$1
pascal@688 236 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 237 uid=ids[1]
pascal@688 238 gid=ids[2]
pascal@688 239 size=$3
pascal@688 240 date=$4
pascal@688 241 time=$5
pascal@688 242
pascal@688 243 #this method works with filenames that start with a space (evil!)
pascal@688 244 #split line a time and a space
pascal@688 245 split($0,linesplit, $5 " ")
pascal@688 246 #then split the second item (name&link) at the space arrow space
pascal@688 247 split(linesplit[2], nlsplit, " -> ")
pascal@688 248
pascal@688 249 name=nlsplit[1]
pascal@688 250 link=nlsplit[2]
pascal@688 251
pascal@688 252 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 253
pascal@688 254 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 255 }'
pascal@688 256 exit
pascal@688 257 fi
pascal@688 258 done
pascal@688 259
pascal@688 260 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@688 261 # format of cpio output:
pascal@688 262 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 263 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 264 # 1 2 3 4 5 6
pascal@688 265 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 266 $DECOMPRESS "$archive" | cpio -tv | $AWK_PROG '
pascal@688 267 {
pascal@688 268 attr=$1
pascal@688 269 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 270 uid=ids[1]
pascal@688 271 gid=ids[2]
pascal@688 272 size=$3
pascal@688 273 date=$4
pascal@688 274 time=$5
pascal@688 275
pascal@688 276 #this method works with filenames that start with a space (evil!)
pascal@688 277 #split line a time and a space
pascal@688 278 split($0,linesplit, $5 " ")
pascal@688 279 #then split the second item (name&link) at the space arrow space
pascal@688 280 split(linesplit[2], nlsplit, " -> ")
pascal@688 281
pascal@688 282 name=nlsplit[1]
pascal@688 283 link=nlsplit[2]
pascal@688 284
pascal@688 285 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 286
pascal@688 287 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 288 }'
pascal@688 289 exit
pascal@688 290 fi
pascal@688 291 done
pascal@688 292
pascal@688 293 for ext in $ZIP_EXTS; do
pascal@688 294 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 295 if which zipinfo; then
pascal@688 296 # format of zipinfo -T -s-h- output:
pascal@688 297 # -rw-r--r-- 2.3 unx 11512 tx defN YYYYMMDD.HHMMSS file
pascal@688 298 # 1 2 3 4 5 6 7 8
pascal@688 299 zipinfo -T -s-h-t "$archive" | $AWK_PROG -v uuid=$(id -u -n) '
pascal@688 300 {
pascal@688 301 attr=$1; size=$4
pascal@688 302
pascal@688 303 year=substr($7,1,4)
pascal@688 304 month=substr($7,5,2)
pascal@688 305 day=substr($7,7,2)
pascal@688 306 date=year "-" month "-" day
pascal@688 307
pascal@688 308 hours=substr($7,10,2)
pascal@688 309 mins=substr($7,12,2)
pascal@688 310 secs=substr($7,14,2)
pascal@688 311 time=hours ":" mins ":" secs
pascal@688 312
pascal@688 313 uid=uuid; gid=uuid; link="-"
pascal@688 314 #split line at the time and a space, second item is our name
pascal@688 315 split($0, linesplit, ($7 " "))
pascal@688 316 name=linesplit[2]
pascal@688 317 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 318 }'
pascal@688 319 exit
pascal@688 320 else
pascal@688 321 # format of unzip -l output:
pascal@688 322 # 6622 2005-04-22 12:29:14 file
pascal@688 323 # 1 2 3 4
pascal@688 324 unzip -l "$archive" | $AWK_PROG -v uuid=$(id -u -n) '
pascal@688 325 BEGIN { n = 0}
pascal@688 326 {
pascal@688 327 n=n+1
pascal@688 328 attr=""
pascal@688 329 uid=uuid; gid=uuid
pascal@688 330 size=$1
pascal@688 331 date=$2
pascal@688 332 time=$3
pascal@688 333
pascal@688 334 #this method works with filenames that start with a space (evil!)
pascal@688 335 #split line a time and a space
pascal@688 336 split($0,linesplit, $3 " ")
pascal@688 337 #then split the second item (name&link) at the space arrow space
pascal@688 338 split(linesplit[2], nlsplit, " -> ")
pascal@688 339
pascal@688 340 name=nlsplit[1]
pascal@688 341 link=nlsplit[2]
pascal@688 342
pascal@688 343 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 344
pascal@688 345 if (name != "" && n > 3) printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 346 }'
pascal@688 347 exit
pascal@688 348 fi
pascal@688 349 fi
pascal@688 350 done
pascal@688 351
pascal@688 352 for ext in $RPM_EXTS; do
pascal@688 353 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 354 rpm2cpio "$archive" | cpio -tv | $AWK_PROG '
pascal@688 355 {
pascal@688 356 attr=$1
pascal@688 357 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 358 uid=ids[1]
pascal@688 359 gid=ids[2]
pascal@688 360 size=$3
pascal@688 361 date=$4
pascal@688 362 time=$5
pascal@688 363
pascal@688 364 #this method works with filenames that start with a space (evil!)
pascal@688 365 #split line a time and a space
pascal@688 366 split($0,linesplit, $5 " ")
pascal@688 367 #then split the second item (name&link) at the space arrow space
pascal@688 368 split(linesplit[2], nlsplit, " -> ")
pascal@688 369
pascal@688 370 name=substr(nlsplit[1],2)
pascal@688 371 link=nlsplit[2]
pascal@688 372
pascal@688 373 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 374
pascal@688 375 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 376 }'
pascal@688 377 exit
pascal@688 378 fi
pascal@688 379 done
pascal@688 380
pascal@688 381 for ext in $DEB_EXTS; do
pascal@688 382 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 383 dpkg-deb -c "$archive" | $AWK_PROG '
pascal@688 384 {
pascal@688 385 attr=$1
pascal@688 386 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 387 uid=ids[1]
pascal@688 388 gid=ids[2]
pascal@688 389 size=$3
pascal@688 390 date=$4
pascal@688 391 time=$5
pascal@688 392
pascal@688 393 #this method works with filenames that start with a space (evil!)
pascal@688 394 #split line a time and a space
pascal@688 395 split($0,linesplit, $5 " ")
pascal@688 396 #then split the second item (name&link) at the space arrow space
pascal@688 397 split(linesplit[2], nlsplit, " -> ")
pascal@688 398
pascal@688 399 name=substr(nlsplit[1],2)
pascal@688 400 link=nlsplit[2]
pascal@688 401
pascal@688 402 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 403
pascal@688 404 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 405 }'
pascal@688 406 exit
pascal@688 407 fi
pascal@688 408 done
pascal@688 409
pascal@688 410 for ext in $TAZPKG_EXTS; do
pascal@688 411 # format of cpio output:
pascal@688 412 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 413 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 414 # 1 2 3 4 5 6
pascal@688 415 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 416 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@688 417 here="$(pwd)"
pascal@688 418 cd $tmpcpio
pascal@688 419 cpio -i fs.cpio.gz > /dev/null < "$archive"
pascal@688 420 zcat fs.cpio.gz | cpio -tv | $AWK_PROG '
pascal@688 421 {
pascal@688 422 attr=$1
pascal@688 423 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 424 uid=ids[1]
pascal@688 425 gid=ids[2]
pascal@688 426 size=$3
pascal@688 427 date=$4
pascal@688 428 time=$5
pascal@688 429
pascal@688 430 #this method works with filenames that start with a space (evil!)
pascal@688 431 #split line a time and a space
pascal@688 432 split($0,linesplit, $5 " ")
pascal@688 433 #then split the second item (name&link) at the space arrow space
pascal@688 434 split(linesplit[2], nlsplit, " -> ")
pascal@688 435
pascal@688 436 name=substr(nlsplit[1],3)
pascal@688 437 link=nlsplit[2]
pascal@688 438
pascal@688 439 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 440
pascal@688 441 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 442 }'
pascal@688 443 cd $here
pascal@688 444 rm -rf $tmpcpio
pascal@688 445 exit
pascal@688 446 fi
pascal@688 447 done
pascal@688 448 exit $E_UNSUPPORTED
pascal@688 449 ;;
pascal@688 450
pascal@688 451 -a) # add to archive passed files
pascal@941 452 update_tar_cpio add_file "$@"
pascal@688 453 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 454 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 455 # we only want to add the file's basename, not
pascal@688 456 # the full path so...
pascal@688 457 while [ "$1" ]; do
pascal@688 458 cd "$(dirname "$1")"
pascal@688 459 zip -g -r "$archive" "$(basename "$1")"
pascal@688 460 wrapper_status=$?
pascal@688 461 shift 1
pascal@688 462 done
pascal@688 463 exit $wrapper_status
pascal@688 464 fi
pascal@688 465 done
pascal@688 466 exit $E_UNSUPPORTED
pascal@688 467 ;;
pascal@688 468
pascal@688 469 -n) # new: create new archive with passed files
pascal@941 470 update_tar_cpio new_archive "$@"
pascal@688 471 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 472 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 473 # create will only be passed the first file, the
pascal@688 474 # rest will be "added" to the new archive
pascal@688 475 cd "$(dirname "$1")"
pascal@688 476 zip -r "$archive" "$(basename "$1")"
pascal@688 477 fi
pascal@688 478 done
pascal@688 479 exit $E_UNSUPPORTED
pascal@688 480 ;;
pascal@688 481
pascal@688 482 -r) # remove: from archive passed files
pascal@941 483 update_tar_cpio remove_file "$@"
pascal@688 484 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 485 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 486 zip -d "$archive" "$@"
pascal@688 487 fi
pascal@688 488 done
pascal@688 489 exit $E_UNSUPPORTED
pascal@688 490 ;;
pascal@688 491
pascal@688 492 -e) # extract: from archive passed files
pascal@688 493 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do
pascal@688 494 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 495 # xarchive will put is the right extract dir
pascal@688 496 # so we just have to extract.
pascal@941 497 $DECOMPRESS < "$archive" | tar -xf - "$@"
pascal@688 498 exit $?
pascal@688 499 fi
pascal@688 500 done
pascal@688 501 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@688 502 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 503 if [ -n "$1" ]; then
pascal@688 504 while [ "$1" ]; do
pascal@688 505 $DECOMPRESS "$archive" | cpio -idv "$1"
pascal@688 506 shift 1
pascal@688 507 done
pascal@688 508 else
pascal@688 509 $DECOMPRESS "$archive" | cpio -idv
pascal@688 510 fi
pascal@688 511 exit $?
pascal@688 512 fi
pascal@688 513 done
pascal@688 514 for ext in $ZIP_EXTS; do
pascal@688 515 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 516 # xarchive will put is the right extract dir
pascal@688 517 # so we just have to extract.
pascal@688 518 unzip -n "$archive" "$@"
pascal@688 519 exit $?
pascal@688 520 fi
pascal@688 521 done
pascal@688 522 for ext in $RPM_EXTS; do
pascal@688 523 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 524 if [ -n "$1" ]; then
pascal@688 525 while [ "$1" ]; do
pascal@688 526 rpm2cpio "$archive" | cpio -idv "$1"
pascal@688 527 shift 1
pascal@688 528 done
pascal@688 529 else
pascal@688 530 rpm2cpio "$archive" | cpio -idv
pascal@688 531 fi
pascal@688 532 exit $?
pascal@688 533 fi
pascal@688 534 done
pascal@688 535
pascal@688 536 for ext in $DEB_EXTS; do
pascal@688 537 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 538 dpkg-deb -X "$archive" "$@"
pascal@688 539 exit $?
pascal@688 540 fi
pascal@688 541 done
pascal@688 542 for ext in $TAZPKG_EXTS; do
pascal@688 543 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 544 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@688 545 here="$(pwd)"
pascal@688 546 cd $tmpcpio
pascal@688 547 cpio -i < "$archive" > /dev/null
pascal@688 548 zcat fs.cpio.gz | cpio -id > /dev/null
pascal@688 549 status=$?
pascal@688 550 if [ -n "$1" ]; then
pascal@688 551 while [ "$1" ]; do
pascal@688 552 dir=$(dirname "$here/$1")
pascal@688 553 mkdir -p "$dir" 2> /dev/null
pascal@688 554 mv "fs/$1" "$dir" 2> /dev/null
pascal@688 555 done
pascal@688 556 else
pascal@688 557 mv fs/* fs/.* $here 2> /dev/null
pascal@688 558 fi
pascal@688 559 cd $here
pascal@688 560 rm -rf $tmpcpio
pascal@688 561 exit $status
pascal@688 562 fi
pascal@688 563 done
pascal@688 564 exit $E_UNSUPPORTED
pascal@688 565 ;;
pascal@688 566
pascal@688 567 *) echo "error, option $opt not supported"
pascal@688 568 echo "use one of these:"
pascal@688 569 echo "-i #info"
pascal@688 570 echo "-o archive #open"
pascal@688 571 echo "-a archive files #add"
pascal@688 572 echo "-n archive file #new"
pascal@688 573 echo "-r archive files #remove"
pascal@688 574 echo "-e archive files #extract"
pascal@688 575 exit
pascal@688 576 esac