**************************************************************************** * SUBROUTINE SPAWN(PARM1,PARM2,PARMLEN,EXE_FLAG) * * PURPOSE: SPAWN THE USERS IMAGE VIA A SUBPROCESS * * PROCEDURE: CREATE A TERMINATION MAILBOX FOR SIGNALLING OF * SUBPROCESS END. IN ORDER TO SIGNAL A TERMINATION MAILBOX, * ONE MUST EXTRACT THE UNIT NUMBER FROM THE MAILBOX DATA AND * PASS THAT TO THE CREATE SUBPROCESS SYSTEM SERVICE. ONCE * THE SUBPROCESS IS CREATED, ONE MUST ISSUE A READ NO WAIT * QIO REQUEST WAITING ON THE TERMINATION MAILBOX, WITH AN AST * DELIVERY ROUTINE DEFINED TO RECEIVE THE TERMINATION MAILBOX * EVENT. BOOST HIBERNATES WHILE THE SUBPROCESS IS RUNNING, AND * WAKES UP TO PROCESS THE TERMINATION MAILBOX, AND THEN EXIT. * **************************************************************************** * IMPLICIT INTEGER(A-Z) * INTEGER*4 PARM1 CHARACTER*(*) PARM2 CHARACTER*63 SYSIN CHARACTER*63 SYSOUT CHARACTER*63 SYSERR LOGICAL ERROR LOGICAL EXE_FLAG * CHARACTER*5 VHSIC CHARACTER*25 IMAGE CHARACTER*25 INPSOURCE * INTEGER*4 ACC$K_TERMLEN /'54'X/ INTEGER*2 EXITMSG(100) INTEGER*2 IOSTATUS(4) EXTERNAL FINISH COMMON EXITMSG COMMON IOSTATUS COMMON PIDADR * INTEGER*4 ICHAN * EXTERNAL SS$_NORMAL EXTERNAL SS$_BUFFEROVF INTEGER*4 IO$_READVBLK /'31'X/ * INTEGER*4 DIB$K_LENGTH /'74'X/ CHARACTER*116 PRIMBUF INTEGER*4 DIB$W_UNIT /13/ BYTE UNIT(116) INTEGER*2 NUMBER * * SUBPROCESS PRIVILEGES * INTEGER*4 PRV$V_GROUP /'8'X/ INTEGER*4 PRV$V_GRPNAM /'3'X/ INTEGER*4 PRV$V_NETMBX /'14'X/ INTEGER*4 PRV$V_TMPMBX /'F'X/ * INTEGER*4 INTPRV(2) REAL*8 PRVADR EQUIVALENCE (INTPRV,PRVADR) * EQUIVALENCE(PRIMBUF,UNIT) EQUIVALENCE(UNIT(13),NUMBER) * INTPRV(2) = JIOR(INTPRV(2),PRV$V_GROUP) INTPRV(2) = JIOR(INTPRV(2),PRV$V_GRPNAM) INTPRV(2) = JIOR(INTPRV(2),PRV$V_NETMBX) INTPRV(2) = JIOR(INTPRV(2),PRV$V_TMPMBX) * VHSIC = 'VHSIC' * * CREATE A TERMINTION MAILBOX * STAT = SYS$CREMBX(,ICHAN,%VAL(120),%VAL(240),,,) IF(STAT.NE.%LOC(SS$_NORMAL)) THEN CALL LIB$SIGNAL(%VAL(STAT)) ENDIF * * NOW EXTRACT THE MAILBOX UNIT NUMBER FROM THE MBX CHANNEL * STAT=0 STAT = SYS$GETCHN(%VAL(ICHAN),DIB$K_LENGTH,PRIMBUF(1:116),,) * T0 = %LOC(SS$_NORMAL) T1 = %LOC(SS$_BUFFEROVF) * IF((STAT.NE.T0).OR.(STAT.NE.T1)) CALL LIB$SIGNAL(%VAL(STAT)) * * * GET THE LOGICAL NAME TRANSLATION FOR SYS$INPUT,SYS$OUTPUT * AND SYS$ERROR AND ISSUE A SUBPROCESS CREATE * CALL TRANSL(SYSIN,SYSOUT,SYSERR,INLEN,OUTLEN,ERRLEN) * IF (EXE_FLAG .EQ. .TRUE.) THEN IMAGE = PARM2(1:PARMLEN) INPSOURCE = SYSIN(1:INLEN) ELSE IMAGE = 'DRA0:[SYSEXE]LOGINOUT.EXE' INPSOURCE = PARM2(1:PARMLEN) ENDIF STAT=SYS$CREPRC(PIDADR,IMAGE,INPSOURCE, * SYSOUT(1:OUTLEN),SYSERR(1:ERRLEN),PRVADR,, * %DESCR(VHSIC),%VAL(PARM1),,%VAL(NUMBER),) * IF(STAT.NE.%LOC(SS$_NORMAL)) THEN CALL LIB$STOP(%VAL(STAT)) ENDIF * * AFTER THIS ASK FOR A TERMINATION MAILBOX WITH THE MODULE * FINISH SPECIFIED AS THE AST DELIVERY ROUTINE * STAT = SYS$QIO(,%VAL(ICHAN),%VAL(IO$_READVBLK), * IOSTATUS,FINISH,,EXITMSG,%VAL(ACC$K_TERMLEN),,,,) * IF(STAT.NE.%LOC(SS$_NORMAL))CALL LIB$STOP(%VAL(STAT)) * WRITE (*,100) PARM2 100 FORMAT(1X,'BOOST> STARTING ',A40) * * HIBERNATE BOOST * CALL SYS$HIBER * RETURN END