aboutsummaryrefslogtreecommitdiffstats
path: root/src/assuan-io.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2008-09-01 10:39:24 +0000
committerWerner Koch <[email protected]>2008-09-01 10:39:24 +0000
commitb0e33756457f6d3b5daa250bd342d3f2275bc10b (patch)
tree06cf2805c03fc01acfdf5f8363afdf46b5aef28c /src/assuan-io.c
parentGet ready for the envisioned API changes (diff)
downloadlibassuan-b0e33756457f6d3b5daa250bd342d3f2275bc10b.tar.gz
libassuan-b0e33756457f6d3b5daa250bd342d3f2275bc10b.zip
Support sustems without nanosleep()
Diffstat (limited to 'src/assuan-io.c')
-rw-r--r--src/assuan-io.c34
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
+ }
}
+