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 | ||
30 | file_descriptor(file_descriptor&& other) : _raw_fd{-1} | |
31 | { | |
32 | LTTNG_ASSERT(_is_valid_fd(_raw_fd)); | |
33 | std::swap(_raw_fd, other._raw_fd); | |
34 | } | |
35 | ||
36 | ~file_descriptor() | |
37 | { | |
38 | if (!_is_valid_fd(_raw_fd)) { | |
39 | return; | |
40 | } | |
41 | ||
42 | const auto ret = ::close(_raw_fd); | |
43 | if (ret) { | |
88277a52 | 44 | PERROR("Failed to close file descriptor: fd=%i", _raw_fd); |
57b90af7 JG |
45 | } |
46 | } | |
47 | ||
48 | int fd() const noexcept | |
49 | { | |
50 | LTTNG_ASSERT(_is_valid_fd(_raw_fd)); | |
51 | return _raw_fd; | |
52 | } | |
53 | ||
54 | private: | |
55 | static bool _is_valid_fd(int fd) | |
56 | { | |
57 | return fd >= 0; | |
58 | } | |
59 | ||
60 | int _raw_fd; | |
61 | }; | |
62 | ||
88277a52 | 63 | } /* namespace lttng */ |