diff options
author | Werner Koch <[email protected]> | 2008-09-01 10:39:24 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2008-09-01 10:39:24 +0000 |
commit | b0e33756457f6d3b5daa250bd342d3f2275bc10b (patch) | |
tree | 06cf2805c03fc01acfdf5f8363afdf46b5aef28c /src/assuan-io.c | |
parent | Get ready for the envisioned API changes (diff) | |
download | libassuan-b0e33756457f6d3b5daa250bd342d3f2275bc10b.tar.gz libassuan-b0e33756457f6d3b5daa250bd342d3f2275bc10b.zip |
Support sustems without nanosleep()
Diffstat (limited to 'src/assuan-io.c')
-rw-r--r-- | src/assuan-io.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/assuan-io.c b/src/assuan-io.c index 17e8b46..647237d 100644 --- a/src/assuan-io.c +++ b/src/assuan-io.c @@ -21,6 +21,7 @@ #include <config.h> #endif +#include <time.h> #include <sys/time.h> #include <sys/types.h> #ifdef HAVE_SYS_SOCKET_H @@ -218,20 +219,27 @@ _assuan_simple_recvmsg (assuan_context_t ctx, struct msghdr *msg) void _assuan_usleep (unsigned int usec) { -#ifdef HAVE_W32_SYSTEM - /* FIXME. */ - Sleep (usec / 1000); + if (usec) + { +#ifdef HAVE_NANOSLEEP + struct timespec req; + struct timespec rem; + + req.tv_sec = 0; + req.tv_nsec = usec * 1000; + + while (nanosleep (&req, &rem) < 0 && errno == EINTR) + req = rem; + +#elif defined(HAVE_W32_SYSTEM) + Sleep (usec / 1000); #else - struct timespec req; - struct timespec rem; - - if (usec == 0) - return; + struct timeval tv; - req.tv_sec = 0; - req.tv_nsec = usec * 1000; - - while (nanosleep (&req, &rem) < 0 && errno == EINTR) - req = rem; + tv.tv_sec = usec / 1000000; + tv.tv_usec = usec % 1000000; + select (0, NULL, NULL, NULL, &tv); #endif + } } + |