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
* 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%
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);
- * 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
* 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%
{
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)
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:
* 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%
{
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)
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;
}
sbrelease(&so->so_snd);
sorflush(so);
}
sbrelease(&so->so_snd);
sorflush(so);
- (void) m_free(dtom(so));
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)
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);
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;
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;
}
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);
- 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);
* 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%
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()
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);
}
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);
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;
(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);
}
if (namelenp)
(void) copyout((caddr_t)&len, namelenp, sizeof (int));
}
if (namelenp)
(void) copyout((caddr_t)&len, namelenp, sizeof (int));
}
(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));
}
(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);
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)
(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;
+ sa->sa_len = namelen;
+ }
* 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*/
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);