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