xref: /plan9/sys/src/libc/9sys/syslog.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <u.h>
2*3e12c5d1SDavid du Colombier #include <libc.h>
3*3e12c5d1SDavid du Colombier 
4*3e12c5d1SDavid du Colombier /*
5*3e12c5d1SDavid du Colombier  * Print
6*3e12c5d1SDavid du Colombier  *  sysname: time: user: [prog: ]msg[: errmsg]
7*3e12c5d1SDavid du Colombier  * on /sys/log/logname, creating it (append only) if it doesn't exist.
8*3e12c5d1SDavid du Colombier  * Print the prog if argv0 is not 0.
9*3e12c5d1SDavid du Colombier  * If cons or log file can't be opened, print on the system console, too.
10*3e12c5d1SDavid du Colombier  */
11*3e12c5d1SDavid du Colombier void
12*3e12c5d1SDavid du Colombier syslog(int cons, char *logname, char *fmt, ...)
13*3e12c5d1SDavid du Colombier {
14*3e12c5d1SDavid du Colombier 	char buf[1024];
15*3e12c5d1SDavid du Colombier 	char *ctim, *p, *ebuf, *t;
16*3e12c5d1SDavid du Colombier 	int f, n;
17*3e12c5d1SDavid du Colombier 	static char user[NAMELEN];
18*3e12c5d1SDavid du Colombier 	static char name[NAMELEN];
19*3e12c5d1SDavid du Colombier 	static char sysname[NAMELEN];
20*3e12c5d1SDavid du Colombier 	static int logfd = -1;
21*3e12c5d1SDavid du Colombier 	static int consfd = -1;
22*3e12c5d1SDavid du Colombier 
23*3e12c5d1SDavid du Colombier 	if(logfd<0 || strcmp(name, logname)!=0){
24*3e12c5d1SDavid du Colombier 		strncpy(name, logname, NAMELEN-1);
25*3e12c5d1SDavid du Colombier 		if(logfd >= 0)
26*3e12c5d1SDavid du Colombier 			close(logfd);
27*3e12c5d1SDavid du Colombier 		doprint(buf, buf+sizeof(buf), "/sys/log/%s", &logname);
28*3e12c5d1SDavid du Colombier 		logfd = open(buf, OWRITE);
29*3e12c5d1SDavid du Colombier 		if(logfd < 0)
30*3e12c5d1SDavid du Colombier 			cons = 1;
31*3e12c5d1SDavid du Colombier 	}
32*3e12c5d1SDavid du Colombier 	if(cons && consfd<0)
33*3e12c5d1SDavid du Colombier 		consfd = open("#c/cons", OWRITE);
34*3e12c5d1SDavid du Colombier 	if(sysname[0] == 0){
35*3e12c5d1SDavid du Colombier 		strcpy(sysname, "gnot");
36*3e12c5d1SDavid du Colombier 		f = open("/env/sysname", OREAD);
37*3e12c5d1SDavid du Colombier 		if(f >= 0){
38*3e12c5d1SDavid du Colombier 			read(f, sysname, NAMELEN-1);
39*3e12c5d1SDavid du Colombier 			close(f);
40*3e12c5d1SDavid du Colombier 		}
41*3e12c5d1SDavid du Colombier 	}
42*3e12c5d1SDavid du Colombier 	if(user[0] == 0){
43*3e12c5d1SDavid du Colombier 		f = open("/dev/user", OREAD);
44*3e12c5d1SDavid du Colombier 		if(f >= 0){
45*3e12c5d1SDavid du Colombier 			if(read(f, user, NAMELEN-1) <= 0)
46*3e12c5d1SDavid du Colombier 				strcpy(user, "ditzel");
47*3e12c5d1SDavid du Colombier 			close(f);
48*3e12c5d1SDavid du Colombier 		}
49*3e12c5d1SDavid du Colombier 	}
50*3e12c5d1SDavid du Colombier 	ctim = ctime(time(0));
51*3e12c5d1SDavid du Colombier 	ebuf = buf+sizeof(buf)-1; /* leave room for newline */
52*3e12c5d1SDavid du Colombier 	t = sysname;
53*3e12c5d1SDavid du Colombier 	p = doprint(buf, ebuf, "%s: ", &t);
54*3e12c5d1SDavid du Colombier 	strncpy(p, ctim+4, 15);
55*3e12c5d1SDavid du Colombier 	p += 15;
56*3e12c5d1SDavid du Colombier 	t = user;
57*3e12c5d1SDavid du Colombier 	if(user[0])
58*3e12c5d1SDavid du Colombier 		p = doprint(p, ebuf, ": %s: ", &t);
59*3e12c5d1SDavid du Colombier 	if(argv0)
60*3e12c5d1SDavid du Colombier 		p = doprint(p, ebuf, "%s: ", &argv0);
61*3e12c5d1SDavid du Colombier 	p = doprint(p, ebuf, fmt, (&fmt+1));
62*3e12c5d1SDavid du Colombier 	*p++ = '\n';
63*3e12c5d1SDavid du Colombier 	n = p - buf;
64*3e12c5d1SDavid du Colombier 	if(logfd >= 0){
65*3e12c5d1SDavid du Colombier 		seek(logfd, 0, 2);	/* in case it's not append-only */
66*3e12c5d1SDavid du Colombier 		write(logfd, buf, n);
67*3e12c5d1SDavid du Colombier 	}
68*3e12c5d1SDavid du Colombier 	if(cons && consfd >=0)
69*3e12c5d1SDavid du Colombier 		write(consfd, buf, n);
70*3e12c5d1SDavid du Colombier }
71