|
|
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.