Date: Wed, 5 Mar 2008 15:55:01 GMT From: Hiroki Sato <hrs@FreeBSD.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: ports/121395: [PATCH] dialog wrapper script for OPTIONS to make it work with an invalid $TERM Message-ID: <200803051555.m25Ft1Rp081350@freefall.freebsd.org> Resent-Message-ID: <200803051600.m25G01BK081414@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 121395 >Category: ports >Synopsis: [PATCH] dialog wrapper script for OPTIONS to make it work with an invalid $TERM >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Mar 05 16:00:01 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Hiroki Sato >Release: FreeBSD 6.3-PRERELEASE i386 >Organization: Tokyo University of Science >Environment: System: FreeBSD alph.allbsd.org 6.3-PRERELEASE FreeBSD 6.3-PRERELEASE #0: Wed Jan 9 01:39:40 JST 2008 hrs@alph.allbsd.org:/usr/obj/usr/src/sys/ALPH i386 >Description: The "make config" should support line-based terminal, and the attached patch implements it. The motivation is as follows. The "config" target invokes $DIALOG when $OPTIONS defined in the port, but it fails or it can make the display screwed up if $TERM envirionment variable is not set properly or the terminal itself is not screen-based like a dumb terminal. While a terminal without screen manipulation capability is uncommon these days, recovering a broken system via serial console access, for example, can trigger this problem. In the current implementation, if dialog(1) cannot open a terminal set by $TERM, it fails and the user cannot set his configuration. >How-To-Repeat: % cd /usr/ports/ports-mgmt/portupgrade && env TERM=FOO make config >Fix: Apply the following patch. This can also be found at http://people.allbsd.org/~hrs/FreeBSD/ports-dialog.diff. Index: Mk/bsd.port.mk =================================================================== RCS file: /home/ncvs/ports/Mk/bsd.port.mk,v retrieving revision 1.589 diff -d -u -I\$FreeBSD:.*\$ -I\$NetBSD:.*\$ -I\$OpenBSD:.*\$ -I\$DragonFly:.*\$ -I\$Id:.*\$ -I\$Translation:.*\$ -I\$hrs:.*\$ -r1.589 bsd.port.mk --- Mk/bsd.port.mk 17 Oct 2007 10:12:24 -0000 1.589 +++ Mk/bsd.port.mk 5 Mar 2008 15:03:50 -0000 @@ -5826,7 +5826,7 @@ done; \ TMPOPTIONSFILE=$$(mktemp -t portoptions); \ trap "${RM} -f $${TMPOPTIONSFILE}; exit 1" 1 2 3 5 10 13 15; \ - ${SH} -c "${DIALOG} --checklist \"Options for ${PKGNAME:C/-([^-]+)$/ \1/}\" 21 70 15 $${DEFOPTIONS} 2> $${TMPOPTIONSFILE}"; \ + ${SH} -c "${DIALOG} --checklist \"Options for ${PKGNAME:C/-([^-]+)$/ \1/}\" -1 -1 15 $${DEFOPTIONS} 2> $${TMPOPTIONSFILE}"; \ status=$$?; \ if [ $${status} -ne 0 ] ; then \ ${RM} -f $${TMPOPTIONSFILE}; \ Index: Mk/bsd.commands.mk =================================================================== RCS file: /home/ncvs/ports/Mk/bsd.commands.mk,v retrieving revision 1.1 diff -d -u -I\$FreeBSD:.*\$ -I\$NetBSD:.*\$ -I\$OpenBSD:.*\$ -I\$DragonFly:.*\$ -I\$Id:.*\$ -I\$Translation:.*\$ -I\$hrs:.*\$ -r1.1 bsd.commands.mk --- Mk/bsd.commands.mk 4 Aug 2007 11:37:23 -0000 1.1 +++ Mk/bsd.commands.mk 2 Sep 2007 13:17:14 -0000 @@ -33,7 +33,7 @@ CPIO?= /usr/bin/cpio CUT?= /usr/bin/cut DC?= /usr/bin/dc -DIALOG?= /usr/bin/dialog +DIALOG?= ${PORTSDIR}/Tools/scripts/dialog.sh DIFF?= /usr/bin/diff DIRNAME?= /usr/bin/dirname EGREP?= /usr/bin/egrep Index: Tools/scripts/dialog.sh =================================================================== RCS file: Tools/scripts/dialog.sh diff -N Tools/scripts/dialog.sh --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ Tools/scripts/dialog.sh 5 Mar 2008 15:02:37 -0000 @@ -0,0 +1,150 @@ +#!/bin/sh +# +# $FreeBSD$ +# +# Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hiroki Sato <hrs@FreeBSD.org>, +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +DIALOG_CMD=/usr/bin/dialog + +if ${DIALOG_CMD} --clear 2> /dev/null; then + exec ${DIALOG_CMD} "$@" +fi + +print_separator() +{ + echo "---- $*" +} + +print_sw() +{ + _begin=$((${IPAGE} * ${PAGE} + 1)) + case ${PAGE} in + ${NPAGE}) _ritems=$(((${NITEMS} - ${IPAGE} * ${PAGE}) % ${IPAGE})) ;; + *) _ritems=${IPAGE} ;; + esac + _end=$((${_begin} + ${_ritems} - 1)) + + for _i in `jot ${_ritems} ${_begin}`; do + printf "%3d) [%3s] %s\n" ${_i} "`eval echo \\$PSW_${_i}`" "`eval echo \\$PITEM_${_i}`" + done + + print_separator + + case "${_begin}:${_ritems}:${PAGE}" in + 1:1:*) echo -n "${_begin},q) " ;; + 1:*:${NPAGE}) echo -n "${_begin}-${_end},q) " ;; + *:1:*) echo -n "${_begin},p,q) "; + VALIDC="p" ;; + *:*:${NPAGE}) echo -n "${_begin}-${_end},p,q) "; + VALIDC="p" ;; + 1:*:*) echo -n "${_begin}-${_end}(max:${NITEMS}),n,q) "; + VALIDC="n" ;; + *) echo -n "${_begin}-${_end}(max:${NITEMS}),p,n,q) "; + VALIDC="pn" ;; + esac +} + +print_sw_stderr() +{ + for _i in `jot ${NITEMS}`; do + case `eval echo \\$PSW_${_i}` in + on) echo -n " \"`eval echo \\$PTAG_\${_i}`\"" ;; + esac + done +} + +flipflop() +{ + _tmp=`eval echo \\$PSW_$1` + + case "${_tmp}" in + on) echo "off" ;; + off) echo "on" ;; + *) echo "${_tmp}" ;; + esac +} + +check_input() +{ + read _in + + case "${_in}:${VALIDC}" in + [123456789]:*|[123456789][0123456789]:*|[123456789][0123456789][0123456789]:*) + echo "PSW_${_in}=`flipflop ${_in}`" + ;; + q:*|Q:*) + echo "DONE=1" + ;; + n:*n*|N:*n*) + echo "PAGE=$((${PAGE}+1))" + ;; + p:*p*|P:*p*) + echo "PAGE=$((${PAGE}-1))" + ;; + esac +} + +# main + +DONE=0 +PAGE=0 +NITEMS=0 # total number of items +NPAGE=0 # total number of pages +IPAGE=10 # items per page + +while [ $# != 0 ]; do + case $1 in + --checklist) + shift; TITLE=$1 + shift; WIDTH=$1 + shift; HEIGHT=$1 + shift; LHEIGHT=$1 + shift; + + NITEMS=$(($# / 3)) + NPAGE=$(($# / 3 / ${IPAGE})) + + for i in `jot ${NITEMS}`; do + eval "PTAG_${i}=\"$1\"" + eval "PITEM_${i}=\"$2\"" + eval "PSW_${i}=\"$3\"" + shift 3 + done + + break + ;; + *) + shift + ;; + esac +done + +while [ "${DONE}" != 1 ]; do + print_separator "${TITLE}" + print_sw "${NITEMS}" "${PAGE}" "${IPAGE}" + eval `check_input "${NITEMS}" "${PAGE}" "${IPAGE}"` +done + +print_sw_stderr >&2 >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803051555.m25Ft1Rp081350>