122401Sdist /* 222401Sdist * Copyright (c) 1983 Regents of the University of California. 334360Sbostic * All rights reserved. 434360Sbostic * 542673Sbostic * %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*50712Smarc static char sccsid[] = "@(#)talkd.c 5.9 (Berkeley) 07/31/91"; 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 */ 2446683Sbostic #include <sys/types.h> 2546683Sbostic #include <sys/socket.h> 2646683Sbostic #include <protocols/talkd.h> 2716366Skarels #include <signal.h> 2826841Smckusick #include <syslog.h> 2946683Sbostic #include <time.h> 3046683Sbostic #include <errno.h> 3146683Sbostic #include <unistd.h> 3246683Sbostic #include <stdio.h> 3346683Sbostic #include <stdlib.h> 3446683Sbostic #include <string.h> 3537991Sbostic #include <paths.h> 3616360Skarels 3716366Skarels CTL_MSG request; 3816366Skarels CTL_RESPONSE response; 3916360Skarels 4016366Skarels int sockt; 4116366Skarels int debug = 0; 4246683Sbostic void timeout(); 4316366Skarels long lastmsgtime; 4416360Skarels 4516366Skarels char hostname[32]; 4616360Skarels 4716366Skarels #define TIMEOUT 30 4816366Skarels #define MAXIDLE 120 4916366Skarels 5016366Skarels main(argc, argv) 5116366Skarels int argc; 5216366Skarels char *argv[]; 5316360Skarels { 5426841Smckusick register CTL_MSG *mp = &request; 5526841Smckusick int cc; 5616360Skarels 5716366Skarels if (getuid()) { 58*50712Smarc fprintf(stderr, "%s: getuid: not super-user\n", argv[0]); 5916366Skarels exit(1); 6016360Skarels } 6126841Smckusick openlog("talkd", LOG_PID, LOG_DAEMON); 6226841Smckusick if (gethostname(hostname, sizeof (hostname) - 1) < 0) { 6326841Smckusick syslog(LOG_ERR, "gethostname: %m"); 6426841Smckusick _exit(1); 6526841Smckusick } 6637991Sbostic if (chdir(_PATH_DEV) < 0) { 6737991Sbostic syslog(LOG_ERR, "chdir: %s: %m", _PATH_DEV); 6826841Smckusick _exit(1); 6926841Smckusick } 7026841Smckusick if (argc > 1 && strcmp(argv[1], "-d") == 0) 7126841Smckusick debug = 1; 7216366Skarels signal(SIGALRM, timeout); 7316366Skarels alarm(TIMEOUT); 7416366Skarels for (;;) { 7516366Skarels extern int errno; 7616360Skarels 7726841Smckusick cc = recv(0, (char *)mp, sizeof (*mp), 0); 7826841Smckusick if (cc != sizeof (*mp)) { 7916366Skarels if (cc < 0 && errno != EINTR) 8026841Smckusick syslog(LOG_WARNING, "recv: %m"); 8116366Skarels continue; 8216366Skarels } 8316366Skarels lastmsgtime = time(0); 8426841Smckusick process_request(mp, &response); 8516360Skarels /* can block here, is this what I want? */ 8626841Smckusick cc = sendto(sockt, (char *)&response, 8738638Skarels sizeof (response), 0, (struct sockaddr *)&mp->ctl_addr, 8838638Skarels sizeof (mp->ctl_addr)); 8926841Smckusick if (cc != sizeof (response)) 9026841Smckusick syslog(LOG_WARNING, "sendto: %m"); 9116360Skarels } 9216360Skarels } 9316360Skarels 9446683Sbostic void 9516366Skarels timeout() 9616360Skarels { 9716360Skarels 9816366Skarels if (time(0) - lastmsgtime >= MAXIDLE) 9926841Smckusick _exit(0); 10016366Skarels alarm(TIMEOUT); 10116360Skarels } 102