diff --git a/base/include/android-base/unique_fd.h b/base/include/android-base/unique_fd.h index c6936f137fb2ea7c0a224a40ab913a42152491ed..71025adc23036a035a0aa28e97f60165347a8ace 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