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 24 namespace crazy { 25 26 enum FileOpenMode { 27 FILE_OPEN_READ_ONLY = 0, 28 FILE_OPEN_READ_WRITE, 29 FILE_OPEN_WRITE 30 }; 31 32 // Scoping file descriptor class. 33 class 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 FileDescriptor()43 FileDescriptor() : fd_(kEmptyFD) {} 44 FileDescriptor(const char * path)45 FileDescriptor(const char* path) : fd_(kEmptyFD) { OpenReadOnly(path); } 46 ~FileDescriptor()47 ~FileDescriptor() { Close(); } 48 IsOk()49 bool IsOk() const { return fd_ != kEmptyFD; } Get()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. 67 bool PathExists(const char* path_name); 68 69 // Returns true iff a given path is a regular file (or link to a regular 70 // file). 71 bool PathIsFile(const char* path_name); 72 73 // Returns the current directory, as a string. 74 String GetCurrentDirectory(); 75 76 // Returns the value of a given environment variable. 77 const char* GetEnv(const char* var_name); 78 79 // Returns true iff |lib_name| corresponds to one of the NDK-exposed 80 // system libraries. 81 bool IsSystemLibrary(const char* lib_name); 82 83 } // namespace crazy 84 85 #endif // CRAZY_LINKER_SYSTEM_H 86