diff options
Diffstat (limited to 'config/auto-aux/async_io.c')
-rw-r--r-- | config/auto-aux/async_io.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/config/auto-aux/async_io.c b/config/auto-aux/async_io.c new file mode 100644 index 000000000..2fb04a6c6 --- /dev/null +++ b/config/auto-aux/async_io.c @@ -0,0 +1,44 @@ +#include <stdio.h> +#include <fcntl.h> +#include <signal.h> +#include <errno.h> +#include "s.h" + +int signalled; + +void sigio_handler(arg) + int arg; +{ + signalled = 1; +} + +int main() +{ +#if defined(SIGIO) && defined(FASYNC) && defined(F_SETFL) && defined(F_SETOWN) + int p[2]; + int ret; +#define OUT 0 +#define IN 1 + if (pipe(p) == -1) return 1; + signalled = 0; + signal(SIGIO, sigio_handler); + ret = fcntl(p[OUT], F_GETFL, 0); + fcntl(p[OUT], F_SETFL, ret | FASYNC); + fcntl(p[OUT], F_SETOWN, getpid()); + switch(fork()) { + case -1: + return 1; + case 0: + close(p[OUT]); + write(p[IN], "x", 1); + sleep(1); + exit(0); + default: + close(p[IN]); + while(wait(NULL) == -1 && errno == EINTR) /*nothing*/; + } + if (signalled) return 0; else return 1; +#else + return 1; +#endif +} |