From a00bc93fe1b6f71afffa43fab4efb88dceddea62 Mon Sep 17 00:00:00 2001 From: ed Date: Fri, 12 Jun 2026 23:37:12 +0000 Subject: [PATCH] bsd: signal masking --- copyparty/svchub.py | 3 +++ copyparty/util.py | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/copyparty/svchub.py b/copyparty/svchub.py index b0b1f9ef..c35a0566 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -51,6 +51,7 @@ from .th_srv import ( ) from .up2k import Up2k from .util import ( + BLOCK_SIGS, DEF_EXP, DEF_MTE, DEF_MTH, @@ -1486,6 +1487,8 @@ class SvcHub(object): for sig in sigs: signal.signal(sig, self.signal_handler) + if sig not in BLOCK_SIGS and BLOCK_SIGS: + BLOCK_SIGS.append(sig) if self.args.sig_thr: Daemon(self._signal_thr, "svchub-sig") diff --git a/copyparty/util.py b/copyparty/util.py index 6396445f..9da36b8e 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -326,7 +326,14 @@ except: BITNESS = struct.calcsize("P") * 8 -CAN_SIGMASK = not (ANYWIN or PY2 or GRAAL) +try: + if ANYWIN or PY2 or GRAAL or not hasattr(signal, "pthread_sigmask"): + raise Exception() + BLOCK_SIGS = [signal.SIGINT, signal.SIGTERM, signal.SIGHUP, signal.SIGUSR1] + CAN_SIGMASK = True +except: + BLOCK_SIGS = [] + CAN_SIGMASK = False RE_ANSI = re.compile("\033\\[[^mK]*[mK]") @@ -832,10 +839,8 @@ class Daemon(threading.Thread): self.start() def run(self): - if CAN_SIGMASK: - signal.pthread_sigmask( - signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1] - ) + if BLOCK_SIGS: + signal.pthread_sigmask(signal.SIG_BLOCK, BLOCK_SIGS) self.fun(*self.a, **self.ka) @@ -1778,9 +1783,7 @@ def log_thrs(log: Callable[[str, str, int], None], ival: float, name: str) -> No def _sigblock(): - signal.pthread_sigmask( - signal.SIG_BLOCK, [signal.SIGINT, signal.SIGTERM, signal.SIGUSR1] - ) + signal.pthread_sigmask(signal.SIG_BLOCK, BLOCK_SIGS) sigblock = _sigblock if CAN_SIGMASK else noop