Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_SRC_1_19910112 - 6-sources/dluser.mac
There are 29 other files named dluser.mac in the archive. Click here to see a list.
; UPD ID= 266, SNARK:<6.UTILITIES>DLUSER.MAC.5,  20-Apr-83 10:30:10 by LEACHE
;More TCO 6.1623
; UPD ID= 142, SNARK:<6.UTILITIES>DLUSER.MAC.3,  27-Sep-82 14:27:37 by LEACHE
;Bump edit number on previous
; UPD ID= 141, SNARK:<6.UTILITIES>DLUSER.MAC.2,  27-Sep-82 14:21:00 by LEACHE
;TCO 6.1623 Save and restore password encryption version number
; UPD ID= 1033, SNARK:<5.UTILITIES>DLUSER.MAC.3,  23-Sep-80 12:18:26 by LYONS
;Fix an error in the error code
;<4.UTILITIES>DLUSER.MAC.4,  3-Aug-79 16:36:06, Edit by KONEN
;IF USER NUMBER ALREADY EXISTS IN LOADING, LET SYSTEM GIVE ONE
;<4.UTILITIES>DLUSER.MAC.3,  5-Jun-79 11:40:57, EDIT BY DBELL
;TCO 4.2273 - ALWAYS SET DIRECTORY PARAMETERS FOR THE SYSTEM DIRECTORIES
;<4.UTILITIES>DLUSER.MAC.2, 10-Mar-79 13:45:56, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.UTILITIES>DLUSER.MAC.1, 23-Jan-79 10:46:22, Edit by KONEN
;UPDATE VERSION NUMBER FOR RELEASE 4



;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;DUMP/LOAD USER INFORMATION - D. MURPHY
;NOTE: REQUIRES OPERATOR OR WHEEL CAPABILITY

	TITLE DLUSER
	SEARCH MONSYM, MACSYM
	IFNDEF .PSECT,<
	.DIRECT .XTABM>
	.REQUIRE SYS:MACREL
	SALL


;Warning:  when dumping, ALL strings returned by GTDIR that happen to
;be null must be written to the file as <space><CR><LF>, not <CR><LF>
;If GTDIR is changed to return additional string fields, see the code
;preceding DLUSER's invocation of GTDIR and add to it.

T1=1
T2=2
T3=3
T4=4
P=17
GB=16
P2=15
P1=14
IO=11

	INTERN START,LODUSR,DMPUSR

;ENTRY VECTOR

PRGCST==0			;CUSTOMER ID
PRGVER==5			;VERSION NUMBER
PRGMIN==0			;MINOR VERSION
PRGEDT==0			;EDIT NUMBER
ENTVEC:	JRST START		;MAIN START
	JRST PARSE		;REENTER ADDRESS
	PRGCST_^D33+PRGVER_^D24+PRGMIN_^D18+PRGEDT
DEFINE LS (NM,SZ)
<NM:	BLOCK SZ
>

NPDL==20			;SIZE OF THE STACK
SYSMAX==17			;HIGHEST SYSTEM DIRECTORY NUMBER
LS PDL,NPDL			;THE STACK

LS JFN,1			;JFN OF FILE FOR INPUT OR OUTPUT
	EBUFLN==.CDPMU+1	;LENGTH OF EBUF
LS EBUF,EBUFLN			;ARGUMENT BLOCK FOR GTDIR OR CRDIR
LS NAMBUF,21			;CONTAINS STR:<*> ON DUMP, STR:<DIRECTORY> ON LOAD
LS NAMPTR,1			;POINTER INTO NAMBUF 
LS DIRNAM,21			;CONTAINS STR:<DIRECTORY> ON DUMP
LS DIRNUM,1			;DIRECTORY NUMBER
LS PASBUF,11			;CONTAINS PASSWORD
LS ACTBUF,11			;CONTAINS DIRECTORY DEFAULT ACCOUNT
LS STRDV,1			;DEVICE DESIGNATOR FOR STRUCTURE TO USE
LS USERNO,1			;USER NUMBER CURRENTLY WORKING ON (FOR CTRL/A)

;LOCATIONS FOR STORING PC WHEN PROCESSING INTERRUPTS
LS RET1,1
LS RET2,1
LS RET3,1		;INTERUPT PC TABLE

;GROUP BLOCKS.  EACH CONTAINS COUNT + 1000 WORDS + 1 WORD FOR ZERO AT END

GRPSIZ== 1000			;SIZE OF GROUP BLOCK
LS UGROUP,GRPSIZ+1+1		;USER GROUPS
LS DGROUP,GRPSIZ+1+1		;DIRECTORY GROUPS
LS CRTGRP,GRPSIZ+1+1		;GROUPS FOR SUBDIRECTORIES
;DEFINITIONS FOR COMMAND PARSING USING COMND JSYS

;TB - MACRO TO SET UP COMMAND TABLE 

	DEFINE TB (DAT,TXT)<
	XWD [ASCIZ /TXT/],DAT>

;ADDRESSES FOR HANDLING EACH COMMAND

CMDTAB:
	CMDSIZ,,CMDMAX		;NUMBER COMMANDS, MAXIMUM NUMBER
	TB (.DUMP,DUMP)		;DUMP DIRECTORIES TO FILE
	TB (.EXIT,EXIT)		;QUIT
	TB (.HELP,HELP)		;TYPE INFORMATION ABOUT DLUSER
	TB (.LOAD,LOAD)		;LOAD DIRECTORIES INTO SYSTEM FROM FILE
	TB (.STR,STRUCTURE)	;SPECIFY STRUCTURE TO OPERATE ON

CMDSIZ==.-CMDTAB
CMDMAX==CMDSIZ			;MAXIMUM NUMBER OF COMMANDS
NCHPW==5			;NUMBER OF CHARACTERS PER WORD
PROMPT:	ASCIZ /DLUSER>/		;PROMPT
CMDBLK:	BLOCK .CMGJB+5		;COMMAND STATE BLOCK (LEAVE ROOM FOR GROWTH)
GJFSIZ==.GJRTY+2
GTJBLK:	BLOCK GJFSIZ		;GTJFN BLOCK (USED BY COMND)

