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

xarchive: add misc fs support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jun 24 16:09:58 2008 +0000 (2008-06-24)
parents 19e156dfc1af
children 77a4483b1fa9
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@942 35 ISO_EXTS="iso"
pascal@942 36 SQUASHFS_EXTS="sqfs squashfs"
pascal@942 37 CROMFS_EXTS="cromfs"
pascal@943 38 FS_EXTS="ext2 ext3 dos fat vfat fd fs loop"
pascal@943 39 CLOOP_EXTS="cloop"
pascal@688 40
pascal@688 41 # Setup awk program
pascal@688 42 AWK_PROGS="mawk gawk awk"
pascal@688 43 AWK_PROG=""
pascal@688 44 for awkprog in $AWK_PROGS; do
pascal@688 45 if [ "$(which $awkprog)" ]; then
pascal@688 46 AWK_PROG="$awkprog"
pascal@688 47 break
pascal@688 48 fi
pascal@688 49 done
pascal@688 50
pascal@688 51 # setup variables opt and archive.
pascal@688 52 # the shifting will leave the files passed as
pascal@688 53 # all the remaining args "$@"
pascal@688 54 opt="$1"
pascal@688 55 test -z $1 || shift 1
pascal@688 56 archive="$1"
pascal@688 57 test -z $1 || shift 1
pascal@688 58
pascal@688 59 # set up compression variables for our compression functions.
pascal@688 60 # translate archive name to lower case for pattern matching.
pascal@688 61 # use compressor -c option to output to stdout and direct it where we want
pascal@688 62 lc_archive="$(echo $archive|tr [:upper:] [:lower:])"
pascal@688 63 DECOMPRESS="cat"
pascal@688 64 COMPRESS="cat"
pascal@688 65 for ext in $GZIP_EXTS $CPIOGZ_EXTS; do
pascal@688 66 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 67 DECOMPRESS="gzip -dc"
pascal@688 68 COMPRESS="gzip -c"
pascal@688 69 fi
pascal@688 70 done
pascal@688 71 for ext in $BZIP2_EXTS; do
pascal@688 72 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 73 DECOMPRESS="bzip2 -dc"
pascal@688 74 COMPRESS="bzip2 -c"
pascal@688 75 fi
pascal@688 76 done
pascal@688 77 for ext in $LZMA_EXTS; do
pascal@688 78 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 79 DECOMPRESS="unlzma -c"
pascal@941 80 COMPRESS="lzma e -si -so"
pascal@688 81 fi
pascal@688 82 done
pascal@688 83 for ext in $COMPRESS_EXTS; do
pascal@688 84 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 85 DECOMPRESS="uncompress -dc"
pascal@688 86 COMPRESS="compress -c"
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@942 211 loop_fs()
pascal@942 212 {
pascal@942 213 tmpfs="$(mktemp -d -t fstmp.XXXXXX)"
pascal@942 214 umnt="umount -d"
pascal@943 215 case " $CLOOP_EXTS " in
pascal@943 216 \ $1\ ) mount -o loop=/dev/cloop,ro "$archive" $tmpfs;;
pascal@943 217 esac
pascal@943 218 case " $FS_EXTS " in
pascal@943 219 \ $1\ ) mount -o loop,rw "$archive" $tmpfs;;
pascal@943 220 esac
pascal@942 221 case " $ISO_EXTS " in
pascal@942 222 \ $1\ ) mount -o loop,ro -t iso9660 "$archive" $tmpfs;;
pascal@942 223 esac
pascal@942 224 case " $SQUASHFS_EXTS " in
pascal@942 225 \ $1\ ) mount -o loop,ro -t squashfs "$archive" $tmpfs;;
pascal@942 226 esac
pascal@942 227 case " $CROMFS_EXTS " in
pascal@942 228 \ $1\ ) cromfs-driver "$archive" $tmpfs; umnt="fusermount -u";;
pascal@942 229 esac
pascal@942 230 case "$2" in
pascal@942 231 stat) find $tmpfs | while read f; do
pascal@942 232 [ "$f" = "$tmpfs" ] && continue
pascal@942 233 link="-"
pascal@942 234 [ -L "$f" ] && link=$(readlink "$f")
pascal@942 235 date=$(stat -c "%y" $f | awk \
pascal@942 236 '{ printf "%s;%s\n",$1,substr($2,0,8)}')
pascal@942 237 echo "${f#$tmpfs/};$(stat -c "%s;%A;%U;%G" $f);$date;$link"
pascal@942 238 done;;
pascal@942 239 copy) if [ -z "$3" ]; then
pascal@942 240 ( cd $tmpfs ; tar cf - . ) | tar xf -
pascal@942 241 else
pascal@942 242 while [ -n "$3" ]; do
pascal@942 243 ( cd $tmpfs ; tar cf - "$3" ) | tar xf -
pascal@942 244 shift;
pascal@942 245 done
pascal@942 246 fi;;
pascal@943 247 add) tar cf - "$@" | ( cd $tmpfs ; tar xf - );;
pascal@943 248 remove) while [ -n "$3" ]; do
pascal@943 249 rm -rf $tmpfs/$3
pascal@943 250 done;;
pascal@942 251 esac
pascal@942 252 $umnt $tmpfs
pascal@942 253 rmdir $tmpfs
pascal@942 254 }
pascal@942 255
pascal@688 256 # the option switches
pascal@688 257 case "$opt" in
pascal@688 258 -i) # info: output supported extentions for progs that exist
pascal@688 259 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS \
pascal@688 260 $CPIO_EXTS $CPIOGZ_EXTS $ZIP_EXTS $DEB_EXTS $RPM_EXTS \
pascal@943 261 $TAZPKG_EXTS $ISO_EXTS $FS_EXTS; do
pascal@688 262 printf "%s;" $ext
pascal@688 263 if [ "$ext" = "zip" -a ! "$(which zip)" ]; then
pascal@688 264 echo warning: zip not found, extract only >/dev/stderr
pascal@688 265 fi
pascal@688 266 done
pascal@942 267 [ -d /lib/modules/$(uname -r)/kernel/fs/squashfs/squashfs.ko ] && \
pascal@942 268 for ext in $SQUASHFS_EXTS; do
pascal@942 269 printf "%s;" $ext
pascal@942 270 done
pascal@942 271 [ -x /bin/cromfs-driver ] && for ext in $CROMFS_EXTS; do
pascal@942 272 printf "%s;" $ext
pascal@942 273 done
pascal@943 274 [ -d /lib/modules/$(uname -r)/kernel/drivers/block/cloop.ko ] && \
pascal@943 275 for ext in $CLOOP_EXTS; do
pascal@943 276 printf "%s;" $ext
pascal@943 277 done
pascal@688 278 printf "\n"
pascal@688 279 exit
pascal@688 280 ;;
pascal@688 281
pascal@688 282 -o) # open: mangle output of tar cmd for xarchive
pascal@688 283 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do
pascal@688 284 # format of tar output:
pascal@688 285 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 286 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 287 # 1 2 3 4 5 6
pascal@688 288 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@942 289 $DECOMPRESS "$archive" | tar -tvf - | $AWK_PROG '
pascal@688 290 {
pascal@688 291 attr=$1
pascal@688 292 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 293 uid=ids[1]
pascal@688 294 gid=ids[2]
pascal@688 295 size=$3
pascal@688 296 date=$4
pascal@688 297 time=$5
pascal@688 298
pascal@688 299 #this method works with filenames that start with a space (evil!)
pascal@688 300 #split line a time and a space
pascal@688 301 split($0,linesplit, $5 " ")
pascal@688 302 #then split the second item (name&link) at the space arrow space
pascal@688 303 split(linesplit[2], nlsplit, " -> ")
pascal@688 304
pascal@688 305 name=nlsplit[1]
pascal@688 306 link=nlsplit[2]
pascal@688 307
pascal@688 308 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 309
pascal@688 310 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 311 }'
pascal@688 312 exit
pascal@688 313 fi
pascal@688 314 done
pascal@688 315
pascal@688 316 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@688 317 # format of cpio output:
pascal@688 318 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 319 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 320 # 1 2 3 4 5 6
pascal@688 321 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 322 $DECOMPRESS "$archive" | cpio -tv | $AWK_PROG '
pascal@688 323 {
pascal@688 324 attr=$1
pascal@688 325 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 326 uid=ids[1]
pascal@688 327 gid=ids[2]
pascal@688 328 size=$3
pascal@688 329 date=$4
pascal@688 330 time=$5
pascal@688 331
pascal@688 332 #this method works with filenames that start with a space (evil!)
pascal@688 333 #split line a time and a space
pascal@688 334 split($0,linesplit, $5 " ")
pascal@688 335 #then split the second item (name&link) at the space arrow space
pascal@688 336 split(linesplit[2], nlsplit, " -> ")
pascal@688 337
pascal@688 338 name=nlsplit[1]
pascal@688 339 link=nlsplit[2]
pascal@688 340
pascal@688 341 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 342
pascal@688 343 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 344 }'
pascal@688 345 exit
pascal@688 346 fi
pascal@688 347 done
pascal@688 348
pascal@688 349 for ext in $ZIP_EXTS; do
pascal@688 350 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 351 if which zipinfo; then
pascal@688 352 # format of zipinfo -T -s-h- output:
pascal@688 353 # -rw-r--r-- 2.3 unx 11512 tx defN YYYYMMDD.HHMMSS file
pascal@688 354 # 1 2 3 4 5 6 7 8
pascal@688 355 zipinfo -T -s-h-t "$archive" | $AWK_PROG -v uuid=$(id -u -n) '
pascal@688 356 {
pascal@688 357 attr=$1; size=$4
pascal@688 358
pascal@688 359 year=substr($7,1,4)
pascal@688 360 month=substr($7,5,2)
pascal@688 361 day=substr($7,7,2)
pascal@688 362 date=year "-" month "-" day
pascal@688 363
pascal@688 364 hours=substr($7,10,2)
pascal@688 365 mins=substr($7,12,2)
pascal@688 366 secs=substr($7,14,2)
pascal@688 367 time=hours ":" mins ":" secs
pascal@688 368
pascal@688 369 uid=uuid; gid=uuid; link="-"
pascal@688 370 #split line at the time and a space, second item is our name
pascal@688 371 split($0, linesplit, ($7 " "))
pascal@688 372 name=linesplit[2]
pascal@688 373 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 374 }'
pascal@688 375 exit
pascal@688 376 else
pascal@688 377 # format of unzip -l output:
pascal@688 378 # 6622 2005-04-22 12:29:14 file
pascal@688 379 # 1 2 3 4
pascal@688 380 unzip -l "$archive" | $AWK_PROG -v uuid=$(id -u -n) '
pascal@688 381 BEGIN { n = 0}
pascal@688 382 {
pascal@688 383 n=n+1
pascal@688 384 attr=""
pascal@688 385 uid=uuid; gid=uuid
pascal@688 386 size=$1
pascal@688 387 date=$2
pascal@688 388 time=$3
pascal@688 389
pascal@688 390 #this method works with filenames that start with a space (evil!)
pascal@688 391 #split line a time and a space
pascal@688 392 split($0,linesplit, $3 " ")
pascal@688 393 #then split the second item (name&link) at the space arrow space
pascal@688 394 split(linesplit[2], nlsplit, " -> ")
pascal@688 395
pascal@688 396 name=nlsplit[1]
pascal@688 397 link=nlsplit[2]
pascal@688 398
pascal@688 399 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 400
pascal@688 401 if (name != "" && n > 3) printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 402 }'
pascal@688 403 exit
pascal@688 404 fi
pascal@688 405 fi
pascal@688 406 done
pascal@688 407
pascal@688 408 for ext in $RPM_EXTS; do
pascal@688 409 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 410 rpm2cpio "$archive" | cpio -tv | $AWK_PROG '
pascal@688 411 {
pascal@688 412 attr=$1
pascal@688 413 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 414 uid=ids[1]
pascal@688 415 gid=ids[2]
pascal@688 416 size=$3
pascal@688 417 date=$4
pascal@688 418 time=$5
pascal@688 419
pascal@688 420 #this method works with filenames that start with a space (evil!)
pascal@688 421 #split line a time and a space
pascal@688 422 split($0,linesplit, $5 " ")
pascal@688 423 #then split the second item (name&link) at the space arrow space
pascal@688 424 split(linesplit[2], nlsplit, " -> ")
pascal@688 425
pascal@688 426 name=substr(nlsplit[1],2)
pascal@688 427 link=nlsplit[2]
pascal@688 428
pascal@688 429 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 430
pascal@688 431 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 432 }'
pascal@688 433 exit
pascal@688 434 fi
pascal@688 435 done
pascal@688 436
pascal@688 437 for ext in $DEB_EXTS; do
pascal@688 438 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 439 dpkg-deb -c "$archive" | $AWK_PROG '
pascal@688 440 {
pascal@688 441 attr=$1
pascal@688 442 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 443 uid=ids[1]
pascal@688 444 gid=ids[2]
pascal@688 445 size=$3
pascal@688 446 date=$4
pascal@688 447 time=$5
pascal@688 448
pascal@688 449 #this method works with filenames that start with a space (evil!)
pascal@688 450 #split line a time and a space
pascal@688 451 split($0,linesplit, $5 " ")
pascal@688 452 #then split the second item (name&link) at the space arrow space
pascal@688 453 split(linesplit[2], nlsplit, " -> ")
pascal@688 454
pascal@688 455 name=substr(nlsplit[1],2)
pascal@688 456 link=nlsplit[2]
pascal@688 457
pascal@688 458 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 459
pascal@688 460 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 461 }'
pascal@688 462 exit
pascal@688 463 fi
pascal@688 464 done
pascal@688 465
pascal@688 466 for ext in $TAZPKG_EXTS; do
pascal@688 467 # format of cpio output:
pascal@688 468 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 469 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 470 # 1 2 3 4 5 6
pascal@688 471 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 472 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@688 473 here="$(pwd)"
pascal@688 474 cd $tmpcpio
pascal@688 475 cpio -i fs.cpio.gz > /dev/null < "$archive"
pascal@688 476 zcat fs.cpio.gz | cpio -tv | $AWK_PROG '
pascal@688 477 {
pascal@688 478 attr=$1
pascal@688 479 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 480 uid=ids[1]
pascal@688 481 gid=ids[2]
pascal@688 482 size=$3
pascal@688 483 date=$4
pascal@688 484 time=$5
pascal@688 485
pascal@688 486 #this method works with filenames that start with a space (evil!)
pascal@688 487 #split line a time and a space
pascal@688 488 split($0,linesplit, $5 " ")
pascal@688 489 #then split the second item (name&link) at the space arrow space
pascal@688 490 split(linesplit[2], nlsplit, " -> ")
pascal@688 491
pascal@688 492 name=substr(nlsplit[1],3)
pascal@688 493 link=nlsplit[2]
pascal@688 494
pascal@688 495 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 496
pascal@688 497 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 498 }'
pascal@688 499 cd $here
pascal@688 500 rm -rf $tmpcpio
pascal@688 501 exit
pascal@942 502 fi
pascal@942 503 done
pascal@942 504
pascal@943 505 for ext in $ISO_EXTS $SQUASHFS_EXTS $CROMFS_EXTS $CLOOP_EXTS $FS_EXTS; do
pascal@942 506 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@942 507 loop_fs $ext stat
pascal@942 508 exit
pascal@688 509 fi
pascal@688 510 done
pascal@688 511 exit $E_UNSUPPORTED
pascal@688 512 ;;
pascal@688 513
pascal@688 514 -a) # add to archive passed files
pascal@941 515 update_tar_cpio add_file "$@"
pascal@943 516 for ext in $FS_EXTS; do
pascal@943 517 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@943 518 loop_fs $ext add "$@"
pascal@943 519 exit 0
pascal@943 520 fi
pascal@943 521 done
pascal@688 522 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 523 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 524 # we only want to add the file's basename, not
pascal@688 525 # the full path so...
pascal@688 526 while [ "$1" ]; do
pascal@688 527 cd "$(dirname "$1")"
pascal@688 528 zip -g -r "$archive" "$(basename "$1")"
pascal@688 529 wrapper_status=$?
pascal@688 530 shift 1
pascal@688 531 done
pascal@688 532 exit $wrapper_status
pascal@688 533 fi
pascal@688 534 done
pascal@688 535 exit $E_UNSUPPORTED
pascal@688 536 ;;
pascal@688 537
pascal@688 538 -n) # new: create new archive with passed files
pascal@941 539 update_tar_cpio new_archive "$@"
pascal@688 540 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 541 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 542 # create will only be passed the first file, the
pascal@688 543 # rest will be "added" to the new archive
pascal@688 544 cd "$(dirname "$1")"
pascal@688 545 zip -r "$archive" "$(basename "$1")"
pascal@688 546 fi
pascal@688 547 done
pascal@688 548 exit $E_UNSUPPORTED
pascal@688 549 ;;
pascal@688 550
pascal@688 551 -r) # remove: from archive passed files
pascal@941 552 update_tar_cpio remove_file "$@"
pascal@943 553 for ext in $FS_EXTS; do
pascal@943 554 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@943 555 loop_fs $ext remove "$@"
pascal@943 556 exit 0
pascal@943 557 fi
pascal@943 558 done
pascal@688 559 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 560 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 561 zip -d "$archive" "$@"
pascal@688 562 fi
pascal@688 563 done
pascal@688 564 exit $E_UNSUPPORTED
pascal@688 565 ;;
pascal@688 566
pascal@688 567 -e) # extract: from archive passed files
pascal@688 568 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do
pascal@688 569 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 570 # xarchive will put is the right extract dir
pascal@688 571 # so we just have to extract.
pascal@942 572 $DECOMPRESS "$archive" | tar -xf - "$@"
pascal@688 573 exit $?
pascal@688 574 fi
pascal@688 575 done
pascal@688 576 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@688 577 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 578 if [ -n "$1" ]; then
pascal@688 579 while [ "$1" ]; do
pascal@688 580 $DECOMPRESS "$archive" | cpio -idv "$1"
pascal@688 581 shift 1
pascal@688 582 done
pascal@688 583 else
pascal@688 584 $DECOMPRESS "$archive" | cpio -idv
pascal@688 585 fi
pascal@688 586 exit $?
pascal@688 587 fi
pascal@688 588 done
pascal@688 589 for ext in $ZIP_EXTS; do
pascal@688 590 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 591 # xarchive will put is the right extract dir
pascal@688 592 # so we just have to extract.
pascal@688 593 unzip -n "$archive" "$@"
pascal@688 594 exit $?
pascal@688 595 fi
pascal@688 596 done
pascal@688 597 for ext in $RPM_EXTS; do
pascal@688 598 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 599 if [ -n "$1" ]; then
pascal@688 600 while [ "$1" ]; do
pascal@688 601 rpm2cpio "$archive" | cpio -idv "$1"
pascal@688 602 shift 1
pascal@688 603 done
pascal@688 604 else
pascal@688 605 rpm2cpio "$archive" | cpio -idv
pascal@688 606 fi
pascal@688 607 exit $?
pascal@688 608 fi
pascal@688 609 done
pascal@688 610
pascal@688 611 for ext in $DEB_EXTS; do
pascal@688 612 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 613 dpkg-deb -X "$archive" "$@"
pascal@688 614 exit $?
pascal@688 615 fi
pascal@688 616 done
pascal@688 617 for ext in $TAZPKG_EXTS; do
pascal@688 618 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 619 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@688 620 here="$(pwd)"
pascal@688 621 cd $tmpcpio
pascal@688 622 cpio -i < "$archive" > /dev/null
pascal@688 623 zcat fs.cpio.gz | cpio -id > /dev/null
pascal@688 624 status=$?
pascal@688 625 if [ -n "$1" ]; then
pascal@688 626 while [ "$1" ]; do
pascal@688 627 dir=$(dirname "$here/$1")
pascal@688 628 mkdir -p "$dir" 2> /dev/null
pascal@688 629 mv "fs/$1" "$dir" 2> /dev/null
pascal@688 630 done
pascal@688 631 else
pascal@688 632 mv fs/* fs/.* $here 2> /dev/null
pascal@688 633 fi
pascal@688 634 cd $here
pascal@688 635 rm -rf $tmpcpio
pascal@688 636 exit $status
pascal@688 637 fi
pascal@688 638 done
pascal@943 639 for ext in $ISO_EXTS $SQUASHFS_EXTS $CROMFS_EXTS $CLOOP_EXTS $FS_EXTS; do
pascal@942 640 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@942 641 loop_fs $ext copy "$@"
pascal@942 642 exit 0
pascal@942 643 fi
pascal@942 644 done
pascal@688 645 exit $E_UNSUPPORTED
pascal@688 646 ;;
pascal@688 647
pascal@688 648 *) echo "error, option $opt not supported"
pascal@688 649 echo "use one of these:"
pascal@688 650 echo "-i #info"
pascal@688 651 echo "-o archive #open"
pascal@688 652 echo "-a archive files #add"
pascal@688 653 echo "-n archive file #new"
pascal@688 654 echo "-r archive files #remove"
pascal@688 655 echo "-e archive files #extract"
pascal@688 656 exit
pascal@688 657 esac