process.h revision 240116
1266733Speter/*
2266733Speter * Automated Testing Framework (atf)
3266733Speter *
4266733Speter * Copyright (c) 2008 The NetBSD Foundation, Inc.
5266733Speter * All rights reserved.
6266733Speter *
7266733Speter * Redistribution and use in source and binary forms, with or without
8266733Speter * modification, are permitted provided that the following conditions
9266733Speter * are met:
10266733Speter * 1. Redistributions of source code must retain the above copyright
11266733Speter *    notice, this list of conditions and the following disclaimer.
12266733Speter * 2. Redistributions in binary form must reproduce the above copyright
13266733Speter *    notice, this list of conditions and the following disclaimer in the
14266733Speter *    documentation and/or other materials provided with the distribution.
15266733Speter *
16266733Speter * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17266733Speter * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18266733Speter * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19266733Speter * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20266733Speter * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21266733Speter * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22266733Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23266733Speter * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24266733Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25266733Speter * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26266733Speter * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27266733Speter * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28266733Speter */
29266733Speter
30266733Speter#if !defined(ATF_C_PROCESS_H)
31266733Speter#define ATF_C_PROCESS_H
32266733Speter
33266733Speter#include <sys/types.h>
34266733Speter
35266733Speter#include <stdbool.h>
36266733Speter
37266733Speter#include <atf-c/error_fwd.h>
38266733Speter
39266733Speter#include "fs.h"
40266733Speter#include "list.h"
41266733Speter
42266733Speter/* ---------------------------------------------------------------------
43286503Speter * The "atf_process_stream" type.
44286503Speter * --------------------------------------------------------------------- */
45286503Speter
46266733Speterstruct atf_process_stream {
47266733Speter    int m_type;
48266733Speter
49266733Speter    /* Valid if m_type == connect. */
50266733Speter    int m_src_fd;
51266733Speter    int m_tgt_fd;
52266733Speter
53266733Speter    /* Valid if m_type == redirect_fd. */
54266733Speter    int m_fd;
55266733Speter
56266733Speter    /* Valid if m_type == redirect_path. */
57266733Speter    const atf_fs_path_t *m_path;
58266733Speter};
59266733Spetertypedef struct atf_process_stream atf_process_stream_t;
60266733Speter
61266733Speterextern const int atf_process_stream_type_capture;
62266733Speterextern const int atf_process_stream_type_connect;
63266733Speterextern const int atf_process_stream_type_inherit;
64266733Speterextern const int atf_process_stream_type_redirect_fd;
65266733Speterextern const int atf_process_stream_type_redirect_path;
66266733Speter
67266733Speteratf_error_t atf_process_stream_init_capture(atf_process_stream_t *);
68266733Speteratf_error_t atf_process_stream_init_connect(atf_process_stream_t *,
69266733Speter                                            const int, const int);
70266733Speteratf_error_t atf_process_stream_init_inherit(atf_process_stream_t *);
71266733Speteratf_error_t atf_process_stream_init_redirect_fd(atf_process_stream_t *,
72266733Speter                                                const int fd);
73266733Speteratf_error_t atf_process_stream_init_redirect_path(atf_process_stream_t *,
74266733Speter                                                  const atf_fs_path_t *);
75266733Spetervoid atf_process_stream_fini(atf_process_stream_t *);
76266733Speter
77266733Speterint atf_process_stream_type(const atf_process_stream_t *);
78266733Speter
79266733Speter/* ---------------------------------------------------------------------
80266733Speter * The "atf_process_status" type.
81266733Speter * --------------------------------------------------------------------- */
82266733Speter
83266733Speterstruct atf_process_status {
84266733Speter    int m_status;
85266733Speter};
86266733Spetertypedef struct atf_process_status atf_process_status_t;
87266733Speter
88266733Spetervoid atf_process_status_fini(atf_process_status_t *);
89266733Speter
90266733Speterbool atf_process_status_exited(const atf_process_status_t *);
91266733Speterint atf_process_status_exitstatus(const atf_process_status_t *);
92266733Speterbool atf_process_status_signaled(const atf_process_status_t *);
93266733Speterint atf_process_status_termsig(const atf_process_status_t *);
94266733Speterbool atf_process_status_coredump(const atf_process_status_t *);
95266733Speter
96266733Speter/* ---------------------------------------------------------------------
97266733Speter * The "atf_process_child" type.
98266733Speter * --------------------------------------------------------------------- */
99266733Speter
100266733Speterstruct atf_process_child {
101266733Speter    pid_t m_pid;
102266733Speter
103266733Speter    int m_stdout;
104266733Speter    int m_stderr;
105266733Speter};
106266733Spetertypedef struct atf_process_child atf_process_child_t;
107266733Speter
108266733Speteratf_error_t atf_process_child_wait(atf_process_child_t *,
109266733Speter                                   atf_process_status_t *);
110266733Speterpid_t atf_process_child_pid(const atf_process_child_t *);
111266733Speterint atf_process_child_stdout(atf_process_child_t *);
112266733Speterint atf_process_child_stderr(atf_process_child_t *);
113266733Speter
114266733Speter/* ---------------------------------------------------------------------
115266733Speter * Free functions.
116266733Speter * --------------------------------------------------------------------- */
117266733Speter
118266733Speteratf_error_t atf_process_fork(atf_process_child_t *,
119266733Speter                             void (*)(void *),
120266733Speter                             const atf_process_stream_t *,
121266733Speter                             const atf_process_stream_t *,
122266733Speter                             void *);
123266733Speteratf_error_t atf_process_exec_array(atf_process_status_t *,
124266733Speter                                   const atf_fs_path_t *,
125266733Speter                                   const char *const *,
126266733Speter                                   const atf_process_stream_t *,
127266733Speter                                   const atf_process_stream_t *,
128266733Speter                                   void (*)(void));
129266733Speteratf_error_t atf_process_exec_list(atf_process_status_t *,
130266733Speter                                  const atf_fs_path_t *,
131266733Speter                                  const atf_list_t *,
132266733Speter                                  const atf_process_stream_t *,
133266733Speter                                  const atf_process_stream_t *,
134266733Speter                                  void (*)(void));
135266733Speter
136266733Speter#endif /* !defined(ATF_C_PROCESS_H) */
137266733Speter