checkpoint for version to be handed to NIST, simple tp4 connection
authorKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Sun, 23 Apr 1989 03:26:53 +0000 (19:26 -0800)
committerKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Sun, 23 Apr 1989 03:26:53 +0000 (19:26 -0800)
SCCS-vsn: sys/kern/kern_malloc.c 7.11
SCCS-vsn: sys/kern/uipc_usrreq.c 7.9
SCCS-vsn: sys/kern/sys_socket.c 7.4
SCCS-vsn: sys/kern/uipc_syscalls.c 7.8
SCCS-vsn: sys/kern/uipc_socket.c 7.13

usr/src/sys/kern/kern_malloc.c
usr/src/sys/kern/sys_socket.c
usr/src/sys/kern/uipc_socket.c
usr/src/sys/kern/uipc_syscalls.c
usr/src/sys/kern/uipc_usrreq.c

index 3319330..395f2b1 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)kern_malloc.c       7.10 (Berkeley) %G%
+ *     @(#)kern_malloc.c       7.11 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -48,6 +48,10 @@ malloc(size, type, flags)
        caddr_t va, cp;
 #ifdef KMEMSTATS
        register struct kmemstats *ksp = &kmemstats[type];
        caddr_t va, cp;
 #ifdef KMEMSTATS
        register struct kmemstats *ksp = &kmemstats[type];
+#if defined(ISO) || defined(TPIP)
+       if (((unsigned int)type) > M_LAST)
+               panic("malloc - bogus type");
+#endif
 #endif
 
        indx = BUCKETINDX(size);
 #endif
 
        indx = BUCKETINDX(size);
index 6ea839b..3e69d8d 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1982, 1986 Regents of the University of California.
+ * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)sys_socket.c        7.3 (Berkeley) %G%
+ *     @(#)sys_socket.c        7.4 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -44,9 +44,8 @@ soo_rw(fp, rw, uio)
 {
        int soreceive(), sosend();
 
 {
        int soreceive(), sosend();
 
-       return (
-           (*(rw==UIO_READ?soreceive:sosend))
-             ((struct socket *)fp->f_data, 0, uio, 0, 0));
+       return ((*(rw == UIO_READ ? soreceive : sosend))
+             ((struct socket *)fp->f_data, 0, uio, 0, 0, 0));
 }
 
 soo_ioctl(fp, cmd, data)
 }
 
 soo_ioctl(fp, cmd, data)
@@ -77,11 +76,11 @@ soo_ioctl(fp, cmd, data)
                return (0);
 
        case SIOCSPGRP:
                return (0);
 
        case SIOCSPGRP:
-               so->so_pgrp = *(int *)data;
+               so->so_pgid = *(int *)data;
                return (0);
 
        case SIOCGPGRP:
                return (0);
 
        case SIOCGPGRP:
-               *(int *)data = so->so_pgrp;
+               *(int *)data = so->so_pgid;
                return (0);
 
        case SIOCATMARK:
                return (0);
 
        case SIOCATMARK:
index 0ad4bc8..0f14428 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)uipc_socket.c       7.12 (Berkeley) %G%
+ *     @(#)uipc_socket.c       7.13 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -49,7 +49,6 @@ socreate(dom, aso, type, proto)
 {
        register struct protosw *prp;
        register struct socket *so;
 {
        register struct protosw *prp;
        register struct socket *so;
-       register struct mbuf *m;
        register int error;
 
        if (proto)
        register int error;
 
        if (proto)
@@ -60,10 +59,8 @@ socreate(dom, aso, type, proto)
                return (EPROTONOSUPPORT);
        if (prp->pr_type != type)
                return (EPROTOTYPE);
                return (EPROTONOSUPPORT);
        if (prp->pr_type != type)
                return (EPROTOTYPE);
-       m = m_getclr(M_WAIT, MT_SOCKET);
-       so = mtod(m, struct socket *);
-       so->so_options = 0;
-       so->so_state = 0;
+       MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT);
+       bzero((caddr_t)so, sizeof(*so));
        so->so_type = type;
        if (u.u_uid == 0)
                so->so_state = SS_PRIV;
        so->so_type = type;
        if (u.u_uid == 0)
                so->so_state = SS_PRIV;
@@ -132,7 +129,7 @@ sofree(so)
        }
        sbrelease(&so->so_snd);
        sorflush(so);
        }
        sbrelease(&so->so_snd);
        sorflush(so);
