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