commit | d584804c775a9091f8696281a0a7d107ab15b066 | [log] [tgz] |
---|---|---|
author | Fazal Majid <github@sentfrom.com> | Sat Jun 29 16:02:41 2019 +0100 |
committer | Guillaume J. Charmes <guillaume@charmes.net> | Sat Jun 29 11:02:41 2019 -0400 |
tree | 4f79e10fdb78c206165d7eecb3d7d9cb2e298b57 | |
parent | 8a22c94093561323bff9eb908ad993c38ee48aa3 [diff] |
support for Solaris (#64) * first draft of Solaris support * implemented new APIs for Solaris * fixes for Solaris ioctls, tested using github.com/yudai/gotty as a test bed
Pty is a Go package for using unix pseudo-terminals.
go get github.com/creack/pty
package main import ( "github.com/creack/pty" "io" "os" "os/exec" ) func main() { c := exec.Command("grep", "--color=auto", "bar") f, err := pty.Start(c) if err != nil { panic(err) } go func() { f.Write([]byte("foo\n")) f.Write([]byte("bar\n")) f.Write([]byte("baz\n")) f.Write([]byte{4}) // EOT }() io.Copy(os.Stdout, f) }
package main import ( "io" "log" "os" "os/exec" "os/signal" "syscall" "github.com/creack/pty" "golang.org/x/crypto/ssh/terminal" ) func test() error { // Create arbitrary command. c := exec.Command("bash") // Start the command with a pty. ptmx, err := pty.Start(c) if err != nil { return err } // Make sure to close the pty at the end. defer func() { _ = ptmx.Close() }() // Best effort. // Handle pty size. ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGWINCH) go func() { for range ch { if err := pty.InheritSize(os.Stdin, ptmx); err != nil { log.Printf("error resizing pty: %s", err) } } }() ch <- syscall.SIGWINCH // Initial resize. // Set stdin in raw mode. oldState, err := terminal.MakeRaw(int(os.Stdin.Fd())) if err != nil { panic(err) } defer func() { _ = terminal.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort. // Copy stdin to the pty and the pty to stdout. go func() { _, _ = io.Copy(ptmx, os.Stdin) }() _, _ = io.Copy(os.Stdout, ptmx) return nil } func main() { if err := test(); err != nil { log.Fatal(err) } }