-       (void) m_free(dtom(so));
+       FREE(so, M_SOCKET);
 }
 
 /*
 }
 
 /*
@@ -312,16 +309,19 @@ restart:
                s = splnet();
                if (so->so_state & SS_CANTSENDMORE)
                        snderr(EPIPE);
                s = splnet();
                if (so->so_state & SS_CANTSENDMORE)
                        snderr(EPIPE);
-               if (so->so_error) {
-                       error = so->so_error;
-                       so->so_error = 0;                       /* ??? */
-                       splx(s);
-                       goto release;
-               }
+               if (so->so_error)
+                       snderr(so->so_error);
                if ((so->so_state & SS_ISCONNECTED) == 0) {
                if ((so->so_state & SS_ISCONNECTED) == 0) {
-                       if (so->so_proto->pr_flags & PR_CONNREQUIRED)
-                               snderr(ENOTCONN);
-                       if (nam == 0)
+                       if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
+                               if (!uio->uio_resid && !rights && control) {
+                                       snderr((*so->so_proto->pr_usrreq)(so,
+                                   (flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND,
+                                           top, (caddr_t)0, rights, control));
+                               } else if (so->so_state & SS_ISCONFIRMING)
+                                       /* is ok */;
+                               else
+                                       snderr(ENOTCONN);
+                       } else if (nam == 0)
                                snderr(EDESTADDRREQ);
                }
                if (flags & MSG_OOB)
                                snderr(EDESTADDRREQ);
                }
                if (flags & MSG_OOB)
@@ -479,7 +479,7 @@ bad:
                        m_freem(m);
                return (error);
        }
                        m_freem(m);
                return (error);
        }
-       if (so->so_state & SS_ISCONFIRMING)
+       if (so->so_state & SS_ISCONFIRMING && uio->uio_resid)
                (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
                    (struct mbuf *)0, (struct mbuf *)0);
 
                (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
                    (struct mbuf *)0, (struct mbuf *)0);
 
@@ -487,7 +487,10 @@ restart:
        sblock(&so->so_rcv);
        s = splnet();
 
        sblock(&so->so_rcv);
        s = splnet();
 
-       if (so->so_rcv.sb_cc == 0) {
+       m = so->so_rcv.sb_mb;
+       if (m == 0) {
+               if (so->so_rcv.sb_cc)
+                       panic("receive 1");
                if (so->so_error) {
                        error = so->so_error;
                        so->so_error = 0;
                if (so->so_error) {
                        error = so->so_error;
                        so->so_error = 0;
@@ -512,9 +515,6 @@ restart:
                goto restart;
        }
        u.u_ru.ru_msgrcv++;
                goto restart;
        }
        u.u_ru.ru_msgrcv++;
-       m = so->so_rcv.sb_mb;
-       if (m == 0)
-               panic("receive 1");
 if (m->m_type == 0)
 panic("receive 3a");
        nextrecord = m->m_nextpkt;
 if (m->m_type == 0)
 panic("receive 3a");
        nextrecord = m->m_nextpkt;
@@ -643,7 +643,8 @@ panic("receive 3a");
                }
                if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
                        (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
                }
                if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
                        (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
-                           (struct mbuf *)0, (struct mbuf *)0);
+                           (struct mbuf *)flags, (struct mbuf *)0,
+                           (struct mbuf *)0);
                if (error == 0 && rightsp && *rightsp &&
                    pr->pr_domain->dom_externalize)
                        error = (*pr->pr_domain->dom_externalize)(*rightsp);
                if (error == 0 && rightsp && *rightsp &&
                    pr->pr_domain->dom_externalize)
                        error = (*pr->pr_domain->dom_externalize)(*rightsp);
