xref: /plan9/sys/src/libc/9sys/syslog.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
4*219b2ee8SDavid du Colombier static int
5*219b2ee8SDavid du Colombier _syslogopen(char *logname, int logfd)
6*219b2ee8SDavid du Colombier {
7*219b2ee8SDavid du Colombier 	char buf[1024];
8*219b2ee8SDavid du Colombier 
9*219b2ee8SDavid du Colombier 	if(logfd >= 0)
10*219b2ee8SDavid du Colombier 		close(logfd);
11*219b2ee8SDavid du Colombier 	snprint(buf, sizeof(buf), "/sys/log/%s", logname);
12*219b2ee8SDavid du Colombier 	return open(buf, OWRITE);
13*219b2ee8SDavid du Colombier }
14*219b2ee8SDavid du Colombier 
153e12c5d1SDavid du Colombier /*
163e12c5d1SDavid du Colombier  * Print
17*219b2ee8SDavid du Colombier  *  sysname: time: mesg
18*219b2ee8SDavid du Colombier  * on /sys/log/logname.
193e12c5d1SDavid du Colombier  * If cons or log file can't be opened, print on the system console, too.
203e12c5d1SDavid du Colombier  */
213e12c5d1SDavid du Colombier void
223e12c5d1SDavid du Colombier syslog(int cons, char *logname, char *fmt, ...)
233e12c5d1SDavid du Colombier {
243e12c5d1SDavid du Colombier 	char buf[1024];
253e12c5d1SDavid du Colombier 	char *ctim, *p, *ebuf, *t;
263e12c5d1SDavid du Colombier 	int f, n;
273e12c5d1SDavid du Colombier 	static char name[NAMELEN];
283e12c5d1SDavid du Colombier 	static char sysname[NAMELEN];
293e12c5d1SDavid du Colombier 	static int logfd = -1;
303e12c5d1SDavid du Colombier 	static int consfd = -1;
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier 	if(logfd<0 || strcmp(name, logname)!=0){
333e12c5d1SDavid du Colombier 		strncpy(name, logname, NAMELEN-1);
34*219b2ee8SDavid du Colombier 		logfd = _syslogopen(logname, logfd);
353e12c5d1SDavid du Colombier 		if(logfd < 0)
363e12c5d1SDavid du Colombier 			cons = 1;
373e12c5d1SDavid du Colombier 	}
383e12c5d1SDavid du Colombier 	if(cons && consfd<0)
393e12c5d1SDavid du Colombier 		consfd = open("#c/cons", OWRITE);
403e12c5d1SDavid du Colombier 	if(sysname[0] == 0){
413e12c5d1SDavid du Colombier 		strcpy(sysname, "gnot");
423e12c5d1SDavid du Colombier 		f = open("/env/sysname", OREAD);
433e12c5d1SDavid du Colombier 		if(f >= 0){
443e12c5d1SDavid du Colombier 			read(f, sysname, NAMELEN-1);
453e12c5d1SDavid du Colombier 			close(f);
463e12c5d1SDavid du Colombier 		}
473e12c5d1SDavid du Colombier 	}
483e12c5d1SDavid du Colombier 	ctim = ctime(time(0));
493e12c5d1SDavid du Colombier 	ebuf = buf+sizeof(buf)-1; /* leave room for newline */
503e12c5d1SDavid du Colombier 	t = sysname;
51*219b2ee8SDavid du Colombier 	p = doprint(buf, ebuf, "%s ", &t);
52*219b2ee8SDavid du Colombier 	strncpy(p, ctim+4, 12);
53*219b2ee8SDavid du Colombier 	p += 12;
54*219b2ee8SDavid du Colombier 	*p++ = ' ';
553e12c5d1SDavid du Colombier 	p = doprint(p, ebuf, fmt, (&fmt+1));
563e12c5d1SDavid du Colombier 	*p++ = '\n';
573e12c5d1SDavid du Colombier 	n = p - buf;
583e12c5d1SDavid du Colombier 	if(logfd >= 0){
59*219b2ee8SDavid du Colombier 		if(seek(logfd, 0, 2) < 0 || write(logfd, buf, n) < 0){
60*219b2ee8SDavid du Colombier 			logfd = _syslogopen(logname, logfd);
61*219b2ee8SDavid du Colombier 			if(logfd >= 0){
62*219b2ee8SDavid du Colombier 				seek(logfd, 0, 2);
633e12c5d1SDavid du Colombier 				write(logfd, buf, n);
643e12c5d1SDavid du Colombier 			}
65*219b2ee8SDavid du Colombier 		}
66*219b2ee8SDavid du Colombier 	}
673e12c5d1SDavid du Colombier 	if(cons && consfd >=0)
683e12c5d1SDavid du Colombier 		write(consfd, buf, n);
693e12c5d1SDavid du Colombier }
70