David, FWIW, here is a "skeleton" Exec that I use to setup a VM service 

machine to wait for incoming reader files and process them.  The Exec als
o 
supports invoking commands from authorized users that send it SMSGs.  The
 
user issuing the SMSG command must be authorized to do so and the Exec 

supports up to three levels of authorization checking.  Level 1, you are 

authorized to run anything supported by the Exec on the service machine. 
 
Level 2, you are authorized to run anything on the service machine.  Leve
l 
3, you are authorized to run the specified command.  The Exec expects to 

use the MSGNOH command to send replys, so the service machine running it 

needs the privilege class required for MSGNOH, (IBM Class "B").

:RDRWAIT EXEC:
/*--------------------------------------------------------------------*/
/*                            RDRWAIT EXEC                            */
/* Skeleton Exec for Service Machine to Wait for Reader Files or      */
/* "Special" Messages, (SMSGs).  Must be customized for each Service  */
/* Machine that runs it.                                              */
/*--------------------------------------------------------------------*/
RDRWAIT:                      
                         
                 
   Address COMMAND                   
                         
          
   Parse Source . ctype ename etype emode .          
                   
   adminid = 'xxxxxxx'       /* ID to Receive Console & Bad Rdr Fil
es */
   qfiles  = 'QUERY FILES * ALL AVAIL'           
                       
   qryrdr  = 'QUERY READER * ALL AVAIL ISODATE DIST'       
             
   myuid   = Userid()                 
                         
         
   Say LOGMSG('Begin' ename etype'...')            
                     
   Say ' '                     
                         
                
   'CP SPOOL READER CLASS *'               
                         
    
   'WAKEUP +0 (QUIET IUCVMSG'     /* Setup to Receive MSGs */    
       
   'CP SET MSG ON'                   
                         
          
   'CP SET SMSG IUCV'   /* Trap SMSGs Only */          
                 
   'MAKEBUF'                     
                         
              
   bufnum = rc                   
                         
              
   stkcnt = Queued()                 
                         
          
   Do Forever                    
                         
              
      Say LOGMSG('Waiting for Reader Files...')         
                
      'WAKEUP (QUIET CONS RDR IUCVMSG'            
                      
      src = rc                   
                         
              
      Select /* src */                 
                         
        
         When src = 4 Then Call DORDR      /* Incoming RDR File */  
    
         When src = 5 Then Call DOSMSG     /* Incoming SMSG */   
       
         When src = 6 Then Call EXIT src   /* Enter Key */     
         
      Otherwise                    
                         
            
         Call EXIT src                 
                         
        
      End /* Select src */                
                         
     
   End /* Do Forever */                 
                         
       
   Call EXIT 99                    
                         
            
                         
                         
                      
/*--------------------------------------------------------------------*/
/* At least 1 Reader file has arrived, process all Reader files found.*/
/*--------------------------------------------------------------------*/
DORDR:                       
                         
                  
   Parse Value Diag(08,qfiles) With . numrdr .         
                 
   Do While numrdr \= 'NO'               
                         
      
      'PIPE CP' qryrdr'|DROP 1|STEM RDRFILES.'         
                 
      If rc \= 0 Then Leave               
                         
     
      Do n = 1 to rdrfiles.0               
                         
    
         Parse Var rdrfiles.n origin fileid class type recs copy,   
    
            hold date time spfn spft spdist .          
                 
         Say ' '                   
                         
            
         Say LOGMSG('Processing' spfn spft 'for' origin'...')    
       
         Select /* process */               
                         
   
            When spfn = 'xxxx' Then Call PROCESS_xxxx      
                
            When spfn = 'yyyy' Then Call PROCESS_yyyy      
             
         Otherwise                   
                         
          
            'CP TRANSFER READER' fileid 'TO' adminid 'READER'    
       
         End /* Select process */              
                         

      End n                     
                         
               
      Parse Value Diag(08,qfiles) With . numrdr .        
               
   End /* Do While numrdr \= 'NO' */            
                        
   Return                      
                         
                
                         
                         
                      
/*--------------------------------------------------------------------*/
/* Process Reader file "xxxx".                                        */
/*--------------------------------------------------------------------*/
PROCESS_xxxx:                    
                         
              
   Return                      
                         
                
                         
                         
                      
/*--------------------------------------------------------------------*/
/* Process Reader file "yyyy".                                        */
/*--------------------------------------------------------------------*/
PROCESS_yyyy:                    
                         
              
   Return                      
                         
                
                         
                         
                      
