pipe_windows.odin 749 B

1234567891011121314151617181920212223242526272829
  1. #+private
  2. package os2
  3. import win32 "core:sys/windows"
  4. _pipe :: proc() -> (r, w: ^File, err: Error) {
  5. p: [2]win32.HANDLE
  6. sa := win32.SECURITY_ATTRIBUTES {
  7. nLength = size_of(win32.SECURITY_ATTRIBUTES),
  8. bInheritHandle = true,
  9. }
  10. if !win32.CreatePipe(&p[0], &p[1], &sa, 0) {
  11. return nil, nil, _get_platform_error()
  12. }
  13. return new_file(uintptr(p[0]), ""), new_file(uintptr(p[1]), ""), nil
  14. }
  15. @(require_results)
  16. _pipe_has_data :: proc(r: ^File) -> (ok: bool, err: Error) {
  17. if r == nil || r.impl == nil {
  18. return false, nil
  19. }
  20. handle := win32.HANDLE((^File_Impl)(r.impl).fd)
  21. bytes_available: u32
  22. if !win32.PeekNamedPipe(handle, nil, 0, nil, &bytes_available, nil) {
  23. return false, _get_platform_error()
  24. }
  25. return bytes_available > 0, nil
  26. }