aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/portage/util/socks5.py')
-rw-r--r--lib/portage/util/socks5.py43
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)