1906d4687089fa0f40436d453de38449cb1dd459brobbiew/*
2476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * Copyright (c) International Business Machines  Corp., 2002
3906d4687089fa0f40436d453de38449cb1dd459brobbiew *
4476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * This program is free software;  you can redistribute it and/or modify
5476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * it under the terms of the GNU General Public License as published by
6476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * the Free Software Foundation; either version 2 of the License, or
7476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * (at your option) any later version.
8906d4687089fa0f40436d453de38449cb1dd459brobbiew *
9476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * This program is distributed in the hope that it will be useful,
10476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * but WITHOUT ANY WARRANTY;  without even the implied warranty of
11476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * the GNU General Public License for more details.
13906d4687089fa0f40436d453de38449cb1dd459brobbiew *
14476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * You should have received a copy of the GNU General Public License
15476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * along with this program.
16906d4687089fa0f40436d453de38449cb1dd459brobbiew */
17906d4687089fa0f40436d453de38449cb1dd459brobbiew
18906d4687089fa0f40436d453de38449cb1dd459brobbiew/*
19476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * Check that if a child has a "broken pipe", this information
20476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang * is transmitted to the waiting parent.
21906d4687089fa0f40436d453de38449cb1dd459brobbiew */
22476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang
23906d4687089fa0f40436d453de38449cb1dd459brobbiew#include <errno.h>
24bc3c43e8fd44f6cb9b563a1168c71b1089d0a54frobbiew#include <string.h>
25476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang#include <unistd.h>
26476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang#include <stdlib.h>
27906d4687089fa0f40436d453de38449cb1dd459brobbiew#include <sys/wait.h>
28476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang#include "tst_test.h"
29906d4687089fa0f40436d453de38449cb1dd459brobbiew
30476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang#define SIZE	5
31906d4687089fa0f40436d453de38449cb1dd459brobbiew
32476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yangstatic int fd[2];
33476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yangstatic char rdbuf[SIZE];
34476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yangstatic char wrbuf[SIZE];
35906d4687089fa0f40436d453de38449cb1dd459brobbiew
36476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yangstatic void do_child(void)
37a728d284206e471a345e23e8e9423b19f2e6e293robbiew{
38476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_SIGNAL(SIGPIPE, SIG_DFL);
39476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_CLOSE(fd[0]);
40476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_WRITE(1, fd[1], wrbuf, SIZE);
41a728d284206e471a345e23e8e9423b19f2e6e293robbiew
42476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	TST_CHECKPOINT_WAIT(0);
43a728d284206e471a345e23e8e9423b19f2e6e293robbiew
44476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_WRITE(1, fd[1], wrbuf, SIZE);
45476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	exit(0);
46a728d284206e471a345e23e8e9423b19f2e6e293robbiew}
47a728d284206e471a345e23e8e9423b19f2e6e293robbiew
48476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yangstatic void verify_pipe(void)
49906d4687089fa0f40436d453de38449cb1dd459brobbiew{
50476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	int status;
51906d4687089fa0f40436d453de38449cb1dd459brobbiew	int sig = 0;
52476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	pid_t pid;
53906d4687089fa0f40436d453de38449cb1dd459brobbiew
54476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	memset(wrbuf, 'a', SIZE);
55906d4687089fa0f40436d453de38449cb1dd459brobbiew
56d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
57476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	maybe_run_child(&do_child, "dd", &fd[0], &fd[1]);
58d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
59d34d581c6a320e356a6cda923c7aa399479e812crobbiew
60476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	TEST(pipe(fd));
61476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	if (TEST_RETURN == -1) {
62476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		tst_res(TFAIL|TERRNO, "pipe() failed");
63476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		return;
64476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	}
65906d4687089fa0f40436d453de38449cb1dd459brobbiew
66476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	pid = SAFE_FORK();
67476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	if (pid == 0) {
68d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
69476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		if (self_exec(av[0], "dd", fd[0], fd[1]) < 0)
70476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang			tst_brk(TBROK, "self_exec failed");
71d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
72476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		do_child();
73d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
74906d4687089fa0f40436d453de38449cb1dd459brobbiew	}
75906d4687089fa0f40436d453de38449cb1dd459brobbiew
76476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	memset(rdbuf, 0, SIZE);
77476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_CLOSE(fd[1]);
78476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_READ(1, fd[0], rdbuf, SIZE);
79906d4687089fa0f40436d453de38449cb1dd459brobbiew
80476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	if (memcmp(wrbuf, rdbuf, SIZE) != 0) {
81476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		tst_res(TFAIL, "pipe read data and pipe "
82476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang			"write data didn't match");
83476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		return;
84476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	}
85906d4687089fa0f40436d453de38449cb1dd459brobbiew
86476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_CLOSE(fd[0]);
87476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	TST_CHECKPOINT_WAKE(0);
88476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	SAFE_WAIT(&status);
89476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang
90476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	if (!WIFSIGNALED(status)) {
91476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		tst_res(TFAIL, "Child wasn't killed by signal");
92476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	} else {
93476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		sig = WTERMSIG(status);
94476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		if (sig != SIGPIPE) {
95476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang			tst_res(TFAIL, "Child killed by %s expected SIGPIPE",
96476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang				tst_strsig(sig));
97476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		} else {
98476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang				tst_res(TPASS, "Child killed by SIGPIPE");
99476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang		}
100476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	}
101906d4687089fa0f40436d453de38449cb1dd459brobbiew}
102906d4687089fa0f40436d453de38449cb1dd459brobbiew
103476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yangstatic struct tst_test test = {
104476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	.forks_child = 1,
105476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	.needs_checkpoints = 1,
106476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang	.test_all = verify_pipe,
107476f8084df4c2d18bbf150f77756f85e4830c777Xiao Yang};
108