@@ -20,10 +20,16 @@ import (
2020// 192.168.0.1:3000:google.com:80 ->
2121// local 192.168.0.1:3000
2222// remote google.com:80
23+ // 127.0.0.1:1080:socks
24+ // local 127.0.0.1:1080
25+ // remote socks
26+ // stdio:example.com:22
27+ // local stdio
28+ // remote example.com:22
2329
2430type Remote struct {
2531 LocalHost , LocalPort , RemoteHost , RemotePort string
26- Socks , Reverse bool
32+ Socks , Reverse , Stdio bool
2733}
2834
2935const revPrefix = "R:"
@@ -41,11 +47,16 @@ func DecodeRemote(s string) (*Remote, error) {
4147 r := & Remote {Reverse : reverse }
4248 for i := len (parts ) - 1 ; i >= 0 ; i -- {
4349 p := parts [i ]
44- //last part " socks" ?
50+ //remote portion is socks?
4551 if i == len (parts )- 1 && p == "socks" {
4652 r .Socks = true
4753 continue
4854 }
55+ //local portion is stdio?
56+ if i == 0 && p == "stdio" {
57+ r .Stdio = true
58+ continue
59+ }
4960 if isPort (p ) {
5061 if ! r .Socks && r .RemotePort == "" {
5162 r .RemotePort = p
@@ -80,6 +91,9 @@ func DecodeRemote(s string) (*Remote, error) {
8091 if ! r .Socks && r .RemoteHost == "" {
8192 r .RemoteHost = "0.0.0.0"
8293 }
94+ if r .Stdio && r .Reverse {
95+ return nil , errors .New ("stdio cannot be reversed" )
96+ }
8397 return r , nil
8498}
8599
@@ -106,7 +120,14 @@ func (r *Remote) String() string {
106120 if r .Reverse {
107121 tag = revPrefix
108122 }
109- return tag + r .LocalHost + ":" + r .LocalPort + "=>" + r .Remote ()
123+ return tag + r .Local () + "=>" + r .Remote ()
124+ }
125+
126+ func (r * Remote ) Local () string {
127+ if r .Stdio {
128+ return "stdio"
129+ }
130+ return r .LocalHost + ":" + r .LocalPort
110131}
111132
112133func (r * Remote ) Remote () string {
0 commit comments