diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/archplat.sh | 144 | ||||
-rw-r--r-- | lib/block.sh | 86 | ||||
-rw-r--r-- | lib/cmd.sh | 122 | ||||
-rw-r--r-- | lib/control.sh | 147 | ||||
-rw-r--r-- | lib/deps.sh | 156 | ||||
-rw-r--r-- | lib/dir.sh | 56 | ||||
-rw-r--r-- | lib/fd.sh | 92 | ||||
-rw-r--r-- | lib/feed.sh | 137 | ||||
-rw-r--r-- | lib/getopt.sh | 52 | ||||
-rw-r--r-- | lib/install.sh | 266 | ||||
-rw-r--r-- | lib/local.mk | 23 | ||||
-rw-r--r-- | lib/locale.sh | 84 | ||||
-rw-r--r-- | lib/mutex.sh | 54 | ||||
-rw-r--r-- | lib/opkg.sh | 29 | ||||
-rw-r--r-- | lib/output.sh | 56 | ||||
-rw-r--r-- | lib/package.sh | 62 | ||||
-rw-r--r-- | lib/pkg.sh | 51 | ||||
-rw-r--r-- | lib/profile.sh | 165 | ||||
-rw-r--r-- | lib/rand.sh | 42 | ||||
-rw-r--r-- | lib/session.sh | 210 | ||||
-rw-r--r-- | lib/substvars.sh | 103 | ||||
-rw-r--r-- | lib/vardata.sh | 52 |
22 files changed, 0 insertions, 2189 deletions
diff --git a/lib/archplat.sh b/lib/archplat.sh deleted file mode 100644 index b8324a0..0000000 --- a/lib/archplat.sh +++ /dev/null @@ -1,144 +0,0 @@ -# Functions for matching architectures and platforms -# -# Copyright (C) 2012 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/>. - -match_arch() -{ - local arch="${1}" - local arch_field="${2}" - local a= - local a_ere= - - for a in ${arch_field}; do - - # "all" == "all" - if [ "${arch}" = 'all' ]; then - if [ "${a}" = 'all' ]; then - return 0 - else - continue - fi - fi - - # "foo-bar-baz" == "any" - if [ "${a}" = 'any' ]; then - return 0 - fi - - # Generate an ERE to match hyphenated architectures. - a_ere="$(printf '%s\n' "${a}" | sed \ - 's/^any-/[^-]+-/;s/-any-/-[^-]+-/g;s/-any$/-[^-]+/g')" - - # "foo-bar-baz" == "foo-any-any" - if echo "${arch}" | grep -E "${a_ere}" >/dev/null 2>&1; then - return 0 - fi - - done - - # Nothing matched. - return 1 -} - -match_plat() -{ - local plat="${1}" - local plat_field="${2}" - local p= - - for p in ${plat_field}; do - if [ "x${plat}" = 'xall' ]; then - if [ "x${p}" = 'xall' ]; then - return 0 - else - continue - fi - fi - if [ "x${p}" = 'xany' ]; then - return 0 - fi - if [ "x${p}" = "x${plat}" ]; then - return 0 - fi - done - - return 1 -} - -arch_is_concerned() -{ - local host_arch="${1}" - local arches="${2}" - local arch= - local not_arch= - local seen_arch= - - if [ "x${arches}" = 'x' ]; then - return 0 - else - seen_arch=1 - for arch in ${arches}; do - not_arch="${arch#!}" - if [ "x${not_arch}" != "x${arch}" ]; then - if match_arch "${host_arch}" "${not_arch}" - then - seen_arch=1 - break - elif [ "x${host_arch}" != 'xall' ]; then - seen_arch=0 - fi - elif match_arch "${host_arch}" "${arch}"; then - seen_arch=0 - break - fi - done - return ${seen_arch} - fi -} - -plat_is_concerned() -{ - local host_plat="${1}" - local plats="${2}" - local plat= - local not_plat= - local seen_plat= - - if [ "x${plats}" = 'x' ]; then - return 0 - else - seen_plat=1 - for plat in ${plats}; do - not_plat="${plat#!}" - if [ "x${not_plat}" != "x${plat}" ]; then - if match_plat "${host_plat}" "${not_plat}" - then - seen_plat=1 - break - elif [ "x${host_plat}" != 'xall' ]; then - seen_plat=0 - fi - elif match_plat "${host_plat}" "${plat}"; then - seen_plat=0 - break - fi - done - return ${seen_plat} - fi -} diff --git a/lib/block.sh b/lib/block.sh deleted file mode 100644 index f056305..0000000 --- a/lib/block.sh +++ /dev/null @@ -1,86 +0,0 @@ -# Functions for mounting and unmounting block devices -# -# Copyright (C) 2015 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/>. - -is_block() -{ - local dev="${1}" - - [ -b "${dev}" ] - return ${?} -} - -check_block() -{ - local dev="${1}" - - if ! [ -b "${dev}" ]; then - error 2 "$(get_msg 'block_device_invalid')" "${dev}" - fi -} - -block_mount() -{ - local dev="${1}" - local dir= - - check_block "${dev}" - - rand - dir="$(get_vardata_dir 'mount')/block-$(printf '%010d' ${rand_x})" - if ! mkdir "${dir}"; then - error 2 "$(get_msg 'block_mkdir_fail')" "${dir}" - fi - - if ! mount "${dev}" "${dir}"; then - rmdir "${dir}" - error 2 "$(get_msg 'block_mount_fail')" "${dev}" - fi - - printf '%s' "${dir}" - return 0 -} - -block_umount() -{ - local dir="${1}" - local i= - local timed_out= - - i=0 - timed_out=false - while ! umount "${dir}"; do - i=$(($i + 1)) - if [ ${i} -eq 10 ]; then - timed_out=true - break - fi - sleep 1 - done - - if ${timed_out}; then - error 2 "$(get_msg 'block_umount_fail')" "${dir}" - fi - - if ! rmdir "${dir}"; then - error 2 "$(get_msg 'block_rmdir_fail')" "${dir}" - fi - - return 0 -} diff --git a/lib/cmd.sh b/lib/cmd.sh deleted file mode 100644 index d4e7824..0000000 --- a/lib/cmd.sh +++ /dev/null @@ -1,122 +0,0 @@ -# Command-related functions -# -# Copyright (C) 2013 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/>. - -cmds=' ' -running_cmd= -running_cmd_clean= - -register_cmd() -{ - local cmd="${1}" - shift 1 - - cmds="${cmds}${cmd} " - return 0 -} - -print_opt_summaries() -{ - local padding= - local opt= - local opt_out= - local summary= - - padding="$(printf '%24s' '')" - for opt in $(printf '%s' "${OPTSTRING}" | sed 's/\([a-zA-Z0-9]\)/ \1/g') - do - if [ ${#opt} -eq 1 ]; then - # No argument expected. - opt_out="-${opt}" - else - # Argument expected. - opt="${opt%?}" - opt_out="-${opt} $(get_msg "opt_${opt}_arg")" - fi - if [ ${#opt_out} -gt 20 ]; then - printf ' %s\n%24s' "${opt_out}" '' - else - printf ' %-20s ' "${opt_out}" - fi - summary="$(get_msg "opt_${opt}_summary")" - printf '%s\n' "${summary}" | fold -s -w 56 | \ - sed "2,\$s/^/${padding}/;" - done -} - -print_cmd_summaries() -{ - local padding= - local cmd= - local cmd_clean= - local summary= - - padding="$(printf '%24s' '')" - for cmd in ${cmds}; do - if [ ${#cmd} -gt 20 ]; then - printf ' %s\n%24s' "${cmd}" '' - else - printf ' %-20s ' "${cmd}" - fi - cmd_clean="$(printf '%s' "${cmd}" | \ - tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" - summary="$(get_msg "cmd_${cmd_clean}_summary")" - printf '%s\n' "${summary}" | fold -s -w 56 | \ - sed "2,\$s/^/${padding}/;" - done -} - -print_cmd_usage() -{ - local cmd="${1}" - local cmd_clean= - local usage= - - cmd_clean="$(printf '%s' "${cmd}" | \ - tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" - usage="$(get_msg "cmd_${cmd_clean}_usage")" - - printf "$(get_msg 'cmd_usage')\n" "${0}" "${cmd}" "${usage}" -} - -is_cmd() -{ - local cmd="${1}" - - [ "x$(printf '%s\n' ${cmds} | grep "^${cmd}$")" = "x${cmd}" ] -} - -run_cmd() -{ - local cmd="${1}" - local cmd_clean= - shift - - cmd_clean="$(printf '%s' "${cmd}" | \ - tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" - if is_cmd "${cmd}"; then - running_cmd="${cmd}" - running_cmd_clean="${cmd_clean}" - "cmd_${cmd_clean}_main" "${@}" - running_cmd='' - running_cmd_clean='' - else - error 1 "$(get_msg 'cmd_not_found')" "${cmd}" - fi -} diff --git a/lib/control.sh b/lib/control.sh deleted file mode 100644 index b25d00b..0000000 --- a/lib/control.sh +++ /dev/null @@ -1,147 +0,0 @@ -# Functions for parsing control files. -# -# Copyright (C) 2012, 2013 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/>. - -control_file= -control_line_nr= - -parse_control() -{ - local field_cb="${2}" - local paragraph_cb="${3}" - local req_fields="${4}" - local in_paragraph= - local line= - local para_req_fields= - local got_fields= - local name= - local value= - - control_file="${1}" - control_line_nr=0 - - in_paragraph='false' - - while IFS='' read -r line; do - control_line_nr=$(($control_line_nr + 1)) - if [ "x$(echo ${line})" = 'x' ]; then - # Paragraph end. - if ${in_paragraph}; then - # The first line is blank to consolidate - # initialization code (see heredocument below). - in_paragraph='false' - if [ "x${name}" != 'x' ]; then - if ! "${field_cb}" "${name}" "${value}" - then - return 0 - fi - fi - if ! "${paragraph_cb}"; then - return 0 - fi - if [ "x${para_req_fields}" != 'x' ]; then - para_req_fields="$(printf "%s$(get_msg \ - 'list_item_separator')" \ - ${para_req_fields})" - parse_control_error \ - 'control_missing_fields' \ - "${para_req_fields}" - fi - fi - para_req_fields="$(printf '%s\n' ${req_fields})" - got_fields="${LF}" - name='' - value='' - elif [ "x${line#\#}" != "x${line}" ]; then - # Comment. - in_paragraph='true' - elif [ "x${line# }" = "x${line}" ]; then - # "Name: Value" line. - in_paragraph='true' - if [ "x${name}" != 'x' ]; then - if ! "${field_cb}" "${name}" "${value}"; then - return 0 - fi - fi - name="${line%%:*}" - value="${line#*:}" - value="${value# }" - if [ "x${name}" = 'x' -o "x${name}" = "x${line}" ]; then - parse_control_error 'control_bad_nv' - continue - fi - if [ "x${para_req_fields}" != 'x' ]; then - # Remove field from list of required fields. - para_req_fields="$(printf '%s' "${para_req_fields}" | \ - grep -Fv "${name}")" - fi - if [ "x${got_fields%${LF}${name}${LF}*}" != \ - "x${got_fields}" ]; then - # Duplicate field. - parse_control_error 'control_duplicate_field' \ - "${name}" - else - got_fields="${got_fields}${name}${LF}" - fi - else - # Continuation line. - in_paragraph='true' - if [ "x${name}" = 'x' ]; then - # Expecting a "Name: Value" line. - parse_control_error 'control_found_continuation' - continue - fi - value="${value}${LF}${line# }" - fi - done <<-EOF - - $(cat "${control_file}") - - EOF - # The first blank line above triggers the paragraph end code to - # consolidate initialization code. - # The second blank line above is needed because the command substitution - # removes any trailing newlines. - - if [ "x${name}" != 'x' ]; then - if ! "${field_cb}" "${name}" "${value}"; then - return 0 - fi - fi - - return 0 -} - -parse_control_error() -{ - local msgid="${1}" - local file_info= - shift 1 - - if [ ${control_line_nr} -eq 0 ]; then - file_info="$(printf '%20s:' "${control_file}")" - else - file_info="$(printf '%20s(l%d):' "${control_file}" \ - "${control_line_nr}")" - fi - - warn "${file_info} $(get_msg "${msgid}")" "${@}" - - return 0 -} diff --git a/lib/deps.sh b/lib/deps.sh deleted file mode 100644 index 862caff..0000000 --- a/lib/deps.sh +++ /dev/null @@ -1,156 +0,0 @@ -# Functions for parsing dependency field values -# -# Copyright (C) 2012, 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/>. - -parse_dep() -{ - local dep="${1}" - local host_arch="${2}" - local host_plat="${3}" - local pkgarchqual= - local pkg= - local archqual= - local relver= - local rel= - local ver= - local arches= - local plats= - - dep="$(printf '%s\n' "${dep}" | sed -n ' - H; # Store each input line in hold space. - ${ # On the last line: - g; # Restore everything to pattern space. - s/[\t\n]/ /g; # Replace tabs & newlines with spaces. - s/ *\([(\[<]\) */ \1/g; # One space before "(", "[", and "<". - s/ *\([)\]>]\) */\1 /g; # One space after "(", "[", and "<". - s/ *\(<[<=]\) */\1 /g; # One space after "<<" and "<=". - s/ *\(>[>=]\) */\1 /g; # One space after ">>" and ">=". - s/ *\(=\) */\1 /g; # One space after "=". - s/^ *//; # Remove leading spaces. - s/ *$//; # Remove trailing spaces. - s/ */ /g; # Remove duplicate spaces. - p; # Print the pattern space. - }; # End. - ')" - - # dep is now of the form: - # pkg[:archqual] [(rel ver)] [\[arches\]] [<plats>] - - pkgarchqual="${dep%% *}" - dep=" ${dep#* }" - pkg="${pkgarchqual%:*}" - if [ "x${pkg}" != "x${pkgarchqual}" ]; then - archqual="${pkgarchqual##*:}" - fi - - if [ "x${dep# (*)}" != "x${dep}" ]; then - relver="${dep# (}" - relver="${relver%%)*}" - dep="${dep# (*)}" - rel="${relver% *}" - ver="${relver##* }" - fi - - if [ "x${dep# \[*\]}" != "x${dep}" ]; then - arches="${dep# \[}" - arches="${arches%%\]*}" - dep="${dep# \[*\]}" - fi - - if [ "x${dep# <*>}" != "x${dep}" ]; then - plats="${dep# <}" - plats="${plats%%>*}" - dep="${dep# <*>}" - fi - - if [ "x${host_arch}" != 'x' ] && ! arch_is_concerned \ - "${host_arch}" "${arches}"; then - return 0 - fi - if [ "x${host_plat}" != 'x' ] && ! plat_is_concerned \ - "${host_plat}" "${plats}"; then - return 0 - fi - - printf '%s' "${pkg}" - [ "x${archqual}" != 'x' ] && printf ':%s' "${archqual}" - [ "x${ver}" != 'x' ] && printf ' (%s %s)' "${rel}" "${ver}" - [ "x${host_arch}" = 'x' ] && [ "x${arches}" != 'x' ] && \ - printf ' [%s]' "${arches}" - [ "x${host_plat}" = 'x' ] && [ "x${plats}" != 'x' ] && \ - printf ' <%s>' "${plats}" - printf '\n' - - return 0 -} - -reduce_deps() -{ - local deps="${1}" - local union="${2}" - local host_arch="${3}" - local host_plat="${4}" - local dep_and= - local dep_or= - local dep_list= - local dep_or_list= - local dep= - - dep_list='' - IFS=',' - for dep_and in ${deps}; do - unset IFS - if ! ${union}; then - dep_or_list='' - IFS='|' - for dep_or in ${dep_and}; do - unset IFS - dep="$(parse_dep "${dep_or}" \ - "${host_arch}" "${host_plat}")" - if [ "x${dep}" != 'x' ]; then - if [ "x${dep_or_list}" != 'x' ]; then - dep_or_list="${dep_or_list} | " - fi - dep_or_list="${dep_or_list}${dep}" - fi - done - unset IFS - if [ "x${dep_or_list}" != 'x' ]; then - if [ "x${dep_list}" != 'x' ]; then - dep_list="${dep_list}, " - fi - dep_list="${dep_list}${dep_or_list}" - fi - else - dep="$(parse_dep "${dep_and}" \ - "${host_arch}" "${host_plat}")" - if [ "x${dep}" != 'x' ]; then - if [ "x${dep_list}" != 'x' ]; then - dep_list="${dep_list}, " - fi - dep_list="${dep_list}${dep}" - fi - fi - done - unset IFS - - printf '%s\n' "${dep_list}" - - return 0 -} diff --git a/lib/dir.sh b/lib/dir.sh deleted file mode 100644 index 338d8fe..0000000 --- a/lib/dir.sh +++ /dev/null @@ -1,56 +0,0 @@ -# Miscellaneous directory-related functions -# -# Copyright (C) 2013 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/>. - -dir_is_empty() -{ - local dir="${1}" - local ret= - local dirent= - local exclude= - local exclusion= - shift 1 - - ret=0 - - # Patterns to match all dirents except "." and "..": - # * dirents whose names don't start with "." - # .[!.] dirents whose names start with ".", are two characters long, - # and aren't ".." - # .??* dirents whose names start with "." and are three or more - # characters long - for dirent in "${dir}/"* "${dir}/".[!.] "${dir}/".[!.] "${dir}/".??*; do - if ! [ -e "${dirent}" ]; then - continue - fi - exclude=false - for exclusion in "${@}"; do - if [ "x${dirent##*/}" = "x${exclusion}" ]; then - exclude=true - break - fi - done - if ! ${exclude}; then - ret=1 - break - fi - done - - return ${ret} -} diff --git a/lib/fd.sh b/lib/fd.sh deleted file mode 100644 index 0d5a50e..0000000 --- a/lib/fd.sh +++ /dev/null @@ -1,92 +0,0 @@ -# Functions for opening and closing file descriptors -# -# Copyright (C) 2013 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/>. - -_FD_MIN=3 -# Shells and the file descriptors they reserve for the user: -# * Debian Almquist Shell -# - The shell doesn't understand any file descriptor greater than 9. -# - File descriptors starting at 10 are used for I/O redirection. -# * BusyBox ash -# - File descriptors starting at 10 are used for job control and I/O -# redirection. -# * GNU Bash: -# - GNU Readline uses file descriptor 255 in interactive shells. -# - File descriptors starting at 10 are used for I/O redirection. -# * MirOS Korn Shell -# - File descriptors starting at either 10 or 24 are used for the shell's -# tty_fd and shl_dbg_fd. -# * Solaris ksh -# - The shell doesn't understand any file descriptor greater than 9. -_FD_MAX=9 - -FD= - -fopen() -{ - local path="${1}" - local mode="${2}" - local i= - local fd= - - case "${mode}" in - 'r') mode='<' ;; - 'w') mode='>' ;; - 'a') mode='>>';; - 'rw') mode='<>';; - *) return 125;; - esac - - # Find first available file descriptor. - i=${_FD_MIN} - while [ ${i} -le ${_FD_MAX} ]; do - if [ "x$(eval echo "\${_fd_${i}+set}")" != 'xset' ]; then - fd=${i} - break - fi - i=$(($i + 1)) - done - if [ "x${fd:+set}" != 'xset' ]; then - error 2 "$(get_msg 'emfile')" - return - fi - - if eval "exec ${fd}${mode}'${path}'"; then - eval "_fd_${fd}='${mode}${path}'" - FD="${fd}" - return 0 - else - error 2 "$(get_msg 'cant_fopen')" - fi -} - -fclose() -{ - local fd="${1}" - - # Make sure the file descriptor is open. - if [ "x$(eval echo "\${_fd_${fd}+set}")" != 'xset' ]; then - error 2 "$(get_msg 'ebadf')" - fi - - eval "exec ${fd}>&-" - unset "_fd_${fd}" - - return 0 -} diff --git a/lib/feed.sh b/lib/feed.sh deleted file mode 100644 index 4288c2a..0000000 --- a/lib/feed.sh +++ /dev/null @@ -1,137 +0,0 @@ -# Functions for handling feed index files -# -# Copyright (C) 2013, 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/>. - -feed_dep_fields= -feed_pkg_cb= -feed_deps_cb= -feed_fname_cb= -feed_md5sum_cb= -feed_sha256sum_cb= -feed_pkgs= -feed_pkg_include= -feed_pkg= -feed_deps= - -feed_download() -{ - local feed_index="${1}" - local use_gzip="${2}" - local gzip= - - if ${use_gzip}; then - gzip=gunzip - else - gzip=cat - fi - - wget -q -O - "${feed_index}" | ${gzip} - - return 0 -} - -feed_find_pkgs() -{ - local feed_idx="${1}" - local dep_fields="${2}" - local pkg_cb="${3}" - local deps_cb="${4}" - local fname_cb="${5}" - local md5sum_cb="${6}" - local sha256sum_cb="${7}" - - feed_dep_fields=" $(printf '%s ' ${dep_fields} | tr 'A-Z' 'a-z')" - feed_pkg_cb="${pkg_cb}" - feed_deps_cb="${deps_cb}" - feed_fname_cb="${fname_cb}" - feed_md5sum_cb="${md5sum_cb}" - feed_sha256sum_cb="${sha256sum_cb}" - - feed_pkgs='' - feed_pkg_include='false' - feed_pkg='' - feed_deps='' - - parse_control "${feed_idx}" feed_field_cb feed_para_cb 'Package' - - printf '%s\n' "${feed_pkgs# }" - - return 0 -} - -feed_field_cb() -{ - local name="${1}" - local value="${2}" - - name="$(printf '%s\n' "${name}" | tr 'A-Z' 'a-z')" - - if [ "x${name}" = 'xpackage' ]; then - feed_pkg="${value}" - elif [ "x${name}" = 'xfilename' ]; then - ${feed_fname_cb} "${feed_pkg}" "${value}" - elif [ "x${name}" = 'xmd5sum' ]; then - ${feed_md5sum_cb} "${feed_pkg}" "${value}" - elif [ "x${name}" = 'xsha256sum' ]; then - ${feed_sha256sum_cb} "${feed_pkg}" "${value}" - elif [ "x${feed_dep_fields#* ${name} }" != "x${feed_dep_fields}" ]; then - feed_deps="${feed_deps}${value}, " - fi - - if ${feed_pkg_cb} ${name} ${value}; then - feed_pkg_include='true' - fi - - return 0 -} - -feed_para_cb() -{ - local new_deps= - local dep= - - if ${feed_pkg_include}; then - feed_pkgs="${feed_pkgs} ${feed_pkg}" - fi - - new_deps='' - IFS=',' - for dep in ${feed_deps%, }; do - unset IFS - # Trim off versions and disjunctions. - dep="${dep%%(*}" - dep="${dep%%|*}" - # Trim whitespace. - dep="$(printf '%s\n' "${dep}" | sed 's/^ *//; s/ *$//')" - # In practice, this would suffice for control files generated by - # opkbuild: - # dep="${dep#[ ${HT}${LF}]}" - # dep="${dep%[ ${HT}${LF}]}" - new_deps="${new_deps} ${dep}" - done - unset IFS - - ${feed_deps_cb} "${feed_pkg}" "${new_deps# }" - - feed_pkg_include='false' - feed_pkg='' - feed_deps='' - - return 0 -} diff --git a/lib/getopt.sh b/lib/getopt.sh deleted file mode 100644 index 07769e7..0000000 --- a/lib/getopt.sh +++ /dev/null @@ -1,52 +0,0 @@ -# Functions for parsing command-line options -# -# Copyright (C) 2013 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/>. - -get_options() -{ - local optstring= - local prefix= - local opt= - - if [ "x${running_cmd_clean}" = 'x' ]; then - optstring="${OPTSTRING}" - prefix='opt_' - else - eval "optstring=\"\${cmd_${running_cmd_clean}_optstring}\"" - prefix="cmd_${running_cmd_clean}_opt_" - fi - - unset OPTARG - while getopts "${optstring}" opt; do - if [ "x${opt}" = 'x?' ]; then - return 1 - fi - case "${optstring}" in - *"${opt}:"*) - eval "${prefix}${opt}=\"\${OPTARG}\"" - ;; - *) - eval "${prefix}${opt}=true" - ;; - esac - unset OPTARG - done - - return 0 -} diff --git a/lib/install.sh b/lib/install.sh deleted file mode 100644 index e1e93df..0000000 --- a/lib/install.sh +++ /dev/null @@ -1,266 +0,0 @@ -# Functions for installing systems -# -# Copyright (C) 2013, 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/>. - -install_deps= -install_fnames= -install_md5sums= -install_sha256sums= -install_feed_url= - -install_system() -{ - local mirror="${1}" - local suite="${2}" - local arch="${3}" - local plat="${4}" - local chroot="${5}" - local foreign="${6}" - - if [ "x${arch}" = 'x' ]; then - arch="$(profile_detect_arch)" - fi - if [ "x${plat}" = 'x' ]; then - plat="$(profile_default_plat)" - fi - if [ "x${mirror}" = 'x' ]; then - mirror="$(profile_select_mirror)" - fi - - if ! profile_validate_archplat "${mirror}" "${arch}" "${plat}" \ - "${suite}"; then - error 2 "$(get_msg 'install_bad_archplat')" \ - "${arch}" "${plat}" - fi - - info "$(get_msg 'install_selected_arch')" "${arch}" - info "$(get_msg 'install_selected_plat')" "${plat}" - info "$(get_msg 'install_selected_mirror')" "${mirror}" - - info "$(get_msg 'install_setting_up_chroot')" - if [ -d "${chroot}" ] && ! dir_is_empty "${chroot}" 'lost+found'; then - error 2 "$(get_msg 'install_chroot_dir_exists')" "${chroot}" - fi - if ! mkdir -p "${chroot}/.prokit" "${chroot}/prokit"; then - error 2 "$(get_msg 'install_mkdir_chroot_fail')" "${chroot}" - fi - >"${chroot}/prokit/installing" - - info "$(get_msg 'install_find_pkgs')" - install_find_pkgs "${mirror}" "${suite}" "${arch}" "${plat}" \ - "${chroot}" - install_get_pkgs "${chroot}" - - info "$(get_msg 'install_configuring')" - if ! ${foreign}; then - profile_configure_system_native "${chroot}" "${arch}" "${plat}" - else - profile_configure_system_foreign "${chroot}" "${arch}" "${plat}" - fi - - rm "${chroot}/prokit/installing" -} - -install_find_pkgs() -{ - local mirror="${1}" - local suite="${2}" - local arch="${3}" - local plat="${4}" - local chroot="${5}" - local opkg_conf_fd= - local pkgs_fd= - local opt= - local feed_idx= - local feed= - local gzip= - local pkgs= - - mkdir -p "${chroot}/etc/opkg" "${chroot}/var/lib/opkg/lists" - fopen "${chroot}/etc/opkg/opkg.conf" 'w' - opkg_conf_fd=${FD} - - install_deps= - install_fnames= - install_md5sums= - install_sha256sums= - - fopen "${chroot}/.prokit/packages" 'w' - pkgs_fd=${FD} - - while read -r opt feed_idx feed; do - case "${opt}" in - 'src') gzip=false;; - 'src/gz') gzip=true;; - *) continue;; - esac - printf '%s %s %s\n' "${opt}" "${feed_idx}" \ - "${feed%/Packages*}" >&${opkg_conf_fd} - feed_download "${feed}" ${gzip} \ - >"${chroot}/var/lib/opkg/lists/${feed_idx}" - install_feed_url="${feed%/*}" - feed_find_pkgs "${chroot}/var/lib/opkg/lists/${feed_idx}" \ - "$(profile_dep_fields)" profile_include_pkg \ - install_deps_cb install_fname_cb \ - install_md5sum_cb install_sha256sum_cb \ - >&${pkgs_fd} - done <<-EOF - $(profile_feeds "${mirror}" "${arch}" "${plat}" "${suite}") - EOF - - printf '\ndest root /\n' >&${opkg_conf_fd} - printf 'arch %s 1\n' 'all' "${arch}" 'src' >&${opkg_conf_fd} - fclose ${opkg_conf_fd} - fclose ${pkgs_fd} - - pkgs="$(resolve_deps "$(cat "${chroot}/.prokit/packages")" \ - "${install_deps}" | xargs printf '%s\n' | sort -u)" - printf '%s\n' "${pkgs}" >"${chroot}/.prokit/packages" -} - -install_deps_cb() -{ - local pkg="${1}" - local deps="${2}" - - install_deps="${install_deps}${pkg}: ${deps}${LF}" -} - -install_fname_cb() -{ - local pkg="${1}" - local fname="${2}" - - install_fnames="$(printf '%s\n%s %s/%s' "${install_fnames}" \ - "${pkg}" "${install_feed_url}" "${fname}")" -} - -install_md5sum_cb() -{ - local pkg="${1}" - local md5sum="${2}" - - install_md5sums="$(printf '%s\n%s %s' "${install_md5sums}" \ - "${pkg}" "${md5sum}")" -} - -install_sha256sum_cb() -{ - local pkg="${1}" - local sha256sum="${2}" - - install_sha256sums="$(printf '%s\n%s %s' \ - "${install_sha256sums}" "${pkg}" "${sha256sum}")" -} - -install_get_pkgs() -{ - local chroot="${1}" - local status_fd= - local pkg= - local fname= - local md5sum= - local sha256sum= - local file= - local control= - local field= - local printed= - - mkdir -p "${chroot}/var/cache/opkg/archives" "${chroot}/tmp/opkg" \ - "${chroot}/var/lib/opkg/info" - - fopen "${chroot}/var/lib/opkg/status" 'w' - status_fd=${FD} - - for pkg in $(cat "${chroot}/.prokit/packages"); do - info "$(get_msg 'install_downloading_pkg')" "${pkg}" - fname="$(printf '%s\n' "${install_fnames}" | \ - sed -n "s/^${pkg} //p")" - md5sum="$(printf '%s\n' "${install_md5sums}" | \ - sed -n "s/^${pkg} //p")" - sha256sum="$(printf '%s\n' "${install_sha256sums}" | \ - sed -n "s/^${pkg} //p")" - wget -q -O "${chroot}/var/cache/opkg/archives/${fname##*/}" \ - "${fname}" || \ - error 2 "$(get_msg 'install_downloading_pkg_fail')" - fname="var/cache/opkg/archives/${fname##*/}" - if [ "x${md5sum}" != 'x' ]; then - printf '%s %s\n' \ - "${md5sum}" "${chroot}/${fname}" | \ - md5sum -c >/dev/null 2>&1 || \ - error 2 "$(get_msg 'install_checksum_fail')" - fi - if [ "x${sha256sum}" != 'x' ]; then - printf '%s %s\n' \ - "${sha256sum}" "${chroot}/${fname}" | \ - sha256sum -c >/dev/null 2>&1 || \ - error 2 "$(get_msg 'install_checksum_fail')" - fi - - info "$(get_msg 'install_unpacking_pkg')" "${pkg}" - mkdir "${chroot}/tmp/opkg/${pkg}" - ( - cd "${chroot}" - tar -xzOf "${fname}" data.tar.gz \ - >"tmp/opkg/${pkg}/data.tar.gz" - tar -xzf "tmp/opkg/${pkg}/data.tar.gz" - cd "tmp/opkg/${pkg}" - tar -xzOf "../../../${fname}" control.tar.gz | \ - tar -xz - ) - tar -tzf "${chroot}/tmp/opkg/${pkg}/data.tar.gz" | \ - sed 's/^\.//' >"${chroot}/var/lib/opkg/info/${pkg}.list" - rm -f "${chroot}/tmp/opkg/${pkg}/data.tar.gz" - for file in "${chroot}/tmp/opkg/${pkg}/"*; do - mv "${file}" \ - "${chroot}/var/lib/opkg/info/${pkg}.${file##*/}" - done - rmdir "${chroot}/tmp/opkg/${pkg}" - - # Write status file. - control="${chroot}/var/lib/opkg/info/${pkg}.control" - for field in Package Version Depends Recommends Suggests \ - Provides Replaces Conflicts; do - grep "^${field}: " "${control}" >&${status_fd} - done - printf 'Status: install ok unpacked\n' >&${status_fd} - for field in Essential Architecture; do - grep "^${field}: " "${control}" >&${status_fd} - done - if [ -r "${chroot}/var/lib/opkg/info/${pkg}.conffiles" ]; then - printed=false - while read -r file; do - ${printed} || printf 'Conffiles:\n' \ - >&${status_fd} - printf ' %s %s\n' "${file}" "$(md5sum \ - "${chroot}/${file}" | cut -d' ' -f1)" \ - >&${status_fd} - printed=true - done <"${chroot}/var/lib/opkg/info/${pkg}.conffiles" - fi - printf 'Installed-Time: %s\n\n' "$(date '+%s')" >&${status_fd} - - rm -f "${chroot}/${fname}" - done - - rm "${chroot}/.prokit/packages" - rmdir "${chroot}/.prokit" - - fclose ${status_fd} -} diff --git a/lib/local.mk b/lib/local.mk index 7370a5d..9cf3de7 100644 --- a/lib/local.mk +++ b/lib/local.mk @@ -1,26 +1,3 @@ -prokit_SOURCES += \ - lib/output.sh \ - lib/locale.sh \ - lib/getopt.sh \ - lib/fd.sh \ - lib/dir.sh \ - lib/vardata.sh \ - lib/archplat.sh \ - lib/deps.sh \ - lib/substvars.sh \ - lib/control.sh \ - lib/feed.sh \ - lib/pkg.sh \ - lib/mutex.sh \ - lib/session.sh \ - lib/block.sh \ - lib/opkg.sh \ - lib/rand.sh \ - lib/cmd.sh \ - lib/profile.sh \ - lib/package.sh \ - lib/install.sh - include $(top_srcdir)/lib/cmd/local.mk include $(top_srcdir)/lib/profile/local.mk include $(top_srcdir)/lib/package/local.mk diff --git a/lib/locale.sh b/lib/locale.sh deleted file mode 100644 index 76d2d9b..0000000 --- a/lib/locale.sh +++ /dev/null @@ -1,84 +0,0 @@ -# Locale functions -# -# Copyright (C) 2012, 2013 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/>. - -DEFAULT_LOCALE='en_US' - -load_locale() -{ - local localedir= - - # Make sure LC_MESSAGES is set. - if [ "x${LC_MESSAGES+set}" != 'xset' ]; then - if [ "x${LC_ALL+set}" = 'xset' ]; then - LC_MESSAGES="${LC_ALL}" - elif [ "x${LANG+set}" = 'xset' ]; then - LC_MESSAGES="${LANG}" - else - LC_MESSAGES="${DEFAULT_LOCALE}" - fi - fi - - if ${in_place}; then - localedir="${builddir}/locale" - else - localedir="${LOCALEDIR}" - fi - - # Try to load the locale. - if ! _try_load_locale "${localedir}" \ - "${LC_MESSAGES%.*}"; then - if ! _try_load_locale "${localedir}" \ - "${LC_MESSAGES%_*}"; then - if ! _try_load_locale "${localedir}" \ - "${DEFAULT_LOCALE}"; then - warn 'Cannot load locale' - return 1 - fi - fi - fi - - return 0 -} - -get_msg() -{ - local msgid="${1}" - - eval "printf '%s' \"\${msg_${TEXTDOMAIN}_${msgid}}\"" - - return 0 -} - -_try_load_locale() -{ - local localedir="${1}" - local locale="${2}" - local ms= - - for ms in "${localedir}/${locale}/LC_MESSAGES/${TEXTDOMAIN}.ms" \ - "${localedir}/${locale}.ms"; do - if [ -f "${ms}" ]; then - . "${ms}" - return 0 - fi - done - - return 1 -} diff --git a/lib/mutex.sh b/lib/mutex.sh deleted file mode 100644 index cd4a365..0000000 --- a/lib/mutex.sh +++ /dev/null @@ -1,54 +0,0 @@ -# Functions for locking and unlocking mutex objects -# -# 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/>. - -mutex_trylock() -{ - local mutex="${1}" - - (set -C; printf '%d\n' "${$}" >"${mutex}") 2>/dev/null -} - -mutex_timedlock() -{ - local mutex="${1}" - local timeout="${2}" - - while ! mutex_trylock "${mutex}"; do - [ ${timeout} -eq 0 ] && return 1 - timeout=$(($timeout - 1)) - sleep 1 - done - - return 0 -} - -mutex_unlock() -{ - local mutex="${1}" - - rm "${mutex}" -} - -mutex_is_unlockable() -{ - local mutex="${1}" - - [ "x$(cat "${mutex}" 2>/dev/null)" = "x${$}" ] -} diff --git a/lib/opkg.sh b/lib/opkg.sh deleted file mode 100644 index 9e5c3c4..0000000 --- a/lib/opkg.sh +++ /dev/null @@ -1,29 +0,0 @@ -# Functions for running the package manager -# -# 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/>. - -opkg_install_all() -{ - local root="${1}" - - session_begin "${root}" . : true - session_exec /bin/sh -c \ - 'opkg install $(opkg list-installed | cut -d " " -f 1)' - session_end -} diff --git a/lib/output.sh b/lib/output.sh deleted file mode 100644 index 62d2095..0000000 --- a/lib/output.sh +++ /dev/null @@ -1,56 +0,0 @@ -# Functions for printing messages -# -# Copyright (C) 2013 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/>. - -error() -{ - local status=${1} - local fmt="${2}" - shift 2 - - printf '%s: Error: ' "${0##*/}" >&2 - printf "${fmt}\n" "${@}" >&2 - - # In a subshell, this will have no effect, so the shell's exit status - # will be 128+SIGINT. Meh. - exit_status=${status} - kill -s INT ${$} -} - -warn() -{ - local fmt="${1}" - shift 1 - - printf '%s: Warning: ' "${0##*/}" >&2 - printf "${fmt}\n" "${@}" >&2 - - return 0 -} - -info() -{ - local fmt="${1}" - shift 1 - - printf '%s: ' "${0##*/}" >&2 - printf "${fmt}\n" "${@}" >&2 - - return 0 -} diff --git a/lib/package.sh b/lib/package.sh deleted file mode 100644 index 3175202..0000000 --- a/lib/package.sh +++ /dev/null @@ -1,62 +0,0 @@ -# Interface for handling source package metadata -# -# 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/>. - -package_dir= -package_format= - -package_init() -{ - local dir="${1}" - - package_dir="${dir}" - - package_format='' - if [ -r "${package_dir}/format" ]; then - case "$(cat "${package_dir}/format")" in - 2.*) - package_format=2 - ;; - esac - fi - - if [ "x${package_format}" = 'x' ]; then - error 2 "$(get_msg 'package_format_unknown')" - fi - - use "package/${package_format}" - - return 0 -} - -package_get_build_deps() -{ - local arch="${1}" - local plat="${2}" - - "package_${package_format}_get_build_deps" "${arch}" "${plat}" -} - -package_set_substvars() -{ - local arch="${1}" - local plat="${2}" - - "package_${package_format}_set_substvars" "${arch}" "${plat}" -} diff --git a/lib/pkg.sh b/lib/pkg.sh deleted file mode 100644 index ee4aa25..0000000 --- a/lib/pkg.sh +++ /dev/null @@ -1,51 +0,0 @@ -# Functions for handling packages and their dependencies -# -# Copyright (C) 2013, 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/>. - -resolve_deps() -{ - local new_pkgs="${1}" - local deps="${2}" - local all_deps= - local new_deps= - local pkg= - - all_deps='' - new_pkgs="${new_pkgs} " - while [ "x${new_pkgs}" != 'x' ]; do - all_deps="${all_deps}${new_pkgs}" - new_deps='' - for pkg in ${new_pkgs}; do - case "${pkg}" in - *[!a-z0-9+.-]*) continue;; - esac - new_deps="${new_deps} $(printf '%s' "${deps}" | \ - sed -n "s/^${pkg}: *//p")" - done - new_deps="$(printf '%s\n' ${new_deps} | sort -u)" - new_pkgs='' - for pkg in ${new_deps}; do - if [ "x${all_deps# ${pkg} }" = "x${all_deps}" ]; then - new_pkgs="${new_pkgs}${pkg} " - fi - done - done - - printf '%s\n' "${all_deps% }" -} diff --git a/lib/profile.sh b/lib/profile.sh deleted file mode 100644 index f64a0d8..0000000 --- a/lib/profile.sh +++ /dev/null @@ -1,165 +0,0 @@ -# Profile-related functions -# -# 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/>. - -profiles=' ' -profile= - -register_profile() -{ - local profile="${1}" - shift 1 - - profiles="${profiles}${profile} " - return 0 -} - -is_profile() -{ - local prof="${1}" - - [ "x${profiles# ${prof} }" != "x${profiles}" ] -} - -profile_set() -{ - local prof="${1}" - - if is_profile "${prof}"; then - profile="${prof}" - use "profile/${profile}" - else - error 1 "$(get_msg 'profile_not_found')" "${prof}" - fi - - return 0 -} - -profile_normalize_suite() -{ - local suite="${1}" - - "prof_${profile}_normalize_suite" "${suite}" -} - -profile_detect_arch() -{ - "prof_${profile}_detect_arch" -} - -profile_default_plat() -{ - "prof_${profile}_default_plat" -} - -profile_select_mirror() -{ - "prof_${profile}_select_mirror" -} - -profile_validate_archplat() -{ - local mirror="${1}" - local arch="${2}" - local plat="${3}" - local suite="${4}" - - "prof_${profile}_validate_archplat" "${mirror}" "${arch}" "${plat}" \ - "${suite}" -} - -profile_feeds() -{ - local mirror="${1}" - local arch="${2}" - local plat="${3}" - local suite="${4}" - - "prof_${profile}_feeds" "${mirror}" "${arch}" "${plat}" "${suite}" -} - -profile_dep_fields() -{ - "prof_${profile}_dep_fields" -} - -profile_include_pkg() -{ - local name="${1}" - local value="${2}" - - "prof_${profile}_include_pkg" "${name}" "${value}" -} - -profile_get_fstab() -{ - local arch="${1}" - local plat="${2}" - - "prof_${profile}_get_fstab" "${arch}" "${plat}" -} - -profile_file_systems_mounted() -{ - local root="${1}" - local arch="${1}" - local plat="${2}" - - "prof_${profile}_file_systems_mounted" "${root}" "${arch}" "${plat}" -} - -profile_bind_mount() -{ - local arch="${1}" - local plat="${2}" - local olddir="${3}" - local newdir="${4}" - - "prof_${profile}_bind_mount" "${arch}" "${plat}" \ - "${olddir}" "${newdir}" -} - -profile_bind_umount() -{ - local arch="${1}" - local plat="${2}" - local olddir="${3}" - local newdir="${4}" - - "prof_${profile}_bind_umount" "${arch}" "${plat}" \ - "${olddir}" "${newdir}" -} - -profile_configure_system_native() -{ - local root="${1}" - local arch="${2}" - local plat="${3}" - - "prof_${profile}_configure_system_native" "${root}" "${arch}" "${plat}" -} - -profile_configure_system_foreign() -{ - local root="${1}" - local arch="${2}" - local plat="${3}" - - "prof_${profile}_configure_system_foreign" "${root}" "${arch}" "${plat}" -} diff --git a/lib/rand.sh b/lib/rand.sh deleted file mode 100644 index 872d3fb..0000000 --- a/lib/rand.sh +++ /dev/null @@ -1,42 +0,0 @@ -# Linear congruential pseudorandom number generator -# -# 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/>. - -rand_x=1 - -srand() -{ - local x="${1}" - - case "${x}" in - *[!0-9]*) - warn "$(get_msg 'rand_bad_x')" - return 1 - ;; - esac - - rand_x=${x} -} - -rand() -{ - # Increment, multiplier, and modulus values are those used in glibc. - rand_x=$((1103515245 * $rand_x + 12345)) - rand_x=$(($rand_x % 4294967296)) -} 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 -} diff --git a/lib/substvars.sh b/lib/substvars.sh deleted file mode 100644 index c2bc3f8..0000000 --- a/lib/substvars.sh +++ /dev/null @@ -1,103 +0,0 @@ -# Functions for setting and substituting variables -# -# Copyright (C) 2012, 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/>. - -substvars_max_depth=50 - -set_substvar() -{ - local name="${1}" - local value="${2}" - - # Convert variable name to lower case and validate. - name="$(printf '%s\n' "${name}" | tr 'A-Z-' 'a-z_')" - case "${name:- }" in - *[!a-z0-9_]*) - warn "$(get_msg 'substvar_invalid')" "${name}" - return 1 - ;; - esac - - # Trim leading and trailing newline characters from value. - value="$(printf '%s\n' "${value}" | sed -n ' - H; # Store each input line in the hold space. - ${ # At the last line of input: - g; # Restore the hold space into the pattern space. - s/^[\n]*//; # Remove leading newline characters. - s/[\n]*$//; # Remove trailing newline characters. - p; # Print the results. - }; - ')" - - # Escape single quotes in value. - value="$(printf '%s\n' "${value}" | sed "s/'/'\\\\''/g")" - - eval "substvar_${name}='${value}'" - - return 0 -} - -substvars() -{ - local string="${1}" - local depth= - local lhs= - local name= - local rhs= - local old_rhs= - local value= - - # Logic inspired by that of dpkg's Dpkg::Substvars::substvars() - # subroutine. - - depth=0 - - while :; do - lhs="${string%%\$\{*}" - if [ ${#lhs} -eq ${#string} ]; then - # No "${" was found. - break - fi - string="${string#*\$\{}" - name="${string%%\}*}" - rhs="${string#*\}}" - - if [ ${#rhs} -lt ${#old_rhs} ]; then - # Reset the nesting counter if we've advanced the right - # side of the matched space. - depth=0 - fi - if [ ${depth} -ge ${substvars_max_depth} ]; then - # Warn of possible recursion. - warn "$(get_msg 'substvar_deep_nesting')" - return 1 - fi - old_rhs="${rhs}" - - # Perform the substitution. - name="$(printf '%s\n' "${name}" | tr 'A-Z-' 'a-z_')" - value="$(eval "printf '%s\n' \"\${substvar_${name}}\"")" - string="${lhs}${value}${rhs}" - depth=$(($depth + 1)) - done - - printf '%s\n' "${string}" - - return 0 -} diff --git a/lib/vardata.sh b/lib/vardata.sh deleted file mode 100644 index 0c68d67..0000000 --- a/lib/vardata.sh +++ /dev/null @@ -1,52 +0,0 @@ -# Functions for getting variable/runtime data -# -# Copyright (C) 2015 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/>. - -VARDATA_DIRS='mount' - -vardatadir= - -init_vardata() -{ - local dir= - - if ${in_place}; then - vardatadir="${builddir}/var" - for dir in ${VARDATA_DIRS}; do - mkdir -p "${vardatadir}/${dir}" - done - else - vardatadir="${PKGLOCALSTATEDIR}" - fi - - return 0 -} - -get_vardata_dir() -{ - local dir="${1}" - - case " ${VARDATA_DIRS} " in - *" ${dir} "*) - printf '%s/%s' "${vardatadir}" "${dir}" - ;; - esac - - return 0 -} |