in agent/session/plugin/client/client.go [144:231]
func (c *Client) Loop() error {
if !c.Connected {
err := c.Connect()
if err != nil {
return err
}
}
if !c.rawmode {
if runtime.GOOS == "darwin" {
stdin := int(os.Stdin.Fd())
log.GetLogger().Infoln("under darwin")
oldState, err := terminal.MakeRaw(stdin)
if err != nil {
log.GetLogger().Errorln(err)
fmt.Printf("capture stdin failed %s\r\n", err)
}
defer func() {
if e := recover(); e != nil {
fmt.Fprintln(os.Stderr, e)
fmt.Fprintln(os.Stderr, string(debug.Stack()))
}
terminal.Restore(stdin, oldState)
if !c.PortForward {
os.Exit(1)
}
}()
} else {
term, err := console.ConsoleFromFile(os.Stdout)
if err != nil {
log.GetLogger().Errorln(err)
return fmt.Errorf("os.Stdout is not a valid terminal")
}
err = term.SetRaw()
if err != nil {
return fmt.Errorf("Error setting raw terminal: %v", err)
}
defer func() {
if e := recover(); e != nil {
fmt.Fprintln(os.Stderr, e)
fmt.Fprintln(os.Stderr, string(debug.Stack()))
}
term.Reset()
if !c.PortForward {
os.Exit(1)
}
}()
}
} else {
log.GetLogger().Infoln("under rawmode")
defer func() {
if e := recover(); e != nil {
fmt.Fprintln(os.Stderr, e)
fmt.Fprintln(os.Stderr, string(debug.Stack()))
}
if !c.PortForward {
os.Exit(1)
}
}()
}
wg := &sync.WaitGroup{}
wg.Add(1)
go c.termsizeLoop(wg)
if !c.rawmode {
wg.Add(1)
go c.writeLoop(wg)
} else {
wg.Add(1)
go c.writeLoopRawMode(wg)
}
wg.Add(1)
go c.readLoop(wg)
/* Wait for all of the above goroutines to finish */
//wg.Wait()
<-c.poison
logrus.Debug("Client.Loop() exiting")
return nil
}