diff options
Diffstat (limited to 'snmplib/transports/snmpTCPBaseDomain.c')
-rw-r--r-- | snmplib/transports/snmpTCPBaseDomain.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/snmplib/transports/snmpTCPBaseDomain.c b/snmplib/transports/snmpTCPBaseDomain.c new file mode 100644 index 0000000..fc70dba --- /dev/null +++ b/snmplib/transports/snmpTCPBaseDomain.c @@ -0,0 +1,99 @@ +#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; +} |