$ANALYZE/CRASH $ANALYZE/SYSTEM $CREATE FABRABNAM.MAR .TITLE FABRABNAM ; File_1. $FABDEF GLOBAL ; File Attributes $NAMDEF GLOBAL ; Name Attributes $RABDEF GLOBAL ; Record Attributes .END ^Z $MACRO/LIST/OBJECT=FABRABNAM.STB FABRABNAM.MAR SDA> READ FABRABNAM.STB. $CREATE XABKEYDEF.MAR .TITLE XABKEYDEF $XABKEYDEF GLOBAL XAB$B_BID:: .BYTE ^X15 .END ^Z $MACRO/NOLIST/OBJECT=XABKEYDEF.STB XABKEYDEF.MAR $ANALYZE/SYSTEM SDA>READ XABKEYDEF SDA>FORMAT/TYPE=XAB SDA>... $LIBRARY/EXTRACT=($XABKEYDEF)/OUTPUT=XABKEYDEF.MAR - SYS$LIBRARY:STARLET.MLB .MACRO $XABKEYDEF,$GBL ... .ENDM $XABKEYDEF GLOBAL ;<=== Add these lines XABKEY$B_BID:: .BYTE ^X15 ;<=== Add these lines .END $MACRO/NOLIST/OBJECT=XABKEYDEF.STB XABKEYDEF.MAR $ANALYZE/SYSTEM SDA>READ XABKEYDEF SDA>FORMAT/TYPE=XABKEY SDA> ... 000007F8 FAB$B_BID 03 000007F9 FAB$B_BLN 50 000007FA FAB$W_IFI 0002 000007FC FAB$L_FOP 00000000 00000800 FAB$L_STS 00010001 00000804 FAB$L_STV 000001A0 00000808 FAB$L_ALQ 00000006 0000080C FAB$W_DEQ 0000 0000080E FAB$B_FAC 02 0000080F FAB$B_SHR 00 00000810 FAB$L_CTX 00000000 00000814 FAB$B_RTV 00 00000815 FAB$B_ORG 20 00000816 FAB$B_RAT 02 00000817 FAB$B_RFM 01 00000818 FAB$B_JOURNAL 00 00000819 FAB$B_RU_FACILITY 00 0000081A 0000 ==> 0000081C FAB$L_XAB 000008A8 ==> 00000820 FAB$L_NAM 00000848 00000824 FAB$L_FNA 00000200 00000828 FAB$L_DNA 00000000 0000082C FAB$B_FNS 0A 0000082D FAB$B_DNS 00 0000082E FAB$W_MRS 0050 00000830 FAB$L_MRN 00000000 00000834 FAB$W_BLS 0000 00000836 FAB$B_BKS 02 00000837 FAB$B_FSZ 00 00000838 FAB$L_DEV 1C4D4108 0000083C FAB$L_SDC 1C4D4108 00000840 FAB$W_GBC 0000 00000842 FAB$B_ACMODES 00 00000843 FAB$B_RCF 00 000007B4 RAB$B_BID 01 000007B5 RAB$B_BLN 44 000007B6 RAB$W_ISI 0002 000007B8 RAB$L_ROP 00080600 RAB$B_ROP1 RAB$B_ROP2 RAB$B_ROP3 000007BC RAB$L_STS 00010001 000007C0 RAB$L_STV 00000000 RAB$W_STV0 RAB$W_STV2 000007C4 RAB$L_RFA0 00000000 RAB$W_RFA 000007C8 RAB$W_RFA4 0000 000007CA 0000 000007CC RAB$L_CTX 00000000 000007D0 0000 000007D2 RAB$B_RAC 00 000007D3 RAB$B_TMO 00 000007D4 RAB$W_USZ 0050 000007D6 RAB$W_RSZ 0050 ==> 000007D8 RAB$L_UBF 00000600 ==> 000007DC RAB$L_RBF 00000600 000007E0 RAB$L_RHB 00000000 000007E4 RAB$L_KBF 00000000 RAB$L_PBF ==> 000007E8 RAB$B_KSZ 00 RAB$B_PSZ 000007E9 RAB$B_KRF 00 000007EA RAB$B_MBF 00 000007EB RAB$B_MBC 00 000007EC RAB$L_BKT 00000000 RAB$L_DCT ==> 000007F0 RAB$L_FAB 000007F8 000007F4 RAB$L_XAB 00000000 $CREATE TEST-RMS.COB IDENTIFICATION DIVISION. PROGRAM-ID. TEST-RMS. ** ** Creation Date: 01-Jan-1990 ** Author: John Claxton, CompuServe/Collier-Jackson ** Modification History: ** ** Functional Description: ** ** This sample routine may be used to illustrate the ** contents of a file's attribute blocks. ** ** Implicit Inputs: NONE ** Implicit Outputs: NONE ** Side Effects: NONE ** ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN-FILE ASSIGN TO "INFILE.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS SEQUENTIAL FILE STATUS IS RMS-FILE-STAT. SELECT OUT-FILE ASSIGN TO "OUTFILE.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS RMS-FILE-STAT. DATA DIVISION. FILE SECTION. FD IN-FILE RECORD CONTAINS 80 CHARACTERS RECORD KEY IS IN-RECORD DATA RECORDS ARE IN-RECORD. 01 IN-RECORD PIC X(80). FD OUT-FILE RECORD CONTAINS 80 CHARACTERS DATA RECORDS ARE OUT-RECORD. 01 OUT-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 END-OF-1 PIC X(1). 01 RMS-FILE-STAT PIC X(2). PROCEDURE DIVISION. BEGIN-PARA. OPEN INPUT IN-FILE. OPEN OUTPUT OUT-FILE. PERFORM READ-IN-FILE UNTIL END-OF-1 = "Y" STOP RUN. READ-IN-FILE. READ IN-FILE AT END MOVE "Y" TO END-OF-1. MOVE IN-RECORD TO OUT-RECORD. IF END-OF-1 = "Y" NEXT SENTENCE ELSE PERFORM WRITE-OUT-FILE. WRITE-OUT-FILE. WRITE OUT-RECORD. Sample Run $ RUN TEST-RMS DBG>STEP 10 DBG>!Now login as another process ... At this point, another process may invoke SDA and examine the user's RMS data structures. For example: $ANALYZE/SYSTEM SDA>SHOW SUMMARY ...list of processes on the system - select the proper 'index' Extended Indx Process name Extended Indx Process name Username -- PID -- ---- --------------- ----------- (ETC...) 20200D0F 000F MYPROCESS SPT367JC ... rest of list SDA>SET PROCESS/INDEX=000F !The PID may also be used SDA>SET OUTPUT SDA_LOG.LIS !Trap output to a file SDA>SHOW PROCESS/RMS=(IFAB,FWA) !Log the IFABs and FWAs SDA>SET OUTPUT TT: !Return output to terminal SDA>SPAWN SEARCH SDA_LOG.LIS "NAME:","LAST_FAB:"/EXACT !Find the FAB address ! & File name LAST_FAB: 00148D08 NWA_PTR: 00000000 NAME: 00000002 / 00136CB6 .; ==> LAST_FAB: 000007F8 NWA_PTR: 00000000 ==> NAME: 0000000C / 001394B6 INFILE.DAT;2 LAST_FAB: 00000A54 NWA_PTR: 00000000 NAME: 0000000D / 0013BEB6 OUTFILE.DAT;7 $!Note the file of interest & the corresponding FAB address SDA>READ FABRABNAM.STB SDA>!FORMAT/TYPE=FAB SDA>FORMAT/TYPE=FAB 00007F8 ... (See Figure 1) ... SDA>!The file's FAB will be displayed in formatted form. SDA>!Included in the listing will be pointers to the file's SDA>!XAB address and NAM address, if they have been created. SDA>! SDA>!A similar method may be used to examine a file's RAB(s). SDA>SET OUTPUT SDA_LOG.LIS SDA>SHOW PROCESS/RMS=(IRAB,FWA) SDA>SET OUTPUT TT: SDA>SPAWN SEARCH SDA_LOG.LIS "NAME:","LAST_RAB:"/EXACT NAME: 00000002 / 00136CB6 .; LAST_RAB: 00148D68 NXTBDB: 00137AA0 ==> NAME: 0000000C / 001394B6 INFILE.DAT;1 ==> LAST_RAB: 000007B4 NXTBDB: 00000000 NAME: 0000000D / 0013C8B6 OUTFILE.DAT;6 LAST_RAB: 00000A10 NXTBDB: 0013D100 SDA>!Note the file of interest & the corresponding RAB address SDA>!FORMAT/TYPE=RAB SDA>FORMAT/TYPE=RAB 000007B4 ... (see Figure 2) ... SDA>!The file's RAB will be displayed in formatted form. SDA>!Included in the listing will be pointers to the file's SDA>!RBF and UBF. These are the Record Buffer area and User SDA>!Buffer area, used for input and output, respectively. SDA>!If the file is an indexed file, the KBF (key buffer area) SDA>!may also be examined to determine the current key used SDA>!during file I/O. Finally, the file's RAB pointer to the SDA>!FAB address will be listed. SDA>!Using the XAB address listed at address FAB$L_XAB, SDA>!determine the block type SDA>EXAMINE 8A8 SDA>BUG$_DECWINDOWS+00030: 00006415 ".d.." SDA>!Note the block type (^X15) and determine the XAB type. SDA>!See Table 1 for a list of XAB block identifier types. SDA>!In this case a XAB$B_BID = ^X15 means the XAB is a XABKEY SDA>READ XABKEYDEF SDA>FORMAT/TYPE=XABKEY 000008A8 ... (See Figure 3) ... SDA> $!CREATE A DATA FILE TO USE IN TESTING $CREATE BUILD-IN-FILE.COM $ OPEN/WRITE 1 INFILE.SEQ $ INREC1=F$FAO("!#(#AS)",80,1,"A") $ WRITE 1 INREC1 $ INREC1=F$FAO("!#(#AS)",80,1,"B") $ WRITE 1 INREC1 $ INREC1=F$FAO("!#(#AS)",80,1,"C") $ WRITE 1 INREC1 $ CLOSE 1 ^Z $!CREATE AN .FDL FILE $CREATE INFILE.FDL FILE ORGANIZATION indexed RECORD CARRIAGE_CONTROL carriage_return FORMAT fixed SIZE 80 KEY 0 CHANGES no PROLOG 3 SEG0_LENGTH 80 SEG0_POSITION 0 TYPE string ^Z $!CONVERT THE SEQUENTIAL FILE INTO AN INDEXED FILE $CONVERT/FDL=INFILE.FDL INFILE.SEQ INFILE.DAT 000008A8 XABKEY$B_BID 15 000008A9 000064 000008AC 00000000 000008B0 XABKEY$B_IAN 00 000008B1 XABKEY$B_LAN 00 000008B2 XABKEY$B_DAN 00 000008B3 XABKEY$B_LVL 01 000008B4 XABKEY$B_IBS 02 000008B5 XABKEY$B_DBS 02 000008B6 XABKEY$L_RVB 0005 000008B8 0000 000008BA XABKEY$B_FLG 80 000008BB XABKEY$B_DTP 00 000008BC XABKEY$B_NSG 01 000008BD XABKEY$B_NUL 00 000008BE XABKEY$B_TKS 50 000008BF XABKEY$B_REF 00 000008C0 XABKEY$W_MRL 0050 000008C2 XABKEY$W_IFL 0400 000008C4 XABKEY$W_DFL 0400 000008C6 XABKEY$W_POS 0000 XABKEY$W_POS0 000008C8 XABKEY$W_POS1 0000 000008CA XABKEY$W_POS2 0000 000008CC XABKEY$W_POS3 0000 000008CE XABKEY$W_POS4 0000 000008D0 XABKEY$W_POS5 0000 000008D2 XABKEY$W_POS6 0000 000008D4 XABKEY$W_POS7 0000 000008D6 XABKEY$B_SIZ 50 XABKEY$B_SIZ0 000008D7 XABKEY$B_SIZ1 00 000008D8 XABKEY$B_SIZ2 00 000008D9 XABKEY$B_SIZ3 00 000008DA XABKEY$B_SIZ4 00 000008DB XABKEY$B_SIZ5 00 000008DC XABKEY$B_SIZ6 00 000008DD XABKEY$B_SIZ7 00 000008DE 0000 000008E0 XABKEY$L_KNM 00000000 000008E4 XABKEY$L_DVB 00000003 000008E8 XABKEY$B_TYP 00 XABKEY$B_TYP0 000008E9 XABKEY$B_TYP1 00 000008EA XABKEY$B_TYP2 00 000008EB XABKEY$B_TYP3 00 000008EC XABKEY$B_TYP4 00 000008ED XABKEY$B_TYP5 00 000008EE XABKEY$B_TYP6 00 000008EF XABKEY$B_TYP7 00 000008F0 XABKEY$B_PROLOG 03 000008F1 000000 000008F4 XABKEY$L_COLTBL 00000000 000008F8 XABKEY$L_COLSIZ 00000000 000008FC XABKEY$L_COLNAM 00000000 Table 1. Block Identifiers For Extended Attribute Blocks Block Idents Value ------------ ----- XABALL$B_BID ^X14 XABCXF$B_BID ^X20 XABCXR$B_BID ^X21 XABDAT$B_BID ^X12 XABFHC$B_BID ^X1D XABITM$B_BID ^X24 XABJNL$B_BID ^X22 XABKEY$B_BID ^X15 XABPRO$B_BID ^X13 XABRDT$B_BID ^X1E XABRU$B_BID ^X23 XABSUM$B_BID ^X16 XABTRM$B_BID ^X1F