master
  1//===-- sanitizer_file.h ---------------------------------------*- C++ -*-===//
  2//
  3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4// See https://llvm.org/LICENSE.txt for license information.
  5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6//
  7//===---------------------------------------------------------------------===//
  8//
  9// This file is shared between run-time libraries of sanitizers.
 10// It declares filesystem-related interfaces.  This is separate from
 11// sanitizer_common.h so that it's simpler to disable all the filesystem
 12// support code for a port that doesn't use it.
 13//
 14//===---------------------------------------------------------------------===//
 15#ifndef SANITIZER_FILE_H
 16#define SANITIZER_FILE_H
 17
 18#include "sanitizer_common.h"
 19#include "sanitizer_internal_defs.h"
 20#include "sanitizer_libc.h"
 21#include "sanitizer_mutex.h"
 22
 23namespace __sanitizer {
 24
 25struct ReportFile {
 26  void Write(const char *buffer, uptr length);
 27  bool SupportsColors();
 28  void SetReportPath(const char *path);
 29  const char *GetReportPath();
 30
 31  // Don't use fields directly. They are only declared public to allow
 32  // aggregate initialization.
 33
 34  // Protects fields below.
 35  StaticSpinMutex *mu;
 36  // Opened file descriptor. Defaults to stderr. It may be equal to
 37  // kInvalidFd, in which case new file will be opened when necessary.
 38  fd_t fd;
 39  // Path prefix of report file, set via __sanitizer_set_report_path.
 40  char path_prefix[kMaxPathLength];
 41  // Full path to report, obtained as <path_prefix>.PID
 42  char full_path[kMaxPathLength];
 43  // PID of the process that opened fd. If a fork() occurs,
 44  // the PID of child will be different from fd_pid.
 45  uptr fd_pid;
 46
 47 private:
 48  void ReopenIfNecessary();
 49};
 50extern ReportFile report_file;
 51
 52enum FileAccessMode {
 53  RdOnly,
 54  WrOnly,
 55  RdWr
 56};
 57
 58// Returns kInvalidFd on error.
 59fd_t OpenFile(const char *filename, FileAccessMode mode,
 60              error_t *errno_p = nullptr);
 61void CloseFile(fd_t);
 62
 63// Return true on success, false on error.
 64bool ReadFromFile(fd_t fd, void *buff, uptr buff_size,
 65                  uptr *bytes_read = nullptr, error_t *error_p = nullptr);
 66bool WriteToFile(fd_t fd, const void *buff, uptr buff_size,
 67                 uptr *bytes_written = nullptr, error_t *error_p = nullptr);
 68
 69// Scoped file handle closer.
 70struct FileCloser {
 71  explicit FileCloser(fd_t fd) : fd(fd) {}
 72  ~FileCloser() { CloseFile(fd); }
 73  fd_t fd;
 74};
 75
 76bool SupportsColoredOutput(fd_t fd);
 77
 78// OS
 79const char *GetPwd();
 80bool FileExists(const char *filename);
 81bool DirExists(const char *path);
 82char *FindPathToBinary(const char *name);
 83bool IsPathSeparator(const char c);
 84bool IsAbsolutePath(const char *path);
 85// Returns true on success, false on failure.
 86bool CreateDir(const char *pathname);
 87// Starts a subprocess and returns its pid.
 88// If *_fd parameters are not kInvalidFd their corresponding input/output
 89// streams will be redirect to the file. The files will always be closed
 90// in parent process even in case of an error.
 91// The child process will close all fds after STDERR_FILENO
 92// before passing control to a program.
 93pid_t StartSubprocess(const char *filename, const char *const argv[],
 94                      const char *const envp[], fd_t stdin_fd = kInvalidFd,
 95                      fd_t stdout_fd = kInvalidFd, fd_t stderr_fd = kInvalidFd);
 96// Checks if specified process is still running
 97bool IsProcessRunning(pid_t pid);
 98// Waits for the process to finish and returns its exit code.
 99// Returns -1 in case of an error.
100int WaitForProcess(pid_t pid);
101
102// Maps given file to virtual memory, and returns pointer to it
103// (or NULL if mapping fails). Stores the size of mmaped region
104// in '*buff_size'.
105void *MapFileToMemory(const char *file_name, uptr *buff_size);
106void *MapWritableFileToMemory(void *addr, uptr size, fd_t fd, OFF_T offset);
107
108}  // namespace __sanitizer
109
110#endif  // SANITIZER_FILE_H