fix gecos field ordering to be backward compatible
[unix-history] / usr / src / usr.bin / talk / ctl_transact.c
index cda3433..59b6b75 100644 (file)
@@ -1,97 +1,91 @@
+/*
+ * 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
+static char sccsid[] = "@(#)ctl_transact.c     5.4 (Berkeley) %G%";
+#endif /* not lint */
+
 #include "talk_ctl.h"
 #include <sys/time.h>
 
 #include "talk_ctl.h"
 #include <sys/time.h>
 
-#define CTL_WAIT 2     /* the amount of time to wait for a 
-                          response, in seconds */
-
-
-    /*
-     * SOCKDGRAM is unreliable, so we must repeat messages if we have
-     * not recieved an acknowledgement within a reasonable amount
-     * of time
-     */
-
-ctl_transact(target, msg, type, response)
-struct in_addr target;
-CTL_MSG msg;
-int type;
-CTL_RESPONSE *response;
+#define CTL_WAIT 2     /* time to wait for a response, in seconds */
+
+/*
+ * SOCKDGRAM is unreliable, so we must repeat messages if we have
+ * not recieved an acknowledgement within a reasonable amount
+ * of time
+ */
+ctl_transact(target, msg, type, rp)
+       struct in_addr target;
+       CTL_MSG msg;
+       int type;
+       CTL_RESPONSE *rp;
 {
 {
-    struct sockaddr junk;
-    int read_mask;
-    int ctl_mask;
-    int nready;
-    int cc;
-    int junk_size;
-    struct timeval wait;
-
-    wait.tv_sec = CTL_WAIT;
-    wait.tv_usec = 0;
+       int read_mask, ctl_mask, nready, cc;
+       struct timeval wait;
 
 
-    msg.type = type;
-
-    daemon_addr.sin_addr = target;
-    daemon_addr.sin_port = daemon_port;
-
-    ctl_mask = 1 << ctl_sockt;
+       msg.type = type;
+       daemon_addr.sin_addr = target;
+       daemon_addr.sin_port = daemon_port;
+       ctl_mask = 1 << ctl_sockt;
 
        /*
 
        /*
-        * keep sending the message until a response of the right
-        * type is obtained
+        * Keep sending the message until a response of
+        * the proper type is obtained.
         */
         */
-    do {
-           /* keep sending the message until a response is obtained */
-
-       do {
-           cc = sendto(ctl_sockt, (char *)&msg, sizeof(CTL_MSG), 0,
-                       &daemon_addr, sizeof(daemon_addr));
-
-           if (cc != sizeof(CTL_MSG)) {
-               if (errno == EINTR) {
-                       /* we are returning from an interupt */
-                   continue;
-               } else {
-                   p_error("Error on write to talk daemon");
-               }
-           }
-
-           read_mask = ctl_mask;
-
-           while ((nready = select(32, &read_mask, 0, 0, &wait)) < 0) {
-               if (errno == EINTR) {
-                       /* we are returning from an interupt */
-                   continue;
-               } else {
-                   p_error("Error on waiting for response from daemon");
-               }
-           }
-       } while (nready == 0);
-
-           /* keep reading while there are queued messages 
-              (this is not necessary, it just saves extra
-              request/acknowledgements being sent)
-            */
-
        do {
        do {
-
-           junk_size = sizeof(junk);
-           cc = recvfrom(ctl_sockt, (char *) response,
-                          sizeof(CTL_RESPONSE), 0, &junk, &junk_size );
-           if (cc < 0) {
-               if (errno == EINTR) {
-                   continue;
-               }
-               p_error("Error on read from talk daemon");
-           }
-
-           read_mask = ctl_mask;
-
-               /* an immediate poll */
-
-           timerclear(&wait);
-           nready = select(32, &read_mask, 0, 0, &wait);
-
-       } while ( nready > 0 && response->type != type);
-
-    } while (response->type != type);
+               wait.tv_sec = CTL_WAIT;
+               wait.tv_usec = 0;
+               /* resend message until a response is obtained */
+               do {
+                       cc = sendto(ctl_sockt, (char *)&msg, sizeof (msg), 0,
+                               &daemon_addr, sizeof (daemon_addr));
+                       if (cc != sizeof (msg)) {
+                               if (errno == EINTR)
+                                       continue;
+                               p_error("Error on write to talk daemon");
+                       }
+                       read_mask = ctl_mask;
+                       nready = select(32, &read_mask, 0, 0, &wait);
+                       if (nready < 0) {
+                               if (errno == EINTR)
+                                       continue;
+                               p_error("Error waiting for daemon response");
+                       }
+               } while (nready == 0);
+               /*
+                * Keep reading while there are queued messages 
+                * (this is not necessary, it just saves extra
+                * request/acknowledgements being sent)
+                */
+               do {
+                       cc = recv(ctl_sockt, (char *)rp, sizeof (*rp), 0);
+                       if (cc < 0) {
+                               if (errno == EINTR)
+                                       continue;
+                               p_error("Error on read from talk daemon");
+                       }
+                       read_mask = ctl_mask;
+                       /* an immediate poll */
+                       timerclear(&wait);
+                       nready = select(32, &read_mask, 0, 0, &wait);
+               } while (nready > 0 && (rp->vers != TALK_VERSION ||
+                   rp->type != type));
+       } while (rp->vers != TALK_VERSION || rp->type != type);
+       rp->id_num = ntohl(rp->id_num);
+       rp->addr.sa_family = ntohs(rp->addr.sa_family);
 }
 }