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

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