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

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