//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 }