parent
ce253576b1
commit
5bc1bce3ee
@ -0,0 +1 @@ |
||||
**/pcmi/** |
@ -0,0 +1,19 @@ |
||||
#!/bin/sh -e |
||||
|
||||
# SUM |
||||
|
||||
# TODO: extract self without resolving to $0 because it doesn't resolve links |
||||
tail -c +"$(expr BYTES + 1)" $0 | lz4 -dc | tar -x |
||||
# TODO: remove hardcoded directory |
||||
# TODO: use a different extraction path |
||||
cd ID |
||||
|
||||
export ORIGIN="$(pwd)" |
||||
export LD_LIBRARY_PATH="$ORIGIN/lib" |
||||
export PATH="$ORIGIN/bin":$PATH |
||||
|
||||
export LD_DEBUG='libs' |
||||
|
||||
# TODO: use $0 instead |
||||
# FIXME: uses the system's basename |
||||
exec bin/"$(basename "$1")" |
@ -0,0 +1,128 @@ |
||||
#!/bin/sh -ex |
||||
|
||||
# NEEDED: lz4 readelf tar cat awk cut sed sh sort |
||||
|
||||
WORKDIR="$(basename "$1")" |
||||
SYS_LIBDIR='/lib' |
||||
PRELOAD_SCRIPT='preload' |
||||
LIBLIST=$WORKDIR/liblist |
||||
SUMFILE=$WORKDIR/checksum |
||||
tmpfile=$WORKDIR/tt |
||||
|
||||
die () |
||||
{ |
||||
echo "$1" |
||||
exit |
||||
} |
||||
|
||||
getlibs () |
||||
{ |
||||
tmplist=$WORKDIR/tmplist |
||||
|
||||
touch $LIBLIST |
||||
|
||||
readelf -d "$1" | |
||||
grep NEEDED | |
||||
awk '{print $5}' | |
||||
sed s/\\[/\ / | sed s/\\]/\ / > $tmplist |
||||
|
||||
while test -s $tmplist; do |
||||
cat $LIBLIST $tmplist > $tmpfile |
||||
mv -f $tmpfile $LIBLIST |
||||
for f in $tmplist; do |
||||
readelf -d "$f" | |
||||
grep NEEDED | |
||||
awk '{print $5}' | |
||||
sed s/\\[/\ / | sed s/\\]/\ / > $tmplist |
||||
done |
||||
done |
||||
rm -f $tmplist |
||||
} |
||||
|
||||
if ! [ $WORKDIR ]; then |
||||
die 'Not enough arguments' |
||||
fi |
||||
|
||||
if ! test -d $WORKDIR ; then |
||||
die 'Argument is not a directory' |
||||
fi |
||||
|
||||
if test -e $WORKDIR/bin; then |
||||
if ! test -d $WORKDIR/bin; then |
||||
die 'bin/ is not a directory' |
||||
fi |
||||
else |
||||
die 'Directory does not contain bin/' |
||||
fi |
||||
|
||||
if ! test -e $WORKDIR/id; then |
||||
die 'id file not present' |
||||
fi |
||||
|
||||
if ls -1 $WORKDIR/bin; then |
||||
for f in $WORKDIR/bin/*; do |
||||
if ! test -x $f; then |
||||
die "$f is not executable" |
||||
fi |
||||
done |
||||
else |
||||
die 'bin/ is empty, there has to be at least one executable' |
||||
fi |
||||
|
||||
# Create necessary directories and files |
||||
mkdir -p $WORKDIR/lib |
||||
mkdir -p $WORKDIR/man |
||||
mkdir -p $WORKDIR/ext |
||||
touch $WORKDIR/env |
||||
|
||||
# TODO: add usage and error checking |
||||
# FIXME: double sed should be avoided |
||||
DIRNAME="$WORKDIR"/"$(head -1 $WORKDIR/id | awk '{print $1}')" |
||||
|
||||
if test -s $LIBLIST; then |
||||
rm -f $LIBLIST |
||||
fi |
||||
|
||||
for b in $WORKDIR/bin/*; do |
||||
getlibs $b |
||||
done |
||||
sort -u $LIBLIST > $tmpfile |
||||
mv -f $tmpfile $LIBLIST |
||||
while read f; do |
||||
find -L $SYS_LIBDIR -maxdepth 2 -name "$f" -exec cp -n {} $WORKDIR/lib/ \; |
||||
done < $LIBLIST |
||||
|
||||
if test -d $DIRNAME; then |
||||
rm -rf $DIRNAME |
||||
fi |
||||
mkdir -p $DIRNAME |
||||
|
||||
cp -r $WORKDIR/bin $DIRNAME/ |
||||
cp -r $WORKDIR/lib $DIRNAME/ |
||||
cp -r $WORKDIR/man $DIRNAME/ |
||||
cp -r $WORKDIR/ext $DIRNAME/ |
||||
cp $WORKDIR/env $DIRNAME/ |
||||
cp $WORKDIR/id $DIRNAME/ |
||||
|
||||
tar -c -f $DIRNAME.tar -C $WORKDIR "$(basename $DIRNAME)" |
||||
md5sum -b $DIRNAME.tar | cut -d " " -f1 > $SUMFILE |
||||
lz4 --rm $DIRNAME.tar |
||||
|
||||
cat "$PRELOAD_SCRIPT" | |
||||
sed s/SUM/"$(cat $SUMFILE)"/ | |
||||
sed s/ID/"$(basename "$DIRNAME")"/ > tpp |
||||
|
||||
size="$(wc -c tpp | cut -d " " -f1)" |
||||
strsize="$(echo "BYTES" | wc -c)" |
||||
numsize="$(echo "$size" | wc -c)" |
||||
normsize="$(expr "$size" - "$(expr "$strsize" - "$numsize")")" |
||||
|
||||
cat tpp | |
||||
sed s/BYTES/"$normsize"/ > tpr |
||||
cat tpr "$DIRNAME".tar.lz4 > "$DIRNAME".it |
||||
|
||||
rm -f tpr tpp |
||||
chmod +x "$DIRNAME".it |
||||
|
||||
rm -rf "$DIRNAME" |
||||
#"$DIRNAME".tar* |
Loading…
Reference in new issue