xref: /csrg-svn/libexec/talkd/talkd.c (revision 16366)
1*16366Skarels #ifndef lint
2*16366Skarels static	char sccsid[] = "@(#)talkd.c	1.2 (Berkeley) 04/11/84";
3*16366Skarels #endif
416360Skarels 
5*16366Skarels /*
6*16366Skarels  * The top level of the daemon, the format is heavily borrowed
7*16366Skarels  * from rwhod.c. Basically: find out who and where you are;
8*16366Skarels  * disconnect all descriptors and ttys, and then endless
9*16366Skarels  * loop on waiting for and processing requests
1016360Skarels  */
1116360Skarels #include <stdio.h>
1216360Skarels #include <errno.h>
13*16366Skarels #include <signal.h>
1416360Skarels 
15*16366Skarels #include "ctl.h"
1616360Skarels 
1716360Skarels struct	sockaddr_in sin = { AF_INET };
1816360Skarels 
19*16366Skarels CTL_MSG		request;
20*16366Skarels CTL_RESPONSE	response;
2116360Skarels 
22*16366Skarels int	sockt;
23*16366Skarels int	debug = 0;
24*16366Skarels int	timeout();
25*16366Skarels long	lastmsgtime;
2616360Skarels 
27*16366Skarels char	hostname[32];
2816360Skarels 
29*16366Skarels #define TIMEOUT 30
30*16366Skarels #define MAXIDLE 120
31*16366Skarels 
32*16366Skarels main(argc, argv)
33*16366Skarels 	int argc;
34*16366Skarels 	char *argv[];
3516360Skarels {
36*16366Skarels 	struct sockaddr_in from;
37*16366Skarels 	int fromlen, cc;
3816360Skarels 
39*16366Skarels 	if (getuid()) {
40*16366Skarels 		fprintf(stderr, "Talkd : not super user\n");
41*16366Skarels 		exit(1);
4216360Skarels 	}
43*16366Skarels 	gethostname(hostname, sizeof (hostname));
44*16366Skarels 	(void) chdir("/dev");
45*16366Skarels 	signal(SIGALRM, timeout);
46*16366Skarels 	alarm(TIMEOUT);
47*16366Skarels 	for (;;) {
48*16366Skarels 		extern int errno;
4916360Skarels 
50*16366Skarels 		fromlen = sizeof(from);
51*16366Skarels 		cc = recvfrom(0, (char *)&request, sizeof (request), 0,
52*16366Skarels 		    &from, &fromlen);
53*16366Skarels 		if (cc != sizeof(request)) {
54*16366Skarels 			if (cc < 0 && errno != EINTR)
55*16366Skarels 			perror("recvfrom");
56*16366Skarels 			continue;
57*16366Skarels 		}
58*16366Skarels 		lastmsgtime = time(0);
59*16366Skarels 		process_request(&request, &response);
6016360Skarels 		/* can block here, is this what I want? */
61*16366Skarels 		cc = sendto(sockt, (char *) &response,
62*16366Skarels 		    sizeof (response), 0, &request.ctl_addr,
63*16366Skarels 		    sizeof (request.ctl_addr));
64*16366Skarels 		if (cc != sizeof(response))
65*16366Skarels 			perror("sendto");
6616360Skarels 	}
6716360Skarels }
6816360Skarels 
69*16366Skarels timeout()
7016360Skarels {
7116360Skarels 
72*16366Skarels 	if (time(0) - lastmsgtime >= MAXIDLE)
73*16366Skarels 		exit(0);
74*16366Skarels 	alarm(TIMEOUT);
7516360Skarels }
76