SHA256
1
0
forked from pool/libtirpc
libtirpc/007-Change-rtime-function-to-use-poll-instead-of-select.patch

90 lines
2.2 KiB
Diff
Raw Normal View History

Accepting request 381804 from home:kukuk:NIS - Add some patches to get libtirpc compiled without needing glibc deprecated functions: - 015-Fix-includes-to-compile-without-deprecated-glibc-fun.patch - 014-Add-des_crypt.c-and-des_impl.c-to-become-independent.patch - 013-If-we-don-t-compile-in-YP-support-don-t-include-YP-h.patch - Add 012-libtirpc-needs-rpcsvc-nis.h-for-compiling-but-does-n.patch to allow bootstrapping of libtirpc without glibc sunrpc code or libnsl NIS+ code. - Add 011-Fix-typo-in-src-libtirpc.map-which-prevents-that-key.patch (fix export of key_secretkey_is_set) - Add the following patches to fix some bugs from the poll() port and an endless loop: - 006-Remove-old-meanwhile-wrong-comment-about-FD_SETSIZE-.patch - 007-Change-rtime-function-to-use-poll-instead-of-select.patch - 008-Add-parameters-to-local-prototypes-to-fix-compiler-w.patch - 009-makefd_xprt-checks-that-the-filedesriptor-is-lower-t.patch - 010-The-goto-again-statement-was-an-left-over-from-the-p.patch - Remove 004-netconfig-prefer-IPv6.patch for SLES12. - Remove libtirpc-getnetconfig-races.patch (was backport). [FATE#320393] - Drop libtirpc-xdr-header.patch (was backport) - Fix public xdr.h header - xdr_rpcvers() were broken (bsc#902439) Added: libtirpc-xdr-header.patch - Fix race conditions in getnetconfig (bsc#899576, bsc#882973) Added: libtirpc-getnetconfig-races.patch OBS-URL: https://build.opensuse.org/request/show/381804 OBS-URL: https://build.opensuse.org/package/show/Base:System/libtirpc?expand=0&rev=57
2016-04-04 13:47:30 +02:00
From f506559f6b2dedbb54ee59d0230d451a9dce213c Mon Sep 17 00:00:00 2001
From: Thorsten Kukuk <kukuk@thkukuk.de>
Date: Thu, 25 Feb 2016 12:51:50 +0100
Subject: [PATCH 2/5] Change rtime() function to use poll() instead of
select().
Signed-off-by: Thorsten Kukuk <kukuk@thkukuk.de>
---
src/rtime.c | 29 ++++++++++++++++-------------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/src/rtime.c b/src/rtime.c
index c34e0af..8141ae8 100644
--- a/src/rtime.c
+++ b/src/rtime.c
@@ -46,6 +46,7 @@
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
+#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
@@ -67,7 +68,8 @@ rtime(addrp, timep, timeout)
struct timeval *timeout;
{
int s;
- fd_set readfds;
+ struct pollfd fd;
+ int milliseconds;
int res;
unsigned long thetime;
struct sockaddr_in from;
@@ -94,31 +96,32 @@ rtime(addrp, timep, timeout)
addrp->sin_port = serv->s_port;
if (type == SOCK_DGRAM) {
- res = sendto(s, (char *)&thetime, sizeof(thetime), 0,
+ res = sendto(s, (char *)&thetime, sizeof(thetime), 0,
(struct sockaddr *)addrp, sizeof(*addrp));
if (res < 0) {
do_close(s);
- return(-1);
+ return(-1);
}
- do {
- FD_ZERO(&readfds);
- FD_SET(s, &readfds);
- res = select(_rpc_dtablesize(), &readfds,
- (fd_set *)NULL, (fd_set *)NULL, timeout);
- } while (res < 0 && errno == EINTR);
+
+ milliseconds = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);
+ fd.fd = s;
+ fd.events = POLLIN;
+ do
+ res = poll (&fd, 1, milliseconds);
+ while (res < 0 && errno == EINTR);
if (res <= 0) {
if (res == 0) {
errno = ETIMEDOUT;
}
do_close(s);
- return(-1);
+ return(-1);
}
fromlen = sizeof(from);
- res = recvfrom(s, (char *)&thetime, sizeof(thetime), 0,
+ res = recvfrom(s, (char *)&thetime, sizeof(thetime), 0,
(struct sockaddr *)&from, &fromlen);
do_close(s);
if (res < 0) {
- return(-1);
+ return(-1);
}
} else {
if (connect(s, (struct sockaddr *)addrp, sizeof(*addrp)) < 0) {
@@ -133,7 +136,7 @@ rtime(addrp, timep, timeout)
}
if (res != sizeof(thetime)) {
errno = EIO;
- return(-1);
+ return(-1);
}
thetime = ntohl(thetime);
timep->tv_sec = thetime - TOFFSET;
--
1.8.5.6