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