1. Fix "ambiguous" versus "unknown" commands; 2. Don't tell
[unix-history] / usr / src / usr.bin / talk / look_up.c
index 17e9f14..88e299b 100644 (file)
@@ -1,30 +1,52 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not 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 MERCHANTIBILITY 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.4 (Berkeley) %G%";
+#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 */
+       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";
                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 +54,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 +66,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);
        }