wok 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
files xarchive/stuff/slitaz-wrap.sh
line diff
     1.1 --- a/xarchive/stuff/slitaz-wrap.sh	Tue Jun 24 13:47:32 2008 +0000
     1.2 +++ b/xarchive/stuff/slitaz-wrap.sh	Tue Jun 24 15:43:13 2008 +0000
     1.3 @@ -32,6 +32,9 @@
     1.4  RPM_EXTS="rpm"
     1.5  DEB_EXTS="deb"
     1.6  TAZPKG_EXTS="tazpkg"
     1.7 +ISO_EXTS="iso"
     1.8 +SQUASHFS_EXTS="sqfs squashfs"
     1.9 +CROMFS_EXTS="cromfs"
    1.10  
    1.11  # Setup awk program
    1.12  AWK_PROGS="mawk gawk awk"
    1.13 @@ -57,33 +60,28 @@
    1.14  lc_archive="$(echo $archive|tr [:upper:] [:lower:])"
    1.15  DECOMPRESS="cat"
    1.16  COMPRESS="cat"
    1.17 -TAR_COMPRESS_OPT=""
    1.18  for ext in $GZIP_EXTS $CPIOGZ_EXTS; do
    1.19      if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
    1.20          DECOMPRESS="gzip -dc"
    1.21          COMPRESS="gzip -c"
    1.22 -        TAR_COMPRESS_OPT="z"
    1.23      fi
    1.24  done
    1.25  for ext in $BZIP2_EXTS; do
    1.26      if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
    1.27          DECOMPRESS="bzip2 -dc" 
    1.28          COMPRESS="bzip2 -c"
    1.29 -        TAR_COMPRESS_OPT="j"
    1.30      fi
    1.31  done
    1.32  for ext in $LZMA_EXTS; do
    1.33      if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
    1.34          DECOMPRESS="unlzma -c" 
    1.35          COMPRESS="lzma e -si -so"
    1.36 -        TAR_COMPRESS_OPT="a"
    1.37      fi
    1.38  done
    1.39  for ext in $COMPRESS_EXTS; do
    1.40      if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
    1.41          DECOMPRESS="uncompress -dc" 
    1.42          COMPRESS="compress -c"
    1.43 -        TAR_COMPRESS_OPT="--use-compress-prog=compress"
    1.44      fi
    1.45  done
    1.46  
    1.47 @@ -208,17 +206,59 @@
    1.48      done
    1.49  }
    1.50  
    1.51 +loop_fs()
    1.52 +{
    1.53 +    tmpfs="$(mktemp -d -t fstmp.XXXXXX)"
    1.54 +    umnt="umount -d"
    1.55 +    case " $ISO_EXTS " in 
    1.56 +    \ $1\ ) mount -o loop,ro -t iso9660 "$archive" $tmpfs;;
    1.57 +    esac
    1.58 +    case " $SQUASHFS_EXTS " in 
    1.59 +    \ $1\ ) mount -o loop,ro -t squashfs "$archive" $tmpfs;;
    1.60 +    esac
    1.61 +    case " $CROMFS_EXTS " in 
    1.62 +    \ $1\ ) cromfs-driver "$archive" $tmpfs; umnt="fusermount -u";;
    1.63 +    esac
    1.64 +    case "$2" in
    1.65 +    stat)	find $tmpfs | while read f; do
    1.66 +    		    [ "$f" = "$tmpfs" ] && continue
    1.67 +		    link="-"
    1.68 +		    [ -L "$f" ] && link=$(readlink "$f")
    1.69 +		    date=$(stat -c "%y" $f | awk \
    1.70 +		    	'{ printf "%s;%s\n",$1,substr($2,0,8)}')
    1.71 +		    echo "${f#$tmpfs/};$(stat -c "%s;%A;%U;%G" $f);$date;$link"
    1.72 +    		done;;
    1.73 +    copy)	if [ -z "$3" ]; then
    1.74 +    		    ( cd $tmpfs ; tar cf - . ) | tar xf -
    1.75 +    		else
    1.76 +		    while [ -n "$3" ]; do
    1.77 +    			( cd $tmpfs ; tar cf - "$3" ) | tar xf -
    1.78 +			shift;
    1.79 +		    done
    1.80 +		fi;;
    1.81 +    esac
    1.82 +    $umnt $tmpfs
    1.83 +    rmdir $tmpfs
    1.84 +}
    1.85 +
    1.86  # the option switches
    1.87  case "$opt" in
    1.88      -i) # info: output supported extentions for progs that exist
    1.89          for ext in $TAR_EXTS $GZIP_EXTS $BZIP2_EXTS $COMPRESS_EXTS $LZMA_EXTS \
    1.90                     $CPIO_EXTS $CPIOGZ_EXTS $ZIP_EXTS $DEB_EXTS $RPM_EXTS \
    1.91 -                   $TAZPKG_EXTS ; do
    1.92 +                   $TAZPKG_EXTS $ISO_EXTS; do
    1.93              printf "%s;" $ext
    1.94              if [ "$ext" = "zip" -a ! "$(which zip)" ]; then
    1.95                  echo warning: zip not found, extract only >/dev/stderr
    1.96              fi
    1.97          done
    1.98 +	[ -d /lib/modules/$(uname -r)/kernel/fs/squashfs/squashfs.ko ] && \
    1.99 +	for ext in $SQUASHFS_EXTS; do
   1.100 +            printf "%s;" $ext
   1.101 +	done
   1.102 +	[ -x /bin/cromfs-driver ] && for ext in $CROMFS_EXTS; do
   1.103 +            printf "%s;" $ext
   1.104 +	done
   1.105          printf "\n"
   1.106          exit
   1.107          ;;
   1.108 @@ -230,7 +270,7 @@
   1.109  # -rw-r--r-- USR/GRP    6622 2005-04-22 12:29:14 file 
   1.110  # 1          2          3    4          5        6
   1.111              if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
   1.112 -                tar -tv${TAR_COMPRESS_OPT}f "$archive" | $AWK_PROG '
   1.113 +		$DECOMPRESS "$archive" | tar -tvf - | $AWK_PROG '
   1.114          {
   1.115            attr=$1
   1.116            split($2,ids,"/") #split up the 2nd field to get uid/gid
   1.117 @@ -443,6 +483,13 @@
   1.118  		cd $here
   1.119  		rm -rf $tmpcpio
   1.120                  exit
   1.121 +	    fi
   1.122 +        done
   1.123 +
   1.124 +        for ext in $ISO_EXTS $SQUASHFS_EXTS $CROMFS_EXTS; do
   1.125 +            if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
   1.126 +	    	loop_fs $ext stat
   1.127 +                exit
   1.128              fi
   1.129  	done
   1.130          exit $E_UNSUPPORTED
   1.131 @@ -494,7 +541,7 @@
   1.132              if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
   1.133                  # xarchive will put is the right extract dir
   1.134                  # so we just have to extract.
   1.135 -		$DECOMPRESS < "$archive" | tar -xf - "$@"
   1.136 +		$DECOMPRESS "$archive" | tar -xf - "$@"
   1.137                  exit $?
   1.138  	    fi
   1.139  	done
   1.140 @@ -561,6 +608,12 @@
   1.141  		exit $status
   1.142  	    fi
   1.143  	done
   1.144 +        for ext in $ISO_EXTS $SQUASHFS_EXTS $CROMFS_EXTS; do
   1.145 +            if [ $(expr "$lc_archive" : ".*\."$ext"$") -gt 0 ]; then
   1.146 +	    	loop_fs $ext copy "$@"
   1.147 +                exit 0
   1.148 +            fi
   1.149 +	done
   1.150          exit $E_UNSUPPORTED
   1.151          ;;
   1.152