Index: contrib/bsnmp/snmpd/trap.c =================================================================== --- contrib/bsnmp/snmpd/trap.c (revision 216594) +++ contrib/bsnmp/snmpd/trap.c (working copy) @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -526,6 +527,36 @@ } } +static int +udp_send_trap(int sock, char *sndbuf, size_t sndlen, int flags) +{ + int so_err; + socklen_t err_len; + ssize_t len; + + err_len = sizeof(so_err); + if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &so_err, &err_len) != 0) { + syslog(LOG_ERR, "getsockopt: %m"); + return (-1); + } + if (so_err != 0 && so_err != ECONNREFUSED && so_err != ENETDOWN && + so_err != EHOSTDOWN) { + syslog(LOG_ERR, "getsockopt: %m"); + return (-1); + } + + if ((len = send(sock, sndbuf, sndlen, flags)) == -1) { + syslog(LOG_ERR, "send: %m"); + return (-1); + } else if ((size_t)len != sndlen) { + syslog(LOG_ERR, "send: short write %zu/%zu", + sndlen, (size_t)len); + return (-1); + } + + return (0); +} + void snmp_send_trap(const struct asn_oid *trap_oid, ...) { @@ -540,7 +571,6 @@ u_char *sndbuf; char *tag; size_t sndlen; - ssize_t len; int32_t ip; TAILQ_FOREACH(t, &trapsink_list, link) { @@ -569,13 +599,8 @@ } snmp_output(&pdu, sndbuf, &sndlen, "TRAP"); + (void)udp_send_trap(t->socket, sndbuf, sndlen, 0); - if ((len = send(t->socket, sndbuf, sndlen, 0)) == -1) - syslog(LOG_ERR, "send: %m"); - else if ((size_t)len != sndlen) - syslog(LOG_ERR, "send: short write %zu/%zu", - sndlen, (size_t)len); - free(sndbuf); } @@ -636,13 +661,8 @@ } snmp_output(&pdu, sndbuf, &sndlen, "TRAP"); + (void)udp_send_trap(ta->socket, sndbuf, sndlen, 0); - if ((len = send(ta->socket, sndbuf, sndlen, 0)) == -1) - syslog(LOG_ERR, "send: %m"); - else if ((size_t)len != sndlen) - syslog(LOG_ERR, "send: short write %zu/%zu", - sndlen, (size_t)len); - free(sndbuf); } }