122401Sdist /* 222401Sdist * Copyright (c) 1983 Regents of the University of California. 322401Sdist * All rights reserved. The Berkeley software License Agreement 422401Sdist * specifies the terms and conditions for redistribution. 522401Sdist */ 622401Sdist 716366Skarels #ifndef lint 822401Sdist char copyright[] = 922401Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 1022401Sdist All rights reserved.\n"; 1122401Sdist #endif not lint 1216360Skarels 1322401Sdist #ifndef lint 14*26841Smckusick static char sccsid[] = "@(#)talkd.c 5.2 (Berkeley) 03/13/86"; 1522401Sdist #endif not lint 1622401Sdist 1716366Skarels /* 1816366Skarels * The top level of the daemon, the format is heavily borrowed 1916366Skarels * from rwhod.c. Basically: find out who and where you are; 2016366Skarels * disconnect all descriptors and ttys, and then endless 2116366Skarels * loop on waiting for and processing requests 2216360Skarels */ 2316360Skarels #include <stdio.h> 2416360Skarels #include <errno.h> 2516366Skarels #include <signal.h> 26*26841Smckusick #include <syslog.h> 2716360Skarels 28*26841Smckusick #include <protocols/talkd.h> 2916360Skarels 3016366Skarels CTL_MSG request; 3116366Skarels CTL_RESPONSE response; 3216360Skarels 3316366Skarels int sockt; 3416366Skarels int debug = 0; 3516366Skarels int timeout(); 3616366Skarels long lastmsgtime; 3716360Skarels 3816366Skarels char hostname[32]; 3916360Skarels 4016366Skarels #define TIMEOUT 30 4116366Skarels #define MAXIDLE 120 4216366Skarels 4316366Skarels main(argc, argv) 4416366Skarels int argc; 4516366Skarels char *argv[]; 4616360Skarels { 47*26841Smckusick register CTL_MSG *mp = &request; 48*26841Smckusick int cc; 4916360Skarels 5016366Skarels if (getuid()) { 51*26841Smckusick fprintf(stderr, "%s: getuid: not super-user", argv[0]); 5216366Skarels exit(1); 5316360Skarels } 54*26841Smckusick openlog("talkd", LOG_PID, LOG_DAEMON); 55*26841Smckusick if (gethostname(hostname, sizeof (hostname) - 1) < 0) { 56*26841Smckusick syslog(LOG_ERR, "gethostname: %m"); 57*26841Smckusick _exit(1); 58*26841Smckusick } 59*26841Smckusick if (chdir("/dev") < 0) { 60*26841Smckusick syslog(LOG_ERR, "chdir: /dev: %m"); 61*26841Smckusick _exit(1); 62*26841Smckusick } 63*26841Smckusick if (argc > 1 && strcmp(argv[1], "-d") == 0) 64*26841Smckusick debug = 1; 6516366Skarels signal(SIGALRM, timeout); 6616366Skarels alarm(TIMEOUT); 6716366Skarels for (;;) { 6816366Skarels extern int errno; 6916360Skarels 70*26841Smckusick cc = recv(0, (char *)mp, sizeof (*mp), 0); 71*26841Smckusick if (cc != sizeof (*mp)) { 7216366Skarels if (cc < 0 && errno != EINTR) 73*26841Smckusick syslog(LOG_WARNING, "recv: %m"); 7416366Skarels continue; 7516366Skarels } 7616366Skarels lastmsgtime = time(0); 77*26841Smckusick process_request(mp, &response); 7816360Skarels /* can block here, is this what I want? */ 79*26841Smckusick cc = sendto(sockt, (char *)&response, 80*26841Smckusick sizeof (response), 0, &mp->ctl_addr, sizeof (mp->ctl_addr)); 81*26841Smckusick if (cc != sizeof (response)) 82*26841Smckusick syslog(LOG_WARNING, "sendto: %m"); 8316360Skarels } 8416360Skarels } 8516360Skarels 8616366Skarels timeout() 8716360Skarels { 8816360Skarels 8916366Skarels if (time(0) - lastmsgtime >= MAXIDLE) 90*26841Smckusick _exit(0); 9116366Skarels alarm(TIMEOUT); 9216360Skarels } 93