BUFSIZ==150			
BUFFER:	BLOCK BUFSIZ		;BUFFER USER TYPES COMMAND INTO
ATMSIZ==BUFSIZ
ATMBUF:	BLOCK ATMSIZ		;BUFFER THAT COMND STORES LAST FIELD INTO

;ERROR - MACRO TO PRINT ERROR AND GO TO SPECIFIED LOCATION

	DEFINE ERROR (ADDR,MSG)<
	JRST  [	HRROI T1,[ASCIZ /
? MSG
/]
		PSOUT
		JRST ADDR]>

;TXTPTR- MACRO TO SET UP BYTE POINTER TO A STRING

	DEFINE TXTPTR (MSG) <POINT 7,[ASCIZ/MSG/]>

START:	MOVE P,[IOWD NPDL,PDL]
	RESET
	HRROI 1,NAMBUF		;INIT STR PNTR
	MOVEM 1,NAMPTR
	MOVEI T1,.FHSLF
	RPCAP			;GET PROCESS CAPABILITIES
	TXNN T3,SC%WHL!SC%OPR
	JRST [	TMSG < ?WHEEL or OPERATOR capability required
>
		HALTF
		JRST START]
	MOVEI T1,.FHSLF
	CIS			;SET UP INTERUPT SYSTEM
	EIR
	MOVE T2,[LEVTAB,,CHNTAB]
	SIR
	MOVX T2,1B1		;PUT ^A ON 1
	AIC
	MOVE T1,[1,,1]
	ATI			;ASSIGN TERMINAL CODE

;HERE TO START A NEW COMMAND.SET UP THE COMMAND STATE  BLOCK

PARSE:	SETZM USERNO		;NONE YET
	MOVEI T2,CMDBLK		;POINT TO START OF COMMAND STATE BLOCK
	MOVEI T1,PARSE2		;TRANSFER IF USER DELETES PREVIOUSLY PARSED STUFF
	MOVEM T1,.CMFLG(T2)
	MOVE T1,[.PRIIN,,.PRIOU] ;JFN'S FOR USER INPUT AND OUTPUT
	MOVEM T1,.CMIOJ(T2)
	HRROI T1,PROMPT		;POINTER TOPROMPT STRING
	MOVEM T1,.CMRTY(T2)
	HRROI T1,BUFFER		;POINTER TO START OF USER INPUT
	MOVEM T1,.CMBFP(T2)
	MOVEM T1,.CMPTR(T2)	;POINTER TO NEXT FIELD
	MOVEI T1,BUFSIZ*NCHPW	;SPACE REMAINING IN BUFFER
	MOVEM T1,.CMCNT(T2)
	SETZM .CMINC(T2)	;NUMBER OF UNPARSED CHARACTERS
	HRROI T1,ATMBUF		;POINTER TO ATOM BUFFER
	MOVEM T1,.CMABP(T2)
	MOVEI T1,ATMSIZ*NCHPW	;NUMBER CHARACTERS IN ATOM BUFFER
	MOVEM T1,.CMABC(T2)
	MOVEI T1,GTJBLK		;ADDRESS OF GTJFN BLOCK
	MOVEM T1,.CMGJB(T2)


;HERE WHEN ERROR OCCURS AND NEED TO START OVER.  REINIT THE COMND JSYS

PARSE1:
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMINI)] ;T2/ADDRESS OF FUNCTION DESCRIPTOR BLOCK
	COMND			;INIT THE COMND JSYS

;HERE WHEN USER RUBOUTS INTO PREVIOUSLY GOTTEN TEXT

PARSE2:	MOVE T1,[CZ%NCL+.FHSLF];WE WANT TO RELEASE ALL JFN'S
	CLZFF			;DO IT
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB.(.CMKEY,,CMDTAB)] ;T2/ADDRESS OF FDB
	COMND			;LOOK FOR A KEYWORD
	TXNE T1,CM%NOP		;DID WE FIND ONE?
	ERROR PARSE1,<NOT A DLUSER COMMAND> ;NO. START OVER
	HRRZ T1,(T2)		;YES. GO PROCESS IT
	JRST (T1)	
PARSE3:	JRST PARSE		;GET NEXT COMMAND
	SUBTTL DUMP (TO FILE) FILESPEC

;USER WANTS TO DUMP DIRECTORIES TO A FILE.  GET NAME OF FILE

.DUMP:
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMNOI,,TXTPTR <TO FILE>)];T2/ADDRESS OF FDB
	COMND			;TYPE NOISE WORD IF NEEDED
	MOVE T1,[GTJBLK,,GTJBLK+1] ;SET UP TO CLEAR GTJFN BLOCK
	SETZM GTJBLK		;CLEAR FIRST WORD OF BLOCK
	BLT T1,GTJBLK+GJFSIZ-1	;CLEAR GTJFN BLOCK
	HRROI T1,[ASCIZ/USERS/]	;GET DEFAULT FILENAME
	MOVEM T1,GTJBLK+.GJNAM	;SAVE DEFAULT FILE NAME
	HRROI T1,[ASCIZ/TXT/]	;GET POINTER TO DEFAULT FILE TYPE
	MOVEM T1,GTJBLK+.GJEXT	;SAVE DEFAULT FILE TYPE POINTER
	HRROI T1,[ASCIZ/770000/] ;GET DEFAULT PROTECTION
	MOVEM T1,GTJBLK+.GJPRO	;SAVE DEFAULT PROTECTION
	MOVX T1,GJ%FOU		;GET "FOR-OUTPUT-USE" FLAG
	MOVEM T1,GTJBLK+.GJGEN	;SAVE FLAGS
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMFIL)] ;GET FILESPEC FDB FOR COMND
	COMND			;GET OUTPUT FILE
	TXNE T1,CM%NOP		;DID WE GET A GOOD FILE NAME
	JRST [	JSERR		;FAILED. REPORT ERROR
		JRST PARSE1]
	HRRZM T2,JFN		;YES. SAVE THE JFN

	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMCFM)] ;T2/ADDRESS OF FUNCTION DESCRIPTOR BLOCK
	COMND			;GET CONFIRMATION
	TXNE T1,CM%NOP		;DID WE GET IT?
	ERROR PARSE1,<INVALID COMMAND CONFIRMATION>  ;NO. START OVER