/*--------------------------------------------------------------------*/
/* At least 1 SMSG has arrived, process all SMSGs found.              */
/*--------------------------------------------------------------------*/
DOSMSG:                      
                         
                  
   'GLOBALV SELECT' ename 'SET INVOKER' /* Can be used by other Execs */
   Do While Queued() > stkcnt               
                         
   
      Pull msgtype smsgusr smsg              
                         
  
      If msgtype \= '*SMSG' Then             
                         
  
         Do                     
                         
               
            Say msgtype Left(smsgusr,8) smsg          
                  
            Iterate                  
                         
          
         End                     
                         
              
      If smsgusr = '' Then Iterate             
                         

      smsgusr = Left(smsgusr,8)              
                         
  
      smsg = Strip(smsg)                
                         
       
      Parse Var smsg smsgcmd smsgargs            
                       
      telluser = 'CP MSGNOH' smsgusr myuid':'         
                  
      If smsgcmd = '' Then               
                         
      
         Do                     
                         
               
            msg = LOGMSG('No command specified.')        
               
            telluser msg                 
                         
      
            Say smsgusr msg                
                         
    
            Iterate                  
                         
          
         End                     
                         
              
      msg = LOGMSG('Processing request "'smsg'".')       
               
      telluser msg                   
                         
          
      Say smsgusr msg                  
                         
        
      authfn = ''                  
                         
            
      Select /* smsgcmd */                
                         
     
         When smsgcmd = 'CMS'     Then cmd = 'CMS' smsgargs    
         
         When smsgcmd = 'CP'      Then cmd = 'CP' smsgargs    
          
         When smsgcmd = 'EXEC'    Then           
                       
            Do                    
                         
             
               authfn = Word(smsgargs,1)           
                     
               cmd = 'COMMAND' smsgcmd smsgargs        
                 
            End                    
                         
            
         When smsgcmd = 'RESTART' Then cmd = 'RESTART'     
             
         When smsgcmd = 'STOP'    Then cmd = 'STOP'      
               
      Otherwise                    
                         
            
         authfn = smsgcmd                
                         
      
         cmd = 'CMS' smsgcmd smsgargs            
                       
      End /* Select smsgcmd */               
                         
  
      authid = ''                  
                         
            
      authids = ename 'AUTHIDS *'             
                         
 
      'ESTATE' authids                 
                         
        
      If rc = 0 Then                 
                         
          
         'PIPE <' authids'|NFIND *|REXX AUTHIDS' smsgusr'|VAR AUTHID'  
 
      If authid = '' Then                
                         
      
         Do                     
                         
               
            authids = myuid 'AUTHIDS *'           
                      
            'ESTATE' authids               
                         
    
            If rc = 0 Then               
                         
      
               'PIPE <' authids'|NFIND *|REXX AUTHIDS' smsgusr||,   
    
                  '|VAR AUTHID'              
                         
  
         End                     
                         
              
      If authid = '' & authfn \= '' Then         
                       
         Do                     
                         
               
            authids = authfn 'AUTHIDS *'           
                     
            'ESTATE' authids               
                         
    
            If rc = 0 Then               
                         
      
               'PIPE <' authids'|NFIND *|REXX AUTHIDS' smsgusr||,   
    
                  '|VAR AUTHID'              
                         
  
         End                     
                         
              
      If authid = '' Then                
                         
      
         Do                     
                         
               
            msg = LOGMSG('You are not authorized to run "'smsg'".')  
   
            telluser msg                 
                         
      
            Say smsgusr msg                
                         
    
            Iterate                  
                         
          
         End                     
                         
              
      If cmd = 'STOP'    Then Call STOP           
                      
      If cmd = 'RESTART' Then Call RESTART          
                    
      'GLOBALV SELECT' ename 'SET INVOKER' smsgusr        
              
      'PIPE' cmd'|CONSOLE|SPECS /'telluser'/ 1 1-* NW|STEM MSG.'   
     
      src = rc                   
                         
              
      'PIPE STEM MSG.|CP'                
                         
      
      msg = LOGMSG('** "'smsgcmd smsgargs'" ended,',       
             
            'Return Code =' src '**')            
                       
      telluser msg                   
                         
          
      Say smsgusr msg                  
                         
        
   End /* Do While Queued() > stkcnt */            
                     
   'GLOBALV SELECT' ename 'SET INVOKER'            
                     
   Return                      
                         
                
                         
                         
                      
