podman

Форк
0
64 строки · 1.3 Кб
1
//go:build freebsd && cgo
2
// +build freebsd,cgo
3

4
package chroot
5

6
// #include <fcntl.h>
7
// #include <stdlib.h>
8
import "C"
9

10
import (
11
	"github.com/sirupsen/logrus"
12
	"golang.org/x/sys/unix"
13
)
14

15
func openpt() (int, error) {
16
	fd, err := C.posix_openpt(C.O_RDWR)
17
	if err != nil {
18
		return -1, err
19
	}
20
	if _, err := C.grantpt(fd); err != nil {
21
		return -1, err
22
	}
23
	return int(fd), nil
24
}
25

26
func ptsname(fd int) (string, error) {
27
	path, err := C.ptsname(C.int(fd))
28
	if err != nil {
29
		return "", err
30
	}
31
	return C.GoString(path), nil
32
}
33

34
func unlockpt(fd int) error {
35
	if _, err := C.unlockpt(C.int(fd)); err != nil {
36
		return err
37
	}
38
	return nil
39
}
40

41
func getPtyDescriptors() (int, int, error) {
42
	// Create a pseudo-terminal and open the control side
43
	controlFd, err := openpt()
44
	if err != nil {
45
		logrus.Errorf("error opening PTY control side using posix_openpt: %v", err)
46
		return -1, -1, err
47
	}
48
	if err = unlockpt(controlFd); err != nil {
49
		logrus.Errorf("error unlocking PTY: %v", err)
50
		return -1, -1, err
51
	}
52
	// Get a handle for the other end.
53
	ptyName, err := ptsname(controlFd)
54
	if err != nil {
55
		logrus.Errorf("error getting PTY name: %v", err)
56
		return -1, -1, err
57
	}
58
	ptyFd, err := unix.Open(ptyName, unix.O_RDWR, 0)
59
	if err != nil {
60
		logrus.Errorf("error opening PTY: %v", err)
61
		return -1, -1, err
62
	}
63
	return controlFd, ptyFd, nil
64
}
65

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

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

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

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