X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=fishdescriptor%2Ffishdescriptor;h=20eddfef05936e38aa17a0bc29bcd8f8ebe2d58c;hp=8bcb46707c210c8b0436aead2b72aa1b0fb7f5f9;hb=7284668b47fd883a654edd710a5700cd60f1f3de;hpb=37d98ac0bf952f43a40fd7a276f372ab45fd1a0c diff --git a/fishdescriptor/fishdescriptor b/fishdescriptor/fishdescriptor index 8bcb467..20eddfe 100755 --- a/fishdescriptor/fishdescriptor +++ b/fishdescriptor/fishdescriptor @@ -4,6 +4,9 @@ import sys import fishdescriptor.fish import optparse import re +import subprocess +import socket +import os donor = None @@ -37,9 +40,9 @@ def implement_pending(): for (nominal, there), actual in zip(pending, actuals): overwriting_info = fdmap.get(nominal) if overwriting_info is not None: os.close(overwriting_info[0]) - fdmap[nominal] = (actual, Donor, there) + fdmap[nominal] = (actual, donor, there) -def implmement_sockinfo(nominal): +def implement_sockinfo(nominal): (actual, tdonor, there) = fdmap[nominal] # socket.fromfd requires the AF. But of course we don't know the AF. # There isn't a sane way to get it in Python: @@ -66,7 +69,7 @@ def implmement_sockinfo(nominal): (output, dummy) = famp.communicate() family = int(output) - sock = socket.fromfd(fd, family, 0) + sock = socket.fromfd(actual, family, 0) print("[%s] %d sockinfo" % (tdonor.pid, there), end='') for f in (lambda: socket.AddressFamily(family).name, @@ -80,7 +83,7 @@ def implmement_sockinfo(nominal): sock.close() def permute_fds_for_exec(): - actual2intended = { info[0]: nominal for nominal, info in fdmap.items } + actual2intended = { info[0]: nominal for nominal, info in fdmap.items() } # invariant at the start of each loop iteration: # for each intended (aka `nominal') we have processed: # relevant open-file is only held in fd intended @@ -108,13 +111,13 @@ def permute_fds_for_exec(): def implement_exec(argl): if donor is not None: donor.detach() sys.stdout.flush() - permut_fds_for_exec() + permute_fds_for_exec() os.execvp(argl[0], argl) def set_donor(pid): global donor if donor is not None: donor.detach() - donor = fishdescriptor.fish.Donor(pid) + donor = fishdescriptor.fish.Donor(pid, debug=ov.debug) def ocb_set_donor(option, opt, value, parser): set_donor(value) @@ -136,9 +139,12 @@ def process_args(): op.disable_interspersed_args() op.add_option('-p','--pid', type='int', action='callback', callback=ocb_set_donor) + op.add_option('-D','--debug', action='store_const', + dest='debug', const=sys.stderr) + ov.debug = None args = sys.argv[1:] - last_nominal = None + last_nominal = None # None or (nominal,) ie None or (None,) or (int,) while True: (ov, args) = op.parse_args(args=args, values=ov) @@ -146,14 +152,14 @@ def process_args(): arg = args.pop(0) - if donor is not None: + if donor is None: set_donor(int(arg)) elif arg_matches(r'^(?:(\d+)=)?(\d+)?$'): (nominal, there) = m.groups() nominal = None if nominal is None else int(nominal) there = int(there) pending.append((nominal,there)) - last_nominal = nominal + last_nominal = (nominal,) elif arg == 'exec': if not len(args): op.error("exec needs command to run") @@ -163,7 +169,7 @@ def process_args(): if last_nominal is None: op.error('sockinfo needs a prior fd spec') implement_pending() - implement_sockinfo(last_nominal) + implement_sockinfo(last_nominal[0]) else: op.error("unknown argument/option `%s'" % arg)