AUSAM/source/S/errlog.c
#
/*
* system error logger
*
* - reads from system error emitting device
* and writes to error log file.
*
* - will buffer output & continue reading
* if write returns error, then sleeps
* until error goes away.
*
* - will complain if errors too frequent.
*
* - will ask for crash details on startup
* if relevant.
*
* by
* piers lauder
* DEPT. OF COMPUTER SCIENCE
* UNIVERSITY OF SYDNEY
* feb 1978
*/
#include <local-system>
#include <stat.h>
#define NOTNICE -90 /* run at extremely high priority */
#define DATESTAMP 10 /* don't date stamp more often than this (secs.) */
#define MAXERR 10 /* max. allowable errors in DATESTAMP period */
#define SIGTERMINATE 14
char errlogf[] "/usr/adm/errlog";
char errdevf[] "/dev/errlog";
char openf[] "cannot open %s\n";
char panicm[] "\nerrlogger - too many errors!\n";
int totalerrs;
int ou;
char inbuf[80];
char oubuf[512];
char *oubufp oubuf;
long this, last, time();
main(argc, argv)
char **argv;
{
register in, n;
register *bp;
int finish();
struct statb sb;
close(2);
if((in = open(errdevf, 0)) < 0)
{
printf(openf, errdevf);
return(-1);
}
if((ou = open(errlogf, 2)) < 0)
{
printf(openf, errlogf);
return(-1);
}
bp = inbuf;
fstat(ou, &sb);
if(sb.i_size1 < 2 && sb.i_size0 == 0)
goto crash;
seek(ou, -2, 2);
read(ou, bp, 2);
if(*bp != -1)
{ /* crashed */
crash:
printf("please type in why system crashed\n(^d to end)\n");
copyout("\nSYSTEM CRASH\n", 14);
readit(0);
copyout("\n", 1);
}
else
{
seek(ou, -2, 2);
copyout("\n\n", 2);
seek(ou, -2, 2);
}
close(0);
nice(NOTNICE);
if(fork())
{
printf("error logger started\n");
return 0;
}
signal(2, 1);
signal(3, 1);
signal(SIGTERMINATE, finish);
last = 0;
totalerrs = 0;
readit(in);
finish();
}
readit(in)
register in;
{
register n;
register errcount = 0;
while((n = read(in, inbuf, (sizeof inbuf)-1)) > 0)
if(n > 1)
{
if(++errcount > MAXERR)
{
printf(panicm);
sleep(DATESTAMP);
}
totalerrs++;
if((((this = time())-last) > DATESTAMP) && (in || last == 0))
{
copyout(ctime(this), 25);
last = this;
errcount = 0;
}
if(inbuf[n-1] != '\n')
inbuf[n++] = '\n';
copyout(inbuf, n);
}
}
finish()
{
copyout("\377\377", 2); /* system termination */
printf("error logger completed\n");
if(totalerrs)
printf("%d errors logged\n", totalerrs);
exit(0);
}
copyout(cp, n)
register char *cp;
register n;
{
register char *bp = oubufp;
int z;
while(bp < &oubuf[sizeof oubuf] && n--)
*bp++ = *cp++;
oubufp = oubuf;
z = bp-oubuf;
while(write(ou, oubuf, z) != z)
if(n > 0)
sleep(1);
else
{
oubufp = bp;
break;
}
if(n > 0)
copyout(cp, n);
}
#ifdef SPRINTF
#define NUMBERS
#include <sprintf.h>
#endif SPRINTF