diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/snmp-engine.c | 20 | 
1 files changed, 16 insertions, 4 deletions
| diff --git a/common/snmp-engine.c b/common/snmp-engine.c index 0025d2f..1c29320 100644 --- a/common/snmp-engine.c +++ b/common/snmp-engine.c @@ -1036,17 +1036,26 @@ snmp_engine_init (const char **bindaddrs, int retries)  		hints.ai_flags = AI_NUMERICSERV;  		r = getaddrinfo (bindaddr, "0", &hints, &ai);  		if (r != 0) -			errx (1, "couldn't resolve bind address: %s: %s", bindaddr, gai_strerror (r)); +			errx (1, "couldn't resolve bind address '%s': %s", bindaddr, gai_strerror (r));  		fd = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); -		if (fd < 0) -			err (1, "couldn't open snmp socket"); +		if (fd < 0) { +			if (errno == EPROTONOSUPPORT || +			    errno == ENOPROTOOPT || +			    errno == ESOCKTNOSUPPORT) { +				warn ("couldn't create snmp socket for '%s'", bindaddr); +				freeaddrinfo (ai); +				continue; +			} else { +				err (1, "couldn't open snmp socket"); +			} +		}  		if (bind (fd, ai->ai_addr, ai->ai_addrlen) < 0)  			err (1, "couldn't listen on port");  		if (server_watch (fd, SERVER_READ, request_response, NULL) == -1) -			err (1, "couldn't listen on socket"); +			err (1, "couldn't watch port");  		/* Stash this socket info */  		sock = xcalloc (sizeof (struct socket)); @@ -1063,6 +1072,9 @@ snmp_engine_init (const char **bindaddrs, int retries)  		freeaddrinfo (ai);  	} +	if (snmp_sockets == NULL) +		errx (1, "no local addresses to listen on"); +  	/* We fire off the resend timer every 1/5 second */  	if (server_timer (200, request_resend_timer, NULL) == -1)  	    err(1, "couldn't setup timer"); | 
