summaryrefslogtreecommitdiff
path: root/libaio-0.3.109/harness/cases/12.t
blob: e87d1dc190ffc33b33566be5819319e3453b749a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/* 12.t
- ioctx access across fork() (12.t)
 */
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

#include "aio_setup.h"

void test_child(void)
{
	int res;
	res = attempt_io_submit(io_ctx, 0, NULL, -EINVAL);
	fflush(stdout);
	_exit(res);
}

int test_main(void)
{
	int res, status;
	pid_t pid;
	sigset_t set;

	if (attempt_io_submit(io_ctx, 0, NULL, 0))
		return 1;

	sigemptyset(&set);
	sigaddset(&set, SIGCHLD);
	sigprocmask(SIG_BLOCK, &set, NULL);

	fflush(NULL);
	pid = fork();				assert(pid != -1);

	if (pid == 0)
		test_child();

	res = waitpid(pid, &status, 0);

	if (WIFEXITED(status)) {
		int failed = (WEXITSTATUS(status) != 0);
		printf("child exited with status %d%s\n", WEXITSTATUS(status),
			failed ? " -- FAILED" : "");
		return failed;
	}

	/* anything else: failed */
	if (WIFSIGNALED(status))
		printf("child killed by signal %d -- FAILED.\n",
			WTERMSIG(status));

	return 1;
}