You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cointop/vendor/github.com/creack/pty
Simon Roberts 62ce8e1adb
Update all modules/deps (#288)
3 years ago
..
.gitignore Add SSH server 4 years ago
Dockerfile.golang go mod vendor 3 years ago
Dockerfile.riscv go mod vendor 3 years ago
LICENSE Add SSH server 4 years ago
README.md go mod vendor 3 years ago
asm_solaris_amd64.s go mod vendor 3 years ago
doc.go go mod vendor 3 years ago
ioctl.go go mod vendor 3 years ago
ioctl_bsd.go go mod vendor 3 years ago
ioctl_solaris.go go mod vendor 3 years ago
mktypes.bash go mod vendor 3 years ago
pty_darwin.go go mod vendor 3 years ago
pty_dragonfly.go go mod vendor 3 years ago
pty_freebsd.go go mod vendor 3 years ago
pty_linux.go go mod vendor 3 years ago
pty_netbsd.go go mod vendor 3 years ago
pty_openbsd.go go mod vendor 3 years ago
pty_solaris.go go mod vendor 3 years ago
pty_unsupported.go go mod vendor 3 years ago
run.go go mod vendor 3 years ago
test_crosscompile.sh Rename org miguelmota → cointop-sh 3 years ago
winsize.go go mod vendor 3 years ago
winsize_unix.go go mod vendor 3 years ago
winsize_unsupported.go go mod vendor 3 years ago
ztypes_386.go go mod vendor 3 years ago
ztypes_amd64.go go mod vendor 3 years ago
ztypes_arm.go go mod vendor 3 years ago
ztypes_arm64.go go mod vendor 3 years ago
ztypes_dragonfly_amd64.go go mod vendor 3 years ago
ztypes_freebsd_386.go go mod vendor 3 years ago
ztypes_freebsd_amd64.go go mod vendor 3 years ago
ztypes_freebsd_arm.go go mod vendor 3 years ago
ztypes_freebsd_arm64.go go mod vendor 3 years ago
ztypes_freebsd_ppc64.go Rename org miguelmota → cointop-sh 3 years ago
ztypes_loong64.go Update all modules/deps (#288) 3 years ago
ztypes_mipsx.go go mod vendor 3 years ago
ztypes_netbsd_32bit_int.go go mod vendor 3 years ago
ztypes_openbsd_32bit_int.go go mod vendor 3 years ago
ztypes_ppc64.go go mod vendor 3 years ago
ztypes_ppc64le.go go mod vendor 3 years ago
ztypes_riscvx.go go mod vendor 3 years ago
ztypes_s390x.go go mod vendor 3 years ago

README.md

pty

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

Install

go get github.com/creack/pty

Examples

Note that those examples are for demonstration purpose only, to showcase how to use the library. They are not meant to be used in any kind of production environment.

Command

package main

import (
	"io"
	"os"
	"os/exec"

	"github.com/creack/pty"
)

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/creack/pty"
        "golang.org/x/term"
)

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.
        defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done.

        // Set stdin in raw mode.
        oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
        if err != nil {
                panic(err)
        }
        defer func() { _ = term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort.

        // Copy stdin to the pty and the pty to stdout.
        // NOTE: The goroutine will keep reading until the next keystroke before returning.
        go func() { _, _ = io.Copy(ptmx, os.Stdin) }()
        _, _ = io.Copy(os.Stdout, ptmx)

        return nil
}

func main() {
        if err := test(); err != nil {
                log.Fatal(err)
        }
}