summaryrefslogtreecommitdiffstats
path: root/unique_fd.h
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2015-08-10 19:42:31 +0200
committerAndroid Git Automerger <android-git-automerger@android.com>2015-08-10 19:42:31 +0200
commit0d42440ecb1c664862eaa7848cc45fb7ff0fb514 (patch)
tree2b25c25add816abf9d7e56d0dc48a5ef6def7901 /unique_fd.h
parentam 7f89389a: am 7c511184: Merge "updater: Clean up char* with std::string." (diff)
parentam 0d46c7ab: Merge "Use unique_ptr and unique_fd to manager FDs." (diff)
downloadandroid_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.h73
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