List.Path.Readu
From Pickwiki
Jump to navigationJump to search
This program reads in list.readu output and changes the device number and inode to pathname. Needs program dskdevno.c compiled and available. Others call it devices.c. The output is path space device number. The paths are the attached file systems.
Requires a file: INODE.XREF to be built in a common area. Make pointers in other VOCs where needed:
INODE.XREF 0001: F 0002: /pathto/common/area[[/INODE]].XREF 0003: /pathto/common/area[[/D_INODE]].XREF
If you know the number of files on your system, divide by 20, make prime, resize to that modulo with a sep of 4. If you don't know at all use 10007. After filling it up, do file.stat and resize to better design.
Usage:
>RUN XBP LIST.PATH.READU [REBUILD | [EVERY | "" ] ] [ WRAP ]
Note: you may rescale the width of the display for pathname by changing the size of ADJ variable in the program, Line: 170, 176, & 181. For wide, wrap, and normal.
*----------------------------------------------------------------------- * TITLE: LIST.PATH.READU * AUTH: Rich Sias * DATE: 05/15/2003 * ID: LIST.PATH.READU *----------------------------------------------------------------------- *Narrative: *---------------------- * Takes LIST.READU command and detemines pathname from device number * and inode. Alters display depending on screen width. *----------------------------------------------------------------------- * EXT CALLS NONE * FILES READ: INODE.XREF * FILES UPDATE: INODE.XREF * CONSTANTS UPDATE: NONE * RESTART INSTRUCTIONS NONE *----------------------------------------------------------------------- * MODIFICATIONS * mm-dd-yy Login (sar######) Description * *----------------------------------------------------------------------- * * include section: "COMMON" include files should be preceded * "EQUATES" include files *----------------------------------------------------------------------- $INCLUDE MERCY.COMMON STANDARD.EQUATES *----------------------------------------------------------------------- * equate section *----------------------------------------------------------------------- *----------------------------------------------------------------------- * initialization section: do not include variables that are *---------------------- re-initialized prior to usage ------------------ *----------------------------------------------------------------------- PROG.ID = "LIST.PATH.READU" *----------------------------------------------------------------------- * open-file section: use OPEN.FILE routine to open files *----------------------------------------------------------------------- *----------------------------------------------------------------------- * main program body *----------------------------------------------------------------------- GET(ARG.) COND ELSE COND = "" BEGIN CASE CASE COND = "REBUILD" GOSUB REBUILD CASE COND = "SILLY" CASE COND = "FUFU" CASE 1 GOSUB LIST.READU END CASE RETURN * This is the final return and should cause the logic to exit the pgm *----------------------------------------------------------------------- * subroutines: include desc ( function, variables used and changed, etc) *----------------------------------------------------------------------- ******************** $INCLUDE HELP ******************** ************** REBUILD: ************** * Clear then open the data file. ECMD = "CLEAR.FILE INODE.XREF" EXECUTE ECMD OPEN "INODE.XREF" TO XREF ELSE STOP 204,"INODE.XREF" * Gather disk device numbers for all file systems. UNIX = 'dskdevno.3k|grep -v mirror' EXECUTE "SH -c":QUOTE(UNIX),/[[/OUT]].>CAP CAP = CONVERT(" ",@VM,TRIM(CAP)) KNT = DCOUNT(CAP,@FM) * Weed out blank & root responses. IF CAP<KNT,1> < " " THEN CAP = FIELD(CAP,@FM,2,KNT-2) KNT -= 2 END ELSE CAP = FIELD(CAP,@FM,2,KNT-1) KNT -= 1 END IF CAP<KNT,1> < " " THEN CAP = FIELD(CAP,@FM,1,KNT-1) KNT -= 1 END * Initialize conditions. DAMT = KNT J = 0 *** (DIRS.TO.CHK is a mv string with all the file systems) * First value is path, second is device number. DIRS.TO.CHK = CAP OK = 1 * Loop through all file systems. FOR I = 1 TO DAMT * Get working dir and device number. DIR = DIRS.TO.CHK<I,1> DIR1 = DIR DEVNO = DIRS.TO.CHK<I,2> * Get the inodes of all items in file system. STMT = 'sh -c "ls -lRi ':DIR:'"' EXECUTE STMT CAPTURING DIR.REC VAMT = DCOUNT(DIR.REC,@FM) DIR.REC = CHANGE(TRIM(DIR.REC)," ",@VM) CRT I, DAMT, VAMT, J, DIR * Loop through all items in file system. FOR J = 1 TO VAMT LINE = DIR.REC<J> BEGIN CASE CASE LINE EQ "" * Empty line. CASE LINE<1,1>[1,1] EQ "/" * Line has new dir name. * OK means local path, not a mount point. IF OK THEN OLD.DIR = "PASS" FLIP = 0 LOD = LEN(OLD.DIR) DIR1 = FIELD(LINE<1,1>,":",1) * Check if dir is a mount point. FIND DIR1 IN DIRS.TO.CHK SETTING BEGN,PTR THEN OK = 0 * Retain old mount point dir. OLD.DIR = DIR1 END ELSE * Check if new dir is sub dir of interim mount pt. IF OLD.DIR = DIR1[1,LOD] THEN OK = 0 ELSE OK = 1 END CASE LINE<1,11> # "" * Line begins with device number. IF OK THEN * OK means is not a mount point within file system. INODE = LINE<1,2> FNAM = LINE<1,11> PATH = DIR1:"/":FNAM WRITE PATH ON XREF,DEVNO:"*":INODE ELSE CRT 'BAD DEAL ':PATH END CASE 1 END CASE * --- * bla bla bla - I go create an xref file, (I did it above.) * --- NEXT J NEXT I RETURN ************ LIST.READU: ************ WRAP = 0 OPEN "INODE.XREF" TO XREF ELSE STOP 204,"INODE.XREF" * Get all pass parameters. GET(ARG.) COND1 THEN IF COND1 = "WRAP" THEN WRAP = 1 ; COND1 = "" END ELSE COND1 = "" GET(ARG.) COND2 THEN IF COND2 = "WRAP" THEN WRAP = 1 ; COND2 = "" END ELSE COND2 = "" GET(ARG.) COND3 THEN IF COND3 = "WRAP" THEN WRAP = 1 ; COND3 = "" END ELSE COND3 = "" * Set size parameters for formatting. ADJ is for width of output. BEGIN CASE CASE WRAP * Allows full path and all data to be shown. ADJ = 30 GWID = ADJ + 12 PWID = ADJ + 7 RWID = ADJ - 4 CASE @CRTWIDE > 97 * For wide screen support, no wraps and full formatting. ADJ = 30 GWID = ADJ + 12 PWID = ADJ + 7 RWID = ADJ + 7 CASE 1 ADJ = 26 * For little screens just let letters wrap to beginng of line. GWID = ADJ + 12 PWID = ADJ + 7 RWID = ADJ + 7 END CASE * Get list.readu data. ECMD = "LIST.READU ":COND:" ":COND1:" ":COND2:" INTERNAL" EXECUTE ECMD,/[[/OUT]].>GRAB * Make up header info for list.readu. HDRF = "Active File Locks:'L'":SPACE(RWID- 9):"Pathname " HDRF := '[[UsrNo]] Lmode Pid Login ID' HDRG = "Active Group Locks:":SPACE(GWID) HDRG := "Rec Grp Grp Grp'L'":SPACE(RWID- 8):"Pathname " HDRG := '[[UsrNo]] Lmode G-Address Lcks .RD' HDRG := ' .SH .EX' HDRR = "Active Record Locks:'L'":SPACE(RWID- 8):"Pathname " HDRR := '[[UsrNo]] Lmode Pid Login ID Item-ID' OLD.CT = 0 ; * Determines when to print revised hea der. * Ignore the last "field" (line), it is empty. KNT = COUNT(GRAB,@FM) FOR I = 1 TO KNT LCT = DCOUNT(GRAB<I>,@VM) IF OLD.CT # LCT THEN * Need new header info printed. BEGIN CASE CASE LCT EQ 9 HEADING HDRF OLD.CT = LCT CASE LCT EQ 12 HEADING HDRG IF I > 2 THEN HDG = EREPLACE(HDRG,"'L'",@FM) PRINT PRINT HDG<1> PRINT HDG<2> END OLD.CT = LCT CASE LCT EQ 10 HEADING HDRR IF I > 2 THEN * GOSUB PRT.HDR HDG = EREPLACE(HDRR,"'L'",@FM) PRINT PRINT HDG<1> PRINT HDG<2> END OLD.CT = LCT CASE 1 END CASE END * Read path info from XREF file. READ PATH FROM XREF,GRAB<I,1>:"*":GRAB<I,2> ELSE PATH = ' bum deal' * Begin printing. PRINT FMT(PATH,PWID:"R"): * Check for wrap (fold) condition. IF WRAP THEN CRT CRT SPACE(RWID): END * Print second third of output. PRINT GRAB<I,4>"6R":GRAB<I,5>"3R":GRAB<I,6>"3R": BEGIN CASE CASE LCT EQ 9 CRT GRAB<I,7>"6R":GRAB<I,8> CASE LCT EQ 12 CRT GRAB<I,7>"11R":GRAB<I,8>"4R": CRT GRAB<I,9>"4R":GRAB<I,10>"4R":GRAB<I,11>"4R" CASE LCT EQ 10 CRT GRAB<I,7>"6R":GRAB<I,8>"9R":" ":GRAB<I,9> CASE 1 CRT ' LCT = ':LCT END CASE NEXT I RETURN ************ TERMINATION: ************ PRINT 'Terminating now ' STOP * last statement in a program don't add code after this line