xs/vendor/github.com/kr/pty
Russ Magee caac02a77b 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string)
2/2 Added vendor/ dir to lock down dependent pkg versions.
The author of git.schwanenlied.me/yawning/{chacha20,newhope,kyber}.git has copied
their repos to gitlab.com/yawning/ but some imports of chacha20 from newhope still
inconsistently refer to git.schwanenlied.me/, breaking build.
Licenses for chacha20 also changed from CC0 to AGPL, which may or may not be an
issue. Until the two aforementioned issues are resolved, locking to last-good
versions is probably the best way forward for now.

To build with vendored deps, use make VENDOR=1 clean all
2020-01-29 13:55:38 -08:00
..
.gitignore 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
License 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
README.md 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
doc.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
go.mod 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ioctl.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ioctl_bsd.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
mktypes.bash 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
pty_darwin.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
pty_dragonfly.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
pty_freebsd.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
pty_linux.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
pty_openbsd.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
pty_unsupported.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
run.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
types.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
types_dragonfly.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
types_freebsd.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
types_openbsd.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
util.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_386.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_amd64.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_arm.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_arm64.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_dragonfly_amd64.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_freebsd_386.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_freebsd_amd64.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_freebsd_arm.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_mipsx.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_openbsd_386.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_openbsd_amd64.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_ppc64.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_ppc64le.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00
ztypes_s390x.go 1/2 Updated Makefile to allow VENDOR flag (adds -vendor to version string) 2020-01-29 13:55:38 -08:00

README.md

pty

Pty is a Go package for using unix pseudo-terminals.

Install

go get github.com/kr/pty

Example

Command

package main

import (
	"github.com/kr/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)
}

Shell

package main

import (
        "io"
        "log"
        "os"
        "os/exec"
        "os/signal"
        "syscall"

        "github.com/kr/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)
        }
}