| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmGetPipes.h" |
| |
| #include <cm3p/uv.h> |
| #include <fcntl.h> |
| |
| #if defined(_WIN32) && !defined(__CYGWIN__) |
| # include <io.h> |
| |
| int cmGetPipes(int* fds) |
| { |
| SECURITY_ATTRIBUTES attr; |
| HANDLE readh, writeh; |
| attr.nLength = sizeof(attr); |
| attr.lpSecurityDescriptor = nullptr; |
| attr.bInheritHandle = FALSE; |
| if (!CreatePipe(&readh, &writeh, &attr, 0)) |
| return uv_translate_sys_error(GetLastError()); |
| fds[0] = _open_osfhandle((intptr_t)readh, 0); |
| fds[1] = _open_osfhandle((intptr_t)writeh, 0); |
| if (fds[0] == -1 || fds[1] == -1) { |
| CloseHandle(readh); |
| CloseHandle(writeh); |
| return uv_translate_sys_error(GetLastError()); |
| } |
| return 0; |
| } |
| #else |
| # include <cerrno> |
| |
| # include <unistd.h> |
| |
| int cmGetPipes(int* fds) |
| { |
| if (pipe(fds) == -1) { |
| return uv_translate_sys_error(errno); |
| } |
| |
| if (fcntl(fds[0], F_SETFD, FD_CLOEXEC) == -1 || |
| fcntl(fds[1], F_SETFD, FD_CLOEXEC) == -1) { |
| close(fds[0]); |
| close(fds[1]); |
| return uv_translate_sys_error(errno); |
| } |
| return 0; |
| } |
| #endif |