X-Git-Url: https://git.openafs.org/?p=openafs.git;a=blobdiff_plain;f=src%2Frx%2FOBSD%2Frx_knet.c;h=a9dc37de7b80fd68d4a74d744e7bc5e3ed6d1f05;hp=65fef1e09915529375fb6e7a95880d5d808fef02;hb=6bb19413a9df73e08eeb2f20e433cbd3fdc95cf5;hpb=54495a713bfea995556f9e1d6de5555fda458034 diff --git a/src/rx/OBSD/rx_knet.c b/src/rx/OBSD/rx_knet.c index 65fef1e..a9dc37d 100644 --- a/src/rx/OBSD/rx_knet.c +++ b/src/rx/OBSD/rx_knet.c @@ -20,12 +20,12 @@ int osi_NetReceive(osi_socket asocket, struct sockaddr_in *addr, struct iovec *d struct uio u; int i, code; struct iovec iov[RX_MAXIOVECS]; - struct sockaddr *sa; + struct mbuf *nam = NULL; int haveGlock = ISAFS_GLOCK(); if (nvecs > RX_MAXIOVECS) - osi_Panic("osi_NetReceive: %d: Too many iovecs.\n", nvecs); + osi_Panic("osi_NetReceive: %d: too many iovecs\n", nvecs); for (i = 0 ; i < nvecs ; i++) { iov[i].iov_base = dvec[i].iov_base; @@ -42,13 +42,18 @@ int osi_NetReceive(osi_socket asocket, struct sockaddr_in *addr, struct iovec *d if (haveGlock) AFS_GUNLOCK(); - code = soreceive(asocket, (struct sockaddr_in *) &sa, &u, NULL, NULL, NULL); + code = soreceive(asocket, (addr ? &nam : NULL), &u, NULL, NULL, NULL); if (haveGlock) AFS_GLOCK(); - *alength = *alength - u.uio_resid; - if (sa != NULL && sa->sa_family == AF_INET && addr != NULL) - *addr = *(struct sockaddr_in *)sa; + if (code) + return code; + + *alength -= u.uio_resid; + if (addr && nam) { + memcpy(addr, mtod(nam, caddr_t), nam->m_len); + m_freem(nam); + } return code; } @@ -106,22 +111,19 @@ int osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, u.uio_segflg = UIO_SYSSPACE; u.uio_rw = UIO_WRITE; u.uio_procp = NULL; - if (haveGlock) - AFS_GUNLOCK(); nam = m_get(M_DONTWAIT, MT_SONAME); - if (nam == NULL) { - code = ENOBUFS; - goto bad; - } + if (!nam) + return ENOBUFS; nam->m_len = addr->sin_len = sizeof(struct sockaddr_in); - memcpy(mtod(nam, caddr_t), (caddr_t)addr, addr->sin_len); - code = sosend(asocket, mtod(nam, struct sockaddr_in *), &u, NULL, NULL, 0); - m_freem(nam); + memcpy(mtod(nam, caddr_t), addr, addr->sin_len); -bad: + if (haveGlock) + AFS_GUNLOCK(); + code = sosend(asocket, nam, &u, NULL, NULL, 0); if (haveGlock) AFS_GLOCK(); + m_freem(nam); return code; }