[Sanitizer]: add __sanitizer_set_report_fd function to alter file descriptor for...
authorAlexey Samsonov <samsonov@google.com>
Fri, 2 Nov 2012 09:23:36 +0000 (09:23 +0000)
committerAlexey Samsonov <samsonov@google.com>
Fri, 2 Nov 2012 09:23:36 +0000 (09:23 +0000)
llvm-svn: 167290

compiler-rt/include/sanitizer/common_interface_defs.h
compiler-rt/lib/sanitizer_common/sanitizer_common.cc

index cbce63f..4666318 100644 (file)
@@ -63,6 +63,11 @@ extern "C" {
   // Tell the tools to write their reports to "path.<pid>" instead of stderr.
   void __sanitizer_set_report_path(const char *path)
       SANITIZER_INTERFACE_ATTRIBUTE;
+
+  // Tell the tools to write their reports to given file descriptor instead of
+  // stderr.
+  void __sanitizer_set_report_fd(int fd)
+      SANITIZER_INTERFACE_ATTRIBUTE;
 }  // extern "C"
 
 #endif  // SANITIZER_COMMON_INTERFACE_DEFS_H
index 614b7b9..e6526f5 100644 (file)
@@ -16,7 +16,9 @@
 
 namespace __sanitizer {
 
-static fd_t report_fd = 2;  // By default, dump to stderr.
+// By default, dump to stderr. If report_fd is kInvalidFd, try to obtain file
+// descriptor by opening file in report_path.
+static fd_t report_fd = 2;
 static char report_path[4096];  // Set via __sanitizer_set_report_path.
 
 static void (*DieCallback)(void);
@@ -138,6 +140,10 @@ void SortArray(uptr *array, uptr size) {
 
 }  // namespace __sanitizer
 
+using namespace __sanitizer;  // NOLINT
+
+extern "C" {
+
 void __sanitizer_set_report_path(const char *path) {
   if (!path) return;
   uptr len = internal_strlen(path);
@@ -151,3 +157,11 @@ void __sanitizer_set_report_path(const char *path) {
                     sizeof(__sanitizer::report_path), "%s.%d", path, GetPid());
   __sanitizer::report_fd = kInvalidFd;
 }
+
+void __sanitizer_set_report_fd(int fd) {
+  if (__sanitizer::report_fd > 2 && __sanitizer::report_fd != kInvalidFd)
+    internal_close(__sanitizer::report_fd);
+  __sanitizer::report_fd = fd;
+}
+
+}  // extern "C"