Capture C-level stdout/stderr pipes in Python via os.dup2. Comments from semarie@ OK danj@ OK and tweaks jca@
34 lines
1.2 KiB
Plaintext
34 lines
1.2 KiB
Plaintext
$OpenBSD: patch-wurlitzer_py,v 1.1.1.1 2019/02/14 22:34:18 mariani Exp $
|
|
|
|
Index: wurlitzer.py
|
|
--- wurlitzer.py.orig
|
|
+++ wurlitzer.py
|
|
@@ -32,13 +32,20 @@ import warnings
|
|
|
|
libc = ctypes.CDLL(None)
|
|
|
|
-try:
|
|
- c_stdout_p = ctypes.c_void_p.in_dll(libc, 'stdout')
|
|
- c_stderr_p = ctypes.c_void_p.in_dll(libc, 'stderr')
|
|
-except ValueError: # pragma: no cover
|
|
- # libc.stdout is has a funny name on OS X
|
|
- c_stdout_p = ctypes.c_void_p.in_dll(libc, '__stdoutp') # pragma: no cover
|
|
- c_stderr_p = ctypes.c_void_p.in_dll(libc, '__stderrp') # pragma: no cover
|
|
+if sys.platform.startswith('openbsd'):
|
|
+ FILE = (ctypes.c_byte * SIZE_OF_FILE)
|
|
+ sFType = (FILE * 3)
|
|
+ sFArray = sFType.in_dll(libc, '__sF')
|
|
+ c_stdout_p = ctypes.pointer(sFArray[1])
|
|
+ c_stderr_p = ctypes.pointer(sFArray[2])
|
|
+else:
|
|
+ try:
|
|
+ c_stdout_p = ctypes.c_void_p.in_dll(libc, 'stdout')
|
|
+ c_stderr_p = ctypes.c_void_p.in_dll(libc, 'stderr')
|
|
+ except ValueError: # pragma: no cover
|
|
+ # libc.stdout is has a funny name on OS X
|
|
+ c_stdout_p = ctypes.c_void_p.in_dll(libc, '__stdoutp') # pragma: no cover
|
|
+ c_stderr_p = ctypes.c_void_p.in_dll(libc, '__stderrp') # pragma: no cover
|
|
|
|
STDOUT = 2
|
|
PIPE = 3
|