$NetBSD: patch-ag,v 1.1 2004/07/07 14:39:33 he Exp $ --- ../tnm/snmp/straps.c.orig Tue Mar 9 18:06:10 1999 +++ ../tnm/snmp/straps.c @@ -246,6 +246,17 @@ main(argc, argv) #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 @@ main(argc, argv) 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, @@ -328,24 +357,6 @@ main(argc, argv) for (go_on = 0, i = 0; i < FD_SETSIZE; i++) { 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): */