From: Ian Jackson Date: Thu, 19 Oct 2017 18:59:50 +0000 (+0100) Subject: fishdescriptor: before redo option parsing X-Git-Tag: archive/debian/6.0.0~1^2~21 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=commitdiff_plain;h=54e807bb078502c144f02399fccf3c2056ac3723 fishdescriptor: before redo option parsing Signed-off-by: Ian Jackson --- diff --git a/fishdescriptor/fishdescriptor b/fishdescriptor/fishdescriptor index 7150df2..b8c732a 100755 --- a/fishdescriptor/fishdescriptor +++ b/fishdescriptor/fishdescriptor @@ -2,6 +2,66 @@ import sys import fishdescriptor.fish +import re + +donor = None + +usage = +''' +fishdescriptor ... [-p|--pid ...] + +s + [=] + fish the openfile referenced by descriptor in + (the most recent) and keep a descriptor onto it; + and, optionally, give it the number for exec + exec [...] + execute a process with each specified numeric + as an actual fd + sockinfo + calls getsockname/getpeername on the most recent + + + -p|-pid + now attach to , detaching from previous pid +''' + +def set_donor(pid_arg): + pid = int(pid_arg) + if donor is not None: donor.detach() + donor = fishdescriptor.fish.Donor(pid) + +def process_args(): + def arg_matches(regexp): + nonlocal m + m = re.search(regexp, arg) + return m + + arg_ix = 0 + def next_arg(): + sys.argv[arg_ix] = + + while arg_ix < len(sys.argv): + arg = next_arg() + if arg_matches(r'^-p(\d+)') or + arg_matches(r'^--pid=(\d+)$') + set_donor(m.groups(1)[0]) + + pid = +(?:-p|^--pid(?:=|$))(\d*)$'): + + pid = int(m.groups(1)[0]) + elif arg_matches(r'^(?:-p|^--pid=)(\d+)$'): + + if expecting_pid: + set_donor(arg) + el + elif arg_matches(r'\d+ + + parser = OptionParser(usage=usage, ) + + parser.add_option("-p", "--pid", type='int', callback=set_donor) + parser.add_option( pid = int(sys.argv[1]) fds = [int(x) for x in sys.argv[2:]] diff --git a/fishdescriptor/py/fishdescriptor/fish.py b/fishdescriptor/py/fishdescriptor/fish.py index 763684b..ff77fa9 100644 --- a/fishdescriptor/py/fishdescriptor/fish.py +++ b/fishdescriptor/py/fishdescriptor/fish.py @@ -136,3 +136,6 @@ class Donor(): except FileNotFoundError: pass return list(got_fds) + + def detach(d): + d._sp.stdin.close()