date and time created 84/04/11 15:02:59 by karels
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Thu, 12 Apr 1984 06:02:59 +0000 (22:02 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Thu, 12 Apr 1984 06:02:59 +0000 (22:02 -0800)
SCCS-vsn: usr.bin/talk/look_up.c 1.1

usr/src/usr.bin/talk/look_up.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/talk/look_up.c b/usr/src/usr.bin/talk/look_up.c
new file mode 100644 (file)
index 0000000..fe9087c
--- /dev/null
@@ -0,0 +1,78 @@
+/* $Header: look_up.c 1.2 83/03/28 00:34:22 moore Exp $ */
+
+#include "talk_ctl.h"
+
+    /* see if the local daemon has a invitation for us */
+
+check_local()
+{
+    CTL_RESPONSE 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, 
+        * so connect with the other (hopefully waiting) party 
+        */
+
+    current_state = "Waiting to connect with caller";
+
+    while (connect(sockt, &response.addr, sizeof(response.addr)) != 0) {
+       if (errno == ECONNREFUSED) {
+
+               /* 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");
+       }
+    }
+
+    return(1);
+}
+
+    /* look for an invitation on 'machine' */
+
+look_for_invite(response)
+CTL_RESPONSE *response;
+{
+    struct in_addr machine_addr;
+
+    current_state = "Checking for invitation on caller's machine";
+
+    ctl_transact(his_machine_addr, msg, LOOK_UP, response);
+
+       /* the switch is for later options, such as multiple 
+          invitations */
+
+    switch (response->answer) {
+
+       case SUCCESS:
+
+           msg.id_num = response->id_num;
+           return(1);
+
+       default :
+               /* there wasn't an invitation waiting for us */
+           return(0);
+    }
+}