socsvn commit: r272123 - soc2014/shonali/head/contrib/bsnmp/snmpd
shonali at FreeBSD.org
shonali at FreeBSD.org
Sat Aug 9 13:53:17 UTC 2014
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);
}
More information about the svn-soc-all
mailing list