;OPEN THE FILE

	MOVE T1,JFN		;T1/JFN OF OUTPUT FILE
	MOVX T2,<OF%WR+FLD(7,OF%BSZ)> ;T2/OPEN FOR WRITE, 7-BIT BYTES
	OPENF			;OPEN FILE TO DUMP ONTO
	JRST [	JSERR		;FAILED.  REPORT ERROR
		JRST PARSE1]	;START THE LINE OVER
	JRST DMPUSR
;SUBROUTINE TO DUMP ALL DIRECTORIES ONTO SPECIFIED FILE
;IF A STRUCTURE WAS SPECIFIED, NAMBUF CONTAINS THE STRUCTURE NAME.
;IF NOT, IT IS ZEROED.  NAMPTR POINTS TO THE NEXT AVAILABLE LOCATION
;IN NAMBUF.

DMPUSR:	MOVE T1,NAMPTR		;T1/ POINTER TO END OF STRUCTURE
	HRROI T2,[ASCIZ /<*>/]	;T2/ POINTER TO DIRECTORY SPEC
	SETZ T3,		;T3/ STOP ON NULL
	SOUT			;APPEND <*> TO STRUCTURE NAME
	MOVX T1,RC%AWL		;T1/ ALLOW WILD CARD
	HRROI T2,NAMBUF		;T2/ POINT TO STR:<*>
	RCDIR			;GET THE FIRST DIRECTORY
	 ERJMP [ TMSG <
?Unable to get first directory>
			JSERR
		JRST PARSE]
	TXNE T1,RC%NOM!RC%AMB!RC%NMD ;ANY ERROR CONDITIONS?
	JRST [	TMSG <
?Unable to get first directory>
		HALTF
		JRST PARSE]
	MOVEM T3,DIRNUM		;NO. SAVE DIRECTORY NUMBER
	HRROI T1,DIRNAM		;T1/ POINT TO BUFFER FOR OUTPUT
	MOVE T2,T3		;T2/ DIRECTORY NUMBER
	DIRST			;STORE STRUCTURE:<DIRECTORY>
	 JSHLT			;FAILED. SHOULDN'T HAPPEN

;PRINT A ONE-TIME HEADER INDICATING STRUCTURE BEING DUMPED AND
;FORMAT OF OUTPUT

	MOVE T1,JFN		;OUTPUT FILE
	HRROI T2,[ASCIZ "Dump of all directories on: "]
	SETZ T3,
	SOUT			;OUTPUT COMMENT
	MOVE T1,JFN
	HRROI T2,DIRNAM		;T2/ SOURCE IS DIRECTORY NAME
	MOVEI T3,7		;T3/ DEVICE NAME CAN'T EXCEED 6 CHARACTERS
	MOVEI T4,":"		;T4/ STOP WITH DEVICE TERMINATOR
	SOUT			;PRINT THE STRUCTURE NAME
	HRROI T2,FORMAT
	SETZ T3,
	SOUT			;OUTPUT DESCR

;LOOP THROUGH DIRECTORIES, GETTING THEIR DIRECTORY INFO AND COPYING
;IT TO THE OUTPUT FILE

DMPUS3:	MOVE T1,DIRNUM		;T1/ DIRECTORY #
	MOVEM T1,USERNO		;SAVE FOR ^A WATCHERS
	MOVEI T2,EBUFLN		;GET LENGTH OF BUFFER "EBUF"
	MOVEM T2,EBUF+.CDLEN	;STORE COUNT IN BLOCK FOR GTDIR
	MOVEI T2,EBUF		;T2/ WHERE TO STORE DIRECTORY INFO
	HRROI T3,PASBUF		;T3/ WHERE TO STORE PASSWORD
;SET UP POINTERS FOR GROUP LISTS.  ARGUMENT BLOCK FOR GTDIR CONTAINS 
;ADDRESS OF BLOCK INTO WHICH GTDIR COPIES GROUP NUMBERS.  THE DESTINATION
;BLOCK CONTAINS ITS SIZE IN THE FIRST WORD.  THIS CODE ZEROES THE
;DESTINATION BLOCK, STORES ITS SIZE IN THE FIRST WORD, AND STORES A
;POINTER TO THE DESTINATION IN THE GTDIR ARGUMENT BLOCK

	MOVE P1,[UGROUP,,UGROUP+1] ;GET SOURCE,,DESTINATION
	SETZM UGROUP		;CLEAR FIRST WORD OF GROUP BLOCK
	BLT P1,UGROUP+GRPSIZ-1	;CLEAR ENTIRE USER GROUP BLOCK
	MOVE P1,[DGROUP,,DGROUP+1] ;GET SOURCE,,DESTINATION
	SETZM DGROUP		;CLEAR FIRST WORD OF GROUP BLOCK
	BLT P1,DGROUP+GRPSIZ-1	;CLEAR ENTIRE DIRECTORY GROUP BLOCK
	MOVE P1,[CRTGRP,,CRTGRP+1] ;GET SOURCE,,DESTINATION
	SETZM CRTGRP		;CLEAR FIRST WORD OF GROUP BLOCK
	BLT P1,CRTGRP+GRPSIZ-1	;CLEAR ENTIRE CREATABLE GROUP BLOCK
	MOVEI P1,UGROUP		;GET ADR OF USER GROUP BLOCK
	MOVEM P1,EBUF+.CDUGP	;STORE BLOCK ADR FOR GTDIR
	MOVEI P1,DGROUP		;GET ADR OF DIR GROUP BLOCK
	MOVEM P1,EBUF+.CDDGP	;STORE BLOCK ADR FOR GTDIR
	MOVEI P1,CRTGRP		;GET ADDRESS OF CREATABLE GROUP BLOCK
	MOVEM P1,EBUF+.CDCUG	;STORE BLOCK ADDRESS FOR GTDIR
	MOVEI P1,GRPSIZ		;GET SIZE OF GROUP BLOCK
	MOVEM P1,UGROUP		;STORE SIZE OF BLOCK IN FIRST WORD
	MOVEM P1,DGROUP		;DITTO FOR DIR GROUP BLOCK
	MOVEM P1,CRTGRP		;DITTO FOR CREATABLE GROUP BLOCK
	HRRI P1,ACTBUF		;ADDRESS OF DEFAULT ACCT BUFFER
	HRLI P1,(<POINT 7,>)
	MOVEM P1,EBUF+.CDDAC	;STORE POINTER FOR GTDIR
	GTDIR			;GET PASSWORD AND DIRECTORY PARAMS
	 ERJMP [CALL DIRERR	;FAILED. PRINT MESSAGE AND FIND REASON
		JRST PARSE	;NOT ENOUGH PRIVILEGE. ABORT COMMAND
		JRST DMPUS1]	;PROBLEM WITH INDIVIDUAL DIRECTORY.  CONTINUE

