From a3c868879c7cd7f52b206246d9839b60cc3dbeb9 Mon Sep 17 00:00:00 2001
From: Josh Gao <jmgao@google.com>
Date: Tue, 4 Sep 2018 11:05:08 -0700
Subject: [PATCH] libbase: add Fdopen that takes a unique_fd.

Using fdopen with unique_fd correctly is more annoying than it should
be, because fdopen doesn't close the file descriptor received upon
failure, which means you have to something like the following:

    unique_fd ufd = ...;
    int fd = ufd.release();
    FILE* file = fdopen(fd, "...");
    if (!file) {
        close(fd);
        return;
    }

Add an android::base::Fdopen that does that dance for you.

Bug: http://b/113880863
Test: treehugger
Change-Id: I6325acf1ff06484005c1053fe09672c5eeeecaa1
---
 base/include/android-base/unique_fd.h | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/base/include/android-base/unique_fd.h b/base/include/android-base/unique_fd.h
index c6936f137f..71025adc23 100644
--- a/base/include/android-base/unique_fd.h
+++ b/base/include/android-base/unique_fd.h
@@ -22,6 +22,7 @@
 #include <sys/socket.h>
 #endif
 
+#include <stdio.h>
 #include <sys/types.h>
 #include <unistd.h>
 
@@ -199,6 +200,17 @@ inline bool Socketpair(int type, unique_fd_impl<Closer>* left, unique_fd_impl<Cl
   return Socketpair(AF_UNIX, type, 0, left, right);
 }
 
+// Using fdopen with unique_fd correctly is more annoying than it should be,
+// because fdopen doesn't close the file descriptor received upon failure.
+inline FILE* Fdopen(unique_fd&& ufd, const char* mode) {
+  int fd = ufd.release();
+  FILE* file = fdopen(fd, mode);
+  if (!file) {
+    close(fd);
+  }
+  return file;
+}
+
 #endif  // !defined(_WIN32)
 
 }  // namespace base
-- 
GitLab