summaryrefslogtreecommitdiff
path: root/snmplib/transports/snmpTCPBaseDomain.c
diff options
context:
space:
mode:
Diffstat (limited to 'snmplib/transports/snmpTCPBaseDomain.c')
-rw-r--r--snmplib/transports/snmpTCPBaseDomain.c99
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;
+}