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)
{
fd_set fds;
int flags;
int flags, new_flags = 0;
int nonblock = false;
struct listnode *ln = THREAD_ARG(t);
list_delete_node(events, ln);
/* fix for non blocking socket */
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;
}
if (flags & O_NONBLOCK)
nonblock = true;
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_SET(THREAD_FD(t), &fds);
snmp_read(&fds);
/* Reset the flag */
if (!nonblock)
fcntl(THREAD_FD(t), F_SETFL, flags);
if (!nonblock) {
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();
agentx_events_update();