@@ -863,9 +864,9 @@ sohasoutofband(so)
 {
        struct proc *p;
 
 {
        struct proc *p;
 
-       if (so->so_pgrp < 0)
-               gsignal(-so->so_pgrp, SIGURG);
-       else if (so->so_pgrp > 0 && (p = pfind(so->so_pgrp)) != 0)
+       if (so->so_pgid < 0)
+               gsignal(-so->so_pgid, SIGURG);
+       else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0)
                psignal(p, SIGURG);
        if (so->so_rcv.sb_sel) {
                selwakeup(so->so_rcv.sb_sel, so->so_rcv.sb_flags & SB_COLL);
                psignal(p, SIGURG);
        if (so->so_rcv.sb_sel) {
                selwakeup(so->so_rcv.sb_sel, so->so_rcv.sb_flags & SB_COLL);
index d37720d..c652eb9 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)uipc_syscalls.c     7.7 (Berkeley) %G%
+ *     @(#)uipc_syscalls.c     7.8 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -538,8 +538,7 @@ recvfrom()
        msg.msg_accrights = 0;
        msg.msg_control = 0;
        msg.msg_flags = uap->flags;
        msg.msg_accrights = 0;
        msg.msg_control = 0;
        msg.msg_flags = uap->flags;
-       recvit(uap->s, &msg, (caddr_t)uap->fromlenaddr,
-                               (caddr_t)0, (caddr_t)0, compat_43);
+       recvit(uap->s, &msg, (caddr_t)uap->fromlenaddr, (caddr_t)0, compat_43);
 }
 #ifdef COMPAT_43
 orecv()
 }
 #ifdef COMPAT_43
 orecv()
@@ -562,7 +561,7 @@ orecv()
        msg.msg_accrights = 0;
        msg.msg_control = 0;
        msg.msg_flags = uap->flags;
        msg.msg_accrights = 0;
        msg.msg_control = 0;
        msg.msg_flags = uap->flags;
-       recvit(uap->s, &msg, (caddr_t)0, (caddr_t)0, (caddr_t)0, 0);
+       recvit(uap->s, &msg, (caddr_t)0, (caddr_t)0, 0);
 }
 
 orecvmsg()
 }
 
 orecvmsg()
@@ -598,7 +597,7 @@ orecvmsg()
                }
            
        recvit(uap->s, &msg, (caddr_t)&uap->msg->msg_namelen,
                }
            
        recvit(uap->s, &msg, (caddr_t)&uap->msg->msg_namelen,
-           (caddr_t)&uap->msg->msg_accrightslen, (caddr_t)0, /* compat_43 */1);
+           (caddr_t)&uap->msg->msg_accrightslen, /* compat_43 */1);
 }
 #endif
 
 }
 #endif
 
@@ -638,15 +637,15 @@ recvmsg()
                        u.u_error = EFAULT;
                        return;
                }
                        u.u_error = EFAULT;
                        return;
                }
-       recvit(uap->s, &msg, (caddr_t)0, (caddr_t)0, (caddr_t)0, 0);
+       recvit(uap->s, &msg, (caddr_t)0, (caddr_t)0, 0);
        msg.msg_iov = uiov;
        u.u_error = copyout((caddr_t)&msg, (caddr_t)uap->msg, sizeof(msg));
 }
 
        msg.msg_iov = uiov;
        u.u_error = copyout((caddr_t)&msg, (caddr_t)uap->msg, sizeof(msg));
 }
 
-recvit(s, mp, namelenp, rightslenp, controllenp, compat_43)
+recvit(s, mp, namelenp, rightslenp, compat_43)
        int s, compat_43;
        register struct msghdr *mp;
        int s, compat_43;
        register struct msghdr *mp;
-       caddr_t namelenp, rightslenp, controllenp;
+       caddr_t namelenp, rightslenp;
 {
        register struct file *fp;
        struct uio auio;
 {
        register struct file *fp;
        struct uio auio;
@@ -704,6 +703,7 @@ recvit(s, mp, namelenp, rightslenp, controllenp, compat_43)
                        (void) copyout(mtod(from, caddr_t),
                            (caddr_t)mp->msg_name, (unsigned)len);
                }
                        (void) copyout(mtod(from, caddr_t),
                            (caddr_t)mp->msg_name, (unsigned)len);
                }
