macos-rollup-20051013
[openafs.git] / src / rx / DARWIN / rx_knet.c
index a45381e..4422f81 100644 (file)
@@ -15,16 +15,29 @@ RCSID
 
 #include "rx/rx_kcommon.h"
 
+#ifdef AFS_DARWIN80_ENV
+#define soclose sock_close
+#endif
 int
 osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec,
               int nvecs, int *alength)
 {
+#ifdef AFS_DARWIN80_ENV
+    socket_t asocket = (socket_t)so;
+    struct msghdr msg;
+    struct sockaddr_storage ss;
+    int rlen;
+    mbuf_t m;
+#else
     struct socket *asocket = (struct socket *)so;
     struct uio u;
+#endif
     int i;
     struct iovec iov[RX_MAXIOVECS];
     struct sockaddr *sa = NULL;
     int code;
+    size_t resid;
 
     int haveGlock = ISAFS_GLOCK();
     /*AFS_STATCNT(osi_NetReceive); */
@@ -34,6 +47,59 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec,
 
     for (i = 0; i < nvecs; i++)
        iov[i] = dvec[i];
+    if (haveGlock)
+       AFS_GUNLOCK();
+#if defined(KERNEL_FUNNEL)
+    thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
+#endif
+#ifdef AFS_DARWIN80_ENV
+#if 1
+    resid = *alength;
+    memset(&msg, 0, sizeof(struct msghdr));
+    msg.msg_name = &ss;
+    msg.msg_namelen = sizeof(struct sockaddr_storage);
+    sa =(struct sockaddr *) &ss;
+    code = sock_receivembuf(asocket, &msg, &m, 0, alength);
+    if (!code) {
+        size_t offset=0,sz;
+        resid = *alength;
+        for (i=0;i<nvecs && resid;i++) {
+            sz=MIN(resid, iov[i].iov_len);
+            code = mbuf_copydata(m, offset, sz, iov[i].iov_base);
+            if (code)
+                break;
+            resid-=sz;
+            offset+=sz;
+        }
+    }
+    mbuf_freem(m);
+#else
+    resid = *alength;
+    printf("Want to read %d bytes...", resid);
+    for (i=0; i < nvecs && resid; i++) {
+       if (resid < iov[i].iov_len)
+          iov[0].iov_len = resid;
+       resid -= iov[i].iov_len;
+    }
+    printf("Using %d/%d iovs\n", i, nvecs);
+    nvecs = i;
+    rlen = 0;
+    memset(&msg, 0, sizeof(struct msghdr));
+    msg.msg_name = &ss;
+    msg.msg_namelen = sizeof(struct sockaddr_storage);
+    msg.msg_iov = &iov[0];
+    msg.msg_iovlen = nvecs;
+    sa =(struct sockaddr_in *) &ss;
+    code = sock_receive(asocket, &msg, 0, &rlen);
+    resid = *alength;
+    if (resid != rlen)
+    printf("recieved %d bytes\n", rlen);
+    if (resid > rlen)
+       resid -= rlen;
+    else
+       resid = 0;
+#endif
+#else
 
     u.uio_iov = &iov[0];
     u.uio_iovcnt = nvecs;
@@ -42,14 +108,11 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec,
     u.uio_segflg = UIO_SYSSPACE;
     u.uio_rw = UIO_READ;
     u.uio_procp = NULL;
-
-    if (haveGlock)
-       AFS_GUNLOCK();
-#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
-    thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
-#endif
     code = soreceive(asocket, &sa, &u, NULL, NULL, NULL);
-#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
+    resid = u.uio_resid;
+#endif
+
+#if defined(KERNEL_FUNNEL)
     thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
 #endif
     if (haveGlock)
@@ -57,7 +120,7 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec,
 
     if (code)
        return code;
-    *alength -= u.uio_resid;
+    *alength -= resid;
     if (sa) {
        if (sa->sa_family == AF_INET) {
            if (addr)
@@ -75,26 +138,37 @@ osi_StopListener(void)
 {
     struct proc *p;
 
-#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
+#if defined(KERNEL_FUNNEL)
     thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
 #endif
     soclose(rx_socket);
-#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
+#if defined(KERNEL_FUNNEL)
     thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
 #endif
+#ifdef AFS_DARWIN80_ENV
+    proc_signal(rxk_ListenerPid, SIGUSR1);
+#else
     p = pfind(rxk_ListenerPid);
     if (p)
        psignal(p, SIGUSR1);
+#endif
 }
 
 int
-osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, struct iovec *dvec,
+osi_NetSend(osi_socket so, struct sockaddr_in *addr, struct iovec *dvec,
            int nvecs, afs_int32 alength, int istack)
 {
+#ifdef AFS_DARWIN80_ENV
+    socket_t asocket = (socket_t)so;
+    struct msghdr msg;
+    size_t slen;
+#else
+    struct socket *asocket = (struct socket *)so;
+    struct uio u;
+#endif
     register afs_int32 code;
     int i;
     struct iovec iov[RX_MAXIOVECS];
-    struct uio u;
     int haveGlock = ISAFS_GLOCK();
 
     AFS_STATCNT(osi_NetSend);
@@ -104,6 +178,21 @@ osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, struct iovec *dvec,
     for (i = 0; i < nvecs; i++)
        iov[i] = dvec[i];
 
+    addr->sin_len = sizeof(struct sockaddr_in);
+
+    if (haveGlock)
+       AFS_GUNLOCK();
+#if defined(KERNEL_FUNNEL)
+    thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
+#endif
+#ifdef AFS_DARWIN80_ENV
+    memset(&msg, 0, sizeof(struct msghdr));
+    msg.msg_name = addr;
+    msg.msg_namelen = ((struct sockaddr *)addr)->sa_len;
+    msg.msg_iov = &iov[0];
+    msg.msg_iovlen = nvecs;
+    code = sock_send(asocket, &msg, 0, &slen);
+#else
     u.uio_iov = &iov[0];
     u.uio_iovcnt = nvecs;
     u.uio_offset = 0;
@@ -111,16 +200,10 @@ osi_NetSend(osi_socket asocket, struct sockaddr_in *addr, struct iovec *dvec,
     u.uio_segflg = UIO_SYSSPACE;
     u.uio_rw = UIO_WRITE;
     u.uio_procp = NULL;
-
-    addr->sin_len = sizeof(struct sockaddr_in);
-
-    if (haveGlock)
-       AFS_GUNLOCK();
-#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
-    thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
-#endif
     code = sosend(asocket, (struct sockaddr *)addr, &u, NULL, NULL, 0);
-#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
+#endif
+
+#if defined(KERNEL_FUNNEL)
     thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
 #endif
     if (haveGlock)