Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- print_padding() {
- [ $1 -eq 0 ] || dd if=/dev/zero bs=$1 count=1 2>/dev/null
- }
- print_tar_header() {
- local checksum=$1; shift
- while [ -n "$1" ]; do
- local width=$1; shift
- local format=$1; shift
- local value=$1; shift
- # replace checksum (the only field with width 7)
- if [ $width = 7 ]; then
- format='%06o'
- value=$checksum
- fi
- local str="$(printf "$format" "$value")"
- printf "%.${width}s" "$str"
- [ ${#str} -ge $width ] || print_padding $((width - (${#str} % width)))
- done
- return $checksum
- }
- checksum_tar_header() {
- local checksum=0
- while [ -n "$1" ]; do
- local width=$1; shift
- local format=$1; shift
- local value=$1; shift
- for byte in $(printf "$format" "$value" | hexdump -n $width -ve '1/1 "%u "'); do
- checksum=$((checksum + $byte))
- done
- done
- return $checksum
- }
- make_tar_header() {
- checksum_tar_header "$@"
- print_tar_header $? "$@"
- }
- make_tar_member() {
- local name=$1
- local content=$2
- local mode=644
- local uid=1000
- local gid=1000
- local size=${#content}
- local mtime=$(date +%s -r "/tmp/t/$name")
- local type=0
- local link=""
- local username="jow"
- local groupname="jow"
- # member header
- make_tar_header \
- 100 "%.100s" "$name" \
- 8 "%07d" $mode \
- 8 "%07o" $uid \
- 8 "%07o" $gid \
- 12 "%011o" $size \
- 12 "%011o" $mtime \
- 7 "%7s" "" \
- 1 "%1s" "" \
- 1 "%d" $type \
- 100 "%.100s" "$link" \
- 8 "%-7s" "ustar" \
- 32 "%.32s" "$username" \
- 32 "%.32s" "$groupname"
- # header padding
- print_padding 183
- # content data
- printf "%s" "$content"
- # content padding
- print_padding $((512 - (size % 512)))
- }
- {
- make_tar_member "example.txt" "Hello there"
- make_tar_member "example-2.txt" "Blah blah"
- # alternatively, instead of the dd, run a `tar -c ...` here
- print_padding 1024
- } | gzip > /tmp/test.tar.gz
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement