1*f9021888SMariusz Zaborski /*- 2*f9021888SMariusz Zaborski * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*f9021888SMariusz Zaborski * Copyright 2014 Jonathan Anderson. 4*f9021888SMariusz Zaborski * Copyright 2021 Mariusz Zaborski <oshogbo@FreeBSD.org> 5*f9021888SMariusz Zaborski * 6*f9021888SMariusz Zaborski * Redistribution and use in source and binary forms, with or without 7*f9021888SMariusz Zaborski * modification, are permitted provided that the following conditions 8*f9021888SMariusz Zaborski * are met: 9*f9021888SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright 10*f9021888SMariusz Zaborski * notice, this list of conditions and the following disclaimer. 11*f9021888SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright 12*f9021888SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the 13*f9021888SMariusz Zaborski * documentation and/or other materials provided with the distribution. 14*f9021888SMariusz Zaborski * 15*f9021888SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*f9021888SMariusz Zaborski * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*f9021888SMariusz Zaborski * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*f9021888SMariusz Zaborski * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*f9021888SMariusz Zaborski * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*f9021888SMariusz Zaborski * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*f9021888SMariusz Zaborski * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*f9021888SMariusz Zaborski * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*f9021888SMariusz Zaborski * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*f9021888SMariusz Zaborski * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*f9021888SMariusz Zaborski * 26*f9021888SMariusz Zaborski * $FreeBSD$ 27*f9021888SMariusz Zaborski */ 28*f9021888SMariusz Zaborski 29*f9021888SMariusz Zaborski #include <atf-c.h> 30*f9021888SMariusz Zaborski #include <fcntl.h> 31*f9021888SMariusz Zaborski #include <stdio.h> 32*f9021888SMariusz Zaborski 33*f9021888SMariusz Zaborski #include "common.h" 34*f9021888SMariusz Zaborski 35*f9021888SMariusz Zaborski void 36*f9021888SMariusz Zaborski expect_success(int binary, char *senv) 37*f9021888SMariusz Zaborski { 38*f9021888SMariusz Zaborski char * const env[] = { senv, NULL }; 39*f9021888SMariusz Zaborski 40*f9021888SMariusz Zaborski try_to_run(binary, 0, env, "the hypotenuse of 3 and 4 is 5\n", ""); 41*f9021888SMariusz Zaborski } 42*f9021888SMariusz Zaborski 43*f9021888SMariusz Zaborski void 44*f9021888SMariusz Zaborski expect_missing_library(int binary, char *senv) 45*f9021888SMariusz Zaborski { 46*f9021888SMariusz Zaborski char * const env[] = { senv, NULL }; 47*f9021888SMariusz Zaborski 48*f9021888SMariusz Zaborski try_to_run(binary, 1, env, "", 49*f9021888SMariusz Zaborski "ld-elf.so.1: Shared object \"libpythagoras.so.0\" not found," 50*f9021888SMariusz Zaborski " required by \"target\"\n"); 51*f9021888SMariusz Zaborski } 52*f9021888SMariusz Zaborski 53*f9021888SMariusz Zaborski void 54*f9021888SMariusz Zaborski try_to_run(int binary, int exit_status, char * const *env, 55*f9021888SMariusz Zaborski const char *expected_out, const char *expected_err) 56*f9021888SMariusz Zaborski { 57*f9021888SMariusz Zaborski pid_t child = atf_utils_fork(); 58*f9021888SMariusz Zaborski 59*f9021888SMariusz Zaborski if (child == 0) { 60*f9021888SMariusz Zaborski char * const args[] = { "target", NULL }; 61*f9021888SMariusz Zaborski 62*f9021888SMariusz Zaborski fexecve(binary, args, env); 63*f9021888SMariusz Zaborski atf_tc_fail("fexecve() failed"); 64*f9021888SMariusz Zaborski } 65*f9021888SMariusz Zaborski 66*f9021888SMariusz Zaborski atf_utils_wait(child, exit_status, expected_out, expected_err); 67*f9021888SMariusz Zaborski } 68*f9021888SMariusz Zaborski 69*f9021888SMariusz Zaborski int 70*f9021888SMariusz Zaborski opendir(const char *name) 71*f9021888SMariusz Zaborski { 72*f9021888SMariusz Zaborski 73*f9021888SMariusz Zaborski return open(name, O_RDONLY | O_DIRECTORY); 74*f9021888SMariusz Zaborski } 75*f9021888SMariusz Zaborski 76*f9021888SMariusz Zaborski int 77*f9021888SMariusz Zaborski opendirat(int parent, const char *name) 78*f9021888SMariusz Zaborski { 79*f9021888SMariusz Zaborski 80*f9021888SMariusz Zaborski return openat(parent, name, O_RDONLY | O_DIRECTORY); 81*f9021888SMariusz Zaborski } 82