	SUBROUTINE ENABLE_LOGFILE (FILE)
C
C	Character string for questions and log file name.
C
	INCLUDE 'COM.INC/NOLIST'

	CHARACTER*(*) OPENQ, LOGQ, LOG_DEFAULT, FILE

	PARAMETER (OPENQ = 
	1 'The log file is already open, open a new file (Yes) ? ')
	PARAMETER (LOGQ = 'Enter the name of the log file (')
	PARAMETER (LOG_DEFAULT = 'VAXNET.LOG')

C
C	See if log file is already open.  If it is, ask if new file desired.
C
	IF (.NOT. LOGFILE) GO TO 200
100	CALL PROMPT_USER(OPENQ,%REF(SCRATCH),LEN(SCRATCH))
	IF (BACKUP) RETURN
	IF (WANTS_HELP) THEN
		CALL GET_HELP ('SET LOGFILE OPEN')
		GO TO 100
	ENDIF
	IF (LBYTE_COUNT .EQ. 0 .OR. SCRATCH(1:1) .EQ. 'Y') THEN
		CALL REF_LOGFILE()		! Close/reformat the log file.
	ELSE
		RETURN
	ENDIF
C
C	Setup the default log file name.
C
200	IF (STARTUP) THEN
	    STATUS = GET_SYMBOL ('LOG_FILE', LOG_FILE, LOGFILE_SIZE)
	ENDIF
	IF (LOGFILE_SIZE .EQ. 0) THEN
	    LOG_FILE = LOG_DEFAULT		! Default log file name.
	    LOGFILE_SIZE = LEN(LOG_DEFAULT)	! And the log file size.
	ENDIF
	IF (STARTUP) THEN
	    IF (STATUS) GO TO 220		! Go open the log file.
	ELSE
	    IF (LEN(FILE) .GT. 0) THEN
		LOG_FILE = FILE			! Copy specified file.
		LOGFILE_SIZE = LEN(FILE)	! And the log file size.
		GO TO 220			! Open specified log file.
	    ENDIF
	ENDIF
C
C	Ask for the log file name.
C
210	CALL PROMPT_USER(LOGQ//LOG_FILE(1:LOGFILE_SIZE)//'): '
	1		,%REF(SCRATCH),LEN(LOG_FILE))
	IF (BACKUP) RETURN
	IF (WANTS_HELP) THEN
		CALL GET_HELP ('SET LOGFILE')
		GO TO 210
	ENDIF
	IF (LBYTE_COUNT .GT. 0) THEN
		LOG_FILE = SCRATCH(1:LBYTE_COUNT)
		LOGFILE_SIZE = LBYTE_COUNT
	ENDIF
C
C	Append a .LOG extension of none was specified.
C
220	SON = INDEX (LOG_FILE(1:LOGFILE_SIZE), ']') + 1
	IF (INDEX (LOG_FILE(SON:LOGFILE_SIZE),'.') .EQ. 0) THEN
		LOG_FILE = LOG_FILE(1:LOGFILE_SIZE)//'.LOG' ! Append .LOG
		LOGFILE_SIZE = LOGFILE_SIZE + 4	! Adjust the filename size.
	ENDIF
	OPEN (UNIT=LOG_UNIT, TYPE='NEW', NAME=LOG_FILE(1:LOGFILE_SIZE),
	1	FORM='FORMATTED', RECORDTYPE='VARIABLE',
	1	RECORDSIZE=LOGBUF_SIZE, CARRIAGECONTROL='NONE',
	1	ORGANIZATION='SEQUENTIAL', BUFFERCOUNT=2)
	LOGFILE = .TRUE.
	RETURN
	END

	SUBROUTINE LOCAL_LOGFILE
C
C	Determine if local output to the logfile is desired.
C
	INCLUDE 'COM.INC/NOLIST'

	CHARACTER*(*) LOCALQ

	PARAMETER (LOCALQ = 
	1 'Do you want local output in the logfile (Yes) ? ')

	IF (STARTUP) THEN
		IF (GET_SYMBOL('LOG_LOCAL',SCRATCH,LBYTE_COUNT)) THEN
			GO TO 110
		ENDIF
	ENDIF
100	CALL PROMPT_USER(LOCALQ,%REF(SCRATCH),LEN(SCRATCH))
	IF (BACKUP) RETURN
	IF (WANTS_HELP) THEN
		CALL GET_HELP ('SET LOGLOCAL')
		GO TO 100
	ENDIF
110	LOG_LOCAL = .TRUE.		! Default to local logging.
	IF (SCRATCH(1:1) .EQ. 'N') THEN
		LOG_LOCAL = .FALSE.	! Disable local logging.
	ENDIF
	RETURN
	END

	SUBROUTINE WRITE_LOGFILE (BUFFER,NBYTES)
C
C	Copy characters read from remote to the logfile buffer and
C	write it to disk if is full.
C
	INCLUDE 'COM.INC/NOLIST'
	LOGICAL*1 BUFFER(1)

	IF (.NOT. LOGFILE) RETURN	! No logfile open.
	DO 100 I = 1,NBYTES
	RINDEX = RINDEX + 1		! Index into buffer.
	TBUFFER(RINDEX) = BUFFER(I) .AND. BITMASK ! Clean up the byte.
	IF (RINDEX .EQ. LOGBUF_SIZE) THEN
	    CALL FLUSH_LOGFILE()	! Write the log file.
	    RINDEX = 0			! Reinitialize the index.
	ENDIF
100	CONTINUE
	RETURN
	END

	SUBROUTINE FLUSH_LOGFILE
C
C	This routine writes the logfile buffer to the disk when the
C	buffer is either full or to flush the buffer when exiting.
C
	INCLUDE 'COM.INC/NOLIST'

	IF (LOGFILE) THEN
		WRITE (LOG_UNIT,100) (TBUFFER(I),I=1,RINDEX)
100		FORMAT(<RINDEX>A1)
		RINDEX = 0
	ENDIF
	RETURN
	END

	SUBROUTINE REF_LOGFILE
C
C	This routine is used to close and reformat the log file.
C
	INCLUDE 'COM.INC/NOLIST'
	INTEGER REF_FLAG

	IF (.NOT. LOGFILE) RETURN 		! No log file open.
	CALL FLUSH_LOGFILE()			! Empty the logfile buffer.
	CLOSE (UNIT=LOG_UNIT)			! Close the log file.
	LOGFILE = .FALSE.			! Show log file is closed.
	IF (.NOT. AUTO_REF) THEN
	    CALL WRITE_USER ('*** The log file "'//
	1		LOG_FILE(1:LOGFILE_SIZE)//' is closed. ***'//SS)
	    RETURN
	ENDIF
C
C	Spawn the reformat program.
C
	REF_FLAG = 0				! Set WAIT/SYMBOLS/LOGICALS.
	IF (.NOT. REF_WAIT) THEN
	    REF_FLAG = NOWAIT			! Don't wait for REFormat.
	    CALL WRITE_USER ('*** Reformatting of log file "'//
	1	LOG_FILE(1:LOGFILE_SIZE)//'" being spawned. ***'//SS)
	ELSE
	    CALL WRITE_USER ('*** Reformatting log file "'//
	1	LOG_FILE(1:LOGFILE_SIZE)//'", please be patient. ***'//SS)
	ENDIF
	CALL SPAWN_DCL ('$ REF '//LOG_FILE(1:LOGFILE_SIZE),REF_FLAG)
	RETURN
	END