;OUTPUT HEADER FOR THIS DIRECTORY FOLLOWED BY PASSWORD

	MOVE T1,JFN		;T1/ DESTINATION IS OUTPUT FILE
	MOVEI T2,"&"
	BOUT			;MARK START OF NAME
	HRROI T2,DIRNAM		;T2/ SOURCE IS DIRECTORY NAME
	SETZ T3,
	SOUT			;OUTPUT NAME
	HRROI T2,[ASCIZ /
 /]
	SOUT
	HRROI T2,PASBUF		;PASSWORD
	SOUT

;OUTPUT REST OF INFORMATION STARTING WITH LOGGED IN QUOTA
;EACH ITEM IS PRECEDED BY <CR><LF><SPACE>.  

	MOVSI 7,-<.CDLLD-.CDLIQ+1> ;7/-COUNT,,POINTER TO GTDIR BLOCK
DMPUS2:	HRROI T2,[ASCIZ /
 /]
	SETZ T3,
	SOUT			;MARK BEGINNING OF ITEM
	MOVE T2,EBUF+2(7)	;GET NEXT ITEM
	MOVE T3,[1B0+10]	;OUTPUT MAGNITUDE, OCTAL
	NOUT			;OUTPUT THE DATA
	 JSHLT
	AOBJN 7,DMPUS2		;LOOP THROUGH DATA UP TO GROUPS
;DUMP THE USER GROUPS PRECEDED BY <CR><LF><SPACE>

	HRROI T2,[ASCIZ/
 /]
	SETZM 3			;TERMINATE ON NULL
	SOUT
	MOVEI GB,UGROUP		;GET ADR OF USER GROUP BLOCK
	CALL DMPGRP		;GO DUMP USER GROUPS

;DUMP THE DIRECTORY GROUPS PRECEDED BY <CR><LF><SPACE>

	HRROI T2,[ASCIZ/
 /]
	SETZM 3			;TERMINATE ON NULL
	SOUT
	MOVEI GB,DGROUP		;GET ADR OF DIR GROUP BLOCK
	CALL DMPGRP		;GO DUMP DIRECTORY GROUPS

;DUMP THE NUMBER OF ALLOWED SUBDIRECTORIES

	HRROI T2,[ASCIZ /
 /]
	SETZ T3,
	SOUT			;MARK BEGINNING OF FIELD
	MOVE T2,EBUF+.CDSDQ	;GET NUMBER OF ALLOWED SUBDIRECTORIES
	MOVX T3,NO%MAG+<FLD(10,NO%RDX)> ;PRINT MAGNITUDE, OCTAL NUMBER
	NOUT			;OUTPUT MAXIMUM SUBDIRECTORIES
	 JSHLT			;FAILED. SHOULDN'T HAPPEN

;DUMP CREATABLE USER GROUPS PRECEDED BY <CR><LF><SPACE>

	HRROI T2,[ASCIZ/
 /]
	SETZ T3,		;STOP ON NULL
	SOUT			;MARK BEGINNING OF ITEM
	MOVEI GB,CRTGRP		;GET ADDRESS OF GROUP LIST
	CALL DMPGRP		;GO OUTPUT THE LIST

;DUMP THE DEFAULT DIR ACCOUNT PRECEDED BY <CR><LF>

	MOVE T1,JFN		;DESTINATION IS OUTPUT FILE
	HRROI T2,[ASCIZ/
/]
	SETZ T3,		;STOP ON NULL
	SOUT
	HRROI T2,ACTBUF
	SETZ T3,
	SOUT			;OUTPUT THE DEFAULT ACCOUNT

;Dump password encryption version number

	HRROI T2,[ASCIZ/
 /]
	SETZ T3,
	SOUT%
	MOVE T2,EBUF+.CDPEV	;Get number
	MOVX T3,NO%MAG+FLD(^D10,NO%RDX)
	NOUT%
	 JSHLT
;Dump password encryption date
	HRROI T2,[ASCIZ/
 /]
	SETZ T3,
	SOUT%
	MOVE T2,EBUF+.CDPDT
	JUMPE T2,DMPEDZ		;If zero, just output the zero
	SETZM T3
	ODTIM
	JRST DMPPED
DMPEDZ:	MOVX T3,NO%MAG+FLD(^D10,NO%RDX)
	NOUT%
	 JSHLT

;Dump password expiration date
DMPPED:	HRROI T2,[ASCIZ/
 /]
	SETZ T3,
	SOUT%
	MOVE T2,EBUF+.CDPED
	JUMPE T2,DMPPDZ		;If zero, just output the zero
	SETZM T3
	ODTIM
	JRST DMPPUD
DMPPDZ:	MOVX T3,NO%MAG+FLD(^D10,NO%RDX)
	NOUT%
	 JSHLT

;Dump password use data
DMPPUD:	HRROI T2,[ASCIZ/
 /]
	SETZ T3,
	SOUT%
	HLRZ T2,EBUF+.CDPMU	;Get current use count
	MOVX T3,NO%MAG+FLD(^D10,NO%RDX)
	NOUT%
	 JSHLT
	HRROI T2,[ASCIZ/,,/]
	SETZ T3,
	SOUT%
	HRRZ T2,EBUF+.CDPMU	;Get maximum use count
	MOVX T3,NO%MAG+FLD(^D10,NO%RDX)
	NOUT%
	 JSHLT

