xref: /plan9/sys/src/libc/9sys/syslog.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
4*7dd7cddfSDavid du Colombier static struct
5*7dd7cddfSDavid du Colombier {
6*7dd7cddfSDavid du Colombier 	int	fd;
7*7dd7cddfSDavid du Colombier 	int	consfd;
8*7dd7cddfSDavid du Colombier 	char	name[NAMELEN];
9*7dd7cddfSDavid du Colombier 	Dir	d;
10*7dd7cddfSDavid du Colombier 	Dir	consd;
11*7dd7cddfSDavid du Colombier 	Lock;
12*7dd7cddfSDavid du Colombier } sl =
13*7dd7cddfSDavid du Colombier {
14*7dd7cddfSDavid du Colombier 	-1, -1,
15*7dd7cddfSDavid du Colombier };
16*7dd7cddfSDavid du Colombier 
17*7dd7cddfSDavid du Colombier static void
18*7dd7cddfSDavid du Colombier _syslogopen(void)
19219b2ee8SDavid du Colombier {
20219b2ee8SDavid du Colombier 	char buf[1024];
21219b2ee8SDavid du Colombier 
22*7dd7cddfSDavid du Colombier 	if(sl.fd >= 0)
23*7dd7cddfSDavid du Colombier 		close(sl.fd);
24*7dd7cddfSDavid du Colombier 	snprint(buf, sizeof(buf), "/sys/log/%s", sl.name);
25*7dd7cddfSDavid du Colombier 	sl.fd = open(buf, OWRITE|OCEXEC);
26219b2ee8SDavid du Colombier }
27219b2ee8SDavid du Colombier 
283e12c5d1SDavid du Colombier /*
293e12c5d1SDavid du Colombier  * Print
30219b2ee8SDavid du Colombier  *  sysname: time: mesg
31219b2ee8SDavid du Colombier  * on /sys/log/logname.
323e12c5d1SDavid du Colombier  * If cons or log file can't be opened, print on the system console, too.
333e12c5d1SDavid du Colombier  */
343e12c5d1SDavid du Colombier void
353e12c5d1SDavid du Colombier syslog(int cons, char *logname, char *fmt, ...)
363e12c5d1SDavid du Colombier {
373e12c5d1SDavid du Colombier 	char buf[1024];
38*7dd7cddfSDavid du Colombier 	char *ctim, *p;
39*7dd7cddfSDavid du Colombier 	va_list arg;
40*7dd7cddfSDavid du Colombier 	int n;
41*7dd7cddfSDavid du Colombier 	Dir d;
42*7dd7cddfSDavid du Colombier 	char err[ERRLEN];
433e12c5d1SDavid du Colombier 
44*7dd7cddfSDavid du Colombier 	errstr(err);
45*7dd7cddfSDavid du Colombier 	lock(&sl);
46*7dd7cddfSDavid du Colombier 
47*7dd7cddfSDavid du Colombier 	/*
48*7dd7cddfSDavid du Colombier 	 *  paranoia makes us stat to make sure a fork+close
49*7dd7cddfSDavid du Colombier 	 *  hasn't broken our fd's
50*7dd7cddfSDavid du Colombier 	 */
51*7dd7cddfSDavid du Colombier 	if(sl.fd < 0
52*7dd7cddfSDavid du Colombier 	   || strcmp(sl.name, logname)!=0
53*7dd7cddfSDavid du Colombier 	   || dirfstat(sl.fd, &d) < 0
54*7dd7cddfSDavid du Colombier 	   || d.dev != sl.d.dev
55*7dd7cddfSDavid du Colombier 	   || d.type != sl.d.type
56*7dd7cddfSDavid du Colombier 	   || d.qid.path != sl.d.qid.path){
57*7dd7cddfSDavid du Colombier 		strncpy(sl.name, logname, NAMELEN-1);
58*7dd7cddfSDavid du Colombier 		_syslogopen();
59*7dd7cddfSDavid du Colombier 		if(sl.fd < 0)
603e12c5d1SDavid du Colombier 			cons = 1;
61*7dd7cddfSDavid du Colombier 		sl.d = d;
623e12c5d1SDavid du Colombier 	}
63*7dd7cddfSDavid du Colombier 	if(cons)
64*7dd7cddfSDavid du Colombier 		if(sl.consfd < 0
65*7dd7cddfSDavid du Colombier 		   || dirfstat(sl.consfd, &d) < 0
66*7dd7cddfSDavid du Colombier 		   || d.dev != sl.consd.dev
67*7dd7cddfSDavid du Colombier 		   || d.type != sl.consd.type
68*7dd7cddfSDavid du Colombier 		   || d.qid.path != sl.consd.qid.path){
69*7dd7cddfSDavid du Colombier 			sl.consfd = open("#c/cons", OWRITE|OCEXEC);
70*7dd7cddfSDavid du Colombier 			sl.consd = d;
713e12c5d1SDavid du Colombier 		}
72*7dd7cddfSDavid du Colombier 
73*7dd7cddfSDavid du Colombier 	if(fmt == nil){
74*7dd7cddfSDavid du Colombier 		unlock(&sl);
75*7dd7cddfSDavid du Colombier 		return;
763e12c5d1SDavid du Colombier 	}
77*7dd7cddfSDavid du Colombier 
783e12c5d1SDavid du Colombier 	ctim = ctime(time(0));
79*7dd7cddfSDavid du Colombier 	werrstr(err);
80*7dd7cddfSDavid du Colombier 	p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname());
81*7dd7cddfSDavid du Colombier 	strncpy(p, ctim+4, 15);
82*7dd7cddfSDavid du Colombier 	p += 15;
83219b2ee8SDavid du Colombier 	*p++ = ' ';
84*7dd7cddfSDavid du Colombier 	va_start(arg, fmt);
85*7dd7cddfSDavid du Colombier 	p = doprint(p, buf+sizeof(buf)-1, fmt, arg);
86*7dd7cddfSDavid du Colombier 	va_end(arg);
873e12c5d1SDavid du Colombier 	*p++ = '\n';
883e12c5d1SDavid du Colombier 	n = p - buf;
89*7dd7cddfSDavid du Colombier 
90*7dd7cddfSDavid du Colombier 	if(sl.fd >= 0){
91*7dd7cddfSDavid du Colombier 		seek(sl.fd, 0, 2);
92*7dd7cddfSDavid du Colombier 		write(sl.fd, buf, n);
933e12c5d1SDavid du Colombier 	}
94*7dd7cddfSDavid du Colombier 
95*7dd7cddfSDavid du Colombier 	if(cons && sl.consfd >=0)
96*7dd7cddfSDavid du Colombier 		write(sl.consfd, buf, n);
97*7dd7cddfSDavid du Colombier 
98*7dd7cddfSDavid du Colombier 	unlock(&sl);
993e12c5d1SDavid du Colombier }
100