From 4aa3e4e9ec44c2aa5a76f25d6e7b6d6a69c800de Mon Sep 17 00:00:00 2001 From: rkonfj Date: Fri, 26 May 2023 18:39:51 +0800 Subject: [PATCH] cmd `pf`: only one target map to stdio --- cmd/pf/tunnel.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cmd/pf/tunnel.go b/cmd/pf/tunnel.go index cec083a..119189a 100644 --- a/cmd/pf/tunnel.go +++ b/cmd/pf/tunnel.go @@ -17,6 +17,9 @@ import ( "github.com/sirupsen/logrus" ) +var errOnlyOnceMapToStdio error = errors.New( + "only one communication target can be mapped to stdio") + type Options struct { Forwards []string Server, Key string @@ -63,6 +66,7 @@ func NewTunnelManager(opts Options) (*TunnelManager, error) { } var forwards []mapping + var stdioMapping *mapping for _, f := range opts.Forwards { rawMp := strings.Split(f, "/") @@ -71,12 +75,20 @@ func NewTunnelManager(opts Options) (*TunnelManager, error) { } mp := mapping{network: rawMp[0], bo: backoff.NewExponentialBackOff()} if len(rawMp) == 2 { + if stdioMapping != nil { + return nil, errOnlyOnceMapToStdio + } mp.local = "stdio" mp.remote = rawMp[1] + stdioMapping = &mp logrus.SetOutput(os.Stderr) } else { - if len(rawMp) == 0 { + if len(rawMp[1]) == 0 { + if stdioMapping != nil { + return nil, errOnlyOnceMapToStdio + } mp.local = "stdio" + stdioMapping = &mp } else { mp.local = rawMp[1] }