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