C DISKUSAGE - LAST MODIFIED 15MAY81 - RDT C C A PROGRAM TO READ A PIP /TB LISTING OF THE DISK UTILIZATION BY ALL C GROUPS AND USERS OF THE DCAC PDP 11/70 FACILITY. IT PRODUCES A C SUMMARY TABLE LISTING THE NUMBER OF FILES, BLOCKS USED AND ALLOCATED C FOR EACH USER, AND TOTALS FOR EACH GROUP. THE BLOCKS ALLOCATED BY C EACH GROUP ARE COMPARED WITH ITS ASSIGNED VALUE. C C LLOYD A. TREINISH C CODE 934 C NASA/GSFC C GREENBELT, MD 20771 C OCTOBER 1979 C C 15-MAY-81 - MODIFIED TO CHANGE THE NAME OF THE INPUT FILE CONTAINING C THE DISK SPACE ALLOTMENT NUMBERS TO DISKUSAGE.DAT; TO CHANGE C THE MEANING OF THE FIRST NUMBER OF EACH RECORD OF THAT FILE C TO BE THE DISK DRIVE UNIT NUMBER RATHER THAN THE UNIT NUMBER C PLUS ONE; TO CHANGE THE PIP /TB LISTING FILE NAME TO C TOTALBLK.DAT AND THE TABLE OUTPUT FILE NAME TO TOTALBLK.TBL; C TO READ IN THE DISK DEVICE TYPE FROM THE FIRST RECORD OF C DISKUSAGE.DAT. C C BOB TURKELSON C NASA/GODDARD SPACE FLIGHT CENTER C CODE 935 C GREENBELT, MD 20771 C (301) 344-5003 C C NOTES: C C THE FORMAT OF THE DISKUSAGE.DAT RECORDS: C C FIRST RECORD: C C BYTES 1-2 DISK DRIVE DEVICE NAME (E.G., 'DB') C C FOLLOWING RECORDS: C C BYTE 2 DISK DRIVE UNIT NUMBER C BYTES 4-6 GROUP NUMBER C BYTES 8-10 DISK SPACE ALLOTMENT IN C THOUSANDS OF BLOCKS C C C TO COMPILE AND BUILD: C C F4P DISKUSAGE,DISKUSAGE/NOSP=DISKUSAGE C TKB DISKUSAGE,DISKUSAGE/NOSP=DISKUSAGE C C C LOGICAL*1 INPREC(132), DATTIM(15), TEMP(132), 1 MEMBER(3), FIRST, FF, MESSAG(26) INTEGER*2 NUMFIL, DRIVE, GROUP, DEVTYP INTEGER*4 TOTALS(3), BLKUSD, BLKALL, GRPASG, ASSIGN DATA LENGTH/132/, FIRST/.TRUE./, TOTALS/3*0/ C C OPEN INPUT AND OUTPUT FILES. C OPEN(UNIT=1, NAME='TOTALBLK.DAT', TYPE='OLD', READONLY, 1 RECORDSIZE=132, ERR=140) OPEN(UNIT=2, NAME='TOTALBLK.TBL', RECORDSIZE=132, ERR=150) OPEN(UNIT=3, NAME='DISKUSAGE.DAT', TYPE='OLD', READONLY, 1 RECORDSIZE=10, ERR=60) C READ FIRST RECORD TO FIND OUT DEVICE TYPE READ (3, 165, ERR=60) DEVTYP WRITE (2, 170) READ (1, 180, END=160, ERR=140) LENGTH, FF BACKSPACE 1 C C GET AN INPUT FILE RECORD. C 10 DO 15 I = 1, 132 15 INPREC(I) = ' ' READ (1, 180, END=160, ERR=140) LENGTH, (INPREC(I), I = 1, LENGTH) IF (FIRST) GO TO 30 IF (INPREC(1).NE.FF) GO TO 50 C C IF THE CURRENT RECORD'S GROUP DIFFERS FROM THE PREVIOUS RECORD'S C GROUP (I.E. EACH GROUP REPORT IS SEPARATED BY A FORM FEED) THEN C OUTPUT TOTALS OF PREVIOUS GROUP AND RESET TOTALS TO ZERO FOR CUR- C RENT GROUP. C ASSIGN = GRPASG(DRIVE, GROUP) IF (TOTALS(3).LE.ASSIGN) ENCODE(26, 185, MESSAG) IF (TOTALS(3).GT.ASSIGN) ENCODE(26, 190, MESSAG) TOTALS(3) - ASSIGN WRITE (2, 195) GROUP, DEVTYP, DRIVE, TOTALS, ASSIGN, MESSAG DO 20 I = 1, 3 20 TOTALS(I) = 0 30 FIRST = .FALSE. C C SHIFT THE CURRENT RECORD THREE BYTES TO THE RIGHT IF IT DOES NOT C REPRESENT A THE OCCURRENCE OF A NEW GROUP. THIS WILL ALLOW THE C IDENTIFICATION OF A RECORD TYPE BY THE EXAMINATION OF ONLY THE C FIFTH BYTE OF THE RECORD. C DO 40 I = LENGTH, 2, -1 40 IF (I.LE.117) INPREC(I + 3) = INPREC(I) C C PROCESS A "STORAGE USED/ALLOCATED..." RECORD. C 50 IF (INPREC(5).NE.'S') GO TO 90 C C GET DRIVE NUMBER, GROUP NUMBER, MEMBER AND DATE/TIME OF LISTING. C DECODE(LENGTH, 200, INPREC) DRIVE, GROUP DO 55 I = 1, 3 55 MEMBER(I) = ' ' NUMDIG = 1 IF (GROUP.GE.100) NUMDIG = 3 IF (GROUP.LT.100.AND.GROUP.GE.10) NUMDIG = 2 DO 60 I = 48 + NUMDIG, 54 IF (INPREC(I).EQ.']') GO TO 70 60 MEMBER(I - NUMDIG - 47) = INPREC(I) 70 DO 80 J = I + 3, I + 17 80 DATTIM(J - I - 2) = INPREC(J) C C IF THE DAY OF MONTH IS ONLY A SINGLE DIGIT THEN BLANK OUT THE LAST C CHARACTER OF DATTIM. C IF (DATTIM(2).EQ.'-') DATTIM(15) = ' ' GO TO 10 C C PROCESS A "TOTAL..." RECORD - LOGICALLY FOLLOWS "STORAGE..." C RECORD. C 90 IF (INPREC(5).NE.'T') GO TO 10 C C DETERMINE LOCATION OF FIELDS OF INTEREST. C DO 100 I = 14, LENGTH IF (INPREC(I - 1).EQ.'G'.AND.INPREC(I).EQ.'R') 1 GO TO 105 IF (INPREC(I - 1).EQ.'.'.AND.INPREC(I).EQ.'/') 1 J = I - 2 IF (INPREC(I - 2).EQ.'.'.AND.INPREC(I - 1).EQ.' ' 1 .AND.INPREC(I).EQ.'B') K = I - 3 100 IF (INPREC(I - 2).EQ.'.'.AND.INPREC(I - 1).EQ.' ' 1 .AND.INPREC(I).EQ.'F') L = I - 3 C C GET BLOCKS USED, BLOCKS ALLOCATED AND NUMBER OF FILES. C 105 DO 110 I = 14, J 110 TEMP(I - 13) = INPREC(I) DECODE(J - 13, 210, TEMP) BLKUSD TOTALS(2) = TOTALS(2) + BLKUSD DO 120 I = J + 3, K 120 TEMP(I - J - 2) = INPREC(I) DECODE(K - J - 2, 220, TEMP) BLKALL TOTALS(3) = TOTALS(3) + BLKALL DO 130 I = K + 13, L 130 TEMP(I - K - 12) = INPREC(I) DECODE(L - K - 12, 230, TEMP) NUMFIL TOTALS(1) = TOTALS(1) + NUMFIL WRITE (2, 240) GROUP, MEMBER, DEVTYP, DRIVE, DATTIM, NUMFIL, 1 BLKUSD, BLKALL GO TO 10 C C ERROR/EOF CONDITIONS - CLEANUP AND QUIT WITH MESSAGE. C 140 STOP 'I/O ERROR ON INPUT FILE' 150 STOP 'I/O ERROR ON OUTPUT FILE' 160 TYPE *, 'EOF ON INPUT' ASSIGN = GRPASG(DRIVE, GROUP) IF (TOTALS(3).LE.ASSIGN) ENCODE(26, 185, MESSAG) IF (TOTALS(3).GT.ASSIGN) ENCODE(26, 190, MESSAG) TOTALS(3) - ASSIGN WRITE (2, 195) GROUP, DEVTYP, DRIVE, TOTALS, ASSIGN, MESSAG CLOSE(UNIT=1) CLOSE(UNIT=2) STOP C 165 FORMAT (A2) 170 FORMAT ('1', T11, 'GROUP', T19, 'MEMBER', T28, 'DISK', T39, 1 'DATE/TIME', T55, '# OF', T63, '# OF BLOCKS', T77, '# OF BLOCKS', 2 T91, 'GROUP BLOCKS'/T28, 'DRIVE', T55, 'FILES', T67, 'USED', T78, 3 'ALLOCATED', T93, 'ASSIGNED'/) 180 FORMAT (Q, A1) 185 FORMAT (26(' ')) 190 FORMAT ('OVER LIMIT BY ', I5, ' BLOCKS') 195 FORMAT (2X, 'TOTALS', T12, I3, T29, A2, I1, T55, I5, T66, I6, T79, 1 I6, T94, I6, T104, 26A1/) 200 FORMAT (T44, I1, 2X, I3) 210 FORMAT (I) 220 FORMAT (I) 230 FORMAT (I) 240 FORMAT (T12, I3, T20, 3A1, T29, A2, I1, T36, 15A1, T55, I5, T66, 1 I6, T79, I6) END INTEGER*4 FUNCTION GRPASG (IDEVIC, IGROUP) C C ROUTINE TO RETURN NUMBER OF BLOCKS ASSIGNED FOR A GIVEN GROUP C ON A GIVEN DISK DRIVE. C LOGICAL*1 FIRST INTEGER*2 DRIVE, IDEVIC, IGROUP INTEGER*4 GROUPS(40, 3, 2) DATA FIRST/.TRUE./, GROUPS/240*0/ C C ON FIRST CALL GET ASSIGNMENT DATA FROM A FILE. C IF (.NOT.FIRST) GO TO 30 FIRST = .FALSE. I = 1 10 READ (3, 70, END=20, ERR=60) DRIVE, (GROUPS(I,DRIVE+1,J), J = 1, 2) I = I + 1 IF (I.LE.40) GO TO 10 20 CLOSE(UNIT=3) 30 DO 40 K = 1, I IF (GROUPS(K, IDEVIC + 1, 1).EQ.IGROUP) GO TO 50 40 CONTINUE GRPASG = 0 RETURN 50 GRPASG = GROUPS(K, IDEVIC + 1, 2)*1000 RETURN 60 STOP 'I/O ERROR ON SPACE ASSIGNMENT FILE' C 70 FORMAT (1X, I1, 2(1X, I3)) END