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