|
|
@@ -0,0 +1,87 @@
|
|
|
+#!/usr/bin/env bash
|
|
|
+
|
|
|
+sharxz(){
|
|
|
+ TAR_OPTIONS=""
|
|
|
+ CHDIR=""
|
|
|
+ OUTPUT="-"
|
|
|
+ TAR_EXCLUDE=()
|
|
|
+ while getopts ":T:S:C:o:" opt; do
|
|
|
+ case ${opt} in
|
|
|
+ T )
|
|
|
+ TAR_OPTIONS="$OPTARG"
|
|
|
+ ;;
|
|
|
+ o )
|
|
|
+ OUTPUT="$OPTARG"
|
|
|
+ ;;
|
|
|
+ C )
|
|
|
+ CHDIR="$OPTARG"
|
|
|
+ ;;
|
|
|
+ \? ) echo "Usage: sharxz [-T TAR_OPTIONS] [-C chdir]" 1>&2
|
|
|
+ ;;
|
|
|
+ : )
|
|
|
+ echo "Invalid option: $OPTARG requires an argument" 1>&2
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+ done
|
|
|
+ shift $((OPTIND -1))
|
|
|
+ [ "$OUTPUT" == "-" ] && OUTPUT="/dev/stdout"
|
|
|
+ INFILE=$1
|
|
|
+
|
|
|
+ if [ "$CHDIR" == "" ]; then
|
|
|
+ CHDIR="$(dirname $INFILE)"
|
|
|
+ fi
|
|
|
+
|
|
|
+ [ ! -f "$INFILE" ] && echo "Error: $INFILE is not a file" 1>&2 && exit 1
|
|
|
+
|
|
|
+ INFILE="$(realpath "--relative-to=$CHDIR" "$INFILE")"
|
|
|
+
|
|
|
+ cd "$CHDIR"
|
|
|
+
|
|
|
+ print_shar "$INFILE" > "$OUTPUT"
|
|
|
+
|
|
|
+}
|
|
|
+print_shar(){
|
|
|
+ printf -- "$UNSHAR\n"
|
|
|
+ tar -c $TAR_OPTIONS .| xz -c -3 -T 0 | base64 -w 0
|
|
|
+ printf -- "\n$SETUPSHAR\n"
|
|
|
+
|
|
|
+ printf -- "./$INFILE "'$@'"\n"
|
|
|
+
|
|
|
+ printf -- "\n$CLEANUPSHAR\n"
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+read -r -d '' UNSHAR <<'UNSHAREOF'
|
|
|
+#!/usr/bin/env bash
|
|
|
+
|
|
|
+set -e
|
|
|
+set +x
|
|
|
+
|
|
|
+FIFO_NAME=$(mktemp -u)
|
|
|
+mkfifo "$FIFO_NAME"
|
|
|
+TMPDIR=$(mktemp -d)
|
|
|
+
|
|
|
+cat $FIFO_NAME|base64 -d |xz -d -T 0 |tar -xC $TMPDIR &
|
|
|
+
|
|
|
+cat <<SAFEPAYLOADEOF > "$FIFO_NAME"
|
|
|
+UNSHAREOF
|
|
|
+
|
|
|
+read -r -d '' SETUPSHAR <<'SETUPSHAREOF'
|
|
|
+SAFEPAYLOADEOF
|
|
|
+
|
|
|
+wait
|
|
|
+rm "$FIFO_NAME"
|
|
|
+cd $TMPDIR
|
|
|
+set +e
|
|
|
+
|
|
|
+SETUPSHAREOF
|
|
|
+
|
|
|
+read -r -d '' CLEANUPSHAR <<'CLEANUPSHAREOF'
|
|
|
+EXITCODE=$?
|
|
|
+rm -r $TMPDIR
|
|
|
+exit $EXITCODE
|
|
|
+
|
|
|
+CLEANUPSHAREOF
|
|
|
+
|
|
|
+[[ "${BASH_SOURCE[0]}" != "${0}" ]] && export -f sharxz || sharxz "$@"
|