|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: char copyright[] =
20: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
21: All rights reserved.\n";
22: #endif /* not lint */
23:
24: #ifndef lint
25: static char sccsid[] = "@(#)talkd.c 5.4 (Berkeley) 6/18/88";
26: #endif /* not lint */
27:
28: /*
29: * The top level of the daemon, the format is heavily borrowed
30: * from rwhod.c. Basically: find out who and where you are;
31: * disconnect all descriptors and ttys, and then endless
32: * loop on waiting for and processing requests
33: */
34: #include <stdio.h>
35: #include <errno.h>
36: #include <signal.h>
37: #include <syslog.h>
38:
39: #include <protocols/talkd.h>
40:
41: CTL_MSG request;
42: CTL_RESPONSE response;
43:
44: int sockt;
45: int debug = 0;
46: int timeout();
47: long lastmsgtime;
48:
49: char hostname[32];
50:
51: #define TIMEOUT 30
52: #define MAXIDLE 120
53:
54: main(argc, argv)
55: int argc;
56: char *argv[];
57: {
58: register CTL_MSG *mp = &request;
59: int cc;
60:
61: if (getuid()) {
62: fprintf(stderr, "%s: getuid: not super-user", argv[0]);
63: exit(1);
64: }
65: openlog("talkd", LOG_PID, LOG_DAEMON);
66: if (gethostname(hostname, sizeof (hostname) - 1) < 0) {
67: syslog(LOG_ERR, "gethostname: %m");
68: _exit(1);
69: }
70: if (chdir("/dev") < 0) {
71: syslog(LOG_ERR, "chdir: /dev: %m");
72: _exit(1);
73: }
74: if (argc > 1 && strcmp(argv[1], "-d") == 0)
75: debug = 1;
76: signal(SIGALRM, timeout);
77: alarm(TIMEOUT);
78: for (;;) {
79: extern int errno;
80:
81: cc = recv(0, (char *)mp, sizeof (*mp), 0);
82: if (cc != sizeof (*mp)) {
83: if (cc < 0 && errno != EINTR)
84: syslog(LOG_WARNING, "recv: %m");
85: continue;
86: }
87: lastmsgtime = time(0);
88: process_request(mp, &response);
89: /* can block here, is this what I want? */
90: cc = sendto(sockt, (char *)&response,
91: sizeof (response), 0, &mp->ctl_addr, sizeof (mp->ctl_addr));
92: if (cc != sizeof (response))
93: syslog(LOG_WARNING, "sendto: %m");
94: }
95: }
96:
97: timeout()
98: {
99:
100: if (time(0) - lastmsgtime >= MAXIDLE)
101: _exit(0);
102: alarm(TIMEOUT);
103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.