aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/sysutils.c46
-rw-r--r--common/sysutils.h1
2 files changed, 46 insertions, 1 deletions
diff --git a/common/sysutils.c b/common/sysutils.c
index 6eea90ed6..28d4cdee1 100644
--- a/common/sysutils.c
+++ b/common/sysutils.c
@@ -49,8 +49,8 @@
# include <asm/sysinfo.h>
# include <asm/unistd.h>
#endif
+#include <time.h>
#ifdef HAVE_SETRLIMIT
-# include <time.h>
# include <sys/time.h>
# include <sys/resource.h>
#endif
@@ -307,6 +307,50 @@ gnupg_sleep (unsigned int seconds)
}
+/* Wrapper around the platforms usleep function. This one won't wake
+ * up before the sleep time has really elapsed. When build with nPth
+ * it merely calls npth_usleep and thus suspends only the current
+ * thread. */
+void
+gnupg_usleep (unsigned int usecs)
+{
+#if defined(USE_NPTH)
+
+ npth_usleep (usecs);
+
+#elif defined(HAVE_W32_SYSTEM)
+
+ Sleep ((usecs + 999) / 1000);
+
+#elif defined(HAVE_NANOSLEEP)
+
+ if (usecs)
+ {
+ struct timespec req;
+ struct timespec rem;
+
+ req.tv_sec = 0;
+ req.tv_nsec = usecs * 1000;
+
+ while (nanosleep (&req, &rem) < 0 && errno == EINTR)
+ req = rem;
+ }
+
+#else /*Standard Unix*/
+
+ if (usecs)
+ {
+ struct timeval tv;
+
+ tv.tv_sec = usecs / 1000000;
+ tv.tv_usec = usecs % 1000000;
+ select (0, NULL, NULL, NULL, &tv);
+ }
+
+#endif
+}
+
+
/* This function is a NOP for POSIX systems but required under Windows
as the file handles as returned by OS calls (like CreateFile) are
different from the libc file descriptors (like open). This function
diff --git a/common/sysutils.h b/common/sysutils.h
index 7105107d0..5467b4ce7 100644
--- a/common/sysutils.h
+++ b/common/sysutils.h
@@ -54,6 +54,7 @@ const unsigned char *get_session_marker (size_t *rlen);
unsigned int get_uint_nonce (void);
/*int check_permissions (const char *path,int extension,int checkonly);*/
void gnupg_sleep (unsigned int seconds);
+void gnupg_usleep (unsigned int usecs);
int translate_sys2libc_fd (gnupg_fd_t fd, int for_write);
int translate_sys2libc_fd_int (int fd, int for_write);
FILE *gnupg_tmpfile (void);