BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / talk / look_up.c
index 17e9f14..90ae814 100644 (file)
@@ -1,30 +1,59 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)look_up.c  1.2 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)look_up.c  5.6 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 #include "talk_ctl.h"
 
 /*
 
 #include "talk_ctl.h"
 
 /*
- * See if the local daemon has a invitation for us
+ * See if the local daemon has an invitation for us.
  */
 check_local()
 {
        CTL_RESPONSE response;
  */
 check_local()
 {
        CTL_RESPONSE response;
+       register CTL_RESPONSE *rp = &response;
 
        /* the rest of msg was set up in get_names */
 
        /* the rest of msg was set up in get_names */
-       msg.ctl_addr = ctl_addr;
-       if (!look_for_invite(&response))        /* must be initiating a talk */
+#ifdef MSG_EOR
+       /* copy new style sockaddr to old, swap family (short in old) */
+       msg.ctl_addr = *(struct osockaddr *)&ctl_addr;
+       msg.ctl_addr.sa_family = htons(ctl_addr.sin_family);
+#else
+       msg.ctl_addr = *(struct sockaddr *)&ctl_addr;
+#endif
+       /* 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";
                return (0);
        /*
         * There was an invitation waiting for us, 
         * so connect with the other (hopefully waiting) party 
         */
        current_state = "Waiting to connect with caller";
-again:
-       if (connect(sockt, &response.addr, sizeof(response.addr)) != -1)
-               return (1);
-       if (errno == EINTR)
-               goto again;
+       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
        if (errno == ECONNREFUSED) {
                /*
                 * The caller gave up, but his invitation somehow
@@ -32,7 +61,7 @@ again:
                 * invitation. (We know there are no newer invitations,
                 * the talkd works LIFO.)
                 */
                 * invitation. (We know there are no newer invitations,
                 * the talkd works LIFO.)
                 */
-               ctl_transact(his_machine_addr, msg, DELETE, &response);
+               ctl_transact(his_machine_addr, msg, DELETE, rp);
                close(sockt);
                open_sockt();
                return (0);
                close(sockt);
                open_sockt();
                return (0);
@@ -44,21 +73,21 @@ again:
 /*
  * Look for an invitation on 'machine'
  */
 /*
  * Look for an invitation on 'machine'
  */
-look_for_invite(response)
-       CTL_RESPONSE *response;
+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;
 
        current_state = "Checking for invitation on caller's machine";
-       ctl_transact(his_machine_addr, msg, LOOK_UP, response);
+       ctl_transact(his_machine_addr, msg, LOOK_UP, rp);
        /* the switch is for later options, such as multiple invitations */
        /* the switch is for later options, such as multiple invitations */
-       switch (response->answer) {
+       switch (rp->answer) {
 
        case SUCCESS:
 
        case SUCCESS:
-               msg.id_num = response->id_num;
+               msg.id_num = htonl(rp->id_num);
                return (1);
 
                return (1);
 
-       default :
+       default:
                /* there wasn't an invitation waiting for us */
                return (0);
        }
                /* there wasn't an invitation waiting for us */
                return (0);
        }