* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)invite.c 5.1 (Berkeley) 6/6/85";
* There wasn't an invitation waiting, so send a request containing
* our sockt address to the remote talk daemon so it can invite
* The msg.id's for the invitations
* on the local and remote machines.
* These are used to delete the
int nfd
, read_mask
, template, new_sockt
;
itimer
.it_value
.tv_sec
= RING_WAIT
;
itimer
.it_value
.tv_usec
= 0;
itimer
.it_interval
= itimer
.it_value
;
if (listen(sockt
, 5) != 0)
p_error("Error on attempt to listen for caller");
msg
.id_num
= -1; /* an impossible id_num */
* Shut off the automatic messages for a while,
* so we can use the interupt timer to resend the invitation
setitimer(ITIMER_REAL
, &itimer
, (struct itimerval
*)0);
message("Waiting for your party to respond");
signal(SIGALRM
, re_invite
);
(void) setjmp(invitebuf
);
while ((new_sockt
= accept(sockt
, 0, 0)) < 0) {
p_error("Unable to connect with your party");
* Have the daemons delete the invitations now that we
current_state
= "Waiting for your party to respond";
ctl_transact(my_machine_addr
, msg
, DELETE
, &response
);
ctl_transact(his_machine_addr
, msg
, DELETE
, &response
);
* Routine called on interupt to re-invite the callee
message("Ringing your party again");
/* force a re-announce */
msg
.id_num
= remote_id
+ 1;
* Transmit the invitation and process the response
current_state
= "Trying to connect to your party's talk daemon";
ctl_transact(his_machine_addr
, msg
, ANNOUNCE
, &response
);
remote_id
= response
.id_num
;
if (response
.answer
!= SUCCESS
) {
switch (response
.answer
) {
message("Your party is not logged on");
message("Target machine does not recognize us");
message("Target machine can not handle remote talk");
message("Target machine is too confused to talk to us");
message("Your party is refusing messages");
/* leave the actual invitation on my talk daemon */
ctl_transact(my_machine_addr
, msg
, LEAVE_INVITE
, &response
);
local_id
= response
.id_num
;
* Tell the daemon to remove your invitation
* This is just a extra clean up, so just send it
* and don't wait for an answer
daemon_addr
.sin_addr
= his_machine_addr
;
if (sendto(ctl_sockt
, &msg
, sizeof(CTL_MSG
), 0, &daemon_addr
,
sizeof(daemon_addr
)) != sizeof(CTL_MSG
))
perror("send_delete remote");
daemon_addr
.sin_addr
= my_machine_addr
;
if (sendto(ctl_sockt
, &msg
, sizeof(CTL_MSG
), 0, &daemon_addr
,
sizeof(daemon_addr
)) != sizeof(CTL_MSG
))
perror("send_delete local");