1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 namespace android {
20 namespace automotive {
21 namespace evs {
22 namespace V1_1 {
23 namespace implementation {
24 
25 // This is a simple C++ wrapper around a POSIX file descriptor. It is meant to
26 // enforce ownership just like unique_ptr<T>
27 //
28 // Instances of this type cannot be copied, but they can be moved.
29 class UniqueFd {
30 public:
31     UniqueFd();
32     explicit UniqueFd(int fd);
33     ~UniqueFd();
34     UniqueFd(UniqueFd&&);
35     UniqueFd& operator=(UniqueFd&&);
36 
37     // Destroy the current descriptor, and take ownership of a new one.
38     void Reset(int new_fd = -1);
39 
40     // Duplicate the current descriptor.
41     UniqueFd Dup() const;
42 
43     // Returns true if the descriptor is valid. False otherwise.
44     explicit operator bool() const;
45 
46     // Gets the descriptor
47     int Get() const;
48 
49     // Gets a unowned duplicate of the descriptor. The caller is responsible for
50     // closing it.
51     int GetUnowned() const;
52 
53     // Gets the descriptor and releases ownership. The caller is responsible for
54     // closing it.
55     int Release();
56 
57 private:
58     UniqueFd(const UniqueFd&) = delete;
59     UniqueFd& operator=(const UniqueFd&) = delete;
60 
61     void InternalClose();
62     int InternalDup() const;
63 
64     int fd_;
65 };
66 
67 }  // namespace implementation
68 }  // namespace V1_1
69 }  // namespace evs
70 }  // namespace automotive
71 }  // namespace android
72 
73