diff options
Diffstat (limited to 'src/cmd/opkg.sh')
-rw-r--r-- | src/cmd/opkg.sh | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/cmd/opkg.sh b/src/cmd/opkg.sh new file mode 100644 index 0000000..e1fc8ce --- /dev/null +++ b/src/cmd/opkg.sh @@ -0,0 +1,112 @@ +# "opkg" command +# +# 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/>. + +cmd_opkg_opks= + +cmd_opkg_main() +{ + local root= + local dev= + local first_arg= + local install_cmd= + local arg= + local new_fname= + + if [ ${#} -lt 1 ]; then + print_cmd_usage 'opkg' >&2 + exit 1 + fi + + root="${1}" + shift 1 + + dev='' + if is_block "${root}"; then + dev="${root}" + root="$(block_mount "${dev}")" + fi + + first_arg=true + install_cmd=false + cmd_opkg_opks='' + for arg in "${@}"; do + if ${first_arg}; then + set -- + first_arg=false + fi + if ${install_cmd}; then + case "${arg}" in + *.opk|*.ipk|*.deb) + if ! [ -e "${arg}" ]; then + set -- "${@}" "${arg}" + continue + fi + rand + new_fname="/tmp/prokit.${rand_x}.opk" + cmd_opkg_opks="$(printf '%s %s\n' \ + "${cmd_opkg_opks}" \ + "${root}${new_fname}")" + cp "${arg}" "${root}${new_fname}" + set -- "${@}" "${new_fname}" + ;; + *) + set -- "${@}" "${arg}" + ;; + esac + else + set -- "${@}" "${arg}" + if [ "x${arg}" = 'xinstall' ]; then + install_cmd=true + fi + fi + done + + . "${root}/etc/os-release" + profile_set "${ID}" + + session_begin "${root}" . cmd_opkg_fini false + + session_exec opkg "${@}" + + cmd_opkg_fini + session_end + + if [ "x${dev}" != 'x' ]; then + block_umount "${root}" + fi +} + +cmd_opkg_fini() +{ + case "${cmd_opkg_opks}" in + *[!\ ]*) + rm -f ${cmd_opkg_opks} + # Hack to avoid this code branch if the function is + # called again in response to a signal. + cmd_opkg_opks='' + ;; + esac +} + +cmd_opkg_register() +{ + register_cmd 'opkg' +} +__init cmd_opkg_register |