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

Add squirrelmail-ldapuser
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Feb 15 22:50:52 2009 +0000 (2009-02-15)
parents b538edb05596
children d1d5df9b017e
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@2124 84 DECOMPRESS="bunzip2 -c"
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@2125 149 [ $(expr "$lc_archive" : ".*\."$BZIP2_EXTS"$") -gt 0 ] && ! which bzip2 && return
pascal@941 150 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS; do
pascal@941 151 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@941 152 if [ "$action" = "new_archive" ]; then
pascal@941 153 decompress_func
pascal@941 154 cd "$tardir"
pascal@941 155 tar -cf "$archive" "${1#$tardir/}"
pascal@941 156 status=$?
pascal@941 157 compress_func
pascal@941 158 exit $status
pascal@941 159 fi
pascal@941 160 if not_busybox tar; then
pascal@941 161 decompress_func
pascal@941 162 case "$action" in
pascal@941 163 remove_file)
pascal@941 164 tar --delete -f "$archive" "$@";;
pascal@941 165 add_file)
pascal@941 166 cd "$tardir"
pascal@941 167 tar -rf "$archive" "${1#$tardir/}";;
pascal@941 168 *) false;;
pascal@941 169 esac
pascal@941 170 status=$?
pascal@941 171 compress_func
pascal@941 172 exit $status
pascal@941 173 fi
pascal@941 174 tmptar="$(mktemp -d -t tartmp.XXXXXX)"
pascal@941 175 here="$(pwd)"
pascal@941 176 cd $tmptar
pascal@941 177 $DECOMPRESS < "$archive" | tar -xf -
pascal@941 178 status=$?
pascal@941 179 if [ $status -eq 0 -a -n "$1" ]; then
pascal@941 180 while [ "$1" ]; do
pascal@941 181 $action "${1#$tardir/}" $here
pascal@941 182 shift
pascal@941 183 done
pascal@941 184 tar -cf - $(ls -a | grep -v ^\.$ | grep -v ^\.\.$) | \
pascal@941 185 $COMPRESS > "$archive"
pascal@941 186 status=$?
pascal@941 187 fi
pascal@941 188 cd $here
pascal@941 189 rm -rf $tmptar
pascal@941 190 exit $status
pascal@941 191 fi
pascal@941 192 done
pascal@941 193 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@941 194 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@941 195 if [ "$action" = "new_archive" ]; then
pascal@941 196 decompress_func
pascal@941 197 cd "$tardir"
pascal@941 198 echo "${1#$tardir/}" | cpio -o -H newc > "$archive"
pascal@941 199 status=$?
pascal@941 200 compress_func
pascal@941 201 exit $status
pascal@941 202 fi
pascal@941 203 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@941 204 here="$(pwd)"
pascal@941 205 cd $tmpcpio
pascal@941 206 $DECOMPRESS "$archive" | cpio -id > /dev/null
pascal@941 207 status=$?
pascal@941 208 if [ $status -eq 0 -a -n "$1" ]; then
pascal@941 209 while [ "$1" ]; do
pascal@941 210 $action "${1#$tardir/}" $here
pascal@941 211 shift
pascal@941 212 done
pascal@941 213 find . | cpio -o -H newc | $COMPRESS > "$archive"
pascal@941 214 status=$?
pascal@941 215 fi
pascal@941 216 cd $here
pascal@941 217 rm -rf $tmpcpio
pascal@941 218 exit $status
pascal@941 219 fi
pascal@941 220 done
pascal@941 221 }
pascal@941 222
pascal@942 223 loop_fs()
pascal@942 224 {
pascal@942 225 tmpfs="$(mktemp -d -t fstmp.XXXXXX)"
pascal@942 226 umnt="umount -d"
pascal@943 227 case " $CLOOP_EXTS " in
pascal@943 228 \ $1\ ) mount -o loop=/dev/cloop,ro "$archive" $tmpfs;;
pascal@943 229 esac
pascal@943 230 case " $FS_EXTS " in
pascal@943 231 \ $1\ ) mount -o loop,rw "$archive" $tmpfs;;
pascal@943 232 esac
pascal@942 233 case " $ISO_EXTS " in
pascal@942 234 \ $1\ ) mount -o loop,ro -t iso9660 "$archive" $tmpfs;;
pascal@942 235 esac
pascal@942 236 case " $SQUASHFS_EXTS " in
pascal@942 237 \ $1\ ) mount -o loop,ro -t squashfs "$archive" $tmpfs;;
pascal@942 238 esac
pascal@942 239 case " $CROMFS_EXTS " in
pascal@942 240 \ $1\ ) cromfs-driver "$archive" $tmpfs; umnt="fusermount -u";;
pascal@942 241 esac
pascal@942 242 case "$2" in
pascal@942 243 stat) find $tmpfs | while read f; do
pascal@942 244 [ "$f" = "$tmpfs" ] && continue
pascal@942 245 link="-"
pascal@942 246 [ -L "$f" ] && link=$(readlink "$f")
pascal@942 247 date=$(stat -c "%y" $f | awk \
pascal@942 248 '{ printf "%s;%s\n",$1,substr($2,0,8)}')
pascal@942 249 echo "${f#$tmpfs/};$(stat -c "%s;%A;%U;%G" $f);$date;$link"
pascal@942 250 done;;
pascal@942 251 copy) if [ -z "$3" ]; then
pascal@942 252 ( cd $tmpfs ; tar cf - . ) | tar xf -
pascal@942 253 else
pascal@942 254 while [ -n "$3" ]; do
pascal@942 255 ( cd $tmpfs ; tar cf - "$3" ) | tar xf -
pascal@942 256 shift;
pascal@942 257 done
pascal@942 258 fi;;
pascal@943 259 add) tar cf - "$@" | ( cd $tmpfs ; tar xf - );;
pascal@943 260 remove) while [ -n "$3" ]; do
pascal@943 261 rm -rf $tmpfs/$3
pascal@943 262 done;;
pascal@942 263 esac
pascal@942 264 $umnt $tmpfs
pascal@942 265 rmdir $tmpfs
pascal@942 266 }
pascal@942 267
pascal@688 268 # the option switches
pascal@688 269 case "$opt" in
pascal@688 270 -i) # info: output supported extentions for progs that exist
pascal@688 271 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS \
pascal@688 272 $CPIO_EXTS $CPIOGZ_EXTS $ZIP_EXTS $DEB_EXTS $RPM_EXTS \
pascal@2080 273 $TAZPKG_EXTS $ISO_EXTS $FS_EXTS $IPK_EXTS; do
pascal@688 274 printf "%s;" $ext
pascal@688 275 if [ "$ext" = "zip" -a ! "$(which zip)" ]; then
pascal@688 276 echo warning: zip not found, extract only >/dev/stderr
pascal@688 277 fi
pascal@688 278 done
pascal@942 279 [ -d /lib/modules/$(uname -r)/kernel/fs/squashfs/squashfs.ko ] && \
pascal@942 280 for ext in $SQUASHFS_EXTS; do
pascal@942 281 printf "%s;" $ext
pascal@942 282 done
pascal@942 283 [ -x /bin/cromfs-driver ] && for ext in $CROMFS_EXTS; do
pascal@942 284 printf "%s;" $ext
pascal@942 285 done
pascal@943 286 [ -d /lib/modules/$(uname -r)/kernel/drivers/block/cloop.ko ] && \
pascal@943 287 for ext in $CLOOP_EXTS; do
pascal@943 288 printf "%s;" $ext
pascal@943 289 done
pascal@688 290 printf "\n"
pascal@688 291 exit
pascal@688 292 ;;
pascal@688 293
pascal@688 294 -o) # open: mangle output of tar cmd for xarchive
pascal@2080 295 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS \
pascal@2080 296 $IPK_EXTS; do
pascal@688 297 # format of tar output:
pascal@688 298 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 299 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 300 # 1 2 3 4 5 6
pascal@688 301 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@942 302 $DECOMPRESS "$archive" | tar -tvf - | $AWK_PROG '
pascal@688 303 {
pascal@688 304 attr=$1
pascal@688 305 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 306 uid=ids[1]
pascal@688 307 gid=ids[2]
pascal@688 308 size=$3
pascal@688 309 date=$4
pascal@688 310 time=$5
pascal@688 311
pascal@688 312 #this method works with filenames that start with a space (evil!)
pascal@688 313 #split line a time and a space
pascal@688 314 split($0,linesplit, $5 " ")
pascal@688 315 #then split the second item (name&link) at the space arrow space
pascal@688 316 split(linesplit[2], nlsplit, " -> ")
pascal@688 317
pascal@688 318 name=nlsplit[1]
pascal@688 319 link=nlsplit[2]
pascal@688 320
pascal@688 321 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 322
pascal@688 323 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 324 }'
pascal@688 325 exit
pascal@688 326 fi
pascal@688 327 done
pascal@688 328
pascal@688 329 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@688 330 # format of cpio output:
pascal@688 331 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 332 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 333 # 1 2 3 4 5 6
pascal@688 334 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 335 $DECOMPRESS "$archive" | cpio -tv | $AWK_PROG '
pascal@688 336 {
pascal@688 337 attr=$1
pascal@688 338 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 339 uid=ids[1]
pascal@688 340 gid=ids[2]
pascal@688 341 size=$3
pascal@688 342 date=$4
pascal@688 343 time=$5
pascal@688 344
pascal@688 345 #this method works with filenames that start with a space (evil!)
pascal@688 346 #split line a time and a space
pascal@688 347 split($0,linesplit, $5 " ")
pascal@688 348 #then split the second item (name&link) at the space arrow space
pascal@688 349 split(linesplit[2], nlsplit, " -> ")
pascal@688 350
pascal@688 351 name=nlsplit[1]
pascal@688 352 link=nlsplit[2]
pascal@688 353
pascal@688 354 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 355
pascal@688 356 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 357 }'
pascal@688 358 exit
pascal@688 359 fi
pascal@688 360 done
pascal@688 361
pascal@688 362 for ext in $ZIP_EXTS; do
pascal@688 363 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 364 if which zipinfo; then
pascal@688 365 # format of zipinfo -T -s-h- output:
pascal@688 366 # -rw-r--r-- 2.3 unx 11512 tx defN YYYYMMDD.HHMMSS file
pascal@688 367 # 1 2 3 4 5 6 7 8
pascal@688 368 zipinfo -T -s-h-t "$archive" | $AWK_PROG -v uuid=$(id -u -n) '
pascal@688 369 {
pascal@688 370 attr=$1; size=$4
pascal@688 371
pascal@688 372 year=substr($7,1,4)
pascal@688 373 month=substr($7,5,2)
pascal@688 374 day=substr($7,7,2)
pascal@688 375 date=year "-" month "-" day
pascal@688 376
pascal@688 377 hours=substr($7,10,2)
pascal@688 378 mins=substr($7,12,2)
pascal@688 379 secs=substr($7,14,2)
pascal@688 380 time=hours ":" mins ":" secs
pascal@688 381
pascal@688 382 uid=uuid; gid=uuid; link="-"
pascal@688 383 #split line at the time and a space, second item is our name
pascal@688 384 split($0, linesplit, ($7 " "))
pascal@688 385 name=linesplit[2]
pascal@688 386 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 387 }'
pascal@688 388 exit
pascal@688 389 else
pascal@688 390 # format of unzip -l output:
pascal@688 391 # 6622 2005-04-22 12:29:14 file
pascal@688 392 # 1 2 3 4
pascal@688 393 unzip -l "$archive" | $AWK_PROG -v uuid=$(id -u -n) '
pascal@688 394 BEGIN { n = 0}
pascal@688 395 {
pascal@688 396 n=n+1
pascal@688 397 attr=""
pascal@688 398 uid=uuid; gid=uuid
pascal@688 399 size=$1
pascal@688 400 date=$2
pascal@688 401 time=$3
pascal@688 402
pascal@688 403 #this method works with filenames that start with a space (evil!)
pascal@688 404 #split line a time and a space
pascal@688 405 split($0,linesplit, $3 " ")
pascal@688 406 #then split the second item (name&link) at the space arrow space
pascal@688 407 split(linesplit[2], nlsplit, " -> ")
pascal@688 408
pascal@688 409 name=nlsplit[1]
pascal@688 410 link=nlsplit[2]
pascal@688 411
pascal@688 412 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 413
pascal@688 414 if (name != "" && n > 3) printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 415 }'
pascal@688 416 exit
pascal@688 417 fi
pascal@688 418 fi
pascal@688 419 done
pascal@688 420
pascal@688 421 for ext in $RPM_EXTS; do
pascal@688 422 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 423 rpm2cpio "$archive" | cpio -tv | $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 if (name != "" && uid != "blocks") 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 $DEB_EXTS; do
pascal@688 451 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 452 dpkg-deb -c "$archive" | $AWK_PROG '
pascal@688 453 {
pascal@688 454 attr=$1
pascal@688 455 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 456 uid=ids[1]
pascal@688 457 gid=ids[2]
pascal@688 458 size=$3
pascal@688 459 date=$4
pascal@688 460 time=$5
pascal@688 461
pascal@688 462 #this method works with filenames that start with a space (evil!)
pascal@688 463 #split line a time and a space
pascal@688 464 split($0,linesplit, $5 " ")
pascal@688 465 #then split the second item (name&link) at the space arrow space
pascal@688 466 split(linesplit[2], nlsplit, " -> ")
pascal@688 467
pascal@688 468 name=substr(nlsplit[1],2)
pascal@688 469 link=nlsplit[2]
pascal@688 470
pascal@688 471 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 472
pascal@688 473 printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 474 }'
pascal@688 475 exit
pascal@688 476 fi
pascal@688 477 done
pascal@688 478
pascal@688 479 for ext in $TAZPKG_EXTS; do
pascal@688 480 # format of cpio output:
pascal@688 481 # lrwxrwxrwx USR/GRP 0 2005-05-12 00:32:03 file -> /path/to/link
pascal@688 482 # -rw-r--r-- USR/GRP 6622 2005-04-22 12:29:14 file
pascal@688 483 # 1 2 3 4 5 6
pascal@688 484 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 485 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@688 486 here="$(pwd)"
pascal@688 487 cd $tmpcpio
pascal@688 488 cpio -i fs.cpio.gz > /dev/null < "$archive"
pascal@688 489 zcat fs.cpio.gz | cpio -tv | $AWK_PROG '
pascal@688 490 {
pascal@688 491 attr=$1
pascal@688 492 split($2,ids,"/") #split up the 2nd field to get uid/gid
pascal@688 493 uid=ids[1]
pascal@688 494 gid=ids[2]
pascal@688 495 size=$3
pascal@688 496 date=$4
pascal@688 497 time=$5
pascal@688 498
pascal@688 499 #this method works with filenames that start with a space (evil!)
pascal@688 500 #split line a time and a space
pascal@688 501 split($0,linesplit, $5 " ")
pascal@688 502 #then split the second item (name&link) at the space arrow space
pascal@688 503 split(linesplit[2], nlsplit, " -> ")
pascal@688 504
pascal@688 505 name=substr(nlsplit[1],3)
pascal@688 506 link=nlsplit[2]
pascal@688 507
pascal@688 508 if (! link) {link="-"} #if there was no link set it to a dash
pascal@688 509
pascal@688 510 if (name != "" && uid != "blocks") printf "%s;%s;%s;%s;%s;%s;%s;%s\n",name,size,attr,uid,gid,date,time,link
pascal@688 511 }'
pascal@688 512 cd $here
pascal@688 513 rm -rf $tmpcpio
pascal@688 514 exit
pascal@942 515 fi
pascal@942 516 done
pascal@942 517
pascal@943 518 for ext in $ISO_EXTS $SQUASHFS_EXTS $CROMFS_EXTS $CLOOP_EXTS $FS_EXTS; do
pascal@942 519 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@942 520 loop_fs $ext stat
pascal@942 521 exit
pascal@688 522 fi
pascal@688 523 done
pascal@688 524 exit $E_UNSUPPORTED
pascal@688 525 ;;
pascal@688 526
pascal@688 527 -a) # add to archive passed files
pascal@941 528 update_tar_cpio add_file "$@"
pascal@943 529 for ext in $FS_EXTS; do
pascal@943 530 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@943 531 loop_fs $ext add "$@"
pascal@943 532 exit 0
pascal@943 533 fi
pascal@943 534 done
pascal@688 535 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 536 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 537 # we only want to add the file's basename, not
pascal@688 538 # the full path so...
pascal@688 539 while [ "$1" ]; do
pascal@688 540 cd "$(dirname "$1")"
pascal@688 541 zip -g -r "$archive" "$(basename "$1")"
pascal@688 542 wrapper_status=$?
pascal@688 543 shift 1
pascal@688 544 done
pascal@688 545 exit $wrapper_status
pascal@688 546 fi
pascal@688 547 done
pascal@688 548 exit $E_UNSUPPORTED
pascal@688 549 ;;
pascal@688 550
pascal@688 551 -n) # new: create new archive with passed files
pascal@941 552 update_tar_cpio new_archive "$@"
pascal@688 553 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 554 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 555 # create will only be passed the first file, the
pascal@688 556 # rest will be "added" to the new archive
pascal@688 557 cd "$(dirname "$1")"
pascal@688 558 zip -r "$archive" "$(basename "$1")"
pascal@688 559 fi
pascal@688 560 done
pascal@688 561 exit $E_UNSUPPORTED
pascal@688 562 ;;
pascal@688 563
pascal@688 564 -r) # remove: from archive passed files
pascal@941 565 update_tar_cpio remove_file "$@"
pascal@943 566 for ext in $FS_EXTS; do
pascal@943 567 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@943 568 loop_fs $ext remove "$@"
pascal@943 569 exit 0
pascal@943 570 fi
pascal@943 571 done
pascal@688 572 which zip >/dev/null && for ext in $ZIP_EXTS; do
pascal@688 573 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 574 zip -d "$archive" "$@"
pascal@688 575 fi
pascal@688 576 done
pascal@688 577 exit $E_UNSUPPORTED
pascal@688 578 ;;
pascal@688 579
pascal@688 580 -e) # extract: from archive passed files
pascal@2080 581 for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS \
pascal@2080 582 $IPK_EXTS; do
pascal@688 583 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 584 # xarchive will put is the right extract dir
pascal@688 585 # so we just have to extract.
pascal@942 586 $DECOMPRESS "$archive" | tar -xf - "$@"
pascal@688 587 exit $?
pascal@688 588 fi
pascal@688 589 done
pascal@688 590 for ext in $CPIO_EXTS $CPIOGZ_EXTS; do
pascal@688 591 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 592 if [ -n "$1" ]; then
pascal@688 593 while [ "$1" ]; do
pascal@688 594 $DECOMPRESS "$archive" | cpio -idv "$1"
pascal@688 595 shift 1
pascal@688 596 done
pascal@688 597 else
pascal@688 598 $DECOMPRESS "$archive" | cpio -idv
pascal@688 599 fi
pascal@688 600 exit $?
pascal@688 601 fi
pascal@688 602 done
pascal@688 603 for ext in $ZIP_EXTS; do
pascal@688 604 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 605 # xarchive will put is the right extract dir
pascal@688 606 # so we just have to extract.
pascal@688 607 unzip -n "$archive" "$@"
pascal@688 608 exit $?
pascal@688 609 fi
pascal@688 610 done
pascal@688 611 for ext in $RPM_EXTS; do
pascal@688 612 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 613 if [ -n "$1" ]; then
pascal@688 614 while [ "$1" ]; do
pascal@688 615 rpm2cpio "$archive" | cpio -idv "$1"
pascal@688 616 shift 1
pascal@688 617 done
pascal@688 618 else
pascal@688 619 rpm2cpio "$archive" | cpio -idv
pascal@688 620 fi
pascal@688 621 exit $?
pascal@688 622 fi
pascal@688 623 done
pascal@688 624
pascal@688 625 for ext in $DEB_EXTS; do
pascal@688 626 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 627 dpkg-deb -X "$archive" "$@"
pascal@688 628 exit $?
pascal@688 629 fi
pascal@688 630 done
pascal@688 631 for ext in $TAZPKG_EXTS; do
pascal@688 632 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@688 633 tmpcpio="$(mktemp -d -t cpiotmp.XXXXXX)"
pascal@688 634 here="$(pwd)"
pascal@688 635 cd $tmpcpio
pascal@688 636 cpio -i < "$archive" > /dev/null
pascal@688 637 zcat fs.cpio.gz | cpio -id > /dev/null
pascal@688 638 status=$?
pascal@688 639 if [ -n "$1" ]; then
pascal@688 640 while [ "$1" ]; do
pascal@688 641 dir=$(dirname "$here/$1")
pascal@688 642 mkdir -p "$dir" 2> /dev/null
pascal@688 643 mv "fs/$1" "$dir" 2> /dev/null
pascal@688 644 done
pascal@688 645 else
pascal@688 646 mv fs/* fs/.* $here 2> /dev/null
pascal@688 647 fi
pascal@688 648 cd $here
pascal@688 649 rm -rf $tmpcpio
pascal@688 650 exit $status
pascal@688 651 fi
pascal@688 652 done
pascal@943 653 for ext in $ISO_EXTS $SQUASHFS_EXTS $CROMFS_EXTS $CLOOP_EXTS $FS_EXTS; do
pascal@942 654 if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
pascal@942 655 loop_fs $ext copy "$@"
pascal@942 656 exit 0
pascal@942 657 fi
pascal@942 658 done
pascal@688 659 exit $E_UNSUPPORTED
pascal@688 660 ;;
pascal@688 661
pascal@688 662 *) echo "error, option $opt not supported"
pascal@688 663 echo "use one of these:"
pascal@688 664 echo "-i #info"
pascal@688 665 echo "-o archive #open"
pascal@688 666 echo "-a archive files #add"
pascal@688 667 echo "-n archive file #new"
pascal@688 668 echo "-r archive files #remove"
pascal@688 669 echo "-e archive files #extract"
pascal@688 670 exit
pascal@688 671 esac