1 | //===- FuzzerIO.h - Internal header for IO utils ----------------*- C++ -* ===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // IO interface. |
9 | //===----------------------------------------------------------------------===// |
10 | |
11 | #ifndef LLVM_FUZZER_IO_H |
12 | #define LLVM_FUZZER_IO_H |
13 | |
14 | #include "FuzzerDefs.h" |
15 | |
16 | namespace fuzzer { |
17 | |
18 | long GetEpoch(const std::string &Path); |
19 | |
20 | Unit FileToVector(const std::string &Path, size_t MaxSize = 0, |
21 | bool ExitOnError = true); |
22 | |
23 | std::string FileToString(const std::string &Path); |
24 | |
25 | void CopyFileToErr(const std::string &Path); |
26 | |
27 | void WriteToFile(const uint8_t *Data, size_t Size, const std::string &Path); |
28 | // Write Data.c_str() to the file without terminating null character. |
29 | void WriteToFile(const std::string &Data, const std::string &Path); |
30 | void WriteToFile(const Unit &U, const std::string &Path); |
31 | |
32 | void AppendToFile(const uint8_t *Data, size_t Size, const std::string &Path); |
33 | void AppendToFile(const std::string &Data, const std::string &Path); |
34 | |
35 | void ReadDirToVectorOfUnits(const char *Path, std::vector<Unit> *V, long *Epoch, |
36 | size_t MaxSize, bool ExitOnError, |
37 | std::vector<std::string> *VPaths = 0); |
38 | |
39 | // Returns "Dir/FileName" or equivalent for the current OS. |
40 | std::string DirPlusFile(const std::string &DirPath, |
41 | const std::string &FileName); |
42 | |
43 | // Returns the name of the dir, similar to the 'dirname' utility. |
44 | std::string DirName(const std::string &FileName); |
45 | |
46 | // Returns path to a TmpDir. |
47 | std::string TmpDir(); |
48 | |
49 | std::string TempPath(const char *Prefix, const char *Extension); |
50 | |
51 | bool IsInterestingCoverageFile(const std::string &FileName); |
52 | |
53 | void DupAndCloseStderr(); |
54 | |
55 | void CloseStdout(); |
56 | |
57 | // For testing. |
58 | FILE *GetOutputFile(); |
59 | void SetOutputFile(FILE *NewOutputFile); |
60 | |
61 | void Puts(const char *Str); |
62 | void Printf(const char *Fmt, ...); |
63 | void VPrintf(bool Verbose, const char *Fmt, ...); |
64 | |
65 | // Print using raw syscalls, useful when printing at early init stages. |
66 | void RawPrint(const char *Str); |
67 | |
68 | // Platform specific functions: |
69 | bool IsFile(const std::string &Path); |
70 | bool IsDirectory(const std::string &Path); |
71 | size_t FileSize(const std::string &Path); |
72 | |
73 | void ListFilesInDirRecursive(const std::string &Dir, long *Epoch, |
74 | std::vector<std::string> *V, bool TopDir); |
75 | |
76 | bool MkDirRecursive(const std::string &Dir); |
77 | void RmDirRecursive(const std::string &Dir); |
78 | |
79 | // Iterate files and dirs inside Dir, recursively. |
80 | // Call DirPreCallback/DirPostCallback on dirs before/after |
81 | // calling FileCallback on files. |
82 | void IterateDirRecursive(const std::string &Dir, |
83 | void (*DirPreCallback)(const std::string &Dir), |
84 | void (*DirPostCallback)(const std::string &Dir), |
85 | void (*FileCallback)(const std::string &Dir)); |
86 | |
87 | struct SizedFile { |
88 | std::string File; |
89 | size_t Size; |
90 | bool operator<(const SizedFile &B) const { return Size < B.Size; } |
91 | }; |
92 | |
93 | void GetSizedFilesFromDir(const std::string &Dir, std::vector<SizedFile> *V); |
94 | |
95 | char GetSeparator(); |
96 | bool IsSeparator(char C); |
97 | // Similar to the basename utility: returns the file name w/o the dir prefix. |
98 | std::string Basename(const std::string &Path); |
99 | |
100 | FILE* OpenFile(int Fd, const char *Mode); |
101 | |
102 | int CloseFile(int Fd); |
103 | |
104 | int DuplicateFile(int Fd); |
105 | |
106 | void RemoveFile(const std::string &Path); |
107 | void RenameFile(const std::string &OldPath, const std::string &NewPath); |
108 | |
109 | intptr_t GetHandleFromFd(int fd); |
110 | |
111 | void MkDir(const std::string &Path); |
112 | void RmDir(const std::string &Path); |
113 | |
114 | const std::string &getDevNull(); |
115 | |
116 | } // namespace fuzzer |
117 | |
118 | #endif // LLVM_FUZZER_IO_H |
119 | |