Blame


1 b589fce2 2005-02-11 devnull #include <u.h>
2 b589fce2 2005-02-11 devnull #include <libc.h>
3 b589fce2 2005-02-11 devnull
4 b589fce2 2005-02-11 devnull static struct
5 b589fce2 2005-02-11 devnull {
6 b589fce2 2005-02-11 devnull int fd;
7 b589fce2 2005-02-11 devnull int consfd;
8 b589fce2 2005-02-11 devnull char *name;
9 b589fce2 2005-02-11 devnull Dir *d;
10 b589fce2 2005-02-11 devnull Dir *consd;
11 b589fce2 2005-02-11 devnull Lock lk;
12 b589fce2 2005-02-11 devnull } sl =
13 b589fce2 2005-02-11 devnull {
14 b589fce2 2005-02-11 devnull -1, -1,
15 b589fce2 2005-02-11 devnull };
16 b589fce2 2005-02-11 devnull
17 b589fce2 2005-02-11 devnull static void
18 b589fce2 2005-02-11 devnull _syslogopen(void)
19 b589fce2 2005-02-11 devnull {
20 b589fce2 2005-02-11 devnull char buf[1024], *p;
21 b589fce2 2005-02-11 devnull
22 b589fce2 2005-02-11 devnull if(sl.fd >= 0)
23 b589fce2 2005-02-11 devnull close(sl.fd);
24 b589fce2 2005-02-11 devnull snprint(buf, sizeof(buf), "#9/log/%s", sl.name);
25 b589fce2 2005-02-11 devnull p = unsharp(buf);
26 b589fce2 2005-02-11 devnull sl.fd = open(p, OWRITE|OCEXEC|OAPPEND);
27 b589fce2 2005-02-11 devnull free(p);
28 b589fce2 2005-02-11 devnull }
29 b589fce2 2005-02-11 devnull
30 b589fce2 2005-02-11 devnull /*
31 b589fce2 2005-02-11 devnull * Print
32 b589fce2 2005-02-11 devnull * sysname: time: mesg
33 b589fce2 2005-02-11 devnull * on /sys/log/logname.
34 b589fce2 2005-02-11 devnull * If cons or log file can't be opened, print on the system console, too.
35 b589fce2 2005-02-11 devnull */
36 b589fce2 2005-02-11 devnull void
37 b589fce2 2005-02-11 devnull syslog(int cons, char *logname, char *fmt, ...)
38 b589fce2 2005-02-11 devnull {
39 b589fce2 2005-02-11 devnull char buf[1024];
40 b589fce2 2005-02-11 devnull char *ctim, *p;
41 b589fce2 2005-02-11 devnull va_list arg;
42 b589fce2 2005-02-11 devnull int n;
43 b589fce2 2005-02-11 devnull Dir *d;
44 b589fce2 2005-02-11 devnull char err[ERRMAX];
45 b589fce2 2005-02-11 devnull
46 b589fce2 2005-02-11 devnull err[0] = '\0';
47 b589fce2 2005-02-11 devnull errstr(err, sizeof err);
48 b589fce2 2005-02-11 devnull lock(&sl.lk);
49 b589fce2 2005-02-11 devnull
50 b589fce2 2005-02-11 devnull /*
51 b589fce2 2005-02-11 devnull * paranoia makes us stat to make sure a fork+close
52 b589fce2 2005-02-11 devnull * hasn't broken our fd's
53 b589fce2 2005-02-11 devnull */
54 b589fce2 2005-02-11 devnull d = dirfstat(sl.fd);
55 b589fce2 2005-02-11 devnull if(sl.fd < 0
56 b589fce2 2005-02-11 devnull || sl.name == nil
57 b589fce2 2005-02-11 devnull || strcmp(sl.name, logname)!=0
58 b589fce2 2005-02-11 devnull || sl.d == nil
59 b589fce2 2005-02-11 devnull || d == nil
60 b589fce2 2005-02-11 devnull || d->dev != sl.d->dev
61 b589fce2 2005-02-11 devnull || d->type != sl.d->type
62 b589fce2 2005-02-11 devnull || d->qid.path != sl.d->qid.path){
63 b589fce2 2005-02-11 devnull free(sl.name);
64 b589fce2 2005-02-11 devnull sl.name = strdup(logname);
65 b589fce2 2005-02-11 devnull if(sl.name == nil)
66 b589fce2 2005-02-11 devnull cons = 1;
67 b589fce2 2005-02-11 devnull else{
68 b589fce2 2005-02-11 devnull _syslogopen();
69 b589fce2 2005-02-11 devnull if(sl.fd < 0)
70 b589fce2 2005-02-11 devnull cons = 1;
71 b589fce2 2005-02-11 devnull free(sl.d);
72 b589fce2 2005-02-11 devnull sl.d = d;
73 b589fce2 2005-02-11 devnull d = nil; /* don't free it */
74 b589fce2 2005-02-11 devnull }
75 b589fce2 2005-02-11 devnull }
76 b589fce2 2005-02-11 devnull free(d);
77 b589fce2 2005-02-11 devnull if(cons){
78 b589fce2 2005-02-11 devnull d = dirfstat(sl.consfd);
79 b589fce2 2005-02-11 devnull if(sl.consfd < 0
80 b589fce2 2005-02-11 devnull || d == nil
81 b589fce2 2005-02-11 devnull || sl.consd == nil
82 b589fce2 2005-02-11 devnull || d->dev != sl.consd->dev
83 b589fce2 2005-02-11 devnull || d->type != sl.consd->type
84 b589fce2 2005-02-11 devnull || d->qid.path != sl.consd->qid.path){
85 b589fce2 2005-02-11 devnull sl.consfd = open("/dev/tty", OWRITE|OCEXEC);
86 b589fce2 2005-02-11 devnull free(sl.consd);
87 b589fce2 2005-02-11 devnull sl.consd = d;
88 b589fce2 2005-02-11 devnull d = nil; /* don't free it */
89 b589fce2 2005-02-11 devnull }
90 b589fce2 2005-02-11 devnull free(d);
91 b589fce2 2005-02-11 devnull }
92 b589fce2 2005-02-11 devnull
93 b589fce2 2005-02-11 devnull if(fmt == nil){
94 b589fce2 2005-02-11 devnull unlock(&sl.lk);
95 b589fce2 2005-02-11 devnull return;
96 b589fce2 2005-02-11 devnull }
97 b589fce2 2005-02-11 devnull
98 b589fce2 2005-02-11 devnull ctim = ctime(time(0));
99 b589fce2 2005-02-11 devnull werrstr(err);
100 b589fce2 2005-02-11 devnull p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname());
101 b589fce2 2005-02-11 devnull strncpy(p, ctim+4, 15);
102 b589fce2 2005-02-11 devnull p += 15;
103 b589fce2 2005-02-11 devnull *p++ = ' ';
104 b589fce2 2005-02-11 devnull va_start(arg, fmt);
105 b589fce2 2005-02-11 devnull p = vseprint(p, buf+sizeof(buf)-1, fmt, arg);
106 b589fce2 2005-02-11 devnull va_end(arg);
107 b589fce2 2005-02-11 devnull *p++ = '\n';
108 b589fce2 2005-02-11 devnull n = p - buf;
109 b589fce2 2005-02-11 devnull
110 b589fce2 2005-02-11 devnull if(sl.fd >= 0){
111 b589fce2 2005-02-11 devnull seek(sl.fd, 0, 2);
112 b589fce2 2005-02-11 devnull write(sl.fd, buf, n);
113 b589fce2 2005-02-11 devnull }
114 b589fce2 2005-02-11 devnull
115 b589fce2 2005-02-11 devnull if(cons && sl.consfd >=0)
116 b589fce2 2005-02-11 devnull write(sl.consfd, buf, n);
117 b589fce2 2005-02-11 devnull
118 b589fce2 2005-02-11 devnull unlock(&sl.lk);
119 b589fce2 2005-02-11 devnull }