• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "crazy_linker_system.h"
6 
7 #include <errno.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <sys/stat.h>
11 #include <unistd.h>
12 
13 #include "crazy_linker_util.h"
14 
15 // Note: unit-testing support files are in crazy_linker_files_mock.cpp
16 
17 namespace crazy {
18 
19 #ifndef UNIT_TESTS
20 
OpenReadOnly(const char * path)21 bool FileDescriptor::OpenReadOnly(const char* path) {
22   Close();
23   fd_ = TEMP_FAILURE_RETRY(::open(path, O_RDONLY));
24   return (fd_ != -1);
25 }
26 
OpenReadWrite(const char * path)27 bool FileDescriptor::OpenReadWrite(const char* path) {
28   Close();
29   fd_ = TEMP_FAILURE_RETRY(::open(path, O_RDWR));
30   return (fd_ != -1);
31 }
32 
Read(void * buffer,size_t buffer_size)33 int FileDescriptor::Read(void* buffer, size_t buffer_size) {
34   return TEMP_FAILURE_RETRY(::read(fd_, buffer, buffer_size));
35 }
36 
SeekTo(off_t offset)37 int FileDescriptor::SeekTo(off_t offset) {
38   return ::lseek(fd_, offset, SEEK_SET);
39 }
40 
Map(void * address,size_t length,int prot,int flags,off_t offset)41 void* FileDescriptor::Map(void* address,
42                           size_t length,
43                           int prot,
44                           int flags,
45                           off_t offset) {
46   return ::mmap(address, length, prot, flags, fd_, offset);
47 }
48 
Close()49 void FileDescriptor::Close() {
50   if (fd_ != -1) {
51     int old_errno = errno;
52     TEMP_FAILURE_RETRY(close(fd_));
53     errno = old_errno;
54     fd_ = -1;
55   }
56 }
57 
GetEnv(const char * var_name)58 const char* GetEnv(const char* var_name) { return ::getenv(var_name); }
59 
GetCurrentDirectory()60 String GetCurrentDirectory() {
61   String result;
62   size_t capacity = 128;
63   for (;;) {
64     result.Resize(capacity);
65     if (getcwd(&result[0], capacity))
66       break;
67     capacity *= 2;
68   }
69   return result;
70 }
71 
PathExists(const char * path)72 bool PathExists(const char* path) {
73   struct stat st;
74   if (TEMP_FAILURE_RETRY(stat(path, &st)) < 0)
75     return false;
76 
77   return S_ISREG(st.st_mode) || S_ISDIR(st.st_mode);
78 }
79 
PathIsFile(const char * path)80 bool PathIsFile(const char* path) {
81   struct stat st;
82   if (TEMP_FAILURE_RETRY(stat(path, &st)) < 0)
83     return false;
84 
85   return S_ISREG(st.st_mode);
86 }
87 
88 #endif  // !UNIT_TESTS
89 
90 // Returns true iff |lib_name| corresponds to one of the NDK-exposed
91 // system libraries.
IsSystemLibrary(const char * lib_name)92 bool IsSystemLibrary(const char* lib_name) {
93   static const char* const kSystemLibs[] = {
94       "libandroid.so",   "libc.so",         "libdl.so",     "libjnigraphics.so",
95       "liblog.so",       "libm.so",         "libstdc++.so", "libz.so",
96       "libEGL.so",       "libGLESv1_CM.so", "libGLESv2.so", "libGLESv3.so",
97       "libOpenMAXAL.so", "libOpenSLES.so", };
98   const size_t kSize = sizeof(kSystemLibs) / sizeof(kSystemLibs[0]);
99   const char* base_name = ::strrchr(lib_name, '/');
100   if (!base_name)
101     base_name = lib_name;
102   else
103     base_name += 1;
104 
105   for (size_t n = 0; n < kSize; ++n) {
106     if (!strcmp(kSystemLibs[n], base_name))
107       return true;
108   }
109   return false;
110 }
111 
112 }  // namespace crazy
113