blob: fc70dba3c5cfced88dc5dd2d3e702ee33afd7415 [file] [log] [blame]
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/types.h>
#include <net-snmp/library/snmpTCPBaseDomain.h>
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#if HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#if HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#if HAVE_FCNTL_H
#include <fcntl.h>
#endif
#if HAVE_DMALLOC_H
#include <dmalloc.h>
#endif
#include <net-snmp/types.h>
#include <net-snmp/output_api.h>
#include <net-snmp/library/snmp_transport.h>
/*
* You can write something into opaque that will subsequently get passed back
* to your send function if you like. For instance, you might want to
* remember where a PDU came from, so that you can send a reply there...
*/
int netsnmp_tcpbase_recv(netsnmp_transport *t, void *buf, int size,
void **opaque, int *olength)
{
int rc = -1;
if (t != NULL && t->sock >= 0) {
while (rc < 0) {
rc = recvfrom(t->sock, buf, size, 0, NULL, NULL);
if (rc < 0 && errno != EINTR) {
DEBUGMSGTL(("netsnmp_tcpbase", "recv fd %d err %d (\"%s\")\n",
t->sock, errno, strerror(errno)));
break;
}
DEBUGMSGTL(("netsnmp_tcpbase", "recv fd %d got %d bytes\n",
t->sock, rc));
}
} else {
return -1;
}
if (opaque != NULL && olength != NULL) {
if (t->data_length > 0) {
if ((*opaque = malloc(t->data_length)) != NULL) {
memcpy(*opaque, t->data, t->data_length);
*olength = t->data_length;
} else {
*olength = 0;
}
} else {
*opaque = NULL;
*olength = 0;
}
}
return rc;
}
int netsnmp_tcpbase_send(netsnmp_transport *t, void *buf, int size,
void **opaque, int *olength) {
int rc = -1;
if (t != NULL && t->sock >= 0) {
while (rc < 0) {
rc = sendto(t->sock, buf, size, 0, NULL, 0);
if (rc < 0 && errno != EINTR) {
break;
}
}
}
return rc;
}