+               mp->msg_namelen = len;
                if (namelenp)
                        (void) copyout((caddr_t)&len, namelenp, sizeof (int));
        }
                if (namelenp)
                        (void) copyout((caddr_t)&len, namelenp, sizeof (int));
        }
@@ -717,6 +717,7 @@ recvit(s, mp, namelenp, rightslenp, controllenp, compat_43)
                        (void) copyout((caddr_t)mtod(rights, caddr_t),
                            (caddr_t)mp->msg_accrights, (unsigned)len);
                }
                        (void) copyout((caddr_t)mtod(rights, caddr_t),
                            (caddr_t)mp->msg_accrights, (unsigned)len);
                }
+               mp->msg_accrightslen = len;
                if (rightslenp)
                        (void) copyout((caddr_t)&len, rightslenp, sizeof (int));
        }
                if (rightslenp)
                        (void) copyout((caddr_t)&len, rightslenp, sizeof (int));
        }
@@ -732,8 +733,7 @@ recvit(s, mp, namelenp, rightslenp, controllenp, compat_43)
                        (void) copyout((caddr_t)mtod(control, caddr_t),
                            (caddr_t)mp->msg_control, (unsigned)len);
                }
                        (void) copyout((caddr_t)mtod(control, caddr_t),
                            (caddr_t)mp->msg_control, (unsigned)len);
                }
-               if (controllenp)
-                       (void) copyout((caddr_t)&len, controllenp, sizeof(int));
+               mp->msg_controllen = len;
        }
        if (rights)
                m_freem(rights);
        }
        if (rights)
                m_freem(rights);
@@ -1009,7 +1009,6 @@ sockargs(aname, name, namelen, type)
        int namelen, type;
 {
        register struct mbuf *m;
        int namelen, type;
 {
        register struct mbuf *m;
-       register struct sockaddr *sa;
        int error;
 
        if ((u_int)namelen > MLEN)
        int error;
 
        if ((u_int)namelen > MLEN)
@@ -1023,12 +1022,14 @@ sockargs(aname, name, namelen, type)
                (void) m_free(m);
        else
                *aname = m;
                (void) m_free(m);
        else
                *aname = m;
-       sa = mtod(m, struct sockaddr *);
+       if (type == MT_SONAME) {
+               register struct sockaddr *sa = mtod(m, struct sockaddr *);
 #if defined(COMPAT_43) && BYTE_ORDER != BIG_ENDIAN
 #if defined(COMPAT_43) && BYTE_ORDER != BIG_ENDIAN
-       if (type == MT_SONAME && sa->sa_family == 0 && sa->sa_len < AF_MAX)
-               sa->sa_family = sa->sa_len;
+               if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
+                       sa->sa_family = sa->sa_len;
 #endif
 #endif
-       sa->sa_len = namelen;
+               sa->sa_len = namelen;
+       }
        return (error);
 }
 
        return (error);
 }
 
index 7529a4e..013c9ee 100644 (file)
@@ -39,7 +39,7 @@
  *     rethink name space problems
  *     need a proper out-of-band
  */
  *     rethink name space problems
  *     need a proper out-of-band
  */
-struct sockaddr sun_noname = { AF_UNIX };
+struct sockaddr sun_noname = { sizeof(sun_noname), AF_UNIX };
 ino_t  unp_ino;                        /* prototype for fake inode numbers */
 
 /*ARGSUSED*/
 ino_t  unp_ino;                        /* prototype for fake inode numbers */
 
 /*ARGSUSED*/
@@ -439,7 +439,8 @@ unp_connect(so, nam)
                unp2 = sotounpcb(so2);
                unp3 = sotounpcb(so3);
                if (unp2->unp_addr)
                unp2 = sotounpcb(so2);
                unp3 = sotounpcb(so3);
                if (unp2->unp_addr)
-                       unp3->unp_addr = m_copy(unp2->unp_addr, 0, M_COPYALL);
+                       unp3->unp_addr =
+                                 m_copy(unp2->unp_addr, 0, (int)M_COPYALL);
                so2 = so3;
        }
        error = unp_connect2(so, so2);
                so2 = so3;
        }
        error = unp_connect2(so, so2);