// TODO: Finish porting #+ignore // Based on implementations from musl libc: https://musl.libc.org // // MIT License: // // Copyright © 2005-2020 Rich Felker, et al. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. package tcom import "core:fmt" import "core:sys/posix" import "core:sys/linux" openpty :: proc(pm, ps: ^posix.FD, tio: ^posix.termios, allocator := context.temp_allocator) -> (success: bool) { cs: posix.Cancel_State m := posix.open("/dev/ptmx", {.RDWR, .NOCTTY}); if m < 0 do return false; defer if !success do posix.close(m) posix.pthread_setcancelstate(.DISABLE, &cs); defer posix.pthread_setcancelstate(cs, nil) TIOCSPTLCK :: 0x40045431 TIOCGPTN :: 0x80045430 n: int if linux.ioctl(linux.Fd(m), TIOCSPTLCK, uintptr(&n)) != 0 || linux.ioctl(linux.Fd(m), TIOCGPTN, uintptr(&n)) != 0 { return false } buf: [20]byte fmt.bprintf(buf[:], "/dev/pts/%d", n); buf[len(buf)-1] = 0 // Ensure null terminator s := posix.open(cstring(raw_data(buf[:])), {.RDWR, .NOCTTY}) if s < 0 do return false // if tio != nil do libc.tcsetattr(s, TCSANOW, tio) // // if (ws) ioctl(s, TIOCSWINSZ, ws); pm^ = m ps^ = s return true; } forkpty :: proc()