#include "all.h" #define SIZE 1024 int chatty; int conftime; #define NSIZE 128 static char nbuf[NSIZE]; static int chatpid; static void killchat(void) { char buf[NSIZE]; int fd; remove(nbuf); snprint(buf, sizeof buf, "/proc/%d/note", chatpid); fd = open(buf, OWRITE); write(fd, "kill\n", 5); close(fd); } void chatsrv(char *name) { int n, sfd, pfd[2]; char *p, buf[256]; if(name && *name) snprint(nbuf, sizeof nbuf, "/srv/%s", name); else{ if(p = strrchr(argv0, '/')) /* assign = */ name = p+1; else name = argv0; snprint(nbuf, sizeof nbuf, "/srv/%s.chat", name); } remove(nbuf); if(pipe(pfd) < 0) panic("chatsrv pipe"); sfd = create(nbuf, OWRITE, 0600); if(sfd < 0) panic("chatsrv create %s", nbuf); chatpid = rfork(RFPROC|RFMEM); switch(chatpid){ case -1: panic("chatsrv fork"); case 0: break; default: atexit(killchat); return; } fprint(sfd, "%d", pfd[1]); close(sfd); close(pfd[1]); for(;;){ n = read(pfd[0], buf, sizeof(buf)-1); if(n < 0) break; if(n == 0) continue; buf[n] = 0; if(buf[0] == 'c') conftime = 999; chatty = strtol(buf, 0, 0); if(abs(chatty) < 2) rpcdebug = 0; else rpcdebug = abs(chatty) - 1; fprint(2, "%s: chatty=%d, rpcdebug=%d, conftime=%d\n", nbuf, chatty, rpcdebug, conftime); } _exits(0); } void chat(char *fmt, ...) { char buf[SIZE]; va_list arg; Fmt f; if(!chatty) return; fmtfdinit(&f, 2, buf, sizeof buf); va_start(arg, fmt); fmtvprint(&f, fmt, arg); va_end(arg); fmtfdflush(&f); } void clog(char *fmt, ...) { char buf[SIZE]; va_list arg; int n; va_start(arg, fmt); vseprint(buf, buf+SIZE, fmt, arg); va_end(arg); n = strlen(buf); if(chatty || rpcdebug) write(2, buf, n); if(chatty <= 0){ if(n>0 && buf[n-1] == '\n') buf[n-1] = 0; syslog(0, "nfs", buf); } } void panic(char *fmt, ...) { char buf[SIZE]; va_list arg; va_start(arg, fmt); vseprint(buf, buf+SIZE, fmt, arg); va_end(arg); if(chatty || rpcdebug) fprint(2, "%s %d: %s: %r\n", argv0, getpid(), buf); if(chatty <= 0) syslog(0, "nfs", buf); exits("panic"); }