Remove the ugly hack for forcing nl_getifdata() to be synchronous. It now
properly performs a synchronous wait using poll().
This commit is contained in:
parent
01c4731403
commit
e4ff1e9261
@ -31,6 +31,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <poll.h>
|
||||||
|
|
||||||
#include "netlink.h"
|
#include "netlink.h"
|
||||||
#include "ifchange.h"
|
#include "ifchange.h"
|
||||||
@ -192,12 +193,13 @@ int nl_getifdata(const char *ifname, struct client_state_t *cs)
|
|||||||
sizeof addr) == -1)
|
sizeof addr) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// This is rather ugly, but hey!
|
for (int pr = 0; !pr;) {
|
||||||
if (fcntl(cs->nlFd, F_SETFL, fcntl(cs->nlFd, F_GETFL) & ~O_NONBLOCK) == -1)
|
pr = poll(&((struct pollfd){.fd=cs->nlFd,.events=POLLIN}), 1, -1);
|
||||||
suicide("nl_getifdata: failed to remove O_NONBLOCK");
|
if (pr == 1)
|
||||||
handle_nl_message(cs);
|
handle_nl_message(cs);
|
||||||
if (fcntl(cs->nlFd, F_SETFL, fcntl(cs->nlFd, F_GETFL) | O_NONBLOCK) == -1)
|
else if (pr == -1)
|
||||||
suicide("nl_getifdata: failed to restore O_NONBLOCK");
|
suicide("nl: poll failed");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user