1*c243e490SMarcel Moolenaar /* 2*c243e490SMarcel Moolenaar * Automated Testing Framework (atf) 3*c243e490SMarcel Moolenaar * 4*c243e490SMarcel Moolenaar * Copyright (c) 2008 The NetBSD Foundation, Inc. 5*c243e490SMarcel Moolenaar * All rights reserved. 6*c243e490SMarcel Moolenaar * 7*c243e490SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 8*c243e490SMarcel Moolenaar * modification, are permitted provided that the following conditions 9*c243e490SMarcel Moolenaar * are met: 10*c243e490SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 11*c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 12*c243e490SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 13*c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 14*c243e490SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 15*c243e490SMarcel Moolenaar * 16*c243e490SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17*c243e490SMarcel Moolenaar * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18*c243e490SMarcel Moolenaar * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*c243e490SMarcel Moolenaar * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*c243e490SMarcel Moolenaar * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21*c243e490SMarcel Moolenaar * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*c243e490SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23*c243e490SMarcel Moolenaar * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*c243e490SMarcel Moolenaar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25*c243e490SMarcel Moolenaar * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26*c243e490SMarcel Moolenaar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*c243e490SMarcel Moolenaar * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*c243e490SMarcel Moolenaar */ 29*c243e490SMarcel Moolenaar 30*c243e490SMarcel Moolenaar #if !defined(ATF_C_PROCESS_H) 31*c243e490SMarcel Moolenaar #define ATF_C_PROCESS_H 32*c243e490SMarcel Moolenaar 33*c243e490SMarcel Moolenaar #include <sys/types.h> 34*c243e490SMarcel Moolenaar 35*c243e490SMarcel Moolenaar #include <stdbool.h> 36*c243e490SMarcel Moolenaar 37*c243e490SMarcel Moolenaar #include <atf-c/error_fwd.h> 38*c243e490SMarcel Moolenaar 39*c243e490SMarcel Moolenaar #include "fs.h" 40*c243e490SMarcel Moolenaar #include "list.h" 41*c243e490SMarcel Moolenaar 42*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 43*c243e490SMarcel Moolenaar * The "atf_process_stream" type. 44*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 45*c243e490SMarcel Moolenaar 46*c243e490SMarcel Moolenaar struct atf_process_stream { 47*c243e490SMarcel Moolenaar int m_type; 48*c243e490SMarcel Moolenaar 49*c243e490SMarcel Moolenaar /* Valid if m_type == connect. */ 50*c243e490SMarcel Moolenaar int m_src_fd; 51*c243e490SMarcel Moolenaar int m_tgt_fd; 52*c243e490SMarcel Moolenaar 53*c243e490SMarcel Moolenaar /* Valid if m_type == redirect_fd. */ 54*c243e490SMarcel Moolenaar int m_fd; 55*c243e490SMarcel Moolenaar 56*c243e490SMarcel Moolenaar /* Valid if m_type == redirect_path. */ 57*c243e490SMarcel Moolenaar const atf_fs_path_t *m_path; 58*c243e490SMarcel Moolenaar }; 59*c243e490SMarcel Moolenaar typedef struct atf_process_stream atf_process_stream_t; 60*c243e490SMarcel Moolenaar 61*c243e490SMarcel Moolenaar extern const int atf_process_stream_type_capture; 62*c243e490SMarcel Moolenaar extern const int atf_process_stream_type_connect; 63*c243e490SMarcel Moolenaar extern const int atf_process_stream_type_inherit; 64*c243e490SMarcel Moolenaar extern const int atf_process_stream_type_redirect_fd; 65*c243e490SMarcel Moolenaar extern const int atf_process_stream_type_redirect_path; 66*c243e490SMarcel Moolenaar 67*c243e490SMarcel Moolenaar atf_error_t atf_process_stream_init_capture(atf_process_stream_t *); 68*c243e490SMarcel Moolenaar atf_error_t atf_process_stream_init_connect(atf_process_stream_t *, 69*c243e490SMarcel Moolenaar const int, const int); 70*c243e490SMarcel Moolenaar atf_error_t atf_process_stream_init_inherit(atf_process_stream_t *); 71*c243e490SMarcel Moolenaar atf_error_t atf_process_stream_init_redirect_fd(atf_process_stream_t *, 72*c243e490SMarcel Moolenaar const int fd); 73*c243e490SMarcel Moolenaar atf_error_t atf_process_stream_init_redirect_path(atf_process_stream_t *, 74*c243e490SMarcel Moolenaar const atf_fs_path_t *); 75*c243e490SMarcel Moolenaar void atf_process_stream_fini(atf_process_stream_t *); 76*c243e490SMarcel Moolenaar 77*c243e490SMarcel Moolenaar int atf_process_stream_type(const atf_process_stream_t *); 78*c243e490SMarcel Moolenaar 79*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 80*c243e490SMarcel Moolenaar * The "atf_process_status" type. 81*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 82*c243e490SMarcel Moolenaar 83*c243e490SMarcel Moolenaar struct atf_process_status { 84*c243e490SMarcel Moolenaar int m_status; 85*c243e490SMarcel Moolenaar }; 86*c243e490SMarcel Moolenaar typedef struct atf_process_status atf_process_status_t; 87*c243e490SMarcel Moolenaar 88*c243e490SMarcel Moolenaar void atf_process_status_fini(atf_process_status_t *); 89*c243e490SMarcel Moolenaar 90*c243e490SMarcel Moolenaar bool atf_process_status_exited(const atf_process_status_t *); 91*c243e490SMarcel Moolenaar int atf_process_status_exitstatus(const atf_process_status_t *); 92*c243e490SMarcel Moolenaar bool atf_process_status_signaled(const atf_process_status_t *); 93*c243e490SMarcel Moolenaar int atf_process_status_termsig(const atf_process_status_t *); 94*c243e490SMarcel Moolenaar bool atf_process_status_coredump(const atf_process_status_t *); 95*c243e490SMarcel Moolenaar 96*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 97*c243e490SMarcel Moolenaar * The "atf_process_child" type. 98*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 99*c243e490SMarcel Moolenaar 100*c243e490SMarcel Moolenaar struct atf_process_child { 101*c243e490SMarcel Moolenaar pid_t m_pid; 102*c243e490SMarcel Moolenaar 103*c243e490SMarcel Moolenaar int m_stdout; 104*c243e490SMarcel Moolenaar int m_stderr; 105*c243e490SMarcel Moolenaar }; 106*c243e490SMarcel Moolenaar typedef struct atf_process_child atf_process_child_t; 107*c243e490SMarcel Moolenaar 108*c243e490SMarcel Moolenaar atf_error_t atf_process_child_wait(atf_process_child_t *, 109*c243e490SMarcel Moolenaar atf_process_status_t *); 110*c243e490SMarcel Moolenaar pid_t atf_process_child_pid(const atf_process_child_t *); 111*c243e490SMarcel Moolenaar int atf_process_child_stdout(atf_process_child_t *); 112*c243e490SMarcel Moolenaar int atf_process_child_stderr(atf_process_child_t *); 113*c243e490SMarcel Moolenaar 114*c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 115*c243e490SMarcel Moolenaar * Free functions. 116*c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 117*c243e490SMarcel Moolenaar 118*c243e490SMarcel Moolenaar atf_error_t atf_process_fork(atf_process_child_t *, 119*c243e490SMarcel Moolenaar void (*)(void *), 120*c243e490SMarcel Moolenaar const atf_process_stream_t *, 121*c243e490SMarcel Moolenaar const atf_process_stream_t *, 122*c243e490SMarcel Moolenaar void *); 123*c243e490SMarcel Moolenaar atf_error_t atf_process_exec_array(atf_process_status_t *, 124*c243e490SMarcel Moolenaar const atf_fs_path_t *, 125*c243e490SMarcel Moolenaar const char *const *, 126*c243e490SMarcel Moolenaar const atf_process_stream_t *, 127*c243e490SMarcel Moolenaar const atf_process_stream_t *, 128*c243e490SMarcel Moolenaar void (*)(void)); 129*c243e490SMarcel Moolenaar atf_error_t atf_process_exec_list(atf_process_status_t *, 130*c243e490SMarcel Moolenaar const atf_fs_path_t *, 131*c243e490SMarcel Moolenaar const atf_list_t *, 132*c243e490SMarcel Moolenaar const atf_process_stream_t *, 133*c243e490SMarcel Moolenaar const atf_process_stream_t *, 134*c243e490SMarcel Moolenaar void (*)(void)); 135*c243e490SMarcel Moolenaar 136*c243e490SMarcel Moolenaar #endif /* !defined(ATF_C_PROCESS_H) */ 137