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*30540Ssam static char sccsid[] = "@(#)invite.c 5.3 (Berkeley) 02/20/87"; 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"); 4326848Smckusick msg.addr = *(struct sockaddr *)&my_addr; 4426848Smckusick msg.addr.sa_family = htons(msg.addr.sa_family); 4526848Smckusick 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 7226848Smckusick msg.id_num = htonl(local_id); 7316363Skarels ctl_transact(my_machine_addr, msg, DELETE, &response); 7426848Smckusick 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 */ 8926848Smckusick msg.id_num = htonl(remote_id + 1); 9016363Skarels announce_invite(); 9116363Skarels longjmp(invitebuf, 1); 9216350Skarels } 9316350Skarels 9426848Smckusick static char *answers[] = { 95*30540Ssam "answer #0", /* SUCCESS */ 9626848Smckusick "Your party is not logged on", /* NOT_HERE */ 97*30540Ssam "Target machine is too confused to talk to us", /* FAILED */ 9826848Smckusick "Target machine does not recognize us", /* MACHINE_UNKNOWN */ 99*30540Ssam "Your party is refusing messages", /* PERMISSION_REFUSED */ 10026848Smckusick "Target machine can not handle remote talk", /* UNKNOWN_REQUEST */ 10126848Smckusick "Target machine indicates protocol mismatch", /* BADVERSION */ 10226848Smckusick "Target machine indicates protocol botch (addr)",/* BADADDR */ 10326848Smckusick "Target machine indicates protocol botch (ctl_addr)",/* BADCTLADDR */ 10426848Smckusick }; 10526848Smckusick #define NANSWERS (sizeof (answers) / sizeof (answers[0])) 10626848Smckusick 10716363Skarels /* 10816363Skarels * Transmit the invitation and process the response 10916363Skarels */ 11016350Skarels announce_invite() 11116350Skarels { 11216363Skarels CTL_RESPONSE response; 11316350Skarels 11416363Skarels current_state = "Trying to connect to your party's talk daemon"; 11516363Skarels ctl_transact(his_machine_addr, msg, ANNOUNCE, &response); 11616363Skarels remote_id = response.id_num; 11716363Skarels if (response.answer != SUCCESS) { 11826848Smckusick if (response.answer < NANSWERS) 11926848Smckusick message(answers[response.answer]); 12016363Skarels quit(); 12116350Skarels } 12216350Skarels /* leave the actual invitation on my talk daemon */ 12316363Skarels ctl_transact(my_machine_addr, msg, LEAVE_INVITE, &response); 12416363Skarels local_id = response.id_num; 12516350Skarels } 12626848Smckusick 12716363Skarels /* 12816363Skarels * Tell the daemon to remove your invitation 12916363Skarels */ 13016350Skarels send_delete() 13116350Skarels { 13216350Skarels 13316363Skarels msg.type = DELETE; 13416363Skarels /* 13516363Skarels * This is just a extra clean up, so just send it 13616363Skarels * and don't wait for an answer 13716363Skarels */ 13826848Smckusick msg.id_num = htonl(remote_id); 13916363Skarels daemon_addr.sin_addr = his_machine_addr; 14026848Smckusick if (sendto(ctl_sockt, &msg, sizeof (msg), 0, &daemon_addr, 14126848Smckusick sizeof (daemon_addr)) != sizeof(msg)) 14226848Smckusick perror("send_delete (remote)"); 14326848Smckusick msg.id_num = htonl(local_id); 14416363Skarels daemon_addr.sin_addr = my_machine_addr; 14526848Smckusick if (sendto(ctl_sockt, &msg, sizeof (msg), 0, &daemon_addr, 14626848Smckusick sizeof (daemon_addr)) != sizeof (msg)) 14726848Smckusick perror("send_delete (local)"); 14816350Skarels } 149