|
|
1.1 ! root 1: /* $Header: invite.c,v 1.2 85/01/09 13:04:57 rcs Exp $ */ ! 2: ! 3: #include "talk_ctl.h" ! 4: #include <sys/time.h> ! 5: #include <signal.h> ! 6: #include <setjmp.h> ! 7: ! 8: /* ! 9: * there wasn't an invitation waiting, so send a request containing ! 10: * our sockt address to the remote talk daemon so it can invite ! 11: * him ! 12: */ ! 13: ! 14: int local_id, remote_id; /* the msg.id's for the invitations ! 15: on the local and remote machines. ! 16: These are used to delete the ! 17: invitations. */ ! 18: void re_invite(); ! 19: jmp_buf invitebuf; ! 20: ! 21: int vaxbyteorder; /* if set, messages are sent in vax-byte-order*/ ! 22: int tonetmsg(); ! 23: int tonetresp(); ! 24: ! 25: invite_remote() ! 26: { ! 27: int nfd, read_mask, template, new_sockt; ! 28: struct itimerval itimer; ! 29: CTL_RESPONSE response; ! 30: ! 31: itimer.it_value.tv_sec = RING_WAIT; ! 32: itimer.it_value.tv_usec = 0; ! 33: itimer.it_interval = itimer.it_value; ! 34: ! 35: if (listen(sockt, 5) != 0) { ! 36: p_error("Error on attempt to listen for caller"); ! 37: } ! 38: ! 39: msg.ctlm_addr = my_addr; ! 40: msg.ctlm_id_num = -1; /* an impossible id_num */ ! 41: ! 42: invitation_waiting = 1; ! 43: ! 44: announce_invite(); ! 45: ! 46: /* ! 47: * shut off the automatic messages for a while, ! 48: * so we can use the interupt timer to resend the invitation ! 49: */ ! 50: ! 51: end_msgs(); ! 52: setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); ! 53: message("Waiting for your party to respond"); ! 54: signal(SIGALRM, re_invite); ! 55: (void) setjmp(invitebuf); ! 56: ! 57: while ((new_sockt = accept(sockt, 0, 0)) < 0) { ! 58: if (errno != EINTR) { ! 59: p_error("Unable to connect with your party"); ! 60: } else { ! 61: /* we just returned from a interupt, keep trying */ ! 62: continue; ! 63: } ! 64: } ! 65: ! 66: close(sockt); ! 67: sockt = new_sockt; ! 68: ! 69: /* have the daemons delete the invitations now that we ! 70: have connected. ! 71: */ ! 72: ! 73: current_state = "Waiting for your party to respond"; ! 74: start_msgs(); ! 75: ! 76: msg.ctlm_id_num = local_id; ! 77: ctl_transact(my_machine_addr, msg, DELETE, &response); ! 78: msg.ctlm_id_num = remote_id; ! 79: ctl_transact(his_machine_addr, msg, DELETE, &response); ! 80: invitation_waiting = 0; ! 81: } ! 82: ! 83: /* routine called on interupt to re-invite the callee */ ! 84: ! 85: void re_invite() ! 86: { ! 87: message("Ringing your party again"); ! 88: current_line++; ! 89: /* force a re-announce */ ! 90: msg.ctlm_id_num = remote_id + 1; ! 91: announce_invite(); ! 92: longjmp(invitebuf, 1); ! 93: } ! 94: ! 95: /* transmit the invitation and process the response */ ! 96: ! 97: announce_invite() ! 98: { ! 99: CTL_RESPONSE response; ! 100: ! 101: current_state = "Trying to connect to your party's talk daemon"; ! 102: ! 103: ctl_transact(his_machine_addr, msg, ANNOUNCE, &response); ! 104: remote_id = response.ctlr_id_num; ! 105: ! 106: if (response.ctlr_answer != SUCCESS) { ! 107: ! 108: switch (response.ctlr_answer) { ! 109: ! 110: case NOT_HERE : ! 111: message("Your party is not logged on"); ! 112: break; ! 113: ! 114: case MACHINE_UNKNOWN : ! 115: message("Target machine does not recognize us"); ! 116: break; ! 117: ! 118: case UNKNOWN_REQUEST : ! 119: message("Target machine can not handle remote talk"); ! 120: break; ! 121: ! 122: case FAILED : ! 123: message("Target machine is too confused to talk to us"); ! 124: break; ! 125: ! 126: case PERMISSION_DENIED : ! 127: message("Your party is refusing messages"); ! 128: break; ! 129: } ! 130: ! 131: quit(); ! 132: } ! 133: ! 134: /* leave the actual invitation on my talk daemon */ ! 135: ! 136: #ifdef DEBUG ! 137: printf("tell my daemon\n"); ! 138: #endif ! 139: ctl_transact(my_machine_addr, msg, LEAVE_INVITE, &response); ! 140: local_id = response.ctlr_id_num; ! 141: } ! 142: ! 143: send_delete() ! 144: { ! 145: NETCTL_MSG netmsg; /* for conversion to VAX Berkeley format */ ! 146: ! 147: /* tell the daemon to remove your invitation */ ! 148: ! 149: msg.ctlm_type = DELETE; ! 150: ! 151: /* this is just a extra clean up, so just send it ! 152: and don't wait for an answer */ ! 153: ! 154: msg.ctlm_id_num = remote_id; ! 155: daemon_addr.sin_addr = his_machine_addr; ! 156: tonetmsg(&msg, &netmsg, vaxbyteorder); ! 157: if (sendto(ctl_sockt, &netmsg, sizeof(netmsg), 0, &daemon_addr, ! 158: sizeof(daemon_addr)) != sizeof(netmsg)) { ! 159: perror("send_delete remote"); ! 160: } ! 161: ! 162: msg.ctlm_id_num = local_id; ! 163: daemon_addr.sin_addr = my_machine_addr; ! 164: tonetmsg(&msg, &netmsg, vaxbyteorder); ! 165: if (sendto(ctl_sockt, &netmsg, sizeof(netmsg), 0, &daemon_addr, ! 166: sizeof(daemon_addr)) != sizeof(netmsg)) { ! 167: perror("send_delete local"); ! 168: } ! 169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.