summaryrefslogtreecommitdiffstats
path: root/unique_fd.h
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2015-08-07 03:35:05 +0200
committerTao Bao <tbao@google.com>2015-08-10 07:35:49 +0200
commitc754792a07d340c30128b2fd064a58b1f15623da (patch)
treeca0ba3c1e36c65ae807705da26feb13bfb3f047f /unique_fd.h
parentMerge "Use CPPFLAGS instead of CFLAGS." (diff)
downloadandroid_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.tar
android_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.tar.gz
android_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.tar.bz2
android_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.tar.lz
android_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.tar.xz
android_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.tar.zst
android_bootable_recovery-c754792a07d340c30128b2fd064a58b1f15623da.zip
Diffstat (limited to '')
-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