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