	! ----- GET_USERNAME.FUN -----
	!
	! ----- SUBROUTINE TO GET USERNAME TO BE AFFECTED -----
	!
	! ---------- PASSED: ----------
	!
	! -----		ACTION_INDEX = USER_ACTIONS() program action array index
	! -----		BACKWARDS = TRUE if we're moving backwards thru prompts
	! -----		DEBUG_MODE = TRUE if debug mode is enabled
	! -----		FLAGS(0%) = User's SYSUAF Login Flags
	! -----		PLEASE_TRY_AGAIN = "Please Try Again" error message
	! -----		SYSUAF_NODES() = List of nodes where username exists
	! -----		THE_USERNAME = Username of person running this program
	! -----		USERNAME_LENGTH = Length of THE_USERNAME
	!
	! ---------- RETURNED: ----------
	!
	! -----		ACTION_SEQ = Next User Input Sequence routine to process
	! -----			     (-1 if done with all user inputs)
	! -----		BACKWARDS = TRUE if we're moving backwards thru prompts
	! -----		COPY_USER_FILE_INDEX = SYSUAF_NODES() array index to
	! -----				       use when copying this user's acct
	! -----		COPY_USERS_ACCOUNT = TRUE to copy this user's account
	! -----		DEFAULT_MINIMUM_PASSWORD_LEN = Default Minimum Pwd Len
	! -----		DIRDEL = "Y" to also Delete Directory Tree
	! -----		ENTERED_USERNAME = Username whose acct is to be affected
	! -----				   (ENTERED_USERNAME is "B" to backup)
	! -----		INVALID_DIVISION = TRUE if user is in an unauthorized
	! -----				   division
	! -----		NODE_LIST = List of nodes that user is on
	! -----		OTHER_NODE is TRUE if any username is found on a
	! -----			non-local node
	!
	! ----- Last Change 04/08/94 by Brian Lomasky -----
	!
	SUB GET_USERNAME(STRING DIRDEL, STRING NODE_LIST)

		%INCLUDE "NUSER.INC"

		DECLARE WORD RECORD_FOUND	! TRUE IF MATCHING RECORD FOUND
		DECLARE WORD TEMP		! TEMPORARY WORD VARIABLE
		DECLARE STRING TEMP_STRING	! TEMPORARY STRING
		DECLARE WORD VALID_ENTRY	! TRUE IF VALID ENTRY

		EXTERNAL WORD FUNCTION LOOKUP_DISPLAY_USER_INFO(	&
			WORD, WORD)		! LOOKUP AND DISPLAY USER INFO
		EXTERNAL WORD FUNCTION SEARCH_SYSUAF(STRING,		&
			WORD)			! SEARCH SYSUAF FOR USERNAME
		EXTERNAL WORD FUNCTION VALID_USER(STRING,		&
			WORD, WORD)		! SEE IF VALID USERNAME IDENT

	GET_USERNAME_AGAIN:

		BACKWARDS = FALSE		! NOT MOVING BACK THRU PROMPTS
		COPY_USERS_ACCOUNT = FALSE	! ASSUME NOT COPYING ACCOUNT
		NODE_COUNTER = 0%		! INIT COUNT OF NODES
		VALID_ENTRY = FALSE
		WHILE NOT VALID_ENTRY
			PRINT
			RECORD_FOUND = TRUE
			WHEN ERROR IN
				SELECT USER_ACTIONS(ACTION_INDEX)
				CASE "A"
					LINPUT #98%,			&
			      "Enter Username for the account to be created: ";&
						ENTERED_USERNAME
				CASE "D"
					LINPUT #98%,			&
			      "Enter Username for the account to be deleted: ";&
						ENTERED_USERNAME
				CASE "R"
					LINPUT #98%,			&
	      'Enter Username whose account is to be made Restricted: '; &
						ENTERED_USERNAME
				CASE "N"
					LINPUT #98%,			&
	      'Enter Username whose account is to be made non-Restricted: '; &
						ENTERED_USERNAME
				CASE "G"
					LINPUT #98%,			&
	      "Enter Username to grant database access to: ";		&
						ENTERED_USERNAME
				CASE "X"
					LINPUT #98%,			&
	      "Enter Username to deny database access from: ";		&
						ENTERED_USERNAME
				CASE "F"
					LINPUT #98%,			&
	      "Enter Username to change division-specific access for: ";&
						ENTERED_USERNAME
				CASE "T"
					LINPUT #98%,			&
	      "Enter Username to change the security template for: ";	&
						ENTERED_USERNAME
				CASE "I"
					LINPUT #98%,			&
	      "Enter Username to grant or deny additional identifiers to: "; &
						ENTERED_USERNAME
				CASE "P"
					LINPUT #98%,			&
	      "Enter Username whose password is to be changed: ";	&
						ENTERED_USERNAME
				CASE "U"
					LINPUT #98%,			&
	      "Enter Username to change the department number for: ";	&
						ENTERED_USERNAME
				CASE "O"
					LINPUT #98%,			&
	      "Enter Username to change the First, Last name for: ";	&
						ENTERED_USERNAME
				END SELECT
			USE
				RECORD_FOUND = FALSE
				CONTINUE
			END WHEN
			IF NOT RECORD_FOUND THEN
				ENTERED_USERNAME = "B"
				BACKWARDS = TRUE! MOVING BACK THRU PROMPTS
				ACTION_SEQ = ACTION_SEQ - 1%
				EXIT SUB
			END IF

			! ----- UPPERCASE AND DISCARD ANY GARBAGE CHARS -----
			ENTERED_USERNAME = EDIT$(ENTERED_USERNAME, 38%)
			IF DEBUG_MODE THEN
				PRINT "DEBUG>USERNAME IS " +		&
					TRM$(ENTERED_USERNAME) + "*"
			END IF

			! ----- ASSUME USER'S DATA IS NOT TO BE COPIED -----
			COPY_USER_FILE_INDEX = 0%

			IF ENTERED_USERNAME = "B" THEN
				BACKWARDS = TRUE! MOVING BACK THRU PROMPTS
				ACTION_SEQ = ACTION_SEQ - 1%
				EXIT SUB
			END IF

			IF LEN(TRM$(ENTERED_USERNAME)) = 0% THEN
				PRINT
				PRINT "Error - You must enter a" +	&
					" username" + TRM$(PLEASE_TRY_AGAIN)
				PRINT
				ITERATE
			END IF
			IF LEN(TRM$(ENTERED_USERNAME)) > 12% THEN
				PRINT
				PRINT "Error - Username is too long" +	&
					TRM$(PLEASE_TRY_AGAIN)
				PRINT
				ITERATE
			END IF

			! ----- SEE IF USERNAME SAME AS PERSON RUNNING -----
			! ----- THIS UTILITY -----
			IF LEFT(THE_USERNAME, USERNAME_LENGTH) =	&
				TRM$(ENTERED_USERNAME)
			THEN
				SELECT USER_ACTIONS(ACTION_INDEX)
				CASE "D"
					PRINT
					PRINT "You are not allowed to"	&
						+ " commit suicide!" + BEL
					PRINT
					ITERATE
				CASE "R"
					PRINT
					PRINT "Warning - You are" +	&
						" about to make" +	&
						" your own account" +	&
						" into a Restricted" +	&
						" account!" + BEL
					PRINT
				CASE "X"
					PRINT
					PRINT "Warning - You are" +	&
						" about to deny" +	&
						" database access" +	&
						" for your own account!" + BEL
					PRINT
				CASE "F"
					PRINT
					PRINT "Warning - You are" +	&
						" about to change" +	&
						" division-specific" +	&
						" access for your" +	&
						" own account!" + BEL
					PRINT
				CASE "T"
					PRINT
					PRINT "Warning - You are" +	&
						" about to change" +	&
						" the security" +	&
						" template for your" +	&
						" own account!" + BEL
					PRINT
				CASE "I"
					PRINT
					PRINT "Warning - You are" +	&
						" about to grant or" +	&
						" deny identifiers" +	&
						" for your own account!" + BEL
					PRINT
				CASE "P"
					PRINT
					PRINT "Warning - You are" +	&
						" about to change the"	&
						+ " password for your"	&
						+ " own account!" + BEL
					PRINT
				CASE "U"
					PRINT
					PRINT "Warning - You are" +	&
						" about to change the"	&
						+ " department for" +	&
						" your own account!" + BEL
					PRINT
				CASE "O"
					PRINT
					PRINT "Warning - You are" +	&
						" about to change your"	&
						+ " own name!" + BEL
					PRINT
				END SELECT
			END IF

			! ----- MOVE USER RESPONSE TO MAP -----
			USER_NAME = ENTERED_USERNAME
			THE_USERS_COUNTER = 0%	! INIT USERNAME COUNTER

			IF DEBUG_MODE THEN
				PRINT "DEBUG>CALL SEARCH_SYSUAF"
				PRINT "DEBUG>COPY_USER_FILE_INDEX=";	&
					COPY_USER_FILE_INDEX
			END IF
			! ----- SEE IF USER ON ANY NODE -----
			RECORD_FOUND = SEARCH_SYSUAF(NODE_LIST, VALID_ENTRY)
			IF DEBUG_MODE THEN
				PRINT "DEBUG>AFTER SEARCH_SYSUAF," +	&
					" RECORD_FOUND="; RECORD_FOUND
			END IF
			IF INVALID_DIVISION THEN
				IF DEBUG_MODE THEN
					PRINT "DEBUG>INVALID DIVISION"
				END IF
				VALID_ENTRY = FALSE
				ITERATE
			END IF

			IF USER_ACTIONS(ACTION_INDEX) = "A" THEN
				IF DEBUG_MODE THEN
					PRINT "DEBUG>USER ACTION = ADD"
				END IF
				IF RECORD_FOUND THEN
					PRINT
					PRINT "Error - This username" +	&
						" already exists" +	&
						TRM$(PLEASE_TRY_AGAIN)
					! ----- LOOKUP AND DISPLAY USER -----
					! ----- INFO -----
					TEMP = LOOKUP_DISPLAY_USER_INFO(&
						1%, VALID_ENTRY)
					VALID_ENTRY = FALSE
					ITERATE
				END IF
				IF DEBUG_MODE THEN
					PRINT "DEBUG>" +		&
						"COPY_USER_FILE_INDEX=";&
						COPY_USER_FILE_INDEX
				END IF
				! ----- SEE IF USER DATA IS TO BE COPIED -----
				IF COPY_USER_FILE_INDEX <> 0% THEN
					PRINT
					VALID_ENTRY = FALSE
					WHILE NOT VALID_ENTRY
						RECORD_FOUND = TRUE
						WHEN ERROR IN
							PRINT		&
							"Do you want to " &
							+ "create this"	&
							+ " user's acc"	&
							+ "ount using "	&
							+ "information"	&
							+ " from node "	&
							+ TRM$(		&
							SYSUAF_NODES(	&
							COPY_USER_FILE_INDEX &
							- 49%)) + "?"
							LINPUT #98%,	&
				"  (Enter  Y  or  N,  Default of Y): "; &
								TEMP_STRING
						USE
							RECORD_FOUND = FALSE
							CONTINUE
						END WHEN
						GOTO GET_USERNAME_AGAIN	&
							IF NOT RECORD_FOUND

						! ----- UPPERCASE AND -----
						! ----- DISCARD ANY -----
						! ----- GARBAGE CHARS -----
						TEMP_STRING = EDIT$(	&
							TEMP_STRING, 38%)

						GOTO GET_USERNAME_AGAIN	&
							IF TEMP_STRING = "B"

						TEMP_STRING = "Y" IF	&
							TEMP_STRING = ""

						GOTO GET_USERNAME_AGAIN	&
							IF TEMP_STRING = "N"

						IF TEMP_STRING <> "Y" THEN
							PRINT
							PRINT "Error -"	&
								+ " Invalid" + &
								" response" + &
								TRM$(	&
							       PLEASE_TRY_AGAIN)
							PRINT
							ITERATE
						END IF

						VALID_ENTRY = TRUE
					NEXT
					! ----- SET FLAG FOR ACCOUNT COPY -----
					COPY_USERS_ACCOUNT = TRUE
					! ----- SET FLAG SO AS TO NEXT -----
					! ----- PROMPT FOR -----
					! ----- GET_DEFAULT_QUEUE -----
					TEMP = 0%
					ACTION_SEQ = 0%
					WHILE TEMP < USER_SEQS(ACTION_INDEX)
						TEMP = TEMP + 1%
						IF USER_SEQ(		&
							ACTION_INDEX,	&
							TEMP) = 7%
						THEN
							ACTION_SEQ = TEMP
						END IF
					NEXT
					IF ACTION_SEQ = 0% THEN
						PRINT "Error - No" +	&
							" USER_SEQ()" +	&
							" of 7 found" +	&
							" for " +	&
							"ACTION_INDEX" +&
							" of " + NUM1$(	&
							ACTION_INDEX) +	&
							" - Aborting..."
						PRINT "Notify your VAX"	&
							+ " System" +	&
							" Manager" + BEL
						CALL SYS$EXIT(		&
							ERROR_WITH_NO_PUTMSG &
							BY VALUE)
					END IF
					EXIT SUB
				END IF
			ELSE
				! ----- RE-READ LOCAL NODE'S SYSUAF -----
				! ----- RECORD, IF POSSIBLE -----
				IF TRM$(SYSUAF_SPECS(1%)) <> "" THEN
					! ----- RE-READ THIS USER'S SYSUAF -----
					! ----- RECORD -----
					RECORD_FOUND = TRUE
					WHEN ERROR IN
						GET #50%, KEY #0% EQ	&
							USER_NAME, REGARDLESS
					USE
						IF ERR = BUCKET_LOCKED THEN
							SLEEP 1%
							RETRY
						END IF
						IF ERR = REC_NOT_FOUND THEN
							RECORD_FOUND = FALSE
							CONTINUE
						END IF
						EXIT HANDLER
					END WHEN
					IF NOT RECORD_FOUND THEN
						PRINT
						PRINT "Someone just" +	&
							" deleted the" +&
							" record for " +&
							TRM$(		&
							ENTERED_USERNAME) + BEL
						ITERATE
					END IF
					UNLOCK #50%
				END IF
				IF DEBUG_MODE THEN
					PRINT "DEBUG>USER ACTION=" +	&
						USER_ACTIONS(ACTION_INDEX) + "*"
				END IF
				SELECT USER_ACTIONS(ACTION_INDEX)
				CASE "R"
					! ----- ERROR IS THIS USER IS -----
					! ----- ALREADY [NON-]RESTRICTED -----
					IF (FLAGS(0%) AND 8%) <> 0% THEN
						PRINT
						PRINT "Error - This" +	&
							" user is" +	&
							" already" +	&
							" Restricted" +	&
							TRM$(PLEASE_TRY_AGAIN)
						PRINT
						ITERATE
					END IF
				CASE "N"
					! ----- ERROR IS THIS USER IS -----
					! ----- ALREADY [NON-]RESTRICTED -----
					IF (FLAGS(0%) AND 8%) = 0% THEN
						PRINT
						PRINT "Error - This" +	&
							" user is" +	&
							" already non" +&
							"-Restricted" +	&
							TRM$(PLEASE_TRY_AGAIN)
						PRINT
						ITERATE
					END IF
				CASE "P"
					! ----- SAVE THE ORIGINAL -----
					! ----- MINIMUM PASSWORD LENGTH -----
					! ----- OF THE USER BEING CHANGED, -----
					! ----- SO WE CAN CHANGE IT BACK -----
					! ----- TO ITS CORRECT VALUE LATER -----
					DEFAULT_MINIMUM_PASSWORD_LEN =	&
						MINIMUM_PASSWORD_LENGTH
				END SELECT

				! ----- ENSURE THAT THIS USER'S UIC-FORMAT -----
				! ----- IDENTIFIER ALREADY EXISTS (FOR -----
				! ----- THOSE COMMANDS WHICH REQUIRE IT) -----
				SELECT USER_ACTIONS(ACTION_INDEX)
				CASE "G", "X", "T", "F", "I"
					IF DEBUG_MODE THEN
						PRINT "DEBUG>Ensure" +	&
							" UIC ident exists"
					END IF
					! ----- VALIDATE USERNAME -----
					ITERATE IF VALID_USER(		&
						ENTERED_USERNAME, 1%, FALSE)
				END SELECT

				! ----- LOOKUP AND DISPLAY USER INFO -----
				PRINT
				PRINT "Displaying this user's account"	&
					+ " information for node " +	&
					TRM$(SYSUAF_NODES(1%)) + "..."
				ITERATE IF LOOKUP_DISPLAY_USER_INFO(1%,	&
					VALID_ENTRY)
			END IF

			IF DEBUG_MODE THEN
				PRINT "DEBUG>VALID USERNAME"
			END IF
			VALID_ENTRY = TRUE
		NEXT

		SELECT USER_ACTIONS(ACTION_INDEX)
		CASE "D", "R", "N", "P"
			PRINT
			VALID_ENTRY = FALSE
			WHILE NOT VALID_ENTRY
				RECORD_FOUND = TRUE
				WHEN ERROR IN
					SELECT USER_ACTIONS(ACTION_INDEX)
					CASE "D"
						LINPUT #98%,		&
   "Do you really want to delete this username? (Y or N, Default of N): "; &
							TEMP_STRING
					CASE "R", "N"
						LINPUT #98%,		&
   "Do you really want to change this username? (Y or N, Default of N): "; &
							TEMP_STRING
					CASE "P"
						LINPUT #98%,		&
   "Do you really want to change the password for this username? (Y or N): "; &
							TEMP_STRING
					END SELECT
				USE
					RECORD_FOUND = FALSE
					CONTINUE
				END WHEN
				GOTO GET_USERNAME_AGAIN IF NOT RECORD_FOUND

				! ----- UPPERCASE AND DISCARD ANY GARBAGE -----
				! ----- CHARS -----
				TEMP_STRING = EDIT$(TEMP_STRING, 38%)

				GOTO GET_USERNAME_AGAIN IF TEMP_STRING = "B"

				TEMP_STRING = "N" IF TEMP_STRING = ""

				GOTO GET_USERNAME_AGAIN IF TEMP_STRING = "N"

				IF TEMP_STRING <> "Y" THEN
					PRINT
					PRINT "Error - Invalid response"&
						+ TRM$(PLEASE_TRY_AGAIN)
					PRINT
					ITERATE
				END IF

				VALID_ENTRY = TRUE
			NEXT

			SELECT USER_ACTIONS(ACTION_INDEX)
			CASE "D"
				VALID_ENTRY = FALSE
			CASE ELSE
				DIRDEL = "N"
				VALID_ENTRY = TRUE
			END SELECT
			WHILE NOT VALID_ENTRY
				RECORD_FOUND = TRUE
				WHEN ERROR IN
					IF OTHER_NODE THEN
						LINPUT #98%,		&
  "Do you want to delete this user's directory tree? (Y or N, Default of N): ";&
							DIRDEL
					ELSE
						LINPUT #98%,		&
  "Do you want to delete this user's directory tree? (Y or N, Default of Y): ";&
							DIRDEL
					END IF
				USE
					RECORD_FOUND = FALSE
					CONTINUE
				END WHEN
				GOTO GET_USERNAME_AGAIN IF NOT RECORD_FOUND

				! ----- UPPERCASE AND DISCARD ANY GARBAGE -----
				! ----- CHARS -----
				DIRDEL = EDIT$(DIRDEL, 38%)

				GOTO GET_USERNAME_AGAIN IF DIRDEL = "B"

				IF OTHER_NODE THEN
					DIRDEL = "N" IF DIRDEL = ""
				ELSE
					DIRDEL = "Y" IF DIRDEL = ""
				END IF

				IF DIRDEL <> "Y" AND DIRDEL <> "N" THEN
					PRINT
					PRINT "Error - Invalid response"&
						+ TRM$(PLEASE_TRY_AGAIN)
					PRINT
					ITERATE
				END IF

				VALID_ENTRY = TRUE

				! ----- DONE WITH ALL USER INPUTS -----
				ACTION_SEQ = 999%
				EXIT SUB
			NEXT
		END SELECT
		ACTION_SEQ = ACTION_SEQ + 1%	! CONTINUE WITH DESIRED PROMPT
	END SUB
