1 ! ! R E A C T 2! PROGRAM : REACT.BAS 5! VERSION : V06C 6! EDIT : 03 7! EDIT DATE : 30-NOV-77 10 EXTEND 11 ! ! C O P Y R I G H T ! Copyright (C) 1974, 1975, 1976, 1977 by ! Digital Equipment Corporation, Maynard, Mass. ! ! ! This software is furnished under a license and may be used and ! copied only in accordance with the terms of such license and ! with the inclusion of the above copyright notice. This ! software or any other copies thereof may not be provided or ! otherwise made available to any other person. No title to and ! ownership of the software is hereby transferred. ! ! The information in this software is subject to change without ! notice and should not be construed as a commitment by Digital ! Equipment Corporation. ! ! DIGITAL assumes no responsibility for the use or reliability ! of its software on equipment that is not supplied by DIGITAL. ! !******************************************************************* 20 ! ! M O D I F I C A T I O N H I S T O R Y 21! VER/ED EDIT DATE REASON ! 50 ! ! U S E R M O D I F I C A T I O N S ! 51 ! DATE AUTHOR REASON 6/15/78 JIM GREGORY ROUTINES WERE ADDED FOR GROUP CREATION AND DELETION OF ACCOUNTS TO FACILITATE ASSIGNING AND DELETING ACCOUNTS FOR CLASSES AT WITTENBERG UNIVERSITY. LINES 2500-2540 FOR CREATING ACCOUNTS LINES 4500-4530 FOR DELETING ACCOUNTS THE FUNCTION FNP$ AT LINE 16600 CREATES A RANDOM 4 CHARACTER PASSWORD FOR THE ACCOUNTS TO BE CREATED. A LISTING OF THE PPN'S AND PASSWORDS IS PRINTED TO GIVE THE INSTRUCTOR TO ASSIGN THE ACCOUNTS TO STUDENTS IN DELETING GROUPS OF ACOUNTS, THE ACCOUNTS ARE FIRST ZEROED THEN DELETED ONLY PROJECTS IN THE RANGE 101 TO 199 MAY BE DELETED IN THIS MANNOR, AND AS A FURTHUR PRECAUTION, CONFIRMATION OF THE DELETION CRITERIA IS REQUIRED. ! 100 ! ! G E N E R A L D E S C R I P T I O N 110! REACT ALLOWS A PRIVILEGED USER TO CREATE AND DELETE ACCOUNTS ! FROM EITHER THE SYSTEM DEVICE IN THE PUBLIC STRUCTURE OR ! INDIVIDUAL DISKS. 300 ! ! I / O C H A N N E L S 301! CHANNEL # USED FOR ! ! 1 ACCESSING $ACCT.SYS 400 ! ! V A R I A B L E D E F I N I T I O N S 401! VARIABLE NAME USED FOR ! 410! CLSTR% CLUSTERSIZE ! DISK$ DEVICE TO USE IN GROUP ROUTINES ! E3% ACCOUNT ENTER SUCCESS/FAILURE FLAG ! END.PROG% END PROGRAMMER # IN GROUP REOUTINES ! FUN% USER DESIRED FUNCTION ! G$ INPUT VARIABLE FOR GROUP ROUTINES ! I$ VERSION/EDIT LEVEL ! I% UTILITY VARIABLE ! J% FNP$ VARIABLE ! M%(),M$ USED IN SYS CALLS ! NM$ ACCOUNT NAME ! P$ DISK:PASSWORD ! P1$ FNP$ VARIABLE ! PROG% PROGRAMMER NUMBER ! PROJ% PROJECT NUMBER ! QTA,QTA% QUOTA 800 ! ! F U N C T I O N / S U B R O U T I N E D E S C . 801! FUNCTION/SUBROUTINE USE ! 810! FNM% VERIFY USER ENTERED FUNCTION, I.E., IF ! "ENTER", ALLOW ONLY E, EN,ENT,ENTE, OR ENTER ! FNP$ CREATE A RANDOM 4 CHARACTER PASSWORD 900 ! ! D I M E N S I O N S T A T E M E N T S 910 DIM M%(30%) ! USED FOR SYS CALLS 999 ! ! M A I N C O D I N G A R E A 1000 PRINT IF POS(0%)<>0% ! RETURN KB TO LEFT MARGIN 1010 I$="V06C-03" ! SET UP VERSION/EDIT NUMBER 1020 PRINT "REACT "+I$+CHR$(9%)+ CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(0%)),3%),4%)+ CHR$(13%)+CHR$(10%)+"System Account Manager" ! PRINT THE SYSTEM HEADER 1030 ON ERROR GOTO 0 \ CLOSE 1% \ ON ERROR GOTO 19000 \ INPUT "Function";P$ \ P$=CVT$$(P$,-1%) \ FUN%=FNM%("ENTER DELETE STANDARD",1%) \ IF FUN%=69% THEN 2000 ELSE IF FUN%=83% THEN 3000 ELSE IF FUN%=68% THEN 4000 ELSE PRINT "?Illegal Command" \ GOTO 1030 ! GET THE FUNCTION DESIRED AND GOTO THE PROPER ROUTINE. ! NOT E(NTER), S(TANDARD), OR D(ELETE). 2000 ! ! E N T E R A N A C C O U N T 2005 INPUT 'GROUP ';G$ \ GOTO 2500 IF ASCII(G$)=89% ! CHECK IF GROUP ENTRY OF ACCOUNTS ! 2010 OPEN "$ACCT.SYS" AS FILE 1%, MODE 2% ! OPEN THE FILE IN APPEND MODE. 2020 ON ERROR GOTO 19000 \ INPUT "Proj,Prog";PROJ%,PROG% \ GOTO 2020 IF PROJ%<1% OR PROJ%>254% OR PROG%<0% OR PROG%>254% \ ON ERROR GOTO 0 \ INPUT "Disk:Password";P$ \ INPUT "Quota";QTA \ INPUT "Cluster Size";CLSTR% \ PRINT "Account Name"; \ INPUT LINE NM$ \ NM$='NO ACCOUNT NAME'+CHR$(13%)+CHR$(10%) IF CVT$$(NM$,-1%) = '' \ E3%=-1% \ GOSUB 10110 \ IF E3%<>0% THEN PRINT #1%,PROJ%;",";PROG%;",";P$;",";QTA;",";CLSTR%;",";NM$; ! IF NO ERROR, ENTER IN $ACCT.SYS 2030 ON ERROR GOTO 0 \ GOTO 2020 2500 ! G R O U P E N T R Y O F A C C O U N T S ! 2510 OPEN '$ACCT.SYS' AS FILE 1%, MODE 2% ! OPEN FILE IN APPEND MODE. 2520 ON ERROR GOTO 19000 \ INPUT 'Proj, beginning Prog, ending Prog ';PROJ%,PROG%,END.PROG% \ GOTO 2520 IF PROJ%<1% OR PROJ%>254% OR PROG%<0% OR PROG%>254% OR END.PROG%254% \ ON ERROR GOTO 0 \ INPUT 'DISK ';DISK$ \ INPUT 'QUOTA FOR GROUP ';QTA \ INPUT 'CLUSTER SIZE FOR GROUP ';CLSTR% \ PRINT 'GROUP NAME '; \ INPUT LINE NM$ \ NM$='NO ACCOUNT NAME'+CHR$(13%)+CHR$(10%) IF CVT$$(NM$,-1%) = '' ! GET PROJECT # AND PROGRAMMER RANGE QUOTA AND CLUSTERSIZE FOR GROUP GROUP NAME FOR ALL ACCOUNTS ! 2530 INPUT 'PAUSE ';G$ \ PRINT \ PRINT \ PRINT ' PPN ','PASSWORD','QUOTA','FOR' \ PRINT ! ALLOW POSITION OF PAPER TO PRINT OUT LIST ! 2540 FOR PROG%=PROG% TO END.PROG% \ P$=DISK$+FNP$ \ E3%=-1% \ GOSUB 10110 \ IF E3%<>0% THEN PRINT #1%, PROJ%;',';PROG%;',';P$;',';QTA;','; CLSTR%;',';NM$; \ PRINT PROJ%;',';PROG%,P$,QTA,NM$ ! 2560 ON ERROR GOTO 0 \ NEXT PROG% \ GOTO 2520 ! CREATE PASSWORDS ENTER ACCOUNTS ! 3000 ! ! S T A N D A R D 3010 ON ERROR GOTO 3900 \ OPEN "$ACCT.SYS" FOR INPUT AS FILE 1% ! SET TRAP IN CASE OF OPEN ERROR; OPEN THE FILE. 3020 ON ERROR GOTO 3800 \ INPUT #1%,PROJ%,PROG%,P$,QTA,CLSTR%,NM$ \ IF PROG%=1% AND (PROJ%=1% OR PROJ%=0%) THEN PRINT "Account [";NUM1$(PROJ%);",1] being bypassed" \ GOTO 3020 ! GET THE PROJ,PROG,DISK:PASS,QUOTA,CLUSTER,ACCT NAME. ! CHECK FOR (*,1). 3030 IF PROJ%=1% AND PROG%=2% AND INSTR(1%,P$,":")=0% THEN PRINT "Account [1,2] on System Disk being bypassed" \ GOTO 3020 ! CHECK FOR (1,2) ON THE SYSTEM DISK. 3040 GOSUB 10110 ! GO AND TRY TO CREATE THIS ACCOUNT. 3050 GOTO 3020 ! KEEP GOING TILL WE HIT THE END OF THE ACCOUNT FILE. 3800 RESUME 3810 ! PROBLEM WITH THE READ OR END OF FILE. 3810 IF ERR<>11% THEN PRINT "Account File Read Error" ELSE PRINT "All Accounts in Account File are now Entered" ! LET THE USER KNOW WHICH IT WAS. 3820 GOTO 1030 ! GO BACK AND REPROMPT USER. 3900 RESUME 3910 ! COULDN'T OPEN THE ACCOUNT FILE. 3910 PRINT "Account File OPEN Error" \ GOTO 1030 ! LET THE USER KNOW AND REPROMPT. 4000 ! ! D E L E T E A N A C C O U N T 4005 INPUT 'GROUP DELETIONS ';G$ \ GOTO 4500 IF ASCII(G$)=89% ! CHECK FOR GROUP DELETIONS ! 4010 ON ERROR GOTO 19000 \ INPUT "Proj,Prog";PROJ%,PROG% \ GOTO 4010 IF PROJ%<1% OR PROJ%>254% OR PROG%<0% OR PROG%>254% \ ON ERROR GOTO 0 \ INPUT "Disk";P$ ! GET ALL THE INPUT AND VERIFY THE PPN. ! CTRL/Z ON PPN GOES TO READY. 4020 ON ERROR GOTO 4900 \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+P$) TO M% \ M%(0%)=30% \ M%(1%)=6% \ M%(2%)=1% \ M%(7%)=PROG% \ M%(8%)=PROJ% \ CHANGE M% TO M$ \ M$=SYS(M$) \ ON ERROR GOTO 0 \ GOTO 4010 ! TRY TO DELETE THE ACCOUNT. ! REPROMPT IF OK. 4500 ! G R O U P D E L E T I O N S ! 4510 ON ERROR GOTO 19000 \ INPUT 'Proj, beginning Prog, ending Prog ';PROJ%,PROG%,END.PROG% \ GOTO 4510 IF PROJ%<101% OR PROJ%>199% OR PROG%<0% OR PROG%>254% OR END.PROG%254% \ ON ERROR GOTO 0 \ INPUT 'DISK ';DISK$ ! GET PROJECT # AND PROGRAMMER RANGE GET DISK ALLOW DELETE OF GROUPS ONLY BETWEEN PROJECTS 101 AND 199 ! 4515 PRINT \ PRINT \ PRINT 'YOU HAVE SELECTED PROJECT ';PROJ%;' PROGRAMMER '; PROG%;' THROUGH ';END.PROG% \ PRINT \ PRINT 'ACCOUNTS WILL BE ZEROED BEFORE DELETION' \ PRINT \ INPUT 'ENTER A YES TO PROCEED WITH DELETION ';G$ \ GOTO 4510 IF G$<>'YES' ! VERIFY ACCOUNTS FOR DELETION ! 4520 FOR PROG%=PROG% TO END.PROG% \ ON ERROR GOTO 4900 ! & ! FIRST ZERO ACCOUNT & ! & \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+DISK$) TO M% \ M%(0%)=30% \ M%(1%)=6% \ M%(2%)=13% \ M%(5%)=PROG% \ M%(6%)=PROJ% \ CHANGE M% TO M$ \ M$=SYS(M$) ! & ! NOW DELETE ACCOUNT & ! & \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+DISK$) TO M% \ M%(0%)=30% \ M%(1%)=6% \ M%(2%)=1% \ M%(7%)=PROG% \ M%(8%)=PROJ% \ CHANGE M% TO M$ \ M$=SYS(M$) \ ON ERROR GOTO 0 ! ! 4530 NEXT PROG% \ GOTO 4510 ! ZERO AND DELETE GROUPS OF ACCOUNTS ! 4900 RESUME 4910 ! ERROR ON THE DELETE. 4910 PRINT CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)),3%),4%); " - Failure to DELETE Account: "; \ GOSUB 12000 \ PRINT \ IF ERL=4020 THEN GOTO 4010 ELSE GOTO 4530 10100 ! ! C R E A T E T H E A C C O U N T 10110 ON ERROR GOTO 10300 \ CHANGE SYS(CHR$(6%)+CHR$(-10%)+P$) TO M% \ M%(I%)=M%(I%-2%) FOR I%=12% TO 9% STEP -1% \ M%(I%)=0% FOR I%=0% TO 8% \ M%(I%)=0% FOR I%=13% TO 22% \ M%(I%)=0% FOR I%=27% TO 30% \ IF QTA<0. OR QTA>65535. THEN QTA=VAL("1..2") ELSE IF QTA<32768. THEN QTA%=QTA ELSE IF QTA=32768. THEN QTA%=32767%+1% ELSE QTA%=QTA-65536. ! P$=DISK:PASSWORD ! ADJUST THE QUOTA IF NECESSARY. 10120 M%(0%)=30% \ M%(1%)=6% \ M%(2%)=0% \ M%(7%)=PROG% \ M%(8%)=PROJ% \ M%(13%)=QTA% \ M%(14%)=SWAP%(QTA%) \ M%(27%)=CLSTR% \ M%(28%)=SWAP%(CLSTR%) \ CHANGE M% TO M$ \ M$=SYS(M$) \ RETURN ! TRY TO DO THE ACTUAL CREATE ON THIS ACCOUNT. 10300 ! ! C R E A T E A C C O U N T F A I L U R E 10310 RESUME 10320 ! ERROR ON THE CREATE CALL. 10320 PRINT CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)),3%),4%); " - Failure to ENTER Account: "; \ GOSUB 12000 \ PRINT " ";QTA;CLSTR%;NM$ \ E3%=0% \ RETURN ! LET THE USER KNOW. 12000 PRINT "[";NUM1$(PROJ%);",";NUM1$(PROG%);"] ";P$; \ RETURN ! PRINT THE PPN AND DISK:PASSWORD THAT WAS NOT ! ENTERED/DELETED. 16500 DEF FNM%(MUST$,MIN%) ! FUNCTION FNM% VERIFY THAT THE USER SUPPLIED ! INPUT MATCHES , AT LEAST TO SOME ! MINIMUM LENGTH, ONE OF THE ! 'LEGAL' OPTIONS. ! FURTHER, VERIFY THAT ALL ! CHARACTERS IN THE USER INPUT ARE ! LEGAL, ! E.G. MUST$=ENTER, ! MIN%=1% ! P$=USER INPUT=ENTEG WOULD NOT ! BE ALLOWED ! ! PARAMETERS MUST$ STRING OF LEGAL OPTIONS FOR THE ! ?, SEPARATED BY SPACES ! MIN% MINIMUM # OF CHARACTERS TO MATCH ! (WILL ALWAYS BE AT LEAST 1) ! ! RETURNS FNM% 0 = ILLEGAL ! ASCII(USER INPUT) = OK 16510 FNM%=0% \ K%=LEN(P$) \ GOTO 16550 UNLESS K%>=MIN% \ WHILE MUST$<>"" \ P%=INSTR(1%,MUST$+" "," ") \ OPT$=LEFT(MUST$,P%-1%) \ IF P$=LEFT(OPT$,K%) THEN FNM%=ASCII(P$) \ GOTO 16550 16520 MUST$=RIGHT(MUST$,P%+1%) \ NEXT ! INITIALIZE THE FUNCTION. ! GET THE LENGTH OF THE USER SUPPLIED INPUT - ! UNACCEPTABLE IF LESS THAN THE MINIMUM # OF CHARACTERS. ! FOR EACH POSSIBLE OPTION: ! EXTRACT THE NEXT OPTION ! IF THE USER INPUT MATCHES EXACTLY THEN ! RESET THE FUNCTION AND GET OUT. ! OTHERWISE WE GO ON TO THE NEXT OPTION. 16550 FNEND 16600 ! RANDOM PASSWORD GENERATOR ! 16620 DEF FNP$ \ RANDOMIZE \ P1$='' \ P1$=P1$+CHR$( INT ( (90%-65%)*RND+65. + .5 ) ) FOR J%=1% TO 4% \ FNP$=P1$ \ FNEND ! RETURNS A RANDOM 4 CHARACTER PASSWORD ! 19000 ! ! E R R O R H A N D L I N D G 19010 IF ERR<>11% THEN ON ERROR GOTO 0 ELSE RESUME 32767 32767 END