-/* $Header: look_up.c 1.2 83/03/28 00:34:22 moore Exp $ */
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
-#include "talk_ctl.h"
+#ifndef lint
+static char sccsid[] = "@(#)look_up.c 5.2 (Berkeley) 3/13/86";
+#endif not lint
- /* see if the local daemon has a invitation for us */
+#include "talk_ctl.h"
+/*
+ * See if the local daemon has an invitation for us.
+ */
check_local()
{
- CTL_RESPONSE response;
+ CTL_RESPONSE response;
+ register CTL_RESPONSE *rp = &response;
/* the rest of msg was set up in get_names */
-
- msg.ctl_addr = ctl_addr;
-
- if (!look_for_invite(&response)) {
-
- /* we must be initiating a talk */
-
- return(0);
- }
-
- /*
- * there was an invitation waiting for us,
+ msg.ctl_addr = *(struct sockaddr *)&ctl_addr;
+ msg.ctl_addr.sa_family = htons(msg.ctl_addr.sa_family);
+ /* must be initiating a talk */
+ if (!look_for_invite(rp))
+ return (0);
+ /*
+ * There was an invitation waiting for us,
* so connect with the other (hopefully waiting) party
*/
-
- current_state = "Waiting to connect with caller";
-
- while (connect(sockt, &response.addr, sizeof(response.addr)) != 0) {
+ current_state = "Waiting to connect with caller";
+ do {
+ if (rp->addr.sa_family != AF_INET)
+ p_error("Response uses invalid network address");
+ errno = 0;
+ if (connect(sockt, &rp->addr, sizeof (rp->addr)) != -1)
+ return (1);
+ } while (errno == EINTR);
if (errno == ECONNREFUSED) {
-
- /* the caller gave up, but his invitation somehow
+ /*
+ * The caller gave up, but his invitation somehow
* was not cleared. Clear it and initiate an
* invitation. (We know there are no newer invitations,
* the talkd works LIFO.)
*/
-
- ctl_transact(his_machine_addr, msg, DELETE, &response);
- close(sockt);
- open_sockt();
- return(0);
- } else if (errno == EINTR) {
- /* we have returned from an interupt handler */
- continue;
- } else {
- p_error("Unable to connect with initiator");
+ ctl_transact(his_machine_addr, msg, DELETE, rp);
+ close(sockt);
+ open_sockt();
+ return (0);
}
- }
-
- return(1);
+ p_error("Unable to connect with initiator");
+ /*NOTREACHED*/
}
- /* look for an invitation on 'machine' */
-
-look_for_invite(response)
-CTL_RESPONSE *response;
+/*
+ * Look for an invitation on 'machine'
+ */
+look_for_invite(rp)
+ CTL_RESPONSE *rp;
{
- struct in_addr machine_addr;
-
- current_state = "Checking for invitation on caller's machine";
+ struct in_addr machine_addr;
- ctl_transact(his_machine_addr, msg, LOOK_UP, response);
-
- /* the switch is for later options, such as multiple
- invitations */
-
- switch (response->answer) {
+ current_state = "Checking for invitation on caller's machine";
+ ctl_transact(his_machine_addr, msg, LOOK_UP, rp);
+ /* the switch is for later options, such as multiple invitations */
+ switch (rp->answer) {
case SUCCESS:
+ msg.id_num = htonl(rp->id_num);
+ return (1);
- msg.id_num = response->id_num;
- return(1);
-
- default :
+ default:
/* there wasn't an invitation waiting for us */
- return(0);
- }
+ return (0);
+ }
}