# HG changeset patch # User Bruno Haible # Date 1362608587 -3600 # Node ID 41cddf8f3b4d452a3cc0e0206faff28b986cad05 # Parent aea18ef5eadd346add1a690c853fcab98cc7e4b2 execute: Revert last change, but use a different condition. * lib/execute.c (nonintr_close, nonintr_open): Reintroduce, but only on Windows. diff -r aea18ef5eadd -r 41cddf8f3b4d ChangeLog --- a/ChangeLog Tue Mar 05 12:46:20 2013 -0700 +++ b/ChangeLog Wed Mar 06 23:23:07 2013 +0100 @@ -1,3 +1,9 @@ +2013-03-06 Bruno Haible + + execute: Revert last change, but use a different condition. + * lib/execute.c (nonintr_close, nonintr_open): Reintroduce, but only + on Windows. + 2013-03-05 Eric Blake execute: drop dead code diff -r aea18ef5eadd -r 41cddf8f3b4d lib/execute.c --- a/lib/execute.c Tue Mar 05 12:46:20 2013 -0700 +++ b/lib/execute.c Wed Mar 06 23:23:07 2013 +0100 @@ -54,6 +54,42 @@ #undef close +#if defined EINTR && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) + +/* EINTR handling for close(), open(). + These functions can return -1/EINTR even though we don't have any + signal handlers set up, namely when we get interrupted via SIGSTOP. */ + +static int +nonintr_close (int fd) +{ + int retval; + + do + retval = close (fd); + while (retval < 0 && errno == EINTR); + + return retval; +} +#define close nonintr_close + +static int +nonintr_open (const char *pathname, int oflag, mode_t mode) +{ + int retval; + + do + retval = open (pathname, oflag, mode); + while (retval < 0 && errno == EINTR); + + return retval; +} +#undef open /* avoid warning on VMS */ +#define open nonintr_open + +#endif + + /* Execute a command, optionally redirecting any of the three standard file descriptors to /dev/null. Return its exit code. If it didn't terminate correctly, exit if exit_on_error is true, otherwise