return nil, err
}
if la := plan9LocalAddr(laddr); la == "" {
- _, err = f.WriteString("connect " + dest)
+ err = hangupCtlWrite(ctx, proto, f, "connect "+dest)
} else {
- _, err = f.WriteString("connect " + dest + " " + la)
+ err = hangupCtlWrite(ctx, proto, f, "connect "+dest+" "+la)
}
if err != nil {
f.Close()
}
return ip.String() + "!" + itoa(port)
}
+
+func hangupCtlWrite(ctx context.Context, proto string, ctl *os.File, msg string) error {
+ if proto != "tcp" {
+ _, err := ctl.WriteString(msg)
+ return err
+ }
+ written := make(chan struct{})
+ errc := make(chan error)
+ go func() {
+ select {
+ case <-ctx.Done():
+ ctl.WriteString("hangup")
+ errc <- mapErr(ctx.Err())
+ case <-written:
+ errc <- nil
+ }
+ }()
+ _, err := ctl.WriteString(msg)
+ close(written)
+ if e := <-errc; err == nil && e != nil { // we hung up
+ return e
+ }
+ return err
+}