]> Dogcows Code - chaz/tar/commitdiff
Handle archives in pax format. Improve handling of traditional archives.
authorSergey Poznyakoff <gray@gnu.org.ua>
Fri, 11 Nov 2005 00:27:21 +0000 (00:27 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Fri, 11 Nov 2005 00:27:21 +0000 (00:27 +0000)
scripts/tarcat

index 9c8fed1cd20dec238578af2784e63712b18cf859..5c2671a1a77ee78656e409ac6a0d9652c46a14a0 100755 (executable)
@@ -1,11 +1,42 @@
 #! /bin/sh
 # Usage: tarcat volume1 volume2 ...
 # concatenates a GNU tar multi-volume archive into a single tar archive.
-# Author: Bruno Haible <bruno@clisp.org>
+# Author: Bruno Haible <bruno@clisp.org>, Sergey Poznyakoff <gray@gnu.org.ua>
+
+# dump_type FILE [N]
+# Print type character from block N (default 0) of tar archive FILE
+dump_type() {
+  dd if="$1" skip=${2:-0} bs=512 count=1 2>/dev/null |
+    tr '\0' ' ' |
+    cut -c157
+}
+
+case `dump_type "$1"` in
+  [gx]) PAX=1;;
+esac
 
 cat "$1"
 shift
 for f
 do
-  dd skip=1 if="$f" 
+  SKIP=0
+  T=`dump_type "$f"`
+  if [ -n "$PAX" ]; then
+    if [ "$T" = "g" ]; then
+      # Global extended header.... 2 blocks
+      # Extended header........... 2 blocks
+      # Ustar header.............. 1 block
+      # FIXME: This calculation is will fail for very long file names.
+      SKIP=5
+    fi
+  else
+    if [ "$T" = "V" ]; then
+      T=`dump_type "$f" 1`
+    fi
+    if [ "$T" = "M" ]; then
+      SKIP=$(($SKIP + 1))
+    fi  
+  fi
+  dd skip=$SKIP if="$f" 
 done
+
This page took 0.024744 seconds and 4 git commands to generate.