| //go:build openbsd |
| // +build openbsd |
| |
| package pty |
| |
| import ( |
| "os" |
| "syscall" |
| "unsafe" |
| ) |
| |
| func cInt8ToString(in []int8) string { |
| var s []byte |
| for _, v := range in { |
| if v == 0 { |
| break |
| } |
| s = append(s, byte(v)) |
| } |
| return string(s) |
| } |
| |
| func open() (pty, tty *os.File, err error) { |
| /* |
| * from ptm(4): |
| * The PTMGET command allocates a free pseudo terminal, changes its |
| * ownership to the caller, revokes the access privileges for all previous |
| * users, opens the file descriptors for the pty and tty devices and |
| * returns them to the caller in struct ptmget. |
| */ |
| |
| p, err := os.OpenFile("/dev/ptm", os.O_RDWR|syscall.O_CLOEXEC, 0) |
| if err != nil { |
| return nil, nil, err |
| } |
| defer p.Close() |
| |
| var ptm ptmget |
| if err := ioctl(p, uintptr(ioctl_PTMGET), uintptr(unsafe.Pointer(&ptm))); err != nil { |
| return nil, nil, err |
| } |
| |
| pty = os.NewFile(uintptr(ptm.Cfd), cInt8ToString(ptm.Cn[:])) |
| tty = os.NewFile(uintptr(ptm.Sfd), cInt8ToString(ptm.Sn[:])) |
| |
| return pty, tty, nil |
| } |