From owner-svn-soc-all@FreeBSD.ORG Sat Aug 9 13:53:17 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 3B378D9D for ; Sat, 9 Aug 2014 13:53:17 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2763E2CF9 for ; Sat, 9 Aug 2014 13:53:17 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id s79DrHw6091855 for ; Sat, 9 Aug 2014 13:53:17 GMT (envelope-from shonali@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id s79DrGhX091665 for svn-soc-all@FreeBSD.org; Sat, 9 Aug 2014 13:53:16 GMT (envelope-from shonali@FreeBSD.org) Date: Sat, 9 Aug 2014 13:53:16 GMT Message-Id: <201408091353.s79DrGhX091665@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to shonali@FreeBSD.org using -f From: shonali@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r272123 - soc2014/shonali/head/contrib/bsnmp/snmpd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Aug 2014 13:53:17 -0000 Author: shonali Date: Sat Aug 9 13:53:15 2014 New Revision: 272123 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272123 Log: Moved the recv_stream function from main.c to trans_lsock.c Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/main.c soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/main.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/main.c Sat Aug 9 12:25:06 2014 (r272122) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/main.c Sat Aug 9 13:53:15 2014 (r272123) @@ -1056,54 +1056,6 @@ } /* - * Input from a stream socket. - */ -static int -recv_stream(struct port_input *pi) -{ - struct msghdr msg; - struct iovec iov[1]; - ssize_t len; - - if (pi->buf == NULL) { - /* no buffer yet - allocate one */ - if ((pi->buf = buf_alloc(0)) == NULL) { - /* ups - could not get buffer. Return an error - * the caller must close the transport. */ - return (-1); - } - pi->buflen = buf_size(0); - pi->consumed = 0; - pi->length = 0; - } - - /* try to get a message */ - msg.msg_name = pi->peer; - msg.msg_namelen = pi->peerlen; - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; - - iov[0].iov_base = pi->buf + pi->length; - iov[0].iov_len = pi->buflen - pi->length; - - len = recvmsg(pi->fd, &msg, 0); - - if (len == -1 || len == 0) - /* receive error */ - return (-1); - - pi->length += len; - - if (pi->cred) - check_priv_stream(pi); - - return (0); -} - -/* * Input from a socket */ int @@ -1122,15 +1074,7 @@ #endif struct iovec iov[1]; - /* get input depending on the transport */ - if (pi->stream) { - msg.msg_control = NULL; - msg.msg_controllen = 0; - - ret = recv_stream(pi); - } else { - ret = tport->transport->vtab->recv(tp, pi); - } + ret = tport->transport->vtab->recv(tport, pi); if (ret == -1) return (-1); Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c Sat Aug 9 12:25:06 2014 (r272122) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c Sat Aug 9 13:53:15 2014 (r272123) @@ -59,7 +59,6 @@ static ssize_t lsock_send(struct tport *, const u_char *, size_t, const struct sockaddr *, size_t); static ssize_t lsock_recv(struct tport *, struct port_input *); -static int recv_dgram(struct port_input *, struct in_addr *); /* exported */ const struct transport_def lsock_trans = { @@ -430,58 +429,20 @@ static ssize_t lsock_recv(struct tport *tp, struct port_input *pi) { - struct in_addr *laddr; - int ret; - struct msghdr msg; - char cbuf[CMSG_SPACE(sizeof(struct in_addr))]; - struct cmsghdr *cmsgp; - - memset(cbuf, 0, CMSG_SPACE(sizeof(struct in_addr))); - msg.msg_control = cbuf; - msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr)); - cmsgp = CMSG_FIRSTHDR(&msg); - cmsgp->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); - cmsgp->cmsg_level = IPPROTO_IP; - cmsgp->cmsg_type = IP_SENDSRCADDR; - laddr = (struct in_addr *)CMSG_DATA(cmsgp); - - ret = recv_dgram(pi, laddr); - - if (laddr->s_addr == 0) { - msg.msg_control = NULL; - msg.msg_controllen = 0; - } - - return (ret); -} - -/* - * Input from a datagram socket. - * Each receive should return one datagram. - */ -static int -recv_dgram(struct port_input *pi, struct in_addr *laddr) -{ - u_char embuf[1000]; - char cbuf[CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX)) + - CMSG_SPACE(sizeof(struct in_addr))]; struct msghdr msg; struct iovec iov[1]; ssize_t len; - struct cmsghdr *cmsg; - struct sockcred *cred = NULL; if (pi->buf == NULL) { /* no buffer yet - allocate one */ if ((pi->buf = buf_alloc(0)) == NULL) { - /* ups - could not get buffer. Read away input - * and drop it */ - (void)recvfrom(pi->fd, embuf, sizeof(embuf), - 0, NULL, NULL); - /* return error */ + /* ups - could not get buffer. Return an error + * the caller must close the transport. */ return (-1); } pi->buflen = buf_size(0); + pi->consumed = 0; + pi->length = 0; } /* try to get a message */ @@ -489,13 +450,12 @@ msg.msg_namelen = pi->peerlen; msg.msg_iov = iov; msg.msg_iovlen = 1; - memset(cbuf, 0, sizeof(cbuf)); - msg.msg_control = cbuf; - msg.msg_controllen = sizeof(cbuf); + msg.msg_control = NULL; + msg.msg_controllen = 0; msg.msg_flags = 0; - iov[0].iov_base = pi->buf; - iov[0].iov_len = pi->buflen; + iov[0].iov_base = pi->buf + pi->length; + iov[0].iov_len = pi->buflen - pi->length; len = recvmsg(pi->fd, &msg, 0); @@ -503,27 +463,10 @@ /* receive error */ return (-1); - if (msg.msg_flags & MSG_TRUNC) { - /* truncated - drop */ - snmpd_stats.silentDrops++; - snmpd_stats.inTooLong++; - return (-1); - } - - pi->length = (size_t)len; - - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; - cmsg = CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level == IPPROTO_IP && - cmsg->cmsg_type == IP_RECVDSTADDR) - memcpy(laddr, CMSG_DATA(cmsg), sizeof(struct in_addr)); - if (cmsg->cmsg_level == SOL_SOCKET && - cmsg->cmsg_type == SCM_CREDS) - cred = (struct sockcred *)CMSG_DATA(cmsg); - } + pi->length += len; if (pi->cred) - check_priv_dgram(pi, cred); + check_priv_stream(pi); return (0); }