mirror of
https://github.com/Stichting-MINIX-Research-Foundation/pkgsrc-ng.git
synced 2025-08-03 17:59:07 -04:00
77 lines
2.4 KiB
C
77 lines
2.4 KiB
C
$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++) {
|