diff options
author | Ludovic Courtès <ludo@gnu.org> | 2018-02-16 14:05:04 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2018-02-16 15:29:35 +0100 |
commit | f390afa0cc84eb84ed2cb3e03f542b991d4bb080 (patch) | |
tree | 2a52a46373153c1ffa85422c07e59c8f985212b4 /libguile/filesys.c | |
parent | 07b7490f73fb4a6cb0c9577d082d37c8d9cee7b0 (diff) | |
download | guile-f390afa0cc84eb84ed2cb3e03f542b991d4bb080.tar.gz |
'select' returns empty sets upon EINTR and EAGAIN.
Fixes <https://bugs.gnu.org/30368>.
* libguile/filesys.c (scm_select): Clear READ_SET, WRITE_SET, and
EXCEPT_SET when RV < 0.
Diffstat (limited to 'libguile/filesys.c')
-rw-r--r-- | libguile/filesys.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c index e39dc4a0d..05dd2bd16 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -1,5 +1,5 @@ /* Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2006, - * 2009, 2010, 2011, 2012, 2013, 2014, 2016, 2017 Free Software Foundation, Inc. + * 2009, 2010, 2011, 2012, 2013, 2014, 2016, 2017, 2018 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -900,10 +900,20 @@ SCM_DEFINE (scm_select, "select", 3, 2, 0, int rv = scm_std_select (max_fd + 1, &read_set, &write_set, &except_set, time_ptr); - /* Let EINTR / EAGAIN cause a return to the user and let them loop - to run any asyncs that might be pending. */ - if (rv < 0 && errno != EINTR && errno != EAGAIN) - SCM_SYSERROR; + if (rv < 0) + { + /* Let EINTR / EAGAIN cause a return to the user and let them + loop to run any asyncs that might be pending. */ + if (errno != EINTR && errno != EAGAIN) + SCM_SYSERROR; + else + { + /* Return empty sets. */ + FD_ZERO (&read_set); + FD_ZERO (&write_set); + FD_ZERO (&except_set); + } + } } return scm_list_3 (retrieve_select_type (&read_set, read_ports_ready, reads), |