;;; -*- Mode: Common-Lisp; Package: SYSLOG; Base: 8.; Patch-File: T -*-

;;; Reason: Fixed read-record. It would sometimes read a bad record on the last block of the log partition. [10682] 

;;;                           RESTRICTED RIGHTS LEGEND
;;;
;;; Use, duplication, or disclosure by the Government is subject to
;;; restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
;;; Technical Data and Computer Software clause at 52.227-7013.
;;;
;;;   TEXAS INSTRUMENTS INCORPORATED      
;;;   P.O. BOX 2909, M/S 2151             
;;;   AUSTIN, TEXAS 78769                 
;;;
;;; Copyright (C) 1989 Texas Instruments Incorporated.
;;; All rights reserved.

;;; Written 10/05/89 14:35:13 by BERGER,
;;; while running on ARIES from band LODA
;;; With SYSTEM 6.19, VIRTUAL-MEMORY 6.2, EH 6.5, MAKE-SYSTEM 6.2, MICRONET 6.0, LOCAL-FILE 6.1,
;;;  BASIC-PATHNAME 6.2, NETWORK-SUPPORT-COLD 6.1, BASIC-NAMESPACE 6.4, NETWORK-NAMESPACE 6.0,
;;;  DISK-IO 6.1, DISK-LABEL 6.0, BASIC-FILE 6.4, MAC-PATHNAME 6.0, NETWORK-PATHNAME 6.0,
;;;  COMPILER 6.12, TV 6.15, DATALINK 6.0, CHAOSNET 6.1, GC 6.3, MEMORY-AUX 6.0, NVRAM 6.1,
;;;  SYSLOG 6.1, STREAMER-TAPE 6.4, UCL 6.0, INPUT-EDITOR 6.0, METER 6.1, ZWEI 6.5,
;;;  DEBUG-TOOLS 6.3, NETWORK-SUPPORT 6.0, NETWORK-SERVICE 6.1, DATALINK-DISPLAYS 6.0,
;;;  FONT-EDITOR 6.1, SERIAL 6.0, PRINTER 6.3, MAC-PRINTER-TYPES 6.1, PRINTER-TYPES 6.2,
;;;  IMAGEN 6.1, SUGGESTIONS 6.0, MAIL-DAEMON 6.3, MAIL-READER 6.5, TELNET 6.0, VT100 6.0,
;;;  NAMESPACE-EDITOR 6.2, PROFILE 6.2, VISIDOC 6.5, TI-CLOS 6.24, CLEH 6.5, IP 3.50,
;;;  Experimental CLX 6.3, CLUE 6.18, X11M 6.14, Experimental BUG 11.15, VISIDOC-SERVER 6.1,
;;;   microcode 429, Band Name: Rel 6.0 10/5

#!C
; From file LOG-AND-DUMP.LISP#> SYSLOG; SYS:
#8R SYSLOG#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "SYSLOG"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* SYS:COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "SYS: SYSLOG; LOG-AND-DUMP.#"


(DEFUN READ-RECORD (&OPTIONAL (RESET NIL))
  "Reads one record from system log.  First call to gets oldest record.
Each successive call gets the next record, returning non-NIL value.  When last
record is read NIL is returned, and next call starts all over again.
If RESET then start over."
  (WHEN *LOG-ENABLED*
    (WHEN (OR RESET (NULL READ-LOG-STATE))
      (SETF READ-LOG-STATE (GET-TAIL)))
    (LET* ((POINTER READ-LOG-STATE)
	   (BUFFER-OFFSET (GET-BUFFER-IN-MEMORY POINTER))
	   (cons-of-rcd ()))  ; DAB 10-05-89
      (COND
	((= POINTER (GET-HEAD)) (SETF READ-LOG-STATE ()))
	(T
	 (LET* ((RCD (GET-RECORD-FROM-BUFFER BUFFER-OFFSET))
		(Size (LENGTH RCD)))
	   (cond
	     ((ZEROP SIZE)			;found double NEWLINE
	       (IF (< (+ POINTER 2000) (GET-LENGTH))	;extra debug check
		   (CERROR () () 'BAD-WRAP "~&Wraping pointer too early? Pointer=~d.  Length=~d."
			   POINTER (GET-LENGTH))
		   (PROGN
		     (SETF READ-LOG-STATE 0)	;Wrap around
		     (READ-RECORD))))
	     ;; ; DAB 10-05-89 Make sure the record read is a valid record. If not this must be the end of the 
             ;; log partition and wrap around may have occurred.
	     ((not (and (setf cons-of-rcd (read-from-string rcd))
			(consp cons-of-rcd )
			(every 'consp cons-of-rcd))  ;make sure the record is an alist.
		   )
	      (SETF READ-LOG-STATE 0)	;Wrap around
	      (READ-RECORD))
	     (t (PROGN
		  (SETF READ-LOG-STATE (+ 1 POINTER SIZE))
		  RCD)))))))))
))
