forked from pool/libtirpc
Marcus Meissner
4b133a860c
- 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
90 lines
2.2 KiB
Diff
90 lines
2.2 KiB
Diff
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
|
|
|