1cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <time.h>
2cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <unistd.h>
3cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <stdio.h>
4cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <errno.h>
5cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <signal.h>
6cbdddcfb32883a37e873907602d34bac523e3eadsewardj
7cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include "../memcheck.h"
8cbdddcfb32883a37e873907602d34bac523e3eadsewardj
9cbdddcfb32883a37e873907602d34bac523e3eadsewardj/* Check that a syscall's POST function gets called if it completes
10cbdddcfb32883a37e873907602d34bac523e3eadsewardj   due to being interrupted.  nanosleep is used here, because it
11cbdddcfb32883a37e873907602d34bac523e3eadsewardj   writes a result even if it fails.  wait*() could also be used,
12cbdddcfb32883a37e873907602d34bac523e3eadsewardj   because they successully complete if interrupted by SIGCHLD.
13cbdddcfb32883a37e873907602d34bac523e3eadsewardj */
14cbdddcfb32883a37e873907602d34bac523e3eadsewardjstatic void handler(int s)
15cbdddcfb32883a37e873907602d34bac523e3eadsewardj{
16cbdddcfb32883a37e873907602d34bac523e3eadsewardj}
17cbdddcfb32883a37e873907602d34bac523e3eadsewardj
18cbdddcfb32883a37e873907602d34bac523e3eadsewardjint main()
19cbdddcfb32883a37e873907602d34bac523e3eadsewardj{
20cbdddcfb32883a37e873907602d34bac523e3eadsewardj	struct timespec req, rem;
21cbdddcfb32883a37e873907602d34bac523e3eadsewardj	int ret;
22cbdddcfb32883a37e873907602d34bac523e3eadsewardj
23cbdddcfb32883a37e873907602d34bac523e3eadsewardj	req.tv_sec = 2;
24cbdddcfb32883a37e873907602d34bac523e3eadsewardj	req.tv_nsec = 0;
25cbdddcfb32883a37e873907602d34bac523e3eadsewardj
26cbdddcfb32883a37e873907602d34bac523e3eadsewardj	signal(SIGALRM, handler);
27cbdddcfb32883a37e873907602d34bac523e3eadsewardj
28cbdddcfb32883a37e873907602d34bac523e3eadsewardj	alarm(1);
29cbdddcfb32883a37e873907602d34bac523e3eadsewardj	ret = nanosleep(&req, &rem);
30cbdddcfb32883a37e873907602d34bac523e3eadsewardj
31cbdddcfb32883a37e873907602d34bac523e3eadsewardj	if (ret != -1 || errno != EINTR) {
326cfb1df1b56bb0030952c1819613c9d4ca6174e0njn		fprintf(stderr, "FAILED: expected nanosleep to be interrupted\n");
33cbdddcfb32883a37e873907602d34bac523e3eadsewardj	} else {
3406bc722457ffe12e056d2f40d0d2f5c8711b541fflorian		(void) VALGRIND_CHECK_VALUE_IS_DEFINED(rem);
356cfb1df1b56bb0030952c1819613c9d4ca6174e0njn		fprintf(stderr, "PASSED\n"); /* assuming CHECK_VALUE_IS_DEFINED doesn't print anything */
36cbdddcfb32883a37e873907602d34bac523e3eadsewardj	}
37cbdddcfb32883a37e873907602d34bac523e3eadsewardj
38cbdddcfb32883a37e873907602d34bac523e3eadsewardj	return 0;
39cbdddcfb32883a37e873907602d34bac523e3eadsewardj}
40