A REXX program called from within the CONFIG.SYS is always called after loading all drivers. So, if you want to use a REXX program to change one or more DEVICE or BASEDEV statements (or a file used by a device driver) in the CONFIG.SYS while booting the workstation, you must use a 2-step-method.
Here's an example: Some time ago a CompuServe forum member said he wanted to change the file PROTOCOL.INI in respect to the input of an user while OS/2 was booting. (PROTOCOL.INI is an ini file used by a device driver necessary for the Network support).
I suggested to call the REXX program below in the CONFIG.SYS for this purpose (see Calling REXX programs in the CONFIG.SYS on how to call a REXX program in the CONFIG.SYS). This program uses a status file and an additional boot process to change the configuration on the fly.
The advantage of this method in contrast with using OS/2's ALT-F1 feature to perform maintenance at bootup:
It runs not only on WARP 3, but also under OS/2 versions prior to WARP; there's no overhead and you only have to maintain one configuration.
(see RxFuncAdd if you want to use other DLLs in a REXX program called in the CONFIG.SYS)
/* REXX program which can be called in the CONFIG.SYS to get some */
/* input from the user, check the current configuration against the */
/* user input, and change the configuration and reboot the */
/* workstation with the changed configuration if necessary. */
/* */
/* Note that you can use this method also to change some lines in */
/* your CONFIG.SYS. */
/* Note further, that you can also replace the code to get the user */
/* input with some code to automatically get the needed configuration.*/
/* */
/* You can also use the routine Getkey in programs called in the */
/* CONFIG.SYS. */
/* */
/* (c) 1996 Bernd Schemmer, Germany, EMail: Bernd.Schemmer@gmx.de */
/* */
/* install an error handler for user breaks */
SIGNAL ON HALT Name UserBreak
/* name of the status file for the current boot */
/* process. If this file exists, this is the */
/* second boot, if not it's the first. */
statusFile = "C:\BOOTSEM"
if stream( statusFile, "c", "QUERY EXISTS" ) = "" then
do
/* first boot */
/* load the necessary REXXUTIL function(s). Note */
/* that you CANNOT use SysLoadFuncs!!! */
call rxFuncAdd "SysGetKey", "REXXUTIL", "SysGetKey"
/* get the user input */
call CharOut, "Which PROTOCOL.INI do you want? Press A or B ->> "
do forever
userInput = translate( SysGetKey( "NOECHO" ) )
if UserInput = "A" | UserInput = "B" then
leave
else /* invalid user response - ring the bell */
call CharOut , "07"x
end /* do forever */
call LineOut , UserInput
/* check the configuration, in this example: */
/* check if the existing PROTOCOL.INI is correct */
call LineOut , "Checking the configuration. Please wait ..."
/* ... insert the code to check the configuration ... */
/* set ConfigurationOK to 1 if PROTOCOL.INI is okay */
if ConfigurationOK = 1 then
do
/* the current configuration is okay */
/* continue with the boot process */
call LineOut, "The current configuration is okay." ,
"Boot process continues ..."
end /* if ConfigurationOK = 1 then */
else
do
/* the current configuration is NOT okay */
call LineOut, "The current configuration is NOT okay." ,
"Now changing the configuration ..."
/* correct the configuration, in this example: */
/* replace the PROTOCOL.INI */
/* ... insert the code to change the configuration ...*/
/* now create the status file */
call LineOut statusFile, "We need a second boot ..."
/* close the status file */
call stream statusFile, "c", "CLOSE"
call LineOut, "Rebooting your workstation please wait ..."
/* and reboot the workstation using SETBOOT */
"SETBOOT /IBD:C"
end /* else */
end /* if stream( statusFile, "c", "QUERY EXISTS" ) = "" then */
else
do
/* second boot */
/* normally nothing to do because the */
/* configuration should now be okay */
end /* else */
/* delete the status file also on user breaks */
UserBreak:
/* delete the status file if it exists */
if stream( statusFile, "c", "QUERY EXISTS" ) <> "" then
"@del " statusFile "2>NUL 1>NUL"