commit:     dd37968c903a503fa15bd984076292ceb24992b7
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sun Nov  9 18:03:01 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Nov  9 18:03:01 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=dd37968c

Print available job tokens on SIGUSR1

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 steve.py | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/steve.py b/steve.py
index 80269d7..12466cc 100755
--- a/steve.py
+++ b/steve.py
@@ -8,14 +8,18 @@
 from __future__ import annotations
 
 import argparse
+import array
 import contextlib
+import fcntl
 import multiprocessing
 import os
 import signal
+import termios
 from pathlib import Path
 from typing import TYPE_CHECKING
 
 if TYPE_CHECKING:
+    import io
     from collections.abc import Generator
     from types import FrameType
 
@@ -28,6 +32,12 @@ def exit_sig_handler(signum: int, _: FrameType | None) -> 
None:
     raise SystemExit(0)
 
 
+def print_state(job_file: io.FileIO) -> None:
+    data_buf = array.array("i", [0])
+    fcntl.ioctl(job_file.fileno(), termios.FIONREAD, data_buf)
+    print(f"Available job tokens: {data_buf[0]}")
+
+
 @contextlib.contextmanager
 def hold_fifo(path: Path) -> Generator[None]:
     os.mkfifo(path)
@@ -40,6 +50,7 @@ def hold_fifo(path: Path) -> Generator[None]:
 def main() -> None:
     signal.signal(signal.SIGINT, exit_sig_handler)
     signal.signal(signal.SIGTERM, exit_sig_handler)
+    signal.signal(signal.SIGUSR1, signal.SIG_IGN)
 
     argp = argparse.ArgumentParser()
     argp.add_argument(
@@ -73,6 +84,10 @@ def main() -> None:
         context_managers.enter_context(hold_fifo(args.path))
         _ = os.open(args.path, os.O_RDONLY | os.O_NONBLOCK)
         job_file = args.path.open("wb")
+        signal.signal(
+            signal.SIGUSR1,
+            lambda _sig, _frame: print_state(job_file),
+        )
         if args.control_fifo is not None:
             context_managers.enter_context(hold_fifo(args.control_fifo))
             print(f"Waiting for clients to open {args.control_fifo}")

Reply via email to