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