157718be8SEnji Cooper /* $NetBSD: t_dup.c,v 1.8 2012/03/18 07:00:51 jruoho Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /*- 457718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc. 557718be8SEnji Cooper * All rights reserved. 657718be8SEnji Cooper * 757718be8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 857718be8SEnji Cooper * by Jukka Ruohonen. 957718be8SEnji Cooper * 1057718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 1157718be8SEnji Cooper * modification, are permitted provided that the following conditions 1257718be8SEnji Cooper * are met: 1357718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 1457718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 1557718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 1657718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 1757718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 1857718be8SEnji Cooper * 1957718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2057718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2157718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2257718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2357718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2457718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2557718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2657718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2757718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2857718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2957718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 3057718be8SEnji Cooper */ 3157718be8SEnji Cooper #include <sys/cdefs.h> 3257718be8SEnji Cooper __RCSID("$NetBSD: t_dup.c,v 1.8 2012/03/18 07:00:51 jruoho Exp $"); 3357718be8SEnji Cooper 3457718be8SEnji Cooper #include <sys/resource.h> 3557718be8SEnji Cooper #include <sys/stat.h> 3657718be8SEnji Cooper #include <sys/wait.h> 3757718be8SEnji Cooper 3857718be8SEnji Cooper #include <atf-c.h> 3957718be8SEnji Cooper #include <errno.h> 4057718be8SEnji Cooper #include <fcntl.h> 4157718be8SEnji Cooper #include <limits.h> 4257718be8SEnji Cooper #include <stdio.h> 4357718be8SEnji Cooper #include <stdlib.h> 4457718be8SEnji Cooper #include <string.h> 4557718be8SEnji Cooper #include <unistd.h> 4657718be8SEnji Cooper #include <sysexits.h> 4757718be8SEnji Cooper 48*4dc3ed6aSEnji Cooper #ifdef __FreeBSD__ 49*4dc3ed6aSEnji Cooper #include <stdbool.h> 50*4dc3ed6aSEnji Cooper #endif 51*4dc3ed6aSEnji Cooper 5257718be8SEnji Cooper static char path[] = "dup"; 53*4dc3ed6aSEnji Cooper #ifdef __NetBSD__ 5457718be8SEnji Cooper static void check_mode(bool, bool, bool); 55*4dc3ed6aSEnji Cooper #endif 5657718be8SEnji Cooper 5757718be8SEnji Cooper static void 5857718be8SEnji Cooper check_mode(bool _dup, bool _dup2, bool _dup3) 5957718be8SEnji Cooper { 6057718be8SEnji Cooper int mode[3] = { O_RDONLY, O_WRONLY, O_RDWR }; 6157718be8SEnji Cooper int perm[5] = { 0700, 0400, 0600, 0444, 0666 }; 6257718be8SEnji Cooper struct stat st, st1; 6357718be8SEnji Cooper int fd, fd1, fd2; 6457718be8SEnji Cooper size_t i, j; 6557718be8SEnji Cooper 6657718be8SEnji Cooper /* 6757718be8SEnji Cooper * Check that a duplicated descriptor 6857718be8SEnji Cooper * retains the mode of the original file. 6957718be8SEnji Cooper */ 7057718be8SEnji Cooper for (i = 0; i < __arraycount(mode); i++) { 7157718be8SEnji Cooper 7257718be8SEnji Cooper for (j = 0; j < __arraycount(perm); j++) { 7357718be8SEnji Cooper 7457718be8SEnji Cooper fd1 = open(path, mode[i] | O_CREAT, perm[j]); 7557718be8SEnji Cooper fd2 = open("/etc/passwd", O_RDONLY); 7657718be8SEnji Cooper 7757718be8SEnji Cooper ATF_REQUIRE(fd1 >= 0); 7857718be8SEnji Cooper ATF_REQUIRE(fd2 >= 0); 7957718be8SEnji Cooper 8057718be8SEnji Cooper if (_dup != false) 8157718be8SEnji Cooper fd = dup(fd1); 8257718be8SEnji Cooper else if (_dup2 != false) 8357718be8SEnji Cooper fd = dup2(fd1, fd2); 8457718be8SEnji Cooper else if (_dup3 != false) 8557718be8SEnji Cooper fd = dup3(fd1, fd2, O_CLOEXEC); 8657718be8SEnji Cooper else { 8757718be8SEnji Cooper fd = -1; 8857718be8SEnji Cooper } 8957718be8SEnji Cooper 9057718be8SEnji Cooper ATF_REQUIRE(fd >= 0); 9157718be8SEnji Cooper 9257718be8SEnji Cooper (void)memset(&st, 0, sizeof(struct stat)); 9357718be8SEnji Cooper (void)memset(&st1, 0, sizeof(struct stat)); 9457718be8SEnji Cooper 9557718be8SEnji Cooper ATF_REQUIRE(fstat(fd, &st) == 0); 9657718be8SEnji Cooper ATF_REQUIRE(fstat(fd1, &st1) == 0); 9757718be8SEnji Cooper 9857718be8SEnji Cooper if (st.st_mode != st1.st_mode) 9957718be8SEnji Cooper atf_tc_fail("invalid mode"); 10057718be8SEnji Cooper 10157718be8SEnji Cooper (void)close(fd); 10257718be8SEnji Cooper (void)close(fd1); 10357718be8SEnji Cooper (void)close(fd2); 10457718be8SEnji Cooper (void)unlink(path); 10557718be8SEnji Cooper } 10657718be8SEnji Cooper } 10757718be8SEnji Cooper } 10857718be8SEnji Cooper 10957718be8SEnji Cooper ATF_TC(dup2_basic); 11057718be8SEnji Cooper ATF_TC_HEAD(dup2_basic, tc) 11157718be8SEnji Cooper { 11257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "A basic test of dup2(2)"); 11357718be8SEnji Cooper } 11457718be8SEnji Cooper 11557718be8SEnji Cooper ATF_TC_BODY(dup2_basic, tc) 11657718be8SEnji Cooper { 11757718be8SEnji Cooper int fd, fd1, fd2; 11857718be8SEnji Cooper 11957718be8SEnji Cooper fd1 = open("/etc/passwd", O_RDONLY); 12057718be8SEnji Cooper fd2 = open("/etc/passwd", O_RDONLY); 12157718be8SEnji Cooper 12257718be8SEnji Cooper ATF_REQUIRE(fd1 >= 0); 12357718be8SEnji Cooper ATF_REQUIRE(fd2 >= 0); 12457718be8SEnji Cooper 12557718be8SEnji Cooper fd = dup2(fd1, fd2); 12657718be8SEnji Cooper ATF_REQUIRE(fd >= 0); 12757718be8SEnji Cooper 12857718be8SEnji Cooper if (fd != fd2) 12957718be8SEnji Cooper atf_tc_fail("invalid descriptor"); 13057718be8SEnji Cooper 13157718be8SEnji Cooper (void)close(fd); 13257718be8SEnji Cooper (void)close(fd1); 13357718be8SEnji Cooper 13457718be8SEnji Cooper ATF_REQUIRE(close(fd2) != 0); 13557718be8SEnji Cooper } 13657718be8SEnji Cooper 13757718be8SEnji Cooper ATF_TC(dup2_err); 13857718be8SEnji Cooper ATF_TC_HEAD(dup2_err, tc) 13957718be8SEnji Cooper { 14057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test error conditions of dup2(2)"); 14157718be8SEnji Cooper } 14257718be8SEnji Cooper 14357718be8SEnji Cooper ATF_TC_BODY(dup2_err, tc) 14457718be8SEnji Cooper { 14557718be8SEnji Cooper int fd; 14657718be8SEnji Cooper 14757718be8SEnji Cooper fd = open("/etc/passwd", O_RDONLY); 14857718be8SEnji Cooper ATF_REQUIRE(fd >= 0); 14957718be8SEnji Cooper 15057718be8SEnji Cooper errno = 0; 15157718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup2(-1, -1) == -1); 15257718be8SEnji Cooper 15357718be8SEnji Cooper errno = 0; 15457718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup2(fd, -1) == -1); 15557718be8SEnji Cooper 15657718be8SEnji Cooper errno = 0; 15757718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup2(-1, fd) == -1); 15857718be8SEnji Cooper 15957718be8SEnji Cooper /* 16057718be8SEnji Cooper * Note that this should not fail with EINVAL. 16157718be8SEnji Cooper */ 16257718be8SEnji Cooper ATF_REQUIRE(dup2(fd, fd) != -1); 16357718be8SEnji Cooper 16457718be8SEnji Cooper (void)close(fd); 16557718be8SEnji Cooper } 16657718be8SEnji Cooper 16757718be8SEnji Cooper ATF_TC(dup2_max); 16857718be8SEnji Cooper ATF_TC_HEAD(dup2_max, tc) 16957718be8SEnji Cooper { 17057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test dup2(2) against limits"); 17157718be8SEnji Cooper } 17257718be8SEnji Cooper 17357718be8SEnji Cooper ATF_TC_BODY(dup2_max, tc) 17457718be8SEnji Cooper { 17557718be8SEnji Cooper struct rlimit res; 17657718be8SEnji Cooper 17757718be8SEnji Cooper (void)memset(&res, 0, sizeof(struct rlimit)); 17857718be8SEnji Cooper (void)getrlimit(RLIMIT_NOFILE, &res); 17957718be8SEnji Cooper 18057718be8SEnji Cooper errno = 0; 18157718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup2(STDERR_FILENO, res.rlim_cur + 1) == -1); 18257718be8SEnji Cooper } 18357718be8SEnji Cooper 18457718be8SEnji Cooper ATF_TC_WITH_CLEANUP(dup2_mode); 18557718be8SEnji Cooper ATF_TC_HEAD(dup2_mode, tc) 18657718be8SEnji Cooper { 18757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "A basic test of dup2(2)"); 18857718be8SEnji Cooper } 18957718be8SEnji Cooper 19057718be8SEnji Cooper ATF_TC_BODY(dup2_mode, tc) 19157718be8SEnji Cooper { 19257718be8SEnji Cooper check_mode(false, true, false); 19357718be8SEnji Cooper } 19457718be8SEnji Cooper 19557718be8SEnji Cooper ATF_TC_CLEANUP(dup2_mode, tc) 19657718be8SEnji Cooper { 19757718be8SEnji Cooper (void)unlink(path); 19857718be8SEnji Cooper } 19957718be8SEnji Cooper 20057718be8SEnji Cooper 20157718be8SEnji Cooper ATF_TC(dup3_err); 20257718be8SEnji Cooper ATF_TC_HEAD(dup3_err, tc) 20357718be8SEnji Cooper { 20457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 20557718be8SEnji Cooper "Test error conditions of dup3(2) (PR lib/45148)"); 20657718be8SEnji Cooper } 20757718be8SEnji Cooper 20857718be8SEnji Cooper ATF_TC_BODY(dup3_err, tc) 20957718be8SEnji Cooper { 21057718be8SEnji Cooper int fd; 21157718be8SEnji Cooper 21257718be8SEnji Cooper fd = open("/etc/passwd", O_RDONLY); 21357718be8SEnji Cooper ATF_REQUIRE(fd >= 0); 21457718be8SEnji Cooper 21557718be8SEnji Cooper errno = 0; 216*4dc3ed6aSEnji Cooper #if defined(__FreeBSD__) || defined(__linux__) 217*4dc3ed6aSEnji Cooper /* 218*4dc3ed6aSEnji Cooper * FreeBSD and linux return EINVAL, because... 219*4dc3ed6aSEnji Cooper * 220*4dc3ed6aSEnji Cooper * [EINVAL] The oldd argument is equal to the newd argument. 221*4dc3ed6aSEnji Cooper */ 222*4dc3ed6aSEnji Cooper ATF_REQUIRE(dup3(fd, fd, O_CLOEXEC) == -1); 223*4dc3ed6aSEnji Cooper #else 22457718be8SEnji Cooper ATF_REQUIRE(dup3(fd, fd, O_CLOEXEC) != -1); 225*4dc3ed6aSEnji Cooper #endif 22657718be8SEnji Cooper 22757718be8SEnji Cooper errno = 0; 228*4dc3ed6aSEnji Cooper #if defined(__FreeBSD__) || defined(__linux__) 229*4dc3ed6aSEnji Cooper ATF_REQUIRE_ERRNO(EINVAL, dup3(-1, -1, O_CLOEXEC) == -1); 230*4dc3ed6aSEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup3(fd, -1, O_CLOEXEC) == -1); 231*4dc3ed6aSEnji Cooper #else 23257718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup3(-1, -1, O_CLOEXEC) == -1); 233*4dc3ed6aSEnji Cooper #endif 23457718be8SEnji Cooper 23557718be8SEnji Cooper errno = 0; 23657718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup3(fd, -1, O_CLOEXEC) == -1); 23757718be8SEnji Cooper 23857718be8SEnji Cooper errno = 0; 23957718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup3(-1, fd, O_CLOEXEC) == -1); 24057718be8SEnji Cooper 24157718be8SEnji Cooper errno = 0; 24257718be8SEnji Cooper ATF_REQUIRE_ERRNO(EINVAL, dup3(fd, 1, O_NOFOLLOW) == -1); 24357718be8SEnji Cooper 24457718be8SEnji Cooper (void)close(fd); 24557718be8SEnji Cooper } 24657718be8SEnji Cooper 24757718be8SEnji Cooper ATF_TC(dup3_max); 24857718be8SEnji Cooper ATF_TC_HEAD(dup3_max, tc) 24957718be8SEnji Cooper { 25057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test dup3(2) against limits"); 25157718be8SEnji Cooper } 25257718be8SEnji Cooper 25357718be8SEnji Cooper ATF_TC_BODY(dup3_max, tc) 25457718be8SEnji Cooper { 25557718be8SEnji Cooper struct rlimit res; 25657718be8SEnji Cooper 25757718be8SEnji Cooper (void)memset(&res, 0, sizeof(struct rlimit)); 25857718be8SEnji Cooper (void)getrlimit(RLIMIT_NOFILE, &res); 25957718be8SEnji Cooper 26057718be8SEnji Cooper errno = 0; 26157718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup3(STDERR_FILENO, 26257718be8SEnji Cooper res.rlim_cur + 1, O_CLOEXEC) == -1); 26357718be8SEnji Cooper } 26457718be8SEnji Cooper 26557718be8SEnji Cooper ATF_TC_WITH_CLEANUP(dup3_mode); 26657718be8SEnji Cooper ATF_TC_HEAD(dup3_mode, tc) 26757718be8SEnji Cooper { 26857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "A basic test of dup3(2)"); 26957718be8SEnji Cooper } 27057718be8SEnji Cooper 27157718be8SEnji Cooper ATF_TC_BODY(dup3_mode, tc) 27257718be8SEnji Cooper { 27357718be8SEnji Cooper check_mode(false, false, true); 27457718be8SEnji Cooper } 27557718be8SEnji Cooper 27657718be8SEnji Cooper ATF_TC_CLEANUP(dup3_mode, tc) 27757718be8SEnji Cooper { 27857718be8SEnji Cooper (void)unlink(path); 27957718be8SEnji Cooper } 28057718be8SEnji Cooper 28157718be8SEnji Cooper ATF_TC(dup_err); 28257718be8SEnji Cooper ATF_TC_HEAD(dup_err, tc) 28357718be8SEnji Cooper { 28457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test error conditions of dup(2)"); 28557718be8SEnji Cooper } 28657718be8SEnji Cooper 28757718be8SEnji Cooper ATF_TC_BODY(dup_err, tc) 28857718be8SEnji Cooper { 28957718be8SEnji Cooper 29057718be8SEnji Cooper errno = 0; 29157718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBADF, dup(-1) == -1); 29257718be8SEnji Cooper } 29357718be8SEnji Cooper 29457718be8SEnji Cooper ATF_TC_WITH_CLEANUP(dup_max); 29557718be8SEnji Cooper ATF_TC_HEAD(dup_max, tc) 29657718be8SEnji Cooper { 29757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test dup(2) against limits"); 29857718be8SEnji Cooper } 29957718be8SEnji Cooper 30057718be8SEnji Cooper ATF_TC_BODY(dup_max, tc) 30157718be8SEnji Cooper { 30257718be8SEnji Cooper struct rlimit res; 30357718be8SEnji Cooper int *buf, fd, sta; 30457718be8SEnji Cooper size_t i, n; 30557718be8SEnji Cooper pid_t pid; 30657718be8SEnji Cooper 30757718be8SEnji Cooper pid = fork(); 30857718be8SEnji Cooper ATF_REQUIRE(pid >= 0); 30957718be8SEnji Cooper 31057718be8SEnji Cooper if (pid == 0) { 31157718be8SEnji Cooper 31257718be8SEnji Cooper /* 31357718be8SEnji Cooper * Open a temporary file until the 31457718be8SEnji Cooper * maximum number of open files is 31557718be8SEnji Cooper * reached. Ater that dup(2) family 31657718be8SEnji Cooper * should fail with EMFILE. 31757718be8SEnji Cooper */ 31857718be8SEnji Cooper (void)closefrom(0); 31957718be8SEnji Cooper (void)memset(&res, 0, sizeof(struct rlimit)); 32057718be8SEnji Cooper 32157718be8SEnji Cooper n = 10; 32257718be8SEnji Cooper res.rlim_cur = res.rlim_max = n; 32357718be8SEnji Cooper if (setrlimit(RLIMIT_NOFILE, &res) != 0) 32457718be8SEnji Cooper _exit(EX_OSERR); 32557718be8SEnji Cooper 32657718be8SEnji Cooper buf = calloc(n, sizeof(int)); 32757718be8SEnji Cooper 32857718be8SEnji Cooper if (buf == NULL) 32957718be8SEnji Cooper _exit(EX_OSERR); 33057718be8SEnji Cooper 33157718be8SEnji Cooper buf[0] = mkstemp(path); 33257718be8SEnji Cooper 33357718be8SEnji Cooper if (buf[0] < 0) 33457718be8SEnji Cooper _exit(EX_OSERR); 33557718be8SEnji Cooper 33657718be8SEnji Cooper for (i = 1; i < n; i++) { 33757718be8SEnji Cooper 33857718be8SEnji Cooper buf[i] = open(path, O_RDONLY); 33957718be8SEnji Cooper 34057718be8SEnji Cooper if (buf[i] < 0) 34157718be8SEnji Cooper _exit(EX_OSERR); 34257718be8SEnji Cooper } 34357718be8SEnji Cooper 34457718be8SEnji Cooper errno = 0; 34557718be8SEnji Cooper fd = dup(buf[0]); 34657718be8SEnji Cooper 34757718be8SEnji Cooper if (fd != -1 || errno != EMFILE) 34857718be8SEnji Cooper _exit(EX_DATAERR); 34957718be8SEnji Cooper 35057718be8SEnji Cooper _exit(EXIT_SUCCESS); 35157718be8SEnji Cooper } 35257718be8SEnji Cooper 35357718be8SEnji Cooper (void)wait(&sta); 35457718be8SEnji Cooper 35557718be8SEnji Cooper if (WIFEXITED(sta) == 0 || WEXITSTATUS(sta) != EXIT_SUCCESS) { 35657718be8SEnji Cooper 35757718be8SEnji Cooper if (WEXITSTATUS(sta) == EX_OSERR) 35857718be8SEnji Cooper atf_tc_fail("system call error"); 35957718be8SEnji Cooper 36057718be8SEnji Cooper if (WEXITSTATUS(sta) == EX_DATAERR) 36157718be8SEnji Cooper atf_tc_fail("dup(2) dupped more than RLIMIT_NOFILE"); 36257718be8SEnji Cooper 36357718be8SEnji Cooper atf_tc_fail("unknown error"); 36457718be8SEnji Cooper } 36557718be8SEnji Cooper 36657718be8SEnji Cooper (void)unlink(path); 36757718be8SEnji Cooper } 36857718be8SEnji Cooper 36957718be8SEnji Cooper ATF_TC_CLEANUP(dup_max, tc) 37057718be8SEnji Cooper { 37157718be8SEnji Cooper (void)unlink(path); 37257718be8SEnji Cooper } 37357718be8SEnji Cooper 37457718be8SEnji Cooper ATF_TC_WITH_CLEANUP(dup_mode); 37557718be8SEnji Cooper ATF_TC_HEAD(dup_mode, tc) 37657718be8SEnji Cooper { 37757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "A basic test of dup(2)"); 37857718be8SEnji Cooper } 37957718be8SEnji Cooper 38057718be8SEnji Cooper ATF_TC_BODY(dup_mode, tc) 38157718be8SEnji Cooper { 38257718be8SEnji Cooper check_mode(true, false, false); 38357718be8SEnji Cooper } 38457718be8SEnji Cooper 38557718be8SEnji Cooper ATF_TC_CLEANUP(dup_mode, tc) 38657718be8SEnji Cooper { 38757718be8SEnji Cooper (void)unlink(path); 38857718be8SEnji Cooper } 38957718be8SEnji Cooper 39057718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 39157718be8SEnji Cooper { 39257718be8SEnji Cooper 39357718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup2_basic); 39457718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup2_err); 39557718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup2_max); 39657718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup2_mode); 39757718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup3_err); 39857718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup3_max); 39957718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup3_mode); 40057718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup_err); 40157718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup_max); 40257718be8SEnji Cooper ATF_TP_ADD_TC(tp, dup_mode); 40357718be8SEnji Cooper 40457718be8SEnji Cooper return atf_no_error(); 40557718be8SEnji Cooper } 406