; ;DISSASSEMBLY OF ...PWD SYSTEM COMMAND ; ;ANNOTATED BY F. BORGER ;DEPT. OF MEDICAL PHYSICS ;MICHAEL REESE MEDICAL CENTER ; 3/16/76 ; ;MODIFIED ON 12/75 TO REPORT OLD PASSWORD AND IF ; ;A/NEW PASSWORD IS ENTERED, CHANGE PASSWORD ; ;B/CR ENTERED, PASSWORD NON CHANGED ; ; ;MODIFIED 3/76 TO SUPPORT MRMC VARIABLE SYSTEM DEVICE PACKAGE ;EACH UIC ON DK0 DIRECTORY WILL INCLUDE INFORMATION AS TO WHAT IS THE ;DEFAULT DEVICE FOR THIS USER. THIS INFO WILL BE KEPT IN THE FILE ATTRIBUTES ;AREA AT WORDS 26 (DEV NAME IN ASCII) AND BYTE 30 (ASCII UNIT #) ;REPORT/CHANGE FUNCTION WORKS SAME AS PASSWORD, CHANGED ONLY IF NEW ;DEVICE STRING ENTERED .TITLE PWDENT .IDENT /V01/ .MCALL FSRSZ$,FINIT$,FDBDF$,FDOP$A,QIOW$,DIR$ .PSECT PURE ; ; ;THIS SECTION CONTAINS DATA BLOCKS FOR THE READ/WRITE ATTRIBUTES ;FUNCTIONS, (ONE FOR EACH.) ;READ ATTRIBUTES CONTROL BLOCK PTR0: .BYTE -4,40 ;FN CODE, SIZE OF XFER (BYTES) .WORD FATBUF ;ADDRESS OF BUFFER .WORD 0 ;END OF BLOCK INDICATOR ;WRITE ATTRIBUTES CONTROL BLOCK PTR6: .BYTE 4,40 ;FN CODE, SIZE OF XFER (BYTES) .WORD FATBUF ;ADDRESS OF BUFFER .WORD 0 ;END OF BLOCK INDICATOR ; ;VARIOUS MESSAGES AND DPB'S TO ISSUE THEM ; ;FIRST MESSAGE, CAN'T CHANGE SOME ONE ELSE'S PASSWORD MESS0: .ASCII /PWD -- NON SYSTEM ACCOUNT MAY ONLY/ .ASCII / MODIFY OWN PASSWORD/ MESS0L=.-MESS0 .EVEN ; ; ;DIRECTIVE TO REPORT DIRECTORY READ/WRITE ERROR RWEDPB: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;MESSAGE THAT DIRECTORY READ/WRITE FAILED MESS1: .ASCII /PWD -- READ OR WRITE FAILURE ON / .ASCII /DIRECTORY ENTRY/ MESS1L=.-MESS1 .EVEN ; ; ;DIRECTIVE TO REPORT NON SYSTEM UIC TRIED TO CHANGE SOMEONE ;ELSE'S UIC SYSERR: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;MESSAGE TO REPORT NON-EXISTENT UIC MESS2: .ASCII /PWD -- NON EXISTENT ACCOUNT/ MESS2L=.-MESS2 .EVEN ; ; ;DIRECTIVE TO REPORT UIC DOESN'T EXIST NOUIC: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;ASCII PROMPTS MESS3: .ASCII /NEW PASSWORD>/ MESS3L=.-MESS3 .EVEN MESS3A: .ASCII /NEW DEFAULT DEVICE>/ MESSAL=.-MESS3A .EVEN ; ; ;MESSAGE TO REPORT SYNTAX ERROR MESS4: .ASCII /PWD -- SYNTAX ERROR/ MESS4L=.-MESS4 .EVEN ; ; ;MESSAGE TO REPORT DIRECTIVE ITSELF FAILED MESS5: .ASCII /PWD -- DIRECTIVE FAILURE/ MESS5L=.-MESS5 .EVEN ; ; ;DIRECTIVE TO REPORT SOME OTHER DIRECTIVE FAILED DRFAIL: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;DIRECTIVE TO READ FILE ATTRIBUTES READAT: QIOW$ IO.RAT,4,1,,IOSTAT,, ;(
) ; ; ;DIRECTIVE TO WRITE FILE ATTRIBUTES WRITAT: QIOW$ IO.WAT,4,1,,IOSTAT,, ; ; ; ;DIRECTIVES TO ISSUE 'PASSWORD>' ,'DEFAULT DEVICE>' PROMPTS PROMPT: QIOW$ IO.WVB,6,1,,IOSTAT,, PROMP2: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;DIRECTIVE TO REPORT SYNTAX ERROR SYNERR: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;DIRECTIVE TO READ NEW PASSWORD FROM TI: RDPWD: QIOW$ IO.RLB+20,6,1,,,, ; ; ;DIRECTIVE TO READ NEW DEFAULT DEVICE FROM TI: RDDEV: QIOW$ IO.RLB+20,6,1,,,, ; ; ;ADDED DIRECTIVE TO REPORT OLD PASSWORD OLDPWD: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ; ;DIRECTIVE TO REPORT OLD DEFAULT DEVICE OLDDEV: QIOW$ IO.WVB,6,1,,IOSTAT,, ; ;ADDED MESSAGE TO REPORT OLD PASSWORD MESS6: .ASCII /OLD PASSWORD / .EVEN MESS6P: .ASCII / / MESS6L=.-MESS6 .EVEN ;MESSAGE TO REPORT OLD DEFAULT DEVICE MESS7: .ASCII /OLD DEFAULT DEVICE / .EVEN MESS7P: .ASCII / / MESS7L=.-MESS7 .EVEN ; ; ; ; ; ; .PSECT ;NOW THE IMPURE (READ/WRITE) CODE FATBUF: .BLKW 20 ;BUFFER FOR READ/WRITE FILE ATTRIBUTES FSRSZ$ 0 ;DEFINE FCS WORK AREA FDB: FDBDF$ ;DEFINE FDB FDOP$A 4 ;SET LUN ONLY REST WILL BE DEFAULT OR RUN TIME ;SET UP DATSET: .WORD 0 ;DATA SET DESCRIPTOR (SIZE) .WORD 0 ;(POINTER) UICSIZ: .WORD 0 ;SIZE OF UIC STRING UICPTR: .WORD 0 ;START OF UIC STRING .WORD 0 ;DEFAULT FILENAME STRING DESCRIPTOR .WORD 0 .BLKW 3 ;THREE EXTRA WORDS GETMCR: .BYTE 127.,41. ;DIRECTIVE, SIZE OF DPB .BLKW 40. UIC: .WORD 0 ;SAVED OCTAL UIC MODULO: .WORD 0 ;MODULO (8. OR 10.) OF UIC .WORD 0 IOSTAT: .BLKW 2 ;IO STATUS BLOCK SPBUF: .BLKW 3 ;BUFFER FOR READING NEW PWD, DEF. DEVICE REWFLA: .WORD 0 ;FLAG FOR INDICATING WRITE ATTRI. TO BE DONE ; ; ; ; .PSECT PURE ; ;PURE CODE AREA AGAIN !!!!!!! BADJMP: JMP BADSYN ;BRANCH AID START: DIR$ #GETMCR ;GET MCR LINE BCC 1$ ;BR IF WENT OK JMP SCRAM ;ELSE JUST EXIT, CPU LEFT 1$: MOV #GETMCR+3,R2 ;4TH WORD OF BUFFER AS POINTER ;BUT ACTUALLY NOT,DEC PROGRAMMER FORGOT ;ABOUT FIRST WORD OF DPB 2$: MOVB (R2)+,R1 ;XFER CHARACTER -> R1 CMPB #40,R1 ;A SPACE ? BEQ 3$ ;FOUND LEADING SPACE, BRANCH CMPB #CR,R1 ;A TERMINATOR ? BNE 2$ ;IF NOT A TERMINATOR, CHECK NEXT CHARACTER JMP BADJMP ;IF IT IS, BAD SYNTAX, REPORT IT 3$: MOV R2,UICPTR ;SAVE PTR TO START OF UIC STRING MOVB (R2)+,R1 ;GET FIRST ASCII CODE IN R1 CMPB #133,R1 ;A '[' ? BEQ 35$ ;IF YES, OK JMP BADJMP ;ELSE ITS A SYNTAX ERROR 35$: MOV #10,MODULO ;SET MODULO 8. UIC JSR PC,CONUIC ;CONVERT HALF OF UIC TO OCTAL TST R1 ;CHECK CONVERTED UIC IS IT = 0 ? BEQ BADJMP ;AN ERROR BIT #177400,R1 ;MAKE SURE ITS A BYTE NUMBER BNE BADJMP ;TOO BIG, AN ERROR MOVB R1,UIC+1 ;STORE GROUP CODE CMPB R5,#54 ;DID FIRST DECODE HANG AT ',' ? BNE BADJMP ;IF NOT ALSO SYNTAX ERROR JSR PC,CONUIC ;CONVERT USER PART OF UIC TST R1 ;USER UIC =0 ? BEQ BADJMP ;A SYNTAX ERROR BIT #177400,R1 ;CHECK UPPER BYTE BNE BADJMP ;BR IF USER CODE TOO BIG MOVB R1,UIC ;STORE USER CODE (OCTAL) CMPB #135,R5 ;SECOND DECODE STOPPED AT ']' ? BNE BADJMP ;IF NOT, SYNTAX ERROR MOV R2,UICSIZ ;END OF UIC STRING POINTER -> UICSIZ SUB UICPTR,UICSIZ ;SUB START OF STRING, NOW = LENGTH MOV .CRTSK,R0 ;GET CURRENT ATL ADDRESS MOV #77406,-(SP) ;NEW PAGE DESCRIPTOR REG -> STACK MOV A.HA(R0),-(SP) ;PROG. START ADDRESS (NEW PAR) -> STACK JSR PC,..SPD3 ;SWAP INTO TASK HEADER FOR CHECK CMP (SP)+,(SP)+ ;CLEAN UP STACK CMP UIC,H.UIC+60000 ;COMPARE UIC OF REQUEST, UIC OF ...PWD BEQ 4$ ;IF SAME OK CMPB H.UIC+60001,#10 ;ELSE RUNNING UIC GROUP CODE MUST BE <= 10 BLE 4$ ;NON SYS UIC CAN'T CHANGE SOMEONE ELSE'S PWD JMP NONSYS ;SO REPORT HE CAN'T 4$: FINIT$ ;OK INIT. FSR AREA MOV #FDB,R0 ;FDB ADDRESS -> R0 MOV #FDB+F.FNB,R1 ;FILE NAME BLOCK ADDR -> R1 MOV #DATSET,R2 ;DATA SET DESCRIPTOR BLOCK ADDR -> R2 CLR R3 ;NO DEFAULT FILE NAME BLOCK JSR PC,.PARSE ;DO PARSE ;SET UP FDB BY DIRECTORY ID BCS PARSEF ;BR IF ERROR DIR$ #READAT ;READ FILE ATTRIBUTES BCS DIRERR ;BR IF AN ERROR CMPB #IS.SUC,IOSTAT ;SUCCESS CODE RETURNED ? BNE RWERR ;IF NOT REPORT READ/WRITE ATTR. ERROR ; INSERTED CODE TO REPORT OLD PASSWORD MOV FATBUF+32,MESS6P ;TRANSFER PASSWORD TO MESSAGE BUFFER MOV FATBUF+34,MESS6P+2 ;(6 ASCII BYTES) MOV FATBUF+36,MESS6P+4 DIR$ #OLDPWD ;REPORT OLD PASSWORD CLR SPBUF ;OK CLEAR OLD PASSWORD CLR SPBUF+2 ;ITS 3 WORDS ! CLR SPBUF+4 DIR$ #PROMPT ;DO PROMPT MESSAGE BCS DIRERR ;BR IF DIRECTIVE DIDN'T GO DIR$ #RDPWD ;READ NEW PASSWORD BCS DIRERR ;BR IF DIRECTIVE DIDN'T GO TSTB SPBUF+5 ;6 CHARACTER PASSWORD RECEIVED ? BEQ CKDEV ;NO, DON'T CHANGE PASSWORD MOV SPBUF,FATBUF+32 ;YES MOVE NEW PASSWORD TO FILE ATTRIBUTES MOV SPBUF+2,FATBUF+34 ;BUFFER MOV SPBUF+4,FATBUF+36 INC REWFLA ;SET FLAG TO SHOW FILE ATTRIBUTES TO BE REWRITTEN CKDEV: MOV FATBUF+26,MESS7P ;OLD DEF. DEVICE TO ASCII BUFFER MOVB FATBUF+30,MESS7P+2 ;AND DEV NUMBER DIR$ #OLDDEV ;REPORT OLD DEFAULT DEVICE CLR SPBUF ;CLEAR BUFFER CLR SPBUF+2 CLR SPBUF+4 DIR$ #PROMP2 ;PROMPT FOR NEW DEVICE DIR$ #RDDEV ;READ NEW DEFAULT DEVICE BCS DIRERR ;WOOPS ERROR CMPB SPBUF,#100 ;ASCII DEV IN BUFFER ? BLT NODEV ;NO DON'T CHANGE DEFAULT DEVICE CMP SPBUF,#"SY ;DOES HE WANT SYSTEM AS DEFAULT ? BNE 23$ ;SKIP IF NOT CLR SPBUF ;SET TO 0 SO WE GET DEFAULT DEVICE CLRB SPBUF+2 23$: MOV SPBUF,FATBUF+26 ;YES MOVE NEW DEVICE TO ATTRIBUTES BUFFER CMPB SPBUF+2,#': ;IS DEV STRING OF FORM "XX:" BNE 22$ ;BR IF NOT MOVB #'0,SPBUF+2 ;IF SO, CHANGE TO ASCII '0' 22$: MOVB SPBUF+2,FATBUF+30 ;OK INSERT NEW DEFAULT DEV # INC REWFLA ;SHOW BUFFER TO BE REWRITTEN NODEV: TST REWFLA ;REWRITE OF ATTRIBUTES NECESSARY ? BEQ SCRAM ;NO JUST SCRAM DIR$ #WRITAT ;WRITE NEW ATTRIBUTES BCS DIRERR ;BR IF WRITE ATTRIBUTES FAILED CMPB #IS.SUC,IOSTAT ;OR IF DIRECTIVE WAS REJECTED BEQ SCRAM ;IF OK JUST LEAVE BR RWERR ;ELSE REPORT READ/WRITE ATTR. ERROR PARSEF: CMPB #IE.NSF,F.ERR(R0) ;PARSE FAILED, NO UIC MATCH ? BNE RWERR ;BR IF NOT DIR$ #NOUIC ;REPORT NON-EXISTENT UIC BR SCRAM ;AND GET OUT RWERR: DIR$ #RWEDPB ;REPORT READ/WRITE ATTRIBUTES ERROR BR SCRAM ;AND SCRAM NONSYS: DIR$ #SYSERR ;REPORT ATTEMPT TO CHANGE OTHER'S PWD ERROR BR SCRAM ;AND SCRAM DIRERR: DIR$ #DRFAIL ;REPORT DIRECTIVE FAILURE BR SCRAM ;AND SCRAM BADSYN: DIR$ #SYNERR ;REPORT SYNTAX ERROR SCRAM: CLR REWFLA ;CLEAR REWRITE FLAG MOV #463,-(SP) ;AN EXIT DPB TO THE STACK EMT 377 ;DO EXIT CPU LEFT ; ; ;SUBROUTINE TO CONVERT UIC GROUP OR USERS CODE FROM (UP TO) THREE ;ASCII DIGITS TO AN OCTAL VALUE ; ;ENTER WITH ASCII STRING POINTER IN R2 ;RETURN WITH OCTAL VALUE IN R1, POINTER AT NEXT NON DIGIT ASCII CODE ; CONUIC: MOV #6,R4 ;MAX COUNT -> R4 CLR R1 ;CLEAR RETURNED VALUE 1$: MOVB (R2)+,R5 ;FIRST ASCII # -> R5 CMP #57,R5 ;COMPARE WITH '/' BPL 4$ ;WOOPS LESS THAN '0' !! CMP #67,R5 ;OK COMPARE WITH '7' BMI 3$ ;BR IF NOT GREATER THAN '7' 2$: CLC ;CLEAR ANY ERROR INDICATOR MUL MODULO,R1 ;MULT PREV ANSWER BY MODULO 8. OR 10. BCS 5$ ;BR IF MULT WAS BAD BIC #177760,R5 ;CLEAR NEXT DIGIT TO AN OCTAL # ADD R5,R1 ;ADD TO PREVIOUS TOTAL SOB R4,1$ ;AND TRY ANOTHER CHARACTER BR 4$ ;IF DONE, RETURN 3$: CMP #12,MODULO ;LAST ASCII CHARACTER FAILED TEST BNE 4$ ;NOT MODULO 10., BAD CHARACTER CMP #71,R5 ;ELSE CHECK FOR '8', OR '9' BPL 2$ ;STILL FAILED 4$: RTS PC ;YES RETURN 5$: TST (SP)+ ;BAD FAILURE, CLEAN UP OLD SUB RETURN FROM STACK JMP BADSYN ;AND TAKE ERROR EXIT .END START