pthbs-enter-gen (2835B)
1 #!/bin/sh -e 2 3 if test $# != 1; then 4 printf >2 'usage: %s\n' "pthbs-enter-gen /path/to/env.hash" 5 printf >2 'Error: expected 1 argument, got%s\n' "$#" 6 exit 2 7 fi 8 envtop=$1 9 envdir=$envtop/env 10 envcommand=$envtop/command 11 12 case $(basename "$envtop") in 13 (env.*) ;; 14 (*) 15 printf >&2 "Error: '%s' doesn't look like environment path!\n" "$envtop" 16 exit 1;; 17 esac 18 19 mkdir -p "$envdir" 20 21 if ! test -d "$envcommand"; then 22 printf >&2 "Error: '%s' doesn't exist!\n" "$envcommand" 23 fi 24 printf '%s\n' "$envcommand" >"$envdir/PATH" 25 26 if test -d "$envtop/zsh"; then 27 printf '%s\n' "$envtop/zsh/site-functions:$envtop/zsh/functions" >"$envdir/FPATH" 28 fi 29 30 if test -d "$envtop/library/pkgconfig"; then 31 printf '%s\n' "$envtop/library/pkgconfig" >"$envdir/PKG_CONFIG_LIBDIR" 32 fi 33 34 mkscript() { 35 exe=$envcommand/$1 36 cat >"$exe.new" 37 chmod +x "$exe.new" 38 mv "$exe.new" "$exe" 39 } 40 41 exe=$envcommand/pthbs-enter 42 if test -x "$envcommand/execlineb" && test -x "$envcommand/s6-envdir"; then 43 mkscript pthbs-enter <<EOF 44 #!$envcommand/execlineb -S0 45 "$envcommand/s6-envdir" "$envdir" "$envcommand/exec" \$@ 46 EOF 47 "$envcommand/pthbs-enter" true # TODO: don't run executables without sandbox 48 mkscript pthbs-enter-execlineb <<EOF 49 #!$envcommand/execlineb -S0 50 "$envcommand/s6-envdir" "$envdir" "$envcommand/execlineb" \$@ 51 EOF 52 if test -x "$envcommand/sh"; then 53 mkscript pthbs-enter-sh <<EOF 54 #!$envcommand/execlineb -S0 55 "$envcommand/s6-envdir" "$envdir" "$envcommand/sh" \$@ 56 EOF 57 fi 58 elif test -x "$envcommand/sh" && test -x "$envcommand/envdir"; then 59 mkscript pthbs-enter <<EOF 60 #!$envcommand/sh 61 exec "$envcommand/envdir" "$envdir" "$envcommand/env" -- "\$@" 62 EOF 63 "$envcommand/pthbs-enter" true # TODO: don't run executables without sandbox 64 mkscript pthbs-enter-sh <<EOF 65 #!$envcommand/sh 66 exec "$envcommand/envdir" "$envdir" "$envcommand/sh" "\$@" 67 EOF 68 fi 69 70 if test -x "$envcommand/install-as-current-environment.postinstall"; then 71 mkscript install-as-current-environment <<EOF 72 #!$envcommand/execlineb -P 73 "$envcommand/s6-envdir" "$envdir" "$envcommand/exec" 74 ifelse -n { test -L /run/current } { 75 if { ln -s -f -v "$envtop" /run/current } 76 "$envcommand/install-as-current-environment.postinstall" 77 } 78 foreground { 79 fdmove -c 1 2 80 printf "* Swapping /run/current from %s to " "$envtop" 81 readlink /run/command 82 } 83 getpid NS_PID 84 importas -i NS_PID NS_PID 85 if { mv -v /run/current /run/previous.\${NS_PID} } 86 if { ln -s -f -v "$envtop" /run/current } 87 ifelse { 88 "$envcommand/install-as-current-environment.postinstall" /run/previous.\${NS_PID} 89 } { } 90 foreground { 91 fdmove -c 1 2 92 printf "* %s returned error, reverting to " "$envcommand/install-as-current-environment.postinstall" 93 readlink /run/previous.\${NS_PID} 94 } 95 if { rm -v /run/current } 96 if { mv -v /run/previous.\${NS_PID} /run/current } 97 #foreground { /run/current/command/install-as-current-environment.postinstall } 98 exit 1 99 EOF 100 fi