|
|
1.1 root 1: /*
2: * Hunt
3: * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
4: * San Francisco, California
5: *
6: * Copyright (c) 1985 Regents of the University of California.
7: * All rights reserved. The Berkeley software License Agreement
8: * specifies the terms and conditions for redistribution.
9: */
10:
11: #include "bsd.h"
12:
13: #if defined(TALK_43) || defined(TALK_42)
14:
15: # include <stdio.h>
16: # include <netdb.h>
17: # include "talk_ctl.h"
18: # include <ctype.h>
19: # include <signal.h>
20: # include <sys/time.h>
21: extern int errno;
22:
23: extern char *index(), *rindex();
24:
25: # define TRUE 1
26: # define FALSE 0
27:
28: /* defines for fake talk message to announce start of game */
29: # ifdef TALK_43
30: # define MASQUERADE "\"Hunt Game\""
31: # else
32: # define MASQUERADE "HuntGame"
33: # endif
34: # define RENDEZVOUS "hunt-players"
35: # define ARGV0 "HUNT-ANNOUNCE"
36:
37: extern char *my_machine_name;
38: extern char *First_arg, *Last_arg;
39:
40: /*
41: * exorcise - disspell zombies
42: */
43:
44: exorcise()
45: {
46: (void) wait(0);
47: }
48:
49: /*
50: * query the local SMTP daemon to expand the RENDEZVOUS mailing list
51: * and fake a talk request to each address thus found.
52: */
53:
54: faketalk()
55: {
56: struct servent *sp;
57: char buf[BUFSIZ];
58: FILE *f;
59: int service; /* socket of service */
60: struct sockaddr_in des; /* address of destination */
61: char *a, *b;
62: extern char **environ;
63:
64: (void) signal(SIGCHLD, exorcise);
65:
66: if (fork() != 0)
67: return;
68:
69: (void) signal(SIGINT, SIG_IGN);
70: (void) signal(SIGPIPE, SIG_IGN);
71:
72: /*
73: * change argv so that a ps shows ARGV0
74: */
75: *environ = NULL;
76: for (a = First_arg, b = ARGV0; a < Last_arg; a++) {
77: if (*b)
78: *a = *b++;
79: else
80: *a = ' ';
81: }
82:
83: /*
84: * initialize "talk"
85: */
86: get_local_name(MASQUERADE);
87: open_ctl();
88:
89: /*
90: * start fetching addresses
91: */
92:
93: if ((sp = getservbyname("smtp", (char *) NULL)) == NULL) {
94: # ifdef LOG
95: syslog(LOG_ERR, "faketalk: smtp protocol not supported\n");
96: # else LOG
97: fprintf(stderr, "faketalk: stmp protocol not supported\n");
98: # endif LOG
99: _exit(1);
100: }
101:
102: bzero((char *) &des, sizeof (des));
103: des.sin_family = AF_INET;
104: des.sin_addr = my_machine_addr;
105: des.sin_port = sp->s_port;
106:
107: if ((service = socket(des.sin_family, SOCK_STREAM, 0)) < 0) {
108: # ifdef LOG
109: syslog(LOG_ERR, "falktalk: socket");
110: # else LOG
111: perror("falktalk: socket");
112: # endif LOG
113: _exit(-1);
114: }
115:
116: if (connect(service, (struct sockaddr *) &des, sizeof(des)) != 0) {
117: # ifdef LOG
118: syslog(LOG_ERR, "faketalk: connect");
119: # else LOG
120: perror("faketalk: connect");
121: # endif LOG
122: _exit(-1);
123: }
124: if ((f = fdopen(service, "r")) == NULL) {
125: # ifdef LOG
126: syslog(LOG_ERR, "fdopen failed\n");
127: # else LOG
128: fprintf(stderr, "fdopen failed\n");
129: # endif LOG
130: _exit(-2);
131: }
132:
133: (void) fgets(buf, BUFSIZ, f);
134: (void) sprintf(buf, "HELO HuntGame@%s\r\n", my_machine_name);
135: (void) write(service, buf, strlen(buf));
136: (void) fgets(buf, BUFSIZ, f);
137: (void) sprintf(buf, "EXPN %s@%s\r\n", RENDEZVOUS, my_machine_name);
138: (void) write(service, buf, strlen(buf));
139: while (fgets(buf, BUFSIZ, f) != NULL) {
140: char *s, *t;
141:
142: if (buf[0] != '2' || buf[1] != '5' || buf[2] != '0')
143: break;
144: if ((s = index(buf + 4, '<')) == NULL)
145: s = buf + 4, t = buf + strlen(buf) - 1;
146: else {
147: s += 1;
148: if ((t = rindex(s, '>')) == NULL)
149: t = s + strlen(s) - 1;
150: else
151: t -= 1;
152: }
153: while (isspace(*s))
154: s += 1;
155: if (*s == '\\')
156: s += 1;
157: while (isspace(*t))
158: t -= 1;
159: *(t + 1) = '\0';
160: do_announce(s); /* construct and send talk request */
161: if (buf[3] == ' ')
162: break;
163: }
164: (void) shutdown(service, 2);
165: (void) close(service);
166: _exit(0);
167: }
168:
169: /*
170: * The msg.id's for the invitations on the local and remote machines.
171: * These are used to delete the invitations.
172: */
173:
174: do_announce(s)
175: char *s;
176: {
177: CTL_RESPONSE response;
178: extern struct sockaddr_in ctl_addr;
179:
180: get_remote_name(s); /* setup his_machine_addr, msg.r_name */
181:
182: # ifdef TALK_43
183: # if BSD_RELEASE >= 44
184: msg.ctl_addr = *(struct osockaddr *) &ctl_addr;
185: # else
186: msg.ctl_addr = *(struct sockaddr *) &ctl_addr;
187: # endif
188: msg.ctl_addr.sa_family = htons(msg.ctl_addr.sa_family);
189: # else
190: msg.ctl_addr = ctl_addr;
191: msg.ctl_addr.sin_family = htons(msg.ctl_addr.sin_family);
192: # endif
193: msg.id_num = (int) htonl((u_long) -1); /* an impossible id_num */
194: ctl_transact(his_machine_addr, msg, ANNOUNCE, &response);
195: if (response.answer != SUCCESS)
196: return;
197:
198: /*
199: * Have the daemons delete the invitations now that we
200: * have announced.
201: */
202:
203: /* we don't care if cleanup doesn't make it. */
204: msg.type = DELETE;
205: msg.id_num = (int) htonl(response.id_num);
206: daemon_addr.sin_addr = his_machine_addr;
207: if (sendto(ctl_sockt, (char *) &msg, sizeof (msg), 0,
208: (struct sockaddr *) &daemon_addr, sizeof(daemon_addr))
209: != sizeof(msg))
210: p_error("send delete remote");
211: }
212: #else
213: faketalk()
214: {
215: return;
216: }
217: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.