Paul Eggert wrote: > On 5/9/21 7:51 AM, Bruno Haible wrote: > > if (fd < 0) > > - return fd; > > + { > > + errno = ENOSYS; > > + return -1; > > + } > > If 'open' fails with errno equal to (say) EINTR or EAGAIN or EMFILE, > this doesn't mean the operating system lacks a randomness source; it > merely means the 'open' failed. And the libc manual allows getrandom to > fail with EMFILE or with any other valid error number. (FWIW, the Hurd > implementation of getrandom simply passes the errno of 'open' through.) > > How about if we instead change that code to something like this: > > if (fd < 0) > { > if (errno == ENOENT || errno == ENOTDIR) > errno = ENOSYS; > return fd; > } > > That is, if /dev/random (or whatever) doesn't exist, we assume the OS is > like IRIX and lacks randomness support, so we fail with ENOSYS; > otherwise we pass errno through as that's more useful to the caller.
Good point. Thanks for the correction. Done: 2021-05-13 Bruno Haible <br...@clisp.org> getrandom: Produce a better error code. Reported by Paul Eggert in <https://lists.gnu.org/archive/html/bug-gnulib/2021-05/msg00025.html>. * lib/getrandom.c (getrandom): When open() fails with an error that does not indicate the absence of the file, fail with that error code, not with ENOSYS. diff --git a/lib/getrandom.c b/lib/getrandom.c index 6160118..9e90e64 100644 --- a/lib/getrandom.c +++ b/lib/getrandom.c @@ -179,7 +179,8 @@ getrandom (void *buffer, size_t length, unsigned int flags) fd = open (randdevice[devrandom], oflags); if (fd < 0) { - errno = ENOSYS; + if (errno == ENOENT || errno == ENOTDIR) + errno = ENOSYS; return -1; } randfd[devrandom] = fd;