1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CRAZY_LINKER_SYSTEM_H 6#define CRAZY_LINKER_SYSTEM_H 7 8#include <errno.h> 9#include <stdio.h> 10#include <stdlib.h> 11#include <sys/mman.h> 12#include <unistd.h> 13 14#include "crazy_linker_util.h" // for String 15 16// System abstraction used by the crazy linker. 17// This is used to make unit testing easier without using tons of 18// dependency injection in the rest of the code base. 19// 20// In a nutshell: in a normal build, this will wrap normal open() / read() 21// calls. During unit testing, everything is mocked, see 22// crazy_linker_system_mock.cpp 23 24namespace crazy { 25 26enum FileOpenMode { 27 FILE_OPEN_READ_ONLY = 0, 28 FILE_OPEN_READ_WRITE, 29 FILE_OPEN_WRITE 30}; 31 32// Scoping file descriptor class. 33class FileDescriptor { 34 public: 35#ifdef UNIT_TESTS 36#define kEmptyFD NULL 37 typedef void* HandleType; 38#else 39#define kEmptyFD (-1) 40 typedef int HandleType; 41#endif 42 43 FileDescriptor() : fd_(kEmptyFD) {} 44 45 FileDescriptor(const char* path) : fd_(kEmptyFD) { OpenReadOnly(path); } 46 47 ~FileDescriptor() { Close(); } 48 49 bool IsOk() const { return fd_ != kEmptyFD; } 50 HandleType Get() const { return fd_; } 51 bool OpenReadOnly(const char* path); 52 bool OpenReadWrite(const char* path); 53 int Read(void* buffer, size_t buffer_size); 54 int SeekTo(off_t offset); 55 void* Map(void* address, 56 size_t length, 57 int prot_flags, 58 int flags, 59 off_t offset); 60 void Close(); 61 62 private: 63 HandleType fd_; 64}; 65 66// Returns true iff a given file path exists. 67bool PathExists(const char* path_name); 68 69// Returns true iff a given path is a regular file (or link to a regular 70// file). 71bool PathIsFile(const char* path_name); 72 73// Returns the current directory, as a string. 74String GetCurrentDirectory(); 75 76// Returns the value of a given environment variable. 77const char* GetEnv(const char* var_name); 78 79// Returns true iff |lib_name| corresponds to one of the NDK-exposed 80// system libraries. 81bool IsSystemLibrary(const char* lib_name); 82 83} // namespace crazy 84 85#endif // CRAZY_LINKER_SYSTEM_H 86