From 3f9a84e461d5ceb31dc20f9d2a21fa729d937db1 Mon Sep 17 00:00:00 2001
From: Helmut Grohne <helmut@subdivi.de>
Date: Thu, 26 Jun 2025 10:05:21 +0200
Subject: handle SystemExit in run_in_fork reasonably

---
 linuxnamespaces/__init__.py | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

(limited to 'linuxnamespaces')

diff --git a/linuxnamespaces/__init__.py b/linuxnamespaces/__init__.py
index 21afd4a..ab8fa40 100644
--- a/linuxnamespaces/__init__.py
+++ b/linuxnamespaces/__init__.py
@@ -36,15 +36,18 @@ class run_in_fork:
         self.efd = None if start else EventFD()
         self.pid = os.fork()
         if self.pid == 0:
+            code = 0
             try:
                 if self.efd is not None:
                     self.efd.read()
                     self.efd.close()
                     self.efd = None
                 function()
+            except SystemExit as err:
+                code = err.code
             except:
-                os._exit(1)
-            os._exit(0)
+                code = 1
+            os._exit(code)
 
     @classmethod
     def now(cls, function: typing.Callable[[], None]) -> typing.Self:
@@ -101,6 +104,7 @@ class async_run_in_fork:
             self.efd = None if start else EventFD()
             self.pid = os.fork()
             if self.pid == 0:
+                code = 0
                 try:
                     if self.efd:
                         self.efd.read()
@@ -108,9 +112,11 @@ class async_run_in_fork:
                         self.efd = None
                     asyncio.set_event_loop(None)
                     function()
+                except SystemExit as err:
+                    code = err.code
                 except:
-                    os._exit(1)
-                os._exit(0)
+                    code = 1
+                os._exit(code)
             watcher.add_child_handler(self.pid, self._child_callback)
 
     @classmethod
-- 
cgit v1.2.3