winapi_common
pipe.cpp
1 // Copyright (c) 2020 Egor Tensin <Egor.Tensin@gmail.com>
2 // This file is part of the "winapi-common" project.
3 // For details, see https://github.com/egor-tensin/winapi-common.
4 // Distributed under the MIT License.
5 
6 #include <winapi/error.hpp>
7 #include <winapi/handle.hpp>
8 #include <winapi/pipe.hpp>
9 
10 #include <windows.h>
11 
12 #include <cstring>
13 #include <utility>
14 
15 namespace winapi {
16 namespace {
17 
18 void create_pipe(Handle& read_end, Handle& write_end) {
19  HANDLE read_end_impl = INVALID_HANDLE_VALUE;
20  HANDLE write_end_impl = INVALID_HANDLE_VALUE;
21 
22  SECURITY_ATTRIBUTES attributes;
23  std::memset(&attributes, 0, sizeof(attributes));
24  attributes.nLength = sizeof(attributes);
25  attributes.bInheritHandle = TRUE;
26 
27  static constexpr DWORD buffer_size = 16 * 1024;
28 
29  const auto ret = ::CreatePipe(&read_end_impl, &write_end_impl, &attributes, buffer_size);
30 
31  if (!ret) {
32  throw error::windows(GetLastError(), "CreatePipe");
33  }
34 
35  read_end = Handle{read_end_impl};
36  write_end = Handle{write_end_impl};
37 }
38 
39 } // namespace
40 
42  create_pipe(m_read_end, m_write_end);
43 }
44 
45 } // namespace winapi
Make std::system_error work with GetLastError().