diff options
author | Tao Bao <tbao@google.com> | 2015-08-10 19:42:31 +0200 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-08-10 19:42:31 +0200 |
commit | 0d42440ecb1c664862eaa7848cc45fb7ff0fb514 (patch) | |
tree | 2b25c25add816abf9d7e56d0dc48a5ef6def7901 /unique_fd.h | |
parent | am 7f89389a: am 7c511184: Merge "updater: Clean up char* with std::string." (diff) | |
parent | am 0d46c7ab: Merge "Use unique_ptr and unique_fd to manager FDs." (diff) | |
download | android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.tar android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.tar.gz android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.tar.bz2 android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.tar.lz android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.tar.xz android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.tar.zst android_bootable_recovery-0d42440ecb1c664862eaa7848cc45fb7ff0fb514.zip |
Diffstat (limited to 'unique_fd.h')
-rw-r--r-- | unique_fd.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/unique_fd.h b/unique_fd.h new file mode 100644 index 000000000..98a7c7b67 --- /dev/null +++ b/unique_fd.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 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. + */ + +#ifndef UNIQUE_FD_H +#define UNIQUE_FD_H + +#include <stdio.h> + +#include <memory> + +class unique_fd { + public: + unique_fd(int fd) : fd_(fd) { } + + unique_fd(unique_fd&& uf) { + fd_ = uf.fd_; + uf.fd_ = -1; + } + + ~unique_fd() { + if (fd_ != -1) { + close(fd_); + } + } + + int get() { + return fd_; + } + + // Movable. + unique_fd& operator=(unique_fd&& uf) { + fd_ = uf.fd_; + uf.fd_ = -1; + return *this; + } + + explicit operator bool() const { + return fd_ != -1; + } + + private: + int fd_; + + // Non-copyable. + unique_fd(const unique_fd&) = delete; + unique_fd& operator=(const unique_fd&) = delete; +}; + +// Custom deleter for unique_file to avoid fclose(NULL). +struct safe_fclose { + void operator()(FILE *fp) const { + if (fp) { + fclose(fp); + }; + } +}; + +using unique_file = std::unique_ptr<FILE, safe_fclose>; + +#endif // UNIQUE_FD_H |