Aucbvax.6907 fa.info-vax utzoo!decvax!ucbvax!info-vax Sun Apr 25 08:38:57 1982 Lecture/Demonstration on VMS 2.4 logical name tables >From EPS@MIT-AI Sun Apr 25 08:27:41 1982 We were wondering some time back whether it was possible for a subprocess to inherit its creator's process-wide logical names. If the two processes are "cooperating" in nature, the top one need only read its table and pass the information down. The problem was how to read the table. * * * .TITLE SHOWGROUP Display Group Logical Name Tables ; BACKGROUND INFORMATION ; ---------------------- ; ; For each logical name assignment, VMS 31 0 ; dynamically allocates a "logical name +-------------------------------+ ; block" (LOG) and links it into one of | logical table forward link | 0 ; three chains depending on whether the +-------------------------------+ ; assignment is to be system-wide, group- | logical table backward link | 4 ; wide, or process-wide. Pointers exist +-------+-------+---------------+ ; in the Job Information Block (JIB) for | table | type | size of block | 8 ; a fourth "job-wide" chain, but VMS 2.4 +-------+-------+---------------+ ; doesn't make use of them. The system | | amod | creator group | 12 ; location LOG$AL_LOGTBL (%X800024E8) is +-------+-------+---------------+ ; the base of an array of pointers | mailbox ucb address | 16 ; indexed by table number (0=system; +-----------------------+-------+ ; 1=group; 2=process) to double links | <-- LOGICAL - 1 : ; NAME V FIG. | TABLES. LOG$GL_SLTFL THE +----------------------+ BLOCK TO +------. LOG$AL_LOGTBL COUNT +- +---------------+>+>| head of chain |-->+-->|next LOG block |---->| next ; +---------------+ | ^ +---------------+ +---------------+ | +------. ; |system pointer |--+ | | tail of chain |--+ +--| | +--| prev ; +---------------+ | +---------------+ | | +---------------+ +------. ; | group pointer |---+ | | v : : : ; +---------------+ | +--------------------|-+<--------------------+ <--+ ; V | |PROCESS POINTER|-+ CTL$GL_PLTFL +-- +<----------------------|---------. +---------------+> similar chain for +--->| |--+ +-----. ; similar chain for group logicals +---------------+ | ; process logicals |prev LOG block |------+ ; +---------------+ ; (Refer to the description of the INSQUE and : : ; REMQUE instructions in chapter 12 of the VAX ; Architecture Handbook if this looks confusing) ; Fig. 2 Finding the chains ; ; .PAGE ; ; ; LOG structures are allocated in P1 space for process-wide assignments, or ; system dynamic memory for group or system assignments. Insofar as $CRELOGs ; are concerned, the only difference between system and group assignments ; is which chain they hook on to. In both cases LOG$W_GROUP is set to the ; group number of the creating process. When the group table is searched, ; only entries for your group are considered. VMS does not maintain a ; separate table for each group. ; ; The logical name and equivalence are stored as counted ASCII strings, so ; the structure is of variable size. The "size" word in the LOG block is ; the number of bytes in the structure rounded up to the next multiple of ; 16. "Type" is always DYN$C_LOG (11 decimal). "Table" is 0, 1, or 2 ; for System, Group, or Process table. "Amod" is access mode in which ; the assignment was made (0=Kernel 1=Exec 2=Super 3=User). If the logical ; name was created by $CREMBX then mbxucb will contain the address of the ; mailbox's unit control block, otherwise it will be NULL. ; ; Everything I have described above is readable to user-mode software with ; ONE exception. The definition of SYS$SYSDISK (the second definition in ; the system table) resides in a read-protected page! Only DEC knows why ; this is (I sure don't--it seems really stupid to me). SHOW LOGICAL/S ; can get it because it's INSTALLed with CMKRNL and CMEXEC and doesn't ; mind living dangerously. ; ; ; Eric P. Scott ; California Institute of Technology ; April, 1982 ; ; ; to compile: ; $ MACRO SHOWGROUP ; $ LINK/NOTRACE SHOWGROUP,SYS$SYSTEM:SYS.STB ; .PAGE $DSCDEF $RMSDEF $SSDEF $TPADEF .LIBRARY /SYS$LIBRARY:LIB/ $LOGDEF .EXTRN LOG$AL_LOGTBL .PSECT MAIN,NOWRT,SHR,PIC,LONG .ENTRY MAIN,^M CLRL -(SP) ; Descriptor for input line PUSHL #! PUSHAQ PROMPT ; Get foreign command line PUSHAQ 4(SP) CALLS #2,G^LIB$GET_FOREIGN CMPL R0,#RMS$_EOF BEQL 11$ BLBC R0,10$ PUSHAQ (SP) PUSHAQ 4(SP) CALLS #2,STR$UPCASE BLBC R0,10$ SUBL2 #TPA$K_LENGTH0-16,SP ; Push TPARSE parameter block PUSHL TPA$K_LENGTH0-16+DSC$A_POINTER(SP) MOVZWL TPA$K_LENGTH0-12+DSC$W_LENGTH(SP),-(SP) PUSHL #TPA$M_ABBREV PUSHL #TPA$K_COUNT0 PUSHAL SKT ; Validate syntax PUSHAL SST PUSHAL 8(SP) CALLS #3,G^LIB$TPARSE BLBC R0,10$ ; Really should die more gracefully MOVZWL TPA$K_LENGTH0+DSC$W_LENGTH(SP),TPA$L_STRINGCNT(SP) MOVL TPA$K_LENGTH0+DSC$A_POINTER(SP),TPA$L_STRINGPTR(SP) PUSHAL XKT ; Display requested group(s) PUSHAL XST PUSHAL 8(SP) CALLS #3,G^LIB$TPARSE 10$: RET 11$: MOVZWL #SS$_NORMAL,R0 RET .PSECT HELP,NOWRT,SHR,PIC,LONG .ENTRY HELP,^M PUSHAQ HLPTXT ; Display one-line help message CALLS #1,LIB$PUT_OUTPUT $EXIT_S R0 .PSECT DISPLAY,NOWRT,SHR,PIC,LONG .ENTRY DISPLAY,^M CLRL -(SP) PUSHL #! PUSHAQ (SP) ; Output blank line CALLS #1,G^LIB$PUT_OUTPUT BLBC R0,DIE1 TSTW TPA$L_TOKENCNT(AP) BNEQ DSPN PUSHAQ GRPA ; Output header for all groups CALLS #1,G^LIB$PUT_OUTPUT BLBS R0,DSPB DIE1: PUSHL R0 ; Die horribly CALLS #1,G^LIB$STOP DSPX: RET DSPN: PUSHL TPA$L_NUMBER(AP) PUSHAQ 4(SP) CLRL -(SP) PUSHAQ GRPN CALLS #4,G^LIB$SYS_FAO BLBC R0,DIE1 PUSHAQ (SP) ; Output header for specific group CALLS #1,G^LIB$PUT_OUTPUT BLBC R0,DIE1 MOVAQ (SP),R0 JSB G^LIB$SFREE1_DD6 BLBC R0,DIE1 DSPB: PUSHAQ (SP) ; Output blank line CALLS #1,G^LIB$PUT_OUTPUT BLBC R0,DIE1 MOVL @#LOG$AL_LOGTBL+,R2 CMPL (R2),R2 BEQL DSPX ; Table empty MOVL (R2),R3 DSPE: TSTW TPA$L_TOKENCNT(AP) BNEQ DSPM ; Specific group MOVZBL LOG$B_AMOD(R3),R0 PUSHAB ACMODE(R0) PUSHL #1 MOVAB LOG$T_NAME(R3),R1 MOVZBL (R1),R0 INCL R0 ADDL3 R1,R0,-(SP) PUSHL R1 MOVZWL LOG$W_GROUP(R3),-(SP) PUSHAQ 20(SP) CLRL -(SP) PUSHAQ ALINE CALLS #8,G^LIB$SYS_FAO BLBS R0,DSPP DIE2: BRW DIE1 DSPM: CMPW TPA$L_NUMBER(AP),LOG$W_GROUP(R3) BNEQ DSPC MOVZBL LOG$B_AMOD(R3),R0 PUSHAB ACMODE(R0) PUSHL #1 MOVAB LOG$T_NAME(R3),R1 MOVZBL (R1),R0 INCL R0 ADDL3 R1,R0,-(SP) PUSHL R1 PUSHAQ 16(SP) CLRL -(SP) PUSHAQ NLINE CALLS #7,G^LIB$SYS_FAO BLBC R0,DIE2 DSPP: PUSHAQ (SP) CALLS #1,G^LIB$PUT_OUTPUT BLBC R0,DIE2 DSPC: MOVL LOG$L_LTFL(R3),R3 CMPL R3,R2 BEQL DSPX2 BRW DSPE DSPX2: MOVAQ (SP),R0 JSB G^LIB$SFREE1_DD6 BLBC R0,DIE2 RET .PSECT CONSTANTS,NOWRT,NOEXE,SHR,LONG PROMPT: .ASCID /SHOWGROUP> / .ALIGN LONG HLPTXT: .ASCID / Give list of groups or ALL/ .ALIGN LONG GRPA: .ASCID / Contents of group logical name tables :/ .ALIGN LONG GRPN: .ASCID / Contents of group !OW logical name table:/ .ALIGN LONG ALINE: .WORD ETEXT-ATEXT .BYTE DSC$K_DTYPE_T .BYTE DSC$K_CLASS_S .ADDRESS ATEXT NLINE: .WORD ETEXT-NTEXT .BYTE DSC$K_DTYPE_T .BYTE DSC$K_CLASS_S .ADDRESS NTEXT ATEXT: .ASCII / !OW/ NTEXT: .ASCII / !AC = !AC (!AD)/ ETEXT: ACMODE: .ASCII /KESU/ COMMA=^A',' $INIT_STATE SST,SKT $STATE $TRAN !SAS,TPA$_EXIT $TRAN !SHS,TPA$_EXIT,HELP $TRAN TPA$_EOS,TPA$_EXIT $TRAN TPA$_OCTAL,,VGRP $STATE SBS $TRAN COMMA $TRAN TPA$_EOS,TPA$_EXIT $STATE $TRAN TPA$_OCTAL,SBS $STATE SAS $TRAN 'ALL' $STATE $TRAN TPA$_EOS,TPA$_EXIT $STATE SHS $TRAN '?' $STATE $TRAN TPA$_EOS,TPA$_EXIT $END_STATE $INIT_STATE XST,XKT $STATE $TRAN 'ALL',XAS $TRAN TPA$_EOS,TPA$_EXIT,DISPLAY $TRAN TPA$_OCTAL,,DISPLAY $STATE XBS $TRAN COMMA $TRAN TPA$_EOS,TPA$_EXIT $STATE $TRAN TPA$_OCTAL,XBS,DISPLAY $STATE XAS $TRAN TPA$_EOS,TPA$_EXIT,DISPLAY $END_STATE .PSECT VGRP,NOWRT,SHR,PIC,LONG .ENTRY VGRP,^M TSTW TPA$L_NUMBER+2(AP) BEQL 1$ CLRL R0 1$: RET .END MAIN * * * Exercise for the reader: modify this program to correspond more closely to the DCL SHOW LOGICAL command, e.g. I should be able to type SHOWGROUP/GROUP=(1,10,20,77) FOO_BAR Don't bother turning in the homework; this is a pass/pass course. Next: How to read your DCL symbol table Enjoy! --Eric Face it. You can learn everything there is to know about Unix in a matter of weeks. VMS can keep you entertained for years. If we could get the United States Congress to design and implement an operating system, the documentation alone... ----------------------------------------------------------------- gopher://quux.org/ conversion by John Goerzen of http://communication.ucsd.edu/A-News/ This Usenet Oldnews Archive article may be copied and distributed freely, provided: 1. There is no money collected for the text(s) of the articles. 2. The following notice remains appended to each copy: The Usenet Oldnews Archive: Compilation Copyright (C) 1981, 1996 Bruce Jones, Henry Spencer, David Wiseman.