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