VirtualBox

source: vbox/trunk/include/iprt/path.h@ 8163

Last change on this file since 8163 was 8163, checked in by vboxsync, 17 years ago

rebrand IPRT

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.2 KB
Line 
1/** @file
2 * Incredibly Portable Runtime - Path Manipulation.
3 */
4
5/*
6 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 *
25 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___iprt_path_h
31#define ___iprt_path_h
32
33#include <iprt/cdefs.h>
34#include <iprt/types.h>
35#ifdef IN_RING3
36# include <iprt/fs.h>
37#endif
38
39
40
41__BEGIN_DECLS
42
43/** @defgroup grp_rt_path RTPath - Path Manipulation
44 * @ingroup grp_rt
45 * @{
46 */
47
48
49/** @def RTPATH_SLASH
50 * The prefered slash character.
51 *
52 * @remark IPRT will always accept unix slashes. So, normally you would
53 * never have to use this define.
54 */
55#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
56# define RTPATH_SLASH '\\'
57#else
58# define RTPATH_SLASH '/'
59#endif
60
61/** @deprecated Use '/'! */
62#define RTPATH_DELIMITER RTPATH_SLASH
63
64
65/** @def RTPATH_SLASH_STR
66 * The prefered slash character as a string, handy for concatenations
67 * with other strings.
68 *
69 * @remark IPRT will always accept unix slashes. So, normally you would
70 * never have to use this define.
71 */
72#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
73# define RTPATH_SLASH_STR "\\"
74#else
75# define RTPATH_SLASH_STR "/"
76#endif
77
78
79/** @def RTPATH_IS_SLASH
80 * Checks if a character is a slash.
81 *
82 * @returns true if it's a slash and false if not.
83 * @returns @param ch Char to check.
84 */
85#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
86# define RTPATH_IS_SLASH(ch) ( (ch) == '\\' || (ch) == '/' )
87#else
88# define RTPATH_IS_SLASH(ch) ( (ch) == '/' )
89#endif
90
91
92/** @def RTPATH_IS_VOLSEP
93 * Checks if a character marks the end of the volume specification.
94 *
95 * @remark This is sufficent for the drive letter consept on PC.
96 * However it might be insufficient on other platforms
97 * and even on PC a UNC volume spec won't be detected this way.
98 * Use the RTPath@<too be created@>() instead.
99 *
100 * @returns true if it is and false if it isn't.
101 * @returns @param ch Char to check.
102 */
103#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
104# define RTPATH_IS_VOLSEP(ch) ( (ch) == ':' )
105#else
106# define RTPATH_IS_VOLSEP(ch) (false)
107#endif
108
109
110/** @def RTPATH_IS_SEP
111 * Checks if a character is path component separator
112 *
113 * @returns true if it is and false if it isn't.
114 * @returns @param ch Char to check.
115 * @
116 */
117#define RTPATH_IS_SEP(ch) ( RTPATH_IS_SLASH(ch) || RTPATH_IS_VOLSEP(ch) )
118
119
120/**
121 * Checks if the path exists.
122 *
123 * Symbolic links will all be attempted resolved.
124 *
125 * @returns true if it exists and false if it doesn't.
126 * @param pszPath The path to check.
127 */
128RTDECL(bool) RTPathExists(const char *pszPath);
129
130/**
131 * Get the real path (no symlinks, no . or .. components), must exist.
132 *
133 * @returns iprt status code.
134 * @param pszPath The path to resolve.
135 * @param pszRealPath Where to store the real path.
136 * @param cchRealPath Size of the buffer.
137 */
138RTDECL(int) RTPathReal(const char *pszPath, char *pszRealPath, unsigned cchRealPath);
139
140/**
141 * Same as RTPathReal only the result is RTStrDup()'ed.
142 *
143 * @returns Pointer to real path. Use RTStrFree() to free this string.
144 * @returns NULL if RTPathReal() or RTStrDup() fails.
145 * @param pszPath The path to resolve.
146 */
147RTDECL(char *) RTPathRealDup(const char *pszPath);
148
149/**
150 * Get the absolute path (no symlinks, no . or .. components), doesn't have to exist.
151 *
152 * @returns iprt status code.
153 * @param pszPath The path to resolve.
154 * @param pszAbsPath Where to store the absolute path.
155 * @param cchAbsPath Size of the buffer.
156 */
157RTDECL(int) RTPathAbs(const char *pszPath, char *pszAbsPath, unsigned cchAbsPath);
158
159/**
160 * Same as RTPathAbs only the result is RTStrDup()'ed.
161 *
162 * @returns Pointer to the absolute path. Use RTStrFree() to free this string.
163 * @returns NULL if RTPathAbs() or RTStrDup() fails.
164 * @param pszPath The path to resolve.
165 */
166RTDECL(char *) RTPathAbsDup(const char *pszPath);
167
168/**
169 * Get the absolute path (no symlinks, no . or .. components), assuming the
170 * given base path as the current directory. The resulting path doesn't have
171 * to exist.
172 *
173 * @returns iprt status code.
174 * @param pszBase The base path to act like a current directory.
175 * When NULL, the actual cwd is used (i.e. the call
176 * is equivalent to RTPathAbs(pszPath, ...).
177 * @param pszPath The path to resolve.
178 * @param pszAbsPath Where to store the absolute path.
179 * @param cchAbsPath Size of the buffer.
180 */
181RTDECL(int) RTPathAbsEx(const char *pszBase, const char *pszPath, char *pszAbsPath, unsigned cchAbsPath);
182
183/**
184 * Same as RTPathAbsEx only the result is RTStrDup()'ed.
185 *
186 * @returns Pointer to the absolute path. Use RTStrFree() to free this string.
187 * @returns NULL if RTPathAbsEx() or RTStrDup() fails.
188 * @param pszBase The base path to act like a current directory.
189 * When NULL, the actual cwd is used (i.e. the call
190 * is equivalent to RTPathAbs(pszPath, ...).
191 * @param pszPath The path to resolve.
192 */
193RTDECL(char *) RTPathAbsExDup(const char *pszBase, const char *pszPath);
194
195/**
196 * Strips the filename from a path.
197 *
198 * @param pszPath Path which filename should be stripped.
199 * If only filename in the string a '.' will be returned.
200 */
201RTDECL(void) RTPathStripFilename(char *pszPath);
202
203/**
204 * Strips the extension from a path.
205 *
206 * @param pszPath Path which extension should be stripped.
207 */
208RTDECL(void) RTPathStripExt(char *pszPath);
209
210/**
211 * Strips the trailing slashes of a path name.
212 *
213 * @param pszPath Path to strip.
214 */
215RTDECL(void) RTPathStripTrailingSlash(char *pszPath);
216
217/**
218 * Finds the filename in a path.
219 *
220 * @returns Pointer to filename within pszPath.
221 * @returns NULL if no filename (i.e. empty string or ends with a slash).
222 * @param pszPath Path to find filename in.
223 */
224RTDECL(char *) RTPathFilename(const char *pszPath);
225
226/**
227 * Finds the extension part of in a path.
228 *
229 * @returns Pointer to extension within pszPath.
230 * @returns NULL if no extension.
231 * @param pszPath Path to find extension in.
232 */
233RTDECL(char *) RTPathExt(const char *pszPath);
234
235/**
236 * Checks if a path have an extension.
237 *
238 * @returns true if extension present.
239 * @returns false if no extension.
240 * @param pszPath Path to check.
241 */
242RTDECL(bool) RTPathHaveExt(const char *pszPath);
243
244/**
245 * Checks if a path includes more than a filename.
246 *
247 * @returns true if path present.
248 * @returns false if no path.
249 * @param pszPath Path to check.
250 */
251RTDECL(bool) RTPathHavePath(const char *pszPath);
252
253/**
254 * Compares two paths.
255 *
256 * The comparison takes platform-dependent details into account,
257 * such as:
258 * <ul>
259 * <li>On DOS-like platforms, both |\| and |/| separator chars are considered
260 * to be equal.
261 * <li>On platforms with case-insensitive file systems, mismatching characters
262 * are uppercased and compared again.
263 * </ul>
264 *
265 * File system details are currently ignored. This means that you won't get
266 * case-insentive compares on unix systems when a path goes into a case-insensitive
267 * filesystem like FAT, HPFS, HFS, NTFS, JFS, or similar. For NT, OS/2 and similar
268 * you'll won't get case-sensitve compares on a case-sensitive file system.
269 *
270 * @param pszPath1 Path to compare (must be an absolute path).
271 * @param pszPath2 Path to compare (must be an absolute path).
272 *
273 * @returns @< 0 if the first path less than the second path.
274 * @returns 0 if the first path identical to the second path.
275 * @returns @> 0 if the first path greater than the second path.
276 */
277RTDECL(int) RTPathCompare(const char *pszPath1, const char *pszPath2);
278
279/**
280 * Checks if a path starts with the given parent path.
281 *
282 * This means that either the path and the parent path matches completely, or that
283 * the path is to some file or directory residing in the tree given by the parent
284 * directory.
285 *
286 * The path comparison takes platform-dependent details into account,
287 * see RTPathCompare() for details.
288 *
289 * @param pszPath Path to check, must be an absolute path.
290 * @param pszParentPath Parent path, must be an absolute path.
291 * No trailing directory slash!
292 *
293 * @returns |true| when \a pszPath starts with \a pszParentPath (or when they
294 * are identical), or |false| otherwise.
295 *
296 * @remark This API doesn't currently handle root directory compares in a manner
297 * consistant with the other APIs. RTPathStartsWith(pszSomePath, "/") will
298 * not work if pszSomePath isn't "/".
299 */
300RTDECL(bool) RTPathStartsWith(const char *pszPath, const char *pszParentPath);
301
302
303#ifdef IN_RING3
304
305/**
306 * Gets the program path.
307 *
308 * @returns iprt status code.
309 * @param pszPath Buffer where to store the path.
310 * @param cchPath Buffer size in bytes.
311 */
312RTDECL(int) RTPathProgram(char *pszPath, unsigned cchPath);
313
314/**
315 * Gets the user home directory.
316 *
317 * @returns iprt status code.
318 * @param pszPath Buffer where to store the path.
319 * @param cchPath Buffer size in bytes.
320 */
321RTDECL(int) RTPathUserHome(char *pszPath, unsigned cchPath);
322
323/**
324 * Gets the directory of shared libraries. This is not the same as
325 * RTPathAppPrivateArch() as Linux depends all shared libraries in
326 * a common global directory where ld.so can found them.
327 *
328 * Linux: /usr/lib
329 * Windows: @<program files directory@>/@<application@>
330 * Old path: same as RTPathProgram()
331 *
332 * @returns iprt status code.
333 * @param pszPath Buffer where to store the path.
334 * @param cchPath Buffer size in bytes.
335 */
336RTDECL(int) RTPathSharedLibs(char *pszPath, unsigned cchPath);
337
338/**
339 * Gets the directory for architecture-independent application data, for
340 * example NLS files, module sources, ...
341 *
342 * Linux: /usr/shared/@<application@>
343 * Windows: @<program files directory@>/@<application@>
344 * Old path: same as RTPathProgram()
345 *
346 * @returns iprt status code.
347 * @param pszPath Buffer where to store the path.
348 * @param cchPath Buffer size in bytes.
349 */
350RTDECL(int) RTPathAppPrivateNoArch(char *pszPath, unsigned cchPath);
351
352/**
353 * Gets the directory for architecture-dependent application data, for
354 * example modules which can be loaded at runtime.
355 *
356 * Linux: /usr/lib/@<application@>
357 * Windows: @<program files directory@>/@<application@>
358 * Old path: same as RTPathProgram()
359 *
360 * @returns iprt status code.
361 * @param pszPath Buffer where to store the path.
362 * @param cchPath Buffer size in bytes.
363 */
364RTDECL(int) RTPathAppPrivateArch(char *pszPath, unsigned cchPath);
365
366/**
367 * Gets the directory for documentation.
368 *
369 * Linux: /usr/share/doc/@<application@>
370 * Windows: @<program files directory@>/@<application@>
371 * Old path: same as RTPathProgram()
372 *
373 * @returns iprt status code.
374 * @param pszPath Buffer where to store the path.
375 * @param cchPath Buffer size in bytes.
376 */
377RTDECL(int) RTPathAppDocs(char *pszPath, unsigned cchPath);
378
379/**
380 * Query information about a file system object.
381 *
382 * This API will not resolve symbolic links in the last component (just
383 * like unix lstat()).
384 *
385 * @returns VINF_SUCCESS if the object exists, information returned.
386 * @returns VERR_PATH_NOT_FOUND if any but the last component in the specified
387 * path was not found or was not a directory.
388 * @returns VERR_FILE_NOT_FOUND if the object does not exist (but path to the
389 * parent directory exists).
390 * @returns some other iprt status code.
391 *
392 * @param pszPath Path to the file system object.
393 * @param pObjInfo Object information structure to be filled on successful return.
394 * @param enmAdditionalAttribs
395 * Which set of additional attributes to request.
396 * Use RTFSOBJATTRADD_NOTHING if this doesn't matter.
397 */
398RTR3DECL(int) RTPathQueryInfo(const char *pszPath, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs);
399
400/**
401 * Changes the mode flags of a file system object.
402 *
403 * The API requires at least one of the mode flag sets (Unix/Dos) to
404 * be set. The type is ignored.
405 *
406 * This API will resolve symbolic links in the last component since
407 * mode isn't important for symbolic links.
408 *
409 * @returns iprt status code.
410 * @param pszPath Path to the file system object.
411 * @param fMode The new file mode, see @ref grp_rt_fs for details.
412 */
413RTR3DECL(int) RTPathSetMode(const char *pszPath, RTFMODE fMode);
414
415/**
416 * Gets the mode flags of a file system object.
417 *
418 * @returns iprt status code.
419 * @param pszPath Path to the file system object.
420 * @param pfMode Where to store the file mode, see @ref grp_rt_fs for details.
421 *
422 * @remark This is wrapper around RTPathReal() + RTPathQueryInfo()
423 * and exists to complement RTPathSetMode().
424 */
425RTR3DECL(int) RTPathGetMode(const char *pszPath, PRTFMODE pfMode);
426
427/**
428 * Changes one or more of the timestamps associated of file system object.
429 *
430 * This API will not resolve symbolic links in the last component (just
431 * like unix lutimes()).
432 *
433 * @returns iprt status code.
434 * @param pszPath Path to the file system object.
435 * @param pAccessTime Pointer to the new access time.
436 * @param pModificationTime Pointer to the new modifcation time.
437 * @param pChangeTime Pointer to the new change time. NULL if not to be changed.
438 * @param pBirthTime Pointer to the new time of birth. NULL if not to be changed.
439 *
440 * @remark The file system might not implement all these time attributes,
441 * the API will ignore the ones which aren't supported.
442 *
443 * @remark The file system might not implement the time resolution
444 * employed by this interface, the time will be chopped to fit.
445 *
446 * @remark The file system may update the change time even if it's
447 * not specified.
448 *
449 * @remark POSIX can only set Access & Modification and will always set both.
450 */
451RTR3DECL(int) RTPathSetTimes(const char *pszPath, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
452 PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime);
453
454/**
455 * Gets one or more of the timestamps associated of file system object.
456 *
457 * @returns iprt status code.
458 * @param pszPath Path to the file system object.
459 * @param pAccessTime Where to store the access time. NULL is ok.
460 * @param pModificationTime Where to store the modifcation time. NULL is ok.
461 * @param pChangeTime Where to store the change time. NULL is ok.
462 * @param pBirthTime Where to store the creation time. NULL is ok.
463 *
464 * @remark This is wrapper around RTPathQueryInfo() and exists to complement RTPathSetTimes().
465 */
466RTR3DECL(int) RTPathGetTimes(const char *pszPath, PRTTIMESPEC pAccessTime, PRTTIMESPEC pModificationTime,
467 PRTTIMESPEC pChangeTime, PRTTIMESPEC pBirthTime);
468
469/**
470 * Changes the owner and/or group of a file system object.
471 *
472 * This API will not resolve symbolic links in the last component (just
473 * like unix lchown()).
474 *
475 * @returns iprt status code.
476 * @param pszPath Path to the file system object.
477 * @param uid The new file owner user id. Use -1 (or ~0) to leave this unchanged.
478 * @param gid The new group id. Use -1 (or ~0) to leave this unchanged.
479 */
480RTR3DECL(int) RTPathSetOwner(const char *pszPath, uint32_t uid, uint32_t gid);
481
482/**
483 * Gets the owner and/or group of a file system object.
484 *
485 * @returns iprt status code.
486 * @param pszPath Path to the file system object.
487 * @param pUid Where to store the owner user id. NULL is ok.
488 * @param pGid Where to store the group id. NULL is ok.
489 *
490 * @remark This is wrapper around RTPathQueryInfo() and exists to complement RTPathGetOwner().
491 */
492RTR3DECL(int) RTPathGetOwner(const char *pszPath, uint32_t *pUid, uint32_t *pGid);
493
494
495/** @name RTPathRename, RTDirRename & RTFileRename flags.
496 * @{ */
497/** This will replace attempt any target which isn't a directory. */
498#define RTPATHRENAME_FLAGS_REPLACE RT_BIT(0)
499/** @} */
500
501/**
502 * Renames a path within a filesystem.
503 *
504 * @returns IPRT status code.
505 * @param pszSrc The source path.
506 * @param pszDst The destination path.
507 * @param fRename Rename flags, RTPATHRENAME_FLAGS_*.
508 */
509RTR3DECL(int) RTPathRename(const char *pszSrc, const char *pszDst, unsigned fRename);
510
511#endif /* IN_RING3 */
512
513/** @} */
514
515__END_DECLS
516
517#endif
518
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette