FreeRDP
Loading...
Searching...
No Matches
path.h
1
20#ifndef WINPR_PATH_H
21#define WINPR_PATH_H
22
23#include <winpr/winpr.h>
24#include <winpr/tchar.h>
25#include <winpr/error.h>
26#include <winpr/wtypes.h>
27
28//#define WINPR_HAVE_PATHCCH_H 1
29
30#ifdef WINPR_HAVE_PATHCCH_H
31
32#include <Pathcch.h>
33
34#else
35
36#ifdef __cplusplus
37extern "C"
38{
39#endif
40
41#define PATHCCH_ALLOW_LONG_PATHS \
42 0x00000001 /* Allow building of \\?\ paths if longer than MAX_PATH */
43
44#define VOLUME_PREFIX _T("\\\\?\\Volume")
45#define VOLUME_PREFIX_LEN ((sizeof(VOLUME_PREFIX) / sizeof(TCHAR)) - 1)
46
47 /*
48 * Maximum number of characters we support using the "\\?\" syntax
49 * (0x7FFF + 1 for NULL terminator)
50 */
51
52#define PATHCCH_MAX_CCH 0x8000
53
54 WINPR_API HRESULT PathCchAddBackslashA(PSTR pszPath, size_t cchPath);
55 WINPR_API HRESULT PathCchAddBackslashW(PWSTR pszPath, size_t cchPath);
56
57 WINPR_API HRESULT PathCchRemoveBackslashA(PSTR pszPath, size_t cchPath);
58 WINPR_API HRESULT PathCchRemoveBackslashW(PWSTR pszPath, size_t cchPath);
59
60 WINPR_API HRESULT PathCchAddBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd,
61 size_t* pcchRemaining);
62 WINPR_API HRESULT PathCchAddBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
63 size_t* pcchRemaining);
64
65 WINPR_API HRESULT PathCchRemoveBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd,
66 size_t* pcchRemaining);
67 WINPR_API HRESULT PathCchRemoveBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
68 size_t* pcchRemaining);
69
70 WINPR_API HRESULT PathCchAddExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt);
71 WINPR_API HRESULT PathCchAddExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt);
72
73 WINPR_API HRESULT PathCchAppendA(PSTR pszPath, size_t cchPath, PCSTR pszMore);
74 WINPR_API HRESULT PathCchAppendW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore);
75
76 WINPR_API HRESULT PathCchAppendExA(PSTR pszPath, size_t cchPath, PCSTR pszMore,
77 unsigned long dwFlags);
78 WINPR_API HRESULT PathCchAppendExW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore,
79 unsigned long dwFlags);
80
81 WINPR_API HRESULT PathCchCanonicalizeA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn);
82 WINPR_API HRESULT PathCchCanonicalizeW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn);
83
84 WINPR_API HRESULT PathCchCanonicalizeExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn,
85 unsigned long dwFlags);
86 WINPR_API HRESULT PathCchCanonicalizeExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn,
87 unsigned long dwFlags);
88
89 WINPR_API HRESULT PathAllocCanonicalizeA(PCSTR pszPathIn, unsigned long dwFlags,
90 PSTR* ppszPathOut);
91 WINPR_API HRESULT PathAllocCanonicalizeW(PCWSTR pszPathIn, unsigned long dwFlags,
92 PWSTR* ppszPathOut);
93
94 WINPR_API HRESULT PathCchCombineA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn,
95 PCSTR pszMore);
96 WINPR_API HRESULT PathCchCombineW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn,
97 PCWSTR pszMore);
98
99 WINPR_API HRESULT PathCchCombineExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn,
100 PCSTR pszMore, unsigned long dwFlags);
101 WINPR_API HRESULT PathCchCombineExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn,
102 PCWSTR pszMore, unsigned long dwFlags);
103
104 WINPR_API HRESULT PathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags,
105 PSTR* ppszPathOut);
106 WINPR_API HRESULT PathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags,
107 PWSTR* ppszPathOut);
108
109 WINPR_API HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt);
110 WINPR_API HRESULT PathCchFindExtensionW(PCWSTR pszPath, size_t cchPath, PCWSTR* ppszExt);
111
112 WINPR_API HRESULT PathCchRenameExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt);
113 WINPR_API HRESULT PathCchRenameExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt);
114
115 WINPR_API HRESULT PathCchRemoveExtensionA(PSTR pszPath, size_t cchPath);
116 WINPR_API HRESULT PathCchRemoveExtensionW(PWSTR pszPath, size_t cchPath);
117
118 WINPR_API BOOL PathCchIsRootA(PCSTR pszPath);
119 WINPR_API BOOL PathCchIsRootW(PCWSTR pszPath);
120
121 WINPR_API BOOL PathIsUNCExA(PCSTR pszPath, PCSTR* ppszServer);
122 WINPR_API BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer);
123
124 WINPR_API HRESULT PathCchSkipRootA(PCSTR pszPath, PCSTR* ppszRootEnd);
125 WINPR_API HRESULT PathCchSkipRootW(PCWSTR pszPath, PCWSTR* ppszRootEnd);
126
127 WINPR_API HRESULT PathCchStripToRootA(PSTR pszPath, size_t cchPath);
128 WINPR_API HRESULT PathCchStripToRootW(PWSTR pszPath, size_t cchPath);
129
130 WINPR_API HRESULT PathCchStripPrefixA(PSTR pszPath, size_t cchPath);
131 WINPR_API HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath);
132
133 WINPR_API HRESULT PathCchRemoveFileSpecA(PSTR pszPath, size_t cchPath);
134 WINPR_API HRESULT PathCchRemoveFileSpecW(PWSTR pszPath, size_t cchPath);
135
136#ifdef UNICODE
137#define PathCchAddBackslash PathCchAddBackslashW
138#define PathCchRemoveBackslash PathCchRemoveBackslashW
139#define PathCchAddBackslashEx PathCchAddBackslashExW
140#define PathCchRemoveBackslashEx PathCchRemoveBackslashExW
141#define PathCchAddExtension PathCchAddExtensionW
142#define PathCchAppend PathCchAppendW
143#define PathCchAppendEx PathCchAppendExW
144#define PathCchCanonicalize PathCchCanonicalizeW
145#define PathCchCanonicalizeEx PathCchCanonicalizeExW
146#define PathAllocCanonicalize PathAllocCanonicalizeW
147#define PathCchCombine PathCchCombineW
148#define PathCchCombineEx PathCchCombineExW
149#define PathAllocCombine PathAllocCombineW
150#define PathCchFindExtension PathCchFindExtensionW
151#define PathCchRenameExtension PathCchRenameExtensionW
152#define PathCchRemoveExtension PathCchRemoveExtensionW
153#define PathCchIsRoot PathCchIsRootW
154#define PathIsUNCEx PathIsUNCExW
155#define PathCchSkipRoot PathCchSkipRootW
156#define PathCchStripToRoot PathCchStripToRootW
157#define PathCchStripPrefix PathCchStripPrefixW
158#define PathCchRemoveFileSpec PathCchRemoveFileSpecW
159#else
160#define PathCchAddBackslash PathCchAddBackslashA
161#define PathCchRemoveBackslash PathCchRemoveBackslashA
162#define PathCchAddBackslashEx PathCchAddBackslashExA
163#define PathCchRemoveBackslashEx PathCchRemoveBackslashExA
164#define PathCchAddExtension PathCchAddExtensionA
165#define PathCchAppend PathCchAppendA
166#define PathCchAppendEx PathCchAppendExA
167#define PathCchCanonicalize PathCchCanonicalizeA
168#define PathCchCanonicalizeEx PathCchCanonicalizeExA
169#define PathAllocCanonicalize PathAllocCanonicalizeA
170#define PathCchCombine PathCchCombineA
171#define PathCchCombineEx PathCchCombineExA
172#define PathAllocCombine PathAllocCombineA
173#define PathCchFindExtension PathCchFindExtensionA
174#define PathCchRenameExtension PathCchRenameExtensionA
175#define PathCchRemoveExtension PathCchRemoveExtensionA
176#define PathCchIsRoot PathCchIsRootA
177#define PathIsUNCEx PathIsUNCExA
178#define PathCchSkipRoot PathCchSkipRootA
179#define PathCchStripToRoot PathCchStripToRootA
180#define PathCchStripPrefix PathCchStripPrefixA
181#define PathCchRemoveFileSpec PathCchRemoveFileSpecA
182#endif
183
184 /* Unix-style Paths */
185
186 WINPR_API HRESULT PathCchAddSlashA(PSTR pszPath, size_t cchPath);
187 WINPR_API HRESULT PathCchAddSlashW(PWSTR pszPath, size_t cchPath);
188
189 WINPR_API HRESULT PathCchAddSlashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd,
190 size_t* pcchRemaining);
191 WINPR_API HRESULT PathCchAddSlashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
192 size_t* pcchRemaining);
193
194 WINPR_API HRESULT UnixPathCchAddExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt);
195 WINPR_API HRESULT UnixPathCchAddExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt);
196
197 WINPR_API HRESULT UnixPathCchAppendA(PSTR pszPath, size_t cchPath, PCSTR pszMore);
198 WINPR_API HRESULT UnixPathCchAppendW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore);
199
200 WINPR_API HRESULT UnixPathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags,
201 PSTR* ppszPathOut);
202 WINPR_API HRESULT UnixPathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags,
203 PWSTR* ppszPathOut);
204
205#ifdef UNICODE
206#define PathCchAddSlash PathCchAddSlashW
207#define PathCchAddSlashEx PathCchAddSlashExW
208#define UnixPathCchAddExtension UnixPathCchAddExtensionW
209#define UnixPathCchAppend UnixPathCchAppendW
210#define UnixPathAllocCombine UnixPathAllocCombineW
211#else
212#define PathCchAddSlash PathCchAddSlashA
213#define PathCchAddSlashEx PathCchAddSlashExA
214#define UnixPathCchAddExtension UnixPathCchAddExtensionA
215#define UnixPathCchAppend UnixPathCchAppendA
216#define UnixPathAllocCombine UnixPathAllocCombineA
217#endif
218
219 /* Native-style Paths */
220
221 WINPR_API HRESULT PathCchAddSeparatorA(PSTR pszPath, size_t cchPath);
222 WINPR_API HRESULT PathCchAddSeparatorW(PWSTR pszPath, size_t cchPath);
223
224 WINPR_API HRESULT PathCchAddSeparatorExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd,
225 size_t* pcchRemaining);
226 WINPR_API HRESULT PathCchAddSeparatorExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
227 size_t* pcchRemaining);
228
229 WINPR_API HRESULT NativePathCchAddExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt);
230 WINPR_API HRESULT NativePathCchAddExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt);
231
232 WINPR_API HRESULT NativePathCchAppendA(PSTR pszPath, size_t cchPath, PCSTR pszMore);
233 WINPR_API HRESULT NativePathCchAppendW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore);
234
235 WINPR_API HRESULT NativePathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags,
236 PSTR* ppszPathOut);
237 WINPR_API HRESULT NativePathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore,
238 unsigned long dwFlags, PWSTR* ppszPathOut);
239
240#ifdef UNICODE
241#define PathCchAddSeparator PathCchAddSeparatorW
242#define PathCchAddSeparatorEx PathCchAddSeparatorExW
243#define NativePathCchAddExtension NativePathCchAddExtensionW
244#define NativePathCchAppend NativePathCchAppendW
245#define NativePathAllocCombine NativePathAllocCombineW
246#else
247#define PathCchAddSeparator PathCchAddSeparatorA
248#define PathCchAddSeparatorEx PathCchAddSeparatorExA
249#define NativePathCchAddExtension NativePathCchAddExtensionA
250#define NativePathCchAppend NativePathCchAppendA
251#define NativePathAllocCombine NativePathAllocCombineA
252#endif
253
254 /* Path Portability Functions */
255
256#define PATH_STYLE_WINDOWS 0x00000001
257#define PATH_STYLE_UNIX 0x00000002
258#define PATH_STYLE_NATIVE 0x00000003
259
260#define PATH_SHARED_LIB_EXT_WITH_DOT 0x00000001
261#define PATH_SHARED_LIB_EXT_APPLE_SO 0x00000002
262#define PATH_SHARED_LIB_EXT_EXPLICIT 0x80000000
263#define PATH_SHARED_LIB_EXT_EXPLICIT_DLL 0x80000001
264#define PATH_SHARED_LIB_EXT_EXPLICIT_SO 0x80000002
265#define PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB 0x80000003
266
267 WINPR_API HRESULT PathCchConvertStyleA(PSTR pszPath, size_t cchPath, unsigned long dwFlags);
268 WINPR_API HRESULT PathCchConvertStyleW(PWSTR pszPath, size_t cchPath, unsigned long dwFlags);
269
270 WINPR_API char PathGetSeparatorA(unsigned long dwFlags);
271 WINPR_API WCHAR PathGetSeparatorW(unsigned long dwFlags);
272
273 WINPR_API PCSTR PathGetSharedLibraryExtensionA(unsigned long dwFlags);
274 WINPR_API PCWSTR PathGetSharedLibraryExtensionW(unsigned long dwFlags);
275
276#ifdef UNICODE
277#define PathCchConvertStyle PathCchConvertStyleW
278#define PathGetSeparator PathGetSeparatorW
279#define PathGetSharedLibraryExtension PathGetSharedLibraryExtensionW
280#else
281#define PathCchConvertStyle PathCchConvertStyleA
282#define PathGetSeparator PathGetSeparatorW
283#define PathGetSharedLibraryExtension PathGetSharedLibraryExtensionA
284#endif
285
286#ifdef __cplusplus
287}
288#endif
289
290#endif
291
296typedef enum
297{
298 KNOWN_PATH_HOME = 1,
299 KNOWN_PATH_TEMP = 2,
300 KNOWN_PATH_XDG_DATA_HOME = 3,
301 KNOWN_PATH_XDG_CONFIG_HOME = 4,
302 KNOWN_PATH_XDG_CACHE_HOME = 5,
303 KNOWN_PATH_XDG_RUNTIME_DIR = 6,
304 KNOWN_PATH_SYSTEM_CONFIG_HOME = 7
305} eKnownPathTypes;
306
307#ifdef __cplusplus
308extern "C"
309{
310#endif
311
325 WINPR_ATTR_MALLOC(free, 1)
326 WINPR_API char* winpr_GetConfigFilePath(BOOL system, const char* filename);
327
328 WINPR_API const char* GetKnownPathIdString(int id);
329
330 WINPR_ATTR_MALLOC(free, 1)
331 WINPR_API char* GetKnownPath(eKnownPathTypes id);
332
333 WINPR_ATTR_MALLOC(free, 1)
334 WINPR_API char* GetKnownSubPath(eKnownPathTypes id, const char* path);
335
336 WINPR_ATTR_MALLOC(free, 1)
337 WINPR_API char* GetEnvironmentPath(char* name);
338
339 WINPR_ATTR_MALLOC(free, 1)
340 WINPR_API char* GetEnvironmentSubPath(char* name, const char* path);
341
342 WINPR_ATTR_MALLOC(free, 1)
343 WINPR_API char* GetCombinedPath(const char* basePath, const char* subPath);
344
345 WINPR_API BOOL PathMakePathA(LPCSTR path, LPSECURITY_ATTRIBUTES lpAttributes);
346 WINPR_API BOOL PathMakePathW(LPCWSTR path, LPSECURITY_ATTRIBUTES lpAttributes);
347
348#if !defined(_WIN32) || defined(_UWP)
349
350 WINPR_API BOOL PathIsRelativeA(LPCSTR pszPath);
351 WINPR_API BOOL PathIsRelativeW(LPCWSTR pszPath);
352
353 WINPR_API BOOL PathFileExistsA(LPCSTR pszPath);
354 WINPR_API BOOL PathFileExistsW(LPCWSTR pszPath);
355
356 WINPR_API BOOL PathIsDirectoryEmptyA(LPCSTR pszPath);
357 WINPR_API BOOL PathIsDirectoryEmptyW(LPCWSTR pszPath);
358
359#ifdef UNICODE
360#define PathFileExists PathFileExistsW
361#define PathIsDirectoryEmpty PathIsDirectoryEmptyW
362#else
363#define PathFileExists PathFileExistsA
364#define PathIsDirectoryEmpty PathIsDirectoryEmptyA
365#endif
366
367#endif
368
369 WINPR_API BOOL winpr_MoveFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName);
370 WINPR_API BOOL winpr_MoveFileEx(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags);
371 WINPR_API BOOL winpr_DeleteFile(const char* lpFileName);
372 WINPR_API BOOL winpr_RemoveDirectory(LPCSTR lpPathName);
373 WINPR_API BOOL winpr_RemoveDirectory_RecursiveA(LPCSTR lpPathName);
374 WINPR_API BOOL winpr_RemoveDirectory_RecursiveW(LPCWSTR lpPathName);
375 WINPR_API BOOL winpr_PathFileExists(const char* pszPath);
376 WINPR_API BOOL winpr_PathMakePath(const char* path, LPSECURITY_ATTRIBUTES lpAttributes);
377
378#ifdef __cplusplus
379}
380#endif
381
382#ifdef _WIN32
383#include <shlwapi.h>
384#endif
385
386#endif /* WINPR_PATH_H */