Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/Makefile.in1
-rw-r--r--winsup/cygwin/libc/getentropy.cc70
-rw-r--r--winsup/cygwin/miscfuncs.cc57
3 files changed, 71 insertions, 57 deletions
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
index 7c01df7b8..bffb24aa4 100644
--- a/winsup/cygwin/Makefile.in
+++ b/winsup/cygwin/Makefile.in
@@ -307,6 +307,7 @@ DLL_OFILES:= \
fork.o \
fts.o \
ftw.o \
+ getentropy.o \
getopt.o \
glob.o \
glob_pattern_p.o \
diff --git a/winsup/cygwin/libc/getentropy.cc b/winsup/cygwin/libc/getentropy.cc
new file mode 100644
index 000000000..5918eb5d9
--- /dev/null
+++ b/winsup/cygwin/libc/getentropy.cc
@@ -0,0 +1,70 @@
+/* getentropy.cc: getentropy/getrandmom functions
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#include "winsup.h"
+#include <ntsecapi.h>
+#include <sys/param.h>
+#include <sys/random.h>
+#include "cygtls.h"
+#include "ntdll.h"
+
+extern "C" int
+getentropy (void *ptr, size_t len)
+{
+ /* Per BSD man page: The maximum buffer size permitted is 256 bytes.
+ If buflen exceeds this, an error of EIO will be indicated. */
+ if (len > 256)
+ {
+ debug_printf ("len (%U) > 256", len);
+ set_errno (EIO);
+ return -1;
+ }
+ __try
+ {
+ if (!RtlGenRandom (ptr, len))
+ {
+ debug_printf ("RtlGenRandom() = FALSE");
+ set_errno (EIO);
+ return -1;
+ }
+ }
+ __except (EFAULT)
+ {
+ return -1;
+ }
+ __endtry
+ return 0;
+}
+
+extern "C" ssize_t
+getrandom (void *ptr, size_t len, unsigned int flags)
+{
+ if (flags & ~(GRND_NONBLOCK | GRND_RANDOM))
+ {
+ debug_printf ("invalid flags: %y", flags);
+ set_errno (EINVAL);
+ return -1;
+ }
+ /* Max. bytes returned by Linux call. */
+ len = MAX (len, (flags & GRND_RANDOM) ? 512 : 33554431);
+ __try
+ {
+ if (!RtlGenRandom (ptr, len))
+ {
+ debug_printf ("RtlGenRandom() = FALSE");
+ set_errno (EIO);
+ return -1;
+ }
+ }
+ __except (EFAULT)
+ {
+ return -1;
+ }
+ __endtry
+ return len;
+}
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
index 044d72787..a84c587ce 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -14,7 +14,6 @@ details. */
#include <alloca.h>
#include <limits.h>
#include <sys/param.h>
-#include <sys/random.h>
#include <wchar.h>
#include "cygtls.h"
#include "ntdll.h"
@@ -235,62 +234,6 @@ check_iovec (const struct iovec *iov, int iovcnt, bool forwrite)
return -1;
}
-extern "C" int
-getentropy (void *ptr, size_t len)
-{
- /* Per BSD man page: The maximum buffer size permitted is 256 bytes.
- If buflen exceeds this, an error of EIO will be indicated. */
- if (len > 256)
- {
- debug_printf ("len (%U) > 256", len);
- set_errno (EIO);
- return -1;
- }
- __try
- {
- if (!RtlGenRandom (ptr, len))
- {
- debug_printf ("RtlGenRandom() = FALSE");
- set_errno (EIO);
- return -1;
- }
- }
- __except (EFAULT)
- {
- return -1;
- }
- __endtry
- return 0;
-}
-
-extern "C" ssize_t
-getrandom (void *ptr, size_t len, unsigned int flags)
-{
- if (flags & ~(GRND_NONBLOCK | GRND_RANDOM))
- {
- debug_printf ("invalid flags: %y", flags);
- set_errno (EINVAL);
- return -1;
- }
- /* Max. bytes returned by Linux call. */
- len = MAX (len, (flags & GRND_RANDOM) ? 512 : 33554431);
- __try
- {
- if (!RtlGenRandom (ptr, len))
- {
- debug_printf ("RtlGenRandom() = FALSE");
- set_errno (EIO);
- return -1;
- }
- }
- __except (EFAULT)
- {
- return -1;
- }
- __endtry
- return len;
-}
-
/* Try hard to schedule another thread.
Remember not to call this in a lock condition or you'll potentially
suffer starvation. */