podman

Форк
0
47 строк · 1.6 Кб
1
//go:build linux
2
// +build linux
3

4
package chroot
5

6
import (
7
	"fmt"
8
	"os"
9
	"syscall"
10
	"unsafe"
11

12
	"golang.org/x/sys/unix"
13
)
14

15
// Open a PTY using the /dev/ptmx device. The main advantage of using
16
// this instead of posix_openpt is that it avoids cgo.
17
func getPtyDescriptors() (int, int, error) {
18
	// Create a pseudo-terminal -- open a copy of the master side.
19
	controlFd, err := unix.Open("/dev/ptmx", os.O_RDWR, 0600)
20
	if err != nil {
21
		return -1, -1, fmt.Errorf("opening PTY master using /dev/ptmx: %v", err)
22
	}
23
	// Set the kernel's lock to "unlocked".
24
	locked := 0
25
	if result, _, err := unix.Syscall(unix.SYS_IOCTL, uintptr(controlFd), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&locked))); int(result) == -1 {
26
		return -1, -1, fmt.Errorf("unlocking PTY descriptor: %v", err)
27
	}
28
	// Get a handle for the other end.
29
	ptyFd, _, err := unix.Syscall(unix.SYS_IOCTL, uintptr(controlFd), unix.TIOCGPTPEER, unix.O_RDWR|unix.O_NOCTTY)
30
	if int(ptyFd) == -1 {
31
		if errno, isErrno := err.(syscall.Errno); !isErrno || (errno != syscall.EINVAL && errno != syscall.ENOTTY) {
32
			return -1, -1, fmt.Errorf("getting PTY descriptor: %v", err)
33
		}
34
		// EINVAL means the kernel's too old to understand TIOCGPTPEER.  Try TIOCGPTN.
35
		ptyN, err := unix.IoctlGetInt(controlFd, unix.TIOCGPTN)
36
		if err != nil {
37
			return -1, -1, fmt.Errorf("getting PTY number: %v", err)
38
		}
39
		ptyName := fmt.Sprintf("/dev/pts/%d", ptyN)
40
		fd, err := unix.Open(ptyName, unix.O_RDWR|unix.O_NOCTTY, 0620)
41
		if err != nil {
42
			return -1, -1, fmt.Errorf("opening PTY %q: %v", ptyName, err)
43
		}
44
		ptyFd = uintptr(fd)
45
	}
46
	return controlFd, int(ptyFd), nil
47
}
48

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.