rx: For AFS_RXERRQ_ENV, retry sendmsg on error
[openafs.git] / src / rx / rx_user.c
index be74a64..7e6c06b 100644 (file)
@@ -132,6 +132,7 @@ rxi_GetHostUDPSocket(u_int ahost, u_short port)
     taddr.sin_addr.s_addr = ahost;
     taddr.sin_family = AF_INET;
     taddr.sin_port = (u_short) port;
+    memset(&taddr.sin_zero, 0, sizeof(taddr.sin_zero));
 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
     taddr.sin_len = sizeof(struct sockaddr_in);
 #endif
@@ -351,7 +352,6 @@ rx_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[],
 #endif
 
 #ifdef AFS_NT40_ENV
-extern int rxinit_status;
 void
 rxi_InitMorePackets(void) {
     int npackets, ncbufs;
@@ -372,7 +372,7 @@ rx_GetIFInfo(void)
 
     LOCK_IF_INIT;
     if (Inited) {
-        if (Inited < 2 && rxinit_status == 0) {
+       if (Inited < 2 && rxi_IsRunning()) {
             /* We couldn't initialize more packets earlier.
              * Do it now. */
             rxi_InitMorePackets();
@@ -406,11 +406,11 @@ rx_GetIFInfo(void)
     UNLOCK_IF;
 
     /*
-     * If rxinit_status is still set, rx_InitHost() has yet to be called
+     * If rxi_IsRunning is false, rx_InitHost() has yet to be called
      * and we therefore do not have any mutex locks initialized.  As a
      * result we cannot call rxi_MorePackets() without crashing.
      */
-    if (rxinit_status)
+    if (!rxi_IsRunning())
         return;
 
     rxi_InitMorePackets();
@@ -436,7 +436,7 @@ fudge_netmask(afs_uint32 addr)
 
 
 
-#if !defined(AFS_AIX_ENV) && !defined(AFS_NT40_ENV) && !defined(AFS_LINUX20_ENV)
+#if !defined(AFS_AIX_ENV) && !defined(AFS_NT40_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN160_ENV)
 int
 rxi_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
 {
@@ -447,8 +447,10 @@ rxi_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
 
 #if defined(AFS_SGI_ENV)
     rcode = afs_syscall(AFS_SYSCALL, 28, a3, a4, a5);
-#else
+#elif defined(AFS_SYSCALL)
     rcode = syscall(AFS_SYSCALL, 28 /* AFSCALL_CALL */ , a3, a4, a5);
+#else
+    rcode = -1;
 #endif /* AFS_SGI_ENV */
 
     signal(SIGSYS, old);
@@ -563,7 +565,7 @@ rx_GetIFInfo(void)
        }
 #endif /* SIOCGIFFLAGS */
 
-#if !defined(AFS_AIX_ENV)  && !defined(AFS_LINUX20_ENV)
+#if !defined(AFS_AIX_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN160_ENV)
        /* this won't run on an AIX system w/o a cache manager */
        rxi_syscallp = rxi_syscall;
 #endif
@@ -724,6 +726,7 @@ rxi_InitPeerParams(struct rx_peer *pp)
         addr.sin_family = AF_INET;
         addr.sin_addr.s_addr = pp->host;
         addr.sin_port = pp->port;
+        memset(&addr.sin_zero, 0, sizeof(addr.sin_zero));
         if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0) {
             int mtu=0;
             socklen_t s = sizeof(mtu);
@@ -778,46 +781,33 @@ rx_SetMaxMTU(int mtu)
 
 #ifdef AFS_RXERRQ_ENV
 int
-rxi_HandleSocketError(int socket)
+osi_HandleSocketError(int socket, void *cmsgbuf, size_t cmsgbuf_len)
 {
-    int ret = 0;
     struct msghdr msg;
     struct cmsghdr *cmsg;
     struct sock_extended_err *err;
     struct sockaddr_in addr;
-    char controlmsgbuf[256];
     int code;
 
     msg.msg_name = &addr;
     msg.msg_namelen = sizeof(addr);
     msg.msg_iov = NULL;
     msg.msg_iovlen = 0;
-    msg.msg_control = controlmsgbuf;
-    msg.msg_controllen = 256;
+    msg.msg_control = cmsgbuf;
+    msg.msg_controllen = cmsgbuf_len;
     msg.msg_flags = 0;
     code = recvmsg(socket, &msg, MSG_ERRQUEUE|MSG_DONTWAIT|MSG_TRUNC);
 
     if (code < 0 || !(msg.msg_flags & MSG_ERRQUEUE))
-        goto out;
+        return 0;
 
     for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-       if ((char *)cmsg - controlmsgbuf > msg.msg_controllen - CMSG_SPACE(0) ||
-           (char *)cmsg - controlmsgbuf > msg.msg_controllen - CMSG_SPACE(cmsg->cmsg_len) ||
-          cmsg->cmsg_len == 0) {
-          cmsg = 0;
-           break;
+       if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR) {
+           err = (struct sock_extended_err *)CMSG_DATA(cmsg);
+           rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
        }
-        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
-            break;
     }
-    if (!cmsg)
-        goto out;
-    ret = 1;
-    err = (struct sock_extended_err *) CMSG_DATA(cmsg);
-
-    rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
 
-out:
-    return ret;
+    return 1;
 }
 #endif