1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved. 4f08c3bdfSopenharmony_ci * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com> 5f08c3bdfSopenharmony_ci * 6f08c3bdfSopenharmony_ci * This case is designed to test the basic functionality about the 7f08c3bdfSopenharmony_ci * O_CLOEXEC flag of pipe2. 8f08c3bdfSopenharmony_ci */ 9f08c3bdfSopenharmony_ci 10f08c3bdfSopenharmony_ci#define _GNU_SOURCE 11f08c3bdfSopenharmony_ci#include <stdio.h> 12f08c3bdfSopenharmony_ci#include <unistd.h> 13f08c3bdfSopenharmony_ci#include <stdlib.h> 14f08c3bdfSopenharmony_ci#include "lapi/fcntl.h" 15f08c3bdfSopenharmony_ci#include "tst_test.h" 16f08c3bdfSopenharmony_ci 17f08c3bdfSopenharmony_ci#define TESTBIN "pipe2_02_child" 18f08c3bdfSopenharmony_cistatic int fds[2]; 19f08c3bdfSopenharmony_ci 20f08c3bdfSopenharmony_cistatic void cleanup(void) 21f08c3bdfSopenharmony_ci{ 22f08c3bdfSopenharmony_ci if (fds[0] > 0) 23f08c3bdfSopenharmony_ci SAFE_CLOSE(fds[0]); 24f08c3bdfSopenharmony_ci if (fds[1] > 0) 25f08c3bdfSopenharmony_ci SAFE_CLOSE(fds[1]); 26f08c3bdfSopenharmony_ci} 27f08c3bdfSopenharmony_ci 28f08c3bdfSopenharmony_cistatic void verify_pipe2(void) 29f08c3bdfSopenharmony_ci{ 30f08c3bdfSopenharmony_ci int pid, status; 31f08c3bdfSopenharmony_ci char buf[20]; 32f08c3bdfSopenharmony_ci 33f08c3bdfSopenharmony_ci SAFE_PIPE2(fds, O_CLOEXEC); 34f08c3bdfSopenharmony_ci sprintf(buf, "%d", fds[1]); 35f08c3bdfSopenharmony_ci pid = SAFE_FORK(); 36f08c3bdfSopenharmony_ci if (pid == 0) 37f08c3bdfSopenharmony_ci SAFE_EXECLP(TESTBIN, TESTBIN, buf, NULL); 38f08c3bdfSopenharmony_ci 39f08c3bdfSopenharmony_ci SAFE_WAIT(&status); 40f08c3bdfSopenharmony_ci if (WIFEXITED(status)) { 41f08c3bdfSopenharmony_ci switch (WEXITSTATUS(status)) { 42f08c3bdfSopenharmony_ci case 0: 43f08c3bdfSopenharmony_ci tst_res(TPASS, "test O_CLOEXEC for pipe2 success"); 44f08c3bdfSopenharmony_ci break; 45f08c3bdfSopenharmony_ci case 1: 46f08c3bdfSopenharmony_ci tst_res(TFAIL, "test O_CLOEXEC for pipe2 failed"); 47f08c3bdfSopenharmony_ci break; 48f08c3bdfSopenharmony_ci default: 49f08c3bdfSopenharmony_ci tst_brk(TBROK, "execlp() failed"); 50f08c3bdfSopenharmony_ci } 51f08c3bdfSopenharmony_ci } else { 52f08c3bdfSopenharmony_ci tst_brk(TBROK, "%s exits with unexpected error", TESTBIN); 53f08c3bdfSopenharmony_ci } 54f08c3bdfSopenharmony_ci cleanup(); 55f08c3bdfSopenharmony_ci} 56f08c3bdfSopenharmony_ci 57f08c3bdfSopenharmony_cistatic struct tst_test test = { 58f08c3bdfSopenharmony_ci .resource_files = (const char *const []) { 59f08c3bdfSopenharmony_ci TESTBIN, 60f08c3bdfSopenharmony_ci NULL 61f08c3bdfSopenharmony_ci }, 62f08c3bdfSopenharmony_ci .cleanup = cleanup, 63f08c3bdfSopenharmony_ci .forks_child = 1, 64f08c3bdfSopenharmony_ci .needs_root = 1, 65f08c3bdfSopenharmony_ci .test_all = verify_pipe2, 66f08c3bdfSopenharmony_ci}; 67