func()

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
}