blob: ec10e6d1894ee9857386ee07dfd1734684b9958a [file] [log] [blame]
// Copyright 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include "base/Compiler.h"
#include <errno.h>
#ifdef _MSC_VER
#include "msvc-posix.h"
#else
#include <unistd.h>
#endif
namespace android {
namespace base {
// Helper class to hold an integer file descriptor, and have the 'close'
// function called automatically on scope exit, unless the 'release'
// method was called previously.
class ScopedFd {
public:
// Default constructor will hold an invalid descriptor.
ScopedFd() : fd_(-1) {}
// Constructor takes ownership of |fd|.
explicit ScopedFd(int fd) : fd_(fd) {}
// Make it movable.
ScopedFd(ScopedFd&& other) : fd_(other.fd_) {
other.fd_ = -1;
}
ScopedFd& operator=(ScopedFd&& other) {
swap(&other);
return *this;
}
// Destructor calls close().
~ScopedFd() { close(); }
// Return the file descriptor value, does _not_ transfer ownership.
int get() const { return fd_; }
// Return the file descriptor value, transfers ownership to the caller.
int release() {
int fd = fd_;
fd_ = -1;
return fd;
}
// Return true iff the file descriptor is valid.
bool valid() const { return fd_ >= 0; }
// Close the file descriptor (and make the wrapped value invalid).
void close() {
if (fd_ != -1) {
int save_errno = errno;
::close(fd_);
fd_ = -1;
errno = save_errno;
}
}
// Swap two ScopedFd instances.
void swap(ScopedFd* other) {
int fd = fd_;
fd_ = other->fd_;
other->fd_ = fd;
}
private:
DISALLOW_COPY_AND_ASSIGN(ScopedFd);
int fd_;
};
} // namespace base
} // namespace android