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