;END THE WHOLE THING WITH <CR><LF>

	HRROI T2,[ASCIZ/
 /]
	SETZ T3,		;STOP ON NULL
	SOUT

;DONE WITH THIS DIRECTORY. STEP TO THE NEXT ONE

DMPUS1:	MOVX T1,RC%AWL!RC%STP	;T1/ ALLOW WILD CARD, STEP
	HRROI T2,NAMBUF		;T2/ POINT TO STR:<*>
	MOVE T3,DIRNUM		;T3/ DIRECTORY NUMBER LAST RETURNED
	RCDIR			;GET THE NEXT DIRECTORY
	 ERJMP [ TMSG <
?Unable to get next directory>
		HALTF
		JRST PARSE]
	TXNE T1,RC%NOM!RC%AMB	;ANY PROBLEM OTHER THAN NO MORE DIRECTORIES?
	JRST [	TMSG <
?Unable to get next directory>
		HALTF
		JRST PARSE]
	TXNE T1,RC%NMD		;NO. ANY MORE DIRECTORIES?
	JRST DONE		;NO. ALL DONE
	MOVEM T3,DIRNUM		;YES. SAVE DIRECTORY NUMBER FOR STEPPING
	HRROI T1,DIRNAM		;T1/ POINT TO OUTPUT FOR DIRST
	MOVE T2,T3		;T2/ DIRECTORY NUMBER
	DIRST			;GET DIRECTORY NAME INCLUDING STRUCTURE
	 JSHLT			;FAILED. SHOULDN'T HAPPEN
	JRST DMPUS3		;GO DO THE DIRECTORY
;DIRERR - ROUTINE TO PRINT ERROR AFTER GTDIR FAILS.

;NOTE: GETER CLOBBERS 4-10

;	CALL DIRERR

;RETURNS +1:LACK OF PRIVILEGE
;        +2:PROBLEM WITH ONE DIRECTORY

DIRERR:	TMSG<
?JSYS ERROR:>
	MOVEI T1,.FHSLF		;T1/CURRENT FORK
	GETER			;GET LAST ERROR
	MOVEI T1,.PRIOU		;T1/PRIMARY OUTPUT
	SETZ T3,		;T3/NO LIMIT ON LENGTH OF MESSAGE
	ERSTR			;PRINT MESSAGE FOR ERROR IN T2
	 JFCL			;FAILED
	 JFCL			;FAILED
	MOVEI T2,(T2)		;GET ERROR CODE
	CAIN T2,GTDIX1		;IS IT LACK OF OPERATOR OR WHEEL PRIVILEGE?
	JRST 	[TMSG<
>				;YES.  QUIT.

		RET]
	TMSG < - >		;NO. PRINT AND CONTINUE
	HRROI T1,DIRNAM		;T1/POINTER TO DIRECTORY NAME
	PSOUT			;PRINT THE DIRECTORY NAME
	TMSG <
>
	RETSKP			;SKIP RETURN
	
; ROUTINE TO DUMP USER OR DIRECTORY GROUPS

; ACCEPTS GB/	ADDRESS OF GROUP BLOCK
;		CALL DMPGRP
; RETURNS	+1 ALWAYS

DMPGRP:	MOVEI P1,1(GB)		;COPY ADR OF FIRST  GROUP BLOCK
	MOVE 1,JFN		;GET OUTPUT JFN
	MOVEI 3,^D10		;DECIMAL RADIX
	MOVEI P2,GRPSIZ		;# OF WORDS IN GROUP BLOCK
	MOVE 2,(P1)		;GET FIRST WORD OF BLOCK
	JRST DMPGP2		;GO DO FIRST GROUP
DMPGP1:	MOVEI 2,","		;GET DELIMITER
	BOUT			;OUTPUT THE COMMA
	MOVE 2,(P1)		;GET GROUP # AGAIN
	MOVE 1,JFN		;GET JFN BACK
DMPGP2:	NOUT			;OUTPUT THE GROUP #
	 JSHLT			;UNEXPECTED ERROR
	JUMPE 2,R		;QUIT ON ZERO
	SOJLE P2,DMPGP3		;GROUP BLOCK IS TOO SMALL ?
	AOJA P1,DMPGP1		;GO OUTPUT NEXT PAIR OF GROUPS
DMPGP3:	TMSG <
? GROUP BLOCK IS TOO SMALL, ABORTING ...
>
	HALTF
	JRST .-1
FORMAT:	ASCIZ \
Data Format:

STR:<DIRECTORY-NAME>
 PASSWORD
 LOGGED IN QUOTA
 CAPABILITIES
 FILES ONLY, ALPHA ACCTS, REPEAT LMSG
 LOGGED OUT QUOTA
 DIRECTORY NUMBER
 DEFAULT FILE PROTECTION
 DIRECTORY PROTECTION
 DEFAULT RETENTION SPECIFICATION
 LAST LOGIN
 USER GROUPS
 DIRECTORY GROUPS
 MAXIMUM SUBDIRECTORIES
 CREATABLE USER GROUPS
 DEFAULT DIRECTORY ACCOUNT
 PASSWORD ENCRYPTION VERSION NUMBER
 PASSWORD ENCRYPTION DATE/TIME
 PASSWORD EXPIRATION DATE/TIME
 PASSWORD USE DATA (CURRENT USE COUNT,,MAXIMUM USE COUNT)
\
	SUBTTL EXIT (TO MONITOR)

;USER WANTS TO QUIT.  GET CONFIRMATION AND EXIT

.EXIT:
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMNOI,,TXTPTR <TO MONITOR>)];T2/ADDRESS OF FDB
	COMND			;TYPE NOISE WORD IF NEEDED
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMCFM)] ;T2/ADDRESS OF FUNCTION DESCRIPTOR BLOCK
	COMND			;GET CONFIRMATION
	TXNE T1,CM%NOP		;DID WE GET IT?
	ERROR PARSE1,<INVALID COMMAND CONFIRMATION> ;NO
	SETOM T1		;T1/INDICATES ALL FILES
	CLOSF			;CLOSE ALL OPEN FILES
	 JSERR			;PRINT ERROR AND CONTINUE
	HALTF			;RETURN TO MONITOR
	JRST START		;IF CONTINUED, START OVER
	SUBTTL STRUCTURE (TO USE)

