xref: /minix3/external/bsd/kyua-cli/dist/utils/process/child.ipp (revision 11be35a165022172ed3cea20f2b5df0307540b0e)
1*11be35a1SLionel Sambuc// Copyright 2010 Google Inc.
2*11be35a1SLionel Sambuc// All rights reserved.
3*11be35a1SLionel Sambuc//
4*11be35a1SLionel Sambuc// Redistribution and use in source and binary forms, with or without
5*11be35a1SLionel Sambuc// modification, are permitted provided that the following conditions are
6*11be35a1SLionel Sambuc// met:
7*11be35a1SLionel Sambuc//
8*11be35a1SLionel Sambuc// * Redistributions of source code must retain the above copyright
9*11be35a1SLionel Sambuc//   notice, this list of conditions and the following disclaimer.
10*11be35a1SLionel Sambuc// * Redistributions in binary form must reproduce the above copyright
11*11be35a1SLionel Sambuc//   notice, this list of conditions and the following disclaimer in the
12*11be35a1SLionel Sambuc//   documentation and/or other materials provided with the distribution.
13*11be35a1SLionel Sambuc// * Neither the name of Google Inc. nor the names of its contributors
14*11be35a1SLionel Sambuc//   may be used to endorse or promote products derived from this software
15*11be35a1SLionel Sambuc//   without specific prior written permission.
16*11be35a1SLionel Sambuc//
17*11be35a1SLionel Sambuc// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*11be35a1SLionel Sambuc// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*11be35a1SLionel Sambuc// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*11be35a1SLionel Sambuc// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*11be35a1SLionel Sambuc// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*11be35a1SLionel Sambuc// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*11be35a1SLionel Sambuc// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*11be35a1SLionel Sambuc// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*11be35a1SLionel Sambuc// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*11be35a1SLionel Sambuc// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*11be35a1SLionel Sambuc// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*11be35a1SLionel Sambuc
29*11be35a1SLionel Sambuc#if !defined(UTILS_PROCESS_CHILD_IPP)
30*11be35a1SLionel Sambuc#define UTILS_PROCESS_CHILD_IPP
31*11be35a1SLionel Sambuc
32*11be35a1SLionel Sambuc#include <cstdlib>
33*11be35a1SLionel Sambuc
34*11be35a1SLionel Sambuc#include "utils/process/child.hpp"
35*11be35a1SLionel Sambuc
36*11be35a1SLionel Sambucnamespace utils {
37*11be35a1SLionel Sambucnamespace process {
38*11be35a1SLionel Sambuc
39*11be35a1SLionel Sambuc
40*11be35a1SLionel Sambuc/// Spawns a new subprocess and redirects its stdout and stderr to files.
41*11be35a1SLionel Sambuc///
42*11be35a1SLionel Sambuc/// If the subprocess cannot be completely set up for any reason, it attempts to
43*11be35a1SLionel Sambuc/// dump an error message to its stderr channel and it then calls std::abort().
44*11be35a1SLionel Sambuc///
45*11be35a1SLionel Sambuc/// \param hook The function to execute in the subprocess.  Must not return.
46*11be35a1SLionel Sambuc/// \param stdout_file The name of the file in which to store the stdout.
47*11be35a1SLionel Sambuc/// \param stderr_file The name of the file in which to store the stderr.
48*11be35a1SLionel Sambuc///
49*11be35a1SLionel Sambuc/// \return A new child object, returned as a dynamically-allocated object
50*11be35a1SLionel Sambuc/// because children classes are unique and thus noncopyable.
51*11be35a1SLionel Sambuc///
52*11be35a1SLionel Sambuc/// \throw process::system_error If the process cannot be spawned due to a
53*11be35a1SLionel Sambuc///     system call error.
54*11be35a1SLionel Sambuctemplate< typename Hook >
55*11be35a1SLionel Sambucstd::auto_ptr< child >
56*11be35a1SLionel Sambucchild::fork_files(Hook hook, const fs::path& stdout_file,
57*11be35a1SLionel Sambuc                  const fs::path& stderr_file)
58*11be35a1SLionel Sambuc{
59*11be35a1SLionel Sambuc    std::auto_ptr< child > child = fork_files_aux(stdout_file, stderr_file);
60*11be35a1SLionel Sambuc    if (child.get() == NULL) {
61*11be35a1SLionel Sambuc        try {
62*11be35a1SLionel Sambuc            hook();
63*11be35a1SLionel Sambuc            std::abort();
64*11be35a1SLionel Sambuc        } catch (...) {
65*11be35a1SLionel Sambuc            std::abort();
66*11be35a1SLionel Sambuc        }
67*11be35a1SLionel Sambuc    }
68*11be35a1SLionel Sambuc
69*11be35a1SLionel Sambuc    return child;
70*11be35a1SLionel Sambuc}
71*11be35a1SLionel Sambuc
72*11be35a1SLionel Sambuc
73*11be35a1SLionel Sambuc/// Spawns a new subprocess and multiplexes and captures its stdout and stderr.
74*11be35a1SLionel Sambuc///
75*11be35a1SLionel Sambuc/// If the subprocess cannot be completely set up for any reason, it attempts to
76*11be35a1SLionel Sambuc/// dump an error message to its stderr channel and it then calls std::abort().
77*11be35a1SLionel Sambuc///
78*11be35a1SLionel Sambuc/// \param hook The function to execute in the subprocess.  Must not return.
79*11be35a1SLionel Sambuc///
80*11be35a1SLionel Sambuc/// \return A new child object, returned as a dynamically-allocated object
81*11be35a1SLionel Sambuc/// because children classes are unique and thus noncopyable.
82*11be35a1SLionel Sambuc///
83*11be35a1SLionel Sambuc/// \throw process::system_error If the process cannot be spawned due to a
84*11be35a1SLionel Sambuc///     system call error.
85*11be35a1SLionel Sambuctemplate< typename Hook >
86*11be35a1SLionel Sambucstd::auto_ptr< child >
87*11be35a1SLionel Sambucchild::fork_capture(Hook hook)
88*11be35a1SLionel Sambuc{
89*11be35a1SLionel Sambuc    std::auto_ptr< child > child = fork_capture_aux();
90*11be35a1SLionel Sambuc    if (child.get() == NULL) {
91*11be35a1SLionel Sambuc        try {
92*11be35a1SLionel Sambuc            hook();
93*11be35a1SLionel Sambuc            std::abort();
94*11be35a1SLionel Sambuc        } catch (...) {
95*11be35a1SLionel Sambuc            std::abort();
96*11be35a1SLionel Sambuc        }
97*11be35a1SLionel Sambuc    }
98*11be35a1SLionel Sambuc
99*11be35a1SLionel Sambuc    return child;
100*11be35a1SLionel Sambuc}
101*11be35a1SLionel Sambuc
102*11be35a1SLionel Sambuc
103*11be35a1SLionel Sambuc}  // namespace process
104*11be35a1SLionel Sambuc}  // namespace utils
105*11be35a1SLionel Sambuc
106*11be35a1SLionel Sambuc#endif  // !defined(UTILS_PROCESS_CHILD_IPP)
107