summaryrefslogtreecommitdiff
path: root/net/tcl-scotty/patches/patch-tnm_snmp_straps.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tcl-scotty/patches/patch-tnm_snmp_straps.c')
-rw-r--r--net/tcl-scotty/patches/patch-tnm_snmp_straps.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/net/tcl-scotty/patches/patch-tnm_snmp_straps.c b/net/tcl-scotty/patches/patch-tnm_snmp_straps.c
new file mode 100644
index 00000000000..6476523dbef
--- /dev/null
+++ b/net/tcl-scotty/patches/patch-tnm_snmp_straps.c
@@ -0,0 +1,76 @@
+$NetBSD: patch-tnm_snmp_straps.c,v 1.1 2014/03/05 13:52:29 he Exp $
+
+Provide more robustness for the straps helper program.
+
+--- tnm/snmp/straps.c.orig 1999-03-09 18:06:10.000000000 +0100
++++ tnm/snmp/straps.c 2014-03-04 13:25:45.000000000 +0100
+@@ -246,6 +246,17 @@
+ #endif
+
+ /*
++ * If there is a steady stream of traps bound for this
++ * host, we need to allow some time for the client (scotty)
++ * to connect to us. Otherwise, straps will just exit when
++ * the first trap message arrives. The client does 5 retries
++ * with 1 second in-between, so sleeping for 3 should be enough
++ * to let the client connect. There really ought to be a better
++ * way to do this.
++ */
++ sleep(3);
++
++ /*
+ * Fine everything is ready; lets listen for events:
+ * the for(;;) loop aborts, if the last client went away.
+ */
+@@ -271,7 +282,25 @@
+ perror("straps: select failed");
+ }
+
+- if (FD_ISSET(trap_s, &fds)) {
++ /*
++ * Check for new clients before handling any traps.
++ * If a trap arrived while we were sleeping above,
++ * we would set go_on to zero before the first client
++ * had a chance to connect.
++ */
++ if (FD_ISSET(serv_s, &fds)) {
++ /* accept a new client: */
++ memset((char *) &daddr, 0, sizeof(daddr));
++ dlen = sizeof(daddr);
++
++ rc = accept(serv_s, (struct sockaddr *) &daddr, &dlen);
++ if (rc < 0) {
++ perror("straps: accept failed");
++ continue;
++ }
++ cl_addr [rc] = 1;
++
++ } else if (FD_ISSET(trap_s, &fds)) {
+ /* read trap message and forward to clients: */
+ llen = sizeof(laddr);
+ if ((rc = recvfrom(trap_s, buf, sizeof(buf), 0,
+@@ -329,24 +358,6 @@
+ go_on += cl_addr [i] > 0;
+ }
+
+- } else if (FD_ISSET(serv_s, &fds)) {
+- memset((char *) &daddr, 0, sizeof(daddr));
+- dlen = sizeof(daddr);
+-
+- rc = accept(serv_s, (struct sockaddr *) &daddr, &dlen);
+- if (rc < 0) {
+- perror("straps: accept failed");
+- continue;
+- }
+- /* Check for a potential buffer overflow if the accept()
+- call returns a file descriptor larger than FD_SETSIZE */
+- if (rc >= FD_SETSIZE) {
+- fprintf(stderr, "straps: too many clients\n");
+- close(rc);
+- continue;
+- }
+- cl_addr [rc] = 1;
+-
+ } else {
+ /* fd's connected from clients. (XXX: should check for EOF): */
+ for (i = 0; i < FD_SETSIZE; i++) {