/****************************** Module Header ******************************* * * Module Name: epmmaint.cmd * * Syntax: epmmaint [args] * * This CMD can be executed from the maintenance console of an ArcaOS or eCS * boot medium. * * It tries to find an existing EPM installation for the binaries and * determines the NEPMD environment from the directory of this file. The EPM * loader is expected to be found in this directory, too. That's the case for * every NEPMD installation. * * If EPM was found, EPM is started with the specified args. * * Copyright (c) Netlabs EPM Distribution Project 2018 * * $Id$ * * =========================================================================== * * This file is part of the Netlabs EPM Distribution package and 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, in version 2 as it comes in the "COPYING" file of the * Netlabs EPM Distribution. This library 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. * ****************************************************************************/ /* Some header lines are used as help text */ HelpStartLine = 5 HelpEndLine = 15 '@ECHO OFF' /* ----------------- Standard CMD initialization follows ----------------- */ SIGNAL ON HALT NAME Halt env = 'OS2ENVIRONMENT' TRUE = (1 = 1) FALSE = (0 = 1) CrLf = '0d0a'x Redirection = '>NUL 2>&1' PARSE SOURCE . . ThisFile GlobalVars = 'env TRUE FALSE Redirection ERROR. ThisFile' /* Some OS/2 Error codes */ ERROR.NO_ERROR = 0 ERROR.INVALID_FUNCTION = 1 ERROR.FILE_NOT_FOUND = 2 ERROR.PATH_NOT_FOUND = 3 ERROR.ACCESS_DENIED = 5 ERROR.NOT_ENOUGH_MEMORY = 8 ERROR.INVALID_FORMAT = 11 ERROR.INVALID_DATA = 13 ERROR.NO_MORE_FILES = 18 ERROR.WRITE_FAULT = 29 ERROR.READ_FAULT = 30 ERROR.SHARING_VIOLATION = 32 ERROR.GEN_FAILURE = 31 ERROR.INVALID_PARAMETER = 87 ERROR.ENVVAR_NOT_FOUND = 204 rc = ERROR.NO_ERROR CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' CALL SysLoadFuncs /* ----------------- Standard CMD initialization ends -------------------- */ /* ------------- Configuration ---------------- */ ErrorQueueName = VALUE( 'NEPMD_RXQUEUE',, env) ErrorMessage = '' GlobalVars = GlobalVars 'ErrorQueueName ErrorMessage' GlobalVars = GlobalVars 'HelpStartLine HelpEndLine' /* -------------------------------------------- */ DO 1 lp = LASTPOS( '\', ThisFile) ThisDir = LEFT( ThisFile, lp - 1) PARSE ARG Args /* Eventually show help */ IF (POS( '?', Args) > 0) THEN DO rc = ShowHelp() EXIT( ERROR.INVALID_PARAMETER) END /* Check if environment is already extened */ next = VALUE( 'NEPMD_NAME',, env) IF next = '' THEN DO /* Find EPM executables */ DrivesList = SysDriveMap() EpmDir = '' Rest = DrivesList DO WHILE Rest <> '' PARSE VAR Rest NextDrive Rest NextDir = NextDrive'\os2\apps' /* Find epm.exe */ Found. = '' Found.0 = 0 rcx = SysFileTree( NextDir'\epm.exe', 'Found', 'O') IF Found.0 = 0 THEN ITERATE /* Find epmmri.dll */ Found. = '' Found.0 = 0 rcx = SysFileTree( NextDir'\dll\epmmri.dll', 'Found', 'O') IF Found.0 = 0 THEN ITERATE /* Find etkc603.dll */ Found. = '' Found.0 = 0 rcx = SysFileTree( NextDir'\dll\etkc603.dll', 'Found', 'O') IF Found.0 = 0 THEN ITERATE /* Find etke603.dll */ Found. = '' Found.0 = 0 rcx = SysFileTree( NextDir'\dll\etke603.dll', 'Found', 'O') IF Found.0 = 0 THEN ITERATE /* Find etkr603.dll */ Found. = '' Found.0 = 0 rcx = SysFileTree( NextDir'\dll\etkr603.dll', 'Found', 'O') IF Found.0 = 0 THEN ITERATE /* Find etkucms.dll */ Found. = '' Found.0 = 0 rcx = SysFileTree( NextDir'\dll\etkucms.dll', 'Found', 'O') IF Found.0 = 0 THEN ITERATE EpmDir = NextDir SAY 'EPM executables found in:' EpmDir LEAVE END IF EpmDir = '' THEN DO ErrorMessage = 'The EPM executables cannot be found on any drive in \OS2\APPS.' LEAVE END /* Extend the environment for EPM */ EpmDllDir = EpmDir'\dll' /* Extend PATH */ Path = VALUE( 'PATH',, env) NewPath = STRIP( Path, 'T', ';')';'EpmDir';' rc = VALUE( 'PATH', NewPath, env) /* Extend BeginLIBPATH */ rc = PrependExtLibpath( 'B', EpmDllDir';') /* Extend the environment for NEPMD */ 'CALL' ThisDir'\..\..\netlabs\install\INSTENV' 'CALL' ThisDir'\..\..\netlabs\bin\EPMENV' /* Get NEPMD_ROOTDIR and assemble loader path */ NepmdRootDir = VALUE( 'NEPMD_ROOTDIR',, env) IF NepmdRootDir = '' THEN LoaderExe = STRIP( DIRECTORY(), '\', 'T')'\epm.exe' ELSE LoaderExe = NepmdRootDir'\netlabs\bin\epm.exe' /* Set exe env vars for .NEPMD_INFO */ CALL VALUE 'NEPMD_EPMEXECUTABLE', EpmDir'\EPM.EXE', env CALL VALUE 'NEPMD_LOADEREXECUTABLE', LoaderExe, env END ELSE DO SAY 'Environment already extended.' LoaderExe = VALUE( 'NEPMD_LOADEREXECUTABLE',, env) END /* Call the EPM loader */ 'START' LoaderExe Args END /* Report error message */ IF ErrorMessage <> '' THEN CALL SayErrorText EXIT( rc) /* ------------------------------------------------------------------------- */ GetExtLibpath: PROCEDURE EXPOSE (GlobalVars) PARSE ARG VarName VarName = TRANSLATE( VarName) Type = LEFT( VarName, 1) IF Type = 'E' THEN VarName = 'ENDLIBPATH' ELSE DO Type = 'B' /* Default value */ VarName = 'BEGINLIBPATH' END VarValue = '' DO 1 /* Check for newer REXXUTIL.DLL */ fFunctionFound = 0 IF \RxFuncQuery( 'SYSQUERYEXTLIBPATH') THEN fFunctionFound = 1 /* Query extended LIBPATH */ IF fFunctionFound = 1 THEN VarValue = SysQueryExtLIBPATH( Type) ELSE DO 'CALL RXQUEUE /CLEAR' 'SET 'VarName'|RXQUEUE /FIFO' PARSE PULL next PARSE VALUE next WITH . '=' VarValue END IF VarValue = '(null)' THEN VarValue = '' /* Cleanup */ IF \(fFunctionFound = 1) THEN 'CALL RXQUEUE /CLEAR' END RETURN( VarValue) /* ------------------------------------------------------------------------- */ SetExtLibpath: PROCEDURE EXPOSE (GlobalVars) PARSE ARG VarName, VarValue VarName = TRANSLATE( VarName) Type = LEFT( VarName, 1) IF Type = 'E' THEN VarName = 'ENDLIBPATH' ELSE DO Type = 'B' /* Default value */ VarName = 'BEGINLIBPATH' END rc = ERROR.NO_ERROR DO 1 /* Check for newer REXXUTIL.DLL */ fFunctionFound = 0 IF \RxFuncQuery( 'SYSQUERYEXTLIBPATH') THEN fFunctionFound = 1 /* Set extended LIBPATH. This persists even when SETLOCAL was used. */ IF fFunctionFound = 1 THEN rc = SysSetExtLIBPATH( VarValue, Type) ELSE 'SET 'VarName'='VarValue END RETURN( rc) /* ------------------------------------------------------------------------- */ PrependExtLibpath: PROCEDURE EXPOSE (GlobalVars) PARSE ARG VarName, VarValue VarName = TRANSLATE( VarName) Type = LEFT( VarName, 1) IF Type = 'E' THEN VarName = 'ENDLIBPATH' ELSE DO Type = 'B' /* Default value */ VarName = 'BEGINLIBPATH' END IF RIGHT( VarValue, 1) <> ';' THEN VarValue = VarValue';' rc = ERROR.NO_ERROR DO 1 /* Query old val */ OldVal = GetExtLibpath( Type) /* Set new val: prepend */ NewVal = VarValue''OldVal /* Set env */ rc = SetExtLibpath( Type, NewVal) END RETURN( rc) /* ------------------------------------------------------------------------- */ DirExist: PROCEDURE EXPOSE (GlobalVars) rc = ERROR.NO_ERROR PARSE ARG Dirname Found.0 = 0 rcx = SysFileTree( Dirname, 'Found.', 'DO'); RETURN( Found.0 > 0) /* ----------------------------------------------------------------------- */ SayErrorText: PROCEDURE EXPOSE (GlobalVars) SELECT WHEN (ErrorMessage = '') THEN NOP /* Called by frame program: insert error */ /* message into private queue */ WHEN (ErrorQueueName <> '') THEN DO rcx = RXQUEUE( 'SET', ErrorQueueName) PUSH ErrorMessage END /* Called directly */ OTHERWISE DO SAY ErrorMessage 'PAUSE' END END RETURN( '') /* ----------------------------------------------------------------------- */ Halt: ErrorMessage = 'Interrupted by user.' CALL SayErrorText EXIT( 99) /* ------------------------------------------------------------------------- */ ShowHelp: PROCEDURE EXPOSE (GlobalVars) /* Show help text */ DO i = 1 TO HelpEndLine ThisLineStr = LINEIN( ThisFile) IF i >= HelpStartLine THEN SAY SUBSTR( ThisLineStr, 3) END /* Close file */ rcx = STREAM( Thisfile, 'C', 'CLOSE') RETURN( '')