;USED TO SPECIFY STR OTHER THAN DEFAULT

.STR:	HRROI T1,NAMBUF		;INIT POINTER
	MOVEM T1,NAMPTR
	MOVEI T1,CMDBLK		;COMND INFO
	MOVEI T2,[FLDDB. (.CMNOI,,TXTPTR <TO USE>)]
	COMND
	MOVEI T2,[FLDDB. (.CMDEV,CM%SDH,,<STRUCTURE NAME>,<DSK>)]
	COMND
	TXNE T1,CM%NOP		;LOSAGE?
	ERROR PARSE1,<INVALID STRUCTURE NAME GIVEN>
	MOVEM T2,STRDV		;SAVE DESIGNATOR A WHILE
	MOVEI T2,[FLDDB. (.CMCFM)]
	COMND
	TXNE T1,CM%NOP
	ERROR PARSE1,<INVALID COMMAND CONFIRMATION>
	MOVE T1,STRDV		;GET DEVICE DESIGNATOR
	DVCHR
	LDB T1,[POINTR T2,DV%TYP]
	CAIE T1,.DVDSK		;GRNTEE DISK
	ERROR PARSE1,<INVALID STRUCTURE NAME GIVEN>
	MOVE T2,STRDV		;DEVICE DESIGNATOR
	MOVE T1,NAMPTR		;GET PNTR
	DEVST			;GET STRING
	 JRST [	JSERR
		JRST PARSE]	;START OVER
	MOVEI T2,":"		;TERMINATE WITH COLON
	IDPB T2,T1		;...
	MOVEM T1,NAMPTR		;UPDATE PNTR
	JRST PARSE3		;GET NEXT COMMAND
	SUBTTL HELP

;USER WANTS AN EXPLANATION

.HELP:	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMCFM)] ;T2/ ADDRESS OF FDB
	COMND			;GET CONFIRMATION
	TXNE T1,CM%NOP		;DID WE GET IT?
	ERROR PARSE1,<INVALID COMMAND CONFIRMATION> ;NO. PRINT ERROR
	HRROI T1,HLPMSG
	PSOUT			;TYPE THE HELP MESSAGE TO USER'S TTY
	JRST PARSE3

;TEXT FOR HELP MESSAGE

HLPMSG:	ASCIZ\		TOPS-20 DLUSER
FUNCTIONS:
	1) DUMP ONTO A FILE IDENTIFYING INFORMATION ABOUT EACH DIRECTORY
IN THE SYSTEM
	2) CREATE DIRECTORIES ON A SYSTEM BY LOADING IDENTIFYING 
INFORMATION FROM A FILE

COMMANDS:
	DUMP (TO FILE) FILE-SPECIFICATION
	  DUMP DIRECTORIES TO FILE
	EXIT (TO MONITOR)
	  LEAVE THIS PROGRAM
	HELP
	  PRINT THIS MESSAGE
	LOAD (FROM FILE) FILE-SPECIFICATION
	  LOAD DIRECTORIES FROM FILE
	STRUCTURE (TO USE) STR-NAME:
	   SPECIFY STRUCTURE TO DUMP FROM/LOAD ONTO
	   (DEFAULT IS CONNECTED STRUCTURE)

THIS PROGRAM IS USEFUL FOR MOVING ALL DIRECTORIES FROM ONE FILE SYSTEM
TO ANOTHER.  IT WILL NOT MOVE A SUBSET.  IT MUST BE RUN WITH WHEEL OR
OPERATOR CAPABILITIES ENABLED.
\
	SUBTTL LOAD (FROM FILE) FILE-SPECIFICATION

;USER WANTS TO LOAD DIRECTORIES ONTO SYSTEM FROM A FILE.  GET THE FILE NAME

.LOAD:
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMNOI,,TXTPTR <FROM FILE>)];T2/ADDRESS OF FDB
	COMND			;TYPE NOISE WORD IF NEEDED
	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMIFI)] ;T2/ADDRESS OF FUNCTION DESCRIPTOR BLOCK
	COMND			;GET OUTPUT FILE
	TXNE T1,CM%NOP		;DID WE GET A GOOD FILE NAME
	JRST [	JSERR		;FAILED. REPORT ERROR
		JRST PARSE1]
	HRRZM T2,JFN		;YES. SAVE THE JFN

	MOVEI T1,CMDBLK		;T1/ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMCFM)] ;T2/ADDRESS OF FUNCTION DESCRIPTOR BLOCK
	COMND			;GET CONFIRMATION
	TXNE T1,CM%NOP		;DID WE GET IT?
	ERROR PARSE1,<INVALID COMMAND CONFIRMATION> ;NO. START OVER

;OPEN THE FILE

	MOVE T1,JFN		;T1/JFN OF INPUT FILE
	MOVX T2,<OF%RD+FLD(7,OF%BSZ)> ;T2/OPEN FOR READ, 7-BIT BYTES
	OPENF			;OPEN FILE TO DUMP ONTO
	 JRST [	JSERR		;PRINT THE ERROR MESSAGE
		JRST PARSE1]	;START PARSING AGAIN
	JRST LODUSR
;SUBROUTINE TO LOAD ALL DIRECTORIES FROM SPECIFIED FILE

LODUSR:	CALL FNDUSR		;FIND A USER NAME
	 JRST LODEND		;EOF SEEN
	CALL SCNSPC		;SCAN TO SPACE MARKING PASSWORD
	 JRST INPERR
	MOVE 5,[POINT 7,PASBUF,-1]
	MOVEM 5,EBUF+.CDPSW
	CALL RDSTR		;READ PASSWORD
	 JRST INPERR

;LOOP THROUGH THE DATA FOR THIS DIRECTORY, COPYING EACH WORD INTO THE
;ARGUMENT BLOCK FOR CRDIR. EACH ITEM IS PRECEDED BY <CR><LF><SPACE>

	MOVSI 7,-<.CDLLD-.CDLIQ+1> ;ALL PARAMS - NAME, PASSWD, GROUPS