/*--------------------------------------------------------------------*/
/* Preface supplied string with the current date and time.            */
/*--------------------------------------------------------------------*/
LOGMSG:                      
                         
                  
   Return Date('S',,,'-') Time() Arg(1)            
                     
                         
                         
                      
/*--------------------------------------------------------------------*/
/* Restart this Exec.                                                 */
/*--------------------------------------------------------------------*/
RESTART:                      
                         
                 
   msg = LOGMSG('"'ename'" Restarting...')          
                    
   telluser msg                    
                         
            
   Say smsgusr msg                   
                         
          
   Push 'EXEC' ename                  
                         
         
   Exit 0                      
                         
                
                         
                         
                      
/*--------------------------------------------------------------------*/
/* Stop running this Exec.                                            */
/*--------------------------------------------------------------------*/
STOP:                       
                         
                   
   msg = LOGMSG('"'ename'" Terminating...')          
                   
   telluser msg                    
                         
            
   Say smsgusr msg                   
                         
          
   Call EXIT 16                    
                         
            
                         
                         
                      
/*--------------------------------------------------------------------*/
/* Cleanup and Exit.  Logoff if the Service Machine is not Connected. */
/*--------------------------------------------------------------------*/
EXIT:                       
                         
                   
   Arg src .                     
                         
              
   If src = '' Then src = 0              
                         
      
   'DROPBUF' bufnum                  
                         
          
   'CP SET SMSG OFF'                  
                         
         
   'WAKEUP RESET'       /* Cleanup IUCV Environment */       
           
   Say ''                      
                         
                
   Say LOGMSG('End  ' ename etype'...')            
                     
   display = (SubStr(Diag(24,-1),13,1) = 0)         
                    
   If \display Then                  
                         
          
      Do                      
                         
                 
         Say ename 'RC='src               
                         
     
         'CP LOGOFF'                  
                         
         
      End                      
                         
                
   Exit src


:AUTHIDS REXX: 
/*--------------------------------------------------------------------*/
/*                            AUTHIDS REXX                            */
/* REXX PIPELINE subroutine to support "wildcard", (last character is */
/* an asterisk (*)), matching for Authorization checking.  If a match */
/* is found, the record containing the match is output.  If no match  */
/* is found, a blank record is output.  The userid to be matched must */
/* be specified as a parm to this routine and the userid in the       */
/* records must be the first word in the record.                      */
/*--------------------------------------------------------------------*/
AUTHIDS:                      
                         
                 
   Signal On Error                   
                         
          
   blank = ' '                   
                         
              
   Arg chkid .                    
                         
             
   Do Forever                    
                         
              
      'PEEKTO REC' /* Get Record */             
                        
      Parse Var rec authid .               
                         
    
      If chkid = authid Then Call VALID           
                      
      If Right(authid,1) = '*' Then            
                         

         Do                     
                         
               
            authid = Strip(authid,'T','*')          
                    
            l = Length(authid)              
                         
   
            If Left(chkid,l) = authid Then Call VALID      
             
         End                     
                         
              
      'READTO'     /* Consume Record */            
                     
   End /* Do Forever */                 
                         
       
                         
                         
                      
ERROR:                       
                         
                  
   Signal Off Error                  
                         
          
   src = rc                    
                         
                
   'OUTPUT' blank                   
                         
           
   Exit src*(src<>12)                  
                         
        
                         
                         
                      
VALID:                       
                         
                  
   Signal Off Error                  
                         
          
   'OUTPUT' chkid                   
                         
           
   Exit rc*rc<>12

:RDRWAIT AUTHIDS:
THISID    This ID is Authorized
THATID    That ID also
VMBAT0*   All VM:Batch Worker Machines

Dale R. Smith

"It's just a simple matter of programming."
- Any boss who has never written a program 
                         
                         
                
On Tue, 1 Jul 2008 07:10:26 -0700, Wakser, David 
<[EMAIL PROTECTED]> wrote:

>All:
>
>       What is the best method to code, for a SVM, a wait for a file to
>arrive in its reader?
>
>       I have a (very old) EXEC that has a "do forever" loop with a
>"EXECIO * CP (STEM" aa. "STRING CP Q RDR * ALL" command followed by a
>SLEEP when no files are found. Is there a better method of "waking up"
>an EXEC when a RDR file arrives?
>
>       Thanks, in advance.
>
>David Wakser
>========================
=========================
=======================

Reply via email to