lib: Test return of fcntl in agentx.c

The agentx.c code was calling fcntl but not testing return
code and handling it, thus making SA unhappy.

Fix.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2020-01-31 10:44:23 -05:00
parent 698ba8d026
commit 19d95d40c0

View File

@ -55,28 +55,42 @@ static int agentx_timeout(struct thread *t)
static int agentx_read(struct thread *t) static int agentx_read(struct thread *t)
{ {
fd_set fds; fd_set fds;
int flags; int flags, new_flags = 0;
int nonblock = false; int nonblock = false;
struct listnode *ln = THREAD_ARG(t); struct listnode *ln = THREAD_ARG(t);
list_delete_node(events, ln); list_delete_node(events, ln);
/* fix for non blocking socket */ /* fix for non blocking socket */
flags = fcntl(THREAD_FD(t), F_GETFL, 0); flags = fcntl(THREAD_FD(t), F_GETFL, 0);
if (-1 == flags) if (-1 == flags) {
flog_err(EC_LIB_SYSTEM_CALL, "Failed to get FD settings fcntl: %s(%d)",
strerror(errno), errno);
return -1; return -1;
}
if (flags & O_NONBLOCK) if (flags & O_NONBLOCK)
nonblock = true; nonblock = true;
else else
fcntl(THREAD_FD(t), F_SETFL, flags | O_NONBLOCK); new_flags = fcntl(THREAD_FD(t), F_SETFL, flags | O_NONBLOCK);
if (new_flags == -1)
flog_err(EC_LIB_SYSTEM_CALL, "Failed to set snmp fd non blocking: %s(%d)",
strerror(errno), errno);
FD_ZERO(&fds); FD_ZERO(&fds);
FD_SET(THREAD_FD(t), &fds); FD_SET(THREAD_FD(t), &fds);
snmp_read(&fds); snmp_read(&fds);
/* Reset the flag */ /* Reset the flag */
if (!nonblock) if (!nonblock) {
fcntl(THREAD_FD(t), F_SETFL, flags); new_flags = fcntl(THREAD_FD(t), F_SETFL, flags);
if (new_flags == -1)
flog_err(
EC_LIB_SYSTEM_CALL,
"Failed to set snmp fd back to original settings: %s(%d)",
strerror(errno), errno);
}
netsnmp_check_outstanding_agent_requests(); netsnmp_check_outstanding_agent_requests();
agentx_events_update(); agentx_events_update();