diff options
Diffstat (limited to 'lib/portage/util/socks5.py')
-rw-r--r-- | lib/portage/util/socks5.py | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/lib/portage/util/socks5.py b/lib/portage/util/socks5.py index 820240571..c32ba7767 100644 --- a/lib/portage/util/socks5.py +++ b/lib/portage/util/socks5.py @@ -1,17 +1,17 @@ # SOCKSv5 proxy manager for network-sandbox -# Copyright 2015-2021 Gentoo Authors +# Copyright 2015-2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 +import asyncio import errno import os -import signal import socket +import portage import portage.data from portage import _python_interpreter from portage.data import portage_gid, portage_uid, userpriv_groups from portage.process import atexit_register, spawn -from portage.util.futures import asyncio class ProxyManager: @@ -22,7 +22,8 @@ class ProxyManager: def __init__(self): self.socket_path = None - self._pids = [] + self._proc = None + self._proc_waiter = None def start(self, settings): """ @@ -51,22 +52,25 @@ class ProxyManager: spawn_kwargs.update( uid=portage_uid, gid=portage_gid, groups=userpriv_groups, umask=0o077 ) - self._pids = spawn( + self._proc = spawn( [_python_interpreter, server_bin, self.socket_path], - returnpid=True, - **spawn_kwargs + returnproc=True, + **spawn_kwargs, ) - def stop(self): + async def stop(self): """ - Stop the SOCKSv5 server. + Stop the SOCKSv5 server. This method is a coroutine. """ - for p in self._pids: - os.kill(p, signal.SIGINT) - os.waitpid(p, 0) + if self._proc is not None: + self._proc.terminate() + if self._proc_waiter is None: + self._proc_waiter = asyncio.ensure_future(self._proc.wait()) + await self._proc_waiter self.socket_path = None - self._pids = [] + self._proc = None + self._proc_waiter = None def is_running(self): """ @@ -80,22 +84,17 @@ class ProxyManager: """ Wait for the proxy socket to become ready. This method is a coroutine. """ + if self._proc_waiter is None: + self._proc_waiter = asyncio.ensure_future(self._proc.wait()) while True: - try: - wait_retval = os.waitpid(self._pids[0], os.WNOHANG) - except OSError as e: - if e.errno == errno.EINTR: - continue - raise - - if wait_retval is not None and wait_retval != (0, 0): + if self._proc_waiter.done(): raise OSError(3, "No such process") try: s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.connect(self.socket_path) - except EnvironmentError as e: + except OSError as e: if e.errno != errno.ENOENT: raise await asyncio.sleep(0.2) |