Commit | Line | Data |
---|---|---|
57b90af7 JG |
1 | /* |
2 | * Copyright (C) 2023 Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: LGPL-2.1-only | |
5 | * | |
6 | */ | |
7 | ||
8 | #include <common/error.hpp> | |
9 | #include <common/format.hpp> | |
10 | ||
11 | #include <algorithm> | |
12 | ||
13 | #include <unistd.h> | |
14 | ||
15 | namespace lttng { | |
16 | ||
17 | /* | |
18 | * RAII wrapper around a UNIX file descriptor. A file_descriptor's underlying | |
19 | * file descriptor | |
20 | */ | |
21 | class file_descriptor { | |
22 | public: | |
23 | explicit file_descriptor(int raw_fd) noexcept : _raw_fd{raw_fd} | |
24 | { | |
25 | LTTNG_ASSERT(_is_valid_fd(_raw_fd)); | |
26 | } | |
27 | ||
28 | file_descriptor(const file_descriptor&) = delete; | |
29 | ||
cd9adb8b | 30 | file_descriptor(file_descriptor&& other) noexcept { |
57b90af7 JG |
31 | LTTNG_ASSERT(_is_valid_fd(_raw_fd)); |
32 | std::swap(_raw_fd, other._raw_fd); | |
33 | } | |
34 | ||
35 | ~file_descriptor() | |
36 | { | |
37 | if (!_is_valid_fd(_raw_fd)) { | |
38 | return; | |
39 | } | |
40 | ||
41 | const auto ret = ::close(_raw_fd); | |
42 | if (ret) { | |
88277a52 | 43 | PERROR("Failed to close file descriptor: fd=%i", _raw_fd); |
57b90af7 JG |
44 | } |
45 | } | |
46 | ||
47 | int fd() const noexcept | |
48 | { | |
49 | LTTNG_ASSERT(_is_valid_fd(_raw_fd)); | |
50 | return _raw_fd; | |
51 | } | |
52 | ||
53 | private: | |
54 | static bool _is_valid_fd(int fd) | |
55 | { | |
56 | return fd >= 0; | |
57 | } | |
58 | ||
cd9adb8b | 59 | int _raw_fd = -1; |
57b90af7 JG |
60 | }; |
61 | ||
88277a52 | 62 | } /* namespace lttng */ |