122394Sdist /* 222394Sdist * Copyright (c) 1983 Regents of the University of California. 322394Sdist * All rights reserved. The Berkeley software License Agreement 422394Sdist * specifies the terms and conditions for redistribution. 522394Sdist */ 622394Sdist 716363Skarels #ifndef lint 8*26848Smckusick static char sccsid[] = "@(#)invite.c 5.2 (Berkeley) 03/13/86"; 922394Sdist #endif not lint 1016350Skarels 1116350Skarels #include "talk_ctl.h" 1216350Skarels #include <sys/time.h> 1316350Skarels #include <signal.h> 1416350Skarels #include <setjmp.h> 1516350Skarels 1616363Skarels /* 1716363Skarels * There wasn't an invitation waiting, so send a request containing 1816363Skarels * our sockt address to the remote talk daemon so it can invite 1916363Skarels * him 2016363Skarels */ 2116350Skarels 2216363Skarels /* 2316363Skarels * The msg.id's for the invitations 2416363Skarels * on the local and remote machines. 2516363Skarels * These are used to delete the 2616363Skarels * invitations. 2716363Skarels */ 2816363Skarels int local_id, remote_id; 2916363Skarels void re_invite(); 3016363Skarels jmp_buf invitebuf; 3116363Skarels 3216350Skarels invite_remote() 3316350Skarels { 3416363Skarels int nfd, read_mask, template, new_sockt; 3516363Skarels struct itimerval itimer; 3616363Skarels CTL_RESPONSE response; 3716350Skarels 3816363Skarels itimer.it_value.tv_sec = RING_WAIT; 3916363Skarels itimer.it_value.tv_usec = 0; 4016363Skarels itimer.it_interval = itimer.it_value; 4116363Skarels if (listen(sockt, 5) != 0) 4216363Skarels p_error("Error on attempt to listen for caller"); 43*26848Smckusick msg.addr = *(struct sockaddr *)&my_addr; 44*26848Smckusick msg.addr.sa_family = htons(msg.addr.sa_family); 45*26848Smckusick msg.id_num = htonl(-1); /* an impossible id_num */ 4616363Skarels invitation_waiting = 1; 4716363Skarels announce_invite(); 4816350Skarels /* 4916363Skarels * Shut off the automatic messages for a while, 5016350Skarels * so we can use the interupt timer to resend the invitation 5116350Skarels */ 5216363Skarels end_msgs(); 5316363Skarels setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0); 5416363Skarels message("Waiting for your party to respond"); 5516363Skarels signal(SIGALRM, re_invite); 5616363Skarels (void) setjmp(invitebuf); 5716363Skarels while ((new_sockt = accept(sockt, 0, 0)) < 0) { 5816363Skarels if (errno == EINTR) 5916363Skarels continue; 6016363Skarels p_error("Unable to connect with your party"); 6116350Skarels } 6216363Skarels close(sockt); 6316363Skarels sockt = new_sockt; 6416350Skarels 6516363Skarels /* 6616363Skarels * Have the daemons delete the invitations now that we 6716363Skarels * have connected. 6816350Skarels */ 6916363Skarels current_state = "Waiting for your party to respond"; 7016363Skarels start_msgs(); 7116350Skarels 72*26848Smckusick msg.id_num = htonl(local_id); 7316363Skarels ctl_transact(my_machine_addr, msg, DELETE, &response); 74*26848Smckusick msg.id_num = htonl(remote_id); 7516363Skarels ctl_transact(his_machine_addr, msg, DELETE, &response); 7616363Skarels invitation_waiting = 0; 7716350Skarels } 7816350Skarels 7916363Skarels /* 8016363Skarels * Routine called on interupt to re-invite the callee 8116363Skarels */ 8216363Skarels void 8316363Skarels re_invite() 8416363Skarels { 8516350Skarels 8616363Skarels message("Ringing your party again"); 8716363Skarels current_line++; 8816350Skarels /* force a re-announce */ 89*26848Smckusick msg.id_num = htonl(remote_id + 1); 9016363Skarels announce_invite(); 9116363Skarels longjmp(invitebuf, 1); 9216350Skarels } 9316350Skarels 94*26848Smckusick static char *answers[] = { 95*26848Smckusick "Your party is not logged on", /* NOT_HERE */ 96*26848Smckusick "Target machine does not recognize us", /* MACHINE_UNKNOWN */ 97*26848Smckusick "Target machine can not handle remote talk", /* UNKNOWN_REQUEST */ 98*26848Smckusick "Target machine is too confused to talk to us", /* FAILED */ 99*26848Smckusick "Your party is refusing messages", /* PERMISSION_REFUSED */ 100*26848Smckusick "Target machine indicates protocol mismatch", /* BADVERSION */ 101*26848Smckusick "Target machine indicates protocol botch (addr)",/* BADADDR */ 102*26848Smckusick "Target machine indicates protocol botch (ctl_addr)",/* BADCTLADDR */ 103*26848Smckusick }; 104*26848Smckusick #define NANSWERS (sizeof (answers) / sizeof (answers[0])) 105*26848Smckusick 10616363Skarels /* 10716363Skarels * Transmit the invitation and process the response 10816363Skarels */ 10916350Skarels announce_invite() 11016350Skarels { 11116363Skarels CTL_RESPONSE response; 11216350Skarels 11316363Skarels current_state = "Trying to connect to your party's talk daemon"; 11416363Skarels ctl_transact(his_machine_addr, msg, ANNOUNCE, &response); 11516363Skarels remote_id = response.id_num; 11616363Skarels if (response.answer != SUCCESS) { 117*26848Smckusick if (response.answer < NANSWERS) 118*26848Smckusick message(answers[response.answer]); 11916363Skarels quit(); 12016350Skarels } 12116350Skarels /* leave the actual invitation on my talk daemon */ 12216363Skarels ctl_transact(my_machine_addr, msg, LEAVE_INVITE, &response); 12316363Skarels local_id = response.id_num; 12416350Skarels } 125*26848Smckusick 12616363Skarels /* 12716363Skarels * Tell the daemon to remove your invitation 12816363Skarels */ 12916350Skarels send_delete() 13016350Skarels { 13116350Skarels 13216363Skarels msg.type = DELETE; 13316363Skarels /* 13416363Skarels * This is just a extra clean up, so just send it 13516363Skarels * and don't wait for an answer 13616363Skarels */ 137*26848Smckusick msg.id_num = htonl(remote_id); 13816363Skarels daemon_addr.sin_addr = his_machine_addr; 139*26848Smckusick if (sendto(ctl_sockt, &msg, sizeof (msg), 0, &daemon_addr, 140*26848Smckusick sizeof (daemon_addr)) != sizeof(msg)) 141*26848Smckusick perror("send_delete (remote)"); 142*26848Smckusick msg.id_num = htonl(local_id); 14316363Skarels daemon_addr.sin_addr = my_machine_addr; 144*26848Smckusick if (sendto(ctl_sockt, &msg, sizeof (msg), 0, &daemon_addr, 145*26848Smckusick sizeof (daemon_addr)) != sizeof (msg)) 146*26848Smckusick perror("send_delete (local)"); 14716350Skarels } 148