int uv_stdio_pipe_server(uv_pipe_t* handle, DWORD access, char* name, size_t nameSize) { HANDLE pipeHandle; int errno; int err; char* ptr = (char*)handle; while (TRUE) { uv_unique_pipe_name(ptr, name, nameSize); pipeHandle = CreateNamedPipeA(name, access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { /* No name collisions. We're done. */ break; } errno = GetLastError(); if (errno != ERROR_PIPE_BUSY && errno != ERROR_ACCESS_DENIED) { uv_set_sys_error(errno); err = -1; goto done; } /* Pipe name collision. Increment the pointer and try again. */ ptr++; } if (CreateIoCompletionPort(pipeHandle, LOOP->iocp, (ULONG_PTR)handle, 0) == NULL) { uv_set_sys_error(GetLastError()); err = -1; goto done; } uv_connection_init((uv_stream_t*)handle); handle->handle = pipeHandle; handle->flags |= UV_HANDLE_GIVEN_OS_HANDLE; err = 0; done: if (err && pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); } return err; }
uv_err_t uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, char* name, size_t nameSize) { HANDLE pipeHandle; int errorno; uv_err_t err; char* ptr = (char*)handle; for (;;) { uv_unique_pipe_name(ptr, name, nameSize); pipeHandle = CreateNamedPipeA(name, access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0, NULL); if (pipeHandle != INVALID_HANDLE_VALUE) { /* No name collisions. We're done. */ break; } errorno = GetLastError(); if (errorno != ERROR_PIPE_BUSY && errorno != ERROR_ACCESS_DENIED) { err = uv__new_sys_error(errorno); goto error; } /* Pipe name collision. Increment the pointer and try again. */ ptr++; } if (CreateIoCompletionPort(pipeHandle, loop->iocp, (ULONG_PTR)handle, 0) == NULL) { err = uv__new_sys_error(GetLastError()); goto error; } uv_pipe_connection_init(handle); handle->handle = pipeHandle; return uv_ok_; error: if (pipeHandle != INVALID_HANDLE_VALUE) { CloseHandle(pipeHandle); } return err; }