summaryrefslogtreecommitdiffstats
path: root/lib/session.sh
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2015-12-06 23:58:44 (EST)
committer P. J. McDermott <pj@pehjota.net>2015-12-06 23:58:44 (EST)
commit778eac65d35163a2c25b2c3fbacffd7ee724e58d (patch)
treed7bb69d53d9cdc3925ce76fb85587dd60858ffd4 /lib/session.sh
parent21316880285d9d406e7732b393a13a95329dee15 (diff)
Move lib/*.sh to src/
Diffstat (limited to 'lib/session.sh')
-rw-r--r--lib/session.sh210
1 files changed, 0 insertions, 210 deletions
diff --git a/lib/session.sh b/lib/session.sh
deleted file mode 100644
index 6453fae..0000000
--- a/lib/session.sh
+++ /dev/null
@@ -1,210 +0,0 @@
-# Functions for managing prokit sessions
-#
-# Copyright (C) 2014 Patrick "P. J." McDermott
-#
-# This file is part of the ProteanOS Development Kit.
-#
-# The ProteanOS Development Kit is free software: you can redistribute
-# it and/or modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# The ProteanOS Development Kit is distributed in the hope that it
-# will be useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with the ProteanOS Development Kit. If not, see
-# <http://www.gnu.org/licenses/>.
-
-session_id=
-session_root=
-session_arch=
-session_plat=
-session_mountdir=
-session_atexit=
-session_sigs=
-
-session_begin()
-{
- local root="${1}"
- local mountdir="${2}"
- local atexit="${3}"
- local installing="${4}"
-
- rand
- session_id=${rand_x}
- session_root="${root}"
- session_arch="$(cat "${root}/etc/proteanos_arch")"
- session_plat="$(cat "${root}/etc/proteanos_plat")"
- session_mountdir="${mountdir}"
- session_atexit="${atexit}"
-
- [ -d "${session_root}/prokit" ] || mkdir "${session_root}/prokit"
- if [ -f "${session_root}/prokit/installing" ] && ! ${installing}; then
- error 2 "$(get_msg 'install_running')"
- fi
-
- session_set_sigs
-
- if ! mutex_timedlock "${session_root}/prokit/sessions.lock" 5; then
- error 2 "$(get_msg 'cant_lock_sessions')"
- fi
-
- # Check for a sessions pool.
- if [ -d "${session_root}/prokit/sessions" ]; then
- if ! profile_file_systems_mounted "${session_root}" \
- "${session_arch}" "${session_plat}"; then
- # If a sessions pool exists but the file systems aren't
- # mounted, clean up the old sessions and mount the file
- # systems.
- rmdir "${session_root}/prokit/sessions/"*
- session_mount
- fi
- else
- # If the sessions pool doesn't exist, create it and mount the
- # file systems.
- mkdir "${session_root}/prokit/sessions"
- session_mount
- fi
-
- # Register the session.
- mkdir "${session_root}/prokit/sessions/${session_id}"
- mkdir "${session_root}/prokit/sessions/${session_id}/wd"
- profile_bind_mount "${session_arch}" "${session_plat}" \
- "${session_mountdir}" \
- "${session_root}/prokit/sessions/${session_id}/wd"
-
- mutex_unlock "${session_root}/prokit/sessions.lock"
-}
-
-session_end()
-{
- trap : ${session_sigs}
-
- ${session_atexit}
-
- # Unregister the session.
- profile_bind_umount "${session_arch}" "${session_plat}" \
- "${session_mountdir}" \
- "${session_root}/prokit/sessions/${session_id}/wd"
- rmdir "${session_root}/prokit/sessions/${session_id}/wd"
- rmdir "${session_root}/prokit/sessions/${session_id}"
-
- if ! mutex_is_unlockable "${session_root}/prokit/sessions.lock"; then
- if ! mutex_timedlock "${session_root}/prokit/sessions.lock" 5
- then
- error 2 "$(get_msg 'cant_lock_sessions')"
- fi
- fi
-
- # Clear the sessions pool. If there are no more sessions, unmount the
- # file systems.
- if rmdir "${session_root}/prokit/sessions" 2>/dev/null; then
- session_umount
- fi
-
- mutex_unlock "${session_root}/prokit/sessions.lock"
-
- trap - ${session_sigs}
-}
-
-session_id()
-{
- printf '%d\n' ${session_id}
- return 0
-}
-
-session_dir()
-{
- printf '/prokit/sessions/%d\n' ${session_id}
- return 0
-}
-
-session_exec()
-{
- local args=
- local session_dir=
-
- args=''
- for arg in "${@}"; do
- arg="'$(printf '%s\n' "${arg}" | sed "s/'/'\\\\''/g")'"
- args="${args} ${arg}"
- done
- session_dir="/prokit/sessions/${session_id}/wd"
- chroot "${session_root}" /bin/sh -c "cd ${session_dir}; ${args}"
-}
-
-session_mount()
-{
- local fs=
- local dir=
- local fstype=
- local options=
-
- while read fs dir fstype options; do
- [ "x${dir}" = 'x' ] && continue
- mount -t "${fstype}" -o "${options}" "${fs}" \
- "${session_root}/${dir}"
- done <<-EOF
- $(profile_get_fstab "${session_arch}" "${session_plat}")
- EOF
-}
-
-session_umount()
-{
- local fs=
- local dir=
- local fstype=
- local options=
-
- while read fs dir fstype options; do
- [ "x${dir}" = 'x' ] && continue
- # umount sometimes complains that the /dev file system is busy.
- # Here's a kludge to try to handle that. We better make sure
- # bind mounts get unmounted; otherwise, `rm -Rf ${root}` can be
- # painful.
- while ! umount "${session_root}/${dir}"; do
- sleep 1
- done
- done <<-EOF
- $(profile_get_fstab "${session_arch}" "${session_plat}" | \
- sed -n '1!G;h;$p')
- EOF
-}
-
-session_set_sigs()
-{
- local i=
- local sig=
-
- # We need the signal *number* in the signal handler. The only portable
- # and easy way to get the number of a named signal is to search for it
- # as in the following loop hack.
- i=0
- session_sigs=''
- while [ ${i} -lt 127 ]; do
- i=$(($i + 1))
- sig="$(kill -l ${i} 2>/dev/null)" || continue
- case "${sig}" in
- 'HUP' | 'INT' | 'QUIT' | 'ABRT' | 'ALRM' | 'TERM')
- session_sigs="${session_sigs} ${i}"
- trap "session_handle_sig ${i}" ${i}
- ;;
- esac
- done
-}
-
-session_handle_sig()
-{
- local sig="${1}"
-
- session_end
-
- if [ "x${exit_status:+set}" = 'xset' ]; then
- exit ${exit_status}
- else
- exit $((128 + $sig))
- fi
-}