first merging

This commit is contained in:
udeved 2014-10-04 01:43:42 +02:00
parent eaa787147e
commit 09d02fa9ac
17 changed files with 902 additions and 367 deletions

View file

@ -11,172 +11,173 @@
shopt -s extglob shopt -s extglob
# generated from util-linux source: libmount/src/utils.c # generated from util-linux source: libmount/src/utils.c
declare -A pseudofs_types=([anon_inodefs]=1 # declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1 # [autofs]=1
[bdev]=1 # [bdev]=1
[binfmt_misc]=1 # [binfmt_misc]=1
[cgroup]=1 # [cgroup]=1
[configfs]=1 # [configfs]=1
[cpuset]=1 # [cpuset]=1
[debugfs]=1 # [debugfs]=1
[devfs]=1 # [devfs]=1
[devpts]=1 # [devpts]=1
[devtmpfs]=1 # [devtmpfs]=1
[dlmfs]=1 # [dlmfs]=1
[fuse.gvfs-fuse-daemon]=1 # [fuse.gvfs-fuse-daemon]=1
[fusectl]=1 # [fusectl]=1
[hugetlbfs]=1 # [hugetlbfs]=1
[mqueue]=1 # [mqueue]=1
[nfsd]=1 # [nfsd]=1
[none]=1 # [none]=1
[pipefs]=1 # [pipefs]=1
[proc]=1 # [proc]=1
[pstore]=1 # [pstore]=1
[ramfs]=1 # [ramfs]=1
[rootfs]=1 # [rootfs]=1
[rpc_pipefs]=1 # [rpc_pipefs]=1
[securityfs]=1 # [securityfs]=1
[sockfs]=1 # [sockfs]=1
[spufs]=1 # [spufs]=1
[sysfs]=1 # [sysfs]=1
[tmpfs]=1) # [tmpfs]=1)
#
# # generated from: pkgfile -vbr '/fsck\..+' | awk -F. '{ print $NF }' | sort
# declare -A fsck_types=([cramfs]=1
# [exfat]=1
# [ext2]=1
# [ext3]=1
# [ext4]=1
# [ext4dev]=1
# [jfs]=1
# [minix]=1
# [msdos]=1
# [reiserfs]=1
# [vfat]=1
# [xfs]=1)
#
# out() { printf "$1 $2\n" "${@:3}"; }
# error() { out "==> ERROR:" "$@"; } >&2
# msg() { out "==>" "$@"; }
# msg2() { out " ->" "$@";}
# die() { error "$@"; exit 1; }
#
# ignore_error() {
# "$@" 2>/dev/null
# return 0
# }
#
# in_array() {
# local i
# for i in "${@:2}"; do
# [[ $1 = "$i" ]] && return
# done
# }
# generated from: pkgfile -vbr '/fsck\..+' | awk -F. '{ print $NF }' | sort # track_mount() {
declare -A fsck_types=([cramfs]=1 # if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then
[exfat]=1 # CHROOT_ACTIVE_MOUNTS=()
[ext2]=1 # trap 'chroot_umount' EXIT
[ext3]=1 # fi
[ext4]=1 #
[ext4dev]=1 # mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
[jfs]=1 # }
[minix]=1 #
[msdos]=1 # mount_conditionally() {
[reiserfs]=1 # local cond=$1; shift
[vfat]=1 # if eval "$cond"; then
[xfs]=1) # track_mount "$@"
# fi
# }
#
# api_fs_mount() {
# mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
# track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
# track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
# ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
# efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
# track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
# track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
# track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
# track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
# track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
# }
#
# chroot_umount() {
# umount "${CHROOT_ACTIVE_MOUNTS[@]}"
# }
out() { printf "$1 $2\n" "${@:3}"; } # valid_number_of_base() {
error() { out "==> ERROR:" "$@"; } >&2 # local base=$1 len=${#2} i=
msg() { out "==>" "$@"; } #
msg2() { out " ->" "$@";} # for (( i = 0; i < len; i++ )); do
die() { error "$@"; exit 1; } # { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
# done
#
# return 0
# }
#
# mangle() {
# local i= chr= out=
#
# unset {a..f} {A..F}
#
# for (( i = 0; i < ${#1}; i++ )); do
# chr=${1:i:1}
# case $chr in
# [[:space:]\\])
# printf -v chr '%03o' "'$chr"
# out+=\\
# ;;
# esac
# out+=$chr
# done
#
# printf '%s' "$out"
# }
#
# unmangle() {
# local i= chr= out= len=$(( ${#1} - 4 ))
#
# unset {a..f} {A..F}
#
# for (( i = 0; i < len; i++ )); do
# chr=${1:i:1}
# case $chr in
# \\)
# if valid_number_of_base 8 "${1:i+1:3}" ||
# valid_number_of_base 16 "${1:i+1:3}"; then
# printf -v chr '%b' "${1:i:4}"
# (( i += 3 ))
# fi
# ;;
# esac
# out+=$chr
# done
#
# printf '%s' "$out${1:i}"
# }
#
# dm_name_for_devnode() {
# read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
# if [[ $dm_name ]]; then
# printf '/dev/mapper/%s' "$dm_name"
# else
# # don't leave the caller hanging, just print the original name
# # along with the failure.
# print '%s' "$1"
# error 'Failed to resolve device mapper name for: %s' "$1"
# fi
# }
ignore_error() { # fstype_is_pseudofs() {
"$@" 2>/dev/null # (( pseudofs_types["$1"] ))
return 0 # }
} #
# fstype_has_fsck() {
in_array() { # (( fsck_types["$1"] ))
local i # }
for i in "${@:2}"; do
[[ $1 = "$i" ]] && return
done
}
track_mount() {
if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then
CHROOT_ACTIVE_MOUNTS=()
trap 'chroot_umount' EXIT
fi
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
}
mount_conditionally() {
local cond=$1; shift
if eval "$cond"; then
track_mount "$@"
fi
}
api_fs_mount() {
mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
chroot_umount() {
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
}
valid_number_of_base() {
local base=$1 len=${#2} i=
for (( i = 0; i < len; i++ )); do
{ _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
done
return 0
}
mangle() {
local i= chr= out=
unset {a..f} {A..F}
for (( i = 0; i < ${#1}; i++ )); do
chr=${1:i:1}
case $chr in
[[:space:]\\])
printf -v chr '%03o' "'$chr"
out+=\\
;;
esac
out+=$chr
done
printf '%s' "$out"
}
unmangle() {
local i= chr= out= len=$(( ${#1} - 4 ))
unset {a..f} {A..F}
for (( i = 0; i < len; i++ )); do
chr=${1:i:1}
case $chr in
\\)
if valid_number_of_base 8 "${1:i+1:3}" ||
valid_number_of_base 16 "${1:i+1:3}"; then
printf -v chr '%b' "${1:i:4}"
(( i += 3 ))
fi
;;
esac
out+=$chr
done
printf '%s' "$out${1:i}"
}
dm_name_for_devnode() {
read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
if [[ $dm_name ]]; then
printf '/dev/mapper/%s' "$dm_name"
else
# don't leave the caller hanging, just print the original name
# along with the failure.
print '%s' "$1"
error 'Failed to resolve device mapper name for: %s' "$1"
fi
}
fstype_is_pseudofs() {
(( pseudofs_types["$1"] ))
}
fstype_has_fsck() {
(( fsck_types["$1"] ))
}
source @libdir@/functions.sh
newroot=/mnt newroot=/mnt
hostcache=0 hostcache=0

View file

@ -1,6 +1,9 @@
#!/bin/bash #!/bin/bash
m4_include(lib/common.sh) # m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
get_profiles(){ get_profiles(){
local prof= temp= local prof= temp=
for p in $(ls ${profiledir}/*.set);do for p in $(ls ${profiledir}/*.set);do

View file

@ -1,6 +1,8 @@
#!/bin/bash #!/bin/bash
m4_include(lib/common.sh) #m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
# Source makepkg.conf; fail if it is not found # Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then if [[ -r '/etc/makepkg.conf' ]]; then

View file

@ -1,6 +1,8 @@
#!/bin/bash #!/bin/bash
m4_include(lib/common.sh) #m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
set -e set -e
shopt -s extglob shopt -s extglob

View file

@ -3,7 +3,9 @@
# finddeps - find packages that depend on a given depname # finddeps - find packages that depend on a given depname
# #
m4_include(lib/common.sh) # m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
match=$1 match=$1

View file

@ -3,172 +3,174 @@
shopt -s extglob shopt -s extglob
# generated from util-linux source: libmount/src/utils.c # generated from util-linux source: libmount/src/utils.c
declare -A pseudofs_types=([anon_inodefs]=1 # declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1 # [autofs]=1
[bdev]=1 # [bdev]=1
[binfmt_misc]=1 # [binfmt_misc]=1
[cgroup]=1 # [cgroup]=1
[configfs]=1 # [configfs]=1
[cpuset]=1 # [cpuset]=1
[debugfs]=1 # [debugfs]=1
[devfs]=1 # [devfs]=1
[devpts]=1 # [devpts]=1
[devtmpfs]=1 # [devtmpfs]=1
[dlmfs]=1 # [dlmfs]=1
[fuse.gvfs-fuse-daemon]=1 # [fuse.gvfs-fuse-daemon]=1
[fusectl]=1 # [fusectl]=1
[hugetlbfs]=1 # [hugetlbfs]=1
[mqueue]=1 # [mqueue]=1
[nfsd]=1 # [nfsd]=1
[none]=1 # [none]=1
[pipefs]=1 # [pipefs]=1
[proc]=1 # [proc]=1
[pstore]=1 # [pstore]=1
[ramfs]=1 # [ramfs]=1
[rootfs]=1 # [rootfs]=1
[rpc_pipefs]=1 # [rpc_pipefs]=1
[securityfs]=1 # [securityfs]=1
[sockfs]=1 # [sockfs]=1
[spufs]=1 # [spufs]=1
[sysfs]=1 # [sysfs]=1
[tmpfs]=1) # [tmpfs]=1)
#
# generated from: pkgfile -vbr '/fsck\..+' | awk -F. '{ print $NF }' | sort # # generated from: pkgfile -vbr '/fsck\..+' | awk -F. '{ print $NF }' | sort
declare -A fsck_types=([cramfs]=1 # declare -A fsck_types=([cramfs]=1
[exfat]=1 # [exfat]=1
[ext2]=1 # [ext2]=1
[ext3]=1 # [ext3]=1
[ext4]=1 # [ext4]=1
[ext4dev]=1 # [ext4dev]=1
[jfs]=1 # [jfs]=1
[minix]=1 # [minix]=1
[msdos]=1 # [msdos]=1
[reiserfs]=1 # [reiserfs]=1
[vfat]=1 # [vfat]=1
[xfs]=1) # [xfs]=1)
#
out() { printf "$1 $2\n" "${@:3}"; } # out() { printf "$1 $2\n" "${@:3}"; }
error() { out "==> ERROR:" "$@"; } >&2 # error() { out "==> ERROR:" "$@"; } >&2
msg() { out "==>" "$@"; } # msg() { out "==>" "$@"; }
msg2() { out " ->" "$@";} # msg2() { out " ->" "$@";}
die() { error "$@"; exit 1; } # die() { error "$@"; exit 1; }
#
ignore_error() { # ignore_error() {
"$@" 2>/dev/null # "$@" 2>/dev/null
return 0 # return 0
} # }
#
in_array() { # in_array() {
local i # local i
for i in "${@:2}"; do # for i in "${@:2}"; do
[[ $1 = "$i" ]] && return # [[ $1 = "$i" ]] && return
done # done
} # }
#
track_mount() { # track_mount() {
if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then # if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then
CHROOT_ACTIVE_MOUNTS=() # CHROOT_ACTIVE_MOUNTS=()
trap 'chroot_umount' EXIT # trap 'chroot_umount' EXIT
fi # fi
#
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") # mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
} # }
#
mount_conditionally() { # mount_conditionally() {
local cond=$1; shift # local cond=$1; shift
if eval "$cond"; then # if eval "$cond"; then
track_mount "$@" # track_mount "$@"
fi # fi
} # }
#
api_fs_mount() { # api_fs_mount() {
mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind && # mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && # track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && # track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \ # ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && # efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && # track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && # track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && # track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && # track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid # track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
} # }
#
chroot_umount() { # chroot_umount() {
umount "${CHROOT_ACTIVE_MOUNTS[@]}" # umount "${CHROOT_ACTIVE_MOUNTS[@]}"
} # }
#
valid_number_of_base() { # valid_number_of_base() {
local base=$1 len=${#2} i= # local base=$1 len=${#2} i=
#
for (( i = 0; i < len; i++ )); do # for (( i = 0; i < len; i++ )); do
{ _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null # { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
done # done
#
return 0 # return 0
} # }
#
mangle() { # mangle() {
local i= chr= out= # local i= chr= out=
#
unset {a..f} {A..F} # unset {a..f} {A..F}
#
for (( i = 0; i < ${#1}; i++ )); do # for (( i = 0; i < ${#1}; i++ )); do
chr=${1:i:1} # chr=${1:i:1}
case $chr in # case $chr in
[[:space:]\\]) # [[:space:]\\])
printf -v chr '%03o' "'$chr" # printf -v chr '%03o' "'$chr"
out+=\\ # out+=\\
;; # ;;
esac # esac
out+=$chr # out+=$chr
done # done
#
printf '%s' "$out" # printf '%s' "$out"
} # }
#
unmangle() { # unmangle() {
local i= chr= out= len=$(( ${#1} - 4 )) # local i= chr= out= len=$(( ${#1} - 4 ))
#
unset {a..f} {A..F} # unset {a..f} {A..F}
#
for (( i = 0; i < len; i++ )); do # for (( i = 0; i < len; i++ )); do
chr=${1:i:1} # chr=${1:i:1}
case $chr in # case $chr in
\\) # \\)
if valid_number_of_base 8 "${1:i+1:3}" || # if valid_number_of_base 8 "${1:i+1:3}" ||
valid_number_of_base 16 "${1:i+1:3}"; then # valid_number_of_base 16 "${1:i+1:3}"; then
printf -v chr '%b' "${1:i:4}" # printf -v chr '%b' "${1:i:4}"
(( i += 3 )) # (( i += 3 ))
fi # fi
;; # ;;
esac # esac
out+=$chr # out+=$chr
done # done
#
printf '%s' "$out${1:i}" # printf '%s' "$out${1:i}"
} # }
#
dm_name_for_devnode() { # dm_name_for_devnode() {
read dm_name <"/sys/class/block/${1#/dev/}/dm/name" # read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
if [[ $dm_name ]]; then # if [[ $dm_name ]]; then
printf '/dev/mapper/%s' "$dm_name" # printf '/dev/mapper/%s' "$dm_name"
else # else
# don't leave the caller hanging, just print the original name # # don't leave the caller hanging, just print the original name
# along with the failure. # # along with the failure.
print '%s' "$1" # print '%s' "$1"
error 'Failed to resolve device mapper name for: %s' "$1" # error 'Failed to resolve device mapper name for: %s' "$1"
fi # fi
} # }
#
fstype_is_pseudofs() { # fstype_is_pseudofs() {
(( pseudofs_types["$1"] )) # (( pseudofs_types["$1"] ))
} # }
#
fstype_has_fsck() { # fstype_has_fsck() {
(( fsck_types["$1"] )) # (( fsck_types["$1"] ))
} # }
#
source @libdir@/functions.sh
write_source() { write_source() {
local src=$1 spec= label= uuid= comment=() local src=$1 spec= label= uuid= comment=()

View file

@ -3,7 +3,9 @@
# lddd - find broken library links on your machine # lddd - find broken library links on your machine
# #
m4_include(lib/common.sh) # m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
ifs=$IFS ifs=$IFS
IFS="${IFS}:" IFS="${IFS}:"

317
lib/functions.sh Normal file
View file

@ -0,0 +1,317 @@
#!/bin/bash
shopt -s extglob
# generated from util-linux source: libmount/src/utils.c
declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1
[bdev]=1
[binfmt_misc]=1
[cgroup]=1
[configfs]=1
[cpuset]=1
[debugfs]=1
[devfs]=1
[devpts]=1
[devtmpfs]=1
[dlmfs]=1
[fuse.gvfs-fuse-daemon]=1
[fusectl]=1
[hugetlbfs]=1
[mqueue]=1
[nfsd]=1
[none]=1
[pipefs]=1
[proc]=1
[pstore]=1
[ramfs]=1
[rootfs]=1
[rpc_pipefs]=1
[securityfs]=1
[sockfs]=1
[spufs]=1
[sysfs]=1
[tmpfs]=1)
# generated from: pkgfile -vbr '/fsck\..+' | awk -F. '{ print $NF }' | sort
declare -A fsck_types=([cramfs]=1
[exfat]=1
[ext2]=1
[ext3]=1
[ext4]=1
[ext4dev]=1
[jfs]=1
[minix]=1
[msdos]=1
[reiserfs]=1
[vfat]=1
[xfs]=1)
# out() { printf "$1 $2\n" "${@:3}"; }
# error() { out "==> ERROR:" "$@"; } >&2
# msg() { out "==>" "$@"; }
# msg2() { out " ->" "$@";}
# die() { error "$@"; exit 1; }
# Avoid any encoding problems
export LANG=C
# check if messages are to be printed using color
unset ALL_OFF BOLD BLUE GREEN RED YELLOW
if [[ -t 2 ]]; then
# prefer terminal safe colored and bold text when tput is supported
if tput setaf 0 &>/dev/null; then
ALL_OFF="$(tput sgr0)"
BOLD="$(tput bold)"
BLUE="${BOLD}$(tput setaf 4)"
GREEN="${BOLD}$(tput setaf 2)"
RED="${BOLD}$(tput setaf 1)"
YELLOW="${BOLD}$(tput setaf 3)"
else
ALL_OFF="\e[1;0m"
BOLD="\e[1;1m"
BLUE="${BOLD}\e[1;34m"
GREEN="${BOLD}\e[1;32m"
RED="${BOLD}\e[1;31m"
YELLOW="${BOLD}\e[1;33m"
fi
fi
readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
plain() {
local mesg=$1; shift
printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg() {
local mesg=$1; shift
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg2() {
local mesg=$1; shift
printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
warning() {
local mesg=$1; shift
printf "${YELLOW}==> WARNING:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
error() {
local mesg=$1; shift
printf "${RED}==> ERROR:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
stat_busy() {
local mesg=$1; shift
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" >&2
}
stat_done() {
printf "${BOLD}done${ALL_OFF}\n" >&2
}
setup_workdir() {
[[ -z $WORKDIR ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
}
cleanup() {
[[ -n $WORKDIR ]] && rm -rf "$WORKDIR"
[[ $1 ]] && exit $1
}
abort() {
msg 'Aborting...'
cleanup 0
}
trap_abort() {
trap - EXIT INT QUIT TERM HUP
abort
}
trap_exit() {
trap - EXIT INT QUIT TERM HUP
cleanup
}
die() {
error "$*"
cleanup 1
}
trap 'trap_abort' INT QUIT TERM HUP
trap 'trap_exit' EXIT
ignore_error() {
"$@" 2>/dev/null
return 0
}
track_mount() {
if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then
CHROOT_ACTIVE_MOUNTS=()
trap 'chroot_umount' EXIT
fi
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
}
mount_conditionally() {
local cond=$1; shift
if eval "$cond"; then
track_mount "$@"
fi
}
api_fs_mount() {
mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
api_fs_mount2() {
mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
track_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind
track_mount ${cache_dirs[0]} "$1/${cache_dirs[0]}" --bind
}
chroot_umount() {
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
}
fstype_is_pseudofs() {
(( pseudofs_types["$1"] ))
}
fstype_has_fsck() {
(( fsck_types["$1"] ))
}
# in_array() {
# local i
# for i in "${@:2}"; do
# [[ $1 = "$i" ]] && return
# done
# }
##
# usage : in_array( $needle, $haystack )
# return : 0 - found
# 1 - not found
##
in_array() {
local needle=$1; shift
local item
for item in "$@"; do
[[ $item = $needle ]] && return 0 # Found
done
return 1 # Not Found
}
valid_number_of_base() {
local base=$1 len=${#2} i=
for (( i = 0; i < len; i++ )); do
{ _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
done
return 0
}
mangle() {
local i= chr= out=
unset {a..f} {A..F}
for (( i = 0; i < ${#1}; i++ )); do
chr=${1:i:1}
case $chr in
[[:space:]\\])
printf -v chr '%03o' "'$chr"
out+=\\
;;
esac
out+=$chr
done
printf '%s' "$out"
}
unmangle() {
local i= chr= out= len=$(( ${#1} - 4 ))
unset {a..f} {A..F}
for (( i = 0; i < len; i++ )); do
chr=${1:i:1}
case $chr in
\\)
if valid_number_of_base 8 "${1:i+1:3}" ||
valid_number_of_base 16 "${1:i+1:3}"; then
printf -v chr '%b' "${1:i:4}"
(( i += 3 ))
fi
;;
esac
out+=$chr
done
printf '%s' "$out${1:i}"
}
dm_name_for_devnode() {
read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
if [[ $dm_name ]]; then
printf '/dev/mapper/%s' "$dm_name"
else
# don't leave the caller hanging, just print the original name
# along with the failure.
print '%s' "$1"
error 'Failed to resolve device mapper name for: %s' "$1"
fi
}
##
# usage : get_full_version( [$pkgname] )
# return : full version spec, including epoch (if necessary), pkgver, pkgrel
##
get_full_version() {
# set defaults if they weren't specified in buildfile
pkgbase=${pkgbase:-${pkgname[0]}}
epoch=${epoch:-0}
if [[ -z $1 ]]; then
if [[ $epoch ]] && (( ! $epoch )); then
echo $pkgver-$pkgrel
else
echo $epoch:$pkgver-$pkgrel
fi
else
for i in pkgver pkgrel epoch; do
local indirect="${i}_override"
eval $(declare -f package_$1 | sed -n "s/\(^[[:space:]]*$i=\)/${i}_override=/p")
[[ -z ${!indirect} ]] && eval ${indirect}=\"${!i}\"
done
if (( ! $epoch_override )); then
echo $pkgver_override-$pkgrel_override
else
echo $epoch_override:$pkgver_override-$pkgrel_override
fi
fi
}

200
manjaro-chroot.in Executable file
View file

@ -0,0 +1,200 @@
#!/bin/bash
shopt -s extglob
# # generated from util-linux source: libmount/src/utils.c
# declare -A pseudofs_types=([anon_inodefs]=1
# [autofs]=1
# [bdev]=1
# [binfmt_misc]=1
# [cgroup]=1
# [configfs]=1
# [cpuset]=1
# [debugfs]=1
# [devfs]=1
# [devpts]=1
# [devtmpfs]=1
# [dlmfs]=1
# [fuse.gvfs-fuse-daemon]=1
# [fusectl]=1
# [hugetlbfs]=1
# [mqueue]=1
# [nfsd]=1
# [none]=1
# [pipefs]=1
# [proc]=1
# [pstore]=1
# [ramfs]=1
# [rootfs]=1
# [rpc_pipefs]=1
# [securityfs]=1
# [sockfs]=1
# [spufs]=1
# [sysfs]=1
# [tmpfs]=1)
#
# # generated from: pkgfile -vbr '/fsck\..+' | awk -F. '{ print $NF }' | sort
# declare -A fsck_types=([cramfs]=1
# [exfat]=1
# [ext2]=1
# [ext3]=1
# [ext4]=1
# [ext4dev]=1
# [jfs]=1
# [minix]=1
# [msdos]=1
# [reiserfs]=1
# [vfat]=1
# [xfs]=1)
# out() { printf "$1 $2\n" "${@:3}"; }
# error() { out "==> ERROR:" "$@"; } >&2
# msg() { out "==>" "$@"; }
# msg2() { out " ->" "$@";}
# die() { error "$@"; exit 1; }
# ignore_error() {
# "$@" 2>/dev/null
# return 0
# }
# in_array() {
# local i
# for i in "${@:2}"; do
# [[ $1 = "$i" ]] && return
# done
# }
# track_mount() {
# if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then
# CHROOT_ACTIVE_MOUNTS=()
# trap 'chroot_umount' EXIT
# fi
#
# mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
# }
#
# mount_conditionally() {
# local cond=$1; shift
# if eval "$cond"; then
# track_mount "$@"
# fi
# }
#
# api_fs_mount() {
# mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
# track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
# track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
# ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
# efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
# track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
# track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
# track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
# track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
# track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
# }
#
# chroot_umount() {
# umount "${CHROOT_ACTIVE_MOUNTS[@]}"
# }
# valid_number_of_base() {
# local base=$1 len=${#2} i=
#
# for (( i = 0; i < len; i++ )); do
# { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
# done
#
# return 0
# }
#
# mangle() {
# local i= chr= out=
#
# unset {a..f} {A..F}
#
# for (( i = 0; i < ${#1}; i++ )); do
# chr=${1:i:1}
# case $chr in
# [[:space:]\\])
# printf -v chr '%03o' "'$chr"
# out+=\\
# ;;
# esac
# out+=$chr
# done
#
# printf '%s' "$out"
# }
#
# unmangle() {
# local i= chr= out= len=$(( ${#1} - 4 ))
#
# unset {a..f} {A..F}
#
# for (( i = 0; i < len; i++ )); do
# chr=${1:i:1}
# case $chr in
# \\)
# if valid_number_of_base 8 "${1:i+1:3}" ||
# valid_number_of_base 16 "${1:i+1:3}"; then
# printf -v chr '%b' "${1:i:4}"
# (( i += 3 ))
# fi
# ;;
# esac
# out+=$chr
# done
#
# printf '%s' "$out${1:i}"
# }
#
# dm_name_for_devnode() {
# read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
# if [[ $dm_name ]]; then
# printf '/dev/mapper/%s' "$dm_name"
# else
# # don't leave the caller hanging, just print the original name
# # along with the failure.
# print '%s' "$1"
# error 'Failed to resolve device mapper name for: %s' "$1"
# fi
# }
# fstype_is_pseudofs() {
# (( pseudofs_types["$1"] ))
# }
#
# fstype_has_fsck() {
# (( fsck_types["$1"] ))
# }
#
source @libdir@/functions.sh
usage() {
cat <<EOF
usage: ${0##*/} chroot-dir [command]
-h Print this help message
If 'command' is unspecified, ${0##*/} will launch /bin/sh.
EOF
}
if [[ -z $1 || $1 = @(-h|--help) ]]; then
usage
exit $(( $# ? 0 : 1 ))
fi
(( EUID == 0 )) || die 'This script must be run with root privileges'
chrootdir=$1
shift
[[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir"
api_fs_mount "$chrootdir" || die "failed to setup API filesystems in chroot %s" "$chrootdir"
track_mount /etc/resolv.conf "$chrootdir/etc/resolv.conf" --bind
SHELL=/bin/sh chroot "$chrootdir" "$@"

View file

@ -8,7 +8,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
m4_include(lib/common.sh) # m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
CHROOT_VERSION='v3' CHROOT_VERSION='v3'
@ -143,38 +145,38 @@ chroot_lock () {
fi fi
} }
track_mount() { # track_mount() {
if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then # if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then
CHROOT_ACTIVE_MOUNTS=() # CHROOT_ACTIVE_MOUNTS=()
trap 'chroot_umount' EXIT # trap 'chroot_umount' EXIT
fi # fi
#
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") # mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
} # }
#
mount_conditionally() { # mount_conditionally() {
local cond=$1; shift # local cond=$1; shift
if eval "$cond"; then # if eval "$cond"; then
track_mount "$@" # track_mount "$@"
fi # fi
} # }
#
api_fs_mount() { # api_fs_mount2() {
mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind && # mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind &&
track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && # track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && # track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && # track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && # track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && # track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && # track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid # track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
track_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind # track_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind
track_mount ${cache_dirs[0]} "$1/${cache_dirs[0]}" --bind # track_mount ${cache_dirs[0]} "$1/${cache_dirs[0]}" --bind
} # }
#
chroot_umount() { # chroot_umount() {
umount "${CHROOT_ACTIVE_MOUNTS[@]}" # umount "${CHROOT_ACTIVE_MOUNTS[@]}"
} # }
chroot_run() { chroot_run() {
local dir=$1 local dir=$1
@ -201,7 +203,7 @@ if [[ -n $RUN ]]; then
chroot_lock chroot_lock
if ${nosystemd};then if ${nosystemd};then
api_fs_mount "${working_dir}" api_fs_mount2 "${working_dir}"
else else
build_mount_args build_mount_args
fi fi

View file

@ -8,7 +8,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
m4_include(lib/common.sh) # m4_include(lib/common.sh)
source @libdir@/shared_lib.sh
shopt -s nullglob shopt -s nullglob