xref: /csrg-svn/libexec/talkd/talkd.c (revision 26841)
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