10c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//===-- sanitizer_common_libcdep.cc ---------------------------------------===//
20c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//
30c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//                     The LLVM Compiler Infrastructure
40c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//
50c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// This file is distributed under the University of Illinois Open Source
60c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// License. See LICENSE.TXT for details.
70c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//
80c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//===----------------------------------------------------------------------===//
90c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//
100c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// This file is shared between AddressSanitizer and ThreadSanitizer
110c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// run-time libraries.
120c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//===----------------------------------------------------------------------===//
130c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne
140c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne#include "sanitizer_common.h"
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_flags.h"
160c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne
170c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbournenamespace __sanitizer {
180c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne
190c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbournebool PrintsToTty() {
200c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne  MaybeOpenReportFile();
215e97ba38b00eb843a55189bb913b445cbe620894Timur Iskhodzhanov  return internal_isatty(report_fd) != 0;
220c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne}
230c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne
24650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveevbool PrintsToTtyCached() {
25650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  // FIXME: Add proper Windows support to AnsiColorDecorator and re-enable color
26650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  // printing on Windows.
27650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  if (SANITIZER_WINDOWS)
28650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev    return 0;
29650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev
30650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  static int cached = 0;
31650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  static bool prints_to_tty;
32650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  if (!cached) {  // Not thread-safe.
33650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev    prints_to_tty = PrintsToTty();
34650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev    cached = 1;
35650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  }
36650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev  return prints_to_tty;
37650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev}
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesbool ColorizeReports() {
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const char *flag = common_flags()->color;
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return internal_strcmp(flag, "always") == 0 ||
422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines         (internal_strcmp(flag, "auto") == 0 && PrintsToTtyCached());
432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void (*sandboxing_callback)();
462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid SetSandboxingCallback(void (*f)()) {
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  sandboxing_callback = f;
482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
500c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne}  // namespace __sanitizer
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid NOINLINE
532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__sanitizer_sandbox_on_notify(__sanitizer_sandbox_arguments *args) {
542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  PrepareForSandboxing(args);
552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (sandboxing_callback)
562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    sandboxing_callback();
572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
58