!*! Updated on 24-May-95 at 11:59 PM by James A. Jarboe I V; edit time: 0:58:53
!
!
! d/BASIC example of how to read USER.SYS without knowing the users
! name and use FNDUSR.SBR to do it to return variable information
! properly.
!
! Edit history:
! [100] 24-May-95 designed and implemented by James A. Jarboe IV
! to display reading USER.SYS without knowing user
! name and then using the found names to utilize
! FNDUSR.SBR because FNDUSR.SBR returns the offsets
! information in basic readable Floating point and
! strings so we don't have to do the RAD50 unpacks
! and/or binary conversions.
!
! -NOTES-
!
! COMPIL with COMPIL USRSYS/P to create USRSYS.LIT
! which will make possible to run as USRSYS from the AMOS dot.
!
!
PROGRAM USRSYS, 1.0(100)
!
! Define AMOS Map for FNDUSR.
!
MAP1 USER'MAP
MAP2 USER'NAME, S, 20
MAP2 USER'FLAGS, F, 6
MAP2 USER'ROOT'PPN, S, 10
MAP2 USER'ROOT'DEVICE, S, 10
MAP2 USER'MAIL'PPN, S, 10
MAP2 USER'MAIL'DEVICE, S, 10
MAP2 USER'MAIL'CPU, S, 10
MAP2 USER'PRIV, F
MAP2 USER'CLASS, F
MAP2 USER'EXP, F
MAP2 USER'CPU'TIME, F
MAP2 USER'CONNECT'TIME, F
MAP2 USER'KRAM, F
MAP2 USER'DISK'READS, F
MAP2 USER'DISK'WRITES, F
MAP2 USER'PAGES'PRINT, F
MAP2 USER'DFT'PROTECT, F
MAP2 USER'DFT'PRIORITY, F
MAP2 USER'DFT'LANGUAGE, S, 20
MAP2 USER'DFT'PROMPT, S, 20
! Define XCALL FNDUSR.SBR Errors to report.
!
MAP1 XC'ERR(4), S, 36
XC'ERR(1) = "Insufficient Memory for FNDUSR.SBR"
XC'ERR(2) = "Read File error in USER.SYS"
XC'ERR(4) = "Unable to locate user."
! Define maps for getting user name from USER.SYS
!
MAP1 USER'DATA, X, 512 ! Each Block in USER.SYS.
MAP1 USER'REC,@USER'DATA
MAP2 USER'NAME(4), X, 128 ! Each Record in a block (4).
MAP1 LOGON, S, 10 ! Current logon variable.
! Storage for Found user names.
! (Always make upper case so that sorting will always sort properly.
! We will display what we find which may be Upper/lower case.
!
MAP1 GOOD'USER(1000), S, 22 ! Room for 1000 records+null
! Adapt to taste.
! Define misc Floating point numbers we will use.
!
FLOAT FILE1, COUNT, USER'NUM, X, STATUS, X'ERROR, ANYKEY
! Report all errors.
!
on ERROR goto ERR'RPT
! Set file base to 1
!
FILEBASE 1
! Use d/basic read'only variables to
! check for logon. Must be logged into OPR to run.
!
LOGON = .device+"["+.account+"]"
! Report if user not in OPR: in low and high intensity.
!
when LOGON <> "DSK0:[1,2]"
dual.print "%Must be _logged_ in to _OPR:_ to run _USRSYS_"
end
wend
! Open file Exclusive like LOG and MUSER do but only while we are reading
! it then close it to allow others to access it. (Although FNDUSR will
! also lock it exclusively.
!
open #1,"USER.SYS", random, 512, FILE1
USER'NUM = 0 ! Preset user number for storage of found name.
FILE1 = 1 ! Preset index block of USER.SYS to skip.
! Read through file until we are finished.
!
do FILE1+=1 until FILE1 = 0
read #1, USER'DATA
COUNT = 0
do COUNT+=1 until COUNT > 4
when USER'NAME(COUNT)[1,4] = null$(4)
FILE1 = -1 ! Set so next loop will be 0
break ! break out of this do loop.
else
USER'NUM+=1
GOOD'USER(USER'NUM) = UCS(rtrim(USER'NAME(COUNT)))
wend
enddo
enddo
! Close data file.
!
CLOSE #1
! Use d/basic in memory sort if we find more than 1 user.
!
when COUNT > 1
sort.memory USER'NUM records of GOOD'USER(1) using GOOD'USER(1)
wend
X=0
! Do the xcall and reporting for all records we found.
!
do X+=1 until X > USER'NUM
xcall FNDUSR, GOOD'USER(X), STATUS, USER'MAP
when STATUS = 0
call PRINT'USER
else
call XCALL'ERROR
when STATUS < 0
end
wend
wend
enddo
FINI:
? "Finished"
END
! Print out what or how you want.
!
PRINT'USER:
! Print it in columns.
!
? ljust(USER'NAME,24); ! Left justify within 24 chars.
? rjust(USER'ROOT'DEVICE,10); ! Right justify within 10 chars.
? ljust(USER'ROOT'PPN,12); ! left justify within 12 chars.
?
return
! Report XCALL ERROR, Pause and return
!
XCALL'ERROR:
X'ERROR = STATUS + 3
? chr$(7)
dual.print tab(24,1);"%_XCALL_ Error:_";XC'ERR(X'ERROR);" ";
? "..Press any key to continue";tab(-1,29);
reset echo ! Disable terminal input echo
ANYKEY = getkey(-1) ! Wait for any key.
set echo ! Enable terminal input echo.
? tab(-1,28); ! Turn cursor back on.
return ! Return to caller.
! Use d/basic's English language error reporting.
!
ERR'RPT:
dual.print "%_Error_:_";ERRMSG(ERR(0))
end