13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier 47dd7cddfSDavid du Colombier static struct 57dd7cddfSDavid du Colombier { 67dd7cddfSDavid du Colombier int fd; 77dd7cddfSDavid du Colombier int consfd; 89a747e4fSDavid du Colombier char *name; 99a747e4fSDavid du Colombier Dir *d; 109a747e4fSDavid du Colombier Dir *consd; 117dd7cddfSDavid du Colombier Lock; 127dd7cddfSDavid du Colombier } sl = 137dd7cddfSDavid du Colombier { 147dd7cddfSDavid du Colombier -1, -1, 157dd7cddfSDavid du Colombier }; 167dd7cddfSDavid du Colombier 177dd7cddfSDavid du Colombier static void 187dd7cddfSDavid du Colombier _syslogopen(void) 19219b2ee8SDavid du Colombier { 20219b2ee8SDavid du Colombier char buf[1024]; 21219b2ee8SDavid du Colombier 227dd7cddfSDavid du Colombier if(sl.fd >= 0) 237dd7cddfSDavid du Colombier close(sl.fd); 247dd7cddfSDavid du Colombier snprint(buf, sizeof(buf), "/sys/log/%s", sl.name); 257dd7cddfSDavid du Colombier sl.fd = open(buf, OWRITE|OCEXEC); 26219b2ee8SDavid du Colombier } 27219b2ee8SDavid du Colombier 28*7e9ae060SDavid du Colombier static int 29*7e9ae060SDavid du Colombier eqdirdev(Dir *a, Dir *b) 30*7e9ae060SDavid du Colombier { 31*7e9ae060SDavid du Colombier return a != nil && b != nil && 32*7e9ae060SDavid du Colombier a->dev == b->dev && a->type == b->type && 33*7e9ae060SDavid du Colombier a->qid.path == b->qid.path; 34*7e9ae060SDavid du Colombier } 35*7e9ae060SDavid du Colombier 363e12c5d1SDavid du Colombier /* 373e12c5d1SDavid du Colombier * Print 38219b2ee8SDavid du Colombier * sysname: time: mesg 39219b2ee8SDavid du Colombier * on /sys/log/logname. 403e12c5d1SDavid du Colombier * If cons or log file can't be opened, print on the system console, too. 413e12c5d1SDavid du Colombier */ 423e12c5d1SDavid du Colombier void 433e12c5d1SDavid du Colombier syslog(int cons, char *logname, char *fmt, ...) 443e12c5d1SDavid du Colombier { 453e12c5d1SDavid du Colombier char buf[1024]; 467dd7cddfSDavid du Colombier char *ctim, *p; 477dd7cddfSDavid du Colombier va_list arg; 487dd7cddfSDavid du Colombier int n; 499a747e4fSDavid du Colombier Dir *d; 509a747e4fSDavid du Colombier char err[ERRMAX]; 513e12c5d1SDavid du Colombier 529a747e4fSDavid du Colombier err[0] = '\0'; 539a747e4fSDavid du Colombier errstr(err, sizeof err); 547dd7cddfSDavid du Colombier lock(&sl); 557dd7cddfSDavid du Colombier 567dd7cddfSDavid du Colombier /* 577dd7cddfSDavid du Colombier * paranoia makes us stat to make sure a fork+close 587dd7cddfSDavid du Colombier * hasn't broken our fd's 597dd7cddfSDavid du Colombier */ 609a747e4fSDavid du Colombier d = dirfstat(sl.fd); 61*7e9ae060SDavid du Colombier if(sl.fd < 0 || sl.name == nil || strcmp(sl.name, logname) != 0 || 62*7e9ae060SDavid du Colombier !eqdirdev(d, sl.d)){ 639a747e4fSDavid du Colombier free(sl.name); 649a747e4fSDavid du Colombier sl.name = strdup(logname); 659a747e4fSDavid du Colombier if(sl.name == nil) 669a747e4fSDavid du Colombier cons = 1; 679a747e4fSDavid du Colombier else{ 68*7e9ae060SDavid du Colombier free(sl.d); 69*7e9ae060SDavid du Colombier sl.d = nil; 707dd7cddfSDavid du Colombier _syslogopen(); 717dd7cddfSDavid du Colombier if(sl.fd < 0) 723e12c5d1SDavid du Colombier cons = 1; 73*7e9ae060SDavid du Colombier else 74*7e9ae060SDavid du Colombier sl.d = dirfstat(sl.fd); 753e12c5d1SDavid du Colombier } 769a747e4fSDavid du Colombier } 779a747e4fSDavid du Colombier free(d); 789a747e4fSDavid du Colombier if(cons){ 799a747e4fSDavid du Colombier d = dirfstat(sl.consfd); 80*7e9ae060SDavid du Colombier if(sl.consfd < 0 || !eqdirdev(d, sl.consd)){ 819a747e4fSDavid du Colombier free(sl.consd); 82*7e9ae060SDavid du Colombier sl.consd = nil; 83*7e9ae060SDavid du Colombier sl.consfd = open("#c/cons", OWRITE|OCEXEC); 84*7e9ae060SDavid du Colombier if(sl.consfd >= 0) 85*7e9ae060SDavid du Colombier sl.consd = dirfstat(sl.consfd); 869a747e4fSDavid du Colombier } 879a747e4fSDavid du Colombier free(d); 883e12c5d1SDavid du Colombier } 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier if(fmt == nil){ 917dd7cddfSDavid du Colombier unlock(&sl); 927dd7cddfSDavid du Colombier return; 933e12c5d1SDavid du Colombier } 947dd7cddfSDavid du Colombier 953e12c5d1SDavid du Colombier ctim = ctime(time(0)); 967dd7cddfSDavid du Colombier werrstr(err); 977dd7cddfSDavid du Colombier p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname()); 987dd7cddfSDavid du Colombier strncpy(p, ctim+4, 15); 997dd7cddfSDavid du Colombier p += 15; 100219b2ee8SDavid du Colombier *p++ = ' '; 1017dd7cddfSDavid du Colombier va_start(arg, fmt); 1029a747e4fSDavid du Colombier p = vseprint(p, buf+sizeof(buf)-1, fmt, arg); 1037dd7cddfSDavid du Colombier va_end(arg); 1043e12c5d1SDavid du Colombier *p++ = '\n'; 1053e12c5d1SDavid du Colombier n = p - buf; 1067dd7cddfSDavid du Colombier 1077dd7cddfSDavid du Colombier if(sl.fd >= 0){ 1087dd7cddfSDavid du Colombier seek(sl.fd, 0, 2); 1097dd7cddfSDavid du Colombier write(sl.fd, buf, n); 1103e12c5d1SDavid du Colombier } 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier if(cons && sl.consfd >=0) 1137dd7cddfSDavid du Colombier write(sl.consfd, buf, n); 1147dd7cddfSDavid du Colombier 1157dd7cddfSDavid du Colombier unlock(&sl); 1163e12c5d1SDavid du Colombier } 117