pdp11v/usr/src/cmd/errdemon.c
/* @(#)errdemon.c 1.1 */
#include <stdio.h>
#include <signal.h>
#include <sys/param.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#ifdef vax
#include <sys/mba.h>
#endif
#include <sys/utsname.h>
#include <sys/elog.h>
#include <sys/erec.h>
int getsig();
int stop;
int efno;
int edno;
char *errfile = "/usr/adm/errfile";
char *errdev = "/dev/error";
union {
char buf[BSIZE];
struct errhdr ee;
} eun;
main(argc,argv)
char **argv;
{
register n;
if(argc > 1)
errfile = *++argv;
chdir("/");
stop = 0;
if((n = fork()) > 0)
exit(0);
else if(n < 0) {
fprintf(stderr,"Can't fork\n");
exit(8);
}
if((efno = open(errfile,1)) < 0)
if((efno = creat(errfile,0666)) < 0) {
fprintf(stderr,"Can't create %s\n",errfile);
exit(8);
}
if((edno = open(errdev,0)) < 0) {
fprintf(stderr,"Can't open %s\n",errdev);
exit(8);
}
lseek(efno,(long)0,2);
for(n = 0; n < NOFILE; n++)
if(n != efno && n != edno)
close(n);
signal(SIGHUP,1);
signal(SIGINT,1);
signal(SIGQUIT,1);
signal(SIGTERM,getsig);
while(!stop) {
if((n = read(edno,eun.buf,sizeof(eun))) > 0)
write(efno,eun.buf,n);
}
eun.ee.e_type = E_STOP;
eun.ee.e_len = sizeof(struct eend);
time(&eun.ee.e_time);
write(efno,eun.buf,sizeof(struct eend));
exit(0);
}
getsig(n)
{
signal(n,getsig);
if(n == SIGTERM)
stop++;
}