BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / talk / look_up.c
index 4c0b43f..90ae814 100644 (file)
@@ -1,33 +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.3 (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;
+#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 */
        /* 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
@@ -35,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);
@@ -47,89 +73,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