/* lock.c */ /* Copyright © 1989 by Donald T. Meyer, Stormgate Software * All Rights Reserved */ #include "rxil.h" /* NAME * RxilCmdLock * * SYNOPSIS * RxilCmdLock( rexxmsg ); * * struct RexxMsg *rexxmsg; * * FUNCTION * This is a "command" which would be called from the dispatch * function. This would handle the "LOCK" command that an ARexx * program could send to the application requesting access to * the private port. * * INPUTS * rexxmsg A pointer to a RexxMsg structure. * * RESULT * None * * SIDES * * HISTORY * 01-Aug-89 Creation. * * BUGS * * SEE ALSO * RxilCmdUnlock() */ void RxilCmdLock( struct RexxMsg *rexxmsg ) { /* Check for wether or not the program which issued this command is * set to receive a result string (options results). * Normally this would be handled downstream by RxilCheckResult() * but in this case we need to know wether or not to set the * locked flag. Why do we need to know this? Because we don't * want to lock if the external program won't be able to receive * our adrress (and therefore never UNlock us!). */ if( FlagIsClear( rexxmsg->rm_Action, RXFF_RESULT ) ) { rexxmsg->rm_Result1 = RXERR_REQUIRES_RESULT_FLAG; return; } if( global_rdef->LockCount != 0 ) { /* We are already locked. Return a failure code. */ rexxmsg->rm_Result1 = RXERR_ALREADY_LOCKED; } else { RxilSetResult( rexxmsg, global_rdef->SecretPortName ); ++global_rdef->LockCount; } } /* NAME * RxilCmdUnlock * * SYNOPSIS * RxilCmdUnlock( rexxmsg ); * * struct RexxMsg *rexxmsg; * * FUNCTION * This is a "command" which would be called from the dispatch * function. This would handle the "UNLOCK" command that an * ARexx program could send to the application requesting * access to the private port. * * Note: The privilege level for this command should be "secret", * since anyone who locked us will be able to meet that level, * and those who have not locked us can't slip the lock out * from under those who did (so to speak). * * INPUTS * rexxmsg A pointer to a RexxMsg structure. * * RESULT * None * * SIDES * * HISTORY * 01-Aug-89 Creation. * * BUGS * * SEE ALSO * RxilCmdLock() */ void RxilCmdUnlock( struct RexxMsg *rexxmsg ) { if( global_rdef->LockCount != 0 ) { /* We are already locked. This is a valid command. */ --global_rdef->LockCount; } else { /* We are not locked. Tell caller about their error. */ rexxmsg->rm_Result1 = RXERR_NOTHING_TO_UNLOCK; } }