1 //===- FileSystem.h -------------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // This file declares the mcld::sys::fs:: namespace. It follows TR2/boost 10 // filesystem (v3), but modified to remove exception handling and the 11 // path class. 12 //===----------------------------------------------------------------------===// 13 #ifndef MCLD_SUPPORT_FILESYSTEM_H_ 14 #define MCLD_SUPPORT_FILESYSTEM_H_ 15 16 #include "mcld/Config/Config.h" 17 #include "mcld/Support/PathCache.h" 18 19 #include <iosfwd> 20 #include <locale> 21 #include <string> 22 23 namespace mcld { 24 namespace sys { 25 26 namespace fs { 27 28 enum FileType { 29 StatusError, 30 StatusUnknown = StatusError, 31 FileNotFound, 32 RegularFile, 33 DirectoryFile, 34 SymlinkFile, 35 BlockFile, 36 CharacterFile, 37 FifoFile, 38 SocketFile, 39 ReparseFile, 40 TypeUnknown, 41 StatusKnown, 42 IsSymLink 43 }; 44 45 /** \class FileStatus 46 * \brief FileStatus 47 */ 48 class FileStatus { 49 public: FileStatus()50 FileStatus() : m_Value(StatusError) {} 51 FileStatus(FileType v)52 explicit FileStatus(FileType v) : m_Value(v) {} 53 setType(FileType v)54 void setType(FileType v) { m_Value = v; } type()55 FileType type() const { return m_Value; } 56 57 private: 58 FileType m_Value; 59 }; 60 61 inline bool operator==(const FileStatus& rhs, const FileStatus& lhs) { 62 return rhs.type() == lhs.type(); 63 } 64 65 inline bool operator!=(const FileStatus& rhs, const FileStatus& lhs) { 66 return !(rhs == lhs); 67 } 68 69 class Path; 70 class DirIterator; 71 class Directory; 72 73 bool exists(const Path& pPath); 74 bool is_directory(const Path& pPath); 75 76 namespace detail { 77 78 extern Path::StringType static_library_extension; 79 extern Path::StringType shared_library_extension; 80 extern Path::StringType executable_extension; 81 extern Path::StringType relocatable_extension; 82 extern Path::StringType assembly_extension; 83 extern Path::StringType bitcode_extension; 84 85 size_t canonicalize(Path::StringType& pPathName); 86 bool not_found_error(int perrno); 87 void status(const Path& p, FileStatus& pFileStatus); 88 void symlink_status(const Path& p, FileStatus& pFileStatus); 89 mcld::sys::fs::PathCache::entry_type* bring_one_into_cache(DirIterator& pIter); 90 void open_dir(Directory& pDir); 91 void close_dir(Directory& pDir); 92 void get_pwd(Path& pPWD); 93 94 int open(const Path& pPath, int pOFlag); 95 int open(const Path& pPath, int pOFlag, int pPermission); 96 ssize_t pread(int pFD, void* pBuf, size_t pCount, off_t pOffset); 97 ssize_t pwrite(int pFD, const void* pBuf, size_t pCount, off_t pOffset); 98 int ftruncate(int pFD, size_t pLength); 99 void* mmap(void* pAddr, 100 size_t pLen, 101 int pProt, 102 int pFlags, 103 int pFD, 104 off_t pOffset); 105 int munmap(void* pAddr, size_t pLen); 106 107 } // namespace detail 108 } // namespace fs 109 } // namespace sys 110 } // namespace mcld 111 112 #endif // MCLD_SUPPORT_FILESYSTEM_H_ 113