http://git-wip-us.apache.org/repos/asf/mesos-site/blob/09fd0301/content/api/latest/c++/subprocess__posix_8hpp_source.html
----------------------------------------------------------------------
diff --git a/content/api/latest/c++/subprocess__posix_8hpp_source.html
b/content/api/latest/c++/subprocess__posix_8hpp_source.html
deleted file mode 100644
index a28663c..0000000
--- a/content/api/latest/c++/subprocess__posix_8hpp_source.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.11"/>
-<title>Apache Mesos: 3rdparty/libprocess/src/subprocess_posix.hpp Source
File</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
- <td id="projectalign" style="padding-left: 0.5em;">
- <div id="projectname">Apache Mesos
- </div>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.11 -->
- <div id="navrow1" class="tabs">
- <ul class="tablist">
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- <li><a href="examples.html"><span>Examples</span></a></li>
- </ul>
- </div>
- <div id="navrow2" class="tabs2">
- <ul class="tablist">
- <li><a href="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
- </ul>
- </div>
-<div id="nav-path" class="navpath">
- <ul>
-<li class="navelem"><a class="el"
href="dir_8cab8f464681f7cc51cee77e79a434cd.html">3rdparty</a></li><li
class="navelem"><a class="el"
href="dir_043a76de98701f9bddf61b5e98f305ff.html">libprocess</a></li><li
class="navelem"><a class="el"
href="dir_01cbbd8dcbf9de3825992568658f467e.html">src</a></li> </ul>
-</div>
-</div><!-- top -->
-<div class="header">
- <div class="headertitle">
-<div class="title">subprocess_posix.hpp</div> </div>
-</div><!--header-->
-<div class="contents">
-<a href="subprocess__posix_8hpp.html">Go to the documentation of this
file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span
class="lineno"> 1</span> <span class="comment">// Licensed under the
Apache License, Version 2.0 (the "License");</span></div><div
class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span
class="comment">// you may not use this file except in compliance with the
License.</span></div><div class="line"><a name="l00003"></a><span
class="lineno"> 3</span> <span class="comment">// You may obtain a copy
of the License at</span></div><div class="line"><a name="l00004"></a><span
class="lineno"> 4</span> <span class="comment">//</span></div><div
class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span
class="comment">//
http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a
name="l00006"></a><span class="lineno"> 6</span> <span class="comm
ent">//</span></div><div class="line"><a name="l00007"></a><span
class="lineno"> 7</span> <span class="comment">// Unless required by
applicable law or agreed to in writing, software</span></div><div
class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span
class="comment">// distributed under the License is distributed on an "AS
IS" BASIS,</span></div><div class="line"><a name="l00009"></a><span
class="lineno"> 9</span> <span class="comment">// WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.</span></div><div
class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span
class="comment">// See the License for the specific language governing
permissions and</span></div><div class="line"><a name="l00011"></a><span
class="lineno"> 11</span> <span class="comment">// limitations under the
License</span></div><div class="line"><a name="l00012"></a><span
class="lineno"> 12</span> </div><di
v class="line"><a name="l00013"></a><span class="lineno">
13</span> <span class="preprocessor">#ifndef
__PROCESS_POSIX_SUBPROCESS_HPP__</span></div><div class="line"><a
name="l00014"></a><span class="lineno"> 14</span> <span
class="preprocessor">#define __PROCESS_POSIX_SUBPROCESS_HPP__</span></div><div
class="line"><a name="l00015"></a><span class="lineno">
15</span> </div><div class="line"><a name="l00016"></a><span
class="lineno"> 16</span> <span class="preprocessor">#ifdef
__linux__</span></div><div class="line"><a name="l00017"></a><span
class="lineno"> 17</span> <span class="preprocessor">#include
<sys/prctl.h></span></div><div class="line"><a name="l00018"></a><span
class="lineno"> 18</span> <span class="preprocessor">#endif //
__linux__</span></div><div class="line"><a name="l00019"></a><span
class="lineno"> 19</span> <span class="preprocessor">#include
<sys/types.h></span></div><div class="line"><a name="l00020"></
a><span class="lineno"> 20</span> </div><div class="line"><a
name="l00021"></a><span class="lineno"> 21</span> <span
class="preprocessor">#include <string></span></div><div class="line"><a
name="l00022"></a><span class="lineno"> 22</span> </div><div
class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span
class="preprocessor">#include <glog/logging.h></span></div><div
class="line"><a name="l00024"></a><span class="lineno">
24</span> </div><div class="line"><a name="l00025"></a><span
class="lineno"> 25</span> <span class="preprocessor">#include <<a
class="code"
href="subprocess_8hpp.html">process/subprocess.hpp</a>></span></div><div
class="line"><a name="l00026"></a><span class="lineno">
26</span> </div><div class="line"><a name="l00027"></a><span
class="lineno"> 27</span> <span class="preprocessor">#include <<a
class="code"
href="stout_2include_2stout_2check_8hpp.html">stout/check.hpp</a>>
</span></div><div class="line"><a name="l00028"></a><span class="lineno">
28</span> <span class="preprocessor">#include <<a class="code"
href="error_8hpp.html">stout/error.hpp</a>></span></div><div class="line"><a
name="l00029"></a><span class="lineno"> 29</span> <span
class="preprocessor">#include <<a class="code"
href="exit_8hpp.html">stout/exit.hpp</a>></span></div><div class="line"><a
name="l00030"></a><span class="lineno"> 30</span> <span
class="preprocessor">#include <<a class="code"
href="foreach_8hpp.html">stout/foreach.hpp</a>></span></div><div
class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span
class="preprocessor">#include <<a class="code"
href="hashset_8hpp.html">stout/hashset.hpp</a>></span></div><div
class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span
class="preprocessor">#include <<a class="code"
href="nothing_8hpp.html">stout/nothing.hpp</a>></span></div><div clas
s="line"><a name="l00033"></a><span class="lineno"> 33</span> <span
class="preprocessor">#include <<a class="code"
href="lambda_8hpp.html">stout/lambda.hpp</a>></span></div><div
class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span
class="preprocessor">#include <<a class="code"
href="none_8hpp.html">stout/none.hpp</a>></span></div><div class="line"><a
name="l00035"></a><span class="lineno"> 35</span> <span
class="preprocessor">#include <<a class="code"
href="option_8hpp.html">stout/option.hpp</a>></span></div><div
class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span
class="preprocessor">#include <<a class="code"
href="os_8hpp.html">stout/os.hpp</a>></span></div><div class="line"><a
name="l00037"></a><span class="lineno"> 37</span> <span
class="preprocessor">#include <<a class="code"
href="try_8hpp.html">stout/try.hpp</a>></span></div><div class="line"><a
name="l00038"></a><span clas
s="lineno"> 38</span> <span class="preprocessor">#include <<a
class="code"
href="unreachable_8hpp.html">stout/unreachable.hpp</a>></span></div><div
class="line"><a name="l00039"></a><span class="lineno">
39</span> </div><div class="line"><a name="l00040"></a><span
class="lineno"> 40</span> <span class="preprocessor">#include <<a
class="code" href="close_8hpp.html">stout/os/close.hpp</a>></span></div><div
class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span
class="preprocessor">#include <<a class="code"
href="3rdparty_2stout_2include_2stout_2os_2environment_8hpp.html">stout/os/environment.hpp</a>></span></div><div
class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span
class="preprocessor">#include <<a class="code"
href="fcntl_8hpp.html">stout/os/fcntl.hpp</a>></span></div><div
class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span
class="preprocessor">#include <<a
class="code"
href="signals_8hpp.html">stout/os/signals.hpp</a>></span></div><div
class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span
class="preprocessor">#include <<a class="code"
href="strerror_8hpp.html">stout/os/strerror.hpp</a>></span></div><div
class="line"><a name="l00045"></a><span class="lineno">
45</span> </div><div class="line"><a name="l00046"></a><span
class="lineno"> 46</span> <span class="keyword">namespace </span><a
class="code" href="namespaceprocess.html">process</a> {</div><div
class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span
class="keyword">namespace </span><a class="code"
href="namespaceinternal.html">internal</a> {</div><div class="line"><a
name="l00048"></a><span class="lineno"> 48</span> </div><div
class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span
class="keyword">static</span> <span class="keywordtype">void</span>
close(std::initializer_list<
int_fd> fds);</div><div class="line"><a name="l00050"></a><span
class="lineno"> 50</span> </div><div class="line"><a
name="l00051"></a><span class="lineno"> 51</span> </div><div
class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span
class="keyword">static</span> <span class="keywordtype">void</span>
close(</div><div class="line"><a name="l00053"></a><span class="lineno">
53</span>  <span class="keyword">const</span> <a class="code"
href="namespaceprocess.html#afc6611c4913642642277b44447a16e55">Subprocess::IO::InputFileDescriptors</a>&
stdinfds,</div><div class="line"><a name="l00054"></a><span class="lineno">
54</span>  <span class="keyword">const</span> <a class="code"
href="namespaceprocess.html#a882829822afa4f33b90aafc9c4ffa9af">Subprocess::IO::OutputFileDescriptors</a>&
stdoutfds,</div><div class="line"><a name="l00055"></a><span class="lineno">
55</span>  <span class="keyword">const</span> <a class="
code"
href="namespaceprocess.html#a882829822afa4f33b90aafc9c4ffa9af">Subprocess::IO::OutputFileDescriptors</a>&
stderrfds);</div><div class="line"><a name="l00056"></a><span class="lineno">
56</span> </div><div class="line"><a name="l00057"></a><span
class="lineno"> 57</span> </div><div class="line"><a
name="l00058"></a><span class="lineno"><a class="line"
href="namespaceprocess_1_1internal.html#af2f19b6f367cddc0c8283560a9cd9215">
58</a></span> <span class="keyword">inline</span> <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a>
<a class="code"
href="namespaceprocess_1_1internal.html#af2f19b6f367cddc0c8283560a9cd9215">defaultClone</a>(<span
class="keyword">const</span> lambda::function<<span
class="keywordtype">int</span>()>& func)</div><div class="line"><a
name="l00059"></a><span class="lineno"> 59</span> {</div><div
class="line"><a name="l00060"></a><span class="lineno">
60</span>  <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a>
pid = ::fork();</div><div class="line"><a name="l00061"></a><span
class="lineno"> 61</span>  <span class="keywordflow">if</span> (pid ==
-1) {</div><div class="line"><a name="l00062"></a><span class="lineno">
62</span>  <span class="keywordflow">return</span> -1;</div><div
class="line"><a name="l00063"></a><span class="lineno"> 63</span>  }
<span class="keywordflow">else</span> <span class="keywordflow">if</span> (pid
== 0) {</div><div class="line"><a name="l00064"></a><span class="lineno">
64</span>  <span class="comment">// Child.</span></div><div
class="line"><a name="l00065"></a><span class="lineno"> 65</span> 
::exit(func());</div><div class="line"><a name="l00066"></a><span
class="lineno"> 66</span>  <a class="code"
href="unreachable_8hpp.html#a0bc63b24b654ca433be7b97a3edde132">UNREACHABL
E</a>();</div><div class="line"><a name="l00067"></a><span class="lineno">
67</span>  } <span class="keywordflow">else</span> {</div><div
class="line"><a name="l00068"></a><span class="lineno"> 68</span> 
<span class="comment">// Parent.</span></div><div class="line"><a
name="l00069"></a><span class="lineno"> 69</span>  <span
class="keywordflow">return</span> pid;</div><div class="line"><a
name="l00070"></a><span class="lineno"> 70</span>  }</div><div
class="line"><a name="l00071"></a><span class="lineno">
71</span> }</div><div class="line"><a name="l00072"></a><span
class="lineno"> 72</span> </div><div class="line"><a
name="l00073"></a><span class="lineno"> 73</span> </div><div
class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span
class="comment">// This function will invoke `os::cloexec` on all specified
file</span></div><div class="line"><a name="l00075"></a><span class="lineno">
75</span> <s
pan class="comment">// descriptors that are valid (i.e., not `None` and >=
0).</span></div><div class="line"><a name="l00076"></a><span class="lineno"><a
class="line"
href="namespaceprocess_1_1internal.html#a345a534b82b79bf20333fb6faef43e93">
76</a></span> <span class="keyword">inline</span> <a class="code"
href="classTry.html">Try<Nothing></a> <a class="code"
href="namespaceprocess_1_1internal.html#a345a534b82b79bf20333fb6faef43e93">cloexec</a>(</div><div
class="line"><a name="l00077"></a><span class="lineno"> 77</span> 
<span class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html">InputFileDescriptors</a>&
stdinfds,</div><div class="line"><a name="l00078"></a><span class="lineno">
78</span>  <span class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">OutputFileDescriptors</a>&
stdoutfds,</div><div class="line"><a name=
"l00079"></a><span class="lineno"> 79</span>  <span
class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">OutputFileDescriptors</a>&
stderrfds)</div><div class="line"><a name="l00080"></a><span class="lineno">
80</span> {</div><div class="line"><a name="l00081"></a><span
class="lineno"> 81</span>  <a class="code"
href="classhashset.html">hashset<int></a> fds = {</div><div
class="line"><a name="l00082"></a><span class="lineno"> 82</span> 
stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>,</div><div
class="line"><a name="l00083"></a><span class="lineno"> 83</span> 
stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#ab812da47364d793d9ec0471d3dc8c1bc">write</a>.<a
class="code"
href="classOption.html#abbbed1bc42634fa9092160b16be6ca7e">getOrElse
</a>(-1),</div><div class="line"><a name="l00084"></a><span class="lineno">
84</span>  stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c631a700d4be4410a250e3bce">read</a>.<a
class="code"
href="classOption.html#abbbed1bc42634fa9092160b16be6ca7e">getOrElse</a>(-1),</div><div
class="line"><a name="l00085"></a><span class="lineno"> 85</span> 
stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>,</div><div
class="line"><a name="l00086"></a><span class="lineno"> 86</span> 
stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c631a700d4be4410a250e3bce">read</a>.<a
class="code"
href="classOption.html#abbbed1bc42634fa9092160b16be6ca7e">getOrElse</a>(-1),</div><div
class="line"><a name="l00087"></a><span class="lineno"> 87</span> 
stderrfds.<a class="code" href=
"structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a></div><div
class="line"><a name="l00088"></a><span class="lineno"> 88</span> 
};</div><div class="line"><a name="l00089"></a><span class="lineno">
89</span> </div><div class="line"><a name="l00090"></a><span
class="lineno"> 90</span>  <span class="keywordflow">foreach</span>
(<span class="keywordtype">int</span> fd, fds) {</div><div class="line"><a
name="l00091"></a><span class="lineno"> 91</span>  <span
class="keywordflow">if</span> (fd >= 0) {</div><div class="line"><a
name="l00092"></a><span class="lineno"> 92</span>  <a class="code"
href="classTry.html">Try<Nothing></a> <a class="code"
href="namespaceprocess_1_1internal.html#a345a534b82b79bf20333fb6faef43e93">cloexec</a>
= <a class="code"
href="namespaceos.html#a7d71bda07a41304403b0e13aa47f0764">os::cloexec</a>(fd);</div><div
class="line"><a name="l00093"></a><span cla
ss="lineno"> 93</span>  <span class="keywordflow">if</span>
(cloexec.<a class="code"
href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>())
{</div><div class="line"><a name="l00094"></a><span class="lineno">
94</span>  <span class="keywordflow">return</span> <a class="code"
href="classError.html">Error</a>(cloexec.<a class="code"
href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div><div
class="line"><a name="l00095"></a><span class="lineno"> 95</span> 
}</div><div class="line"><a name="l00096"></a><span class="lineno">
96</span>  }</div><div class="line"><a name="l00097"></a><span
class="lineno"> 97</span>  }</div><div class="line"><a
name="l00098"></a><span class="lineno"> 98</span> </div><div
class="line"><a name="l00099"></a><span class="lineno"> 99</span> 
<span class="keywordflow">return</span> <a class="code"
href="structNothing.html">Nothing</a>();</div><div class="line"
><a name="l00100"></a><span class="lineno"> 100</span> }</div><div
>class="line"><a name="l00101"></a><span class="lineno">
>101</span> </div><div class="line"><a name="l00102"></a><span
>class="lineno"> 102</span> </div><div class="line"><a
>name="l00103"></a><span class="lineno"> 103</span> <span
>class="comment">// The main entry of the child process.</span></div><div
>class="line"><a name="l00104"></a><span class="lineno">
>104</span> <span class="comment">//</span></div><div class="line"><a
>name="l00105"></a><span class="lineno"> 105</span> <span
>class="comment">// NOTE: This function has to be async signal
>safe.</span></div><div class="line"><a name="l00106"></a><span
>class="lineno"><a class="line"
>href="namespaceprocess_1_1internal.html#a902e2646d88c41ce674a3009cafe0aad">
>106</a></span> <span class="keyword">inline</span> <span
>class="keywordtype">int</span> <a class="code"
>href="namespaceprocess_1_1internal.html#a902e2646d88c41ce674a3009caf
e0aad">childMain</a>(</div><div class="line"><a name="l00107"></a><span
class="lineno"> 107</span>  <span class="keyword">const</span>
std::string& <a class="code" href="namespacepath.html">path</a>,</div><div
class="line"><a name="l00108"></a><span class="lineno"> 108</span> 
<span class="keywordtype">char</span>** argv,</div><div class="line"><a
name="l00109"></a><span class="lineno"> 109</span>  <span
class="keywordtype">char</span>** envp,</div><div class="line"><a
name="l00110"></a><span class="lineno"> 110</span>  <span
class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html">InputFileDescriptors</a>&
stdinfds,</div><div class="line"><a name="l00111"></a><span class="lineno">
111</span>  <span class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">OutputFileDescriptors</a>&
stdoutfds,</div><div class="li
ne"><a name="l00112"></a><span class="lineno"> 112</span>  <span
class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">OutputFileDescriptors</a>&
stderrfds,</div><div class="line"><a name="l00113"></a><span class="lineno">
113</span>  <span class="keywordtype">bool</span> blocking,</div><div
class="line"><a name="l00114"></a><span class="lineno"> 114</span> 
<span class="keywordtype">int</span> pipes[2],</div><div class="line"><a
name="l00115"></a><span class="lineno"> 115</span>  <span
class="keyword">const</span> std::vector<Subprocess::ChildHook>&
child_hooks)</div><div class="line"><a name="l00116"></a><span class="lineno">
116</span> {</div><div class="line"><a name="l00117"></a><span
class="lineno"> 117</span>  <span class="comment">// Close parent's
end of the pipes.</span></div><div class="line"><a name="l00118"></a><span
class="lineno"> 118</span
>  <span class="keywordflow">if</span> (stdinfds.<a class="code"
>href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#ab812da47364d793d9ec0471d3dc8c1bc">write</a>.<a
> class="code"
>href="classOption.html#a4e3bf8416d95246f43c91f1b5c309323">isSome</a>())
>{</div><div class="line"><a name="l00119"></a><span class="lineno">
>119</span>  ::close(stdinfds.<a class="code"
>href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#ab812da47364d793d9ec0471d3dc8c1bc">write</a>.<a
> class="code"
>href="classOption.html#a21358442c0fac1cc978a67a9a9089a79">get</a>());</div><div
> class="line"><a name="l00120"></a><span class="lineno"> 120</span> 
>}</div><div class="line"><a name="l00121"></a><span class="lineno">
>121</span>  <span class="keywordflow">if</span> (stdoutfds.<a
>class="code"
>href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c631a700d4be4410a250e3bce">read</a>.<a
> class="code" href="classOption.html#a4e3bf8416d952
46f43c91f1b5c309323">isSome</a>()) {</div><div class="line"><a
name="l00122"></a><span class="lineno"> 122</span> 
::close(stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c631a700d4be4410a250e3bce">read</a>.<a
class="code"
href="classOption.html#a21358442c0fac1cc978a67a9a9089a79">get</a>());</div><div
class="line"><a name="l00123"></a><span class="lineno"> 123</span> 
}</div><div class="line"><a name="l00124"></a><span class="lineno">
124</span>  <span class="keywordflow">if</span> (stderrfds.<a
class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c631a700d4be4410a250e3bce">read</a>.<a
class="code"
href="classOption.html#a4e3bf8416d95246f43c91f1b5c309323">isSome</a>())
{</div><div class="line"><a name="l00125"></a><span class="lineno">
125</span>  ::close(stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c
631a700d4be4410a250e3bce">read</a>.<a class="code"
href="classOption.html#a21358442c0fac1cc978a67a9a9089a79">get</a>());</div><div
class="line"><a name="l00126"></a><span class="lineno"> 126</span> 
}</div><div class="line"><a name="l00127"></a><span class="lineno">
127</span> </div><div class="line"><a name="l00128"></a><span
class="lineno"> 128</span>  <span class="comment">// Currently we will
block the child's execution of the new process</span></div><div
class="line"><a name="l00129"></a><span class="lineno"> 129</span> 
<span class="comment">// until all the parent hooks (if any) have
executed.</span></div><div class="line"><a name="l00130"></a><span
class="lineno"> 130</span>  <span class="keywordflow">if</span>
(blocking) {</div><div class="line"><a name="l00131"></a><span class="lineno">
131</span>  ::close(pipes[1]);</div><div class="line"><a
name="l00132"></a><span class="lineno"> 132</span>  }</div><div
class="line"><
a name="l00133"></a><span class="lineno"> 133</span> </div><div
class="line"><a name="l00134"></a><span class="lineno"> 134</span> 
<span class="comment">// Redirect I/O for stdin/stdout/stderr.</span></div><div
class="line"><a name="l00135"></a><span class="lineno"> 135</span> 
<span class="keywordflow">while</span> (::<a class="code"
href="namespaceos.html#a54f3320a4d6f88c14f80f5247aa879b9">dup2</a>(stdinfds.<a
class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>,
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#afcf80a6d91178952d107ad00b165752b">STDIN_FILENO</a>)
== -1 && errno == EINTR);</div><div class="line"><a
name="l00136"></a><span class="lineno"> 136</span>  <span
class="keywordflow">while</span> (::<a class="code"
href="namespaceos.html#a54f3320a4d6f88c14f80f5247aa879b9">dup2</a>(stdoutfds.<a
class="code" href="structprocess_1_1Subprocess_1_1
IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>,
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#abd165ee6474b5b75bf075842fff13a04">STDOUT_FILENO</a>)
== -1 && errno == EINTR);</div><div class="line"><a
name="l00137"></a><span class="lineno"> 137</span>  <span
class="keywordflow">while</span> (::<a class="code"
href="namespaceos.html#a54f3320a4d6f88c14f80f5247aa879b9">dup2</a>(stderrfds.<a
class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>,
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ae2fe1725bb5e9823d089c46b9ed5266e">STDERR_FILENO</a>)
== -1 && errno == EINTR);</div><div class="line"><a
name="l00138"></a><span class="lineno"> 138</span> </div><div
class="line"><a name="l00139"></a><span class="lineno"> 139</span> 
<span class="comment">// Close the copies. We need to make sure that we do
not close the</span></div><div class="line"><a name="l00140"></a><span
class="lineno"> 140</span>  <span class="comment">// file descriptor
assigned to stdin/stdout/stderr in case the</span></div><div class="line"><a
name="l00141"></a><span class="lineno"> 141</span>  <span
class="comment">// parent has closed stdin/stdout/stderr when calling
this</span></div><div class="line"><a name="l00142"></a><span class="lineno">
142</span>  <span class="comment">// function (in that case, a dup'ed
file descriptor may have the</span></div><div class="line"><a
name="l00143"></a><span class="lineno"> 143</span>  <span
class="comment">// same file descriptor number as
stdin/stdout/stderr).</span></div><div class="line"><a name="l00144"></a><span
class="lineno"> 144</span>  <span class="comment">//</span></div><div
class="line"><a name="l00145"></a><span class="lineno"> 145</span> 
<span class="comment">// We also need to ensure that we don't "
;double close" any file</span></div><div class="line"><a
name="l00146"></a><span class="lineno"> 146</span>  <span
class="comment">// descriptors in the case where one of
stdinfds.read,</span></div><div class="line"><a name="l00147"></a><span
class="lineno"> 147</span>  <span class="comment">// stdoutfds.write, or
stdoutfds.write are equal.</span></div><div class="line"><a
name="l00148"></a><span class="lineno"> 148</span>  <span
class="keywordflow">if</span> (stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#afcf80a6d91178952d107ad00b165752b">STDIN_FILENO</a>
&&</div><div class="line"><a name="l00149"></a><span class="lineno">
149</span>  stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>
!=
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#abd165ee6474b5b75bf075842fff13a04">STDOUT_FILENO</a>
&&</div><div class="line"><a name="l00150"></a><span class="lineno">
150</span>  stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ae2fe1725bb5e9823d089c46b9ed5266e">STDERR_FILENO</a>)
{</div><div class="line"><a name="l00151"></a><span class="lineno">
151</span>  ::close(stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>);</div><div
class="line"><a name="l00152"></a><span class="lineno"> 152</span> 
}</div><div class="line"><a name="l00153"></a><span class="lineno">
153</span>  <span class="keywordflow">if</span> (stdoutfds.<a
class="code" href="structprocess_1_1Subproc
ess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#afcf80a6d91178952d107ad00b165752b">STDIN_FILENO</a>
&&</div><div class="line"><a name="l00154"></a><span class="lineno">
154</span>  stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#abd165ee6474b5b75bf075842fff13a04">STDOUT_FILENO</a>
&&</div><div class="line"><a name="l00155"></a><span class="lineno">
155</span>  stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ae2fe1725bb5e9823d089c46b9ed5266e">STDERR_FILENO</a>
&&</div><div class="line"><a name="l
00156"></a><span class="lineno"> 156</span>  stdoutfds.<a
class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>)
{</div><div class="line"><a name="l00157"></a><span class="lineno">
157</span>  ::close(stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>);</div><div
class="line"><a name="l00158"></a><span class="lineno"> 158</span> 
}</div><div class="line"><a name="l00159"></a><span class="lineno">
159</span>  <span class="keywordflow">if</span> (stderrfds.<a
class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= <a class="code" href="3rdparty_2stout_2include_2stout_2windows_8h
pp.html#afcf80a6d91178952d107ad00b165752b">STDIN_FILENO</a>
&&</div><div class="line"><a name="l00160"></a><span class="lineno">
160</span>  stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#abd165ee6474b5b75bf075842fff13a04">STDOUT_FILENO</a>
&&</div><div class="line"><a name="l00161"></a><span class="lineno">
161</span>  stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ae2fe1725bb5e9823d089c46b9ed5266e">STDERR_FILENO</a>
&&</div><div class="line"><a name="l00162"></a><span class="lineno">
162</span>  stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a
5dabb8e3008efd61ce42478f260b54ac">write</a> != stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>
&&</div><div class="line"><a name="l00163"></a><span class="lineno">
163</span>  stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>
!= stdoutfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>)
{</div><div class="line"><a name="l00164"></a><span class="lineno">
164</span>  ::close(stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>);</div><div
class="line"><a name="l00165"></a><span class="lineno"> 165</span> 
}</div><div class="line"><a name="l00166"></a><span class="lineno">
166</span> </div><div class
="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span
class="keywordflow">if</span> (blocking) {</div><div class="line"><a
name="l00168"></a><span class="lineno"> 168</span>  <span
class="comment">// Do a blocking read on the pipe until the parent signals us
to</span></div><div class="line"><a name="l00169"></a><span class="lineno">
169</span>  <span class="comment">// continue.</span></div><div
class="line"><a name="l00170"></a><span class="lineno"> 170</span> 
<span class="keywordtype">char</span> dummy;</div><div class="line"><a
name="l00171"></a><span class="lineno"> 171</span>  <a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#a894c4d58faeee7675b9e7e8244de1386">ssize_t</a>
length;</div><div class="line"><a name="l00172"></a><span class="lineno">
172</span>  <span class="keywordflow">while</span> ((length = ::<a
class="code" href="namespacemesos_1_1internal_1_1credentials.html#a137c93d60149
616181a10e9f39986f7f">read</a>(pipes[0], &dummy, <span
class="keyword">sizeof</span>(dummy))) == -1 &&</div><div
class="line"><a name="l00173"></a><span class="lineno"> 173</span> 
errno == EINTR);</div><div class="line"><a name="l00174"></a><span
class="lineno"> 174</span> </div><div class="line"><a
name="l00175"></a><span class="lineno"> 175</span>  <span
class="keywordflow">if</span> (length != <span
class="keyword">sizeof</span>(dummy)) {</div><div class="line"><a
name="l00176"></a><span class="lineno"> 176</span>  <a class="code"
href="abort_8hpp.html#a4d84a74fe6e4f84bc3d2f901b9e89f93">ABORT</a>(<span
class="stringliteral">"Failed to synchronize with
parent"</span>);</div><div class="line"><a name="l00177"></a><span
class="lineno"> 177</span>  }</div><div class="line"><a
name="l00178"></a><span class="lineno"> 178</span> </div><div
class="line"><a name="l00179"></a><span class="lineno"> 179</span>
60; <span class="comment">// Now close the pipe as we don't need it
anymore.</span></div><div class="line"><a name="l00180"></a><span
class="lineno"> 180</span>  ::close(pipes[0]);</div><div
class="line"><a name="l00181"></a><span class="lineno"> 181</span> 
}</div><div class="line"><a name="l00182"></a><span class="lineno">
182</span> </div><div class="line"><a name="l00183"></a><span
class="lineno"> 183</span>  <span class="comment">// Run the child
hooks.</span></div><div class="line"><a name="l00184"></a><span class="lineno">
184</span>  <span class="keywordflow">foreach</span> (<span
class="keyword">const</span> <a class="code"
href="classprocess_1_1Subprocess_1_1ChildHook.html">Subprocess::ChildHook</a>&
hook, child_hooks) {</div><div class="line"><a name="l00185"></a><span
class="lineno"> 185</span>  <a class="code"
href="classTry.html">Try<Nothing></a> callback = hook();</div><div
class="line"><a name="l00186"></a
><span class="lineno"> 186</span> </div><div class="line"><a
>name="l00187"></a><span class="lineno"> 187</span>  <span
>class="comment">// If the callback failed, we should abort
>execution.</span></div><div class="line"><a name="l00188"></a><span
>class="lineno"> 188</span>  <span class="keywordflow">if</span>
>(callback.<a class="code"
>href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>())
>{</div><div class="line"><a name="l00189"></a><span class="lineno">
>189</span>  <a class="code"
>href="abort_8hpp.html#a4d84a74fe6e4f84bc3d2f901b9e89f93">ABORT</a>(<span
>class="stringliteral">"Failed to execute Subprocess::ChildHook:
>"</span> + callback.<a class="code"
>href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div><div
> class="line"><a name="l00190"></a><span class="lineno"> 190</span> 
>}</div><div class="line"><a name="l00191"></a><span class="lineno">
>191</span>  }</div><div class="line"><a name="
l00192"></a><span class="lineno"> 192</span> </div><div class="line"><a
name="l00193"></a><span class="lineno"> 193</span>  <a class="code"
href="namespaceos.html#aebc3586b2be0d2b9093ccfbf25dfcde8">os::execvpe</a>(path.c_str(),
argv, envp);</div><div class="line"><a name="l00194"></a><span class="lineno">
194</span> </div><div class="line"><a name="l00195"></a><span
class="lineno"> 195</span>  <a class="code"
href="exit_8hpp.html#a637cd32ee4af0a5a1d1aea8a0d7f7564">SAFE_EXIT</a>(</div><div
class="line"><a name="l00196"></a><span class="lineno"> 196</span> 
errno, <span class="stringliteral">"Failed to os::execvpe on path
'%s': %d"</span>, path.c_str(), errno);</div><div class="line"><a
name="l00197"></a><span class="lineno"> 197</span> }</div><div
class="line"><a name="l00198"></a><span class="lineno">
198</span> </div><div class="line"><a name="l00199"></a><span
class="lineno"> 199</span> </div><div class="line
"><a name="l00200"></a><span class="lineno"><a class="line"
href="namespaceprocess_1_1internal.html#afe2c3a3ffdd0ee6fda82e198ece80a37">
200</a></span> <span class="keyword">inline</span> <a class="code"
href="classTry.html">Try<pid_t></a> <a class="code"
href="namespaceprocess_1_1internal.html#afe2c3a3ffdd0ee6fda82e198ece80a37">cloneChild</a>(</div><div
class="line"><a name="l00201"></a><span class="lineno"> 201</span> 
<span class="keyword">const</span> std::string& <a class="code"
href="namespacepath.html">path</a>,</div><div class="line"><a
name="l00202"></a><span class="lineno"> 202</span> 
std::vector<std::string> argv,</div><div class="line"><a
name="l00203"></a><span class="lineno"> 203</span>  <span
class="keyword">const</span> <a class="code"
href="classOption.html">Option</a><std::map<std::string,
std::string>>& <a class="code"
href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">
environment</a>,</div><div class="line"><a name="l00204"></a><span
class="lineno"> 204</span>  <span class="keyword">const</span> <a
class="code"
href="classOption.html">Option</a><lambda::function<</div><div
class="line"><a name="l00205"></a><span class="lineno"> 205</span> 
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a>(<span
class="keyword">const</span> lambda::function<<span
class="keywordtype">int</span>()>&)>>& _clone,</div><div
class="line"><a name="l00206"></a><span class="lineno"> 206</span> 
<span class="keyword">const</span>
std::vector<Subprocess::ParentHook>& parent_hooks,</div><div
class="line"><a name="l00207"></a><span class="lineno"> 207</span> 
<span class="keyword">const</span>
std::vector<Subprocess::ChildHook>& child_hooks,</div><div
class="line"><a name="l00208"></a><span class="lineno"> 208</span> 
<span class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html">InputFileDescriptors</a>
stdinfds,</div><div class="line"><a name="l00209"></a><span class="lineno">
209</span>  <span class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">OutputFileDescriptors</a>
stdoutfds,</div><div class="line"><a name="l00210"></a><span class="lineno">
210</span>  <span class="keyword">const</span> <a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">OutputFileDescriptors</a>
stderrfds)</div><div class="line"><a name="l00211"></a><span class="lineno">
211</span> {</div><div class="line"><a name="l00212"></a><span
class="lineno"> 212</span>  <span class="comment">// The real arguments
that will be passed to 'os::execvpe'. We need</span></div><div
class="line"><a name="l00213"></a><span class="lineno"> 213</
span>  <span class="comment">// to construct them here before doing the
clone as it might not be</span></div><div class="line"><a
name="l00214"></a><span class="lineno"> 214</span>  <span
class="comment">// async signal safe to perform the memory
allocation.</span></div><div class="line"><a name="l00215"></a><span
class="lineno"> 215</span>  <span class="keywordtype">char</span>**
_argv = <span class="keyword">new</span> <span
class="keywordtype">char</span>*[argv.size() + 1];</div><div class="line"><a
name="l00216"></a><span class="lineno"> 216</span>  <span
class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0;
i < argv.size(); i++) {</div><div class="line"><a name="l00217"></a><span
class="lineno"> 217</span>  _argv[i] = (<span
class="keywordtype">char</span>*) argv[i].c_str();</div><div class="line"><a
name="l00218"></a><span class="lineno"> 218</span>  }</div><div
class="line"><a name="l00219"></a><span class
="lineno"> 219</span>  _argv[argv.size()] = <span
class="keyword">nullptr</span>;</div><div class="line"><a
name="l00220"></a><span class="lineno"> 220</span> </div><div
class="line"><a name="l00221"></a><span class="lineno"> 221</span> 
<span class="comment">// Like above, we need to construct the environment that
we'll pass</span></div><div class="line"><a name="l00222"></a><span
class="lineno"> 222</span>  <span class="comment">// to
'os::execvpe' as it might not be async-safe to perform
the</span></div><div class="line"><a name="l00223"></a><span class="lineno">
223</span>  <span class="comment">// memory allocations.</span></div><div
class="line"><a name="l00224"></a><span class="lineno"> 224</span> 
<span class="keywordtype">char</span>** envp = <a class="code"
href="namespaceos_1_1raw.html#aad2bd3acb3ca09c75a1a1db58075f9f4">os::raw::environment</a>();</div><div
class="line"><a name="l00225"></a><span class="lineno"> 225</s
pan> </div><div class="line"><a name="l00226"></a><span class="lineno">
226</span>  <span class="keywordflow">if</span> (<a class="code"
href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">environment</a>.isSome())
{</div><div class="line"><a name="l00227"></a><span class="lineno">
227</span>  <span class="comment">// NOTE: We add 1 to the size for a
`nullptr` terminator.</span></div><div class="line"><a name="l00228"></a><span
class="lineno"> 228</span>  envp = <span class="keyword">new</span>
<span class="keywordtype">char</span>*[<a class="code"
href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">environment</a>->size()
+ 1];</div><div class="line"><a name="l00229"></a><span class="lineno">
229</span> </div><div class="line"><a name="l00230"></a><span
class="lineno"> 230</span>  <span class="keywordtype">size_t</span> <a
class="code" href="namespacerouting_1_1link.html#a264
86cdba01ef1c80706b1e07e8a6d3f">index</a> = 0;</div><div class="line"><a
name="l00231"></a><span class="lineno"> 231</span>  <a class="code"
href="foreach_8hpp.html#a66900b166526abe66464d6597536b111">foreachpair</a>
(</div><div class="line"><a name="l00232"></a><span class="lineno">
232</span>  <span class="keyword">const</span> std::string&
key,</div><div class="line"><a name="l00233"></a><span class="lineno">
233</span>  <span class="keyword">const</span> std::string&
value, <a class="code"
href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">environment</a>.get())
{</div><div class="line"><a name="l00234"></a><span class="lineno">
234</span>  std::string entry = key + <span
class="stringliteral">"="</span> + value;</div><div class="line"><a
name="l00235"></a><span class="lineno"> 235</span>  envp[<a
class="code" href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d
3f">index</a>] = <span class="keyword">new</span> <span
class="keywordtype">char</span>[entry.size() + 1];</div><div class="line"><a
name="l00236"></a><span class="lineno"> 236</span> 
strncpy(envp[index], entry.c_str(), entry.size() + 1);</div><div
class="line"><a name="l00237"></a><span class="lineno"> 237</span> 
++<a class="code"
href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">index</a>;</div><div
class="line"><a name="l00238"></a><span class="lineno"> 238</span> 
}</div><div class="line"><a name="l00239"></a><span class="lineno">
239</span> </div><div class="line"><a name="l00240"></a><span
class="lineno"> 240</span>  envp[<a class="code"
href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">index</a>]
= <span class="keyword">nullptr</span>;</div><div class="line"><a
name="l00241"></a><span class="lineno"> 241</span>  }</div><div
class="line"><a name="l00242"></a><span class="lineno">
242</span> </div><div class="line"><a name="l00243"></a><span
class="lineno"> 243</span>  <span class="comment">// Determine the
function to clone the child process. If the user</span></div><div
class="line"><a name="l00244"></a><span class="lineno"> 244</span> 
<span class="comment">// does not specify the clone function, we will use the
default.</span></div><div class="line"><a name="l00245"></a><span
class="lineno"> 245</span>  lambda::function<pid_t(const
lambda::function<int()>&)> <a class="code"
href="namespacens.html#a98bf4d9e11d546326250997a6493f835">clone</a> =</div><div
class="line"><a name="l00246"></a><span class="lineno"> 246</span> 
(_clone.isSome() ? _clone.get() : <a class="code"
href="namespaceprocess_1_1internal.html#af2f19b6f367cddc0c8283560a9cd9215">defaultClone</a>);</div><div
class="line"><a name="l00247"></a><span class="lineno">
247</span> </div><div class="line"><a name="l00248"></a><span class="lineno
"> 248</span>  <span class="comment">// Currently we will block the
child's execution of the new process</span></div><div class="line"><a
name="l00249"></a><span class="lineno"> 249</span>  <span
class="comment">// until all the `parent_hooks` (if any) have
executed.</span></div><div class="line"><a name="l00250"></a><span
class="lineno"> 250</span>  std::array<int, 2> pipes;</div><div
class="line"><a name="l00251"></a><span class="lineno"> 251</span> 
<span class="keyword">const</span> <span class="keywordtype">bool</span>
blocking = !parent_hooks.empty();</div><div class="line"><a
name="l00252"></a><span class="lineno"> 252</span> </div><div
class="line"><a name="l00253"></a><span class="lineno"> 253</span> 
<span class="keywordflow">if</span> (blocking) {</div><div class="line"><a
name="l00254"></a><span class="lineno"> 254</span>  <span
class="comment">// We assume this should not fail under reasonable conditions
so we<
/span></div><div class="line"><a name="l00255"></a><span class="lineno">
255</span>  <span class="comment">// use CHECK.</span></div><div
class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <a
class="code" href="classTry.html">Try<std::array<int, 2></a>> <a
class="code" href="namespaceos.html#afefbea8a88b84bed66580372accb18a9">pipe</a>
= <a class="code"
href="namespaceos.html#afefbea8a88b84bed66580372accb18a9">os::pipe</a>();</div><div
class="line"><a name="l00257"></a><span class="lineno"> 257</span> 
<a class="code"
href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a>(pipe);</div><div
class="line"><a name="l00258"></a><span class="lineno">
258</span> </div><div class="line"><a name="l00259"></a><span
class="lineno"> 259</span>  pipes = pipe.<a class="code"
href="classTry.html#a8bc7f43e75a47111ea18e9c83b007be5">get</a>();</div><div
class="line"><a name="l00260"></a><span
class="lineno"> 260</span>  }</div><div class="line"><a
name="l00261"></a><span class="lineno"> 261</span> </div><div
class="line"><a name="l00262"></a><span class="lineno"> 262</span> 
<span class="comment">// Now, clone the child process.</span></div><div
class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a
class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a>
pid = <a class="code"
href="namespacens.html#a98bf4d9e11d546326250997a6493f835">clone</a>(<a
class="code"
href="namespaceprocess_1_1network.html#ad067110a4b38cc83785a43f49bf6c8e2">lambda::bind</a>(</div><div
class="line"><a name="l00264"></a><span class="lineno"> 264</span> 
&<a class="code"
href="namespaceprocess_1_1internal.html#a902e2646d88c41ce674a3009cafe0aad">childMain</a>,</div><div
class="line"><a name="l00265"></a><span class="lineno"> 265</span> 
path,</div><div class="line"><a name="l
00266"></a><span class="lineno"> 266</span>  _argv,</div><div
class="line"><a name="l00267"></a><span class="lineno"> 267</span> 
envp,</div><div class="line"><a name="l00268"></a><span class="lineno">
268</span>  stdinfds,</div><div class="line"><a
name="l00269"></a><span class="lineno"> 269</span> 
stdoutfds,</div><div class="line"><a name="l00270"></a><span class="lineno">
270</span>  stderrfds,</div><div class="line"><a
name="l00271"></a><span class="lineno"> 271</span> 
blocking,</div><div class="line"><a name="l00272"></a><span class="lineno">
272</span>  pipes.data(),</div><div class="line"><a
name="l00273"></a><span class="lineno"> 273</span> 
child_hooks));</div><div class="line"><a name="l00274"></a><span
class="lineno"> 274</span> </div><div class="line"><a
name="l00275"></a><span class="lineno"> 275</span>  <span
class="keyword">delete</span>[] _argv;</div><div class="lin
e"><a name="l00276"></a><span class="lineno"> 276</span> </div><div
class="line"><a name="l00277"></a><span class="lineno"> 277</span> 
<span class="comment">// Need to delete 'envp' if we had environment
variables passed to</span></div><div class="line"><a name="l00278"></a><span
class="lineno"> 278</span>  <span class="comment">// us and we needed to
allocate the space.</span></div><div class="line"><a name="l00279"></a><span
class="lineno"> 279</span>  <span class="keywordflow">if</span> (<a
class="code"
href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">environment</a>.isSome())
{</div><div class="line"><a name="l00280"></a><span class="lineno">
280</span>  CHECK_NE(<a class="code"
href="namespaceos_1_1raw.html#aad2bd3acb3ca09c75a1a1db58075f9f4">os::raw::environment</a>(),
envp);</div><div class="line"><a name="l00281"></a><span class="lineno">
281</span> </div><div class="line"><a name="l00282"></a
><span class="lineno"> 282</span>  <span class="comment">// We ignore
>the last 'envp' entry since it is nullptr.</span></div><div
>class="line"><a name="l00283"></a><span class="lineno"> 283</span> 
><span class="keywordflow">for</span> (<span class="keywordtype">size_t</span>
><a class="code"
>href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">index</a>
> = 0; <a class="code"
>href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">index</a>
> < <a class="code"
>href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">environment</a>->size();
> <a class="code"
>href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">index</a>++)
> {</div><div class="line"><a name="l00284"></a><span class="lineno">
>284</span>  <span class="keyword">delete</span>[] envp[<a
>class="code"
>href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">index</a>];</div><div
> class="line"><a name="
l00285"></a><span class="lineno"> 285</span>  }</div><div
class="line"><a name="l00286"></a><span class="lineno">
286</span> </div><div class="line"><a name="l00287"></a><span
class="lineno"> 287</span>  <span class="keyword">delete</span>[]
envp;</div><div class="line"><a name="l00288"></a><span class="lineno">
288</span>  }</div><div class="line"><a name="l00289"></a><span
class="lineno"> 289</span> </div><div class="line"><a
name="l00290"></a><span class="lineno"> 290</span>  <span
class="keywordflow">if</span> (pid == -1) {</div><div class="line"><a
name="l00291"></a><span class="lineno"> 291</span>  <span
class="comment">// Save the errno as 'close' below might overwrite
it.</span></div><div class="line"><a name="l00292"></a><span class="lineno">
292</span>  <a class="code" href="classErrnoError.html">ErrnoError</a>
<a class="code"
href="namespacemesos_1_1internal_1_1slave_1_1cni_1_1spec.html#ae58e703656ab4a1
bd5d9870441236727">error</a>(<span class="stringliteral">"Failed to
clone"</span>);</div><div class="line"><a name="l00293"></a><span
class="lineno"> 293</span>  internal::close(stdinfds, stdoutfds,
stderrfds);</div><div class="line"><a name="l00294"></a><span class="lineno">
294</span> </div><div class="line"><a name="l00295"></a><span
class="lineno"> 295</span>  <span class="keywordflow">if</span>
(blocking) {</div><div class="line"><a name="l00296"></a><span class="lineno">
296</span>  <a class="code"
href="namespaceos.html#a8df77ec6d6b8d32d9b287a41bc74cfdc">os::close</a>(pipes[0]);</div><div
class="line"><a name="l00297"></a><span class="lineno"> 297</span> 
<a class="code"
href="namespaceos.html#a8df77ec6d6b8d32d9b287a41bc74cfdc">os::close</a>(pipes[1]);</div><div
class="line"><a name="l00298"></a><span class="lineno"> 298</span> 
}</div><div class="line"><a name="l00299"></a><span class="lineno">
299</span> 
;</div><div class="line"><a name="l00300"></a><span class="lineno">
300</span>  <span class="keywordflow">return</span> <a class="code"
href="namespacemesos_1_1internal_1_1slave_1_1cni_1_1spec.html#ae58e703656ab4a1bd5d9870441236727">error</a>;</div><div
class="line"><a name="l00301"></a><span class="lineno"> 301</span> 
}</div><div class="line"><a name="l00302"></a><span class="lineno">
302</span> </div><div class="line"><a name="l00303"></a><span
class="lineno"> 303</span>  <span class="comment">// Close the
child-ends of the file descriptors that are created by</span></div><div
class="line"><a name="l00304"></a><span class="lineno"> 304</span> 
<span class="comment">// this function.</span></div><div class="line"><a
name="l00305"></a><span class="lineno"> 305</span> 
internal::close({stdinfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">read</a>,
stdoutfds.<a class
="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>,
stderrfds.<a class="code"
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">write</a>});</div><div
class="line"><a name="l00306"></a><span class="lineno">
306</span> </div><div class="line"><a name="l00307"></a><span
class="lineno"> 307</span>  <span class="keywordflow">if</span>
(blocking) {</div><div class="line"><a name="l00308"></a><span class="lineno">
308</span>  <a class="code"
href="namespaceos.html#a8df77ec6d6b8d32d9b287a41bc74cfdc">os::close</a>(pipes[0]);</div><div
class="line"><a name="l00309"></a><span class="lineno">
309</span> </div><div class="line"><a name="l00310"></a><span
class="lineno"> 310</span>  <span class="comment">// Run the parent
hooks.</span></div><div class="line"><a name="l00311"></a><span class="lineno">
311</span>  <span class="
keywordflow">foreach</span> (<span class="keyword">const</span> <a
class="code"
href="structprocess_1_1Subprocess_1_1ParentHook.html">Subprocess::ParentHook</a>&
hook, parent_hooks) {</div><div class="line"><a name="l00312"></a><span
class="lineno"> 312</span>  <a class="code"
href="classTry.html">Try<Nothing></a> parentSetup = hook.<a class="code"
href="structprocess_1_1Subprocess_1_1ParentHook.html#aaf9ff141314d619cd65cd8ec9320fb7d">parent_setup</a>(pid);</div><div
class="line"><a name="l00313"></a><span class="lineno">
313</span> </div><div class="line"><a name="l00314"></a><span
class="lineno"> 314</span>  <span class="comment">// If the hook
callback fails, we shouldn't proceed with the</span></div><div
class="line"><a name="l00315"></a><span class="lineno"> 315</span> 
<span class="comment">// execution and hence the child process should be
killed.</span></div><div class="line"><a name="l00316"></a><span
class="lineno"> 316
</span>  <span class="keywordflow">if</span> (parentSetup.<a
class="code"
href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>())
{</div><div class="line"><a name="l00317"></a><span class="lineno">
317</span>  LOG(WARNING)</div><div class="line"><a
name="l00318"></a><span class="lineno"> 318</span>  <<
<span class="stringliteral">"Failed to execute Subprocess::ParentHook in
parent for child '"</span></div><div class="line"><a
name="l00319"></a><span class="lineno"> 319</span>  << pid
<< <span class="stringliteral">"': "</span> <<
parentSetup.<a class="code"
href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>();</div><div
class="line"><a name="l00320"></a><span class="lineno">
320</span> </div><div class="line"><a name="l00321"></a><span
class="lineno"> 321</span>  <a class="code"
href="namespaceos.html#a8df77ec6d6b8d32d9b287a41bc74cfd
c">os::close</a>(pipes[1]);</div><div class="line"><a name="l00322"></a><span
class="lineno"> 322</span> </div><div class="line"><a
name="l00323"></a><span class="lineno"> 323</span>  <span
class="comment">// Ensure the child is killed.</span></div><div class="line"><a
name="l00324"></a><span class="lineno"> 324</span>  <a
class="code"
href="namespacecgroups.html#ab75e1e2d1be63eec907bf12306a7c8a7">::kill</a>(pid,
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#a1c2b5693161bbc9d516ef5d16c7b54f5">SIGKILL</a>);</div><div
class="line"><a name="l00325"></a><span class="lineno">
325</span> </div><div class="line"><a name="l00326"></a><span
class="lineno"> 326</span>  <span
class="keywordflow">return</span> <a class="code"
href="classError.html">Error</a>(</div><div class="line"><a
name="l00327"></a><span class="lineno"> 327</span>  <span
class="stringliteral">"Failed to execute Subprocess::Pa
rentHook in parent for child '"</span> +</div><div class="line"><a
name="l00328"></a><span class="lineno"> 328</span>  <a
class="code"
href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(pid) +
<span class="stringliteral">"': "</span> + parentSetup.<a
class="code"
href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div><div
class="line"><a name="l00329"></a><span class="lineno"> 329</span> 
}</div><div class="line"><a name="l00330"></a><span class="lineno">
330</span>  }</div><div class="line"><a name="l00331"></a><span
class="lineno"> 331</span> </div><div class="line"><a
name="l00332"></a><span class="lineno"> 332</span>  <span
class="comment">// Now that we've executed the parent hooks, we can signal
the child to</span></div><div class="line"><a name="l00333"></a><span
class="lineno"> 333</span>  <span class="comment">// continue by
writing to the pipe.</s
pan></div><div class="line"><a name="l00334"></a><span class="lineno">
334</span>  <span class="keywordtype">char</span> dummy;</div><div
class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <a
class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#a894c4d58faeee7675b9e7e8244de1386">ssize_t</a>
length;</div><div class="line"><a name="l00336"></a><span class="lineno">
336</span>  <span class="keywordflow">while</span> ((length = ::<a
class="code"
href="namespacemesos_1_1internal_1_1log_1_1protocol.html#a66ff2d5af4db53227f787281c0765d8d">write</a>(pipes[1],
&dummy, <span class="keyword">sizeof</span>(dummy))) == -1
&&</div><div class="line"><a name="l00337"></a><span class="lineno">
337</span>  errno == EINTR);</div><div class="line"><a
name="l00338"></a><span class="lineno"> 338</span> </div><div
class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <a
class="code" href="
namespaceos.html#a8df77ec6d6b8d32d9b287a41bc74cfdc">os::close</a>(pipes[1]);</div><div
class="line"><a name="l00340"></a><span class="lineno">
340</span> </div><div class="line"><a name="l00341"></a><span
class="lineno"> 341</span>  <span class="keywordflow">if</span>
(length != <span class="keyword">sizeof</span>(dummy)) {</div><div
class="line"><a name="l00342"></a><span class="lineno"> 342</span> 
<span class="comment">// Ensure the child is killed.</span></div><div
class="line"><a name="l00343"></a><span class="lineno"> 343</span> 
<a class="code"
href="namespacecgroups.html#ab75e1e2d1be63eec907bf12306a7c8a7">::kill</a>(pid,
<a class="code"
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#a1c2b5693161bbc9d516ef5d16c7b54f5">SIGKILL</a>);</div><div
class="line"><a name="l00344"></a><span class="lineno">
344</span> </div><div class="line"><a name="l00345"></a><span
class="lineno"> 345</span>  <span class="keywordflow">re
turn</span> <a class="code" href="classError.html">Error</a>(<span
class="stringliteral">"Failed to synchronize child
process"</span>);</div><div class="line"><a name="l00346"></a><span
class="lineno"> 346</span>  }</div><div class="line"><a
name="l00347"></a><span class="lineno"> 347</span>  }</div><div
class="line"><a name="l00348"></a><span class="lineno">
348</span> </div><div class="line"><a name="l00349"></a><span
class="lineno"> 349</span>  <span class="keywordflow">return</span>
pid;</div><div class="line"><a name="l00350"></a><span class="lineno">
350</span> }</div><div class="line"><a name="l00351"></a><span
class="lineno"> 351</span> </div><div class="line"><a
name="l00352"></a><span class="lineno"> 352</span> } <span
class="comment">// namespace internal {</span></div><div class="line"><a
name="l00353"></a><span class="lineno"> 353</span> } <span
class="comment">// namespace process {</span></div><div class
="line"><a name="l00354"></a><span class="lineno"> 354</span> </div><div
class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span
class="preprocessor">#endif //
__PROCESS_POSIX_SUBPROCESS_HPP__</span></div><div class="ttc"
id="namespaceos_html_a54f3320a4d6f88c14f80f5247aa879b9"><div class="ttname"><a
href="namespaceos.html#a54f3320a4d6f88c14f80f5247aa879b9">os::dup2</a></div><div
class="ttdeci">Try< Nothing > dup2(int oldFd, int newFd)</div><div
class="ttdef"><b>Definition:</b> os.hpp:434</div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2windows_8hpp_html_a894c4d58faeee7675b9e7e8244de1386"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#a894c4d58faeee7675b9e7e8244de1386">ssize_t</a></div><div
class="ttdeci">SSIZE_T ssize_t</div><div class="ttdef"><b>Definition:</b>
windows.hpp:186</div></div>
-<div class="ttc" id="namespacepath_html"><div class="ttname"><a
href="namespacepath.html">path</a></div><div class="ttdef"><b>Definition:</b>
path.hpp:26</div></div>
-<div class="ttc" id="structNothing_html"><div class="ttname"><a
href="structNothing.html">Nothing</a></div><div
class="ttdef"><b>Definition:</b> nothing.hpp:16</div></div>
-<div class="ttc" id="namespaceos_html_afefbea8a88b84bed66580372accb18a9"><div
class="ttname"><a
href="namespaceos.html#afefbea8a88b84bed66580372accb18a9">os::pipe</a></div><div
class="ttdeci">Try< std::array< int, 2 > > pipe()</div><div
class="ttdef"><b>Definition:</b> pipe.hpp:26</div></div>
-<div class="ttc" id="classError_html"><div class="ttname"><a
href="classError.html">Error</a></div><div class="ttdef"><b>Definition:</b>
errorbase.hpp:36</div></div>
-<div class="ttc" id="classOption_html"><div class="ttname"><a
href="classOption.html">Option</a></div><div class="ttdef"><b>Definition:</b>
option.hpp:28</div></div>
-<div class="ttc" id="namespacens_html_a98bf4d9e11d546326250997a6493f835"><div
class="ttname"><a
href="namespacens.html#a98bf4d9e11d546326250997a6493f835">ns::clone</a></div><div
class="ttdeci">Try< pid_t > clone(pid_t target, int nstypes, const
lambda::function< int()> &f, int flags)</div><div
class="ttdoc">Performs an os::clone after entering a set of namespaces for the
specified target process...</div></div>
-<div class="ttc" id="abort_8hpp_html_a4d84a74fe6e4f84bc3d2f901b9e89f93"><div
class="ttname"><a
href="abort_8hpp.html#a4d84a74fe6e4f84bc3d2f901b9e89f93">ABORT</a></div><div
class="ttdeci">#define ABORT(...)</div><div class="ttdef"><b>Definition:</b>
abort.hpp:40</div></div>
-<div class="ttc" id="classOption_html_abbbed1bc42634fa9092160b16be6ca7e"><div
class="ttname"><a
href="classOption.html#abbbed1bc42634fa9092160b16be6ca7e">Option::getOrElse</a></div><div
class="ttdeci">T getOrElse(U &&u) const &</div><div
class="ttdef"><b>Definition:</b> option.hpp:127</div></div>
-<div class="ttc"
id="namespaceprocess_html_a882829822afa4f33b90aafc9c4ffa9af"><div
class="ttname"><a
href="namespaceprocess.html#a882829822afa4f33b90aafc9c4ffa9af">process::OutputFileDescriptors</a></div><div
class="ttdeci">Subprocess::IO::OutputFileDescriptors
OutputFileDescriptors</div><div class="ttdef"><b>Definition:</b>
subprocess.hpp:344</div></div>
-<div class="ttc" id="classTry_html_a8bc7f43e75a47111ea18e9c83b007be5"><div
class="ttname"><a
href="classTry.html#a8bc7f43e75a47111ea18e9c83b007be5">Try::get</a></div><div
class="ttdeci">T & get()&</div><div class="ttdef"><b>Definition:</b>
try.hpp:73</div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2windows_8hpp_html_a1c2b5693161bbc9d516ef5d16c7b54f5"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#a1c2b5693161bbc9d516ef5d16c7b54f5">SIGKILL</a></div><div
class="ttdeci">const mode_t SIGKILL</div><div class="ttdef"><b>Definition:</b>
windows.hpp:335</div></div>
-<div class="ttc" id="classprocess_1_1Subprocess_1_1ChildHook_html"><div
class="ttname"><a
href="classprocess_1_1Subprocess_1_1ChildHook.html">process::Subprocess::ChildHook</a></div><div
class="ttdoc">A ChildHook can be passed to a subprocess call. </div><div
class="ttdef"><b>Definition:</b> subprocess.hpp:190</div></div>
-<div class="ttc" id="classTry_html"><div class="ttname"><a
href="classTry.html">Try</a></div><div class="ttdef"><b>Definition:</b>
check.hpp:33</div></div>
-<div class="ttc" id="classhashset_html"><div class="ttname"><a
href="classhashset.html">hashset</a></div><div class="ttdef"><b>Definition:</b>
hashset.hpp:53</div></div>
-<div class="ttc" id="subprocess_8hpp_html"><div class="ttname"><a
href="subprocess_8hpp.html">subprocess.hpp</a></div></div>
-<div class="ttc" id="os_8hpp_html"><div class="ttname"><a
href="os_8hpp.html">os.hpp</a></div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2os_2environment_8hpp_html"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2os_2environment_8hpp.html">environment.hpp</a></div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors_html_a0a3f315345ef7b7ee6f3f1d4d337854d"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#a0a3f315345ef7b7ee6f3f1d4d337854d">process::Subprocess::IO::InputFileDescriptors::read</a></div><div
class="ttdeci">int_fd read</div><div class="ttdef"><b>Definition:</b>
subprocess.hpp:75</div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors_html"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html">process::Subprocess::IO::OutputFileDescriptors</a></div><div
class="ttdoc">For output file descriptors a child writes to the write file
descriptor and a parent may read from th...</div><div
class="ttdef"><b>Definition:</b> subprocess.hpp:88</div></div>
-<div class="ttc" id="none_8hpp_html"><div class="ttname"><a
href="none_8hpp.html">none.hpp</a></div></div>
-<div class="ttc"
id="namespaceprocess_1_1internal_html_af2f19b6f367cddc0c8283560a9cd9215"><div
class="ttname"><a
href="namespaceprocess_1_1internal.html#af2f19b6f367cddc0c8283560a9cd9215">process::internal::defaultClone</a></div><div
class="ttdeci">pid_t defaultClone(const lambda::function< int()>
&func)</div><div class="ttdef"><b>Definition:</b>
subprocess_posix.hpp:58</div></div>
-<div class="ttc" id="classErrnoError_html"><div class="ttname"><a
href="classErrnoError.html">ErrnoError</a></div><div
class="ttdef"><b>Definition:</b> errorbase.hpp:50</div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2windows_8hpp_html_ae2fe1725bb5e9823d089c46b9ed5266e"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ae2fe1725bb5e9823d089c46b9ed5266e">STDERR_FILENO</a></div><div
class="ttdeci">#define STDERR_FILENO</div><div
class="ttdef"><b>Definition:</b> windows.hpp:155</div></div>
-<div class="ttc" id="stout_2include_2stout_2check_8hpp_html"><div
class="ttname"><a
href="stout_2include_2stout_2check_8hpp.html">check.hpp</a></div></div>
-<div class="ttc"
id="namespaceprocess_1_1internal_html_a345a534b82b79bf20333fb6faef43e93"><div
class="ttname"><a
href="namespaceprocess_1_1internal.html#a345a534b82b79bf20333fb6faef43e93">process::internal::cloexec</a></div><div
class="ttdeci">Try< Nothing > cloexec(const InputFileDescriptors
&stdinfds, const OutputFileDescriptors &stdoutfds, const
OutputFileDescriptors &stderrfds)</div><div
class="ttdef"><b>Definition:</b> subprocess_posix.hpp:76</div></div>
-<div class="ttc" id="lambda_8hpp_html"><div class="ttname"><a
href="lambda_8hpp.html">lambda.hpp</a></div></div>
-<div class="ttc" id="close_8hpp_html"><div class="ttname"><a
href="close_8hpp.html">close.hpp</a></div></div>
-<div class="ttc" id="classOption_html_a4e3bf8416d95246f43c91f1b5c309323"><div
class="ttname"><a
href="classOption.html#a4e3bf8416d95246f43c91f1b5c309323">Option::isSome</a></div><div
class="ttdeci">bool isSome() const </div><div class="ttdef"><b>Definition:</b>
option.hpp:115</div></div>
-<div class="ttc"
id="namespaceprocess_html_afc6611c4913642642277b44447a16e55"><div
class="ttname"><a
href="namespaceprocess.html#afc6611c4913642642277b44447a16e55">process::InputFileDescriptors</a></div><div
class="ttdeci">Subprocess::IO::InputFileDescriptors
InputFileDescriptors</div><div class="ttdef"><b>Definition:</b>
subprocess.hpp:343</div></div>
-<div class="ttc" id="strerror_8hpp_html"><div class="ttname"><a
href="strerror_8hpp.html">strerror.hpp</a></div></div>
-<div class="ttc"
id="namespacemesos_1_1internal_1_1tests_html_a1396c5e3b0a179220de2792d74770ec2"><div
class="ttname"><a
href="namespacemesos_1_1internal_1_1tests.html#a1396c5e3b0a179220de2792d74770ec2">mesos::internal::tests::environment</a></div><div
class="ttdeci">Environment * environment</div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2windows_8hpp_html_ab03ced250ed239bc3b50b669493997f9"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a></div><div
class="ttdeci">DWORD pid_t</div><div class="ttdef"><b>Definition:</b>
windows.hpp:181</div></div>
-<div class="ttc"
id="namespacerouting_1_1link_html_a26486cdba01ef1c80706b1e07e8a6d3f"><div
class="ttname"><a
href="namespacerouting_1_1link.html#a26486cdba01ef1c80706b1e07e8a6d3f">routing::link::index</a></div><div
class="ttdeci">Result< int > index(const std::string
&link)</div></div>
-<div class="ttc"
id="stout_2include_2stout_2check_8hpp_html_aee320e7c6e107071f4b85d4cc135a265"><div
class="ttname"><a
href="stout_2include_2stout_2check_8hpp.html#aee320e7c6e107071f4b85d4cc135a265">CHECK_SOME</a></div><div
class="ttdeci">#define CHECK_SOME(expression)</div><div
class="ttdef"><b>Definition:</b> check.hpp:50</div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2windows_8hpp_html_abd165ee6474b5b75bf075842fff13a04"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#abd165ee6474b5b75bf075842fff13a04">STDOUT_FILENO</a></div><div
class="ttdeci">#define STDOUT_FILENO</div><div
class="ttdef"><b>Definition:</b> windows.hpp:154</div></div>
-<div class="ttc" id="fcntl_8hpp_html"><div class="ttname"><a
href="fcntl_8hpp.html">fcntl.hpp</a></div></div>
-<div class="ttc" id="nothing_8hpp_html"><div class="ttname"><a
href="nothing_8hpp.html">nothing.hpp</a></div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors_html_a5dabb8e3008efd61ce42478f260b54ac"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#a5dabb8e3008efd61ce42478f260b54ac">process::Subprocess::IO::OutputFileDescriptors::write</a></div><div
class="ttdeci">int_fd write</div><div class="ttdef"><b>Definition:</b>
subprocess.hpp:91</div></div>
-<div class="ttc" id="namespaceos_html_a8df77ec6d6b8d32d9b287a41bc74cfdc"><div
class="ttname"><a
href="namespaceos.html#a8df77ec6d6b8d32d9b287a41bc74cfdc">os::close</a></div><div
class="ttdeci">Try< Nothing > close(int fd)</div><div
class="ttdef"><b>Definition:</b> close.hpp:24</div></div>
-<div class="ttc" id="namespaceos_html_a7d71bda07a41304403b0e13aa47f0764"><div
class="ttname"><a
href="namespaceos.html#a7d71bda07a41304403b0e13aa47f0764">os::cloexec</a></div><div
class="ttdeci">Try< Nothing > cloexec(int fd)</div><div
class="ttdef"><b>Definition:</b> fcntl.hpp:27</div></div>
-<div class="ttc" id="classOption_html_a21358442c0fac1cc978a67a9a9089a79"><div
class="ttname"><a
href="classOption.html#a21358442c0fac1cc978a67a9a9089a79">Option::get</a></div><div
class="ttdeci">const T & get() const &</div><div
class="ttdef"><b>Definition:</b> option.hpp:118</div></div>
-<div class="ttc" id="foreach_8hpp_html_a66900b166526abe66464d6597536b111"><div
class="ttname"><a
href="foreach_8hpp.html#a66900b166526abe66464d6597536b111">foreachpair</a></div><div
class="ttdeci">#define foreachpair(KEY, VALUE, ELEMS)</div><div
class="ttdef"><b>Definition:</b> foreach.hpp:51</div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors_html"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html">process::Subprocess::IO::InputFileDescriptors</a></div><div
class="ttdoc">For input file descriptors a child reads from the read file
descriptor and a parent may write to the ...</div><div
class="ttdef"><b>Definition:</b> subprocess.hpp:73</div></div>
-<div class="ttc"
id="namespaceprocess_1_1internal_html_afe2c3a3ffdd0ee6fda82e198ece80a37"><div
class="ttname"><a
href="namespaceprocess_1_1internal.html#afe2c3a3ffdd0ee6fda82e198ece80a37">process::internal::cloneChild</a></div><div
class="ttdeci">Try< pid_t > cloneChild(const std::string &path,
std::vector< std::string > argv, const Option< std::map<
std::string, std::string >> &environment, const Option<
lambda::function< pid_t(const lambda::function< int()> &)>>
&_clone, const std::vector< Subprocess::ParentHook >
&parent_hooks, const std::vector< Subprocess::ChildHook >
&child_hooks, const InputFileDescriptors stdinfds, const
OutputFileDescriptors stdoutfds, const OutputFileDescriptors
stderrfds)</div><div class="ttdef"><b>Definition:</b>
subprocess_posix.hpp:200</div></div>
-<div class="ttc" id="option_8hpp_html"><div class="ttname"><a
href="option_8hpp.html">option.hpp</a></div></div>
-<div class="ttc"
id="3rdparty_2stout_2include_2stout_2windows_8hpp_html_afcf80a6d91178952d107ad00b165752b"><div
class="ttname"><a
href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#afcf80a6d91178952d107ad00b165752b">STDIN_FILENO</a></div><div
class="ttdeci">#define STDIN_FILENO</div><div class="ttdef"><b>Definition:</b>
windows.hpp:153</div></div>
-<div class="ttc" id="classTry_html_aec4a11ddd3c036e889d90b7eb6258ba7"><div
class="ttname"><a
href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">Try::error</a></div><div
class="ttdeci">static Try error(const E &e)</div><div
class="ttdef"><b>Definition:</b> try.hpp:42</div></div>
-<div class="ttc"
id="unreachable_8hpp_html_a0bc63b24b654ca433be7b97a3edde132"><div
class="ttname"><a
href="unreachable_8hpp.html#a0bc63b24b654ca433be7b97a3edde132">UNREACHABLE</a></div><div
class="ttdeci">#define UNREACHABLE()</div><div
class="ttdef"><b>Definition:</b> unreachable.hpp:22</div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1ParentHook_html_aaf9ff141314d619cd65cd8ec9320fb7d"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1ParentHook.html#aaf9ff141314d619cd65cd8ec9320fb7d">process::Subprocess::ParentHook::parent_setup</a></div><div
class="ttdeci">const lambda::function< Try< Nothing >pid_t)>
parent_setup</div><div class="ttdoc">The callback that must be specified for
execution after the child has been cloned, but before it starts executing the
new process. </div><div class="ttdef"><b>Definition:</b>
subprocess.hpp:163</div></div>
-<div class="ttc" id="foreach_8hpp_html"><div class="ttname"><a
href="foreach_8hpp.html">foreach.hpp</a></div></div>
-<div class="ttc" id="error_8hpp_html"><div class="ttname"><a
href="error_8hpp.html">error.hpp</a></div></div>
-<div class="ttc" id="namespaceinternal_html"><div class="ttname"><a
href="namespaceinternal.html">internal</a></div><div
class="ttdef"><b>Definition:</b> attributes.hpp:24</div></div>
-<div class="ttc" id="classTry_html_a0b98f95163b8a38daafd1651b043a276"><div
class="ttname"><a
href="classTry.html#a0b98f95163b8a38daafd1651b043a276">Try::isError</a></div><div
class="ttdeci">bool isError() const </div><div
class="ttdef"><b>Definition:</b> try.hpp:71</div></div>
-<div class="ttc"
id="namespacemesos_1_1internal_1_1credentials_html_a137c93d60149616181a10e9f39986f7f"><div
class="ttname"><a
href="namespacemesos_1_1internal_1_1credentials.html#a137c93d60149616181a10e9f39986f7f">mesos::internal::credentials::read</a></div><div
class="ttdeci">Result< Credentials > read(const Path
&path)</div><div class="ttdef"><b>Definition:</b>
credentials.hpp:35</div></div>
-<div class="ttc"
id="namespacemesos_1_1internal_1_1slave_1_1cni_1_1spec_html_ae58e703656ab4a1bd5d9870441236727"><div
class="ttname"><a
href="namespacemesos_1_1internal_1_1slave_1_1cni_1_1spec.html#ae58e703656ab4a1bd5d9870441236727">mesos::internal::slave::cni::spec::error</a></div><div
class="ttdeci">std::string error(const std::string &msg, uint32_t
code)</div></div>
-<div class="ttc" id="namespaceprocess_html"><div class="ttname"><a
href="namespaceprocess.html">process</a></div><div
class="ttdef"><b>Definition:</b> executor.hpp:48</div></div>
-<div class="ttc" id="exit_8hpp_html"><div class="ttname"><a
href="exit_8hpp.html">exit.hpp</a></div></div>
-<div class="ttc" id="try_8hpp_html"><div class="ttname"><a
href="try_8hpp.html">try.hpp</a></div></div>
-<div class="ttc" id="namespaceos_html_aebc3586b2be0d2b9093ccfbf25dfcde8"><div
class="ttname"><a
href="namespaceos.html#aebc3586b2be0d2b9093ccfbf25dfcde8">os::execvpe</a></div><div
class="ttdeci">int execvpe(const std::string &command, const
std::vector< std::string > &argv, const std::map< std::string,
std::string > &envp)</div><div class="ttdef"><b>Definition:</b>
shell.hpp:592</div></div>
-<div class="ttc" id="signals_8hpp_html"><div class="ttname"><a
href="signals_8hpp.html">signals.hpp</a></div></div>
-<div class="ttc" id="hashset_8hpp_html"><div class="ttname"><a
href="hashset_8hpp.html">hashset.hpp</a></div></div>
-<div class="ttc"
id="namespacemesos_1_1internal_1_1log_1_1protocol_html_a66ff2d5af4db53227f787281c0765d8d"><div
class="ttname"><a
href="namespacemesos_1_1internal_1_1log_1_1protocol.html#a66ff2d5af4db53227f787281c0765d8d">mesos::internal::log::protocol::write</a></div><div
class="ttdeci">Protocol< WriteRequest, WriteResponse > write</div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors_html_ac4af678c631a700d4be4410a250e3bce"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1IO_1_1OutputFileDescriptors.html#ac4af678c631a700d4be4410a250e3bce">process::Subprocess::IO::OutputFileDescriptors::read</a></div><div
class="ttdeci">Option< int_fd > read</div><div
class="ttdef"><b>Definition:</b> subprocess.hpp:90</div></div>
-<div class="ttc"
id="namespacecgroups_html_ab75e1e2d1be63eec907bf12306a7c8a7"><div
class="ttname"><a
href="namespacecgroups.html#ab75e1e2d1be63eec907bf12306a7c8a7">cgroups::kill</a></div><div
class="ttdeci">Try< Nothing > kill(const std::string &hierarchy,
const std::string &cgroup, int signal)</div></div>
-<div class="ttc"
id="namespaceprocess_1_1network_html_ad067110a4b38cc83785a43f49bf6c8e2"><div
class="ttname"><a
href="namespaceprocess_1_1network.html#ad067110a4b38cc83785a43f49bf6c8e2">process::network::bind</a></div><div
class="ttdeci">Try< Nothing > bind(int_fd s, const Address
&address)</div><div class="ttdef"><b>Definition:</b>
network.hpp:46</div></div>
-<div class="ttc"
id="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors_html_ab812da47364d793d9ec0471d3dc8c1bc"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1IO_1_1InputFileDescriptors.html#ab812da47364d793d9ec0471d3dc8c1bc">process::Subprocess::IO::InputFileDescriptors::write</a></div><div
class="ttdeci">Option< int_fd > write</div><div
class="ttdef"><b>Definition:</b> subprocess.hpp:76</div></div>
-<div class="ttc" id="structprocess_1_1Subprocess_1_1ParentHook_html"><div
class="ttname"><a
href="structprocess_1_1Subprocess_1_1ParentHook.html">process::Subprocess::ParentHook</a></div><div
class="ttdoc">A hook can be passed to a subprocess call. </div><div
class="ttdef"><b>Definition:</b> subprocess.hpp:152</div></div>
-<div class="ttc" id="namespacens_html_a28116b46e6543597a11733424cd1aa20"><div
class="ttname"><a
href="namespacens.html#a28116b46e6543597a11733424cd1aa20">ns::stringify</a></div><div
class="ttdeci">std::string stringify(int flags)</div></div>
-<div class="ttc" id="exit_8hpp_html_a637cd32ee4af0a5a1d1aea8a0d7f7564"><div
class="ttname"><a
href="exit_8hpp.html#a637cd32ee4af0a5a1d1aea8a0d7f7564">SAFE_EXIT</a></div><div
class="ttdeci">#define SAFE_EXIT(status, fmt,...)</div><div
class="ttdef"><b>Definition:</b> exit.hpp:42</div></div>
-<div class="ttc" id="unreachable_8hpp_html"><div class="ttname"><a
href="unreachable_8hpp.html">unreachable.hpp</a></div></div>
-<div class="ttc"
id="namespaceprocess_1_1internal_html_a902e2646d88c41ce674a3009cafe0aad"><div
class="ttname"><a
href="namespaceprocess_1_1internal.html#a902e2646d88c41ce674a3009cafe0aad">process::internal::childMain</a></div><div
class="ttdeci">int childMain(const std::string &path, char **argv, char
**envp, const InputFileDescriptors &stdinfds, const OutputFileDescriptors
&stdoutfds, const OutputFileDescriptors &stderrfds, bool blocking, int
pipes[2], const std::vector< Subprocess::ChildHook >
&child_hooks)</div><div class="ttdef"><b>Definition:</b>
subprocess_posix.hpp:106</div></div>
-<div class="ttc"
id="namespaceos_1_1raw_html_aad2bd3acb3ca09c75a1a1db58075f9f4"><div
class="ttname"><a
href="namespaceos_1_1raw.html#aad2bd3acb3ca09c75a1a1db58075f9f4">os::raw::environment</a></div><div
class="ttdeci">char ** environment()</div><div
class="ttdef"><b>Definition:</b> environment.hpp:66</div></div>
-</div><!-- fragment --></div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated by  <a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.11
-</small></address>
-</body>
-</html>