My mom's iOpener encountered this same problem ("undergoing a necessary update") after working perfectly for years. She had been picked up by Earthlink when iOpener went under, and all of the features, including email, worked fine until this problem. I helped her switch to a computer, which she still struggles mightily to use, and took her iOpener to try to fix this. I pursued the problem for a long time before finally searching here for "undergoing" and finding this post, which was just what I needed.
I had by this time hooked up a hard drive and copied my mom's Sandisk image off using Dolly, then booted QNX 6.2 off the hard drive and toyed endlessly with the image, without success. I had experimentally replaced many of the files on the image with counterparts from the v2 and anyisp images, and in the process found that np-misc.fs was corrupted, which I figured must have caused the machine to die, but after replacing it and all the other fs files, I still couldn't get the "undergoing" problem to go away.
Thanks to this post, I found what I'd overlooked. I'm including /rc/startup below, where the problem does indeed occur. It does a file system check, and if anything fails (as the corrupted np-misc.fs) would have, it deletes app.version, then enters "undergoing" mode if app.version is missing. Until app.version gets restore, it won't snap out of this. Aha, it never occurred to me there was anything important about that file, but after I copied that file over from the anyisp image, presto, my mom's iOpener works again.
It's curious that the problem occurred for sanabra2 in one day, and on my mom's machine after many years of use. The comments in the file say that corruption can occur if power fails while writing the Sandisk, and of course in the old days it was easy for the iOpener to recover by just copying down fresh copies of all the important files from the mother ship. Now it's a little hard to get fresh files, but not impossible, thanks to pristine images we have.
Here is rc/startup, which does not appear in the clear on the Sandisk image, it must be in one of the fs files that get expanded into ramdisk...
#! /bin/sh
#######################################################################
#
# Generic QNX startup
#
#######################################################################
export TERM=qnxm
export PATH=/bin:/usr/ucb:/dbin:/os
os_version="$OS_VERSION"
. /etc/environment
#
# Check the os file system. We need to do this very early, since
# it seems that chkfsys locks the disk so that even disk reads
# fail. Since vdir hasn't paged in any files, any reads to
# virtual file systems will also fail. We need to "echo n" to
# /bin/chkfsys because, despite the -P flag, chkfsys will prompt
# if the disk is corrupted. Note that we can't use pipes, because
# Pipe hasn't started yet...
#
echo n > /tmp/no
chk_os=0
if test -x /bin/chkfsys
then /bin/chkfsys -r -P -u /os > /tmp/chkfsys.out < /tmp/no
chk_os=$?
fi
#
# In the commands below, you'll see a lot of processes started using
# on -t /dev/null cmd ...
# The effect of this command is to put each process in its own
# process group. This provides some level of isolation between
# processes (so signals aren't erroneously propogated, etc).
#
Dev &
spin -d /dev
#on -t /dev/null Dev.ser -e -b 38400 -m 2f8,3
on -t /dev/null Dev.ser -e -b 9600 -m 2f8,3
on -t /dev/null Dev.ansi -Q -n2
on -t /dev/null Dev.par
on -t /dev/null Pipe
# Need to open /dev/ser1 after starting Dev.ser to direct the
# console away from Proc32 and into the serial port.
# (Otherwise, vdir winds up without fd 1! -- c.f. d.496)
# Use /tmp/startup.log for debugging, /dev/null otherwise
# exec </dev/null >/tmp/startup.log 2>&1
exec </dev/null >/dev/null 2>&1
# get license from flash
license -r
# set clock from hardware clock
rtc hw
#
# Before doing anything with /app, we need to fix what we
# can. Moving this to later in the boot script seems to
# lock up the machine.
#
# Scan the app partition (/dev/hd0t79) looking for I/O errors.
# If we see an error, remove app.version
#
if test -x /bin/catscan
then
catscan -w /dev/hd0t79 > /dev/con1
fi
# Now mount /app, so we can use it as a file system
mount /dev/hd0t79 /app
#
# Check the app file system. We need to "echo n" to /bin/chkfsys
# because, despite the -P flag, chkfsys will prompt if the disk is
# corrupted. We need to wait for the Pipe process to start before
# running the following command.
#
chk_app=0
if test -x /bin/chkfsys -a -f /app/app.version
then /bin/chkfsys -r -P -u /app >> /tmp/chkfsys.out < /tmp/no
chk_app=$?
fi
/bin/rm /tmp/no
if test -f /app/debug.fs
then on -t /dev/null phoenix /os/vdir -X -A vdir.debug -n /dbin -f /app/debug.fs
fi
#######################################################################
#
# Manufacturing test hook
#
#######################################################################
if test -x /app/ztest/startup
then exec /app/ztest/startup
fi
#######################################################################
#
# Netpliance i-opener startup
#
#######################################################################
# ..........................................
#
progress() {
echo "$*"
echo "$*" > /dev/ser1
}
progress "+----------------------------(i-opener)---"
progress "| OS version '$os_version'"
# ..........................................
#
/bin/libshared
hook() {
tag="$1"
progress $tag
list="$(dsmod -d nvram -e startup -a .$tag)"
if test -n "$list"
then nplog np "hook $tag commands: '$list'"
for i in $list
do cmd=$(dsmod -d nvram -e startup -a $i)
if test -n "$cmd"
then nplog np "$tag: command $i: '$cmd'"
eval $cmd
else nplog -error np "$tag: command '$i' not found"
fi
done
fi
}
# ..........................................
#
# OK, this is nasty, I admit it...
# First, start up DSM so we can extract the device id
# from nvram. Note that we don't (nor need to) start it
# in network mode. Then, we kill it, so we can start npmgr
# and friends first.
#
/etc/emgrd
/bin/dsm -L
DEVICE_ID="$(dsmod -d nvram -e device -a .id)"
progress "| Device id '$DEVICE_ID'"
TZ="$(dsmod -d nvram -e logical -a .timeZone)"
if test -z "$TZ"
then TZ=cst06cdt05,M4.1.0/2,M10.5.0/2
fi
export TZ
slay dsm
slay emgrd
export DEVICE_ID
# please clean up references to /*/device...!
echo $DEVICE_ID > /etc/device
prefix -A /os/device=/etc/device
dsm_opt=""
if test -d /app/dsm
then dsm_opt="-C /app/dsm"
else if mkdir /app/dsm
then dsm_opt="-C /app/dsm"
fi
fi
on -p 16 /etc/emgrd
on -t /dev/null -p 15 /bin/npmgr
on -p 14 phoenix /bin/dsm -X $dsm_opt &
hook first
# ..........................................
#
# Start the mount of the vdir that the apps use
#
hook apps0
if test ! -d /app/web
then mkdir /app/web
fi
prefix -A /web=/app/web
if test -x /app/start-apps0
then
/app/start-apps0 &
fi
# ..........................................
#
# Start other OS services
#
on -t /dev/null -p 13 /bin/mark
/etc/watchd
# ..........................................
#
# Start the network
/rc/network.pre
/rc/network.post &
################################################################
#
#
# Start the early apps -- photon, audio, welcome
#
hook apps1
if test -x /app/start-apps1
then
/app/start-apps1 &
fi
# Mount any directories specified in the nvram startup entries
hook cmdList
hook apps2
if test -f /app/app.version
then app_version=$(< /app/app.version)
progress "| APP version '$app_version'"
nplog np "app.version '$app_version'"
if test -x /app/start-apps2
then
/app/start-apps2 &
fi
else progress "| APP version -- NONE"
nplog np "app.version (none)"
echo > /dev/con1
echo Your i-opener is undergoing a necessary update. This may > /dev/con1
echo take 30 minutes or more. If for some reason the service > /dev/con1
echo is not working correctly within an hour, please contact > /dev/con1
echo Technical Support at 1-800-298-9525 to report the problem. > /dev/con1
echo > /dev/con1
fi
# Give the apps all the CPU so they can start
# 30 seconds was determined experimentally for version 1.2 (7/4/2000)
sleep 30
#
# finish checking /app
rm -f /app/.bad_blks
/bin/dcheck -q -m /app > /dev/con1
hook debugStart
#
# Reset the cmos so that boot requires the power switch
# Assumes machines with device id < 500 are not "real"
# device (e.g., they're PCs), so they shouldn't have their
# cmos reset.
#
if test $DEVICE_ID -ge 500
then hook iopener
reset_cmos
else hook victim
fi
#
# nvram logging settings
#
udpDest="$(dsmod -d nvram -e log -a .udpDest 2>/dev/null)"
if [ -n "${udpDest}" ]; then
/bin/nploginit -a -U${udpDest} > /dev/null 2>&1
fi
fileDest="$(dsmod -d nvram -e log -a .fileDest 2>/dev/null)"
if [ -n "${fileDest}" ]; then
/bin/nploginit -a -F${fileDest} > /dev/null 2>&1
fi
#
# Log output produced by chkfsys
#
if test "$chk_app" != 0 -o "$chk_os" != 0
then nplog -crit np $(< /tmp/chkfsys.out)
fi
rm -f /tmp/chkfsys.out
progress "| Time zone '$TZ'"
nplog np "Time zone '$TZ'"
(
t="$(dsmod -d d/deviceCtx -e logical -a .timeZone 2>/dev/null)"
nplog np "tz from deviceCtx '$t'"
) &
if test -d /etc/default
then (echo TZ=$TZ
echo DEVICE_ID=$DEVICE_ID
) > /etc/default/login
fi
if test -f /os/remarks
then progress "+-----------------------------------------"
cat /os/remarks > /dev/ser1
cat /os/remarks
fi
#
# start up debugging framework
#
if test -f /etc/passwd
then tinit -T con1 -t con2 &
l="con"
if test -c /dev/ser1
then stty +opost < /dev/ser1
on -p 17 tinit -T ser1 &
l="$l ser"
fi
fi
hook debugInit
if test -x /rc/debug
then /bin/chkfsys -r -u -P /debug
/rc/debug
l="$l debug"
fi
progress "+------------------------------------<$l>---"
# start inetd if it exists
if test -x /usr/ucb/inetd
then /usr/ucb/inetd &
nplog np telnetd $DEVICE_ID
fi
hook hello
/rc/hello
hook trailer
progress "| updated"
/bin/readbios > /tmp/bios.version
on -t /dev/null -p 14 phoenix /bin/updated -d $DEVICE_ID
# we can sleep here for a minute to allow the apps to have the CPU
# and not be in contention with these processes during boot time
sleep 60
#
# Scan the os partition, looking for I/O errors.
# I/O errors can occur if we lose power during a write.
# We need to run this after npmgr has started, so we
# capture the critsits.
#
if test -x /bin/catscan -a $DEVICE_ID -ge 500
then progress "| catscan /os"
catscan -r /dev/hd0t77 /os/.bad_blks > /tmp/os_errors 2>&1
fi
#
# Scan the app partition (/dev/hd0t79) looking for I/O errors.
# If we see an error, remove app.version
#
if test -x /bin/catscan -a $DEVICE_ID -ge 500
then progress "| catscan /app"
catscan -r /dev/hd0t79 /app/.bad_blks > /tmp/app_errors 2>&1
fi
#
# Log any critsits generated by catscan above
# If catscan failed on /app above, remove /app/app.version. This will
# force update to rebuild the /app partition, and prevent apps from
# starting.
#
if test -s /tmp/os_errors
then nplog -crit np $(< /tmp/os_errors)
progress "+------------------ /os filesystem errors!"
fi
if test -s /tmp/app_errors
then nplog -crit np $(< /tmp/app_errors)
progress "+----------------- /app filesystem errors!"
rm /app/app.version
fi
rm -f /tmp/os_errors
rm -f /tmp/app_errors
progress "+----------------------------------(ok)---"
hook finish