TITLE TYPIDS - Type all PIDs and their associated information SUBTTL Irwin L. Goverman/ILG/PJT/DC 18-Oct-78 SEARCH GLXMAC ;LOAD GALAXY SYSTEM SYMBOLS PROLOG(TYPIDS) ;DECLARE NAME, ETC... TYPVER==1 ;VERSION TYPEDT==107 ;EDIT LEVEL TYPWHO==0 TYPMIN==0 %%.TYP== ;MAKE INTO VERSION NUMBER SUBTTL Definitions and Storage ND MAXJOB,^D250 ;MAXIMUM NUMBER OF JOBS ND STACKL,^D100 ;SIZE OF STACK SYSPRM .JIJNO,0 ;DEFINE -10 JOB DATA OFFSETS SYSPRM .JIUNO,1 ;FOR VARIOUS STUFF SYSPRM .JIPNM,2 SYSPRM .JIDFS,.JIPNM ;TOTAL LENGTH NEEDED SYSPRM NAMLOC,.IPCI2,.IPCI1 ;WHERE NAME STARTS IN INFO RESPONSE SYSPRM OFFSET,1,2 ;WORDS PER PID IN MB SYSPRM MBSIZ,12,^D200 ;WORDS OF JOB PID TABLE MB: BLOCK MBSIZ ;BLOCK FOR PIDS JB: BLOCK .JIDFS+1 ;JOB INFORMATION BLOCK IB: $BUILD(IB.SZ) $SET(IB.PRG,,%%.MOD) ;SET PROGRAM NAME $SET(IB.OUT,,T%TTY) ;AND DEFAULT OUTPUT ROUTINE $SET(IB.PIB,,PIB) ;AIM AT PID BLOCK $EOB PIB: $BUILD (PB.MNS) ;MINIMAL PID $SET (PB.HDR,PB.LEN,PB.MNS) ;NOTHING SPECIAL, JUST GET A PID $EOB ENTVEC: JRST TYPIDS ;ENTRY VECTOR JRST TYPIDS EXP %%.TYP ;VERSION LOC 137 EXP %%.TYP RELOC STACK: BLOCK STACKL ;PUSHDOWN LIST INFSAB: $BUILD SAB.SZ $SET (SAB.LN,,INFMSL) ;LENGTH OF MSG $SET (SAB.MS,,INFMS) ;MESSAGE ADRS $SET (SAB.SI,SI.FLG,1) ;SEND BY SPECIAL INDEX $SET (SAB.SI,SI.IDX,SP.INF) ;SEND TO SYSTEM INFO $EOB INFMS: EXP .IPCIG ;GET NAME FROM PID BLOCK ^D7 ;PLACE FOR NAME INFMSL==.-INFMS ;SIZE OF THE MESSAGE SUBTTL Special PID tables DEFINE .SPID(CANNAM,T10VAL,T20VAL,SIXNAM),< IFNB ,< SIXBIT\SIXNAM\> IFB ,< SIXBIT\******\> > SIXBIT / / ;No match on pid, type blanks NAMTAB: SPIDS NAMTBL==.-NAMTAB DEFINE .SPID(CANNAM,T10VAL,T20VAL,SIXNAM),< CANNAM > ;Build a table of the indicies themselves PIDIDX: SPIDS PIDTAB: BLOCK NAMTBL ;PIDS OF SYSTEM COMPONENTS SUBTTL Main Program Loop TYPIDS: RESET MOVE P,[IOWD STACKL,STACK] ;SET UP STACK POINTER DMOVE S1,[EXP IB.SZ,IB] ;POINT TO THE INIT BLOCK $CALL I%INIT## ;INITIALIZE EVERTHING $CALL RDPIDS ;READ SYSTEM PIDS TOPS10 < PJOB S1, ;GET OUR JOB NUMBER $CALL GETJOB ;SEE IF WE CAN READ OUR OWN STUFF ;IF NOT, GETJOB WILL $FATAL IMMEDIATELY >;END TOPS10 MAIN: MOVSI P1,-MAXJOB ;GET MAXIMUM JOB NUMBER AS COUNTER $TEXT(,) $TEXT(,<--- ---- ------- --- --- --- ------ ---->) MAIN.1: HRRZ S1,P1 ;GET JOB NUMBER $CALL GETJOB ;GET JOB DATA SET UP JUMPF MAIN.2 ;IF NOT A JOB, SKIP DISPLAY $CALL DISPID ;DISPLAY ALL THE PID INFORMATION MAIN.2: AOBJN P1,MAIN.1 ;REPEAT FOR ALL THE JOBS JRST I%EXIT ;THEN EXIT SUBTTL DISPID - Display PID information for one job DISPID: MOVEI T1,MB+2 ;GET ADDR OF FIRST PID DISP.1: SKIPN 0(T1) ;A PID HERE? $RETT ;NO, SO WE ARE DONE MOVE S1,0(T1) ;GET THE PID MOVEM S1,INFMS+.IPCI2 ;STORE INTO [SYSTEM]INFO BLOCK DMOVE S1,[EXP SAB.SZ,INFSAB] ;SIZE AND LOC OF MESSAGE $CALL C%SEND ;SEND IT TO INFO SKIPT ;DID IT WORK? $STOP(SIF,Send to [SYSTEM]INFO failed) DISP.2: $CALL C%BRCV ;WAIT FOR THE ANSWER SKIPT ;CHECK FOR ERRORS $STOP(ERI,Error receiving from [SYSTEM]INFO) MOVE S2,MDB.SI(S1) ;GET SPECIAL INDEX TXZE S2,SI.FLG ;IS THIS SPECIAL CAXE S2,SP.INF ;AND FROM INFO? JRST [ PUSHJ P,C%REL ;NO, LET GO OF MESSAGE JRST DISP.2 ] ;AND TRY AGAIN LOAD T2,MDB.MS(S1),MD.ADR ;GET ADDRESS OF RESPONSE LOAD S2,MDB.MS(S1),MD.CNT ;GET LENGTH OF MESSAGE ADD S2,T2 ;POINT TO LAST WORD SETZM (S2) ;AND CLEAR IT LOAD S2,MDB.FG(S1),IP.CFE ;GET ERROR FLAGS FROM MESSAGE SKIPE S2 ;ARE THERE ERRORS? SETZM NAMLOC(T2) ;YES, CLEAR ANYTHING IN NAME WORD MOVEI T3,NAMTBL-1 ;GET MAX OFFSET INTO SYS PID TBL MOVE S1,0(T1) ;GET THE PID UNDER CONSIDERATION CAME S1,PIDTAB(T3) ;A MATCH? SOJGE T3,.-1 ;NO, LOOP IF MORE MOVE S1,T1 ;GET POINTER $CALL SETFLG ;SET UP THE FLAGS $TEXT(,<^D3R/JB+.JIJNO/ ^U12/JB+.JIUNO/ ^W6/JB+.JIPNM/^A>) $TEXT(,<^O13/0(T1)/ ^6/S1/ ^6/S2/ ^W6/NAMTAB(T3)/ ^T/NAMLOC(T2)/>) ADDI T1,OFFSET ;STEP TO NEXT PID JRST DISP.1 ; SUBTTL System PID table routines ;RDPIDS reads the system's pid table RDPIDS: $CALL .SAVE1 ;GET ONE AC MOVSI P1,-NAMTBL ;GET SIZE OF TABLE SET UP RDPI.1: LOAD S1,PIDIDX(P1) ;GET THE SP.XXX SYMBOL FOR SYS JOB $CALL C%RPRM ;AND READ IT'S PID SKIPT ;MONITOR MAY NOT HAVE ONE SETZ S1, ;IF SO, CLEAR THE PID STORE S1,PIDTAB(P1) ;REMEMBER PID GOTTEN AOBJN P1,RDPI.1 ;LOOP FOR ALL WE KNOW ABOUT $RETT ;AND THEN RETURN SUBTTL GETJOB -- Set up job data and PIDs ;CALL IS: S1/ Job number ; ;TRUE RETURN: Job is existent ;FALSE RETURN: No job with this job number exists GETJOB: TOPS20 < $CALL .SAVET ;NEED T1 MOVE S2,[-<.JIDFS+1>,,JB] ;PLACE TO PUT JOB INFORMATION MOVX T1,.JIJNO ;FIRST WORD TO FETCH GETJI ;GET THE JOB INFORMATION $RETF MOVX S1,.MUFJP ;FIND JOB'S PID MOVEM S1,MB+0 ;IS THE FUNCTION MOVE S1,JB+.JIJNO ;GET JOB NUMBER MOVEM S1,MB+1 ;STORE IT AWAY DMOVE S1,[EXP MBSIZ,MB] ;SIZE,LOCATION OF MUTIL BLOCK MUTIL ;SEE IF ANY PIDS $STOP(PQF,PID query failed) $RETT ;AND RETURN > ;END OF TOPS20 TOPS10 < $CALL .SAVE2 ;SAVE TWO ACS MOVE P1,S1 ;COPY JOB NUMBER MOVEM S1,JB+.JIJNO ;AND STORE INTO JOB DATA BLOCK HRLZ S1,P1 ;GET JOB NUMBER HRRI S1,.GTPPN ;AND THEN PPN GETTAB S1, SETZ S1, ;IF ILLEGAL, CLEAR PPN JUMPE S1,.RETF ;IF NO PPN, NOT LOGGED IN MOVEM S1,JB+.JIUNO ;STORE USER NUMBER HRLZ S1,P1 ;COPY JOB NUMBER BACK HRRI S1,.GTPRG ;AND FIND PROGRAM NAME GETTAB S1, ;FROM MONITOR SETZ S1, ;CLEAR IT IF IT FAILS MOVEM S1,JB+.JIPNM ;STORE NAME MOVX S1,.IPCSP ;FUNCTION IS GET PIDS FOR JOB MOVEM S1,MB+0 ;STORE IT MOVEM P1,MB+1 ;STORE THE JOB NUMBER SETZM MB+2 ;START WITH FIRST PID DMOVE S1,[EXP SAB.SZ,IPCSAB] ;SEND THIS OFF TO INFO $CALL C%SEND ; SKIPT $FATAL(IPCF privileges required) GETJ.2: $CALL C%BRCV ;RECEIVE THE MESSAGE SKIPT ;IS IT OK? $STOP(RMF,Receive from monitor failed) MOVE S2,MDB.SI(S1) ;GET INDEX TXZE S2,SI.FLG ;IS IT SPECIAL? CAXE S2,SP.IPC ;AND FROM IPCC? JRST [ PUSHJ P,C%REL ;NO, FLUSH MSG JRST GETJ.2 ] ;AND TRY AGAIN LOAD S2,MDB.MS(S1),MD.ADR ;GET WHERE PACKET LIVES HRLZS S2 ;REVERSE HRRI S2,MB ;AND GET THE DESTINATION BLT S2,MB+MBSIZ-1 ;TRANSFER IT $RETT ;AND RETURN IPCSAB: $BUILD SAB.SZ $SET (SAB.LN,,MBSIZ) ;SIZE OF MESSAGE $SET (SAB.MS,,MB) ;ADDR OF MESSAGE $SET (SAB.SI,SI.FLG,1) ;SEND BY SPECIAL INDEX $SET (SAB.SI,SI.IDX,SP.IPC) ;SEND TO IPCC $EOB > ;END OF TOPS10 SUBTTL SETFLG -- Set flags for display line ;CALL IS: S1/ Pointer to PID ; ;TRUE RETURN: S1/ Indicator of "permanence" ; S2/ Indicator of "no access" SETFLG: TOPS20 < MOVE S2,S1 ;GET COPY OF INDEX LOAD S1,1(S2),IP%JWP ;GET "JOB WIDE" FLAG SKIPE S1 ;IF ITS ON, MOVEI S1,'*' ;FLAG IT LOAD S2,1(S2),IP%NOA ;IS THIS "NO ACCESS" SKIPE S2 ; TO OTHER PROCESSES? MOVEI S2,'*' ;YES, REMEMBER IT $RETT ;AND RETURN > ;END OF TOPS20 TOPS10 < SKIPL 0(S1) ;IF SIGN BIT LIT, PID IS TEMP SKIPA S1,['*'] ;ELSE IT IS PERMANENT MOVEI S1,' ' MOVEI S2,' ' ;NO ACCESS IS NEVER ON $RETT ;RETURN > ;END OF TOPS10 TOPS10 < END TYPIDS> TOPS20 < END <3,,ENTVEC>>