LODUS3:	CALL SCNSPC		;POSITION TO BEGINNING OF NUMBER
	 JRST INPERR
	MOVEI 3,10
	NIN			;READ NUMBER
	JRST [	CAIE 3,IFIXX3	;NORMAL OVERFLOW?
		JRST LODERR
		JRST .+1]	;YES, HAPPENS ON 36 BIT OCTAL NUMBER
	MOVEM 2,EBUF+2(7)
	AOBJN 7,LODUS3

;CALL ROUTINES TO SET UP BLOCKS OF USER AND DIRECTORY GROUP NUMBERS.
;STORE POINTERS TO THESE BLOCKS IN THE CRDIR ARGUMENT BLOCK

	MOVEI GB,UGROUP		;GET ADR OF GROUP BLOCK
	CALL LODGRP		;GO READ USER GROUPS
	MOVEM GB,EBUF+.CDUGP	;STORE ADR OF USER GROUPS
	MOVEI GB,DGROUP		;GET ADR OF DIR GROUP BLOCK
	CALL LODGRP		;GO READ DIRECTORY GROUPS
	MOVEM GB,EBUF+.CDDGP	;STORE ADR OF DIR GROUPS

;COPY THE MAXIMUM NUMBER OF SUBDIRECTORIES INTO THE CRDIR ARGUMENT BLOCK

	CALL SCNSPC		;LOOK FOR THE SPACE THE STARTS THE FIELD
	 JRST INPERR
	MOVEI 3,10		;T3/ OCTAL NUMBER
	NIN			;READ THE NUMBER
	JRST [	CAIE 3,IFIXX3	;NORMAL OVERFLOW?
		JRST LODERR
		JRST .+1]	;YES, HAPPENS ON 36 BIT OCTAL NUMBER
	MOVEM T2,EBUF+.CDSDQ	;STORE IT IN CRDIR ARGUMENT BLOCK

;CALL ROUTINE TO COPY THE LIST OF USER GROUPS THAT THIS DIRECTORY'S
;SUBDIRECTORIES CAN HAVE

	MOVEI GB,CRTGRP		;GET ADDRESS OF CREATABLE GROUP LIST
	CALL LODGRP		;SET UP THE BLOCK
	MOVEM GB,EBUF+.CDCUG	;STORE POINTER IN CRDIR ARGUMENT BLOCK

;COPY THE DEFAULT DIR ACCOUNT INTO THE CRDIR ARGUMENT BLOCK

	MOVE 5,[POINT 7,ACTBUF,-1]
	MOVEM 5,EBUF+.CDDAC
	CALL RDSTR		;READ THE ACCOUNT
	 JRST INPERR		;ERROR

;Copy password encryption version number

	CALL SCNSPC
	 JRST INPERR
	MOVEI T3,^D10
	NIN%
	 JRST [	CAIE T3,IFIXX3	;Overflow?
		JRST LODERR
		JRST .+1]	;Yes, tolerate it
	MOVEM T2,EBUF+.CDPEV

;Copy password encryption date

	CALL SCNSPC
	 JRST INPERR
	BIN%			;See if zero or real date
	SUBI T2,"0"
	JUMPE T2,STRPDT
	BKJFN			;Backup the JFN and get the date
	SETZM T2
	IDTIM
	JRST LODERR
STRPDT:	MOVEM T2,EBUF+.CDPDT

;Copy password expiration date

	CALL SCNSPC
	 JRST INPERR
	BIN%			;See if zero or real date
	SUBI T2,"0"
	JUMPE T2,STRPED
	BKJFN			;Backup the JFN and get the date
	SETZM T2
	IDTIM
	JRST LODERR
STRPED:	MOVEM T2,EBUF+.CDPED

;Copy password use data

	CALL SCNSPC
	 JRST INPERR
	MOVEI T3,^D10		;Get the Current use count
	NIN%
	 JRST [	CAIE T3,IFIXX3	;Overflow?
		JRST LODERR
		JRST .+1]	;Yes, tolerate it
	HRLM T2,EBUF+.CDPMU
	BIN			;NIN read first comma, now read second
	MOVEI T3,^D10
	NIN%			;Get the maximum use count
	 JRST [	CAIE T3,IFIXX3	;Overflow?
		JRST LODERR
		JRST .+1]	;Yes, tolerate it
	HRRM T2,EBUF+.CDPMU
;WITH THE DATA TAKEN FROM THE INPUT FILE, DO A CRDIR TO CREATE THE
;DESIRED DIRECTORY

	;DO NOT UPDATE QUOTA, PASSWORDS ENCRYPTED
	MOVX T1,CD%NSQ+CD%PEN+CD%PED+CD%PMU
	MOVE T2,EBUF+.CDNUM	;SYSTEM DIRECTORIES ALWAYS GET CHANGED
	CAILE T2,SYSMAX		;SO IS THIS ONE?
	TXO T1,CD%NCE		;NO, THEN DON'T CHANGE EXISTING DIRECTORIES
	HRRI T1,EBUFLN	;GET LENGTH OF ARG BLOCK
	MOVEM T1,.CDLEN+EBUF	;SET FLAGS IN BLOCK
	HRROI T1,NAMBUF
	MOVE T2,[XWD 777774,EBUF] ;INDICATE ALL DATA IS TO BE USED
	CRDIR
	 ERJMP LODERR
	MOVEM T1,USERNO		;SAVE FOR ^A WATCHER
	JRST LODUSR

LODERR:	MOVEI T1,.FHSLF		;GET ERROR NUMBER
	GETER
	HRRZ T1,T2		;GET ERROR ONLY
	CAIN T1,CRDIX8		;IS IT INVALID DIR #?
	JRST [ HRROI T1,NAMBUF	;YES, TRY FOR DEFAULT
		MOVE T2,[XWD 773774,EBUF]
		CRDIR
		 ERJMP .+1
		MOVEM T1,USERNO
		JRST LODUSR]
	MOVEI 1,.PRIOU
	HRLOI 2,.FHSLF
	SETZ 3,
	ERSTR
	 JRST [	HRROI 1,[ASCIZ /ERSTR: UNDEFINED ERROR NUMBER - /]
		JRST LODER1]
	 JRST [	HRROI 1,[ASCIZ /ERSTR: INTERNAL CONFUSION - /]
		JRST LODER1]
	HRROI 1,[ASCIZ / - /]
