122401Sdist /* 222401Sdist * Copyright (c) 1983 Regents of the University of California. 334360Sbostic * All rights reserved. 434360Sbostic * 5*42673Sbostic * %sccs.include.redist.c% 622401Sdist */ 722401Sdist 816366Skarels #ifndef lint 922401Sdist char copyright[] = 1022401Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 1122401Sdist All rights reserved.\n"; 1234360Sbostic #endif /* not lint */ 1316360Skarels 1422401Sdist #ifndef lint 15*42673Sbostic static char sccsid[] = "@(#)talkd.c 5.7 (Berkeley) 06/01/90"; 1634360Sbostic #endif /* not lint */ 1722401Sdist 1816366Skarels /* 1916366Skarels * The top level of the daemon, the format is heavily borrowed 2016366Skarels * from rwhod.c. Basically: find out who and where you are; 2116366Skarels * disconnect all descriptors and ttys, and then endless 2216366Skarels * loop on waiting for and processing requests 2316360Skarels */ 2416360Skarels #include <stdio.h> 2516360Skarels #include <errno.h> 2616366Skarels #include <signal.h> 2726841Smckusick #include <syslog.h> 2816360Skarels 2926841Smckusick #include <protocols/talkd.h> 3037991Sbostic #include <paths.h> 3116360Skarels 3216366Skarels CTL_MSG request; 3316366Skarels CTL_RESPONSE response; 3416360Skarels 3516366Skarels int sockt; 3616366Skarels int debug = 0; 3716366Skarels int timeout(); 3816366Skarels long lastmsgtime; 3916360Skarels 4016366Skarels char hostname[32]; 4116360Skarels 4216366Skarels #define TIMEOUT 30 4316366Skarels #define MAXIDLE 120 4416366Skarels 4516366Skarels main(argc, argv) 4616366Skarels int argc; 4716366Skarels char *argv[]; 4816360Skarels { 4926841Smckusick register CTL_MSG *mp = &request; 5026841Smckusick int cc; 5116360Skarels 5216366Skarels if (getuid()) { 5326841Smckusick fprintf(stderr, "%s: getuid: not super-user", argv[0]); 5416366Skarels exit(1); 5516360Skarels } 5626841Smckusick openlog("talkd", LOG_PID, LOG_DAEMON); 5726841Smckusick if (gethostname(hostname, sizeof (hostname) - 1) < 0) { 5826841Smckusick syslog(LOG_ERR, "gethostname: %m"); 5926841Smckusick _exit(1); 6026841Smckusick } 6137991Sbostic if (chdir(_PATH_DEV) < 0) { 6237991Sbostic syslog(LOG_ERR, "chdir: %s: %m", _PATH_DEV); 6326841Smckusick _exit(1); 6426841Smckusick } 6526841Smckusick if (argc > 1 && strcmp(argv[1], "-d") == 0) 6626841Smckusick debug = 1; 6716366Skarels signal(SIGALRM, timeout); 6816366Skarels alarm(TIMEOUT); 6916366Skarels for (;;) { 7016366Skarels extern int errno; 7116360Skarels 7226841Smckusick cc = recv(0, (char *)mp, sizeof (*mp), 0); 7326841Smckusick if (cc != sizeof (*mp)) { 7416366Skarels if (cc < 0 && errno != EINTR) 7526841Smckusick syslog(LOG_WARNING, "recv: %m"); 7616366Skarels continue; 7716366Skarels } 7816366Skarels lastmsgtime = time(0); 7926841Smckusick process_request(mp, &response); 8016360Skarels /* can block here, is this what I want? */ 8126841Smckusick cc = sendto(sockt, (char *)&response, 8238638Skarels sizeof (response), 0, (struct sockaddr *)&mp->ctl_addr, 8338638Skarels sizeof (mp->ctl_addr)); 8426841Smckusick if (cc != sizeof (response)) 8526841Smckusick syslog(LOG_WARNING, "sendto: %m"); 8616360Skarels } 8716360Skarels } 8816360Skarels 8916366Skarels timeout() 9016360Skarels { 9116360Skarels 9216366Skarels if (time(0) - lastmsgtime >= MAXIDLE) 9326841Smckusick _exit(0); 9416366Skarels alarm(TIMEOUT); 9516360Skarels } 96