xref: /plan9-contrib/sys/src/cmd/9nfs/chat.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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