xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/subprocess.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker# subprocess - Subprocesses with accessible I/O streams
2*cda5da8dSAndroid Build Coastguard Worker#
3*cda5da8dSAndroid Build Coastguard Worker# For more information about this module, see PEP 324.
4*cda5da8dSAndroid Build Coastguard Worker#
5*cda5da8dSAndroid Build Coastguard Worker# Copyright (c) 2003-2005 by Peter Astrand <[email protected]>
6*cda5da8dSAndroid Build Coastguard Worker#
7*cda5da8dSAndroid Build Coastguard Worker# Licensed to PSF under a Contributor Agreement.
8*cda5da8dSAndroid Build Coastguard Worker
9*cda5da8dSAndroid Build Coastguard Workerr"""Subprocesses with accessible I/O streams
10*cda5da8dSAndroid Build Coastguard Worker
11*cda5da8dSAndroid Build Coastguard WorkerThis module allows you to spawn processes, connect to their
12*cda5da8dSAndroid Build Coastguard Workerinput/output/error pipes, and obtain their return codes.
13*cda5da8dSAndroid Build Coastguard Worker
14*cda5da8dSAndroid Build Coastguard WorkerFor a complete description of this module see the Python documentation.
15*cda5da8dSAndroid Build Coastguard Worker
16*cda5da8dSAndroid Build Coastguard WorkerMain API
17*cda5da8dSAndroid Build Coastguard Worker========
18*cda5da8dSAndroid Build Coastguard Workerrun(...): Runs a command, waits for it to complete, then returns a
19*cda5da8dSAndroid Build Coastguard Worker          CompletedProcess instance.
20*cda5da8dSAndroid Build Coastguard WorkerPopen(...): A class for flexibly executing a command in a new process
21*cda5da8dSAndroid Build Coastguard Worker
22*cda5da8dSAndroid Build Coastguard WorkerConstants
23*cda5da8dSAndroid Build Coastguard Worker---------
24*cda5da8dSAndroid Build Coastguard WorkerDEVNULL: Special value that indicates that os.devnull should be used
25*cda5da8dSAndroid Build Coastguard WorkerPIPE:    Special value that indicates a pipe should be created
26*cda5da8dSAndroid Build Coastguard WorkerSTDOUT:  Special value that indicates that stderr should go to stdout
27*cda5da8dSAndroid Build Coastguard Worker
28*cda5da8dSAndroid Build Coastguard Worker
29*cda5da8dSAndroid Build Coastguard WorkerOlder API
30*cda5da8dSAndroid Build Coastguard Worker=========
31*cda5da8dSAndroid Build Coastguard Workercall(...): Runs a command, waits for it to complete, then returns
32*cda5da8dSAndroid Build Coastguard Worker    the return code.
33*cda5da8dSAndroid Build Coastguard Workercheck_call(...): Same as call() but raises CalledProcessError()
34*cda5da8dSAndroid Build Coastguard Worker    if return code is not 0
35*cda5da8dSAndroid Build Coastguard Workercheck_output(...): Same as check_call() but returns the contents of
36*cda5da8dSAndroid Build Coastguard Worker    stdout instead of a return code
37*cda5da8dSAndroid Build Coastguard Workergetoutput(...): Runs a command in the shell, waits for it to complete,
38*cda5da8dSAndroid Build Coastguard Worker    then returns the output
39*cda5da8dSAndroid Build Coastguard Workergetstatusoutput(...): Runs a command in the shell, waits for it to complete,
40*cda5da8dSAndroid Build Coastguard Worker    then returns a (exitcode, output) tuple
41*cda5da8dSAndroid Build Coastguard Worker"""
42*cda5da8dSAndroid Build Coastguard Worker
43*cda5da8dSAndroid Build Coastguard Workerimport builtins
44*cda5da8dSAndroid Build Coastguard Workerimport errno
45*cda5da8dSAndroid Build Coastguard Workerimport io
46*cda5da8dSAndroid Build Coastguard Workerimport locale
47*cda5da8dSAndroid Build Coastguard Workerimport os
48*cda5da8dSAndroid Build Coastguard Workerimport time
49*cda5da8dSAndroid Build Coastguard Workerimport signal
50*cda5da8dSAndroid Build Coastguard Workerimport sys
51*cda5da8dSAndroid Build Coastguard Workerimport threading
52*cda5da8dSAndroid Build Coastguard Workerimport warnings
53*cda5da8dSAndroid Build Coastguard Workerimport contextlib
54*cda5da8dSAndroid Build Coastguard Workerfrom time import monotonic as _time
55*cda5da8dSAndroid Build Coastguard Workerimport types
56*cda5da8dSAndroid Build Coastguard Worker
57*cda5da8dSAndroid Build Coastguard Workertry:
58*cda5da8dSAndroid Build Coastguard Worker    import fcntl
59*cda5da8dSAndroid Build Coastguard Workerexcept ImportError:
60*cda5da8dSAndroid Build Coastguard Worker    fcntl = None
61*cda5da8dSAndroid Build Coastguard Worker
62*cda5da8dSAndroid Build Coastguard Worker
63*cda5da8dSAndroid Build Coastguard Worker__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
64*cda5da8dSAndroid Build Coastguard Worker           "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL",
65*cda5da8dSAndroid Build Coastguard Worker           "SubprocessError", "TimeoutExpired", "CompletedProcess"]
66*cda5da8dSAndroid Build Coastguard Worker           # NOTE: We intentionally exclude list2cmdline as it is
67*cda5da8dSAndroid Build Coastguard Worker           # considered an internal implementation detail.  issue10838.
68*cda5da8dSAndroid Build Coastguard Worker
69*cda5da8dSAndroid Build Coastguard Worker# use presence of msvcrt to detect Windows-like platforms (see bpo-8110)
70*cda5da8dSAndroid Build Coastguard Workertry:
71*cda5da8dSAndroid Build Coastguard Worker    import msvcrt
72*cda5da8dSAndroid Build Coastguard Workerexcept ModuleNotFoundError:
73*cda5da8dSAndroid Build Coastguard Worker    _mswindows = False
74*cda5da8dSAndroid Build Coastguard Workerelse:
75*cda5da8dSAndroid Build Coastguard Worker    _mswindows = True
76*cda5da8dSAndroid Build Coastguard Worker
77*cda5da8dSAndroid Build Coastguard Worker# wasm32-emscripten and wasm32-wasi do not support processes
78*cda5da8dSAndroid Build Coastguard Worker_can_fork_exec = sys.platform not in {"emscripten", "wasi"}
79*cda5da8dSAndroid Build Coastguard Worker
80*cda5da8dSAndroid Build Coastguard Workerif _mswindows:
81*cda5da8dSAndroid Build Coastguard Worker    import _winapi
82*cda5da8dSAndroid Build Coastguard Worker    from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP,
83*cda5da8dSAndroid Build Coastguard Worker                         STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
84*cda5da8dSAndroid Build Coastguard Worker                         STD_ERROR_HANDLE, SW_HIDE,
85*cda5da8dSAndroid Build Coastguard Worker                         STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
86*cda5da8dSAndroid Build Coastguard Worker                         ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
87*cda5da8dSAndroid Build Coastguard Worker                         HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
88*cda5da8dSAndroid Build Coastguard Worker                         NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
89*cda5da8dSAndroid Build Coastguard Worker                         CREATE_NO_WINDOW, DETACHED_PROCESS,
90*cda5da8dSAndroid Build Coastguard Worker                         CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB)
91*cda5da8dSAndroid Build Coastguard Worker
92*cda5da8dSAndroid Build Coastguard Worker    __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP",
93*cda5da8dSAndroid Build Coastguard Worker                    "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
94*cda5da8dSAndroid Build Coastguard Worker                    "STD_ERROR_HANDLE", "SW_HIDE",
95*cda5da8dSAndroid Build Coastguard Worker                    "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
96*cda5da8dSAndroid Build Coastguard Worker                    "STARTUPINFO",
97*cda5da8dSAndroid Build Coastguard Worker                    "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
98*cda5da8dSAndroid Build Coastguard Worker                    "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
99*cda5da8dSAndroid Build Coastguard Worker                    "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS",
100*cda5da8dSAndroid Build Coastguard Worker                    "CREATE_NO_WINDOW", "DETACHED_PROCESS",
101*cda5da8dSAndroid Build Coastguard Worker                    "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
102*cda5da8dSAndroid Build Coastguard Workerelse:
103*cda5da8dSAndroid Build Coastguard Worker    if _can_fork_exec:
104*cda5da8dSAndroid Build Coastguard Worker        from _posixsubprocess import fork_exec as _fork_exec
105*cda5da8dSAndroid Build Coastguard Worker        # used in methods that are called by __del__
106*cda5da8dSAndroid Build Coastguard Worker        _waitpid = os.waitpid
107*cda5da8dSAndroid Build Coastguard Worker        _waitstatus_to_exitcode = os.waitstatus_to_exitcode
108*cda5da8dSAndroid Build Coastguard Worker        _WIFSTOPPED = os.WIFSTOPPED
109*cda5da8dSAndroid Build Coastguard Worker        _WSTOPSIG = os.WSTOPSIG
110*cda5da8dSAndroid Build Coastguard Worker        _WNOHANG = os.WNOHANG
111*cda5da8dSAndroid Build Coastguard Worker    else:
112*cda5da8dSAndroid Build Coastguard Worker        _fork_exec = None
113*cda5da8dSAndroid Build Coastguard Worker        _waitpid = None
114*cda5da8dSAndroid Build Coastguard Worker        _waitstatus_to_exitcode = None
115*cda5da8dSAndroid Build Coastguard Worker        _WIFSTOPPED = None
116*cda5da8dSAndroid Build Coastguard Worker        _WSTOPSIG = None
117*cda5da8dSAndroid Build Coastguard Worker        _WNOHANG = None
118*cda5da8dSAndroid Build Coastguard Worker    import select
119*cda5da8dSAndroid Build Coastguard Worker    import selectors
120*cda5da8dSAndroid Build Coastguard Worker
121*cda5da8dSAndroid Build Coastguard Worker
122*cda5da8dSAndroid Build Coastguard Worker# Exception classes used by this module.
123*cda5da8dSAndroid Build Coastguard Workerclass SubprocessError(Exception): pass
124*cda5da8dSAndroid Build Coastguard Worker
125*cda5da8dSAndroid Build Coastguard Worker
126*cda5da8dSAndroid Build Coastguard Workerclass CalledProcessError(SubprocessError):
127*cda5da8dSAndroid Build Coastguard Worker    """Raised when run() is called with check=True and the process
128*cda5da8dSAndroid Build Coastguard Worker    returns a non-zero exit status.
129*cda5da8dSAndroid Build Coastguard Worker
130*cda5da8dSAndroid Build Coastguard Worker    Attributes:
131*cda5da8dSAndroid Build Coastguard Worker      cmd, returncode, stdout, stderr, output
132*cda5da8dSAndroid Build Coastguard Worker    """
133*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, returncode, cmd, output=None, stderr=None):
134*cda5da8dSAndroid Build Coastguard Worker        self.returncode = returncode
135*cda5da8dSAndroid Build Coastguard Worker        self.cmd = cmd
136*cda5da8dSAndroid Build Coastguard Worker        self.output = output
137*cda5da8dSAndroid Build Coastguard Worker        self.stderr = stderr
138*cda5da8dSAndroid Build Coastguard Worker
139*cda5da8dSAndroid Build Coastguard Worker    def __str__(self):
140*cda5da8dSAndroid Build Coastguard Worker        if self.returncode and self.returncode < 0:
141*cda5da8dSAndroid Build Coastguard Worker            try:
142*cda5da8dSAndroid Build Coastguard Worker                return "Command '%s' died with %r." % (
143*cda5da8dSAndroid Build Coastguard Worker                        self.cmd, signal.Signals(-self.returncode))
144*cda5da8dSAndroid Build Coastguard Worker            except ValueError:
145*cda5da8dSAndroid Build Coastguard Worker                return "Command '%s' died with unknown signal %d." % (
146*cda5da8dSAndroid Build Coastguard Worker                        self.cmd, -self.returncode)
147*cda5da8dSAndroid Build Coastguard Worker        else:
148*cda5da8dSAndroid Build Coastguard Worker            return "Command '%s' returned non-zero exit status %d." % (
149*cda5da8dSAndroid Build Coastguard Worker                    self.cmd, self.returncode)
150*cda5da8dSAndroid Build Coastguard Worker
151*cda5da8dSAndroid Build Coastguard Worker    @property
152*cda5da8dSAndroid Build Coastguard Worker    def stdout(self):
153*cda5da8dSAndroid Build Coastguard Worker        """Alias for output attribute, to match stderr"""
154*cda5da8dSAndroid Build Coastguard Worker        return self.output
155*cda5da8dSAndroid Build Coastguard Worker
156*cda5da8dSAndroid Build Coastguard Worker    @stdout.setter
157*cda5da8dSAndroid Build Coastguard Worker    def stdout(self, value):
158*cda5da8dSAndroid Build Coastguard Worker        # There's no obvious reason to set this, but allow it anyway so
159*cda5da8dSAndroid Build Coastguard Worker        # .stdout is a transparent alias for .output
160*cda5da8dSAndroid Build Coastguard Worker        self.output = value
161*cda5da8dSAndroid Build Coastguard Worker
162*cda5da8dSAndroid Build Coastguard Worker
163*cda5da8dSAndroid Build Coastguard Workerclass TimeoutExpired(SubprocessError):
164*cda5da8dSAndroid Build Coastguard Worker    """This exception is raised when the timeout expires while waiting for a
165*cda5da8dSAndroid Build Coastguard Worker    child process.
166*cda5da8dSAndroid Build Coastguard Worker
167*cda5da8dSAndroid Build Coastguard Worker    Attributes:
168*cda5da8dSAndroid Build Coastguard Worker        cmd, output, stdout, stderr, timeout
169*cda5da8dSAndroid Build Coastguard Worker    """
170*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, cmd, timeout, output=None, stderr=None):
171*cda5da8dSAndroid Build Coastguard Worker        self.cmd = cmd
172*cda5da8dSAndroid Build Coastguard Worker        self.timeout = timeout
173*cda5da8dSAndroid Build Coastguard Worker        self.output = output
174*cda5da8dSAndroid Build Coastguard Worker        self.stderr = stderr
175*cda5da8dSAndroid Build Coastguard Worker
176*cda5da8dSAndroid Build Coastguard Worker    def __str__(self):
177*cda5da8dSAndroid Build Coastguard Worker        return ("Command '%s' timed out after %s seconds" %
178*cda5da8dSAndroid Build Coastguard Worker                (self.cmd, self.timeout))
179*cda5da8dSAndroid Build Coastguard Worker
180*cda5da8dSAndroid Build Coastguard Worker    @property
181*cda5da8dSAndroid Build Coastguard Worker    def stdout(self):
182*cda5da8dSAndroid Build Coastguard Worker        return self.output
183*cda5da8dSAndroid Build Coastguard Worker
184*cda5da8dSAndroid Build Coastguard Worker    @stdout.setter
185*cda5da8dSAndroid Build Coastguard Worker    def stdout(self, value):
186*cda5da8dSAndroid Build Coastguard Worker        # There's no obvious reason to set this, but allow it anyway so
187*cda5da8dSAndroid Build Coastguard Worker        # .stdout is a transparent alias for .output
188*cda5da8dSAndroid Build Coastguard Worker        self.output = value
189*cda5da8dSAndroid Build Coastguard Worker
190*cda5da8dSAndroid Build Coastguard Worker
191*cda5da8dSAndroid Build Coastguard Workerif _mswindows:
192*cda5da8dSAndroid Build Coastguard Worker    class STARTUPINFO:
193*cda5da8dSAndroid Build Coastguard Worker        def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
194*cda5da8dSAndroid Build Coastguard Worker                     hStdError=None, wShowWindow=0, lpAttributeList=None):
195*cda5da8dSAndroid Build Coastguard Worker            self.dwFlags = dwFlags
196*cda5da8dSAndroid Build Coastguard Worker            self.hStdInput = hStdInput
197*cda5da8dSAndroid Build Coastguard Worker            self.hStdOutput = hStdOutput
198*cda5da8dSAndroid Build Coastguard Worker            self.hStdError = hStdError
199*cda5da8dSAndroid Build Coastguard Worker            self.wShowWindow = wShowWindow
200*cda5da8dSAndroid Build Coastguard Worker            self.lpAttributeList = lpAttributeList or {"handle_list": []}
201*cda5da8dSAndroid Build Coastguard Worker
202*cda5da8dSAndroid Build Coastguard Worker        def copy(self):
203*cda5da8dSAndroid Build Coastguard Worker            attr_list = self.lpAttributeList.copy()
204*cda5da8dSAndroid Build Coastguard Worker            if 'handle_list' in attr_list:
205*cda5da8dSAndroid Build Coastguard Worker                attr_list['handle_list'] = list(attr_list['handle_list'])
206*cda5da8dSAndroid Build Coastguard Worker
207*cda5da8dSAndroid Build Coastguard Worker            return STARTUPINFO(dwFlags=self.dwFlags,
208*cda5da8dSAndroid Build Coastguard Worker                               hStdInput=self.hStdInput,
209*cda5da8dSAndroid Build Coastguard Worker                               hStdOutput=self.hStdOutput,
210*cda5da8dSAndroid Build Coastguard Worker                               hStdError=self.hStdError,
211*cda5da8dSAndroid Build Coastguard Worker                               wShowWindow=self.wShowWindow,
212*cda5da8dSAndroid Build Coastguard Worker                               lpAttributeList=attr_list)
213*cda5da8dSAndroid Build Coastguard Worker
214*cda5da8dSAndroid Build Coastguard Worker
215*cda5da8dSAndroid Build Coastguard Worker    class Handle(int):
216*cda5da8dSAndroid Build Coastguard Worker        closed = False
217*cda5da8dSAndroid Build Coastguard Worker
218*cda5da8dSAndroid Build Coastguard Worker        def Close(self, CloseHandle=_winapi.CloseHandle):
219*cda5da8dSAndroid Build Coastguard Worker            if not self.closed:
220*cda5da8dSAndroid Build Coastguard Worker                self.closed = True
221*cda5da8dSAndroid Build Coastguard Worker                CloseHandle(self)
222*cda5da8dSAndroid Build Coastguard Worker
223*cda5da8dSAndroid Build Coastguard Worker        def Detach(self):
224*cda5da8dSAndroid Build Coastguard Worker            if not self.closed:
225*cda5da8dSAndroid Build Coastguard Worker                self.closed = True
226*cda5da8dSAndroid Build Coastguard Worker                return int(self)
227*cda5da8dSAndroid Build Coastguard Worker            raise ValueError("already closed")
228*cda5da8dSAndroid Build Coastguard Worker
229*cda5da8dSAndroid Build Coastguard Worker        def __repr__(self):
230*cda5da8dSAndroid Build Coastguard Worker            return "%s(%d)" % (self.__class__.__name__, int(self))
231*cda5da8dSAndroid Build Coastguard Worker
232*cda5da8dSAndroid Build Coastguard Worker        __del__ = Close
233*cda5da8dSAndroid Build Coastguard Workerelse:
234*cda5da8dSAndroid Build Coastguard Worker    # When select or poll has indicated that the file is writable,
235*cda5da8dSAndroid Build Coastguard Worker    # we can write up to _PIPE_BUF bytes without risk of blocking.
236*cda5da8dSAndroid Build Coastguard Worker    # POSIX defines PIPE_BUF as >= 512.
237*cda5da8dSAndroid Build Coastguard Worker    _PIPE_BUF = getattr(select, 'PIPE_BUF', 512)
238*cda5da8dSAndroid Build Coastguard Worker
239*cda5da8dSAndroid Build Coastguard Worker    # poll/select have the advantage of not requiring any extra file
240*cda5da8dSAndroid Build Coastguard Worker    # descriptor, contrarily to epoll/kqueue (also, they require a single
241*cda5da8dSAndroid Build Coastguard Worker    # syscall).
242*cda5da8dSAndroid Build Coastguard Worker    if hasattr(selectors, 'PollSelector'):
243*cda5da8dSAndroid Build Coastguard Worker        _PopenSelector = selectors.PollSelector
244*cda5da8dSAndroid Build Coastguard Worker    else:
245*cda5da8dSAndroid Build Coastguard Worker        _PopenSelector = selectors.SelectSelector
246*cda5da8dSAndroid Build Coastguard Worker
247*cda5da8dSAndroid Build Coastguard Worker
248*cda5da8dSAndroid Build Coastguard Workerif _mswindows:
249*cda5da8dSAndroid Build Coastguard Worker    # On Windows we just need to close `Popen._handle` when we no longer need
250*cda5da8dSAndroid Build Coastguard Worker    # it, so that the kernel can free it. `Popen._handle` gets closed
251*cda5da8dSAndroid Build Coastguard Worker    # implicitly when the `Popen` instance is finalized (see `Handle.__del__`,
252*cda5da8dSAndroid Build Coastguard Worker    # which is calling `CloseHandle` as requested in [1]), so there is nothing
253*cda5da8dSAndroid Build Coastguard Worker    # for `_cleanup` to do.
254*cda5da8dSAndroid Build Coastguard Worker    #
255*cda5da8dSAndroid Build Coastguard Worker    # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/
256*cda5da8dSAndroid Build Coastguard Worker    # creating-processes
257*cda5da8dSAndroid Build Coastguard Worker    _active = None
258*cda5da8dSAndroid Build Coastguard Worker
259*cda5da8dSAndroid Build Coastguard Worker    def _cleanup():
260*cda5da8dSAndroid Build Coastguard Worker        pass
261*cda5da8dSAndroid Build Coastguard Workerelse:
262*cda5da8dSAndroid Build Coastguard Worker    # This lists holds Popen instances for which the underlying process had not
263*cda5da8dSAndroid Build Coastguard Worker    # exited at the time its __del__ method got called: those processes are
264*cda5da8dSAndroid Build Coastguard Worker    # wait()ed for synchronously from _cleanup() when a new Popen object is
265*cda5da8dSAndroid Build Coastguard Worker    # created, to avoid zombie processes.
266*cda5da8dSAndroid Build Coastguard Worker    _active = []
267*cda5da8dSAndroid Build Coastguard Worker
268*cda5da8dSAndroid Build Coastguard Worker    def _cleanup():
269*cda5da8dSAndroid Build Coastguard Worker        if _active is None:
270*cda5da8dSAndroid Build Coastguard Worker            return
271*cda5da8dSAndroid Build Coastguard Worker        for inst in _active[:]:
272*cda5da8dSAndroid Build Coastguard Worker            res = inst._internal_poll(_deadstate=sys.maxsize)
273*cda5da8dSAndroid Build Coastguard Worker            if res is not None:
274*cda5da8dSAndroid Build Coastguard Worker                try:
275*cda5da8dSAndroid Build Coastguard Worker                    _active.remove(inst)
276*cda5da8dSAndroid Build Coastguard Worker                except ValueError:
277*cda5da8dSAndroid Build Coastguard Worker                    # This can happen if two threads create a new Popen instance.
278*cda5da8dSAndroid Build Coastguard Worker                    # It's harmless that it was already removed, so ignore.
279*cda5da8dSAndroid Build Coastguard Worker                    pass
280*cda5da8dSAndroid Build Coastguard Worker
281*cda5da8dSAndroid Build Coastguard WorkerPIPE = -1
282*cda5da8dSAndroid Build Coastguard WorkerSTDOUT = -2
283*cda5da8dSAndroid Build Coastguard WorkerDEVNULL = -3
284*cda5da8dSAndroid Build Coastguard Worker
285*cda5da8dSAndroid Build Coastguard Worker
286*cda5da8dSAndroid Build Coastguard Worker# XXX This function is only used by multiprocessing and the test suite,
287*cda5da8dSAndroid Build Coastguard Worker# but it's here so that it can be imported when Python is compiled without
288*cda5da8dSAndroid Build Coastguard Worker# threads.
289*cda5da8dSAndroid Build Coastguard Worker
290*cda5da8dSAndroid Build Coastguard Workerdef _optim_args_from_interpreter_flags():
291*cda5da8dSAndroid Build Coastguard Worker    """Return a list of command-line arguments reproducing the current
292*cda5da8dSAndroid Build Coastguard Worker    optimization settings in sys.flags."""
293*cda5da8dSAndroid Build Coastguard Worker    args = []
294*cda5da8dSAndroid Build Coastguard Worker    value = sys.flags.optimize
295*cda5da8dSAndroid Build Coastguard Worker    if value > 0:
296*cda5da8dSAndroid Build Coastguard Worker        args.append('-' + 'O' * value)
297*cda5da8dSAndroid Build Coastguard Worker    return args
298*cda5da8dSAndroid Build Coastguard Worker
299*cda5da8dSAndroid Build Coastguard Worker
300*cda5da8dSAndroid Build Coastguard Workerdef _args_from_interpreter_flags():
301*cda5da8dSAndroid Build Coastguard Worker    """Return a list of command-line arguments reproducing the current
302*cda5da8dSAndroid Build Coastguard Worker    settings in sys.flags, sys.warnoptions and sys._xoptions."""
303*cda5da8dSAndroid Build Coastguard Worker    flag_opt_map = {
304*cda5da8dSAndroid Build Coastguard Worker        'debug': 'd',
305*cda5da8dSAndroid Build Coastguard Worker        # 'inspect': 'i',
306*cda5da8dSAndroid Build Coastguard Worker        # 'interactive': 'i',
307*cda5da8dSAndroid Build Coastguard Worker        'dont_write_bytecode': 'B',
308*cda5da8dSAndroid Build Coastguard Worker        'no_site': 'S',
309*cda5da8dSAndroid Build Coastguard Worker        'verbose': 'v',
310*cda5da8dSAndroid Build Coastguard Worker        'bytes_warning': 'b',
311*cda5da8dSAndroid Build Coastguard Worker        'quiet': 'q',
312*cda5da8dSAndroid Build Coastguard Worker        # -O is handled in _optim_args_from_interpreter_flags()
313*cda5da8dSAndroid Build Coastguard Worker    }
314*cda5da8dSAndroid Build Coastguard Worker    args = _optim_args_from_interpreter_flags()
315*cda5da8dSAndroid Build Coastguard Worker    for flag, opt in flag_opt_map.items():
316*cda5da8dSAndroid Build Coastguard Worker        v = getattr(sys.flags, flag)
317*cda5da8dSAndroid Build Coastguard Worker        if v > 0:
318*cda5da8dSAndroid Build Coastguard Worker            args.append('-' + opt * v)
319*cda5da8dSAndroid Build Coastguard Worker
320*cda5da8dSAndroid Build Coastguard Worker    if sys.flags.isolated:
321*cda5da8dSAndroid Build Coastguard Worker        args.append('-I')
322*cda5da8dSAndroid Build Coastguard Worker    else:
323*cda5da8dSAndroid Build Coastguard Worker        if sys.flags.ignore_environment:
324*cda5da8dSAndroid Build Coastguard Worker            args.append('-E')
325*cda5da8dSAndroid Build Coastguard Worker        if sys.flags.no_user_site:
326*cda5da8dSAndroid Build Coastguard Worker            args.append('-s')
327*cda5da8dSAndroid Build Coastguard Worker        if sys.flags.safe_path:
328*cda5da8dSAndroid Build Coastguard Worker            args.append('-P')
329*cda5da8dSAndroid Build Coastguard Worker
330*cda5da8dSAndroid Build Coastguard Worker    # -W options
331*cda5da8dSAndroid Build Coastguard Worker    warnopts = sys.warnoptions[:]
332*cda5da8dSAndroid Build Coastguard Worker    xoptions = getattr(sys, '_xoptions', {})
333*cda5da8dSAndroid Build Coastguard Worker    bytes_warning = sys.flags.bytes_warning
334*cda5da8dSAndroid Build Coastguard Worker    dev_mode = sys.flags.dev_mode
335*cda5da8dSAndroid Build Coastguard Worker
336*cda5da8dSAndroid Build Coastguard Worker    if bytes_warning > 1:
337*cda5da8dSAndroid Build Coastguard Worker        warnopts.remove("error::BytesWarning")
338*cda5da8dSAndroid Build Coastguard Worker    elif bytes_warning:
339*cda5da8dSAndroid Build Coastguard Worker        warnopts.remove("default::BytesWarning")
340*cda5da8dSAndroid Build Coastguard Worker    if dev_mode:
341*cda5da8dSAndroid Build Coastguard Worker        warnopts.remove('default')
342*cda5da8dSAndroid Build Coastguard Worker    for opt in warnopts:
343*cda5da8dSAndroid Build Coastguard Worker        args.append('-W' + opt)
344*cda5da8dSAndroid Build Coastguard Worker
345*cda5da8dSAndroid Build Coastguard Worker    # -X options
346*cda5da8dSAndroid Build Coastguard Worker    if dev_mode:
347*cda5da8dSAndroid Build Coastguard Worker        args.extend(('-X', 'dev'))
348*cda5da8dSAndroid Build Coastguard Worker    for opt in ('faulthandler', 'tracemalloc', 'importtime',
349*cda5da8dSAndroid Build Coastguard Worker                'showrefcount', 'utf8'):
350*cda5da8dSAndroid Build Coastguard Worker        if opt in xoptions:
351*cda5da8dSAndroid Build Coastguard Worker            value = xoptions[opt]
352*cda5da8dSAndroid Build Coastguard Worker            if value is True:
353*cda5da8dSAndroid Build Coastguard Worker                arg = opt
354*cda5da8dSAndroid Build Coastguard Worker            else:
355*cda5da8dSAndroid Build Coastguard Worker                arg = '%s=%s' % (opt, value)
356*cda5da8dSAndroid Build Coastguard Worker            args.extend(('-X', arg))
357*cda5da8dSAndroid Build Coastguard Worker
358*cda5da8dSAndroid Build Coastguard Worker    return args
359*cda5da8dSAndroid Build Coastguard Worker
360*cda5da8dSAndroid Build Coastguard Worker
361*cda5da8dSAndroid Build Coastguard Workerdef _text_encoding():
362*cda5da8dSAndroid Build Coastguard Worker    # Return default text encoding and emit EncodingWarning if
363*cda5da8dSAndroid Build Coastguard Worker    # sys.flags.warn_default_encoding is true.
364*cda5da8dSAndroid Build Coastguard Worker    if sys.flags.warn_default_encoding:
365*cda5da8dSAndroid Build Coastguard Worker        f = sys._getframe()
366*cda5da8dSAndroid Build Coastguard Worker        filename = f.f_code.co_filename
367*cda5da8dSAndroid Build Coastguard Worker        stacklevel = 2
368*cda5da8dSAndroid Build Coastguard Worker        while f := f.f_back:
369*cda5da8dSAndroid Build Coastguard Worker            if f.f_code.co_filename != filename:
370*cda5da8dSAndroid Build Coastguard Worker                break
371*cda5da8dSAndroid Build Coastguard Worker            stacklevel += 1
372*cda5da8dSAndroid Build Coastguard Worker        warnings.warn("'encoding' argument not specified.",
373*cda5da8dSAndroid Build Coastguard Worker                      EncodingWarning, stacklevel)
374*cda5da8dSAndroid Build Coastguard Worker
375*cda5da8dSAndroid Build Coastguard Worker    if sys.flags.utf8_mode:
376*cda5da8dSAndroid Build Coastguard Worker        return "utf-8"
377*cda5da8dSAndroid Build Coastguard Worker    else:
378*cda5da8dSAndroid Build Coastguard Worker        return locale.getencoding()
379*cda5da8dSAndroid Build Coastguard Worker
380*cda5da8dSAndroid Build Coastguard Worker
381*cda5da8dSAndroid Build Coastguard Workerdef call(*popenargs, timeout=None, **kwargs):
382*cda5da8dSAndroid Build Coastguard Worker    """Run command with arguments.  Wait for command to complete or
383*cda5da8dSAndroid Build Coastguard Worker    timeout, then return the returncode attribute.
384*cda5da8dSAndroid Build Coastguard Worker
385*cda5da8dSAndroid Build Coastguard Worker    The arguments are the same as for the Popen constructor.  Example:
386*cda5da8dSAndroid Build Coastguard Worker
387*cda5da8dSAndroid Build Coastguard Worker    retcode = call(["ls", "-l"])
388*cda5da8dSAndroid Build Coastguard Worker    """
389*cda5da8dSAndroid Build Coastguard Worker    with Popen(*popenargs, **kwargs) as p:
390*cda5da8dSAndroid Build Coastguard Worker        try:
391*cda5da8dSAndroid Build Coastguard Worker            return p.wait(timeout=timeout)
392*cda5da8dSAndroid Build Coastguard Worker        except:  # Including KeyboardInterrupt, wait handled that.
393*cda5da8dSAndroid Build Coastguard Worker            p.kill()
394*cda5da8dSAndroid Build Coastguard Worker            # We don't call p.wait() again as p.__exit__ does that for us.
395*cda5da8dSAndroid Build Coastguard Worker            raise
396*cda5da8dSAndroid Build Coastguard Worker
397*cda5da8dSAndroid Build Coastguard Worker
398*cda5da8dSAndroid Build Coastguard Workerdef check_call(*popenargs, **kwargs):
399*cda5da8dSAndroid Build Coastguard Worker    """Run command with arguments.  Wait for command to complete.  If
400*cda5da8dSAndroid Build Coastguard Worker    the exit code was zero then return, otherwise raise
401*cda5da8dSAndroid Build Coastguard Worker    CalledProcessError.  The CalledProcessError object will have the
402*cda5da8dSAndroid Build Coastguard Worker    return code in the returncode attribute.
403*cda5da8dSAndroid Build Coastguard Worker
404*cda5da8dSAndroid Build Coastguard Worker    The arguments are the same as for the call function.  Example:
405*cda5da8dSAndroid Build Coastguard Worker
406*cda5da8dSAndroid Build Coastguard Worker    check_call(["ls", "-l"])
407*cda5da8dSAndroid Build Coastguard Worker    """
408*cda5da8dSAndroid Build Coastguard Worker    retcode = call(*popenargs, **kwargs)
409*cda5da8dSAndroid Build Coastguard Worker    if retcode:
410*cda5da8dSAndroid Build Coastguard Worker        cmd = kwargs.get("args")
411*cda5da8dSAndroid Build Coastguard Worker        if cmd is None:
412*cda5da8dSAndroid Build Coastguard Worker            cmd = popenargs[0]
413*cda5da8dSAndroid Build Coastguard Worker        raise CalledProcessError(retcode, cmd)
414*cda5da8dSAndroid Build Coastguard Worker    return 0
415*cda5da8dSAndroid Build Coastguard Worker
416*cda5da8dSAndroid Build Coastguard Worker
417*cda5da8dSAndroid Build Coastguard Workerdef check_output(*popenargs, timeout=None, **kwargs):
418*cda5da8dSAndroid Build Coastguard Worker    r"""Run command with arguments and return its output.
419*cda5da8dSAndroid Build Coastguard Worker
420*cda5da8dSAndroid Build Coastguard Worker    If the exit code was non-zero it raises a CalledProcessError.  The
421*cda5da8dSAndroid Build Coastguard Worker    CalledProcessError object will have the return code in the returncode
422*cda5da8dSAndroid Build Coastguard Worker    attribute and output in the output attribute.
423*cda5da8dSAndroid Build Coastguard Worker
424*cda5da8dSAndroid Build Coastguard Worker    The arguments are the same as for the Popen constructor.  Example:
425*cda5da8dSAndroid Build Coastguard Worker
426*cda5da8dSAndroid Build Coastguard Worker    >>> check_output(["ls", "-l", "/dev/null"])
427*cda5da8dSAndroid Build Coastguard Worker    b'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'
428*cda5da8dSAndroid Build Coastguard Worker
429*cda5da8dSAndroid Build Coastguard Worker    The stdout argument is not allowed as it is used internally.
430*cda5da8dSAndroid Build Coastguard Worker    To capture standard error in the result, use stderr=STDOUT.
431*cda5da8dSAndroid Build Coastguard Worker
432*cda5da8dSAndroid Build Coastguard Worker    >>> check_output(["/bin/sh", "-c",
433*cda5da8dSAndroid Build Coastguard Worker    ...               "ls -l non_existent_file ; exit 0"],
434*cda5da8dSAndroid Build Coastguard Worker    ...              stderr=STDOUT)
435*cda5da8dSAndroid Build Coastguard Worker    b'ls: non_existent_file: No such file or directory\n'
436*cda5da8dSAndroid Build Coastguard Worker
437*cda5da8dSAndroid Build Coastguard Worker    There is an additional optional argument, "input", allowing you to
438*cda5da8dSAndroid Build Coastguard Worker    pass a string to the subprocess's stdin.  If you use this argument
439*cda5da8dSAndroid Build Coastguard Worker    you may not also use the Popen constructor's "stdin" argument, as
440*cda5da8dSAndroid Build Coastguard Worker    it too will be used internally.  Example:
441*cda5da8dSAndroid Build Coastguard Worker
442*cda5da8dSAndroid Build Coastguard Worker    >>> check_output(["sed", "-e", "s/foo/bar/"],
443*cda5da8dSAndroid Build Coastguard Worker    ...              input=b"when in the course of fooman events\n")
444*cda5da8dSAndroid Build Coastguard Worker    b'when in the course of barman events\n'
445*cda5da8dSAndroid Build Coastguard Worker
446*cda5da8dSAndroid Build Coastguard Worker    By default, all communication is in bytes, and therefore any "input"
447*cda5da8dSAndroid Build Coastguard Worker    should be bytes, and the return value will be bytes.  If in text mode,
448*cda5da8dSAndroid Build Coastguard Worker    any "input" should be a string, and the return value will be a string
449*cda5da8dSAndroid Build Coastguard Worker    decoded according to locale encoding, or by "encoding" if set. Text mode
450*cda5da8dSAndroid Build Coastguard Worker    is triggered by setting any of text, encoding, errors or universal_newlines.
451*cda5da8dSAndroid Build Coastguard Worker    """
452*cda5da8dSAndroid Build Coastguard Worker    for kw in ('stdout', 'check'):
453*cda5da8dSAndroid Build Coastguard Worker        if kw in kwargs:
454*cda5da8dSAndroid Build Coastguard Worker            raise ValueError(f'{kw} argument not allowed, it will be overridden.')
455*cda5da8dSAndroid Build Coastguard Worker
456*cda5da8dSAndroid Build Coastguard Worker    if 'input' in kwargs and kwargs['input'] is None:
457*cda5da8dSAndroid Build Coastguard Worker        # Explicitly passing input=None was previously equivalent to passing an
458*cda5da8dSAndroid Build Coastguard Worker        # empty string. That is maintained here for backwards compatibility.
459*cda5da8dSAndroid Build Coastguard Worker        if kwargs.get('universal_newlines') or kwargs.get('text') or kwargs.get('encoding') \
460*cda5da8dSAndroid Build Coastguard Worker                or kwargs.get('errors'):
461*cda5da8dSAndroid Build Coastguard Worker            empty = ''
462*cda5da8dSAndroid Build Coastguard Worker        else:
463*cda5da8dSAndroid Build Coastguard Worker            empty = b''
464*cda5da8dSAndroid Build Coastguard Worker        kwargs['input'] = empty
465*cda5da8dSAndroid Build Coastguard Worker
466*cda5da8dSAndroid Build Coastguard Worker    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
467*cda5da8dSAndroid Build Coastguard Worker               **kwargs).stdout
468*cda5da8dSAndroid Build Coastguard Worker
469*cda5da8dSAndroid Build Coastguard Worker
470*cda5da8dSAndroid Build Coastguard Workerclass CompletedProcess(object):
471*cda5da8dSAndroid Build Coastguard Worker    """A process that has finished running.
472*cda5da8dSAndroid Build Coastguard Worker
473*cda5da8dSAndroid Build Coastguard Worker    This is returned by run().
474*cda5da8dSAndroid Build Coastguard Worker
475*cda5da8dSAndroid Build Coastguard Worker    Attributes:
476*cda5da8dSAndroid Build Coastguard Worker      args: The list or str args passed to run().
477*cda5da8dSAndroid Build Coastguard Worker      returncode: The exit code of the process, negative for signals.
478*cda5da8dSAndroid Build Coastguard Worker      stdout: The standard output (None if not captured).
479*cda5da8dSAndroid Build Coastguard Worker      stderr: The standard error (None if not captured).
480*cda5da8dSAndroid Build Coastguard Worker    """
481*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, args, returncode, stdout=None, stderr=None):
482*cda5da8dSAndroid Build Coastguard Worker        self.args = args
483*cda5da8dSAndroid Build Coastguard Worker        self.returncode = returncode
484*cda5da8dSAndroid Build Coastguard Worker        self.stdout = stdout
485*cda5da8dSAndroid Build Coastguard Worker        self.stderr = stderr
486*cda5da8dSAndroid Build Coastguard Worker
487*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
488*cda5da8dSAndroid Build Coastguard Worker        args = ['args={!r}'.format(self.args),
489*cda5da8dSAndroid Build Coastguard Worker                'returncode={!r}'.format(self.returncode)]
490*cda5da8dSAndroid Build Coastguard Worker        if self.stdout is not None:
491*cda5da8dSAndroid Build Coastguard Worker            args.append('stdout={!r}'.format(self.stdout))
492*cda5da8dSAndroid Build Coastguard Worker        if self.stderr is not None:
493*cda5da8dSAndroid Build Coastguard Worker            args.append('stderr={!r}'.format(self.stderr))
494*cda5da8dSAndroid Build Coastguard Worker        return "{}({})".format(type(self).__name__, ', '.join(args))
495*cda5da8dSAndroid Build Coastguard Worker
496*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(types.GenericAlias)
497*cda5da8dSAndroid Build Coastguard Worker
498*cda5da8dSAndroid Build Coastguard Worker
499*cda5da8dSAndroid Build Coastguard Worker    def check_returncode(self):
500*cda5da8dSAndroid Build Coastguard Worker        """Raise CalledProcessError if the exit code is non-zero."""
501*cda5da8dSAndroid Build Coastguard Worker        if self.returncode:
502*cda5da8dSAndroid Build Coastguard Worker            raise CalledProcessError(self.returncode, self.args, self.stdout,
503*cda5da8dSAndroid Build Coastguard Worker                                     self.stderr)
504*cda5da8dSAndroid Build Coastguard Worker
505*cda5da8dSAndroid Build Coastguard Worker
506*cda5da8dSAndroid Build Coastguard Workerdef run(*popenargs,
507*cda5da8dSAndroid Build Coastguard Worker        input=None, capture_output=False, timeout=None, check=False, **kwargs):
508*cda5da8dSAndroid Build Coastguard Worker    """Run command with arguments and return a CompletedProcess instance.
509*cda5da8dSAndroid Build Coastguard Worker
510*cda5da8dSAndroid Build Coastguard Worker    The returned instance will have attributes args, returncode, stdout and
511*cda5da8dSAndroid Build Coastguard Worker    stderr. By default, stdout and stderr are not captured, and those attributes
512*cda5da8dSAndroid Build Coastguard Worker    will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them,
513*cda5da8dSAndroid Build Coastguard Worker    or pass capture_output=True to capture both.
514*cda5da8dSAndroid Build Coastguard Worker
515*cda5da8dSAndroid Build Coastguard Worker    If check is True and the exit code was non-zero, it raises a
516*cda5da8dSAndroid Build Coastguard Worker    CalledProcessError. The CalledProcessError object will have the return code
517*cda5da8dSAndroid Build Coastguard Worker    in the returncode attribute, and output & stderr attributes if those streams
518*cda5da8dSAndroid Build Coastguard Worker    were captured.
519*cda5da8dSAndroid Build Coastguard Worker
520*cda5da8dSAndroid Build Coastguard Worker    If timeout is given, and the process takes too long, a TimeoutExpired
521*cda5da8dSAndroid Build Coastguard Worker    exception will be raised.
522*cda5da8dSAndroid Build Coastguard Worker
523*cda5da8dSAndroid Build Coastguard Worker    There is an optional argument "input", allowing you to
524*cda5da8dSAndroid Build Coastguard Worker    pass bytes or a string to the subprocess's stdin.  If you use this argument
525*cda5da8dSAndroid Build Coastguard Worker    you may not also use the Popen constructor's "stdin" argument, as
526*cda5da8dSAndroid Build Coastguard Worker    it will be used internally.
527*cda5da8dSAndroid Build Coastguard Worker
528*cda5da8dSAndroid Build Coastguard Worker    By default, all communication is in bytes, and therefore any "input" should
529*cda5da8dSAndroid Build Coastguard Worker    be bytes, and the stdout and stderr will be bytes. If in text mode, any
530*cda5da8dSAndroid Build Coastguard Worker    "input" should be a string, and stdout and stderr will be strings decoded
531*cda5da8dSAndroid Build Coastguard Worker    according to locale encoding, or by "encoding" if set. Text mode is
532*cda5da8dSAndroid Build Coastguard Worker    triggered by setting any of text, encoding, errors or universal_newlines.
533*cda5da8dSAndroid Build Coastguard Worker
534*cda5da8dSAndroid Build Coastguard Worker    The other arguments are the same as for the Popen constructor.
535*cda5da8dSAndroid Build Coastguard Worker    """
536*cda5da8dSAndroid Build Coastguard Worker    if input is not None:
537*cda5da8dSAndroid Build Coastguard Worker        if kwargs.get('stdin') is not None:
538*cda5da8dSAndroid Build Coastguard Worker            raise ValueError('stdin and input arguments may not both be used.')
539*cda5da8dSAndroid Build Coastguard Worker        kwargs['stdin'] = PIPE
540*cda5da8dSAndroid Build Coastguard Worker
541*cda5da8dSAndroid Build Coastguard Worker    if capture_output:
542*cda5da8dSAndroid Build Coastguard Worker        if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
543*cda5da8dSAndroid Build Coastguard Worker            raise ValueError('stdout and stderr arguments may not be used '
544*cda5da8dSAndroid Build Coastguard Worker                             'with capture_output.')
545*cda5da8dSAndroid Build Coastguard Worker        kwargs['stdout'] = PIPE
546*cda5da8dSAndroid Build Coastguard Worker        kwargs['stderr'] = PIPE
547*cda5da8dSAndroid Build Coastguard Worker
548*cda5da8dSAndroid Build Coastguard Worker    with Popen(*popenargs, **kwargs) as process:
549*cda5da8dSAndroid Build Coastguard Worker        try:
550*cda5da8dSAndroid Build Coastguard Worker            stdout, stderr = process.communicate(input, timeout=timeout)
551*cda5da8dSAndroid Build Coastguard Worker        except TimeoutExpired as exc:
552*cda5da8dSAndroid Build Coastguard Worker            process.kill()
553*cda5da8dSAndroid Build Coastguard Worker            if _mswindows:
554*cda5da8dSAndroid Build Coastguard Worker                # Windows accumulates the output in a single blocking
555*cda5da8dSAndroid Build Coastguard Worker                # read() call run on child threads, with the timeout
556*cda5da8dSAndroid Build Coastguard Worker                # being done in a join() on those threads.  communicate()
557*cda5da8dSAndroid Build Coastguard Worker                # _after_ kill() is required to collect that and add it
558*cda5da8dSAndroid Build Coastguard Worker                # to the exception.
559*cda5da8dSAndroid Build Coastguard Worker                exc.stdout, exc.stderr = process.communicate()
560*cda5da8dSAndroid Build Coastguard Worker            else:
561*cda5da8dSAndroid Build Coastguard Worker                # POSIX _communicate already populated the output so
562*cda5da8dSAndroid Build Coastguard Worker                # far into the TimeoutExpired exception.
563*cda5da8dSAndroid Build Coastguard Worker                process.wait()
564*cda5da8dSAndroid Build Coastguard Worker            raise
565*cda5da8dSAndroid Build Coastguard Worker        except:  # Including KeyboardInterrupt, communicate handled that.
566*cda5da8dSAndroid Build Coastguard Worker            process.kill()
567*cda5da8dSAndroid Build Coastguard Worker            # We don't call process.wait() as .__exit__ does that for us.
568*cda5da8dSAndroid Build Coastguard Worker            raise
569*cda5da8dSAndroid Build Coastguard Worker        retcode = process.poll()
570*cda5da8dSAndroid Build Coastguard Worker        if check and retcode:
571*cda5da8dSAndroid Build Coastguard Worker            raise CalledProcessError(retcode, process.args,
572*cda5da8dSAndroid Build Coastguard Worker                                     output=stdout, stderr=stderr)
573*cda5da8dSAndroid Build Coastguard Worker    return CompletedProcess(process.args, retcode, stdout, stderr)
574*cda5da8dSAndroid Build Coastguard Worker
575*cda5da8dSAndroid Build Coastguard Worker
576*cda5da8dSAndroid Build Coastguard Workerdef list2cmdline(seq):
577*cda5da8dSAndroid Build Coastguard Worker    """
578*cda5da8dSAndroid Build Coastguard Worker    Translate a sequence of arguments into a command line
579*cda5da8dSAndroid Build Coastguard Worker    string, using the same rules as the MS C runtime:
580*cda5da8dSAndroid Build Coastguard Worker
581*cda5da8dSAndroid Build Coastguard Worker    1) Arguments are delimited by white space, which is either a
582*cda5da8dSAndroid Build Coastguard Worker       space or a tab.
583*cda5da8dSAndroid Build Coastguard Worker
584*cda5da8dSAndroid Build Coastguard Worker    2) A string surrounded by double quotation marks is
585*cda5da8dSAndroid Build Coastguard Worker       interpreted as a single argument, regardless of white space
586*cda5da8dSAndroid Build Coastguard Worker       contained within.  A quoted string can be embedded in an
587*cda5da8dSAndroid Build Coastguard Worker       argument.
588*cda5da8dSAndroid Build Coastguard Worker
589*cda5da8dSAndroid Build Coastguard Worker    3) A double quotation mark preceded by a backslash is
590*cda5da8dSAndroid Build Coastguard Worker       interpreted as a literal double quotation mark.
591*cda5da8dSAndroid Build Coastguard Worker
592*cda5da8dSAndroid Build Coastguard Worker    4) Backslashes are interpreted literally, unless they
593*cda5da8dSAndroid Build Coastguard Worker       immediately precede a double quotation mark.
594*cda5da8dSAndroid Build Coastguard Worker
595*cda5da8dSAndroid Build Coastguard Worker    5) If backslashes immediately precede a double quotation mark,
596*cda5da8dSAndroid Build Coastguard Worker       every pair of backslashes is interpreted as a literal
597*cda5da8dSAndroid Build Coastguard Worker       backslash.  If the number of backslashes is odd, the last
598*cda5da8dSAndroid Build Coastguard Worker       backslash escapes the next double quotation mark as
599*cda5da8dSAndroid Build Coastguard Worker       described in rule 3.
600*cda5da8dSAndroid Build Coastguard Worker    """
601*cda5da8dSAndroid Build Coastguard Worker
602*cda5da8dSAndroid Build Coastguard Worker    # See
603*cda5da8dSAndroid Build Coastguard Worker    # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
604*cda5da8dSAndroid Build Coastguard Worker    # or search http://msdn.microsoft.com for
605*cda5da8dSAndroid Build Coastguard Worker    # "Parsing C++ Command-Line Arguments"
606*cda5da8dSAndroid Build Coastguard Worker    result = []
607*cda5da8dSAndroid Build Coastguard Worker    needquote = False
608*cda5da8dSAndroid Build Coastguard Worker    for arg in map(os.fsdecode, seq):
609*cda5da8dSAndroid Build Coastguard Worker        bs_buf = []
610*cda5da8dSAndroid Build Coastguard Worker
611*cda5da8dSAndroid Build Coastguard Worker        # Add a space to separate this argument from the others
612*cda5da8dSAndroid Build Coastguard Worker        if result:
613*cda5da8dSAndroid Build Coastguard Worker            result.append(' ')
614*cda5da8dSAndroid Build Coastguard Worker
615*cda5da8dSAndroid Build Coastguard Worker        needquote = (" " in arg) or ("\t" in arg) or not arg
616*cda5da8dSAndroid Build Coastguard Worker        if needquote:
617*cda5da8dSAndroid Build Coastguard Worker            result.append('"')
618*cda5da8dSAndroid Build Coastguard Worker
619*cda5da8dSAndroid Build Coastguard Worker        for c in arg:
620*cda5da8dSAndroid Build Coastguard Worker            if c == '\\':
621*cda5da8dSAndroid Build Coastguard Worker                # Don't know if we need to double yet.
622*cda5da8dSAndroid Build Coastguard Worker                bs_buf.append(c)
623*cda5da8dSAndroid Build Coastguard Worker            elif c == '"':
624*cda5da8dSAndroid Build Coastguard Worker                # Double backslashes.
625*cda5da8dSAndroid Build Coastguard Worker                result.append('\\' * len(bs_buf)*2)
626*cda5da8dSAndroid Build Coastguard Worker                bs_buf = []
627*cda5da8dSAndroid Build Coastguard Worker                result.append('\\"')
628*cda5da8dSAndroid Build Coastguard Worker            else:
629*cda5da8dSAndroid Build Coastguard Worker                # Normal char
630*cda5da8dSAndroid Build Coastguard Worker                if bs_buf:
631*cda5da8dSAndroid Build Coastguard Worker                    result.extend(bs_buf)
632*cda5da8dSAndroid Build Coastguard Worker                    bs_buf = []
633*cda5da8dSAndroid Build Coastguard Worker                result.append(c)
634*cda5da8dSAndroid Build Coastguard Worker
635*cda5da8dSAndroid Build Coastguard Worker        # Add remaining backslashes, if any.
636*cda5da8dSAndroid Build Coastguard Worker        if bs_buf:
637*cda5da8dSAndroid Build Coastguard Worker            result.extend(bs_buf)
638*cda5da8dSAndroid Build Coastguard Worker
639*cda5da8dSAndroid Build Coastguard Worker        if needquote:
640*cda5da8dSAndroid Build Coastguard Worker            result.extend(bs_buf)
641*cda5da8dSAndroid Build Coastguard Worker            result.append('"')
642*cda5da8dSAndroid Build Coastguard Worker
643*cda5da8dSAndroid Build Coastguard Worker    return ''.join(result)
644*cda5da8dSAndroid Build Coastguard Worker
645*cda5da8dSAndroid Build Coastguard Worker
646*cda5da8dSAndroid Build Coastguard Worker# Various tools for executing commands and looking at their output and status.
647*cda5da8dSAndroid Build Coastguard Worker#
648*cda5da8dSAndroid Build Coastguard Worker
649*cda5da8dSAndroid Build Coastguard Workerdef getstatusoutput(cmd, *, encoding=None, errors=None):
650*cda5da8dSAndroid Build Coastguard Worker    """Return (exitcode, output) of executing cmd in a shell.
651*cda5da8dSAndroid Build Coastguard Worker
652*cda5da8dSAndroid Build Coastguard Worker    Execute the string 'cmd' in a shell with 'check_output' and
653*cda5da8dSAndroid Build Coastguard Worker    return a 2-tuple (status, output). The locale encoding is used
654*cda5da8dSAndroid Build Coastguard Worker    to decode the output and process newlines.
655*cda5da8dSAndroid Build Coastguard Worker
656*cda5da8dSAndroid Build Coastguard Worker    A trailing newline is stripped from the output.
657*cda5da8dSAndroid Build Coastguard Worker    The exit status for the command can be interpreted
658*cda5da8dSAndroid Build Coastguard Worker    according to the rules for the function 'wait'. Example:
659*cda5da8dSAndroid Build Coastguard Worker
660*cda5da8dSAndroid Build Coastguard Worker    >>> import subprocess
661*cda5da8dSAndroid Build Coastguard Worker    >>> subprocess.getstatusoutput('ls /bin/ls')
662*cda5da8dSAndroid Build Coastguard Worker    (0, '/bin/ls')
663*cda5da8dSAndroid Build Coastguard Worker    >>> subprocess.getstatusoutput('cat /bin/junk')
664*cda5da8dSAndroid Build Coastguard Worker    (1, 'cat: /bin/junk: No such file or directory')
665*cda5da8dSAndroid Build Coastguard Worker    >>> subprocess.getstatusoutput('/bin/junk')
666*cda5da8dSAndroid Build Coastguard Worker    (127, 'sh: /bin/junk: not found')
667*cda5da8dSAndroid Build Coastguard Worker    >>> subprocess.getstatusoutput('/bin/kill $$')
668*cda5da8dSAndroid Build Coastguard Worker    (-15, '')
669*cda5da8dSAndroid Build Coastguard Worker    """
670*cda5da8dSAndroid Build Coastguard Worker    try:
671*cda5da8dSAndroid Build Coastguard Worker        data = check_output(cmd, shell=True, text=True, stderr=STDOUT,
672*cda5da8dSAndroid Build Coastguard Worker                            encoding=encoding, errors=errors)
673*cda5da8dSAndroid Build Coastguard Worker        exitcode = 0
674*cda5da8dSAndroid Build Coastguard Worker    except CalledProcessError as ex:
675*cda5da8dSAndroid Build Coastguard Worker        data = ex.output
676*cda5da8dSAndroid Build Coastguard Worker        exitcode = ex.returncode
677*cda5da8dSAndroid Build Coastguard Worker    if data[-1:] == '\n':
678*cda5da8dSAndroid Build Coastguard Worker        data = data[:-1]
679*cda5da8dSAndroid Build Coastguard Worker    return exitcode, data
680*cda5da8dSAndroid Build Coastguard Worker
681*cda5da8dSAndroid Build Coastguard Workerdef getoutput(cmd, *, encoding=None, errors=None):
682*cda5da8dSAndroid Build Coastguard Worker    """Return output (stdout or stderr) of executing cmd in a shell.
683*cda5da8dSAndroid Build Coastguard Worker
684*cda5da8dSAndroid Build Coastguard Worker    Like getstatusoutput(), except the exit status is ignored and the return
685*cda5da8dSAndroid Build Coastguard Worker    value is a string containing the command's output.  Example:
686*cda5da8dSAndroid Build Coastguard Worker
687*cda5da8dSAndroid Build Coastguard Worker    >>> import subprocess
688*cda5da8dSAndroid Build Coastguard Worker    >>> subprocess.getoutput('ls /bin/ls')
689*cda5da8dSAndroid Build Coastguard Worker    '/bin/ls'
690*cda5da8dSAndroid Build Coastguard Worker    """
691*cda5da8dSAndroid Build Coastguard Worker    return getstatusoutput(cmd, encoding=encoding, errors=errors)[1]
692*cda5da8dSAndroid Build Coastguard Worker
693*cda5da8dSAndroid Build Coastguard Worker
694*cda5da8dSAndroid Build Coastguard Worker
695*cda5da8dSAndroid Build Coastguard Workerdef _use_posix_spawn():
696*cda5da8dSAndroid Build Coastguard Worker    """Check if posix_spawn() can be used for subprocess.
697*cda5da8dSAndroid Build Coastguard Worker
698*cda5da8dSAndroid Build Coastguard Worker    subprocess requires a posix_spawn() implementation that properly reports
699*cda5da8dSAndroid Build Coastguard Worker    errors to the parent process, & sets errno on the following failures:
700*cda5da8dSAndroid Build Coastguard Worker
701*cda5da8dSAndroid Build Coastguard Worker    * Process attribute actions failed.
702*cda5da8dSAndroid Build Coastguard Worker    * File actions failed.
703*cda5da8dSAndroid Build Coastguard Worker    * exec() failed.
704*cda5da8dSAndroid Build Coastguard Worker
705*cda5da8dSAndroid Build Coastguard Worker    Prefer an implementation which can use vfork() in some cases for best
706*cda5da8dSAndroid Build Coastguard Worker    performance.
707*cda5da8dSAndroid Build Coastguard Worker    """
708*cda5da8dSAndroid Build Coastguard Worker    if _mswindows or not hasattr(os, 'posix_spawn'):
709*cda5da8dSAndroid Build Coastguard Worker        # os.posix_spawn() is not available
710*cda5da8dSAndroid Build Coastguard Worker        return False
711*cda5da8dSAndroid Build Coastguard Worker
712*cda5da8dSAndroid Build Coastguard Worker    if sys.platform in ('darwin', 'sunos5'):
713*cda5da8dSAndroid Build Coastguard Worker        # posix_spawn() is a syscall on both macOS and Solaris,
714*cda5da8dSAndroid Build Coastguard Worker        # and properly reports errors
715*cda5da8dSAndroid Build Coastguard Worker        return True
716*cda5da8dSAndroid Build Coastguard Worker
717*cda5da8dSAndroid Build Coastguard Worker    # Check libc name and runtime libc version
718*cda5da8dSAndroid Build Coastguard Worker    try:
719*cda5da8dSAndroid Build Coastguard Worker        ver = os.confstr('CS_GNU_LIBC_VERSION')
720*cda5da8dSAndroid Build Coastguard Worker        # parse 'glibc 2.28' as ('glibc', (2, 28))
721*cda5da8dSAndroid Build Coastguard Worker        parts = ver.split(maxsplit=1)
722*cda5da8dSAndroid Build Coastguard Worker        if len(parts) != 2:
723*cda5da8dSAndroid Build Coastguard Worker            # reject unknown format
724*cda5da8dSAndroid Build Coastguard Worker            raise ValueError
725*cda5da8dSAndroid Build Coastguard Worker        libc = parts[0]
726*cda5da8dSAndroid Build Coastguard Worker        version = tuple(map(int, parts[1].split('.')))
727*cda5da8dSAndroid Build Coastguard Worker
728*cda5da8dSAndroid Build Coastguard Worker        if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24):
729*cda5da8dSAndroid Build Coastguard Worker            # glibc 2.24 has a new Linux posix_spawn implementation using vfork
730*cda5da8dSAndroid Build Coastguard Worker            # which properly reports errors to the parent process.
731*cda5da8dSAndroid Build Coastguard Worker            return True
732*cda5da8dSAndroid Build Coastguard Worker        # Note: Don't use the implementation in earlier glibc because it doesn't
733*cda5da8dSAndroid Build Coastguard Worker        # use vfork (even if glibc 2.26 added a pipe to properly report errors
734*cda5da8dSAndroid Build Coastguard Worker        # to the parent process).
735*cda5da8dSAndroid Build Coastguard Worker    except (AttributeError, ValueError, OSError):
736*cda5da8dSAndroid Build Coastguard Worker        # os.confstr() or CS_GNU_LIBC_VERSION value not available
737*cda5da8dSAndroid Build Coastguard Worker        pass
738*cda5da8dSAndroid Build Coastguard Worker
739*cda5da8dSAndroid Build Coastguard Worker    # By default, assume that posix_spawn() does not properly report errors.
740*cda5da8dSAndroid Build Coastguard Worker    return False
741*cda5da8dSAndroid Build Coastguard Worker
742*cda5da8dSAndroid Build Coastguard Worker
743*cda5da8dSAndroid Build Coastguard Worker# These are primarily fail-safe knobs for negatives. A True value does not
744*cda5da8dSAndroid Build Coastguard Worker# guarantee the given libc/syscall API will be used.
745*cda5da8dSAndroid Build Coastguard Worker_USE_POSIX_SPAWN = _use_posix_spawn()
746*cda5da8dSAndroid Build Coastguard Worker_USE_VFORK = True
747*cda5da8dSAndroid Build Coastguard Worker
748*cda5da8dSAndroid Build Coastguard Worker
749*cda5da8dSAndroid Build Coastguard Workerclass Popen:
750*cda5da8dSAndroid Build Coastguard Worker    """ Execute a child program in a new process.
751*cda5da8dSAndroid Build Coastguard Worker
752*cda5da8dSAndroid Build Coastguard Worker    For a complete description of the arguments see the Python documentation.
753*cda5da8dSAndroid Build Coastguard Worker
754*cda5da8dSAndroid Build Coastguard Worker    Arguments:
755*cda5da8dSAndroid Build Coastguard Worker      args: A string, or a sequence of program arguments.
756*cda5da8dSAndroid Build Coastguard Worker
757*cda5da8dSAndroid Build Coastguard Worker      bufsize: supplied as the buffering argument to the open() function when
758*cda5da8dSAndroid Build Coastguard Worker          creating the stdin/stdout/stderr pipe file objects
759*cda5da8dSAndroid Build Coastguard Worker
760*cda5da8dSAndroid Build Coastguard Worker      executable: A replacement program to execute.
761*cda5da8dSAndroid Build Coastguard Worker
762*cda5da8dSAndroid Build Coastguard Worker      stdin, stdout and stderr: These specify the executed programs' standard
763*cda5da8dSAndroid Build Coastguard Worker          input, standard output and standard error file handles, respectively.
764*cda5da8dSAndroid Build Coastguard Worker
765*cda5da8dSAndroid Build Coastguard Worker      preexec_fn: (POSIX only) An object to be called in the child process
766*cda5da8dSAndroid Build Coastguard Worker          just before the child is executed.
767*cda5da8dSAndroid Build Coastguard Worker
768*cda5da8dSAndroid Build Coastguard Worker      close_fds: Controls closing or inheriting of file descriptors.
769*cda5da8dSAndroid Build Coastguard Worker
770*cda5da8dSAndroid Build Coastguard Worker      shell: If true, the command will be executed through the shell.
771*cda5da8dSAndroid Build Coastguard Worker
772*cda5da8dSAndroid Build Coastguard Worker      cwd: Sets the current directory before the child is executed.
773*cda5da8dSAndroid Build Coastguard Worker
774*cda5da8dSAndroid Build Coastguard Worker      env: Defines the environment variables for the new process.
775*cda5da8dSAndroid Build Coastguard Worker
776*cda5da8dSAndroid Build Coastguard Worker      text: If true, decode stdin, stdout and stderr using the given encoding
777*cda5da8dSAndroid Build Coastguard Worker          (if set) or the system default otherwise.
778*cda5da8dSAndroid Build Coastguard Worker
779*cda5da8dSAndroid Build Coastguard Worker      universal_newlines: Alias of text, provided for backwards compatibility.
780*cda5da8dSAndroid Build Coastguard Worker
781*cda5da8dSAndroid Build Coastguard Worker      startupinfo and creationflags (Windows only)
782*cda5da8dSAndroid Build Coastguard Worker
783*cda5da8dSAndroid Build Coastguard Worker      restore_signals (POSIX only)
784*cda5da8dSAndroid Build Coastguard Worker
785*cda5da8dSAndroid Build Coastguard Worker      start_new_session (POSIX only)
786*cda5da8dSAndroid Build Coastguard Worker
787*cda5da8dSAndroid Build Coastguard Worker      process_group (POSIX only)
788*cda5da8dSAndroid Build Coastguard Worker
789*cda5da8dSAndroid Build Coastguard Worker      group (POSIX only)
790*cda5da8dSAndroid Build Coastguard Worker
791*cda5da8dSAndroid Build Coastguard Worker      extra_groups (POSIX only)
792*cda5da8dSAndroid Build Coastguard Worker
793*cda5da8dSAndroid Build Coastguard Worker      user (POSIX only)
794*cda5da8dSAndroid Build Coastguard Worker
795*cda5da8dSAndroid Build Coastguard Worker      umask (POSIX only)
796*cda5da8dSAndroid Build Coastguard Worker
797*cda5da8dSAndroid Build Coastguard Worker      pass_fds (POSIX only)
798*cda5da8dSAndroid Build Coastguard Worker
799*cda5da8dSAndroid Build Coastguard Worker      encoding and errors: Text mode encoding and error handling to use for
800*cda5da8dSAndroid Build Coastguard Worker          file objects stdin, stdout and stderr.
801*cda5da8dSAndroid Build Coastguard Worker
802*cda5da8dSAndroid Build Coastguard Worker    Attributes:
803*cda5da8dSAndroid Build Coastguard Worker        stdin, stdout, stderr, pid, returncode
804*cda5da8dSAndroid Build Coastguard Worker    """
805*cda5da8dSAndroid Build Coastguard Worker    _child_created = False  # Set here since __del__ checks it
806*cda5da8dSAndroid Build Coastguard Worker
807*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, args, bufsize=-1, executable=None,
808*cda5da8dSAndroid Build Coastguard Worker                 stdin=None, stdout=None, stderr=None,
809*cda5da8dSAndroid Build Coastguard Worker                 preexec_fn=None, close_fds=True,
810*cda5da8dSAndroid Build Coastguard Worker                 shell=False, cwd=None, env=None, universal_newlines=None,
811*cda5da8dSAndroid Build Coastguard Worker                 startupinfo=None, creationflags=0,
812*cda5da8dSAndroid Build Coastguard Worker                 restore_signals=True, start_new_session=False,
813*cda5da8dSAndroid Build Coastguard Worker                 pass_fds=(), *, user=None, group=None, extra_groups=None,
814*cda5da8dSAndroid Build Coastguard Worker                 encoding=None, errors=None, text=None, umask=-1, pipesize=-1,
815*cda5da8dSAndroid Build Coastguard Worker                 process_group=None):
816*cda5da8dSAndroid Build Coastguard Worker        """Create new Popen instance."""
817*cda5da8dSAndroid Build Coastguard Worker        if not _can_fork_exec:
818*cda5da8dSAndroid Build Coastguard Worker            raise OSError(
819*cda5da8dSAndroid Build Coastguard Worker                errno.ENOTSUP, f"{sys.platform} does not support processes."
820*cda5da8dSAndroid Build Coastguard Worker            )
821*cda5da8dSAndroid Build Coastguard Worker
822*cda5da8dSAndroid Build Coastguard Worker        _cleanup()
823*cda5da8dSAndroid Build Coastguard Worker        # Held while anything is calling waitpid before returncode has been
824*cda5da8dSAndroid Build Coastguard Worker        # updated to prevent clobbering returncode if wait() or poll() are
825*cda5da8dSAndroid Build Coastguard Worker        # called from multiple threads at once.  After acquiring the lock,
826*cda5da8dSAndroid Build Coastguard Worker        # code must re-check self.returncode to see if another thread just
827*cda5da8dSAndroid Build Coastguard Worker        # finished a waitpid() call.
828*cda5da8dSAndroid Build Coastguard Worker        self._waitpid_lock = threading.Lock()
829*cda5da8dSAndroid Build Coastguard Worker
830*cda5da8dSAndroid Build Coastguard Worker        self._input = None
831*cda5da8dSAndroid Build Coastguard Worker        self._communication_started = False
832*cda5da8dSAndroid Build Coastguard Worker        if bufsize is None:
833*cda5da8dSAndroid Build Coastguard Worker            bufsize = -1  # Restore default
834*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(bufsize, int):
835*cda5da8dSAndroid Build Coastguard Worker            raise TypeError("bufsize must be an integer")
836*cda5da8dSAndroid Build Coastguard Worker
837*cda5da8dSAndroid Build Coastguard Worker        if pipesize is None:
838*cda5da8dSAndroid Build Coastguard Worker            pipesize = -1  # Restore default
839*cda5da8dSAndroid Build Coastguard Worker        if not isinstance(pipesize, int):
840*cda5da8dSAndroid Build Coastguard Worker            raise TypeError("pipesize must be an integer")
841*cda5da8dSAndroid Build Coastguard Worker
842*cda5da8dSAndroid Build Coastguard Worker        if _mswindows:
843*cda5da8dSAndroid Build Coastguard Worker            if preexec_fn is not None:
844*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("preexec_fn is not supported on Windows "
845*cda5da8dSAndroid Build Coastguard Worker                                 "platforms")
846*cda5da8dSAndroid Build Coastguard Worker        else:
847*cda5da8dSAndroid Build Coastguard Worker            # POSIX
848*cda5da8dSAndroid Build Coastguard Worker            if pass_fds and not close_fds:
849*cda5da8dSAndroid Build Coastguard Worker                warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
850*cda5da8dSAndroid Build Coastguard Worker                close_fds = True
851*cda5da8dSAndroid Build Coastguard Worker            if startupinfo is not None:
852*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("startupinfo is only supported on Windows "
853*cda5da8dSAndroid Build Coastguard Worker                                 "platforms")
854*cda5da8dSAndroid Build Coastguard Worker            if creationflags != 0:
855*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("creationflags is only supported on Windows "
856*cda5da8dSAndroid Build Coastguard Worker                                 "platforms")
857*cda5da8dSAndroid Build Coastguard Worker
858*cda5da8dSAndroid Build Coastguard Worker        self.args = args
859*cda5da8dSAndroid Build Coastguard Worker        self.stdin = None
860*cda5da8dSAndroid Build Coastguard Worker        self.stdout = None
861*cda5da8dSAndroid Build Coastguard Worker        self.stderr = None
862*cda5da8dSAndroid Build Coastguard Worker        self.pid = None
863*cda5da8dSAndroid Build Coastguard Worker        self.returncode = None
864*cda5da8dSAndroid Build Coastguard Worker        self.encoding = encoding
865*cda5da8dSAndroid Build Coastguard Worker        self.errors = errors
866*cda5da8dSAndroid Build Coastguard Worker        self.pipesize = pipesize
867*cda5da8dSAndroid Build Coastguard Worker
868*cda5da8dSAndroid Build Coastguard Worker        # Validate the combinations of text and universal_newlines
869*cda5da8dSAndroid Build Coastguard Worker        if (text is not None and universal_newlines is not None
870*cda5da8dSAndroid Build Coastguard Worker            and bool(universal_newlines) != bool(text)):
871*cda5da8dSAndroid Build Coastguard Worker            raise SubprocessError('Cannot disambiguate when both text '
872*cda5da8dSAndroid Build Coastguard Worker                                  'and universal_newlines are supplied but '
873*cda5da8dSAndroid Build Coastguard Worker                                  'different. Pass one or the other.')
874*cda5da8dSAndroid Build Coastguard Worker
875*cda5da8dSAndroid Build Coastguard Worker        self.text_mode = encoding or errors or text or universal_newlines
876*cda5da8dSAndroid Build Coastguard Worker        if self.text_mode and encoding is None:
877*cda5da8dSAndroid Build Coastguard Worker            self.encoding = encoding = _text_encoding()
878*cda5da8dSAndroid Build Coastguard Worker
879*cda5da8dSAndroid Build Coastguard Worker        # How long to resume waiting on a child after the first ^C.
880*cda5da8dSAndroid Build Coastguard Worker        # There is no right value for this.  The purpose is to be polite
881*cda5da8dSAndroid Build Coastguard Worker        # yet remain good for interactive users trying to exit a tool.
882*cda5da8dSAndroid Build Coastguard Worker        self._sigint_wait_secs = 0.25  # 1/xkcd221.getRandomNumber()
883*cda5da8dSAndroid Build Coastguard Worker
884*cda5da8dSAndroid Build Coastguard Worker        self._closed_child_pipe_fds = False
885*cda5da8dSAndroid Build Coastguard Worker
886*cda5da8dSAndroid Build Coastguard Worker        if self.text_mode:
887*cda5da8dSAndroid Build Coastguard Worker            if bufsize == 1:
888*cda5da8dSAndroid Build Coastguard Worker                line_buffering = True
889*cda5da8dSAndroid Build Coastguard Worker                # Use the default buffer size for the underlying binary streams
890*cda5da8dSAndroid Build Coastguard Worker                # since they don't support line buffering.
891*cda5da8dSAndroid Build Coastguard Worker                bufsize = -1
892*cda5da8dSAndroid Build Coastguard Worker            else:
893*cda5da8dSAndroid Build Coastguard Worker                line_buffering = False
894*cda5da8dSAndroid Build Coastguard Worker
895*cda5da8dSAndroid Build Coastguard Worker        if process_group is None:
896*cda5da8dSAndroid Build Coastguard Worker            process_group = -1  # The internal APIs are int-only
897*cda5da8dSAndroid Build Coastguard Worker
898*cda5da8dSAndroid Build Coastguard Worker        gid = None
899*cda5da8dSAndroid Build Coastguard Worker        if group is not None:
900*cda5da8dSAndroid Build Coastguard Worker            if not hasattr(os, 'setregid'):
901*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("The 'group' parameter is not supported on the "
902*cda5da8dSAndroid Build Coastguard Worker                                 "current platform")
903*cda5da8dSAndroid Build Coastguard Worker
904*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(group, str):
905*cda5da8dSAndroid Build Coastguard Worker                try:
906*cda5da8dSAndroid Build Coastguard Worker                    import grp
907*cda5da8dSAndroid Build Coastguard Worker                except ImportError:
908*cda5da8dSAndroid Build Coastguard Worker                    raise ValueError("The group parameter cannot be a string "
909*cda5da8dSAndroid Build Coastguard Worker                                     "on systems without the grp module")
910*cda5da8dSAndroid Build Coastguard Worker
911*cda5da8dSAndroid Build Coastguard Worker                gid = grp.getgrnam(group).gr_gid
912*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(group, int):
913*cda5da8dSAndroid Build Coastguard Worker                gid = group
914*cda5da8dSAndroid Build Coastguard Worker            else:
915*cda5da8dSAndroid Build Coastguard Worker                raise TypeError("Group must be a string or an integer, not {}"
916*cda5da8dSAndroid Build Coastguard Worker                                .format(type(group)))
917*cda5da8dSAndroid Build Coastguard Worker
918*cda5da8dSAndroid Build Coastguard Worker            if gid < 0:
919*cda5da8dSAndroid Build Coastguard Worker                raise ValueError(f"Group ID cannot be negative, got {gid}")
920*cda5da8dSAndroid Build Coastguard Worker
921*cda5da8dSAndroid Build Coastguard Worker        gids = None
922*cda5da8dSAndroid Build Coastguard Worker        if extra_groups is not None:
923*cda5da8dSAndroid Build Coastguard Worker            if not hasattr(os, 'setgroups'):
924*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("The 'extra_groups' parameter is not "
925*cda5da8dSAndroid Build Coastguard Worker                                 "supported on the current platform")
926*cda5da8dSAndroid Build Coastguard Worker
927*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(extra_groups, str):
928*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("Groups must be a list, not a string")
929*cda5da8dSAndroid Build Coastguard Worker
930*cda5da8dSAndroid Build Coastguard Worker            gids = []
931*cda5da8dSAndroid Build Coastguard Worker            for extra_group in extra_groups:
932*cda5da8dSAndroid Build Coastguard Worker                if isinstance(extra_group, str):
933*cda5da8dSAndroid Build Coastguard Worker                    try:
934*cda5da8dSAndroid Build Coastguard Worker                        import grp
935*cda5da8dSAndroid Build Coastguard Worker                    except ImportError:
936*cda5da8dSAndroid Build Coastguard Worker                        raise ValueError("Items in extra_groups cannot be "
937*cda5da8dSAndroid Build Coastguard Worker                                         "strings on systems without the "
938*cda5da8dSAndroid Build Coastguard Worker                                         "grp module")
939*cda5da8dSAndroid Build Coastguard Worker
940*cda5da8dSAndroid Build Coastguard Worker                    gids.append(grp.getgrnam(extra_group).gr_gid)
941*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(extra_group, int):
942*cda5da8dSAndroid Build Coastguard Worker                    gids.append(extra_group)
943*cda5da8dSAndroid Build Coastguard Worker                else:
944*cda5da8dSAndroid Build Coastguard Worker                    raise TypeError("Items in extra_groups must be a string "
945*cda5da8dSAndroid Build Coastguard Worker                                    "or integer, not {}"
946*cda5da8dSAndroid Build Coastguard Worker                                    .format(type(extra_group)))
947*cda5da8dSAndroid Build Coastguard Worker
948*cda5da8dSAndroid Build Coastguard Worker            # make sure that the gids are all positive here so we can do less
949*cda5da8dSAndroid Build Coastguard Worker            # checking in the C code
950*cda5da8dSAndroid Build Coastguard Worker            for gid_check in gids:
951*cda5da8dSAndroid Build Coastguard Worker                if gid_check < 0:
952*cda5da8dSAndroid Build Coastguard Worker                    raise ValueError(f"Group ID cannot be negative, got {gid_check}")
953*cda5da8dSAndroid Build Coastguard Worker
954*cda5da8dSAndroid Build Coastguard Worker        uid = None
955*cda5da8dSAndroid Build Coastguard Worker        if user is not None:
956*cda5da8dSAndroid Build Coastguard Worker            if not hasattr(os, 'setreuid'):
957*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("The 'user' parameter is not supported on "
958*cda5da8dSAndroid Build Coastguard Worker                                 "the current platform")
959*cda5da8dSAndroid Build Coastguard Worker
960*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(user, str):
961*cda5da8dSAndroid Build Coastguard Worker                try:
962*cda5da8dSAndroid Build Coastguard Worker                    import pwd
963*cda5da8dSAndroid Build Coastguard Worker                except ImportError:
964*cda5da8dSAndroid Build Coastguard Worker                    raise ValueError("The user parameter cannot be a string "
965*cda5da8dSAndroid Build Coastguard Worker                                     "on systems without the pwd module")
966*cda5da8dSAndroid Build Coastguard Worker                uid = pwd.getpwnam(user).pw_uid
967*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(user, int):
968*cda5da8dSAndroid Build Coastguard Worker                uid = user
969*cda5da8dSAndroid Build Coastguard Worker            else:
970*cda5da8dSAndroid Build Coastguard Worker                raise TypeError("User must be a string or an integer")
971*cda5da8dSAndroid Build Coastguard Worker
972*cda5da8dSAndroid Build Coastguard Worker            if uid < 0:
973*cda5da8dSAndroid Build Coastguard Worker                raise ValueError(f"User ID cannot be negative, got {uid}")
974*cda5da8dSAndroid Build Coastguard Worker
975*cda5da8dSAndroid Build Coastguard Worker        # Input and output objects. The general principle is like
976*cda5da8dSAndroid Build Coastguard Worker        # this:
977*cda5da8dSAndroid Build Coastguard Worker        #
978*cda5da8dSAndroid Build Coastguard Worker        # Parent                   Child
979*cda5da8dSAndroid Build Coastguard Worker        # ------                   -----
980*cda5da8dSAndroid Build Coastguard Worker        # p2cwrite   ---stdin--->  p2cread
981*cda5da8dSAndroid Build Coastguard Worker        # c2pread    <--stdout---  c2pwrite
982*cda5da8dSAndroid Build Coastguard Worker        # errread    <--stderr---  errwrite
983*cda5da8dSAndroid Build Coastguard Worker        #
984*cda5da8dSAndroid Build Coastguard Worker        # On POSIX, the child objects are file descriptors.  On
985*cda5da8dSAndroid Build Coastguard Worker        # Windows, these are Windows file handles.  The parent objects
986*cda5da8dSAndroid Build Coastguard Worker        # are file descriptors on both platforms.  The parent objects
987*cda5da8dSAndroid Build Coastguard Worker        # are -1 when not using PIPEs. The child objects are -1
988*cda5da8dSAndroid Build Coastguard Worker        # when not redirecting.
989*cda5da8dSAndroid Build Coastguard Worker
990*cda5da8dSAndroid Build Coastguard Worker        (p2cread, p2cwrite,
991*cda5da8dSAndroid Build Coastguard Worker         c2pread, c2pwrite,
992*cda5da8dSAndroid Build Coastguard Worker         errread, errwrite) = self._get_handles(stdin, stdout, stderr)
993*cda5da8dSAndroid Build Coastguard Worker
994*cda5da8dSAndroid Build Coastguard Worker        # From here on, raising exceptions may cause file descriptor leakage
995*cda5da8dSAndroid Build Coastguard Worker
996*cda5da8dSAndroid Build Coastguard Worker        # We wrap OS handles *before* launching the child, otherwise a
997*cda5da8dSAndroid Build Coastguard Worker        # quickly terminating child could make our fds unwrappable
998*cda5da8dSAndroid Build Coastguard Worker        # (see #8458).
999*cda5da8dSAndroid Build Coastguard Worker
1000*cda5da8dSAndroid Build Coastguard Worker        if _mswindows:
1001*cda5da8dSAndroid Build Coastguard Worker            if p2cwrite != -1:
1002*cda5da8dSAndroid Build Coastguard Worker                p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
1003*cda5da8dSAndroid Build Coastguard Worker            if c2pread != -1:
1004*cda5da8dSAndroid Build Coastguard Worker                c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
1005*cda5da8dSAndroid Build Coastguard Worker            if errread != -1:
1006*cda5da8dSAndroid Build Coastguard Worker                errread = msvcrt.open_osfhandle(errread.Detach(), 0)
1007*cda5da8dSAndroid Build Coastguard Worker
1008*cda5da8dSAndroid Build Coastguard Worker        try:
1009*cda5da8dSAndroid Build Coastguard Worker            if p2cwrite != -1:
1010*cda5da8dSAndroid Build Coastguard Worker                self.stdin = io.open(p2cwrite, 'wb', bufsize)
1011*cda5da8dSAndroid Build Coastguard Worker                if self.text_mode:
1012*cda5da8dSAndroid Build Coastguard Worker                    self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
1013*cda5da8dSAndroid Build Coastguard Worker                            line_buffering=line_buffering,
1014*cda5da8dSAndroid Build Coastguard Worker                            encoding=encoding, errors=errors)
1015*cda5da8dSAndroid Build Coastguard Worker            if c2pread != -1:
1016*cda5da8dSAndroid Build Coastguard Worker                self.stdout = io.open(c2pread, 'rb', bufsize)
1017*cda5da8dSAndroid Build Coastguard Worker                if self.text_mode:
1018*cda5da8dSAndroid Build Coastguard Worker                    self.stdout = io.TextIOWrapper(self.stdout,
1019*cda5da8dSAndroid Build Coastguard Worker                            encoding=encoding, errors=errors)
1020*cda5da8dSAndroid Build Coastguard Worker            if errread != -1:
1021*cda5da8dSAndroid Build Coastguard Worker                self.stderr = io.open(errread, 'rb', bufsize)
1022*cda5da8dSAndroid Build Coastguard Worker                if self.text_mode:
1023*cda5da8dSAndroid Build Coastguard Worker                    self.stderr = io.TextIOWrapper(self.stderr,
1024*cda5da8dSAndroid Build Coastguard Worker                            encoding=encoding, errors=errors)
1025*cda5da8dSAndroid Build Coastguard Worker
1026*cda5da8dSAndroid Build Coastguard Worker            self._execute_child(args, executable, preexec_fn, close_fds,
1027*cda5da8dSAndroid Build Coastguard Worker                                pass_fds, cwd, env,
1028*cda5da8dSAndroid Build Coastguard Worker                                startupinfo, creationflags, shell,
1029*cda5da8dSAndroid Build Coastguard Worker                                p2cread, p2cwrite,
1030*cda5da8dSAndroid Build Coastguard Worker                                c2pread, c2pwrite,
1031*cda5da8dSAndroid Build Coastguard Worker                                errread, errwrite,
1032*cda5da8dSAndroid Build Coastguard Worker                                restore_signals,
1033*cda5da8dSAndroid Build Coastguard Worker                                gid, gids, uid, umask,
1034*cda5da8dSAndroid Build Coastguard Worker                                start_new_session, process_group)
1035*cda5da8dSAndroid Build Coastguard Worker        except:
1036*cda5da8dSAndroid Build Coastguard Worker            # Cleanup if the child failed starting.
1037*cda5da8dSAndroid Build Coastguard Worker            for f in filter(None, (self.stdin, self.stdout, self.stderr)):
1038*cda5da8dSAndroid Build Coastguard Worker                try:
1039*cda5da8dSAndroid Build Coastguard Worker                    f.close()
1040*cda5da8dSAndroid Build Coastguard Worker                except OSError:
1041*cda5da8dSAndroid Build Coastguard Worker                    pass  # Ignore EBADF or other errors.
1042*cda5da8dSAndroid Build Coastguard Worker
1043*cda5da8dSAndroid Build Coastguard Worker            if not self._closed_child_pipe_fds:
1044*cda5da8dSAndroid Build Coastguard Worker                to_close = []
1045*cda5da8dSAndroid Build Coastguard Worker                if stdin == PIPE:
1046*cda5da8dSAndroid Build Coastguard Worker                    to_close.append(p2cread)
1047*cda5da8dSAndroid Build Coastguard Worker                if stdout == PIPE:
1048*cda5da8dSAndroid Build Coastguard Worker                    to_close.append(c2pwrite)
1049*cda5da8dSAndroid Build Coastguard Worker                if stderr == PIPE:
1050*cda5da8dSAndroid Build Coastguard Worker                    to_close.append(errwrite)
1051*cda5da8dSAndroid Build Coastguard Worker                if hasattr(self, '_devnull'):
1052*cda5da8dSAndroid Build Coastguard Worker                    to_close.append(self._devnull)
1053*cda5da8dSAndroid Build Coastguard Worker                for fd in to_close:
1054*cda5da8dSAndroid Build Coastguard Worker                    try:
1055*cda5da8dSAndroid Build Coastguard Worker                        if _mswindows and isinstance(fd, Handle):
1056*cda5da8dSAndroid Build Coastguard Worker                            fd.Close()
1057*cda5da8dSAndroid Build Coastguard Worker                        else:
1058*cda5da8dSAndroid Build Coastguard Worker                            os.close(fd)
1059*cda5da8dSAndroid Build Coastguard Worker                    except OSError:
1060*cda5da8dSAndroid Build Coastguard Worker                        pass
1061*cda5da8dSAndroid Build Coastguard Worker
1062*cda5da8dSAndroid Build Coastguard Worker            raise
1063*cda5da8dSAndroid Build Coastguard Worker
1064*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
1065*cda5da8dSAndroid Build Coastguard Worker        obj_repr = (
1066*cda5da8dSAndroid Build Coastguard Worker            f"<{self.__class__.__name__}: "
1067*cda5da8dSAndroid Build Coastguard Worker            f"returncode: {self.returncode} args: {self.args!r}>"
1068*cda5da8dSAndroid Build Coastguard Worker        )
1069*cda5da8dSAndroid Build Coastguard Worker        if len(obj_repr) > 80:
1070*cda5da8dSAndroid Build Coastguard Worker            obj_repr = obj_repr[:76] + "...>"
1071*cda5da8dSAndroid Build Coastguard Worker        return obj_repr
1072*cda5da8dSAndroid Build Coastguard Worker
1073*cda5da8dSAndroid Build Coastguard Worker    __class_getitem__ = classmethod(types.GenericAlias)
1074*cda5da8dSAndroid Build Coastguard Worker
1075*cda5da8dSAndroid Build Coastguard Worker    @property
1076*cda5da8dSAndroid Build Coastguard Worker    def universal_newlines(self):
1077*cda5da8dSAndroid Build Coastguard Worker        # universal_newlines as retained as an alias of text_mode for API
1078*cda5da8dSAndroid Build Coastguard Worker        # compatibility. bpo-31756
1079*cda5da8dSAndroid Build Coastguard Worker        return self.text_mode
1080*cda5da8dSAndroid Build Coastguard Worker
1081*cda5da8dSAndroid Build Coastguard Worker    @universal_newlines.setter
1082*cda5da8dSAndroid Build Coastguard Worker    def universal_newlines(self, universal_newlines):
1083*cda5da8dSAndroid Build Coastguard Worker        self.text_mode = bool(universal_newlines)
1084*cda5da8dSAndroid Build Coastguard Worker
1085*cda5da8dSAndroid Build Coastguard Worker    def _translate_newlines(self, data, encoding, errors):
1086*cda5da8dSAndroid Build Coastguard Worker        data = data.decode(encoding, errors)
1087*cda5da8dSAndroid Build Coastguard Worker        return data.replace("\r\n", "\n").replace("\r", "\n")
1088*cda5da8dSAndroid Build Coastguard Worker
1089*cda5da8dSAndroid Build Coastguard Worker    def __enter__(self):
1090*cda5da8dSAndroid Build Coastguard Worker        return self
1091*cda5da8dSAndroid Build Coastguard Worker
1092*cda5da8dSAndroid Build Coastguard Worker    def __exit__(self, exc_type, value, traceback):
1093*cda5da8dSAndroid Build Coastguard Worker        if self.stdout:
1094*cda5da8dSAndroid Build Coastguard Worker            self.stdout.close()
1095*cda5da8dSAndroid Build Coastguard Worker        if self.stderr:
1096*cda5da8dSAndroid Build Coastguard Worker            self.stderr.close()
1097*cda5da8dSAndroid Build Coastguard Worker        try:  # Flushing a BufferedWriter may raise an error
1098*cda5da8dSAndroid Build Coastguard Worker            if self.stdin:
1099*cda5da8dSAndroid Build Coastguard Worker                self.stdin.close()
1100*cda5da8dSAndroid Build Coastguard Worker        finally:
1101*cda5da8dSAndroid Build Coastguard Worker            if exc_type == KeyboardInterrupt:
1102*cda5da8dSAndroid Build Coastguard Worker                # https://bugs.python.org/issue25942
1103*cda5da8dSAndroid Build Coastguard Worker                # In the case of a KeyboardInterrupt we assume the SIGINT
1104*cda5da8dSAndroid Build Coastguard Worker                # was also already sent to our child processes.  We can't
1105*cda5da8dSAndroid Build Coastguard Worker                # block indefinitely as that is not user friendly.
1106*cda5da8dSAndroid Build Coastguard Worker                # If we have not already waited a brief amount of time in
1107*cda5da8dSAndroid Build Coastguard Worker                # an interrupted .wait() or .communicate() call, do so here
1108*cda5da8dSAndroid Build Coastguard Worker                # for consistency.
1109*cda5da8dSAndroid Build Coastguard Worker                if self._sigint_wait_secs > 0:
1110*cda5da8dSAndroid Build Coastguard Worker                    try:
1111*cda5da8dSAndroid Build Coastguard Worker                        self._wait(timeout=self._sigint_wait_secs)
1112*cda5da8dSAndroid Build Coastguard Worker                    except TimeoutExpired:
1113*cda5da8dSAndroid Build Coastguard Worker                        pass
1114*cda5da8dSAndroid Build Coastguard Worker                self._sigint_wait_secs = 0  # Note that this has been done.
1115*cda5da8dSAndroid Build Coastguard Worker                return  # resume the KeyboardInterrupt
1116*cda5da8dSAndroid Build Coastguard Worker
1117*cda5da8dSAndroid Build Coastguard Worker            # Wait for the process to terminate, to avoid zombies.
1118*cda5da8dSAndroid Build Coastguard Worker            self.wait()
1119*cda5da8dSAndroid Build Coastguard Worker
1120*cda5da8dSAndroid Build Coastguard Worker    def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn):
1121*cda5da8dSAndroid Build Coastguard Worker        if not self._child_created:
1122*cda5da8dSAndroid Build Coastguard Worker            # We didn't get to successfully create a child process.
1123*cda5da8dSAndroid Build Coastguard Worker            return
1124*cda5da8dSAndroid Build Coastguard Worker        if self.returncode is None:
1125*cda5da8dSAndroid Build Coastguard Worker            # Not reading subprocess exit status creates a zombie process which
1126*cda5da8dSAndroid Build Coastguard Worker            # is only destroyed at the parent python process exit
1127*cda5da8dSAndroid Build Coastguard Worker            _warn("subprocess %s is still running" % self.pid,
1128*cda5da8dSAndroid Build Coastguard Worker                  ResourceWarning, source=self)
1129*cda5da8dSAndroid Build Coastguard Worker        # In case the child hasn't been waited on, check if it's done.
1130*cda5da8dSAndroid Build Coastguard Worker        self._internal_poll(_deadstate=_maxsize)
1131*cda5da8dSAndroid Build Coastguard Worker        if self.returncode is None and _active is not None:
1132*cda5da8dSAndroid Build Coastguard Worker            # Child is still running, keep us alive until we can wait on it.
1133*cda5da8dSAndroid Build Coastguard Worker            _active.append(self)
1134*cda5da8dSAndroid Build Coastguard Worker
1135*cda5da8dSAndroid Build Coastguard Worker    def _get_devnull(self):
1136*cda5da8dSAndroid Build Coastguard Worker        if not hasattr(self, '_devnull'):
1137*cda5da8dSAndroid Build Coastguard Worker            self._devnull = os.open(os.devnull, os.O_RDWR)
1138*cda5da8dSAndroid Build Coastguard Worker        return self._devnull
1139*cda5da8dSAndroid Build Coastguard Worker
1140*cda5da8dSAndroid Build Coastguard Worker    def _stdin_write(self, input):
1141*cda5da8dSAndroid Build Coastguard Worker        if input:
1142*cda5da8dSAndroid Build Coastguard Worker            try:
1143*cda5da8dSAndroid Build Coastguard Worker                self.stdin.write(input)
1144*cda5da8dSAndroid Build Coastguard Worker            except BrokenPipeError:
1145*cda5da8dSAndroid Build Coastguard Worker                pass  # communicate() must ignore broken pipe errors.
1146*cda5da8dSAndroid Build Coastguard Worker            except OSError as exc:
1147*cda5da8dSAndroid Build Coastguard Worker                if exc.errno == errno.EINVAL:
1148*cda5da8dSAndroid Build Coastguard Worker                    # bpo-19612, bpo-30418: On Windows, stdin.write() fails
1149*cda5da8dSAndroid Build Coastguard Worker                    # with EINVAL if the child process exited or if the child
1150*cda5da8dSAndroid Build Coastguard Worker                    # process is still running but closed the pipe.
1151*cda5da8dSAndroid Build Coastguard Worker                    pass
1152*cda5da8dSAndroid Build Coastguard Worker                else:
1153*cda5da8dSAndroid Build Coastguard Worker                    raise
1154*cda5da8dSAndroid Build Coastguard Worker
1155*cda5da8dSAndroid Build Coastguard Worker        try:
1156*cda5da8dSAndroid Build Coastguard Worker            self.stdin.close()
1157*cda5da8dSAndroid Build Coastguard Worker        except BrokenPipeError:
1158*cda5da8dSAndroid Build Coastguard Worker            pass  # communicate() must ignore broken pipe errors.
1159*cda5da8dSAndroid Build Coastguard Worker        except OSError as exc:
1160*cda5da8dSAndroid Build Coastguard Worker            if exc.errno == errno.EINVAL:
1161*cda5da8dSAndroid Build Coastguard Worker                pass
1162*cda5da8dSAndroid Build Coastguard Worker            else:
1163*cda5da8dSAndroid Build Coastguard Worker                raise
1164*cda5da8dSAndroid Build Coastguard Worker
1165*cda5da8dSAndroid Build Coastguard Worker    def communicate(self, input=None, timeout=None):
1166*cda5da8dSAndroid Build Coastguard Worker        """Interact with process: Send data to stdin and close it.
1167*cda5da8dSAndroid Build Coastguard Worker        Read data from stdout and stderr, until end-of-file is
1168*cda5da8dSAndroid Build Coastguard Worker        reached.  Wait for process to terminate.
1169*cda5da8dSAndroid Build Coastguard Worker
1170*cda5da8dSAndroid Build Coastguard Worker        The optional "input" argument should be data to be sent to the
1171*cda5da8dSAndroid Build Coastguard Worker        child process, or None, if no data should be sent to the child.
1172*cda5da8dSAndroid Build Coastguard Worker        communicate() returns a tuple (stdout, stderr).
1173*cda5da8dSAndroid Build Coastguard Worker
1174*cda5da8dSAndroid Build Coastguard Worker        By default, all communication is in bytes, and therefore any
1175*cda5da8dSAndroid Build Coastguard Worker        "input" should be bytes, and the (stdout, stderr) will be bytes.
1176*cda5da8dSAndroid Build Coastguard Worker        If in text mode (indicated by self.text_mode), any "input" should
1177*cda5da8dSAndroid Build Coastguard Worker        be a string, and (stdout, stderr) will be strings decoded
1178*cda5da8dSAndroid Build Coastguard Worker        according to locale encoding, or by "encoding" if set. Text mode
1179*cda5da8dSAndroid Build Coastguard Worker        is triggered by setting any of text, encoding, errors or
1180*cda5da8dSAndroid Build Coastguard Worker        universal_newlines.
1181*cda5da8dSAndroid Build Coastguard Worker        """
1182*cda5da8dSAndroid Build Coastguard Worker
1183*cda5da8dSAndroid Build Coastguard Worker        if self._communication_started and input:
1184*cda5da8dSAndroid Build Coastguard Worker            raise ValueError("Cannot send input after starting communication")
1185*cda5da8dSAndroid Build Coastguard Worker
1186*cda5da8dSAndroid Build Coastguard Worker        # Optimization: If we are not worried about timeouts, we haven't
1187*cda5da8dSAndroid Build Coastguard Worker        # started communicating, and we have one or zero pipes, using select()
1188*cda5da8dSAndroid Build Coastguard Worker        # or threads is unnecessary.
1189*cda5da8dSAndroid Build Coastguard Worker        if (timeout is None and not self._communication_started and
1190*cda5da8dSAndroid Build Coastguard Worker            [self.stdin, self.stdout, self.stderr].count(None) >= 2):
1191*cda5da8dSAndroid Build Coastguard Worker            stdout = None
1192*cda5da8dSAndroid Build Coastguard Worker            stderr = None
1193*cda5da8dSAndroid Build Coastguard Worker            if self.stdin:
1194*cda5da8dSAndroid Build Coastguard Worker                self._stdin_write(input)
1195*cda5da8dSAndroid Build Coastguard Worker            elif self.stdout:
1196*cda5da8dSAndroid Build Coastguard Worker                stdout = self.stdout.read()
1197*cda5da8dSAndroid Build Coastguard Worker                self.stdout.close()
1198*cda5da8dSAndroid Build Coastguard Worker            elif self.stderr:
1199*cda5da8dSAndroid Build Coastguard Worker                stderr = self.stderr.read()
1200*cda5da8dSAndroid Build Coastguard Worker                self.stderr.close()
1201*cda5da8dSAndroid Build Coastguard Worker            self.wait()
1202*cda5da8dSAndroid Build Coastguard Worker        else:
1203*cda5da8dSAndroid Build Coastguard Worker            if timeout is not None:
1204*cda5da8dSAndroid Build Coastguard Worker                endtime = _time() + timeout
1205*cda5da8dSAndroid Build Coastguard Worker            else:
1206*cda5da8dSAndroid Build Coastguard Worker                endtime = None
1207*cda5da8dSAndroid Build Coastguard Worker
1208*cda5da8dSAndroid Build Coastguard Worker            try:
1209*cda5da8dSAndroid Build Coastguard Worker                stdout, stderr = self._communicate(input, endtime, timeout)
1210*cda5da8dSAndroid Build Coastguard Worker            except KeyboardInterrupt:
1211*cda5da8dSAndroid Build Coastguard Worker                # https://bugs.python.org/issue25942
1212*cda5da8dSAndroid Build Coastguard Worker                # See the detailed comment in .wait().
1213*cda5da8dSAndroid Build Coastguard Worker                if timeout is not None:
1214*cda5da8dSAndroid Build Coastguard Worker                    sigint_timeout = min(self._sigint_wait_secs,
1215*cda5da8dSAndroid Build Coastguard Worker                                         self._remaining_time(endtime))
1216*cda5da8dSAndroid Build Coastguard Worker                else:
1217*cda5da8dSAndroid Build Coastguard Worker                    sigint_timeout = self._sigint_wait_secs
1218*cda5da8dSAndroid Build Coastguard Worker                self._sigint_wait_secs = 0  # nothing else should wait.
1219*cda5da8dSAndroid Build Coastguard Worker                try:
1220*cda5da8dSAndroid Build Coastguard Worker                    self._wait(timeout=sigint_timeout)
1221*cda5da8dSAndroid Build Coastguard Worker                except TimeoutExpired:
1222*cda5da8dSAndroid Build Coastguard Worker                    pass
1223*cda5da8dSAndroid Build Coastguard Worker                raise  # resume the KeyboardInterrupt
1224*cda5da8dSAndroid Build Coastguard Worker
1225*cda5da8dSAndroid Build Coastguard Worker            finally:
1226*cda5da8dSAndroid Build Coastguard Worker                self._communication_started = True
1227*cda5da8dSAndroid Build Coastguard Worker
1228*cda5da8dSAndroid Build Coastguard Worker            sts = self.wait(timeout=self._remaining_time(endtime))
1229*cda5da8dSAndroid Build Coastguard Worker
1230*cda5da8dSAndroid Build Coastguard Worker        return (stdout, stderr)
1231*cda5da8dSAndroid Build Coastguard Worker
1232*cda5da8dSAndroid Build Coastguard Worker
1233*cda5da8dSAndroid Build Coastguard Worker    def poll(self):
1234*cda5da8dSAndroid Build Coastguard Worker        """Check if child process has terminated. Set and return returncode
1235*cda5da8dSAndroid Build Coastguard Worker        attribute."""
1236*cda5da8dSAndroid Build Coastguard Worker        return self._internal_poll()
1237*cda5da8dSAndroid Build Coastguard Worker
1238*cda5da8dSAndroid Build Coastguard Worker
1239*cda5da8dSAndroid Build Coastguard Worker    def _remaining_time(self, endtime):
1240*cda5da8dSAndroid Build Coastguard Worker        """Convenience for _communicate when computing timeouts."""
1241*cda5da8dSAndroid Build Coastguard Worker        if endtime is None:
1242*cda5da8dSAndroid Build Coastguard Worker            return None
1243*cda5da8dSAndroid Build Coastguard Worker        else:
1244*cda5da8dSAndroid Build Coastguard Worker            return endtime - _time()
1245*cda5da8dSAndroid Build Coastguard Worker
1246*cda5da8dSAndroid Build Coastguard Worker
1247*cda5da8dSAndroid Build Coastguard Worker    def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
1248*cda5da8dSAndroid Build Coastguard Worker                       skip_check_and_raise=False):
1249*cda5da8dSAndroid Build Coastguard Worker        """Convenience for checking if a timeout has expired."""
1250*cda5da8dSAndroid Build Coastguard Worker        if endtime is None:
1251*cda5da8dSAndroid Build Coastguard Worker            return
1252*cda5da8dSAndroid Build Coastguard Worker        if skip_check_and_raise or _time() > endtime:
1253*cda5da8dSAndroid Build Coastguard Worker            raise TimeoutExpired(
1254*cda5da8dSAndroid Build Coastguard Worker                    self.args, orig_timeout,
1255*cda5da8dSAndroid Build Coastguard Worker                    output=b''.join(stdout_seq) if stdout_seq else None,
1256*cda5da8dSAndroid Build Coastguard Worker                    stderr=b''.join(stderr_seq) if stderr_seq else None)
1257*cda5da8dSAndroid Build Coastguard Worker
1258*cda5da8dSAndroid Build Coastguard Worker
1259*cda5da8dSAndroid Build Coastguard Worker    def wait(self, timeout=None):
1260*cda5da8dSAndroid Build Coastguard Worker        """Wait for child process to terminate; returns self.returncode."""
1261*cda5da8dSAndroid Build Coastguard Worker        if timeout is not None:
1262*cda5da8dSAndroid Build Coastguard Worker            endtime = _time() + timeout
1263*cda5da8dSAndroid Build Coastguard Worker        try:
1264*cda5da8dSAndroid Build Coastguard Worker            return self._wait(timeout=timeout)
1265*cda5da8dSAndroid Build Coastguard Worker        except KeyboardInterrupt:
1266*cda5da8dSAndroid Build Coastguard Worker            # https://bugs.python.org/issue25942
1267*cda5da8dSAndroid Build Coastguard Worker            # The first keyboard interrupt waits briefly for the child to
1268*cda5da8dSAndroid Build Coastguard Worker            # exit under the common assumption that it also received the ^C
1269*cda5da8dSAndroid Build Coastguard Worker            # generated SIGINT and will exit rapidly.
1270*cda5da8dSAndroid Build Coastguard Worker            if timeout is not None:
1271*cda5da8dSAndroid Build Coastguard Worker                sigint_timeout = min(self._sigint_wait_secs,
1272*cda5da8dSAndroid Build Coastguard Worker                                     self._remaining_time(endtime))
1273*cda5da8dSAndroid Build Coastguard Worker            else:
1274*cda5da8dSAndroid Build Coastguard Worker                sigint_timeout = self._sigint_wait_secs
1275*cda5da8dSAndroid Build Coastguard Worker            self._sigint_wait_secs = 0  # nothing else should wait.
1276*cda5da8dSAndroid Build Coastguard Worker            try:
1277*cda5da8dSAndroid Build Coastguard Worker                self._wait(timeout=sigint_timeout)
1278*cda5da8dSAndroid Build Coastguard Worker            except TimeoutExpired:
1279*cda5da8dSAndroid Build Coastguard Worker                pass
1280*cda5da8dSAndroid Build Coastguard Worker            raise  # resume the KeyboardInterrupt
1281*cda5da8dSAndroid Build Coastguard Worker
1282*cda5da8dSAndroid Build Coastguard Worker    def _close_pipe_fds(self,
1283*cda5da8dSAndroid Build Coastguard Worker                        p2cread, p2cwrite,
1284*cda5da8dSAndroid Build Coastguard Worker                        c2pread, c2pwrite,
1285*cda5da8dSAndroid Build Coastguard Worker                        errread, errwrite):
1286*cda5da8dSAndroid Build Coastguard Worker        # self._devnull is not always defined.
1287*cda5da8dSAndroid Build Coastguard Worker        devnull_fd = getattr(self, '_devnull', None)
1288*cda5da8dSAndroid Build Coastguard Worker
1289*cda5da8dSAndroid Build Coastguard Worker        with contextlib.ExitStack() as stack:
1290*cda5da8dSAndroid Build Coastguard Worker            if _mswindows:
1291*cda5da8dSAndroid Build Coastguard Worker                if p2cread != -1:
1292*cda5da8dSAndroid Build Coastguard Worker                    stack.callback(p2cread.Close)
1293*cda5da8dSAndroid Build Coastguard Worker                if c2pwrite != -1:
1294*cda5da8dSAndroid Build Coastguard Worker                    stack.callback(c2pwrite.Close)
1295*cda5da8dSAndroid Build Coastguard Worker                if errwrite != -1:
1296*cda5da8dSAndroid Build Coastguard Worker                    stack.callback(errwrite.Close)
1297*cda5da8dSAndroid Build Coastguard Worker            else:
1298*cda5da8dSAndroid Build Coastguard Worker                if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
1299*cda5da8dSAndroid Build Coastguard Worker                    stack.callback(os.close, p2cread)
1300*cda5da8dSAndroid Build Coastguard Worker                if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
1301*cda5da8dSAndroid Build Coastguard Worker                    stack.callback(os.close, c2pwrite)
1302*cda5da8dSAndroid Build Coastguard Worker                if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
1303*cda5da8dSAndroid Build Coastguard Worker                    stack.callback(os.close, errwrite)
1304*cda5da8dSAndroid Build Coastguard Worker
1305*cda5da8dSAndroid Build Coastguard Worker            if devnull_fd is not None:
1306*cda5da8dSAndroid Build Coastguard Worker                stack.callback(os.close, devnull_fd)
1307*cda5da8dSAndroid Build Coastguard Worker
1308*cda5da8dSAndroid Build Coastguard Worker        # Prevent a double close of these handles/fds from __init__ on error.
1309*cda5da8dSAndroid Build Coastguard Worker        self._closed_child_pipe_fds = True
1310*cda5da8dSAndroid Build Coastguard Worker
1311*cda5da8dSAndroid Build Coastguard Worker    @contextlib.contextmanager
1312*cda5da8dSAndroid Build Coastguard Worker    def _on_error_fd_closer(self):
1313*cda5da8dSAndroid Build Coastguard Worker        """Helper to ensure file descriptors opened in _get_handles are closed"""
1314*cda5da8dSAndroid Build Coastguard Worker        to_close = []
1315*cda5da8dSAndroid Build Coastguard Worker        try:
1316*cda5da8dSAndroid Build Coastguard Worker            yield to_close
1317*cda5da8dSAndroid Build Coastguard Worker        except:
1318*cda5da8dSAndroid Build Coastguard Worker            if hasattr(self, '_devnull'):
1319*cda5da8dSAndroid Build Coastguard Worker                to_close.append(self._devnull)
1320*cda5da8dSAndroid Build Coastguard Worker                del self._devnull
1321*cda5da8dSAndroid Build Coastguard Worker            for fd in to_close:
1322*cda5da8dSAndroid Build Coastguard Worker                try:
1323*cda5da8dSAndroid Build Coastguard Worker                    if _mswindows and isinstance(fd, Handle):
1324*cda5da8dSAndroid Build Coastguard Worker                        fd.Close()
1325*cda5da8dSAndroid Build Coastguard Worker                    else:
1326*cda5da8dSAndroid Build Coastguard Worker                        os.close(fd)
1327*cda5da8dSAndroid Build Coastguard Worker                except OSError:
1328*cda5da8dSAndroid Build Coastguard Worker                    pass
1329*cda5da8dSAndroid Build Coastguard Worker            raise
1330*cda5da8dSAndroid Build Coastguard Worker
1331*cda5da8dSAndroid Build Coastguard Worker    if _mswindows:
1332*cda5da8dSAndroid Build Coastguard Worker        #
1333*cda5da8dSAndroid Build Coastguard Worker        # Windows methods
1334*cda5da8dSAndroid Build Coastguard Worker        #
1335*cda5da8dSAndroid Build Coastguard Worker        def _get_handles(self, stdin, stdout, stderr):
1336*cda5da8dSAndroid Build Coastguard Worker            """Construct and return tuple with IO objects:
1337*cda5da8dSAndroid Build Coastguard Worker            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1338*cda5da8dSAndroid Build Coastguard Worker            """
1339*cda5da8dSAndroid Build Coastguard Worker            if stdin is None and stdout is None and stderr is None:
1340*cda5da8dSAndroid Build Coastguard Worker                return (-1, -1, -1, -1, -1, -1)
1341*cda5da8dSAndroid Build Coastguard Worker
1342*cda5da8dSAndroid Build Coastguard Worker            p2cread, p2cwrite = -1, -1
1343*cda5da8dSAndroid Build Coastguard Worker            c2pread, c2pwrite = -1, -1
1344*cda5da8dSAndroid Build Coastguard Worker            errread, errwrite = -1, -1
1345*cda5da8dSAndroid Build Coastguard Worker
1346*cda5da8dSAndroid Build Coastguard Worker            with self._on_error_fd_closer() as err_close_fds:
1347*cda5da8dSAndroid Build Coastguard Worker                if stdin is None:
1348*cda5da8dSAndroid Build Coastguard Worker                    p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
1349*cda5da8dSAndroid Build Coastguard Worker                    if p2cread is None:
1350*cda5da8dSAndroid Build Coastguard Worker                        p2cread, _ = _winapi.CreatePipe(None, 0)
1351*cda5da8dSAndroid Build Coastguard Worker                        p2cread = Handle(p2cread)
1352*cda5da8dSAndroid Build Coastguard Worker                        err_close_fds.append(p2cread)
1353*cda5da8dSAndroid Build Coastguard Worker                        _winapi.CloseHandle(_)
1354*cda5da8dSAndroid Build Coastguard Worker                elif stdin == PIPE:
1355*cda5da8dSAndroid Build Coastguard Worker                    p2cread, p2cwrite = _winapi.CreatePipe(None, 0)
1356*cda5da8dSAndroid Build Coastguard Worker                    p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite)
1357*cda5da8dSAndroid Build Coastguard Worker                    err_close_fds.extend((p2cread, p2cwrite))
1358*cda5da8dSAndroid Build Coastguard Worker                elif stdin == DEVNULL:
1359*cda5da8dSAndroid Build Coastguard Worker                    p2cread = msvcrt.get_osfhandle(self._get_devnull())
1360*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(stdin, int):
1361*cda5da8dSAndroid Build Coastguard Worker                    p2cread = msvcrt.get_osfhandle(stdin)
1362*cda5da8dSAndroid Build Coastguard Worker                else:
1363*cda5da8dSAndroid Build Coastguard Worker                    # Assuming file-like object
1364*cda5da8dSAndroid Build Coastguard Worker                    p2cread = msvcrt.get_osfhandle(stdin.fileno())
1365*cda5da8dSAndroid Build Coastguard Worker                p2cread = self._make_inheritable(p2cread)
1366*cda5da8dSAndroid Build Coastguard Worker
1367*cda5da8dSAndroid Build Coastguard Worker                if stdout is None:
1368*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
1369*cda5da8dSAndroid Build Coastguard Worker                    if c2pwrite is None:
1370*cda5da8dSAndroid Build Coastguard Worker                        _, c2pwrite = _winapi.CreatePipe(None, 0)
1371*cda5da8dSAndroid Build Coastguard Worker                        c2pwrite = Handle(c2pwrite)
1372*cda5da8dSAndroid Build Coastguard Worker                        err_close_fds.append(c2pwrite)
1373*cda5da8dSAndroid Build Coastguard Worker                        _winapi.CloseHandle(_)
1374*cda5da8dSAndroid Build Coastguard Worker                elif stdout == PIPE:
1375*cda5da8dSAndroid Build Coastguard Worker                    c2pread, c2pwrite = _winapi.CreatePipe(None, 0)
1376*cda5da8dSAndroid Build Coastguard Worker                    c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite)
1377*cda5da8dSAndroid Build Coastguard Worker                    err_close_fds.extend((c2pread, c2pwrite))
1378*cda5da8dSAndroid Build Coastguard Worker                elif stdout == DEVNULL:
1379*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = msvcrt.get_osfhandle(self._get_devnull())
1380*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(stdout, int):
1381*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = msvcrt.get_osfhandle(stdout)
1382*cda5da8dSAndroid Build Coastguard Worker                else:
1383*cda5da8dSAndroid Build Coastguard Worker                    # Assuming file-like object
1384*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
1385*cda5da8dSAndroid Build Coastguard Worker                c2pwrite = self._make_inheritable(c2pwrite)
1386*cda5da8dSAndroid Build Coastguard Worker
1387*cda5da8dSAndroid Build Coastguard Worker                if stderr is None:
1388*cda5da8dSAndroid Build Coastguard Worker                    errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)
1389*cda5da8dSAndroid Build Coastguard Worker                    if errwrite is None:
1390*cda5da8dSAndroid Build Coastguard Worker                        _, errwrite = _winapi.CreatePipe(None, 0)
1391*cda5da8dSAndroid Build Coastguard Worker                        errwrite = Handle(errwrite)
1392*cda5da8dSAndroid Build Coastguard Worker                        err_close_fds.append(errwrite)
1393*cda5da8dSAndroid Build Coastguard Worker                        _winapi.CloseHandle(_)
1394*cda5da8dSAndroid Build Coastguard Worker                elif stderr == PIPE:
1395*cda5da8dSAndroid Build Coastguard Worker                    errread, errwrite = _winapi.CreatePipe(None, 0)
1396*cda5da8dSAndroid Build Coastguard Worker                    errread, errwrite = Handle(errread), Handle(errwrite)
1397*cda5da8dSAndroid Build Coastguard Worker                    err_close_fds.extend((errread, errwrite))
1398*cda5da8dSAndroid Build Coastguard Worker                elif stderr == STDOUT:
1399*cda5da8dSAndroid Build Coastguard Worker                    errwrite = c2pwrite
1400*cda5da8dSAndroid Build Coastguard Worker                elif stderr == DEVNULL:
1401*cda5da8dSAndroid Build Coastguard Worker                    errwrite = msvcrt.get_osfhandle(self._get_devnull())
1402*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(stderr, int):
1403*cda5da8dSAndroid Build Coastguard Worker                    errwrite = msvcrt.get_osfhandle(stderr)
1404*cda5da8dSAndroid Build Coastguard Worker                else:
1405*cda5da8dSAndroid Build Coastguard Worker                    # Assuming file-like object
1406*cda5da8dSAndroid Build Coastguard Worker                    errwrite = msvcrt.get_osfhandle(stderr.fileno())
1407*cda5da8dSAndroid Build Coastguard Worker                errwrite = self._make_inheritable(errwrite)
1408*cda5da8dSAndroid Build Coastguard Worker
1409*cda5da8dSAndroid Build Coastguard Worker            return (p2cread, p2cwrite,
1410*cda5da8dSAndroid Build Coastguard Worker                    c2pread, c2pwrite,
1411*cda5da8dSAndroid Build Coastguard Worker                    errread, errwrite)
1412*cda5da8dSAndroid Build Coastguard Worker
1413*cda5da8dSAndroid Build Coastguard Worker
1414*cda5da8dSAndroid Build Coastguard Worker        def _make_inheritable(self, handle):
1415*cda5da8dSAndroid Build Coastguard Worker            """Return a duplicate of handle, which is inheritable"""
1416*cda5da8dSAndroid Build Coastguard Worker            h = _winapi.DuplicateHandle(
1417*cda5da8dSAndroid Build Coastguard Worker                _winapi.GetCurrentProcess(), handle,
1418*cda5da8dSAndroid Build Coastguard Worker                _winapi.GetCurrentProcess(), 0, 1,
1419*cda5da8dSAndroid Build Coastguard Worker                _winapi.DUPLICATE_SAME_ACCESS)
1420*cda5da8dSAndroid Build Coastguard Worker            return Handle(h)
1421*cda5da8dSAndroid Build Coastguard Worker
1422*cda5da8dSAndroid Build Coastguard Worker
1423*cda5da8dSAndroid Build Coastguard Worker        def _filter_handle_list(self, handle_list):
1424*cda5da8dSAndroid Build Coastguard Worker            """Filter out console handles that can't be used
1425*cda5da8dSAndroid Build Coastguard Worker            in lpAttributeList["handle_list"] and make sure the list
1426*cda5da8dSAndroid Build Coastguard Worker            isn't empty. This also removes duplicate handles."""
1427*cda5da8dSAndroid Build Coastguard Worker            # An handle with it's lowest two bits set might be a special console
1428*cda5da8dSAndroid Build Coastguard Worker            # handle that if passed in lpAttributeList["handle_list"], will
1429*cda5da8dSAndroid Build Coastguard Worker            # cause it to fail.
1430*cda5da8dSAndroid Build Coastguard Worker            return list({handle for handle in handle_list
1431*cda5da8dSAndroid Build Coastguard Worker                         if handle & 0x3 != 0x3
1432*cda5da8dSAndroid Build Coastguard Worker                         or _winapi.GetFileType(handle) !=
1433*cda5da8dSAndroid Build Coastguard Worker                            _winapi.FILE_TYPE_CHAR})
1434*cda5da8dSAndroid Build Coastguard Worker
1435*cda5da8dSAndroid Build Coastguard Worker
1436*cda5da8dSAndroid Build Coastguard Worker        def _execute_child(self, args, executable, preexec_fn, close_fds,
1437*cda5da8dSAndroid Build Coastguard Worker                           pass_fds, cwd, env,
1438*cda5da8dSAndroid Build Coastguard Worker                           startupinfo, creationflags, shell,
1439*cda5da8dSAndroid Build Coastguard Worker                           p2cread, p2cwrite,
1440*cda5da8dSAndroid Build Coastguard Worker                           c2pread, c2pwrite,
1441*cda5da8dSAndroid Build Coastguard Worker                           errread, errwrite,
1442*cda5da8dSAndroid Build Coastguard Worker                           unused_restore_signals,
1443*cda5da8dSAndroid Build Coastguard Worker                           unused_gid, unused_gids, unused_uid,
1444*cda5da8dSAndroid Build Coastguard Worker                           unused_umask,
1445*cda5da8dSAndroid Build Coastguard Worker                           unused_start_new_session, unused_process_group):
1446*cda5da8dSAndroid Build Coastguard Worker            """Execute program (MS Windows version)"""
1447*cda5da8dSAndroid Build Coastguard Worker
1448*cda5da8dSAndroid Build Coastguard Worker            assert not pass_fds, "pass_fds not supported on Windows."
1449*cda5da8dSAndroid Build Coastguard Worker
1450*cda5da8dSAndroid Build Coastguard Worker            if isinstance(args, str):
1451*cda5da8dSAndroid Build Coastguard Worker                pass
1452*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(args, bytes):
1453*cda5da8dSAndroid Build Coastguard Worker                if shell:
1454*cda5da8dSAndroid Build Coastguard Worker                    raise TypeError('bytes args is not allowed on Windows')
1455*cda5da8dSAndroid Build Coastguard Worker                args = list2cmdline([args])
1456*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(args, os.PathLike):
1457*cda5da8dSAndroid Build Coastguard Worker                if shell:
1458*cda5da8dSAndroid Build Coastguard Worker                    raise TypeError('path-like args is not allowed when '
1459*cda5da8dSAndroid Build Coastguard Worker                                    'shell is true')
1460*cda5da8dSAndroid Build Coastguard Worker                args = list2cmdline([args])
1461*cda5da8dSAndroid Build Coastguard Worker            else:
1462*cda5da8dSAndroid Build Coastguard Worker                args = list2cmdline(args)
1463*cda5da8dSAndroid Build Coastguard Worker
1464*cda5da8dSAndroid Build Coastguard Worker            if executable is not None:
1465*cda5da8dSAndroid Build Coastguard Worker                executable = os.fsdecode(executable)
1466*cda5da8dSAndroid Build Coastguard Worker
1467*cda5da8dSAndroid Build Coastguard Worker            # Process startup details
1468*cda5da8dSAndroid Build Coastguard Worker            if startupinfo is None:
1469*cda5da8dSAndroid Build Coastguard Worker                startupinfo = STARTUPINFO()
1470*cda5da8dSAndroid Build Coastguard Worker            else:
1471*cda5da8dSAndroid Build Coastguard Worker                # bpo-34044: Copy STARTUPINFO since it is modified above,
1472*cda5da8dSAndroid Build Coastguard Worker                # so the caller can reuse it multiple times.
1473*cda5da8dSAndroid Build Coastguard Worker                startupinfo = startupinfo.copy()
1474*cda5da8dSAndroid Build Coastguard Worker
1475*cda5da8dSAndroid Build Coastguard Worker            use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
1476*cda5da8dSAndroid Build Coastguard Worker            if use_std_handles:
1477*cda5da8dSAndroid Build Coastguard Worker                startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
1478*cda5da8dSAndroid Build Coastguard Worker                startupinfo.hStdInput = p2cread
1479*cda5da8dSAndroid Build Coastguard Worker                startupinfo.hStdOutput = c2pwrite
1480*cda5da8dSAndroid Build Coastguard Worker                startupinfo.hStdError = errwrite
1481*cda5da8dSAndroid Build Coastguard Worker
1482*cda5da8dSAndroid Build Coastguard Worker            attribute_list = startupinfo.lpAttributeList
1483*cda5da8dSAndroid Build Coastguard Worker            have_handle_list = bool(attribute_list and
1484*cda5da8dSAndroid Build Coastguard Worker                                    "handle_list" in attribute_list and
1485*cda5da8dSAndroid Build Coastguard Worker                                    attribute_list["handle_list"])
1486*cda5da8dSAndroid Build Coastguard Worker
1487*cda5da8dSAndroid Build Coastguard Worker            # If we were given an handle_list or need to create one
1488*cda5da8dSAndroid Build Coastguard Worker            if have_handle_list or (use_std_handles and close_fds):
1489*cda5da8dSAndroid Build Coastguard Worker                if attribute_list is None:
1490*cda5da8dSAndroid Build Coastguard Worker                    attribute_list = startupinfo.lpAttributeList = {}
1491*cda5da8dSAndroid Build Coastguard Worker                handle_list = attribute_list["handle_list"] = \
1492*cda5da8dSAndroid Build Coastguard Worker                    list(attribute_list.get("handle_list", []))
1493*cda5da8dSAndroid Build Coastguard Worker
1494*cda5da8dSAndroid Build Coastguard Worker                if use_std_handles:
1495*cda5da8dSAndroid Build Coastguard Worker                    handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]
1496*cda5da8dSAndroid Build Coastguard Worker
1497*cda5da8dSAndroid Build Coastguard Worker                handle_list[:] = self._filter_handle_list(handle_list)
1498*cda5da8dSAndroid Build Coastguard Worker
1499*cda5da8dSAndroid Build Coastguard Worker                if handle_list:
1500*cda5da8dSAndroid Build Coastguard Worker                    if not close_fds:
1501*cda5da8dSAndroid Build Coastguard Worker                        warnings.warn("startupinfo.lpAttributeList['handle_list'] "
1502*cda5da8dSAndroid Build Coastguard Worker                                      "overriding close_fds", RuntimeWarning)
1503*cda5da8dSAndroid Build Coastguard Worker
1504*cda5da8dSAndroid Build Coastguard Worker                    # When using the handle_list we always request to inherit
1505*cda5da8dSAndroid Build Coastguard Worker                    # handles but the only handles that will be inherited are
1506*cda5da8dSAndroid Build Coastguard Worker                    # the ones in the handle_list
1507*cda5da8dSAndroid Build Coastguard Worker                    close_fds = False
1508*cda5da8dSAndroid Build Coastguard Worker
1509*cda5da8dSAndroid Build Coastguard Worker            if shell:
1510*cda5da8dSAndroid Build Coastguard Worker                startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
1511*cda5da8dSAndroid Build Coastguard Worker                startupinfo.wShowWindow = _winapi.SW_HIDE
1512*cda5da8dSAndroid Build Coastguard Worker                if not executable:
1513*cda5da8dSAndroid Build Coastguard Worker                    # gh-101283: without a fully-qualified path, before Windows
1514*cda5da8dSAndroid Build Coastguard Worker                    # checks the system directories, it first looks in the
1515*cda5da8dSAndroid Build Coastguard Worker                    # application directory, and also the current directory if
1516*cda5da8dSAndroid Build Coastguard Worker                    # NeedCurrentDirectoryForExePathW(ExeName) is true, so try
1517*cda5da8dSAndroid Build Coastguard Worker                    # to avoid executing unqualified "cmd.exe".
1518*cda5da8dSAndroid Build Coastguard Worker                    comspec = os.environ.get('ComSpec')
1519*cda5da8dSAndroid Build Coastguard Worker                    if not comspec:
1520*cda5da8dSAndroid Build Coastguard Worker                        system_root = os.environ.get('SystemRoot', '')
1521*cda5da8dSAndroid Build Coastguard Worker                        comspec = os.path.join(system_root, 'System32', 'cmd.exe')
1522*cda5da8dSAndroid Build Coastguard Worker                        if not os.path.isabs(comspec):
1523*cda5da8dSAndroid Build Coastguard Worker                            raise FileNotFoundError('shell not found: neither %ComSpec% nor %SystemRoot% is set')
1524*cda5da8dSAndroid Build Coastguard Worker                    if os.path.isabs(comspec):
1525*cda5da8dSAndroid Build Coastguard Worker                        executable = comspec
1526*cda5da8dSAndroid Build Coastguard Worker                else:
1527*cda5da8dSAndroid Build Coastguard Worker                    comspec = executable
1528*cda5da8dSAndroid Build Coastguard Worker
1529*cda5da8dSAndroid Build Coastguard Worker                args = '{} /c "{}"'.format (comspec, args)
1530*cda5da8dSAndroid Build Coastguard Worker
1531*cda5da8dSAndroid Build Coastguard Worker            if cwd is not None:
1532*cda5da8dSAndroid Build Coastguard Worker                cwd = os.fsdecode(cwd)
1533*cda5da8dSAndroid Build Coastguard Worker
1534*cda5da8dSAndroid Build Coastguard Worker            sys.audit("subprocess.Popen", executable, args, cwd, env)
1535*cda5da8dSAndroid Build Coastguard Worker
1536*cda5da8dSAndroid Build Coastguard Worker            # Start the process
1537*cda5da8dSAndroid Build Coastguard Worker            try:
1538*cda5da8dSAndroid Build Coastguard Worker                hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
1539*cda5da8dSAndroid Build Coastguard Worker                                         # no special security
1540*cda5da8dSAndroid Build Coastguard Worker                                         None, None,
1541*cda5da8dSAndroid Build Coastguard Worker                                         int(not close_fds),
1542*cda5da8dSAndroid Build Coastguard Worker                                         creationflags,
1543*cda5da8dSAndroid Build Coastguard Worker                                         env,
1544*cda5da8dSAndroid Build Coastguard Worker                                         cwd,
1545*cda5da8dSAndroid Build Coastguard Worker                                         startupinfo)
1546*cda5da8dSAndroid Build Coastguard Worker            finally:
1547*cda5da8dSAndroid Build Coastguard Worker                # Child is launched. Close the parent's copy of those pipe
1548*cda5da8dSAndroid Build Coastguard Worker                # handles that only the child should have open.  You need
1549*cda5da8dSAndroid Build Coastguard Worker                # to make sure that no handles to the write end of the
1550*cda5da8dSAndroid Build Coastguard Worker                # output pipe are maintained in this process or else the
1551*cda5da8dSAndroid Build Coastguard Worker                # pipe will not close when the child process exits and the
1552*cda5da8dSAndroid Build Coastguard Worker                # ReadFile will hang.
1553*cda5da8dSAndroid Build Coastguard Worker                self._close_pipe_fds(p2cread, p2cwrite,
1554*cda5da8dSAndroid Build Coastguard Worker                                     c2pread, c2pwrite,
1555*cda5da8dSAndroid Build Coastguard Worker                                     errread, errwrite)
1556*cda5da8dSAndroid Build Coastguard Worker
1557*cda5da8dSAndroid Build Coastguard Worker            # Retain the process handle, but close the thread handle
1558*cda5da8dSAndroid Build Coastguard Worker            self._child_created = True
1559*cda5da8dSAndroid Build Coastguard Worker            self._handle = Handle(hp)
1560*cda5da8dSAndroid Build Coastguard Worker            self.pid = pid
1561*cda5da8dSAndroid Build Coastguard Worker            _winapi.CloseHandle(ht)
1562*cda5da8dSAndroid Build Coastguard Worker
1563*cda5da8dSAndroid Build Coastguard Worker        def _internal_poll(self, _deadstate=None,
1564*cda5da8dSAndroid Build Coastguard Worker                _WaitForSingleObject=_winapi.WaitForSingleObject,
1565*cda5da8dSAndroid Build Coastguard Worker                _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0,
1566*cda5da8dSAndroid Build Coastguard Worker                _GetExitCodeProcess=_winapi.GetExitCodeProcess):
1567*cda5da8dSAndroid Build Coastguard Worker            """Check if child process has terminated.  Returns returncode
1568*cda5da8dSAndroid Build Coastguard Worker            attribute.
1569*cda5da8dSAndroid Build Coastguard Worker
1570*cda5da8dSAndroid Build Coastguard Worker            This method is called by __del__, so it can only refer to objects
1571*cda5da8dSAndroid Build Coastguard Worker            in its local scope.
1572*cda5da8dSAndroid Build Coastguard Worker
1573*cda5da8dSAndroid Build Coastguard Worker            """
1574*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is None:
1575*cda5da8dSAndroid Build Coastguard Worker                if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
1576*cda5da8dSAndroid Build Coastguard Worker                    self.returncode = _GetExitCodeProcess(self._handle)
1577*cda5da8dSAndroid Build Coastguard Worker            return self.returncode
1578*cda5da8dSAndroid Build Coastguard Worker
1579*cda5da8dSAndroid Build Coastguard Worker
1580*cda5da8dSAndroid Build Coastguard Worker        def _wait(self, timeout):
1581*cda5da8dSAndroid Build Coastguard Worker            """Internal implementation of wait() on Windows."""
1582*cda5da8dSAndroid Build Coastguard Worker            if timeout is None:
1583*cda5da8dSAndroid Build Coastguard Worker                timeout_millis = _winapi.INFINITE
1584*cda5da8dSAndroid Build Coastguard Worker            else:
1585*cda5da8dSAndroid Build Coastguard Worker                timeout_millis = int(timeout * 1000)
1586*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is None:
1587*cda5da8dSAndroid Build Coastguard Worker                # API note: Returns immediately if timeout_millis == 0.
1588*cda5da8dSAndroid Build Coastguard Worker                result = _winapi.WaitForSingleObject(self._handle,
1589*cda5da8dSAndroid Build Coastguard Worker                                                     timeout_millis)
1590*cda5da8dSAndroid Build Coastguard Worker                if result == _winapi.WAIT_TIMEOUT:
1591*cda5da8dSAndroid Build Coastguard Worker                    raise TimeoutExpired(self.args, timeout)
1592*cda5da8dSAndroid Build Coastguard Worker                self.returncode = _winapi.GetExitCodeProcess(self._handle)
1593*cda5da8dSAndroid Build Coastguard Worker            return self.returncode
1594*cda5da8dSAndroid Build Coastguard Worker
1595*cda5da8dSAndroid Build Coastguard Worker
1596*cda5da8dSAndroid Build Coastguard Worker        def _readerthread(self, fh, buffer):
1597*cda5da8dSAndroid Build Coastguard Worker            buffer.append(fh.read())
1598*cda5da8dSAndroid Build Coastguard Worker            fh.close()
1599*cda5da8dSAndroid Build Coastguard Worker
1600*cda5da8dSAndroid Build Coastguard Worker
1601*cda5da8dSAndroid Build Coastguard Worker        def _communicate(self, input, endtime, orig_timeout):
1602*cda5da8dSAndroid Build Coastguard Worker            # Start reader threads feeding into a list hanging off of this
1603*cda5da8dSAndroid Build Coastguard Worker            # object, unless they've already been started.
1604*cda5da8dSAndroid Build Coastguard Worker            if self.stdout and not hasattr(self, "_stdout_buff"):
1605*cda5da8dSAndroid Build Coastguard Worker                self._stdout_buff = []
1606*cda5da8dSAndroid Build Coastguard Worker                self.stdout_thread = \
1607*cda5da8dSAndroid Build Coastguard Worker                        threading.Thread(target=self._readerthread,
1608*cda5da8dSAndroid Build Coastguard Worker                                         args=(self.stdout, self._stdout_buff))
1609*cda5da8dSAndroid Build Coastguard Worker                self.stdout_thread.daemon = True
1610*cda5da8dSAndroid Build Coastguard Worker                self.stdout_thread.start()
1611*cda5da8dSAndroid Build Coastguard Worker            if self.stderr and not hasattr(self, "_stderr_buff"):
1612*cda5da8dSAndroid Build Coastguard Worker                self._stderr_buff = []
1613*cda5da8dSAndroid Build Coastguard Worker                self.stderr_thread = \
1614*cda5da8dSAndroid Build Coastguard Worker                        threading.Thread(target=self._readerthread,
1615*cda5da8dSAndroid Build Coastguard Worker                                         args=(self.stderr, self._stderr_buff))
1616*cda5da8dSAndroid Build Coastguard Worker                self.stderr_thread.daemon = True
1617*cda5da8dSAndroid Build Coastguard Worker                self.stderr_thread.start()
1618*cda5da8dSAndroid Build Coastguard Worker
1619*cda5da8dSAndroid Build Coastguard Worker            if self.stdin:
1620*cda5da8dSAndroid Build Coastguard Worker                self._stdin_write(input)
1621*cda5da8dSAndroid Build Coastguard Worker
1622*cda5da8dSAndroid Build Coastguard Worker            # Wait for the reader threads, or time out.  If we time out, the
1623*cda5da8dSAndroid Build Coastguard Worker            # threads remain reading and the fds left open in case the user
1624*cda5da8dSAndroid Build Coastguard Worker            # calls communicate again.
1625*cda5da8dSAndroid Build Coastguard Worker            if self.stdout is not None:
1626*cda5da8dSAndroid Build Coastguard Worker                self.stdout_thread.join(self._remaining_time(endtime))
1627*cda5da8dSAndroid Build Coastguard Worker                if self.stdout_thread.is_alive():
1628*cda5da8dSAndroid Build Coastguard Worker                    raise TimeoutExpired(self.args, orig_timeout)
1629*cda5da8dSAndroid Build Coastguard Worker            if self.stderr is not None:
1630*cda5da8dSAndroid Build Coastguard Worker                self.stderr_thread.join(self._remaining_time(endtime))
1631*cda5da8dSAndroid Build Coastguard Worker                if self.stderr_thread.is_alive():
1632*cda5da8dSAndroid Build Coastguard Worker                    raise TimeoutExpired(self.args, orig_timeout)
1633*cda5da8dSAndroid Build Coastguard Worker
1634*cda5da8dSAndroid Build Coastguard Worker            # Collect the output from and close both pipes, now that we know
1635*cda5da8dSAndroid Build Coastguard Worker            # both have been read successfully.
1636*cda5da8dSAndroid Build Coastguard Worker            stdout = None
1637*cda5da8dSAndroid Build Coastguard Worker            stderr = None
1638*cda5da8dSAndroid Build Coastguard Worker            if self.stdout:
1639*cda5da8dSAndroid Build Coastguard Worker                stdout = self._stdout_buff
1640*cda5da8dSAndroid Build Coastguard Worker                self.stdout.close()
1641*cda5da8dSAndroid Build Coastguard Worker            if self.stderr:
1642*cda5da8dSAndroid Build Coastguard Worker                stderr = self._stderr_buff
1643*cda5da8dSAndroid Build Coastguard Worker                self.stderr.close()
1644*cda5da8dSAndroid Build Coastguard Worker
1645*cda5da8dSAndroid Build Coastguard Worker            # All data exchanged.  Translate lists into strings.
1646*cda5da8dSAndroid Build Coastguard Worker            stdout = stdout[0] if stdout else None
1647*cda5da8dSAndroid Build Coastguard Worker            stderr = stderr[0] if stderr else None
1648*cda5da8dSAndroid Build Coastguard Worker
1649*cda5da8dSAndroid Build Coastguard Worker            return (stdout, stderr)
1650*cda5da8dSAndroid Build Coastguard Worker
1651*cda5da8dSAndroid Build Coastguard Worker        def send_signal(self, sig):
1652*cda5da8dSAndroid Build Coastguard Worker            """Send a signal to the process."""
1653*cda5da8dSAndroid Build Coastguard Worker            # Don't signal a process that we know has already died.
1654*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is not None:
1655*cda5da8dSAndroid Build Coastguard Worker                return
1656*cda5da8dSAndroid Build Coastguard Worker            if sig == signal.SIGTERM:
1657*cda5da8dSAndroid Build Coastguard Worker                self.terminate()
1658*cda5da8dSAndroid Build Coastguard Worker            elif sig == signal.CTRL_C_EVENT:
1659*cda5da8dSAndroid Build Coastguard Worker                os.kill(self.pid, signal.CTRL_C_EVENT)
1660*cda5da8dSAndroid Build Coastguard Worker            elif sig == signal.CTRL_BREAK_EVENT:
1661*cda5da8dSAndroid Build Coastguard Worker                os.kill(self.pid, signal.CTRL_BREAK_EVENT)
1662*cda5da8dSAndroid Build Coastguard Worker            else:
1663*cda5da8dSAndroid Build Coastguard Worker                raise ValueError("Unsupported signal: {}".format(sig))
1664*cda5da8dSAndroid Build Coastguard Worker
1665*cda5da8dSAndroid Build Coastguard Worker        def terminate(self):
1666*cda5da8dSAndroid Build Coastguard Worker            """Terminates the process."""
1667*cda5da8dSAndroid Build Coastguard Worker            # Don't terminate a process that we know has already died.
1668*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is not None:
1669*cda5da8dSAndroid Build Coastguard Worker                return
1670*cda5da8dSAndroid Build Coastguard Worker            try:
1671*cda5da8dSAndroid Build Coastguard Worker                _winapi.TerminateProcess(self._handle, 1)
1672*cda5da8dSAndroid Build Coastguard Worker            except PermissionError:
1673*cda5da8dSAndroid Build Coastguard Worker                # ERROR_ACCESS_DENIED (winerror 5) is received when the
1674*cda5da8dSAndroid Build Coastguard Worker                # process already died.
1675*cda5da8dSAndroid Build Coastguard Worker                rc = _winapi.GetExitCodeProcess(self._handle)
1676*cda5da8dSAndroid Build Coastguard Worker                if rc == _winapi.STILL_ACTIVE:
1677*cda5da8dSAndroid Build Coastguard Worker                    raise
1678*cda5da8dSAndroid Build Coastguard Worker                self.returncode = rc
1679*cda5da8dSAndroid Build Coastguard Worker
1680*cda5da8dSAndroid Build Coastguard Worker        kill = terminate
1681*cda5da8dSAndroid Build Coastguard Worker
1682*cda5da8dSAndroid Build Coastguard Worker    else:
1683*cda5da8dSAndroid Build Coastguard Worker        #
1684*cda5da8dSAndroid Build Coastguard Worker        # POSIX methods
1685*cda5da8dSAndroid Build Coastguard Worker        #
1686*cda5da8dSAndroid Build Coastguard Worker        def _get_handles(self, stdin, stdout, stderr):
1687*cda5da8dSAndroid Build Coastguard Worker            """Construct and return tuple with IO objects:
1688*cda5da8dSAndroid Build Coastguard Worker            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
1689*cda5da8dSAndroid Build Coastguard Worker            """
1690*cda5da8dSAndroid Build Coastguard Worker            p2cread, p2cwrite = -1, -1
1691*cda5da8dSAndroid Build Coastguard Worker            c2pread, c2pwrite = -1, -1
1692*cda5da8dSAndroid Build Coastguard Worker            errread, errwrite = -1, -1
1693*cda5da8dSAndroid Build Coastguard Worker
1694*cda5da8dSAndroid Build Coastguard Worker            with self._on_error_fd_closer() as err_close_fds:
1695*cda5da8dSAndroid Build Coastguard Worker                if stdin is None:
1696*cda5da8dSAndroid Build Coastguard Worker                    pass
1697*cda5da8dSAndroid Build Coastguard Worker                elif stdin == PIPE:
1698*cda5da8dSAndroid Build Coastguard Worker                    p2cread, p2cwrite = os.pipe()
1699*cda5da8dSAndroid Build Coastguard Worker                    err_close_fds.extend((p2cread, p2cwrite))
1700*cda5da8dSAndroid Build Coastguard Worker                    if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1701*cda5da8dSAndroid Build Coastguard Worker                        fcntl.fcntl(p2cwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
1702*cda5da8dSAndroid Build Coastguard Worker                elif stdin == DEVNULL:
1703*cda5da8dSAndroid Build Coastguard Worker                    p2cread = self._get_devnull()
1704*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(stdin, int):
1705*cda5da8dSAndroid Build Coastguard Worker                    p2cread = stdin
1706*cda5da8dSAndroid Build Coastguard Worker                else:
1707*cda5da8dSAndroid Build Coastguard Worker                    # Assuming file-like object
1708*cda5da8dSAndroid Build Coastguard Worker                    p2cread = stdin.fileno()
1709*cda5da8dSAndroid Build Coastguard Worker
1710*cda5da8dSAndroid Build Coastguard Worker                if stdout is None:
1711*cda5da8dSAndroid Build Coastguard Worker                    pass
1712*cda5da8dSAndroid Build Coastguard Worker                elif stdout == PIPE:
1713*cda5da8dSAndroid Build Coastguard Worker                    c2pread, c2pwrite = os.pipe()
1714*cda5da8dSAndroid Build Coastguard Worker                    err_close_fds.extend((c2pread, c2pwrite))
1715*cda5da8dSAndroid Build Coastguard Worker                    if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1716*cda5da8dSAndroid Build Coastguard Worker                        fcntl.fcntl(c2pwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
1717*cda5da8dSAndroid Build Coastguard Worker                elif stdout == DEVNULL:
1718*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = self._get_devnull()
1719*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(stdout, int):
1720*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = stdout
1721*cda5da8dSAndroid Build Coastguard Worker                else:
1722*cda5da8dSAndroid Build Coastguard Worker                    # Assuming file-like object
1723*cda5da8dSAndroid Build Coastguard Worker                    c2pwrite = stdout.fileno()
1724*cda5da8dSAndroid Build Coastguard Worker
1725*cda5da8dSAndroid Build Coastguard Worker                if stderr is None:
1726*cda5da8dSAndroid Build Coastguard Worker                    pass
1727*cda5da8dSAndroid Build Coastguard Worker                elif stderr == PIPE:
1728*cda5da8dSAndroid Build Coastguard Worker                    errread, errwrite = os.pipe()
1729*cda5da8dSAndroid Build Coastguard Worker                    err_close_fds.extend((errread, errwrite))
1730*cda5da8dSAndroid Build Coastguard Worker                    if self.pipesize > 0 and hasattr(fcntl, "F_SETPIPE_SZ"):
1731*cda5da8dSAndroid Build Coastguard Worker                        fcntl.fcntl(errwrite, fcntl.F_SETPIPE_SZ, self.pipesize)
1732*cda5da8dSAndroid Build Coastguard Worker                elif stderr == STDOUT:
1733*cda5da8dSAndroid Build Coastguard Worker                    if c2pwrite != -1:
1734*cda5da8dSAndroid Build Coastguard Worker                        errwrite = c2pwrite
1735*cda5da8dSAndroid Build Coastguard Worker                    else: # child's stdout is not set, use parent's stdout
1736*cda5da8dSAndroid Build Coastguard Worker                        errwrite = sys.__stdout__.fileno()
1737*cda5da8dSAndroid Build Coastguard Worker                elif stderr == DEVNULL:
1738*cda5da8dSAndroid Build Coastguard Worker                    errwrite = self._get_devnull()
1739*cda5da8dSAndroid Build Coastguard Worker                elif isinstance(stderr, int):
1740*cda5da8dSAndroid Build Coastguard Worker                    errwrite = stderr
1741*cda5da8dSAndroid Build Coastguard Worker                else:
1742*cda5da8dSAndroid Build Coastguard Worker                    # Assuming file-like object
1743*cda5da8dSAndroid Build Coastguard Worker                    errwrite = stderr.fileno()
1744*cda5da8dSAndroid Build Coastguard Worker
1745*cda5da8dSAndroid Build Coastguard Worker            return (p2cread, p2cwrite,
1746*cda5da8dSAndroid Build Coastguard Worker                    c2pread, c2pwrite,
1747*cda5da8dSAndroid Build Coastguard Worker                    errread, errwrite)
1748*cda5da8dSAndroid Build Coastguard Worker
1749*cda5da8dSAndroid Build Coastguard Worker
1750*cda5da8dSAndroid Build Coastguard Worker        def _posix_spawn(self, args, executable, env, restore_signals,
1751*cda5da8dSAndroid Build Coastguard Worker                         p2cread, p2cwrite,
1752*cda5da8dSAndroid Build Coastguard Worker                         c2pread, c2pwrite,
1753*cda5da8dSAndroid Build Coastguard Worker                         errread, errwrite):
1754*cda5da8dSAndroid Build Coastguard Worker            """Execute program using os.posix_spawn()."""
1755*cda5da8dSAndroid Build Coastguard Worker            if env is None:
1756*cda5da8dSAndroid Build Coastguard Worker                env = os.environ
1757*cda5da8dSAndroid Build Coastguard Worker
1758*cda5da8dSAndroid Build Coastguard Worker            kwargs = {}
1759*cda5da8dSAndroid Build Coastguard Worker            if restore_signals:
1760*cda5da8dSAndroid Build Coastguard Worker                # See _Py_RestoreSignals() in Python/pylifecycle.c
1761*cda5da8dSAndroid Build Coastguard Worker                sigset = []
1762*cda5da8dSAndroid Build Coastguard Worker                for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
1763*cda5da8dSAndroid Build Coastguard Worker                    signum = getattr(signal, signame, None)
1764*cda5da8dSAndroid Build Coastguard Worker                    if signum is not None:
1765*cda5da8dSAndroid Build Coastguard Worker                        sigset.append(signum)
1766*cda5da8dSAndroid Build Coastguard Worker                kwargs['setsigdef'] = sigset
1767*cda5da8dSAndroid Build Coastguard Worker
1768*cda5da8dSAndroid Build Coastguard Worker            file_actions = []
1769*cda5da8dSAndroid Build Coastguard Worker            for fd in (p2cwrite, c2pread, errread):
1770*cda5da8dSAndroid Build Coastguard Worker                if fd != -1:
1771*cda5da8dSAndroid Build Coastguard Worker                    file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
1772*cda5da8dSAndroid Build Coastguard Worker            for fd, fd2 in (
1773*cda5da8dSAndroid Build Coastguard Worker                (p2cread, 0),
1774*cda5da8dSAndroid Build Coastguard Worker                (c2pwrite, 1),
1775*cda5da8dSAndroid Build Coastguard Worker                (errwrite, 2),
1776*cda5da8dSAndroid Build Coastguard Worker            ):
1777*cda5da8dSAndroid Build Coastguard Worker                if fd != -1:
1778*cda5da8dSAndroid Build Coastguard Worker                    file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
1779*cda5da8dSAndroid Build Coastguard Worker            if file_actions:
1780*cda5da8dSAndroid Build Coastguard Worker                kwargs['file_actions'] = file_actions
1781*cda5da8dSAndroid Build Coastguard Worker
1782*cda5da8dSAndroid Build Coastguard Worker            self.pid = os.posix_spawn(executable, args, env, **kwargs)
1783*cda5da8dSAndroid Build Coastguard Worker            self._child_created = True
1784*cda5da8dSAndroid Build Coastguard Worker
1785*cda5da8dSAndroid Build Coastguard Worker            self._close_pipe_fds(p2cread, p2cwrite,
1786*cda5da8dSAndroid Build Coastguard Worker                                 c2pread, c2pwrite,
1787*cda5da8dSAndroid Build Coastguard Worker                                 errread, errwrite)
1788*cda5da8dSAndroid Build Coastguard Worker
1789*cda5da8dSAndroid Build Coastguard Worker        def _execute_child(self, args, executable, preexec_fn, close_fds,
1790*cda5da8dSAndroid Build Coastguard Worker                           pass_fds, cwd, env,
1791*cda5da8dSAndroid Build Coastguard Worker                           startupinfo, creationflags, shell,
1792*cda5da8dSAndroid Build Coastguard Worker                           p2cread, p2cwrite,
1793*cda5da8dSAndroid Build Coastguard Worker                           c2pread, c2pwrite,
1794*cda5da8dSAndroid Build Coastguard Worker                           errread, errwrite,
1795*cda5da8dSAndroid Build Coastguard Worker                           restore_signals,
1796*cda5da8dSAndroid Build Coastguard Worker                           gid, gids, uid, umask,
1797*cda5da8dSAndroid Build Coastguard Worker                           start_new_session, process_group):
1798*cda5da8dSAndroid Build Coastguard Worker            """Execute program (POSIX version)"""
1799*cda5da8dSAndroid Build Coastguard Worker
1800*cda5da8dSAndroid Build Coastguard Worker            if isinstance(args, (str, bytes)):
1801*cda5da8dSAndroid Build Coastguard Worker                args = [args]
1802*cda5da8dSAndroid Build Coastguard Worker            elif isinstance(args, os.PathLike):
1803*cda5da8dSAndroid Build Coastguard Worker                if shell:
1804*cda5da8dSAndroid Build Coastguard Worker                    raise TypeError('path-like args is not allowed when '
1805*cda5da8dSAndroid Build Coastguard Worker                                    'shell is true')
1806*cda5da8dSAndroid Build Coastguard Worker                args = [args]
1807*cda5da8dSAndroid Build Coastguard Worker            else:
1808*cda5da8dSAndroid Build Coastguard Worker                args = list(args)
1809*cda5da8dSAndroid Build Coastguard Worker
1810*cda5da8dSAndroid Build Coastguard Worker            if shell:
1811*cda5da8dSAndroid Build Coastguard Worker                # On Android the default shell is at '/system/bin/sh'.
1812*cda5da8dSAndroid Build Coastguard Worker                unix_shell = ('/system/bin/sh' if
1813*cda5da8dSAndroid Build Coastguard Worker                          hasattr(sys, 'getandroidapilevel') else '/bin/sh')
1814*cda5da8dSAndroid Build Coastguard Worker                args = [unix_shell, "-c"] + args
1815*cda5da8dSAndroid Build Coastguard Worker                if executable:
1816*cda5da8dSAndroid Build Coastguard Worker                    args[0] = executable
1817*cda5da8dSAndroid Build Coastguard Worker
1818*cda5da8dSAndroid Build Coastguard Worker            if executable is None:
1819*cda5da8dSAndroid Build Coastguard Worker                executable = args[0]
1820*cda5da8dSAndroid Build Coastguard Worker
1821*cda5da8dSAndroid Build Coastguard Worker            sys.audit("subprocess.Popen", executable, args, cwd, env)
1822*cda5da8dSAndroid Build Coastguard Worker
1823*cda5da8dSAndroid Build Coastguard Worker            if (_USE_POSIX_SPAWN
1824*cda5da8dSAndroid Build Coastguard Worker                    and os.path.dirname(executable)
1825*cda5da8dSAndroid Build Coastguard Worker                    and preexec_fn is None
1826*cda5da8dSAndroid Build Coastguard Worker                    and not close_fds
1827*cda5da8dSAndroid Build Coastguard Worker                    and not pass_fds
1828*cda5da8dSAndroid Build Coastguard Worker                    and cwd is None
1829*cda5da8dSAndroid Build Coastguard Worker                    and (p2cread == -1 or p2cread > 2)
1830*cda5da8dSAndroid Build Coastguard Worker                    and (c2pwrite == -1 or c2pwrite > 2)
1831*cda5da8dSAndroid Build Coastguard Worker                    and (errwrite == -1 or errwrite > 2)
1832*cda5da8dSAndroid Build Coastguard Worker                    and not start_new_session
1833*cda5da8dSAndroid Build Coastguard Worker                    and process_group == -1
1834*cda5da8dSAndroid Build Coastguard Worker                    and gid is None
1835*cda5da8dSAndroid Build Coastguard Worker                    and gids is None
1836*cda5da8dSAndroid Build Coastguard Worker                    and uid is None
1837*cda5da8dSAndroid Build Coastguard Worker                    and umask < 0):
1838*cda5da8dSAndroid Build Coastguard Worker                self._posix_spawn(args, executable, env, restore_signals,
1839*cda5da8dSAndroid Build Coastguard Worker                                  p2cread, p2cwrite,
1840*cda5da8dSAndroid Build Coastguard Worker                                  c2pread, c2pwrite,
1841*cda5da8dSAndroid Build Coastguard Worker                                  errread, errwrite)
1842*cda5da8dSAndroid Build Coastguard Worker                return
1843*cda5da8dSAndroid Build Coastguard Worker
1844*cda5da8dSAndroid Build Coastguard Worker            orig_executable = executable
1845*cda5da8dSAndroid Build Coastguard Worker
1846*cda5da8dSAndroid Build Coastguard Worker            # For transferring possible exec failure from child to parent.
1847*cda5da8dSAndroid Build Coastguard Worker            # Data format: "exception name:hex errno:description"
1848*cda5da8dSAndroid Build Coastguard Worker            # Pickle is not used; it is complex and involves memory allocation.
1849*cda5da8dSAndroid Build Coastguard Worker            errpipe_read, errpipe_write = os.pipe()
1850*cda5da8dSAndroid Build Coastguard Worker            # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
1851*cda5da8dSAndroid Build Coastguard Worker            low_fds_to_close = []
1852*cda5da8dSAndroid Build Coastguard Worker            while errpipe_write < 3:
1853*cda5da8dSAndroid Build Coastguard Worker                low_fds_to_close.append(errpipe_write)
1854*cda5da8dSAndroid Build Coastguard Worker                errpipe_write = os.dup(errpipe_write)
1855*cda5da8dSAndroid Build Coastguard Worker            for low_fd in low_fds_to_close:
1856*cda5da8dSAndroid Build Coastguard Worker                os.close(low_fd)
1857*cda5da8dSAndroid Build Coastguard Worker            try:
1858*cda5da8dSAndroid Build Coastguard Worker                try:
1859*cda5da8dSAndroid Build Coastguard Worker                    # We must avoid complex work that could involve
1860*cda5da8dSAndroid Build Coastguard Worker                    # malloc or free in the child process to avoid
1861*cda5da8dSAndroid Build Coastguard Worker                    # potential deadlocks, thus we do all this here.
1862*cda5da8dSAndroid Build Coastguard Worker                    # and pass it to fork_exec()
1863*cda5da8dSAndroid Build Coastguard Worker
1864*cda5da8dSAndroid Build Coastguard Worker                    if env is not None:
1865*cda5da8dSAndroid Build Coastguard Worker                        env_list = []
1866*cda5da8dSAndroid Build Coastguard Worker                        for k, v in env.items():
1867*cda5da8dSAndroid Build Coastguard Worker                            k = os.fsencode(k)
1868*cda5da8dSAndroid Build Coastguard Worker                            if b'=' in k:
1869*cda5da8dSAndroid Build Coastguard Worker                                raise ValueError("illegal environment variable name")
1870*cda5da8dSAndroid Build Coastguard Worker                            env_list.append(k + b'=' + os.fsencode(v))
1871*cda5da8dSAndroid Build Coastguard Worker                    else:
1872*cda5da8dSAndroid Build Coastguard Worker                        env_list = None  # Use execv instead of execve.
1873*cda5da8dSAndroid Build Coastguard Worker                    executable = os.fsencode(executable)
1874*cda5da8dSAndroid Build Coastguard Worker                    if os.path.dirname(executable):
1875*cda5da8dSAndroid Build Coastguard Worker                        executable_list = (executable,)
1876*cda5da8dSAndroid Build Coastguard Worker                    else:
1877*cda5da8dSAndroid Build Coastguard Worker                        # This matches the behavior of os._execvpe().
1878*cda5da8dSAndroid Build Coastguard Worker                        executable_list = tuple(
1879*cda5da8dSAndroid Build Coastguard Worker                            os.path.join(os.fsencode(dir), executable)
1880*cda5da8dSAndroid Build Coastguard Worker                            for dir in os.get_exec_path(env))
1881*cda5da8dSAndroid Build Coastguard Worker                    fds_to_keep = set(pass_fds)
1882*cda5da8dSAndroid Build Coastguard Worker                    fds_to_keep.add(errpipe_write)
1883*cda5da8dSAndroid Build Coastguard Worker                    self.pid = _fork_exec(
1884*cda5da8dSAndroid Build Coastguard Worker                            args, executable_list,
1885*cda5da8dSAndroid Build Coastguard Worker                            close_fds, tuple(sorted(map(int, fds_to_keep))),
1886*cda5da8dSAndroid Build Coastguard Worker                            cwd, env_list,
1887*cda5da8dSAndroid Build Coastguard Worker                            p2cread, p2cwrite, c2pread, c2pwrite,
1888*cda5da8dSAndroid Build Coastguard Worker                            errread, errwrite,
1889*cda5da8dSAndroid Build Coastguard Worker                            errpipe_read, errpipe_write,
1890*cda5da8dSAndroid Build Coastguard Worker                            restore_signals, start_new_session,
1891*cda5da8dSAndroid Build Coastguard Worker                            process_group, gid, gids, uid, umask,
1892*cda5da8dSAndroid Build Coastguard Worker                            preexec_fn, _USE_VFORK)
1893*cda5da8dSAndroid Build Coastguard Worker                    self._child_created = True
1894*cda5da8dSAndroid Build Coastguard Worker                finally:
1895*cda5da8dSAndroid Build Coastguard Worker                    # be sure the FD is closed no matter what
1896*cda5da8dSAndroid Build Coastguard Worker                    os.close(errpipe_write)
1897*cda5da8dSAndroid Build Coastguard Worker
1898*cda5da8dSAndroid Build Coastguard Worker                self._close_pipe_fds(p2cread, p2cwrite,
1899*cda5da8dSAndroid Build Coastguard Worker                                     c2pread, c2pwrite,
1900*cda5da8dSAndroid Build Coastguard Worker                                     errread, errwrite)
1901*cda5da8dSAndroid Build Coastguard Worker
1902*cda5da8dSAndroid Build Coastguard Worker                # Wait for exec to fail or succeed; possibly raising an
1903*cda5da8dSAndroid Build Coastguard Worker                # exception (limited in size)
1904*cda5da8dSAndroid Build Coastguard Worker                errpipe_data = bytearray()
1905*cda5da8dSAndroid Build Coastguard Worker                while True:
1906*cda5da8dSAndroid Build Coastguard Worker                    part = os.read(errpipe_read, 50000)
1907*cda5da8dSAndroid Build Coastguard Worker                    errpipe_data += part
1908*cda5da8dSAndroid Build Coastguard Worker                    if not part or len(errpipe_data) > 50000:
1909*cda5da8dSAndroid Build Coastguard Worker                        break
1910*cda5da8dSAndroid Build Coastguard Worker            finally:
1911*cda5da8dSAndroid Build Coastguard Worker                # be sure the FD is closed no matter what
1912*cda5da8dSAndroid Build Coastguard Worker                os.close(errpipe_read)
1913*cda5da8dSAndroid Build Coastguard Worker
1914*cda5da8dSAndroid Build Coastguard Worker            if errpipe_data:
1915*cda5da8dSAndroid Build Coastguard Worker                try:
1916*cda5da8dSAndroid Build Coastguard Worker                    pid, sts = os.waitpid(self.pid, 0)
1917*cda5da8dSAndroid Build Coastguard Worker                    if pid == self.pid:
1918*cda5da8dSAndroid Build Coastguard Worker                        self._handle_exitstatus(sts)
1919*cda5da8dSAndroid Build Coastguard Worker                    else:
1920*cda5da8dSAndroid Build Coastguard Worker                        self.returncode = sys.maxsize
1921*cda5da8dSAndroid Build Coastguard Worker                except ChildProcessError:
1922*cda5da8dSAndroid Build Coastguard Worker                    pass
1923*cda5da8dSAndroid Build Coastguard Worker
1924*cda5da8dSAndroid Build Coastguard Worker                try:
1925*cda5da8dSAndroid Build Coastguard Worker                    exception_name, hex_errno, err_msg = (
1926*cda5da8dSAndroid Build Coastguard Worker                            errpipe_data.split(b':', 2))
1927*cda5da8dSAndroid Build Coastguard Worker                    # The encoding here should match the encoding
1928*cda5da8dSAndroid Build Coastguard Worker                    # written in by the subprocess implementations
1929*cda5da8dSAndroid Build Coastguard Worker                    # like _posixsubprocess
1930*cda5da8dSAndroid Build Coastguard Worker                    err_msg = err_msg.decode()
1931*cda5da8dSAndroid Build Coastguard Worker                except ValueError:
1932*cda5da8dSAndroid Build Coastguard Worker                    exception_name = b'SubprocessError'
1933*cda5da8dSAndroid Build Coastguard Worker                    hex_errno = b'0'
1934*cda5da8dSAndroid Build Coastguard Worker                    err_msg = 'Bad exception data from child: {!r}'.format(
1935*cda5da8dSAndroid Build Coastguard Worker                                  bytes(errpipe_data))
1936*cda5da8dSAndroid Build Coastguard Worker                child_exception_type = getattr(
1937*cda5da8dSAndroid Build Coastguard Worker                        builtins, exception_name.decode('ascii'),
1938*cda5da8dSAndroid Build Coastguard Worker                        SubprocessError)
1939*cda5da8dSAndroid Build Coastguard Worker                if issubclass(child_exception_type, OSError) and hex_errno:
1940*cda5da8dSAndroid Build Coastguard Worker                    errno_num = int(hex_errno, 16)
1941*cda5da8dSAndroid Build Coastguard Worker                    child_exec_never_called = (err_msg == "noexec")
1942*cda5da8dSAndroid Build Coastguard Worker                    if child_exec_never_called:
1943*cda5da8dSAndroid Build Coastguard Worker                        err_msg = ""
1944*cda5da8dSAndroid Build Coastguard Worker                        # The error must be from chdir(cwd).
1945*cda5da8dSAndroid Build Coastguard Worker                        err_filename = cwd
1946*cda5da8dSAndroid Build Coastguard Worker                    else:
1947*cda5da8dSAndroid Build Coastguard Worker                        err_filename = orig_executable
1948*cda5da8dSAndroid Build Coastguard Worker                    if errno_num != 0:
1949*cda5da8dSAndroid Build Coastguard Worker                        err_msg = os.strerror(errno_num)
1950*cda5da8dSAndroid Build Coastguard Worker                    raise child_exception_type(errno_num, err_msg, err_filename)
1951*cda5da8dSAndroid Build Coastguard Worker                raise child_exception_type(err_msg)
1952*cda5da8dSAndroid Build Coastguard Worker
1953*cda5da8dSAndroid Build Coastguard Worker
1954*cda5da8dSAndroid Build Coastguard Worker        def _handle_exitstatus(self, sts,
1955*cda5da8dSAndroid Build Coastguard Worker                               _waitstatus_to_exitcode=_waitstatus_to_exitcode,
1956*cda5da8dSAndroid Build Coastguard Worker                               _WIFSTOPPED=_WIFSTOPPED,
1957*cda5da8dSAndroid Build Coastguard Worker                               _WSTOPSIG=_WSTOPSIG):
1958*cda5da8dSAndroid Build Coastguard Worker            """All callers to this function MUST hold self._waitpid_lock."""
1959*cda5da8dSAndroid Build Coastguard Worker            # This method is called (indirectly) by __del__, so it cannot
1960*cda5da8dSAndroid Build Coastguard Worker            # refer to anything outside of its local scope.
1961*cda5da8dSAndroid Build Coastguard Worker            if _WIFSTOPPED(sts):
1962*cda5da8dSAndroid Build Coastguard Worker                self.returncode = -_WSTOPSIG(sts)
1963*cda5da8dSAndroid Build Coastguard Worker            else:
1964*cda5da8dSAndroid Build Coastguard Worker                self.returncode = _waitstatus_to_exitcode(sts)
1965*cda5da8dSAndroid Build Coastguard Worker
1966*cda5da8dSAndroid Build Coastguard Worker        def _internal_poll(self, _deadstate=None, _waitpid=_waitpid,
1967*cda5da8dSAndroid Build Coastguard Worker                _WNOHANG=_WNOHANG, _ECHILD=errno.ECHILD):
1968*cda5da8dSAndroid Build Coastguard Worker            """Check if child process has terminated.  Returns returncode
1969*cda5da8dSAndroid Build Coastguard Worker            attribute.
1970*cda5da8dSAndroid Build Coastguard Worker
1971*cda5da8dSAndroid Build Coastguard Worker            This method is called by __del__, so it cannot reference anything
1972*cda5da8dSAndroid Build Coastguard Worker            outside of the local scope (nor can any methods it calls).
1973*cda5da8dSAndroid Build Coastguard Worker
1974*cda5da8dSAndroid Build Coastguard Worker            """
1975*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is None:
1976*cda5da8dSAndroid Build Coastguard Worker                if not self._waitpid_lock.acquire(False):
1977*cda5da8dSAndroid Build Coastguard Worker                    # Something else is busy calling waitpid.  Don't allow two
1978*cda5da8dSAndroid Build Coastguard Worker                    # at once.  We know nothing yet.
1979*cda5da8dSAndroid Build Coastguard Worker                    return None
1980*cda5da8dSAndroid Build Coastguard Worker                try:
1981*cda5da8dSAndroid Build Coastguard Worker                    if self.returncode is not None:
1982*cda5da8dSAndroid Build Coastguard Worker                        return self.returncode  # Another thread waited.
1983*cda5da8dSAndroid Build Coastguard Worker                    pid, sts = _waitpid(self.pid, _WNOHANG)
1984*cda5da8dSAndroid Build Coastguard Worker                    if pid == self.pid:
1985*cda5da8dSAndroid Build Coastguard Worker                        self._handle_exitstatus(sts)
1986*cda5da8dSAndroid Build Coastguard Worker                except OSError as e:
1987*cda5da8dSAndroid Build Coastguard Worker                    if _deadstate is not None:
1988*cda5da8dSAndroid Build Coastguard Worker                        self.returncode = _deadstate
1989*cda5da8dSAndroid Build Coastguard Worker                    elif e.errno == _ECHILD:
1990*cda5da8dSAndroid Build Coastguard Worker                        # This happens if SIGCLD is set to be ignored or
1991*cda5da8dSAndroid Build Coastguard Worker                        # waiting for child processes has otherwise been
1992*cda5da8dSAndroid Build Coastguard Worker                        # disabled for our process.  This child is dead, we
1993*cda5da8dSAndroid Build Coastguard Worker                        # can't get the status.
1994*cda5da8dSAndroid Build Coastguard Worker                        # http://bugs.python.org/issue15756
1995*cda5da8dSAndroid Build Coastguard Worker                        self.returncode = 0
1996*cda5da8dSAndroid Build Coastguard Worker                finally:
1997*cda5da8dSAndroid Build Coastguard Worker                    self._waitpid_lock.release()
1998*cda5da8dSAndroid Build Coastguard Worker            return self.returncode
1999*cda5da8dSAndroid Build Coastguard Worker
2000*cda5da8dSAndroid Build Coastguard Worker
2001*cda5da8dSAndroid Build Coastguard Worker        def _try_wait(self, wait_flags):
2002*cda5da8dSAndroid Build Coastguard Worker            """All callers to this function MUST hold self._waitpid_lock."""
2003*cda5da8dSAndroid Build Coastguard Worker            try:
2004*cda5da8dSAndroid Build Coastguard Worker                (pid, sts) = os.waitpid(self.pid, wait_flags)
2005*cda5da8dSAndroid Build Coastguard Worker            except ChildProcessError:
2006*cda5da8dSAndroid Build Coastguard Worker                # This happens if SIGCLD is set to be ignored or waiting
2007*cda5da8dSAndroid Build Coastguard Worker                # for child processes has otherwise been disabled for our
2008*cda5da8dSAndroid Build Coastguard Worker                # process.  This child is dead, we can't get the status.
2009*cda5da8dSAndroid Build Coastguard Worker                pid = self.pid
2010*cda5da8dSAndroid Build Coastguard Worker                sts = 0
2011*cda5da8dSAndroid Build Coastguard Worker            return (pid, sts)
2012*cda5da8dSAndroid Build Coastguard Worker
2013*cda5da8dSAndroid Build Coastguard Worker
2014*cda5da8dSAndroid Build Coastguard Worker        def _wait(self, timeout):
2015*cda5da8dSAndroid Build Coastguard Worker            """Internal implementation of wait() on POSIX."""
2016*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is not None:
2017*cda5da8dSAndroid Build Coastguard Worker                return self.returncode
2018*cda5da8dSAndroid Build Coastguard Worker
2019*cda5da8dSAndroid Build Coastguard Worker            if timeout is not None:
2020*cda5da8dSAndroid Build Coastguard Worker                endtime = _time() + timeout
2021*cda5da8dSAndroid Build Coastguard Worker                # Enter a busy loop if we have a timeout.  This busy loop was
2022*cda5da8dSAndroid Build Coastguard Worker                # cribbed from Lib/threading.py in Thread.wait() at r71065.
2023*cda5da8dSAndroid Build Coastguard Worker                delay = 0.0005 # 500 us -> initial delay of 1 ms
2024*cda5da8dSAndroid Build Coastguard Worker                while True:
2025*cda5da8dSAndroid Build Coastguard Worker                    if self._waitpid_lock.acquire(False):
2026*cda5da8dSAndroid Build Coastguard Worker                        try:
2027*cda5da8dSAndroid Build Coastguard Worker                            if self.returncode is not None:
2028*cda5da8dSAndroid Build Coastguard Worker                                break  # Another thread waited.
2029*cda5da8dSAndroid Build Coastguard Worker                            (pid, sts) = self._try_wait(os.WNOHANG)
2030*cda5da8dSAndroid Build Coastguard Worker                            assert pid == self.pid or pid == 0
2031*cda5da8dSAndroid Build Coastguard Worker                            if pid == self.pid:
2032*cda5da8dSAndroid Build Coastguard Worker                                self._handle_exitstatus(sts)
2033*cda5da8dSAndroid Build Coastguard Worker                                break
2034*cda5da8dSAndroid Build Coastguard Worker                        finally:
2035*cda5da8dSAndroid Build Coastguard Worker                            self._waitpid_lock.release()
2036*cda5da8dSAndroid Build Coastguard Worker                    remaining = self._remaining_time(endtime)
2037*cda5da8dSAndroid Build Coastguard Worker                    if remaining <= 0:
2038*cda5da8dSAndroid Build Coastguard Worker                        raise TimeoutExpired(self.args, timeout)
2039*cda5da8dSAndroid Build Coastguard Worker                    delay = min(delay * 2, remaining, .05)
2040*cda5da8dSAndroid Build Coastguard Worker                    time.sleep(delay)
2041*cda5da8dSAndroid Build Coastguard Worker            else:
2042*cda5da8dSAndroid Build Coastguard Worker                while self.returncode is None:
2043*cda5da8dSAndroid Build Coastguard Worker                    with self._waitpid_lock:
2044*cda5da8dSAndroid Build Coastguard Worker                        if self.returncode is not None:
2045*cda5da8dSAndroid Build Coastguard Worker                            break  # Another thread waited.
2046*cda5da8dSAndroid Build Coastguard Worker                        (pid, sts) = self._try_wait(0)
2047*cda5da8dSAndroid Build Coastguard Worker                        # Check the pid and loop as waitpid has been known to
2048*cda5da8dSAndroid Build Coastguard Worker                        # return 0 even without WNOHANG in odd situations.
2049*cda5da8dSAndroid Build Coastguard Worker                        # http://bugs.python.org/issue14396.
2050*cda5da8dSAndroid Build Coastguard Worker                        if pid == self.pid:
2051*cda5da8dSAndroid Build Coastguard Worker                            self._handle_exitstatus(sts)
2052*cda5da8dSAndroid Build Coastguard Worker            return self.returncode
2053*cda5da8dSAndroid Build Coastguard Worker
2054*cda5da8dSAndroid Build Coastguard Worker
2055*cda5da8dSAndroid Build Coastguard Worker        def _communicate(self, input, endtime, orig_timeout):
2056*cda5da8dSAndroid Build Coastguard Worker            if self.stdin and not self._communication_started:
2057*cda5da8dSAndroid Build Coastguard Worker                # Flush stdio buffer.  This might block, if the user has
2058*cda5da8dSAndroid Build Coastguard Worker                # been writing to .stdin in an uncontrolled fashion.
2059*cda5da8dSAndroid Build Coastguard Worker                try:
2060*cda5da8dSAndroid Build Coastguard Worker                    self.stdin.flush()
2061*cda5da8dSAndroid Build Coastguard Worker                except BrokenPipeError:
2062*cda5da8dSAndroid Build Coastguard Worker                    pass  # communicate() must ignore BrokenPipeError.
2063*cda5da8dSAndroid Build Coastguard Worker                if not input:
2064*cda5da8dSAndroid Build Coastguard Worker                    try:
2065*cda5da8dSAndroid Build Coastguard Worker                        self.stdin.close()
2066*cda5da8dSAndroid Build Coastguard Worker                    except BrokenPipeError:
2067*cda5da8dSAndroid Build Coastguard Worker                        pass  # communicate() must ignore BrokenPipeError.
2068*cda5da8dSAndroid Build Coastguard Worker
2069*cda5da8dSAndroid Build Coastguard Worker            stdout = None
2070*cda5da8dSAndroid Build Coastguard Worker            stderr = None
2071*cda5da8dSAndroid Build Coastguard Worker
2072*cda5da8dSAndroid Build Coastguard Worker            # Only create this mapping if we haven't already.
2073*cda5da8dSAndroid Build Coastguard Worker            if not self._communication_started:
2074*cda5da8dSAndroid Build Coastguard Worker                self._fileobj2output = {}
2075*cda5da8dSAndroid Build Coastguard Worker                if self.stdout:
2076*cda5da8dSAndroid Build Coastguard Worker                    self._fileobj2output[self.stdout] = []
2077*cda5da8dSAndroid Build Coastguard Worker                if self.stderr:
2078*cda5da8dSAndroid Build Coastguard Worker                    self._fileobj2output[self.stderr] = []
2079*cda5da8dSAndroid Build Coastguard Worker
2080*cda5da8dSAndroid Build Coastguard Worker            if self.stdout:
2081*cda5da8dSAndroid Build Coastguard Worker                stdout = self._fileobj2output[self.stdout]
2082*cda5da8dSAndroid Build Coastguard Worker            if self.stderr:
2083*cda5da8dSAndroid Build Coastguard Worker                stderr = self._fileobj2output[self.stderr]
2084*cda5da8dSAndroid Build Coastguard Worker
2085*cda5da8dSAndroid Build Coastguard Worker            self._save_input(input)
2086*cda5da8dSAndroid Build Coastguard Worker
2087*cda5da8dSAndroid Build Coastguard Worker            if self._input:
2088*cda5da8dSAndroid Build Coastguard Worker                input_view = memoryview(self._input)
2089*cda5da8dSAndroid Build Coastguard Worker
2090*cda5da8dSAndroid Build Coastguard Worker            with _PopenSelector() as selector:
2091*cda5da8dSAndroid Build Coastguard Worker                if self.stdin and input:
2092*cda5da8dSAndroid Build Coastguard Worker                    selector.register(self.stdin, selectors.EVENT_WRITE)
2093*cda5da8dSAndroid Build Coastguard Worker                if self.stdout and not self.stdout.closed:
2094*cda5da8dSAndroid Build Coastguard Worker                    selector.register(self.stdout, selectors.EVENT_READ)
2095*cda5da8dSAndroid Build Coastguard Worker                if self.stderr and not self.stderr.closed:
2096*cda5da8dSAndroid Build Coastguard Worker                    selector.register(self.stderr, selectors.EVENT_READ)
2097*cda5da8dSAndroid Build Coastguard Worker
2098*cda5da8dSAndroid Build Coastguard Worker                while selector.get_map():
2099*cda5da8dSAndroid Build Coastguard Worker                    timeout = self._remaining_time(endtime)
2100*cda5da8dSAndroid Build Coastguard Worker                    if timeout is not None and timeout < 0:
2101*cda5da8dSAndroid Build Coastguard Worker                        self._check_timeout(endtime, orig_timeout,
2102*cda5da8dSAndroid Build Coastguard Worker                                            stdout, stderr,
2103*cda5da8dSAndroid Build Coastguard Worker                                            skip_check_and_raise=True)
2104*cda5da8dSAndroid Build Coastguard Worker                        raise RuntimeError(  # Impossible :)
2105*cda5da8dSAndroid Build Coastguard Worker                            '_check_timeout(..., skip_check_and_raise=True) '
2106*cda5da8dSAndroid Build Coastguard Worker                            'failed to raise TimeoutExpired.')
2107*cda5da8dSAndroid Build Coastguard Worker
2108*cda5da8dSAndroid Build Coastguard Worker                    ready = selector.select(timeout)
2109*cda5da8dSAndroid Build Coastguard Worker                    self._check_timeout(endtime, orig_timeout, stdout, stderr)
2110*cda5da8dSAndroid Build Coastguard Worker
2111*cda5da8dSAndroid Build Coastguard Worker                    # XXX Rewrite these to use non-blocking I/O on the file
2112*cda5da8dSAndroid Build Coastguard Worker                    # objects; they are no longer using C stdio!
2113*cda5da8dSAndroid Build Coastguard Worker
2114*cda5da8dSAndroid Build Coastguard Worker                    for key, events in ready:
2115*cda5da8dSAndroid Build Coastguard Worker                        if key.fileobj is self.stdin:
2116*cda5da8dSAndroid Build Coastguard Worker                            chunk = input_view[self._input_offset :
2117*cda5da8dSAndroid Build Coastguard Worker                                               self._input_offset + _PIPE_BUF]
2118*cda5da8dSAndroid Build Coastguard Worker                            try:
2119*cda5da8dSAndroid Build Coastguard Worker                                self._input_offset += os.write(key.fd, chunk)
2120*cda5da8dSAndroid Build Coastguard Worker                            except BrokenPipeError:
2121*cda5da8dSAndroid Build Coastguard Worker                                selector.unregister(key.fileobj)
2122*cda5da8dSAndroid Build Coastguard Worker                                key.fileobj.close()
2123*cda5da8dSAndroid Build Coastguard Worker                            else:
2124*cda5da8dSAndroid Build Coastguard Worker                                if self._input_offset >= len(self._input):
2125*cda5da8dSAndroid Build Coastguard Worker                                    selector.unregister(key.fileobj)
2126*cda5da8dSAndroid Build Coastguard Worker                                    key.fileobj.close()
2127*cda5da8dSAndroid Build Coastguard Worker                        elif key.fileobj in (self.stdout, self.stderr):
2128*cda5da8dSAndroid Build Coastguard Worker                            data = os.read(key.fd, 32768)
2129*cda5da8dSAndroid Build Coastguard Worker                            if not data:
2130*cda5da8dSAndroid Build Coastguard Worker                                selector.unregister(key.fileobj)
2131*cda5da8dSAndroid Build Coastguard Worker                                key.fileobj.close()
2132*cda5da8dSAndroid Build Coastguard Worker                            self._fileobj2output[key.fileobj].append(data)
2133*cda5da8dSAndroid Build Coastguard Worker
2134*cda5da8dSAndroid Build Coastguard Worker            self.wait(timeout=self._remaining_time(endtime))
2135*cda5da8dSAndroid Build Coastguard Worker
2136*cda5da8dSAndroid Build Coastguard Worker            # All data exchanged.  Translate lists into strings.
2137*cda5da8dSAndroid Build Coastguard Worker            if stdout is not None:
2138*cda5da8dSAndroid Build Coastguard Worker                stdout = b''.join(stdout)
2139*cda5da8dSAndroid Build Coastguard Worker            if stderr is not None:
2140*cda5da8dSAndroid Build Coastguard Worker                stderr = b''.join(stderr)
2141*cda5da8dSAndroid Build Coastguard Worker
2142*cda5da8dSAndroid Build Coastguard Worker            # Translate newlines, if requested.
2143*cda5da8dSAndroid Build Coastguard Worker            # This also turns bytes into strings.
2144*cda5da8dSAndroid Build Coastguard Worker            if self.text_mode:
2145*cda5da8dSAndroid Build Coastguard Worker                if stdout is not None:
2146*cda5da8dSAndroid Build Coastguard Worker                    stdout = self._translate_newlines(stdout,
2147*cda5da8dSAndroid Build Coastguard Worker                                                      self.stdout.encoding,
2148*cda5da8dSAndroid Build Coastguard Worker                                                      self.stdout.errors)
2149*cda5da8dSAndroid Build Coastguard Worker                if stderr is not None:
2150*cda5da8dSAndroid Build Coastguard Worker                    stderr = self._translate_newlines(stderr,
2151*cda5da8dSAndroid Build Coastguard Worker                                                      self.stderr.encoding,
2152*cda5da8dSAndroid Build Coastguard Worker                                                      self.stderr.errors)
2153*cda5da8dSAndroid Build Coastguard Worker
2154*cda5da8dSAndroid Build Coastguard Worker            return (stdout, stderr)
2155*cda5da8dSAndroid Build Coastguard Worker
2156*cda5da8dSAndroid Build Coastguard Worker
2157*cda5da8dSAndroid Build Coastguard Worker        def _save_input(self, input):
2158*cda5da8dSAndroid Build Coastguard Worker            # This method is called from the _communicate_with_*() methods
2159*cda5da8dSAndroid Build Coastguard Worker            # so that if we time out while communicating, we can continue
2160*cda5da8dSAndroid Build Coastguard Worker            # sending input if we retry.
2161*cda5da8dSAndroid Build Coastguard Worker            if self.stdin and self._input is None:
2162*cda5da8dSAndroid Build Coastguard Worker                self._input_offset = 0
2163*cda5da8dSAndroid Build Coastguard Worker                self._input = input
2164*cda5da8dSAndroid Build Coastguard Worker                if input is not None and self.text_mode:
2165*cda5da8dSAndroid Build Coastguard Worker                    self._input = self._input.encode(self.stdin.encoding,
2166*cda5da8dSAndroid Build Coastguard Worker                                                     self.stdin.errors)
2167*cda5da8dSAndroid Build Coastguard Worker
2168*cda5da8dSAndroid Build Coastguard Worker
2169*cda5da8dSAndroid Build Coastguard Worker        def send_signal(self, sig):
2170*cda5da8dSAndroid Build Coastguard Worker            """Send a signal to the process."""
2171*cda5da8dSAndroid Build Coastguard Worker            # bpo-38630: Polling reduces the risk of sending a signal to the
2172*cda5da8dSAndroid Build Coastguard Worker            # wrong process if the process completed, the Popen.returncode
2173*cda5da8dSAndroid Build Coastguard Worker            # attribute is still None, and the pid has been reassigned
2174*cda5da8dSAndroid Build Coastguard Worker            # (recycled) to a new different process. This race condition can
2175*cda5da8dSAndroid Build Coastguard Worker            # happens in two cases.
2176*cda5da8dSAndroid Build Coastguard Worker            #
2177*cda5da8dSAndroid Build Coastguard Worker            # Case 1. Thread A calls Popen.poll(), thread B calls
2178*cda5da8dSAndroid Build Coastguard Worker            # Popen.send_signal(). In thread A, waitpid() succeed and returns
2179*cda5da8dSAndroid Build Coastguard Worker            # the exit status. Thread B calls kill() because poll() in thread A
2180*cda5da8dSAndroid Build Coastguard Worker            # did not set returncode yet. Calling poll() in thread B prevents
2181*cda5da8dSAndroid Build Coastguard Worker            # the race condition thanks to Popen._waitpid_lock.
2182*cda5da8dSAndroid Build Coastguard Worker            #
2183*cda5da8dSAndroid Build Coastguard Worker            # Case 2. waitpid(pid, 0) has been called directly, without
2184*cda5da8dSAndroid Build Coastguard Worker            # using Popen methods: returncode is still None is this case.
2185*cda5da8dSAndroid Build Coastguard Worker            # Calling Popen.poll() will set returncode to a default value,
2186*cda5da8dSAndroid Build Coastguard Worker            # since waitpid() fails with ProcessLookupError.
2187*cda5da8dSAndroid Build Coastguard Worker            self.poll()
2188*cda5da8dSAndroid Build Coastguard Worker            if self.returncode is not None:
2189*cda5da8dSAndroid Build Coastguard Worker                # Skip signalling a process that we know has already died.
2190*cda5da8dSAndroid Build Coastguard Worker                return
2191*cda5da8dSAndroid Build Coastguard Worker
2192*cda5da8dSAndroid Build Coastguard Worker            # The race condition can still happen if the race condition
2193*cda5da8dSAndroid Build Coastguard Worker            # described above happens between the returncode test
2194*cda5da8dSAndroid Build Coastguard Worker            # and the kill() call.
2195*cda5da8dSAndroid Build Coastguard Worker            try:
2196*cda5da8dSAndroid Build Coastguard Worker                os.kill(self.pid, sig)
2197*cda5da8dSAndroid Build Coastguard Worker            except ProcessLookupError:
2198*cda5da8dSAndroid Build Coastguard Worker                # Suppress the race condition error; bpo-40550.
2199*cda5da8dSAndroid Build Coastguard Worker                pass
2200*cda5da8dSAndroid Build Coastguard Worker
2201*cda5da8dSAndroid Build Coastguard Worker        def terminate(self):
2202*cda5da8dSAndroid Build Coastguard Worker            """Terminate the process with SIGTERM
2203*cda5da8dSAndroid Build Coastguard Worker            """
2204*cda5da8dSAndroid Build Coastguard Worker            self.send_signal(signal.SIGTERM)
2205*cda5da8dSAndroid Build Coastguard Worker
2206*cda5da8dSAndroid Build Coastguard Worker        def kill(self):
2207*cda5da8dSAndroid Build Coastguard Worker            """Kill the process with SIGKILL
2208*cda5da8dSAndroid Build Coastguard Worker            """
2209*cda5da8dSAndroid Build Coastguard Worker            self.send_signal(signal.SIGKILL)
2210