]>
Commit | Line | Data |
---|---|---|
36c3082a | 1 | #!/bin/bash -e |
dc24f4e1 | 2 | |
a4b1ac78 | 3 | [[ -w / ]] || exec sudo env HOME="$HOME" "$0" "$@" |
a5307b94 | 4 | |
f2ff891e MF |
5 | if [[ -z ${UNSHARE} ]] ; then |
6 | mount_args= | |
7 | if type -P unshare >&/dev/null ; then | |
8 | UNSHARE=true exec unshare -m -- "$0" "$@" | |
9 | fi | |
10 | else | |
11 | mount_args='-n' | |
12 | fi | |
13 | unset UNSHARE | |
14 | ||
d4759d73 | 15 | mounts="proc sys tmp dev dev/pts usr/portage usr/portage/distfiles usr/local/src" |
dc24f4e1 MF |
16 | |
17 | chroot=${0%/*} | |
36c3082a MF |
18 | case ${chroot} in |
19 | .) chroot=${PWD} ;; | |
a5307b94 | 20 | ./*) chroot=${PWD}/${chroot#./} ;; |
36c3082a | 21 | esac |
dc24f4e1 MF |
22 | cd "${chroot}" |
23 | ||
a5307b94 | 24 | do_umount() { |
d4759d73 | 25 | local m mounts=$(mount | grep ${chroot} | awk '{print $3}' | tac) |
a5307b94 | 26 | for m in ${mounts} ; do |
d4759d73 MF |
27 | echo "unmounting ${m}" |
28 | umount "${m}" | |
a5307b94 MF |
29 | done |
30 | if [[ -z ${mounts} ]] ; then | |
31 | echo "nothing mounted in ${chroot}" | |
32 | fi | |
33 | exit 0 | |
34 | } | |
35 | ||
36 | while [[ -n $1 ]] ; do | |
37 | case $1 in | |
abed72e8 MF |
38 | -u) do_umount ;; |
39 | -m) mounts+=" $2"; shift ;; | |
40 | -*) echo "unknown option $1"; exit 1 ;; | |
41 | *) break ;; | |
a5307b94 | 42 | esac |
abed72e8 | 43 | shift |
a5307b94 MF |
44 | done |
45 | ||
dc24f4e1 | 46 | maybe_mount() { |
a5307b94 MF |
47 | local src=/$1 dst=${chroot}/${2:-$1} |
48 | [[ -d ${src} ]] || return 0 | |
49 | mkdir -p "${dst}" | |
f2ff891e | 50 | grep -sq "${dst}" /proc/mounts || mount ${mount_args} --bind "${src}" "${dst}" |
dc24f4e1 MF |
51 | } |
52 | for m in ${mounts} ; do | |
53 | maybe_mount ${m} | |
54 | done | |
55 | ||
56 | get_type() { | |
57 | case $(file "$1") in | |
9d8e5f77 MF |
58 | *x86-64*) echo x86_64;; |
59 | *"Intel 80386"*) echo i386;; | |
60 | *32-bit*PowerPC*) echo ppc;; | |
61 | *64-bit*PowerPC*) echo ppc64;; | |
dc24f4e1 MF |
62 | esac |
63 | } | |
64 | bin_dst=$(get_type bin/bash) | |
f2ff891e | 65 | setarch= |
9d8e5f77 | 66 | if [[ -n ${bin_dst} ]] && type -P setarch &>/dev/null ; then |
dc24f4e1 MF |
67 | setarch="setarch ${bin_dst}" |
68 | fi | |
69 | ||
36c3082a | 70 | if [[ ! -L etc/mtab ]] ; then |
dc24f4e1 MF |
71 | rm -f etc/mtab |
72 | ln -sf /proc/mounts etc/mtab | |
73 | fi | |
74 | etc=" | |
75 | hosts | |
76 | locale.gen | |
77 | localtime | |
78 | resolv.conf | |
79 | " | |
36c3082a | 80 | home=" |
dc24f4e1 | 81 | .inputrc |
619e4d70 MF |
82 | .gdbinit |
83 | .gitconfig | |
dc24f4e1 MF |
84 | .nanorc |
85 | " | |
86 | for f in \ | |
87 | $(printf 'etc/%s ' ${etc}) \ | |
dc24f4e1 | 88 | ; do |
d1eee076 MF |
89 | if [ -e "/${f}" ] ; then |
90 | cp /${f} ${f} | |
91 | fi | |
dc24f4e1 | 92 | done |
36c3082a MF |
93 | for f in ${home} ; do |
94 | cp ~/${f} root/${f} | |
95 | done | |
dc24f4e1 MF |
96 | |
97 | unset LS_COLORS # format changes over time | |
a5307b94 | 98 | [[ $# -eq 0 ]] && set -- env HOME=/root /bin/bash -l |
36c3082a MF |
99 | exec \ |
100 | ${setarch} \ | |
101 | chroot "${chroot}" \ | |
102 | "$@" |