Shahzad> It seem that when there are to many traps coming in,
Shahzad> scotty has a hard time binding to the trap socket. It
Shahzad> keeps giving the following message:
Shahzad> can not connect straps socket: no such file or directory
Erik> hmm, maybe you can clarify this a little bit: the ENOENT return code
Erik> indicates that scotty cannot `connect' to the straps daemon; IMHO this
Erik> indices that the socket-pseudo file is missing or it is stale and does
Erik> not belong to a running straps daemon.
there is indeed no straps daemon running at this moment, due to the
kind straps behaved: if there is no client connected straps exits.
this check is done too, if a trap packet comes in. so if scotty
launches straps and a trap was received by straps before scotty
connects to the daemon, it had no client and exits.
a patch to straps.c is appended, which waits some seconds before
exiting.
another patch is included, which works around the broken solaris
connect() call (a `broken pipe' error after a connection refused');
this should cause no harm to other platforms.
i hope this helps,
Erik
--
--- scotty-2.1.10/tnm/snmp/straps.c-merk Tue Dec 15 11:24:48 1998
+++ scotty-2.1.10/tnm/snmp/straps.c Tue Dec 15 12:24:57 1998
@@ -60,6 +60,9 @@
#define SNMP_TRAP_PATH "/tmp/.straps"
#define SNMP_TRAP_MCIP "234.0.0.1"
+/* path of the local unix-domain socket: */
+static char path[1024];
+
/*
* A signal handler which basically ignores all SIGPIPE signals.
* It re-installs itself for all the bozo's outside.
@@ -75,6 +78,25 @@
#endif
+/*
+ * A signal handler which exits; is setup to shutdown straps if idle:
+ */
+
+#ifdef SIGALRM
+static void
+sig_alarm(dummy)
+ int dummy;
+{
+ /* cleanup socket (closed by exiting): */
+ unlink(path);
+
+ /* exit: */
+ exit (0);
+}
+#endif
+
+
+
int
main(argc, argv)
int argc;
@@ -86,12 +108,13 @@
int trap_s, serv_s, slen, dlen, llen, rc, i;
fd_set fds;
static int cl_addr [FD_SETSIZE];
- char buf[2048], path[1024];
+ char buf[2048];
int go_on;
int mcast_s = -1;
char *name;
int port;
-
+ int alarm_set;
+
/*
* Check the number of arguments. We accept an optional argument
* which specifies the port number we are listening on.
@@ -228,19 +251,26 @@
if (listen(serv_s, 5) < 0) {
perror("straps: unable to listen on server socket");
+ unlink(path);
exit(1);
}
#ifdef SIGPIPE
signal(SIGPIPE, ign_pipe);
#endif
+#ifdef SIGALRM
+ signal(SIGALRM, sig_alarm);
+ alarm_set = 1;
+ alarm (5);
+#endif
/*
* Fine everything is ready; lets listen for events:
- * the for(;;) loop aborts, if the last client went away.
+ * the for(;;) loop aborts, if the last client went away and
+ * we are idle for some seconds.
*/
-
- for (go_on = 1; go_on; ) {
+
+ for ( ; go_on = 1; ) {
FD_ZERO(&fds);
FD_SET(trap_s, &fds);
@@ -330,6 +360,9 @@
continue;
}
cl_addr [rc] = 1;
+ /* clear alarm in case it is set: */
+ alarm (0);
+ alarm_set = 0;
} else {
/* fd's connected from clients. (XXX: should check for EOF): */
@@ -344,6 +377,12 @@
for (go_on = 0, i = 0; i < FD_SETSIZE; i++) {
go_on += cl_addr [i] > 0;
}
+ }
+
+ if (! go_on && ! alarm_set) {
+ /* no client listening; prepare for exit in some seconds: */
+ alarm (5);
+ alarm_set = 1;
}
} /* end for (;;) */
--- scotty-2.1.10/tnm/snmp/tnmSnmpNet.c-merk Tue Dec 15 11:47:48 1998
+++ scotty-2.1.10/tnm/snmp/tnmSnmpNet.c Tue Dec 15 11:44:03 1998
@@ -506,13 +506,27 @@
slen = sizeof(saddr) - sizeof(saddr.sun_path) + strlen(saddr.sun_path);
if (connect(trap_sock, (struct sockaddr *) &saddr, slen) < 0) {
-
- if (straps(interp) != TCL_OK) return TCL_ERROR;
+
+ /* reopen socket to avoid erroneous behavior with Solaris;
+ * (EPIPE after ECONNREFUSED) */
+ close (trap_sock);
+ trap_sock = TnmSocket(AF_UNIX, SOCK_STREAM, 0);
+ if (trap_sock == TNM_SOCKET_ERROR) {
+ Tcl_AppendResult(interp, "can not create straps socket: ",
+ Tcl_PosixError(interp), (char *) NULL);
+ return TCL_ERROR;
+ }
+
+ if (straps(interp) != TCL_OK) {
+ return TCL_ERROR;
+ }
for (i = 0; i < 5; i++) {
sleep(1);
rc = connect(trap_sock, (struct sockaddr *) &saddr, slen);
- if (rc >= 0) break;
+ if (rc >= 0) {
+ break;
+ }
}
if (rc < 0) {
@@ -559,7 +573,8 @@
Tcl_FreeFile(trapSocket);
TnmSocketClose(trap_sock);
trap_sock = -1;
- Tcl_ReapDetachedProcs();
+ /* useless without Tcl_DetachPids():
+ Tcl_ReapDetachedProcs(); */
}
}
--
!! This message is brought to you via the `tkined & scotty' mailing list.
!! Please do not reply to this message to unsubscribe. To subscribe or
!! unsubscribe, send a mail message to <tkined-request@ibr.cs.tu-bs.de>.
!! See http://wwwsnmp.cs.utwente.nl/~schoenw/scotty/ for more information.