mirror of https://github.com/docker/cli.git
vendor: github.com/creack/pty v1.1.18
full diff: https://github.com/creack/pty/compare/v1.1.11...v1.1.18 Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
eabb927811
commit
c177e2060d
|
@ -8,7 +8,7 @@ go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/containerd/containerd v1.6.20
|
github.com/containerd/containerd v1.6.20
|
||||||
github.com/creack/pty v1.1.11
|
github.com/creack/pty v1.1.18
|
||||||
github.com/docker/distribution v2.8.1+incompatible
|
github.com/docker/distribution v2.8.1+incompatible
|
||||||
github.com/docker/docker v24.0.0-beta.2+incompatible
|
github.com/docker/docker v24.0.0-beta.2+incompatible
|
||||||
github.com/docker/docker-credential-helpers v0.7.0
|
github.com/docker/docker-credential-helpers v0.7.0
|
||||||
|
|
|
@ -87,8 +87,8 @@ github.com/containerd/containerd v1.6.20/go.mod h1:apei1/i5Ux2FzrK6+DM/suEsGuK/M
|
||||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||||
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
ARG GOVERSION=1.14
|
||||||
|
FROM golang:${GOVERSION}
|
||||||
|
|
||||||
|
# Set base env.
|
||||||
|
ARG GOOS=linux
|
||||||
|
ARG GOARCH=amd64
|
||||||
|
ENV GOOS=${GOOS} GOARCH=${GOARCH} CGO_ENABLED=0 GOFLAGS='-v -ldflags=-s -ldflags=-w'
|
||||||
|
|
||||||
|
# Pre compile the stdlib for 386/arm (32bits).
|
||||||
|
RUN go build -a std
|
||||||
|
|
||||||
|
# Add the code to the image.
|
||||||
|
WORKDIR pty
|
||||||
|
ADD . .
|
||||||
|
|
||||||
|
# Build the lib.
|
||||||
|
RUN go build
|
|
@ -1,3 +1,4 @@
|
||||||
|
# NOTE: Using 1.13 as a base to build the RISCV compiler, the resulting version is based on go1.6.
|
||||||
FROM golang:1.13
|
FROM golang:1.13
|
||||||
|
|
||||||
# Clone and complie a riscv compatible version of the go compiler.
|
# Clone and complie a riscv compatible version of the go compiler.
|
||||||
|
@ -8,7 +9,15 @@ ENV PATH=/riscv-go/misc/riscv:/riscv-go/bin:$PATH
|
||||||
RUN cd /riscv-go/src && GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash
|
RUN cd /riscv-go/src && GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash
|
||||||
ENV GOROOT=/riscv-go
|
ENV GOROOT=/riscv-go
|
||||||
|
|
||||||
# Make sure we compile.
|
# Set the base env.
|
||||||
|
ENV GOOS=linux GOARCH=riscv CGO_ENABLED=0 GOFLAGS='-v -ldflags=-s -ldflags=-w'
|
||||||
|
|
||||||
|
# Pre compile the stdlib.
|
||||||
|
RUN go build -a std
|
||||||
|
|
||||||
|
# Add the code to the image.
|
||||||
WORKDIR pty
|
WORKDIR pty
|
||||||
ADD . .
|
ADD . .
|
||||||
RUN GOOS=linux GOARCH=riscv go build
|
|
||||||
|
# Build the lib.
|
||||||
|
RUN go build
|
||||||
|
|
|
@ -4,9 +4,13 @@ Pty is a Go package for using unix pseudo-terminals.
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
go get github.com/creack/pty
|
```sh
|
||||||
|
go get github.com/creack/pty
|
||||||
|
```
|
||||||
|
|
||||||
## Example
|
## 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
|
### Command
|
||||||
|
|
||||||
|
@ -14,10 +18,11 @@ Pty is a Go package for using unix pseudo-terminals.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/creack/pty"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
|
||||||
|
"github.com/creack/pty"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -51,7 +56,7 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/creack/pty"
|
"github.com/creack/pty"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
func test() error {
|
func test() error {
|
||||||
|
@ -77,15 +82,17 @@ func test() error {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
ch <- syscall.SIGWINCH // Initial resize.
|
ch <- syscall.SIGWINCH // Initial resize.
|
||||||
|
defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done.
|
||||||
|
|
||||||
// Set stdin in raw mode.
|
// Set stdin in raw mode.
|
||||||
oldState, err := terminal.MakeRaw(int(os.Stdin.Fd()))
|
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer func() { _ = terminal.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort.
|
defer func() { _ = term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort.
|
||||||
|
|
||||||
// Copy stdin to the pty and the pty to stdout.
|
// 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) }()
|
go func() { _, _ = io.Copy(ptmx, os.Stdin) }()
|
||||||
_, _ = io.Copy(os.Stdout, ptmx)
|
_, _ = io.Copy(os.Stdout, ptmx)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build gc
|
||||||
|
//+build gc
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go
|
||||||
|
//
|
||||||
|
|
||||||
|
TEXT ·sysvicall6(SB),NOSPLIT,$0-88
|
||||||
|
JMP syscall·sysvicall6(SB)
|
||||||
|
|
||||||
|
TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88
|
||||||
|
JMP syscall·rawSysvicall6(SB)
|
|
@ -10,7 +10,7 @@ import (
|
||||||
// available on the current platform.
|
// available on the current platform.
|
||||||
var ErrUnsupported = errors.New("unsupported")
|
var ErrUnsupported = errors.New("unsupported")
|
||||||
|
|
||||||
// Opens a pty and its corresponding tty.
|
// Open a pty and its corresponding tty.
|
||||||
func Open() (pty, tty *os.File, err error) {
|
func Open() (pty, tty *os.File, err error) {
|
||||||
return open()
|
return open()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
// +build !windows,!solaris
|
//go:build !windows && !solaris && !aix
|
||||||
|
// +build !windows,!solaris,!aix
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import "syscall"
|
import "syscall"
|
||||||
|
|
||||||
|
const (
|
||||||
|
TIOCGWINSZ = syscall.TIOCGWINSZ
|
||||||
|
TIOCSWINSZ = syscall.TIOCSWINSZ
|
||||||
|
)
|
||||||
|
|
||||||
func ioctl(fd, cmd, ptr uintptr) error {
|
func ioctl(fd, cmd, ptr uintptr) error {
|
||||||
_, _, e := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr)
|
_, _, e := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
//go:build darwin || dragonfly || freebsd || netbsd || openbsd
|
||||||
// +build darwin dragonfly freebsd netbsd openbsd
|
// +build darwin dragonfly freebsd netbsd openbsd
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
|
@ -1,30 +1,48 @@
|
||||||
|
//go:build solaris
|
||||||
|
// +build solaris
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"golang.org/x/sys/unix"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
|
||||||
|
//go:linkname procioctl libc_ioctl
|
||||||
|
var procioctl uintptr
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// see /usr/include/sys/stropts.h
|
// see /usr/include/sys/stropts.h
|
||||||
I_PUSH = uintptr((int32('S')<<8 | 002))
|
I_PUSH = uintptr((int32('S')<<8 | 002))
|
||||||
I_STR = uintptr((int32('S')<<8 | 010))
|
I_STR = uintptr((int32('S')<<8 | 010))
|
||||||
I_FIND = uintptr((int32('S')<<8 | 013))
|
I_FIND = uintptr((int32('S')<<8 | 013))
|
||||||
|
|
||||||
// see /usr/include/sys/ptms.h
|
// see /usr/include/sys/ptms.h
|
||||||
ISPTM = (int32('P') << 8) | 1
|
ISPTM = (int32('P') << 8) | 1
|
||||||
UNLKPT = (int32('P') << 8) | 2
|
UNLKPT = (int32('P') << 8) | 2
|
||||||
PTSSTTY = (int32('P') << 8) | 3
|
PTSSTTY = (int32('P') << 8) | 3
|
||||||
ZONEPT = (int32('P') << 8) | 4
|
ZONEPT = (int32('P') << 8) | 4
|
||||||
OWNERPT = (int32('P') << 8) | 5
|
OWNERPT = (int32('P') << 8) | 5
|
||||||
|
|
||||||
|
// see /usr/include/sys/termios.h
|
||||||
|
TIOCSWINSZ = (uint32('T') << 8) | 103
|
||||||
|
TIOCGWINSZ = (uint32('T') << 8) | 104
|
||||||
)
|
)
|
||||||
|
|
||||||
type strioctl struct {
|
type strioctl struct {
|
||||||
ic_cmd int32
|
icCmd int32
|
||||||
ic_timout int32
|
icTimeout int32
|
||||||
ic_len int32
|
icLen int32
|
||||||
ic_dp unsafe.Pointer
|
icDP unsafe.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Defined in asm_solaris_amd64.s.
|
||||||
|
func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
|
|
||||||
func ioctl(fd, cmd, ptr uintptr) error {
|
func ioctl(fd, cmd, ptr uintptr) error {
|
||||||
return unix.IoctlSetInt(int(fd), uint(cmd), int(ptr))
|
if _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, fd, cmd, ptr, 0, 0, 0); errno != 0 {
|
||||||
|
return errno
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
//go:build aix
|
||||||
|
// +build aix
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
const (
|
||||||
|
TIOCGWINSZ = 0
|
||||||
|
TIOCSWINSZ = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
func ioctl(fd, cmd, ptr uintptr) error {
|
||||||
|
return ErrUnsupported
|
||||||
|
}
|
|
@ -13,7 +13,7 @@ GODEFS="go tool cgo -godefs"
|
||||||
$GODEFS types.go |gofmt > ztypes_$GOARCH.go
|
$GODEFS types.go |gofmt > ztypes_$GOARCH.go
|
||||||
|
|
||||||
case $GOOS in
|
case $GOOS in
|
||||||
freebsd|dragonfly|openbsd)
|
freebsd|dragonfly|netbsd|openbsd)
|
||||||
$GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go
|
$GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build darwin
|
||||||
|
// +build darwin
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -33,7 +36,7 @@ func open() (pty, tty *os.File, err error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
t, err := os.OpenFile(sname, os.O_RDWR, 0)
|
t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build dragonfly
|
||||||
|
// +build dragonfly
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build freebsd
|
||||||
|
// +build freebsd
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build linux
|
||||||
|
// +build linux
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -28,7 +31,7 @@ func open() (pty, tty *os.File, err error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
|
t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0) //nolint:gosec // Expected Open from a variable.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -37,7 +40,7 @@ func open() (pty, tty *os.File, err error) {
|
||||||
|
|
||||||
func ptsname(f *os.File) (string, error) {
|
func ptsname(f *os.File) (string, error) {
|
||||||
var n _C_uint
|
var n _C_uint
|
||||||
err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n)))
|
err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))) //nolint:gosec // Expected unsafe pointer for Syscall call.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -47,5 +50,5 @@ func ptsname(f *os.File) (string, error) {
|
||||||
func unlockpt(f *os.File) error {
|
func unlockpt(f *os.File) error {
|
||||||
var u _C_int
|
var u _C_int
|
||||||
// use TIOCSPTLCK with a pointer to zero to clear the lock
|
// use TIOCSPTLCK with a pointer to zero to clear the lock
|
||||||
return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u)))
|
return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) //nolint:gosec // Expected unsafe pointer for Syscall call.
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
//go:build netbsd
|
||||||
|
// +build netbsd
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func open() (pty, tty *os.File, err error) {
|
||||||
|
p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
// In case of error after this point, make sure we close the ptmx fd.
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
_ = p.Close() // Best effort.
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
sname, err := ptsname(p)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := grantpt(p); err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// In NetBSD unlockpt() does nothing, so it isn't called here.
|
||||||
|
|
||||||
|
t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
return p, t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ptsname(f *os.File) (string, error) {
|
||||||
|
/*
|
||||||
|
* from ptsname(3): The ptsname() function is equivalent to:
|
||||||
|
* struct ptmget pm;
|
||||||
|
* ioctl(fd, TIOCPTSNAME, &pm) == -1 ? NULL : pm.sn;
|
||||||
|
*/
|
||||||
|
var ptm ptmget
|
||||||
|
if err := ioctl(f.Fd(), uintptr(ioctl_TIOCPTSNAME), uintptr(unsafe.Pointer(&ptm))); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
name := make([]byte, len(ptm.Sn))
|
||||||
|
for i, c := range ptm.Sn {
|
||||||
|
name[i] = byte(c)
|
||||||
|
if c == 0 {
|
||||||
|
return string(name[:i]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", errors.New("TIOCPTSNAME string not NUL-terminated")
|
||||||
|
}
|
||||||
|
|
||||||
|
func grantpt(f *os.File) error {
|
||||||
|
/*
|
||||||
|
* from grantpt(3): Calling grantpt() is equivalent to:
|
||||||
|
* ioctl(fd, TIOCGRANTPT, 0);
|
||||||
|
*/
|
||||||
|
return ioctl(f.Fd(), uintptr(ioctl_TIOCGRANTPT), 0)
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build openbsd
|
||||||
|
// +build openbsd
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build solaris
|
||||||
|
// +build solaris
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
/* based on:
|
/* based on:
|
||||||
|
@ -6,48 +9,54 @@ http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libc/port/gen/pt.c
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
const NODEV = ^uint64(0)
|
|
||||||
|
|
||||||
func open() (pty, tty *os.File, err error) {
|
func open() (pty, tty *os.File, err error) {
|
||||||
masterfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|unix.O_NOCTTY, 0)
|
ptmxfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|syscall.O_NOCTTY, 0)
|
||||||
//masterfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|syscall.O_CLOEXEC|unix.O_NOCTTY, 0)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
p := os.NewFile(uintptr(masterfd), "/dev/ptmx")
|
p := os.NewFile(uintptr(ptmxfd), "/dev/ptmx")
|
||||||
|
// In case of error after this point, make sure we close the ptmx fd.
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
_ = p.Close() // Best effort.
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
sname, err := ptsname(p)
|
sname, err := ptsname(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = grantpt(p)
|
if err := grantpt(p); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = unlockpt(p)
|
if err := unlockpt(p); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
slavefd, err := syscall.Open(sname, os.O_RDWR|unix.O_NOCTTY, 0)
|
ptsfd, err := syscall.Open(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
t := os.NewFile(uintptr(slavefd), sname)
|
t := os.NewFile(uintptr(ptsfd), sname)
|
||||||
|
|
||||||
|
// In case of error after this point, make sure we close the pts fd.
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
_ = t.Close() // Best effort.
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// pushing terminal driver STREAMS modules as per pts(7)
|
// pushing terminal driver STREAMS modules as per pts(7)
|
||||||
for _, mod := range([]string{"ptem", "ldterm", "ttcompat"}) {
|
for _, mod := range []string{"ptem", "ldterm", "ttcompat"} {
|
||||||
err = streams_push(t, mod)
|
if err := streamsPush(t, mod); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,73 +64,79 @@ func open() (pty, tty *os.File, err error) {
|
||||||
return p, t, nil
|
return p, t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func minor(x uint64) uint64 {
|
|
||||||
return x & 0377
|
|
||||||
}
|
|
||||||
|
|
||||||
func ptsdev(fd uintptr) uint64 {
|
|
||||||
istr := strioctl{ISPTM, 0, 0, nil}
|
|
||||||
err := ioctl(fd, I_STR, uintptr(unsafe.Pointer(&istr)))
|
|
||||||
if err != nil {
|
|
||||||
return NODEV
|
|
||||||
}
|
|
||||||
var status unix.Stat_t
|
|
||||||
err = unix.Fstat(int(fd), &status)
|
|
||||||
if err != nil {
|
|
||||||
return NODEV
|
|
||||||
}
|
|
||||||
return uint64(minor(status.Rdev))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ptsname(f *os.File) (string, error) {
|
func ptsname(f *os.File) (string, error) {
|
||||||
dev := ptsdev(f.Fd())
|
dev, err := ptsdev(f.Fd())
|
||||||
if dev == NODEV {
|
if err != nil {
|
||||||
return "", errors.New("not a master pty")
|
return "", err
|
||||||
}
|
}
|
||||||
fn := "/dev/pts/" + strconv.FormatInt(int64(dev), 10)
|
fn := "/dev/pts/" + strconv.FormatInt(int64(dev), 10)
|
||||||
// access(2) creates the slave device (if the pty exists)
|
|
||||||
// F_OK == 0 (unistd.h)
|
if err := syscall.Access(fn, 0); err != nil {
|
||||||
err := unix.Access(fn, 0)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return fn, nil
|
return fn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type pt_own struct {
|
func unlockpt(f *os.File) error {
|
||||||
pto_ruid int32
|
istr := strioctl{
|
||||||
pto_rgid int32
|
icCmd: UNLKPT,
|
||||||
|
icTimeout: 0,
|
||||||
|
icLen: 0,
|
||||||
|
icDP: nil,
|
||||||
|
}
|
||||||
|
return ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func minor(x uint64) uint64 { return x & 0377 }
|
||||||
|
|
||||||
|
func ptsdev(fd uintptr) (uint64, error) {
|
||||||
|
istr := strioctl{
|
||||||
|
icCmd: ISPTM,
|
||||||
|
icTimeout: 0,
|
||||||
|
icLen: 0,
|
||||||
|
icDP: nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ioctl(fd, I_STR, uintptr(unsafe.Pointer(&istr))); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
var status syscall.Stat_t
|
||||||
|
if err := syscall.Fstat(int(fd), &status); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return uint64(minor(status.Rdev)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ptOwn struct {
|
||||||
|
rUID int32
|
||||||
|
rGID int32
|
||||||
}
|
}
|
||||||
|
|
||||||
func grantpt(f *os.File) error {
|
func grantpt(f *os.File) error {
|
||||||
if ptsdev(f.Fd()) == NODEV {
|
if _, err := ptsdev(f.Fd()); err != nil {
|
||||||
return errors.New("not a master pty")
|
return err
|
||||||
}
|
}
|
||||||
var pto pt_own
|
pto := ptOwn{
|
||||||
pto.pto_ruid = int32(os.Getuid())
|
rUID: int32(os.Getuid()),
|
||||||
// XXX should first attempt to get gid of DEFAULT_TTY_GROUP="tty"
|
// XXX should first attempt to get gid of DEFAULT_TTY_GROUP="tty"
|
||||||
pto.pto_rgid = int32(os.Getgid())
|
rGID: int32(os.Getgid()),
|
||||||
var istr strioctl
|
}
|
||||||
istr.ic_cmd = OWNERPT
|
istr := strioctl{
|
||||||
istr.ic_timout = 0
|
icCmd: OWNERPT,
|
||||||
istr.ic_len = int32(unsafe.Sizeof(istr))
|
icTimeout: 0,
|
||||||
istr.ic_dp = unsafe.Pointer(&pto)
|
icLen: int32(unsafe.Sizeof(strioctl{})),
|
||||||
err := ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr)))
|
icDP: unsafe.Pointer(&pto),
|
||||||
if err != nil {
|
}
|
||||||
|
if err := ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr))); err != nil {
|
||||||
return errors.New("access denied")
|
return errors.New("access denied")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func unlockpt(f *os.File) error {
|
// streamsPush pushes STREAMS modules if not already done so.
|
||||||
istr := strioctl{UNLKPT, 0, 0, nil}
|
func streamsPush(f *os.File, mod string) error {
|
||||||
return ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// push STREAMS modules if not already done so
|
|
||||||
func streams_push(f *os.File, mod string) error {
|
|
||||||
var err error
|
|
||||||
buf := []byte(mod)
|
buf := []byte(mod)
|
||||||
|
|
||||||
// XXX I_FIND is not returning an error when the module
|
// XXX I_FIND is not returning an error when the module
|
||||||
// is already pushed even though truss reports a return
|
// is already pushed even though truss reports a return
|
||||||
// value of 1. A bug in the Go Solaris syscall interface?
|
// value of 1. A bug in the Go Solaris syscall interface?
|
||||||
|
@ -130,10 +145,8 @@ func streams_push(f *os.File, mod string) error {
|
||||||
// but since we are not using libc or XPG4.2, we should not be
|
// but since we are not using libc or XPG4.2, we should not be
|
||||||
// double-pushing modules
|
// double-pushing modules
|
||||||
|
|
||||||
err = ioctl(f.Fd(), I_FIND, uintptr(unsafe.Pointer(&buf[0])))
|
if err := ioctl(f.Fd(), I_FIND, uintptr(unsafe.Pointer(&buf[0]))); err != nil {
|
||||||
if err != nil {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
err = ioctl(f.Fd(), I_PUSH, uintptr(unsafe.Pointer(&buf[0])))
|
return ioctl(f.Fd(), I_PUSH, uintptr(unsafe.Pointer(&buf[0])))
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// +build !linux,!darwin,!freebsd,!dragonfly,!openbsd,!solaris
|
//go:build !linux && !darwin && !freebsd && !dragonfly && !netbsd && !openbsd && !solaris
|
||||||
|
// +build !linux,!darwin,!freebsd,!dragonfly,!netbsd,!openbsd,!solaris
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -13,23 +11,8 @@ import (
|
||||||
// corresponding pty.
|
// corresponding pty.
|
||||||
//
|
//
|
||||||
// Starts the process in a new session and sets the controlling terminal.
|
// Starts the process in a new session and sets the controlling terminal.
|
||||||
func Start(c *exec.Cmd) (pty *os.File, err error) {
|
func Start(cmd *exec.Cmd) (*os.File, error) {
|
||||||
return StartWithSize(c, nil)
|
return StartWithSize(cmd, nil)
|
||||||
}
|
|
||||||
|
|
||||||
// StartWithSize assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout,
|
|
||||||
// and c.Stderr, calls c.Start, and returns the File of the tty's
|
|
||||||
// corresponding pty.
|
|
||||||
//
|
|
||||||
// This will resize the pty to the specified size before starting the command.
|
|
||||||
// Starts the process in a new session and sets the controlling terminal.
|
|
||||||
func StartWithSize(c *exec.Cmd, sz *Winsize) (pty *os.File, err error) {
|
|
||||||
if c.SysProcAttr == nil {
|
|
||||||
c.SysProcAttr = &syscall.SysProcAttr{}
|
|
||||||
}
|
|
||||||
c.SysProcAttr.Setsid = true
|
|
||||||
c.SysProcAttr.Setctty = true
|
|
||||||
return StartWithAttrs(c, sz, c.SysProcAttr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// StartWithAttrs assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout,
|
// StartWithAttrs assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout,
|
||||||
|
@ -41,16 +24,16 @@ func StartWithSize(c *exec.Cmd, sz *Winsize) (pty *os.File, err error) {
|
||||||
//
|
//
|
||||||
// This should generally not be needed. Used in some edge cases where it is needed to create a pty
|
// This should generally not be needed. Used in some edge cases where it is needed to create a pty
|
||||||
// without a controlling terminal.
|
// without a controlling terminal.
|
||||||
func StartWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (pty *os.File, err error) {
|
func StartWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (*os.File, error) {
|
||||||
pty, tty, err := Open()
|
pty, tty, err := Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer tty.Close()
|
defer func() { _ = tty.Close() }() // Best effort.
|
||||||
|
|
||||||
if sz != nil {
|
if sz != nil {
|
||||||
if err := Setsize(pty, sz); err != nil {
|
if err := Setsize(pty, sz); err != nil {
|
||||||
pty.Close()
|
_ = pty.Close() // Best effort.
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,7 +50,7 @@ func StartWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (pty *
|
||||||
c.SysProcAttr = attrs
|
c.SysProcAttr = attrs
|
||||||
|
|
||||||
if err := c.Start(); err != nil {
|
if err := c.Start(); err != nil {
|
||||||
_ = pty.Close()
|
_ = pty.Close() // Best effort.
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return pty, err
|
return pty, err
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StartWithSize assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout,
|
||||||
|
// and c.Stderr, calls c.Start, and returns the File of the tty's
|
||||||
|
// corresponding pty.
|
||||||
|
//
|
||||||
|
// This will resize the pty to the specified size before starting the command.
|
||||||
|
// Starts the process in a new session and sets the controlling terminal.
|
||||||
|
func StartWithSize(cmd *exec.Cmd, ws *Winsize) (*os.File, error) {
|
||||||
|
if cmd.SysProcAttr == nil {
|
||||||
|
cmd.SysProcAttr = &syscall.SysProcAttr{}
|
||||||
|
}
|
||||||
|
cmd.SysProcAttr.Setsid = true
|
||||||
|
cmd.SysProcAttr.Setctty = true
|
||||||
|
return StartWithAttrs(cmd, ws, cmd.SysProcAttr)
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StartWithSize assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout,
|
||||||
|
// and c.Stderr, calls c.Start, and returns the File of the tty's
|
||||||
|
// corresponding pty.
|
||||||
|
//
|
||||||
|
// This will resize the pty to the specified size before starting the command.
|
||||||
|
// Starts the process in a new session and sets the controlling terminal.
|
||||||
|
func StartWithSize(cmd *exec.Cmd, ws *Winsize) (*os.File, error) {
|
||||||
|
return nil, ErrUnsupported
|
||||||
|
}
|
|
@ -26,9 +26,9 @@ cross() {
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
cross linux amd64 386 arm arm64 ppc64 ppc64le s390x mips mipsle mips64 mips64le
|
cross linux amd64 386 arm arm64 ppc64 ppc64le s390x mips mipsle mips64 mips64le
|
||||||
cross darwin amd64 386 arm arm64
|
cross darwin amd64 arm64
|
||||||
cross freebsd amd64 386 arm
|
cross freebsd amd64 386 arm arm64
|
||||||
cross netbsd amd64 386 arm
|
cross netbsd amd64 386 arm arm64
|
||||||
cross openbsd amd64 386 arm arm64
|
cross openbsd amd64 386 arm arm64
|
||||||
cross dragonfly amd64
|
cross dragonfly amd64
|
||||||
cross solaris amd64
|
cross solaris amd64
|
||||||
|
@ -47,4 +47,18 @@ fi
|
||||||
|
|
||||||
echo2 "Build for linux."
|
echo2 "Build for linux."
|
||||||
echo2 " - linux/riscv"
|
echo2 " - linux/riscv"
|
||||||
docker build -t test -f Dockerfile.riscv .
|
docker build -t creack-pty-test -f Dockerfile.riscv .
|
||||||
|
|
||||||
|
# Golang dropped support for darwin 32bits since go1.15. Make sure the lib still compile with go1.14 on those archs.
|
||||||
|
echo2 "Build for darwin (32bits)."
|
||||||
|
echo2 " - darwin/386"
|
||||||
|
docker build -t creack-pty-test -f Dockerfile.golang --build-arg=GOVERSION=1.14 --build-arg=GOOS=darwin --build-arg=GOARCH=386 .
|
||||||
|
echo2 " - darwin/arm"
|
||||||
|
docker build -t creack-pty-test -f Dockerfile.golang --build-arg=GOVERSION=1.14 --build-arg=GOOS=darwin --build-arg=GOARCH=arm .
|
||||||
|
|
||||||
|
# Run a single test for an old go version. Would be best with go1.0, but not available on Dockerhub.
|
||||||
|
# Using 1.6 as it is the base version for the RISCV compiler.
|
||||||
|
# Would also be better to run all the tests, not just one, need to refactor this file to allow for specifc archs per version.
|
||||||
|
echo2 "Build for linux - go1.6."
|
||||||
|
echo2 " - linux/amd64"
|
||||||
|
docker build -t creack-pty-test -f Dockerfile.golang --build-arg=GOVERSION=1.6 --build-arg=GOOS=linux --build-arg=GOARCH=amd64 .
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
// +build !windows,!solaris
|
|
||||||
|
|
||||||
package pty
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// InheritSize applies the terminal size of pty to tty. This should be run
|
|
||||||
// in a signal handler for syscall.SIGWINCH to automatically resize the tty when
|
|
||||||
// the pty receives a window size change notification.
|
|
||||||
func InheritSize(pty, tty *os.File) error {
|
|
||||||
size, err := GetsizeFull(pty)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = Setsize(tty, size)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setsize resizes t to s.
|
|
||||||
func Setsize(t *os.File, ws *Winsize) error {
|
|
||||||
return windowRectCall(ws, t.Fd(), syscall.TIOCSWINSZ)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetsizeFull returns the full terminal size description.
|
|
||||||
func GetsizeFull(t *os.File) (size *Winsize, err error) {
|
|
||||||
var ws Winsize
|
|
||||||
err = windowRectCall(&ws, t.Fd(), syscall.TIOCGWINSZ)
|
|
||||||
return &ws, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Getsize returns the number of rows (lines) and cols (positions
|
|
||||||
// in each line) in terminal t.
|
|
||||||
func Getsize(t *os.File) (rows, cols int, err error) {
|
|
||||||
ws, err := GetsizeFull(t)
|
|
||||||
return int(ws.Rows), int(ws.Cols), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Winsize describes the terminal size.
|
|
||||||
type Winsize struct {
|
|
||||||
Rows uint16 // ws_row: Number of rows (in cells)
|
|
||||||
Cols uint16 // ws_col: Number of columns (in cells)
|
|
||||||
X uint16 // ws_xpixel: Width in pixels
|
|
||||||
Y uint16 // ws_ypixel: Height in pixels
|
|
||||||
}
|
|
||||||
|
|
||||||
func windowRectCall(ws *Winsize, fd, a2 uintptr) error {
|
|
||||||
_, _, errno := syscall.Syscall(
|
|
||||||
syscall.SYS_IOCTL,
|
|
||||||
fd,
|
|
||||||
a2,
|
|
||||||
uintptr(unsafe.Pointer(ws)),
|
|
||||||
)
|
|
||||||
if errno != 0 {
|
|
||||||
return syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
//
|
|
||||||
|
|
||||||
package pty
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
TIOCGWINSZ = 21608 // 'T' << 8 | 104
|
|
||||||
TIOCSWINSZ = 21607 // 'T' << 8 | 103
|
|
||||||
)
|
|
||||||
|
|
||||||
// Winsize describes the terminal size.
|
|
||||||
type Winsize struct {
|
|
||||||
Rows uint16 // ws_row: Number of rows (in cells)
|
|
||||||
Cols uint16 // ws_col: Number of columns (in cells)
|
|
||||||
X uint16 // ws_xpixel: Width in pixels
|
|
||||||
Y uint16 // ws_ypixel: Height in pixels
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetsizeFull returns the full terminal size description.
|
|
||||||
func GetsizeFull(t *os.File) (size *Winsize, err error) {
|
|
||||||
var wsz *unix.Winsize
|
|
||||||
wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else {
|
|
||||||
return &Winsize{wsz.Row, wsz.Col, wsz.Xpixel, wsz.Ypixel}, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get Windows Size
|
|
||||||
func Getsize(t *os.File) (rows, cols int, err error) {
|
|
||||||
var wsz *unix.Winsize
|
|
||||||
wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return 80, 25, err
|
|
||||||
} else {
|
|
||||||
return int(wsz.Row), int(wsz.Col), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setsize resizes t to s.
|
|
||||||
func Setsize(t *os.File, ws *Winsize) error {
|
|
||||||
wsz := unix.Winsize{ws.Rows, ws.Cols, ws.X, ws.Y}
|
|
||||||
return unix.IoctlSetWinsize(int(t.Fd()), TIOCSWINSZ, &wsz)
|
|
||||||
}
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package pty
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
// InheritSize applies the terminal size of pty to tty. This should be run
|
||||||
|
// in a signal handler for syscall.SIGWINCH to automatically resize the tty when
|
||||||
|
// the pty receives a window size change notification.
|
||||||
|
func InheritSize(pty, tty *os.File) error {
|
||||||
|
size, err := GetsizeFull(pty)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := Setsize(tty, size); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getsize returns the number of rows (lines) and cols (positions
|
||||||
|
// in each line) in terminal t.
|
||||||
|
func Getsize(t *os.File) (rows, cols int, err error) {
|
||||||
|
ws, err := GetsizeFull(t)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
return int(ws.Rows), int(ws.Cols), nil
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Winsize describes the terminal size.
|
||||||
|
type Winsize struct {
|
||||||
|
Rows uint16 // ws_row: Number of rows (in cells)
|
||||||
|
Cols uint16 // ws_col: Number of columns (in cells)
|
||||||
|
X uint16 // ws_xpixel: Width in pixels
|
||||||
|
Y uint16 // ws_ypixel: Height in pixels
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setsize resizes t to s.
|
||||||
|
func Setsize(t *os.File, ws *Winsize) error {
|
||||||
|
//nolint:gosec // Expected unsafe pointer for Syscall call.
|
||||||
|
return ioctl(t.Fd(), syscall.TIOCSWINSZ, uintptr(unsafe.Pointer(ws)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetsizeFull returns the full terminal size description.
|
||||||
|
func GetsizeFull(t *os.File) (size *Winsize, err error) {
|
||||||
|
var ws Winsize
|
||||||
|
|
||||||
|
//nolint:gosec // Expected unsafe pointer for Syscall call.
|
||||||
|
if err := ioctl(t.Fd(), syscall.TIOCGWINSZ, uintptr(unsafe.Pointer(&ws))); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ws, nil
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Winsize is a dummy struct to enable compilation on unsupported platforms.
|
||||||
|
type Winsize struct {
|
||||||
|
Rows, Cols, X, Y uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setsize resizes t to s.
|
||||||
|
func Setsize(*os.File, *Winsize) error {
|
||||||
|
return ErrUnsupported
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetsizeFull returns the full terminal size description.
|
||||||
|
func GetsizeFull(*os.File) (*Winsize, error) {
|
||||||
|
return nil, ErrUnsupported
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build 386
|
||||||
|
// +build 386
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types.go
|
// cgo -godefs types.go
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build amd64
|
||||||
|
// +build amd64
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types.go
|
// cgo -godefs types.go
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build arm
|
||||||
|
// +build arm
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types.go
|
// cgo -godefs types.go
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
//go:build arm64
|
||||||
|
// +build arm64
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types.go
|
// cgo -godefs types.go
|
||||||
|
|
||||||
// +build arm64
|
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build amd64 && dragonfly
|
||||||
|
// +build amd64,dragonfly
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types_dragonfly.go
|
// cgo -godefs types_dragonfly.go
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build 386 && freebsd
|
||||||
|
// +build 386,freebsd
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types_freebsd.go
|
// cgo -godefs types_freebsd.go
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build amd64 && freebsd
|
||||||
|
// +build amd64,freebsd
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types_freebsd.go
|
// cgo -godefs types_freebsd.go
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build arm && freebsd
|
||||||
|
// +build arm,freebsd
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types_freebsd.go
|
// cgo -godefs types_freebsd.go
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build arm64 && freebsd
|
||||||
|
// +build arm64,freebsd
|
||||||
|
|
||||||
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs types_freebsd.go
|
// cgo -godefs types_freebsd.go
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
|
// cgo -godefs types_freebsd.go
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
const (
|
||||||
|
_C_SPECNAMELEN = 0x3f
|
||||||
|
)
|
||||||
|
|
||||||
|
type fiodgnameArg struct {
|
||||||
|
Len int32
|
||||||
|
Pad_cgo_0 [4]byte
|
||||||
|
Buf *byte
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
//go:build loong64
|
||||||
|
// +build loong64
|
||||||
|
|
||||||
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
|
// cgo -godefs types.go
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
type (
|
||||||
|
_C_int int32
|
||||||
|
_C_uint uint32
|
||||||
|
)
|
|
@ -1,9 +1,10 @@
|
||||||
|
//go:build (mips || mipsle || mips64 || mips64le) && linux
|
||||||
|
// +build mips mipsle mips64 mips64le
|
||||||
|
// +build linux
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
// cgo -godefs types.go
|
// cgo -godefs types.go
|
||||||
|
|
||||||
// +build linux
|
|
||||||
// +build mips mipsle mips64 mips64le
|
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
//go:build (386 || amd64 || arm || arm64) && netbsd
|
||||||
|
// +build 386 amd64 arm arm64
|
||||||
|
// +build netbsd
|
||||||
|
|
||||||
|
package pty
|
||||||
|
|
||||||
|
type ptmget struct {
|
||||||
|
Cfd int32
|
||||||
|
Sfd int32
|
||||||
|
Cn [1024]int8
|
||||||
|
Sn [1024]int8
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ioctl_TIOCPTSNAME = 0x48087448
|
||||||
|
ioctl_TIOCGRANTPT = 0x20007447
|
||||||
|
)
|
|
@ -1,5 +1,6 @@
|
||||||
|
//go:build (386 || amd64 || arm || arm64 || mips64) && openbsd
|
||||||
|
// +build 386 amd64 arm arm64 mips64
|
||||||
// +build openbsd
|
// +build openbsd
|
||||||
// +build 386 amd64 arm arm64
|
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
//go:build ppc64
|
||||||
// +build ppc64
|
// +build ppc64
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
//go:build ppc64le
|
||||||
// +build ppc64le
|
// +build ppc64le
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
//go:build riscv || riscv64
|
||||||
|
// +build riscv riscv64
|
||||||
|
|
||||||
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs types.go
|
// cgo -godefs types.go
|
||||||
|
|
||||||
// +build riscv riscv64
|
|
||||||
|
|
||||||
package pty
|
package pty
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
//go:build s390x
|
||||||
// +build s390x
|
// +build s390x
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Created by cgo -godefs - DO NOT EDIT
|
||||||
|
|
|
@ -18,7 +18,7 @@ github.com/containerd/containerd/errdefs
|
||||||
github.com/containerd/containerd/log
|
github.com/containerd/containerd/log
|
||||||
github.com/containerd/containerd/pkg/userns
|
github.com/containerd/containerd/pkg/userns
|
||||||
github.com/containerd/containerd/platforms
|
github.com/containerd/containerd/platforms
|
||||||
# github.com/creack/pty v1.1.11
|
# github.com/creack/pty v1.1.18
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/creack/pty
|
github.com/creack/pty
|
||||||
# github.com/docker/distribution v2.8.1+incompatible
|
# github.com/docker/distribution v2.8.1+incompatible
|
||||||
|
|
Loading…
Reference in New Issue