new version from sam@monet.berkeley.edu
[unix-history] / usr / src / usr.bin / talk / look_up.c
index 878544d..0a97bda 100644 (file)
@@ -5,35 +5,37 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)look_up.c  5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)look_up.c  5.2 (Berkeley) %G%";
 #endif not lint
 
 #include "talk_ctl.h"
 
 #endif not lint
 
 #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;
+       msg.ctl_addr = *(struct sockaddr *)&ctl_addr;
+       msg.ctl_addr.sa_family = htons(msg.ctl_addr.sa_family);
        /* must be initiating a talk */
        /* must be initiating a talk */
-       if (!look_for_invite(&response))
+       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:
-       swapresponse(&response);
-       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
@@ -41,7 +43,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);
@@ -53,89 +55,22 @@ 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);
        }
 }
-
-/*  
- * heuristic to detect if need to reshuffle CTL_RESPONSE structure
- */
-
-#define swapshort(a) (((a << 8) | ((unsigned short) a >> 8)) & 0xffff)
-#define swaplong(a) ((swapshort(a) << 16) | (swapshort(((unsigned)a >> 16))))
-
-#ifdef sun
-struct ctl_response_vax {
-       char type;
-       char answer;
-       short junk;
-       int id_num;
-       struct sockaddr_in addr;
-};
-
-swapresponse(rsp)
-       CTL_RESPONSE *rsp;
-{
-       struct ctl_response_vax swaprsp;
-       
-       if (rsp->addr.sin_family != AF_INET) {
-               bcopy(rsp, &swaprsp, sizeof(CTL_RESPONSE));
-               swaprsp.addr.sin_family = swapshort(swaprsp.addr.sin_family);
-               if (swaprsp.addr.sin_family == AF_INET) {
-                       rsp->addr = swaprsp.addr;
-                       rsp->type = swaprsp.type;
-                       rsp->answer = swaprsp.answer;
-                       rsp->id_num = swaplong(swaprsp.id_num);
-               }
-       }
-}
-#endif
-
-#ifdef vax
-struct ctl_response_sun {
-       char type;
-       char answer;
-       unsigned short id_num2;
-       unsigned short id_num1;
-       short sin_family;
-       short sin_port;
-       short sin_addr2;
-       short sin_addr1;
-};
-
-swapresponse(rsp)
-       CTL_RESPONSE *rsp;
-{
-       struct ctl_response_sun swaprsp;
-       
-       if (rsp->addr.sin_family != AF_INET) {
-               bcopy(rsp, &swaprsp, sizeof(struct ctl_response_sun));
-               if (swaprsp.sin_family == swapshort(AF_INET)) {
-                       rsp->type = swaprsp.type;
-                       rsp->answer = swaprsp.answer;
-                       rsp->id_num = swapshort(swaprsp.id_num1)
-                           | (swapshort(swaprsp.id_num2) << 16);
-                       rsp->addr.sin_family = swapshort(swaprsp.sin_family);
-                       rsp->addr.sin_port = swaprsp.sin_port;
-                       rsp->addr.sin_addr.s_addr =
-                           swaprsp.sin_addr2 | (swaprsp.sin_addr1 << 16);
-               }
-       }
-}
-#endif