LODER1:	PSOUT
	HRROI 1,NAMBUF
	PSOUT
	HRROI 1,[ASCIZ /
/]
	PSOUT
	JRST LODUSR

;NULL FOUND. SEE IF END OF FILE

LODEND:	GTSTS
	TXNE T2,GS%EOF		;END OF FILE?
	JRST DONE		;YES - THROUGH
INPERR:	TMSG <?Error while reading - >
	MOVEI T1,.PRIOU
	MOVE T2,JFN
	MOVEI T3,0		;DEFAULTS
	JFNS
	TMSG <
>
	JRST PARSE		;RESTART

RDSTR:	BIN
	 ERJMP [RET]
	CAIN 2,.CHCRT		;CARRAIGE RETURN?
	JRST RDSTR		;YES, IGNORE IT
	CAIN 2,.CHLFD
	SETZ 2,			;APPEND NULL ON END OF STRING
	IDPB 2,5
	JUMPN 2,RDSTR
	RETSKP

SCNSPC:	BIN
	 ERJMP [RET]
	CAIE 2," "
	JRST SCNSPC
	RETSKP
;ROUTINE TO LOCATE USER NAME IN FILE

FNDUSR:	MOVE T1,JFN		;INPUT JFN
FNDUS1:	BIN
	 ERJMP [RET]		;MAYBE EOF
	CAIN T2,"!"		;CHECK FOR OLD STYLE NAME
	JRST FNDOLD		;IT IS - HANDLE IT
	CAIE T2,"&"		;NEW STYLE DELIMITER
	JRST FNDUS1		;NEITHER - KEEP LOOKING
	MOVE 5,NAMPTR		;GET POINTER
	TLC 5,-1		;CHECK IF STR NAME GIVEN
	TLCN 5,-1
	JRST [	HRLI 5,(<POINT 7,0>)
		CALLRET RDSTR]	;FETCH NAME
FNDUS2:	BIN			;STR NAME GIVEN - SKIP ONE IN FILE
	 ERJMP [RET]
	CAIE T2,":"
	JRST FNDUS2		;LOOP TILL COLON SEEN
	CALLRET RDSTR		;FETCH REMAINDER AND RETURN

FNDOLD:	MOVE 5,NAMPTR		;GET POINTER
	TLC 5,-1		;CHECK IF STR NAME GIVEN
	TLCN 5,-1
	HRLI 5,(<POINT 7,0>)
	MOVEI T2,"<"		;MUST ADD DIR DELIMS TO OLD NAMES
	IDPB T2,5
	CALL RDSTR		;FETCH REMAINDER OF NAME
	 RET			;ERROR
	MOVEI T2,">"		;APPEND CLOSING DELIM
	DPB T2,5		;OVER NULL
	MOVEI T2,0
	IDPB T2,5		;APPEND NULL
	RETSKP			;GOOD RETURN
; ROUTINE TO LOAD A GROUP

; ACCEPTS IN GB/	ADDRESS OF GROUP BLOCK
;			CALL LODGRP
; RETURNS		+1 ALWAYS


LODGRP:	CALL SCNSPC		;MOVE INPUT POINTER TO FIRST GROUP
	MOVE 1,JFN		;GET INPUT JFN
	MOVEI P1,1(GB)		;GET ADR OF GROUP BLOCK+1
	MOVEI 3,^D10		;USE DECIMAL RADIX

LODGP1:	NIN			;GET A GROUP #
	 JRST LODGP2		;MUST BE END-OF-LIST
	MOVEM 2,(P1)		;STORE GROUP #
	JUMPE 2,LODGP2		;GO STORE COUNT IF END-OF-LIST
	CAIL P1,GRPSIZ-1(GB)	;IS ENTIRE GROUP BLOCK FULL ?
	JRST LODGP3		;YES, ISSUE ERROR MESSAGE
	AOJA P1,LODGP1		;GO DO NEXT PAIR OF GROUPS

LODGP2:	SUB P1,GB		;COMPUTE # OF WORDS USED IN BLOCK
	MOVEM P1,(GB)		;STORE # OF WORDS USED
	RET			;RETURN TO WHENCE WE CAME ...

LODGP3:	TMSG <
? GROUP BLOCK TOO SMALL, ABORTING ...
>
	HALTF			;QUIT
	JRST .-1
;PROCESSING OF FILE COMPLETE (LOAD OR DUMP). CLOSE FILE

DONE:	SETZM USERNO		;SAY NOTHING
	MOVE 1,JFN
	CLOSF
	 JFCL
	TMSG <
DONE.
>
	JRST PARSE3
;INTERUPT PROCESSING

LEVTAB:	RET1
	RET2
	RET3

CHNTAB:	2,,BADINT
	3,,SUMINT
REPEAT ^D34,<
	2,,BADINT
>

;USER TYPED CTRL/A TO SEE WHAT DIRECTORY WAS BEING DONE.  IF ANY,
;PRINT ITS NAME

SUMINT:	SKIPN USERNO		;ANYTHING TO WATCH
	DEBRK			;NO
	PUSH P,T1		;SAVE REGS
	PUSH P,T2
	PUSH P,T3
	TMSG < Working on directory >
	MOVEI T1,.PRIOU
	MOVE T2,USERNO
	DIRST			;PRINT USER NAME
	 JFCL			;TOUGH
	MOVEI T1,.CHCRT		;CARRIAGE RETURN
	PBOUT
	MOVEI T1,.CHLFD
	PBOUT
	POP P,T3		;RESTOR
	POP P,T2
	POP P,T1
	DEBRK			;EXIT INT

BADINT:	PUSH P,T1
	TMSG < Unexpected interupt - ignored...
>
	POP P,T1
	DEBRK
	END <3,,ENTVEC>