Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/uipc_socket.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.103 retrieving revision 1.108 diff -u -p -r1.103 -r1.108 --- src/sys/kern/uipc_socket.c 2004/05/25 04:30:32 1.103 +++ src/sys/kern/uipc_socket.c 2005/02/26 21:34:55 1.108 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.103 2004/05/25 04:30:32 atatat Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.108 2005/02/26 21:34:55 perry Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.103 2004/05/25 04:30:32 atatat Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.108 2005/02/26 21:34:55 perry Exp $"); #include "opt_sock_counters.h" #include "opt_sosend_loan.h" @@ -873,7 +873,7 @@ sosend(struct socket *so, struct mbuf *a break; } } while (space > 0 && atomic); - + s = splsoftnet(); if (so->so_state & SS_CANTSENDMORE) @@ -1050,10 +1050,8 @@ soreceive(struct socket *so, struct mbuf * While we process the initial mbufs containing address and control * info, we save a copy of m->m_nextpkt into nextrecord. */ -#ifdef notyet /* XXXX */ if (p) p->p_stats->p_ru.ru_msgrcv++; -#endif KASSERT(m == so->so_rcv.sb_mb); SBLASTRECORDCHK(&so->so_rcv, "soreceive 1"); SBLASTMBUFCHK(&so->so_rcv, "soreceive 1"); @@ -1101,6 +1099,13 @@ soreceive(struct socket *so, struct mbuf m->m_next = 0; m = so->so_rcv.sb_mb; } else { + /* + * Dispose of any SCM_RIGHTS message that went + * through the read path rather than recv. + */ + if (pr->pr_domain->dom_dispose && + mtod(m, struct cmsghdr *)->cmsg_type == SCM_RIGHTS) + (*pr->pr_domain->dom_dispose)(m); MFREE(m, so->so_rcv.sb_mb); m = so->so_rcv.sb_mb; } @@ -1326,7 +1331,7 @@ soreceive(struct socket *so, struct mbuf splx(s); goto restart; } - + if (flagsp) *flagsp |= flags; release: @@ -1478,14 +1483,14 @@ sosetopt(struct socket *so, int level, i case SO_RCVTIMEO: { struct timeval *tv; - short val; + int val; if (m == NULL || m->m_len < sizeof(*tv)) { error = EINVAL; goto bad; } tv = mtod(m, struct timeval *); - if (tv->tv_sec > (SHRT_MAX - tv->tv_usec / tick) / hz) { + if (tv->tv_sec > (INT_MAX - tv->tv_usec / tick) / hz) { error = EDOM; goto bad; } @@ -1595,6 +1600,10 @@ sogetopt(struct socket *so, int level, i break; } + case SO_OVERFLOWED: + *mtod(m, int *) = so->so_rcv.sb_overflowed; + break; + default: (void)m_free(m); return (ENOPROTOOPT); @@ -1631,7 +1640,7 @@ filt_soread(struct knote *kn, long hint) so = (struct socket *)kn->kn_fp->f_data; kn->kn_data = so->so_rcv.sb_cc; if (so->so_state & SS_CANTRCVMORE) { - kn->kn_flags |= EV_EOF; + kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; return (1); } @@ -1662,7 +1671,7 @@ filt_sowrite(struct knote *kn, long hint so = (struct socket *)kn->kn_fp->f_data; kn->kn_data = sbspace(&so->so_snd); if (so->so_state & SS_CANTSENDMORE) { - kn->kn_flags |= EV_EOF; + kn->kn_flags |= EV_EOF; kn->kn_fflags = so->so_error; return (1); } @@ -1687,7 +1696,7 @@ filt_solisten(struct knote *kn, long hin /* * Set kn_data to number of incoming connections, not * counting partial (incomplete) connections. - */ + */ kn->kn_data = so->so_qlen; return (kn->kn_data > 0); }