1*9a747e4fSDavid du Colombier #include "all.h"
2*9a747e4fSDavid du Colombier
3*9a747e4fSDavid du Colombier #define SIZE 1024
4*9a747e4fSDavid du Colombier
5*9a747e4fSDavid du Colombier int chatty;
6*9a747e4fSDavid du Colombier int conftime;
7*9a747e4fSDavid du Colombier
8*9a747e4fSDavid du Colombier #define NSIZE 128
9*9a747e4fSDavid du Colombier
10*9a747e4fSDavid du Colombier static char nbuf[NSIZE];
11*9a747e4fSDavid du Colombier static int chatpid;
12*9a747e4fSDavid du Colombier
13*9a747e4fSDavid du Colombier static void
killchat(void)14*9a747e4fSDavid du Colombier killchat(void)
15*9a747e4fSDavid du Colombier {
16*9a747e4fSDavid du Colombier char buf[NSIZE];
17*9a747e4fSDavid du Colombier int fd;
18*9a747e4fSDavid du Colombier
19*9a747e4fSDavid du Colombier remove(nbuf);
20*9a747e4fSDavid du Colombier snprint(buf, sizeof buf, "/proc/%d/note", chatpid);
21*9a747e4fSDavid du Colombier fd = open(buf, OWRITE);
22*9a747e4fSDavid du Colombier write(fd, "kill\n", 5);
23*9a747e4fSDavid du Colombier close(fd);
24*9a747e4fSDavid du Colombier }
25*9a747e4fSDavid du Colombier
26*9a747e4fSDavid du Colombier void
chatsrv(char * name)27*9a747e4fSDavid du Colombier chatsrv(char *name)
28*9a747e4fSDavid du Colombier {
29*9a747e4fSDavid du Colombier int n, sfd, pfd[2];
30*9a747e4fSDavid du Colombier char *p, buf[256];
31*9a747e4fSDavid du Colombier
32*9a747e4fSDavid du Colombier if(name && *name)
33*9a747e4fSDavid du Colombier snprint(nbuf, sizeof nbuf, "/srv/%s", name);
34*9a747e4fSDavid du Colombier else{
35*9a747e4fSDavid du Colombier if(p = strrchr(argv0, '/')) /* assign = */
36*9a747e4fSDavid du Colombier name = p+1;
37*9a747e4fSDavid du Colombier else
38*9a747e4fSDavid du Colombier name = argv0;
39*9a747e4fSDavid du Colombier snprint(nbuf, sizeof nbuf, "/srv/%s.chat", name);
40*9a747e4fSDavid du Colombier }
41*9a747e4fSDavid du Colombier remove(nbuf);
42*9a747e4fSDavid du Colombier if(pipe(pfd) < 0)
43*9a747e4fSDavid du Colombier panic("chatsrv pipe");
44*9a747e4fSDavid du Colombier sfd = create(nbuf, OWRITE, 0600);
45*9a747e4fSDavid du Colombier if(sfd < 0)
46*9a747e4fSDavid du Colombier panic("chatsrv create %s", nbuf);
47*9a747e4fSDavid du Colombier chatpid = rfork(RFPROC|RFMEM);
48*9a747e4fSDavid du Colombier switch(chatpid){
49*9a747e4fSDavid du Colombier case -1:
50*9a747e4fSDavid du Colombier panic("chatsrv fork");
51*9a747e4fSDavid du Colombier case 0:
52*9a747e4fSDavid du Colombier break;
53*9a747e4fSDavid du Colombier default:
54*9a747e4fSDavid du Colombier atexit(killchat);
55*9a747e4fSDavid du Colombier return;
56*9a747e4fSDavid du Colombier }
57*9a747e4fSDavid du Colombier fprint(sfd, "%d", pfd[1]);
58*9a747e4fSDavid du Colombier close(sfd);
59*9a747e4fSDavid du Colombier close(pfd[1]);
60*9a747e4fSDavid du Colombier for(;;){
61*9a747e4fSDavid du Colombier n = read(pfd[0], buf, sizeof(buf)-1);
62*9a747e4fSDavid du Colombier if(n < 0)
63*9a747e4fSDavid du Colombier break;
64*9a747e4fSDavid du Colombier if(n == 0)
65*9a747e4fSDavid du Colombier continue;
66*9a747e4fSDavid du Colombier buf[n] = 0;
67*9a747e4fSDavid du Colombier if(buf[0] == 'c')
68*9a747e4fSDavid du Colombier conftime = 999;
69*9a747e4fSDavid du Colombier chatty = strtol(buf, 0, 0);
70*9a747e4fSDavid du Colombier if(abs(chatty) < 2)
71*9a747e4fSDavid du Colombier rpcdebug = 0;
72*9a747e4fSDavid du Colombier else
73*9a747e4fSDavid du Colombier rpcdebug = abs(chatty) - 1;
74*9a747e4fSDavid du Colombier fprint(2, "%s: chatty=%d, rpcdebug=%d, conftime=%d\n",
75*9a747e4fSDavid du Colombier nbuf, chatty, rpcdebug, conftime);
76*9a747e4fSDavid du Colombier }
77*9a747e4fSDavid du Colombier _exits(0);
78*9a747e4fSDavid du Colombier }
79*9a747e4fSDavid du Colombier
80*9a747e4fSDavid du Colombier void
chat(char * fmt,...)81*9a747e4fSDavid du Colombier chat(char *fmt, ...)
82*9a747e4fSDavid du Colombier {
83*9a747e4fSDavid du Colombier char buf[SIZE];
84*9a747e4fSDavid du Colombier va_list arg;
85*9a747e4fSDavid du Colombier Fmt f;
86*9a747e4fSDavid du Colombier
87*9a747e4fSDavid du Colombier if(!chatty)
88*9a747e4fSDavid du Colombier return;
89*9a747e4fSDavid du Colombier
90*9a747e4fSDavid du Colombier fmtfdinit(&f, 2, buf, sizeof buf);
91*9a747e4fSDavid du Colombier va_start(arg, fmt);
92*9a747e4fSDavid du Colombier fmtvprint(&f, fmt, arg);
93*9a747e4fSDavid du Colombier va_end(arg);
94*9a747e4fSDavid du Colombier fmtfdflush(&f);
95*9a747e4fSDavid du Colombier }
96*9a747e4fSDavid du Colombier
97*9a747e4fSDavid du Colombier void
clog(char * fmt,...)98*9a747e4fSDavid du Colombier clog(char *fmt, ...)
99*9a747e4fSDavid du Colombier {
100*9a747e4fSDavid du Colombier char buf[SIZE];
101*9a747e4fSDavid du Colombier va_list arg;
102*9a747e4fSDavid du Colombier int n;
103*9a747e4fSDavid du Colombier
104*9a747e4fSDavid du Colombier va_start(arg, fmt);
105*9a747e4fSDavid du Colombier vseprint(buf, buf+SIZE, fmt, arg);
106*9a747e4fSDavid du Colombier va_end(arg);
107*9a747e4fSDavid du Colombier n = strlen(buf);
108*9a747e4fSDavid du Colombier if(chatty || rpcdebug)
109*9a747e4fSDavid du Colombier write(2, buf, n);
110*9a747e4fSDavid du Colombier if(chatty <= 0){
111*9a747e4fSDavid du Colombier if(n>0 && buf[n-1] == '\n')
112*9a747e4fSDavid du Colombier buf[n-1] = 0;
113*9a747e4fSDavid du Colombier syslog(0, "nfs", buf);
114*9a747e4fSDavid du Colombier }
115*9a747e4fSDavid du Colombier }
116*9a747e4fSDavid du Colombier
117*9a747e4fSDavid du Colombier void
panic(char * fmt,...)118*9a747e4fSDavid du Colombier panic(char *fmt, ...)
119*9a747e4fSDavid du Colombier {
120*9a747e4fSDavid du Colombier char buf[SIZE];
121*9a747e4fSDavid du Colombier va_list arg;
122*9a747e4fSDavid du Colombier
123*9a747e4fSDavid du Colombier va_start(arg, fmt);
124*9a747e4fSDavid du Colombier vseprint(buf, buf+SIZE, fmt, arg);
125*9a747e4fSDavid du Colombier va_end(arg);
126*9a747e4fSDavid du Colombier if(chatty || rpcdebug)
127*9a747e4fSDavid du Colombier fprint(2, "%s %d: %s: %r\n", argv0, getpid(), buf);
128*9a747e4fSDavid du Colombier if(chatty <= 0)
129*9a747e4fSDavid du Colombier syslog(0, "nfs", buf);
130*9a747e4fSDavid du Colombier exits("panic");
131*9a747e4fSDavid du Colombier }
132