1*387f9dfdSAndroid Build Coastguard Worker /* 2*387f9dfdSAndroid Build Coastguard Worker * Copyright (c) 2017 Facebook, Inc. 3*387f9dfdSAndroid Build Coastguard Worker * 4*387f9dfdSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*387f9dfdSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*387f9dfdSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*387f9dfdSAndroid Build Coastguard Worker * 8*387f9dfdSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*387f9dfdSAndroid Build Coastguard Worker * 10*387f9dfdSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*387f9dfdSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*387f9dfdSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*387f9dfdSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*387f9dfdSAndroid Build Coastguard Worker * limitations under the License. 15*387f9dfdSAndroid Build Coastguard Worker */ 16*387f9dfdSAndroid Build Coastguard Worker 17*387f9dfdSAndroid Build Coastguard Worker #pragma once 18*387f9dfdSAndroid Build Coastguard Worker 19*387f9dfdSAndroid Build Coastguard Worker #include <unistd.h> 20*387f9dfdSAndroid Build Coastguard Worker 21*387f9dfdSAndroid Build Coastguard Worker namespace ebpf { 22*387f9dfdSAndroid Build Coastguard Worker 23*387f9dfdSAndroid Build Coastguard Worker /// FileDesc is a helper class for managing open file descriptors. Copy is 24*387f9dfdSAndroid Build Coastguard Worker /// disallowed (call dup instead), and cleanup happens automatically. 25*387f9dfdSAndroid Build Coastguard Worker class FileDesc { 26*387f9dfdSAndroid Build Coastguard Worker public: fd_(fd)27*387f9dfdSAndroid Build Coastguard Worker explicit FileDesc(int fd = -1) : fd_(fd) {} FileDesc(FileDesc && that)28*387f9dfdSAndroid Build Coastguard Worker FileDesc(FileDesc &&that) : fd_(-1) { *this = std::move(that); } 29*387f9dfdSAndroid Build Coastguard Worker FileDesc(const FileDesc &that) = delete; 30*387f9dfdSAndroid Build Coastguard Worker ~FileDesc()31*387f9dfdSAndroid Build Coastguard Worker ~FileDesc() { 32*387f9dfdSAndroid Build Coastguard Worker if (fd_ >= 0) 33*387f9dfdSAndroid Build Coastguard Worker ::close(fd_); 34*387f9dfdSAndroid Build Coastguard Worker } 35*387f9dfdSAndroid Build Coastguard Worker 36*387f9dfdSAndroid Build Coastguard Worker FileDesc &operator=(int fd) { 37*387f9dfdSAndroid Build Coastguard Worker if (fd_ >= 0) 38*387f9dfdSAndroid Build Coastguard Worker ::close(fd_); 39*387f9dfdSAndroid Build Coastguard Worker fd_ = fd; 40*387f9dfdSAndroid Build Coastguard Worker return *this; 41*387f9dfdSAndroid Build Coastguard Worker } 42*387f9dfdSAndroid Build Coastguard Worker FileDesc &operator=(FileDesc &&that) { 43*387f9dfdSAndroid Build Coastguard Worker if (fd_ >= 0) 44*387f9dfdSAndroid Build Coastguard Worker ::close(fd_); 45*387f9dfdSAndroid Build Coastguard Worker fd_ = that.fd_; 46*387f9dfdSAndroid Build Coastguard Worker that.fd_ = -1; 47*387f9dfdSAndroid Build Coastguard Worker return *this; 48*387f9dfdSAndroid Build Coastguard Worker } 49*387f9dfdSAndroid Build Coastguard Worker FileDesc &operator=(const FileDesc &that) = delete; 50*387f9dfdSAndroid Build Coastguard Worker dup()51*387f9dfdSAndroid Build Coastguard Worker FileDesc dup() const { 52*387f9dfdSAndroid Build Coastguard Worker if (fd_ >= 0) { 53*387f9dfdSAndroid Build Coastguard Worker int dup_fd = ::dup(fd_); 54*387f9dfdSAndroid Build Coastguard Worker return FileDesc(dup_fd); 55*387f9dfdSAndroid Build Coastguard Worker } else { 56*387f9dfdSAndroid Build Coastguard Worker return FileDesc(-1); 57*387f9dfdSAndroid Build Coastguard Worker } 58*387f9dfdSAndroid Build Coastguard Worker } 59*387f9dfdSAndroid Build Coastguard Worker 60*387f9dfdSAndroid Build Coastguard Worker operator int() { return fd_; } 61*387f9dfdSAndroid Build Coastguard Worker operator int() const { return fd_; } 62*387f9dfdSAndroid Build Coastguard Worker 63*387f9dfdSAndroid Build Coastguard Worker private: 64*387f9dfdSAndroid Build Coastguard Worker int fd_; 65*387f9dfdSAndroid Build Coastguard Worker }; 66*387f9dfdSAndroid Build Coastguard Worker 67*387f9dfdSAndroid Build Coastguard Worker } // namespace ebpf 68