Index: base/files/file_util_posix.cc |
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc |
index 34a1c4d1e6e2481a953ad2fac5d30ddb124ca3cd..915e6fe7f057e1467bfe0bc69b2f078f0cd49bc9 100644 |
--- a/base/files/file_util_posix.cc |
+++ b/base/files/file_util_posix.cc |
@@ -185,6 +185,21 @@ bool DetermineDevShmExecutable() { |
#endif // defined(OS_LINUX) |
#endif // !defined(OS_NACL_NONSFI) |
+// Appends |mode_char| to |mode| before the optional character set encoding for |
+// non-Mac platforms (which do not support this); see |
Mark Mentovai
2017/02/09 15:15:16
Why even bother defining this on Mac? Since you ne
grt (UTC plus 2)
2017/02/10 09:37:21
Done.
|
+// https://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html for |
+// details. |
+std::string AppendModeCharacter(StringPiece mode, char mode_char) { |
+ // Add |mode_char| immediately before the comma or at the end of the string. |
+ std::string result(mode.as_string()); |
+#if !defined(OS_MACOSX) |
+ size_t comma_pos = result.find(L','); |
Mark Mentovai
2017/02/09 15:15:16
No L
grt (UTC plus 2)
2017/02/10 09:37:21
Done.
|
+ result.insert(comma_pos == std::string::npos ? result.length() : comma_pos, 1, |
+ mode_char); |
+#endif |
+ return result; |
+} |
+ |
} // namespace |
#if !defined(OS_NACL_NONSFI) |
@@ -710,11 +725,22 @@ bool GetFileInfo(const FilePath& file_path, File::Info* results) { |
#endif // !defined(OS_NACL_NONSFI) |
FILE* OpenFile(const FilePath& filename, const char* mode) { |
+ // 'e' is unconditionally added below, so be sure there is not one already |
+ // present before a comma in |mode|. |
+ DCHECK(::strchr(mode, 'e') == nullptr || |
Mark Mentovai
2017/02/09 15:15:16
No ::
grt (UTC plus 2)
2017/02/10 09:37:21
Done.
|
+ (::strchr(mode, ',') != nullptr && |
+ ::strchr(mode, 'e') > ::strchr(mode, ','))); |
ThreadRestrictions::AssertIOAllowed(); |
FILE* result = NULL; |
+ std::string mode_with_e(AppendModeCharacter(mode, 'e')); |
do { |
- result = fopen(filename.value().c_str(), mode); |
+ result = fopen(filename.value().c_str(), mode_with_e.c_str()); |
} while (!result && errno == EINTR); |
+#if defined(OS_MACOSX) |
+ // Mark the descriptor as close-on-exec. |
+ if (result) |
+ SetCloseOnExec(fileno(result)); |
+#endif |
return result; |
} |