=================================================================== RCS file: /cvs/openbsd/fw_update/fw_install.sh,v retrieving revision 1.84 retrieving revision 1.85 diff -u -r1.84 -r1.85 --- openbsd/fw_update/fw_install.sh 2021/12/18 20:40:36 1.84 +++ openbsd/fw_update/fw_install.sh 2021/12/18 22:03:43 1.85 @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: fw_install.sh,v 1.84 2021/12/18 20:40:36 afresh1 Exp $ +# $OpenBSD: fw_install.sh,v 1.85 2021/12/18 22:03:43 afresh1 Exp $ # # Copyright (c) 2021 Andrew Hewus Fresh # @@ -16,6 +16,7 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. set -o errexit -o pipefail -o nounset +set +o monitor export PATH=/usr/bin:/bin:/usr/sbin:/sbin CFILE=SHA256.sig @@ -52,19 +53,48 @@ } fetch() { - local _src="${FWURL}/${1##*/}" _dst=$1 _user=_file _exit + local _src="${FWURL}/${1##*/}" _dst=$1 _user=_file _pid _exit # If we're not in the installer, # we have su(1) and doas(1) is unlikely to be configured. + set -o monitor # make sure ftp gets its own process group + ( if [ -x /usr/bin/su ]; then - /usr/bin/su -s /bin/ksh "$_user" -c \ + exec /usr/bin/su -s /bin/ksh "$_user" -c \ "/usr/bin/ftp -D 'Get/Verify' -Vm -o- '$_src'" > "$_dst" - _exit="$?" else - /usr/bin/doas -u "$_user" \ + exec /usr/bin/doas -u "$_user" \ /usr/bin/ftp -D 'Get/Verify' -Vm -o- "$_src" > "$_dst" - _exit="$?" fi + ) & _pid=$! + set +o monitor + + trap "kill -TERM '-$_pid'; exit 1" EXIT INT QUIT ABRT TERM + + SECONDS=0 + _last=0 + while kill -0 -"$_pid" 2>/dev/null; do + if [[ $SECONDS -gt 12 ]]; then + set -- $( ls -ln "$_dst" 2>/dev/null ) + if [[ $_last -ne $5 ]]; then + _last=$5 + SECONDS=0 + sleep 1 + else + kill -INT -"$_pid" + echo "fetch timed out" >&2 + fi + else + sleep 1 + fi + done + + set +o errexit + wait "$_pid" + _exit=$? + set -o errexit + + trap "" EXIT INT QUIT ABRT TERM if [ "$_exit" -ne 0 ]; then rm -f "$_dst"