VirtualBox

root/trunk/include/iprt/file.h

Revision 10526, 27.5 kB (checked in by vboxsync, 4 months ago)

file mode mask to RTFileOpen.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /** @file
2  * IPRT - File I/O.
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_file_h
31 #define ___iprt_file_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 /** @todo rename this file to iprt/file.h */
40
41 __BEGIN_DECLS
42
43 /** @defgroup grp_rt_fileio     RTFile - File I/O
44  * @ingroup grp_rt
45  * @{
46  */
47
48 /** Platform specific text line break.
49  * @deprecated Use text I/O streams and '\\n'. See iprt/stream.h. */
50 #if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
51 # define RTFILE_LINEFEED    "\r\n"
52 #else
53 # define RTFILE_LINEFEED    "\n"
54 #endif
55
56
57 #ifdef IN_RING3
58
59 /** @name Open flags
60  * @{ */
61 /** Open the file with read access. */
62 #define RTFILE_O_READ               0x00000001
63 /** Open the file with write access. */
64 #define RTFILE_O_WRITE              0x00000002
65 /** Open the file with read & write access. */
66 #define RTFILE_O_READWRITE          0x00000003
67 /** The file access mask.
68  * @remark The value 0 is invalid. */
69 #define RTFILE_O_ACCESS_MASK        0x00000003
70
71 /** Sharing mode: deny none (the default mode). */
72 #define RTFILE_O_DENY_NONE          0x00000000
73 /** Sharing mode: deny read. */
74 #define RTFILE_O_DENY_READ          0x00000010
75 /** Sharing mode: deny write. */
76 #define RTFILE_O_DENY_WRITE         0x00000020
77 /** Sharing mode: deny read and write. */
78 #define RTFILE_O_DENY_READWRITE     0x00000030
79 /** Sharing mode: deny all. */
80 #define RTFILE_O_DENY_ALL           RTFILE_O_DENY_READWRITE
81 /** Sharing mode: do NOT deny delete (NT).
82  * @remark  This might not be implemented on all platforms,
83  *          and will be defaulted & ignored on those.
84  */
85 #define RTFILE_O_DENY_NOT_DELETE    0x00000040
86 /** Sharing mode mask. */
87 #define RTFILE_O_DENY_MASK          0x00000070
88
89 /** Action: Open an existing file (the default action). */
90 #define RTFILE_O_OPEN               0x00000000
91 /** Action: Create a new file or open an existing one. */
92 #define RTFILE_O_OPEN_CREATE        0x00000100
93 /** Action: Create a new a file. */
94 #define RTFILE_O_CREATE             0x00000200
95 /** Action: Create a new file or replace an existing one. */
96 #define RTFILE_O_CREATE_REPLACE     0x00000300
97 /** Action mask. */
98 #define RTFILE_O_ACTION_MASK        0x00000300
99
100 /** Turns off indexing of files on Windows hosts, *CREATE* only.
101  * @remark  This might not be implemented on all platforms,
102  *          and will be ignored on those.
103  */
104 #define RTFILE_O_NOT_CONTENT_INDEXED 0x00000800
105 /** Truncate the file.
106  * @remark  This will not truncate files opened for read-only.
107  * @remark  The trunction doesn't have to be atomically, so anyone
108  *          else opening the file may be racing us. The caller is
109  *          responsible for not causing this race. */
110 #define RTFILE_O_TRUNCATE           0x00001000
111 /** Make the handle inheritable on RTProcessCreate(/exec). */
112 #define RTFILE_O_INHERIT            0x00002000
113 /** Open file in non-blocking mode - non-portable.
114  * @remark  This flag may not be supported on all platforms, in which
115  *          case it's considered an invalid parameter.
116  */
117 #define RTFILE_O_NON_BLOCK          0x00004000
118 /** Write through directly to disk. Workaround to avoid iSCSI
119  * initiator deadlocks on Windows hosts.
120  * @remark  This might not be implemented on all platforms,
121  *          and will be ignored on those.
122  */
123 #define RTFILE_O_WRITE_THROUGH      0x00008000
124 /** Unix file mode mask for use when creating files. */
125 #define RTFILE_O_CREATE_MODE_MASK   0x1ff00000
126 /** The number of bits to shift to get the file mode mask.
127  * To extract it: (fFlags & RTFILE_O_CREATE_MODE_MASK) >> RTFILE_O_CREATE_MODE_SHIFT.
128  */
129 #define RTFILE_O_CREATE_MODE_SHIFT  20
130
131 /** Mask of all valid flags.
132  * @remark  This doesn't validate the access mode properly.
133  */
134 #define RTFILE_O_VALID_MASK          0x1ff0FB73
135
136 /** @} */
137
138
139 /**
140  * Force the use of open flags for all files opened after the setting is
141  * changed. The caller is responsible for not causing races with RTFileOpen().
142  *
143  * @returns iprt status code.
144  * @param   fOpenForAccess  Access mode to which the set/mask settings apply.
145  * @param   fSet            Open flags to be forced set.
146  * @param   fMask           Open flags to be masked out.
147  */
148 RTR3DECL(int) RTFileSetForceFlags(unsigned fOpenForAccess, unsigned fSet, unsigned fMask);
149
150 /**
151  * Open a file.
152  *
153  * @returns iprt status code.
154  * @param   pFile           Where to store the handle to the opened file.
155  * @param   pszFilename     Path to the file which is to be opened. (UTF-8)
156  * @param   fOpen           Open flags, i.e a combination of the RTFILE_O_* defines.
157  */
158 RTR3DECL(int) RTFileOpen(PRTFILE pFile, const char *pszFilename, unsigned fOpen);
159
160 /**
161  * Close a file opened by RTFileOpen().
162  *
163  * @returns iprt status code.
164  * @param   File            The file handle to close.
165  */
166 RTR3DECL(int)  RTFileClose(RTFILE File);
167
168 /**
169  * Creates an IPRT file handle from a native one.
170  *
171  * @returns IPRT status code.
172  * @param   pFile           Where to store the IPRT file handle.
173  * @param   uNative         The native handle.
174  */
175 RTR3DECL(int) RTFileFromNative(PRTFILE pFile, RTHCINTPTR uNative);
176
177 /**
178  * Gets the native handle for an IPRT file handle.
179  *
180  * @return  The native handle.
181  * @params  File            The IPRT file handle.
182  */
183 RTR3DECL(RTHCINTPTR) RTFileToNative(RTFILE File);
184
185 /**
186  * Delete a file.
187  *
188  * @returns iprt status code.
189  * @param   pszFilename     Path to the file which is to be deleted. (UTF-8)
190  * @todo    This is a RTPath api!
191  */
192 RTR3DECL(int) RTFileDelete(const char *pszFilename);
193
194 /** @name Seek flags.
195  * @{ */
196 /** Seek from the start of the file. */
197 #define RTFILE_SEEK_BEGIN     0x00
198 /** Seek from the current file position. */
199 #define RTFILE_SEEK_CURRENT   0x01
200 /** Seek from the end of the file. */
201 #define RTFILE_SEEK_END       0x02
202 /** @internal */
203 #define RTFILE_SEEK_FIRST     RTFILE_SEEK_BEGIN
204 /** @internal */
205 #define RTFILE_SEEK_LAST      RTFILE_SEEK_END
206 /** @} */
207
208
209 /**
210  * Changes the read & write position in a file.
211  *
212  * @returns iprt status code.
213  * @param   File        Handle to the file.
214  * @param   offSeek     Offset to seek.
215  * @param   uMethod     Seek method, i.e. one of the RTFILE_SEEK_* defines.
216  * @param   poffActual  Where to store the new file position.
217  *                      NULL is allowed.
218  */
219 RTR3DECL(int) RTFileSeek(RTFILE File, int64_t offSeek, unsigned uMethod, uint64_t *poffActual);
220
221 /**
222  * Read bytes from a file.
223  *
224  * @returns iprt status code.
225  * @param   File        Handle to the file.
226  * @param   pvBuf       Where to put the bytes we read.
227  * @param   cbToRead    How much to read.
228  * @param   *pcbRead    How much we actually read .
229  *                      If NULL an error will be returned for a partial read.
230  */
231 RTR3DECL(int) RTFileRead(RTFILE File, void *pvBuf, size_t cbToRead, size_t *pcbRead);
232
233 /**
234  * Read bytes from a file at a given offset.
235  * This function may modify the file position.
236  *
237  * @returns iprt status code.
238  * @param   File        Handle to the file.
239  * @param   off         Where to read.
240  * @param   pvBuf       Where to put the bytes we read.
241  * @param   cbToRead    How much to read.
242  * @param   *pcbRead    How much we actually read .
243  *                      If NULL an error will be returned for a partial read.
244  */
245 RTR3DECL(int) RTFileReadAt(RTFILE File, RTFOFF off, void *pvBuf, size_t cbToRead, size_t *pcbRead);
246
247 /**
248  * Write bytes to a file.
249  *
250  * @returns iprt status code.
251  * @param   File        Handle to the file.
252  * @param   pvBuf       What to write.
253  * @param   cbToWrite   How much to write.
254  * @param   *pcbWritten How much we actually wrote.
255  *                      If NULL an error will be returned for a partial write.
256  */
257 RTR3DECL(int) RTFileWrite(RTFILE File, const void *pvBuf, size_t cbToWrite, size_t *pcbWritten);
258
259 /**
260  * Write bytes to a file at a given offset.
261  * This function may modify the file position.
262  *
263  * @returns iprt status code.
264  * @param   File        Handle to the file.
265  * @param   off         Where to write.
266  * @param   pvBuf       What to write.
267  * @param   cbToWrite   How much to write.
268  * @param   *pcbWritten How much we actually wrote.
269  *                      If NULL an error will be returned for a partial write.
270  */
271 RTR3DECL(int) RTFileWriteAt(RTFILE File, RTFOFF off, const void *pvBuf, size_t cbToWrite, size_t *pcbWritten);
272
273 /**
274  * Flushes the buffers for the specified file.
275  *
276  * @returns iprt status code.
277  * @param   File        Handle to the file.
278  */
279 RTR3DECL(int)  RTFileFlush(RTFILE File);
280
281 /**
282  * Set the size of the file.
283  *
284  * @returns iprt status code.
285  * @param   File        Handle to the file.
286  * @param   cbSize      The new file size.
287  */
288 RTR3DECL(int)  RTFileSetSize(RTFILE File, uint64_t cbSize);
289
290 /**
291  * Query the size of the file.
292  *
293  * @returns iprt status code.
294  * @param   File        Handle to the file.
295  * @param   pcbSize     Where to store the filesize.
296  */
297 RTR3DECL(int)  RTFileGetSize(RTFILE File, uint64_t *pcbSize);
298
299 /**
300  * Determine the maximum file size.
301  *
302  * @returns The max size of the file.
303  *          -1 on failure, the file position is undefined.
304  * @param   File        Handle to the file.
305  * @see     RTFileGetMaxSizeEx.
306  */
307 RTR3DECL(RTFOFF) RTFileGetMaxSize(RTFILE File);
308
309 /**
310  * Determine the maximum file size.
311  *
312  * @returns IPRT status code.
313  * @param   File        Handle to the file.
314  * @param   pcbMax      Where to store the max file size.
315  * @see     RTFileGetMaxSize.
316  */
317 RTR3DECL(int) RTFileGetMaxSizeEx(RTFILE File, PRTFOFF pcbMax);
318
319 /**
320  * Determine the maximum file size depending on the file system the file is stored on.
321  *
322  * @returns The max size of the file.
323  *          -1 on failure.
324  * @param   File        Handle to the file.
325  */
326 RTR3DECL(RTFOFF) RTFileGetMaxSize(RTFILE File);
327
328 /**
329  * Gets the current file position.
330  *
331  * @returns File offset.
332  * @returns ~0UUL on failure.
333  * @param   File        Handle to the file.
334  */
335 RTDECL(uint64_t)  RTFileTell(RTFILE File);
336
337 /**
338  * Checks if the supplied handle is valid.
339  *
340  * @returns true if valid.
341  * @returns false if invalid.
342  * @param   File        The file handle
343  */
344 RTR3DECL(bool) RTFileIsValid(RTFILE File);
345
346 /**
347  * Copies a file.
348  *
349  * @returns VERR_ALREADY_EXISTS if the destination file exists.
350  * @returns VBox Status code.
351  *
352  * @param   pszSrc      The path to the source file.
353  * @param   pszDst      The path to the destination file.
354  *                      This file will be created.
355  */
356 RTDECL(int) RTFileCopy(const char *pszSrc, const char *pszDst);
357
358 /**
359  * Copies a file given the handles to both files.
360  *
361  * @returns VBox Status code.
362  *
363  * @param   FileSrc     The source file. The file position is unaltered.
364  * @param   FileDst     The destination file.
365  *                      On successful returns the file position is at the end of the file.
366  *                      On failures the file position and size is undefined.
367  */
368 RTDECL(int) RTFileCopyByHandles(RTFILE FileSrc, RTFILE FileDst);
369
370 /** Flags for RTFileCopyEx().
371  * @{ */
372 /** Do not use RTFILE_O_DENY_WRITE on the source file to allow for copying files opened for writing. */
373 #define RTFILECOPY_FLAGS_NO_SRC_DENY_WRITE  RT_BIT(0)
374 /** Do not use RTFILE_O_DENY_WRITE on the target file. */
375 #define RTFILECOPY_FLAGS_NO_DST_DENY_WRITE  RT_BIT(1)
376 /** Do not use RTFILE_O_DENY_WRITE on either of the two files. */
377 #define RTFILECOPY_FLAGS_NO_DENY_WRITE      ( RTFILECOPY_FLAGS_NO_SRC_DENY_WRITE | RTFILECOPY_FLAGS_NO_DST_DENY_WRITE )
378 /** */
379 #define RTFILECOPY_FLAGS_MASK               UINT32_C(0x00000003)
380 /** @} */
381
382 /**
383  * Copies a file.
384  *
385  * @returns VERR_ALREADY_EXISTS if the destination file exists.
386  * @returns VBox Status code.
387  *
388  * @param   pszSrc      The path to the source file.
389  * @param   pszDst      The path to the destination file.
390  *                      This file will be created.
391  * @param   fFlags      Flags (RTFILECOPY_*).
392  * @param   pfnProgress Pointer to callback function for reporting progress.
393  * @param   pvUser      User argument to pass to pfnProgress along with the completion precentage.
394  */
395 RTDECL(int) RTFileCopyEx(const char *pszSrc, const char *pszDst, uint32_t fFlags, PFNRTPROGRESS pfnProgress, void *pvUser);
396
397 /**
398  * Copies a file given the handles to both files and
399  * provide progress callbacks.
400  *
401  * @returns IPRT status code.
402  *
403  * @param   FileSrc     The source file. The file position is unaltered.
404  * @param   FileDst     The destination file.
405  *                      On successful returns the file position is at the end of the file.
406  *                      On failures the file position and size is undefined.
407  * @param   pfnProgress Pointer to callback function for reporting progress.
408  * @param   pvUser      User argument to pass to pfnProgress along with the completion precentage.
409  */
410 RTDECL(int) RTFileCopyByHandlesEx(RTFILE FileSrc, RTFILE FileDst, PFNRTPROGRESS pfnProgress, void *pvUser);
411
412 /**
413  * Renames a file.
414  *
415  * Identical to RTPathRename except that it will ensure that the source is not a directory.
416  *
417  * @returns IPRT status code.
418  * @returns VERR_ALREADY_EXISTS if the destination file exists.
419  *
420  * @param   pszSrc      The path to the source file.
421  * @param   pszDst      The path to the destination file.
422  *                      This file will be created.
423  * @param   fRename     See RTPathRename.
424  */
425 RTDECL(int) RTFileRename(const char *pszSrc, const char *pszDst, unsigned fRename);
426
427
428 /** @name RTFileMove flags (bit masks).
429  * @{ */
430 /** Replace destination file if present. */
431 #define RTFILEMOVE_FLAGS_REPLACE    0x1
432 /** @} */
433
434 /**
435  * Moves a file.
436  *
437  * RTFileMove differs from RTFileRename in that it works across volumes.
438  *
439  * @returns IPRT status code.
440  * @returns VERR_ALREADY_EXISTS if the destination file exists.
441  *
442  * @param   pszSrc      The path to the source file.
443  * @param   pszDst      The path to the destination file.
444  *                      This file will be created.
445  * @param   fMove       A combination of the RTFILEMOVE_* flags.
446  */
447 RTDECL(int) RTFileMove(const char *pszSrc, const char *pszDst, unsigned fMove);
448
449
450 /** @page   pg_rt_filelock      RT File locking API description
451  *
452  * File locking general rules:
453  *
454  * Region to lock or unlock can be located beyond the end of file, this can be used for
455  * growing files.
456  * Read (or Shared) locks can be acquired held by an unlimited number of processes at the
457  * same time, but a Write (or Exclusive) lock can only be acquired by one process, and
458  * cannot coexist with a Shared lock. To acquire a Read lock, a process must wait until
459  * there are no processes holding any Write locks. To acquire a Write lock, a process must
460  * wait until there are no processes holding either kind of lock.
461  * By default, RTFileLock and RTFileChangeLock calls returns error immediately if the lock
462  * can't be acquired due to conflict with other locks, however they can be called in wait mode.
463  *
464  * Differences in implementation:
465  *
466  * Win32, OS/2: Locking is mandatory, since locks are enforced by the operating system.
467  * I.e. when file region is locked in Read mode, any write in it will fail; in case of Write
468  * lock - region can be readed and writed only by lock's owner.
469  *
470  * Win32: File size change (RTFileSetSize) is not controlled by locking at all (!) in the
471  * operation system. Also see comments to RTFileChangeLock API call.
472  *
473  * Linux/Posix: By default locks in Unixes are advisory. This means that cooperating processes
474  * may use locks to coordonate access to a file between themselves, but programs are also free
475  * to ignore locks and access the file in any way they choose to.
476  *
477  * Additional reading:
478  *     http://en.wikipedia.org/wiki/File_locking
479  *     http://unixhelp.ed.ac.uk/CGI/man-cgi?fcntl+2
480  *     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/lockfileex.asp
481  */
482
483 /** @name Lock flags (bit masks).
484  * @{ */
485 /** Read access, can be shared with others. */
486 #define RTFILE_LOCK_READ            0x00
487 /** Write access, one at a time. */
488 #define RTFILE_LOCK_WRITE           0x01
489 /** Don't wait for other locks to be released. */
490 #define RTFILE_LOCK_IMMEDIATELY     0x00
491 /** Wait till conflicting locks have been released. */
492 #define RTFILE_LOCK_WAIT            0x02
493 /** Valid flags mask */
494 #define RTFILE_LOCK_MASK            0x03
495 /** @} */
496
497
498 /**
499  * Locks a region of file for read (shared) or write (exclusive) access.
500  *
501  * @returns iprt status code.
502  * @returns VERR_FILE_LOCK_VIOLATION if lock can't be acquired.
503  * @param   File        Handle to the file.
504  * @param   fLock       Lock method and flags, see RTFILE_LOCK_* defines.
505  * @param   offLock     Offset of lock start.
506  * @param   cbLock      Length of region to lock, may overlap the end of file.
507  */
508 RTR3DECL(int) RTFileLock(RTFILE File, unsigned fLock, int64_t offLock, uint64_t cbLock);
509
510 /**
511  * Changes a lock type from read to write or from write to read.
512  * The region to type change must correspond exactly to an existing locked region.
513  * If change can't be done due to locking conflict and non-blocking mode is used, error is
514  * returned and lock keeps its state (see next warning).
515  *
516  * WARNING: win32 implementation of this call is not atomic, it transforms to a pair of
517  * calls RTFileUnlock and RTFileLock. Potentially the previously acquired lock can be
518  * lost, i.e. function is called in non-blocking mode, previous lock is freed, new lock can't
519  * be acquired, and old lock (previous state) can't be acquired back too. This situation
520  * may occurs _only_ if the other process is acquiring a _write_ lock in blocking mode or
521  * in race condition with the current call.
522  * In this very bad case special error code VERR_FILE_LOCK_LOST will be returned.
523  *
524  * @returns iprt status code.
525  * @returns VERR_FILE_NOT_LOCKED if region was not locked.
526  * @returns VERR_FILE_LOCK_VIOLATION if lock type can't be changed, lock remains its type.
527  * @returns VERR_FILE_LOCK_LOST if lock was lost, we haven't this lock anymore :(
528  * @param   File        Handle to the file.
529  * @param   fLock       Lock method and flags, see RTFILE_LOCK_* defines.
530  * @param   offLock     Offset of lock start.
531  * @param   cbLock      Length of region to lock, may overlap the end of file.
532  */
533 RTR3DECL(int) RTFileChangeLock(RTFILE File, unsigned fLock, int64_t offLock, uint64_t cbLock);
534
535 /**
536  * Unlocks previously locked region of file.
537  * The region to unlock must correspond exactly to an existing locked region.
538  *
539  * @returns iprt status code.
540  * @returns VERR_FILE_NOT_LOCKED if region was not locked.
541  * @param   File        Handle to the file.
542  * @param   offLock     Offset of lock start.
543  * @param   cbLock      Length of region to unlock, may overlap the end of file.
544  */
545 RTR3DECL(int)  RTFileUnlock(RTFILE File, int64_t offLock, uint64_t cbLock);
546
547
548 /**
549  * Query information about an open file.
550  *
551  * @returns iprt status code.
552  *
553  * @param   File                    Handle to the file.
554  * @param   pObjInfo                Object information structure to be filled on successful return.
555  * @param   enmAdditionalAttribs    Which set of additional attributes to request.
556  *                                  Use RTFSOBJATTRADD_NOTHING if this doesn't matter.
557  */
558 RTR3DECL(int) RTFileQueryInfo(RTFILE File, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs);
559
560 /**
561  * Changes one or more of the timestamps associated of file system object.
562  *
563  * @returns iprt status code.
564  * @returns VERR_NOT_SUPPORTED is returned if the operation isn't supported by the OS.
565  *
566  * @param   File                Handle to the file.
567  * @param   pAccessTime         Pointer to the new access time. NULL if not to be changed.
568  * @param   pModificationTime   Pointer to the new modifcation time. NULL if not to be changed.
569  * @param   pChangeTime         Pointer to the new change time. NULL if not to be changed.
570  * @param   pBirthTime          Pointer to the new time of birth. NULL if not to be changed.
571  *
572  * @remark  The file system might not implement all these time attributes,
573  *          the API will ignore the ones which aren't supported.
574  *
575  * @remark  The file system might not implement the time resolution
576  *          employed by this interface, the time will be chopped to fit.
577  *
578  * @remark  The file system may update the change time even if it's
579  *          not specified.
580  *
581  * @remark  POSIX can only set Access & Modification and will always set both.
582  */
583 RTR3DECL(int) RTFileSetTimes(RTFILE File, PCRTTIMESPEC pAccessTime, PCRTTIMESPEC pModificationTime,
584                              PCRTTIMESPEC pChangeTime, PCRTTIMESPEC pBirthTime);
585
586 /**
587  * Gets one or more of the timestamps associated of file system object.
588  *
589  * @returns iprt status code.
590  * @param   File                Handle to the file.
591  * @param   pAccessTime         Where to store the access time. NULL is ok.
592  * @param   pModificationTime   Where to store the modifcation time. NULL is ok.
593  * @param   pChangeTime         Where to store the change time. NULL is ok.
594  * @param   pBirthTime          Where to store the time of birth. NULL is ok.
595  *
596  * @remark  This is wrapper around RTFileQueryInfo() and exists to complement RTFileSetTimes().
597  */
598 RTR3DECL(int) RTFileGetTimes(RTFILE File, PRTTIMESPEC pAccessTime, PRTTIMESPEC pModificationTime,
599                              PRTTIMESPEC pChangeTime, PRTTIMESPEC pBirthTime);
600
601 /**
602  * Changes the mode flags of an open file.
603  *
604  * The API requires at least one of the mode flag sets (Unix/Dos) to
605  * be set. The type is ignored.
606  *
607  * @returns iprt status code.
608  * @param   File        Handle to the file.
609  * @param   fMode       The new file mode, see @ref grp_rt_fs for details.
610  */
611 RTR3DECL(int) RTFileSetMode(RTFILE File, RTFMODE fMode);
612
613 /**
614  * Gets the mode flags of an open file.
615  *
616  * @returns iprt status code.
617  * @param   File        Handle to the file.
618  * @param   pfMode      Where to store the file mode, see @ref grp_rt_fs for details.
619  *
620  * @remark  This is wrapper around RTFileQueryInfo()
621  *          and exists to complement RTFileSetMode().
622  */
623 RTR3DECL(int) RTFileGetMode(RTFILE File, uint32_t *pfMode);
624
625 /**
626  * Changes the owner and/or group of an open file.
627  *
628  * @returns iprt status code.
629  * @param   File        Handle to the file.
630  * @param   uid         The new file owner user id. Use -1 (or ~0) to leave this unchanged.
631  * @param   gid         The new group id. Use -1 (or ~0) to leave this unchanged.
632  */
633 RTR3DECL(int) RTFileSetOwner(RTFILE File, uint32_t uid, uint32_t gid);
634
635 /**
636  * Gets the owner and/or group of an open file.
637  *
638  * @returns iprt status code.
639  * @param   File        Handle to the file.
640  * @param   pUid        Where to store the owner user id. NULL is ok.
641  * @param   pGid        Where to store the group id. NULL is ok.
642  *
643  * @remark  This is wrapper around RTFileQueryInfo() and exists to complement RTFileGetOwner().
644  */
645 RTR3DECL(int) RTFileGetOwner(RTFILE File, uint32_t *pUid, uint32_t *pGid);
646
647 /**
648  * Executes an IOCTL on a file descriptor.
649  *
650  * This function is currently only available in L4 and posix environments.
651  * Attemps at calling it from code shared with any other platforms will break things!
652  *
653  * The rational for defining this API is to simplify L4 porting of audio drivers,
654  * and to remove some of the assumptions on RTFILE being a file descriptor on
655  * platforms using the posix file implementation.
656  *
657  * @returns iprt status code.
658  * @param   File        Handle to the file.
659  * @param   iRequest    IOCTL request to carry out.
660  * @param   pvData      IOCTL data.
661  * @param   cbData      Size of the IOCTL data.
662  * @param   piRet       Return value of the IOCTL request.
663  */
664 RTR3DECL(int) RTFileIoCtl(RTFILE File, int iRequest, void *pvData, unsigned cbData, int *piRet);
665
666 /**
667  * Reads the file into memory.
668  *
669  * The caller must free the memory using RTFileReadAllFree().
670  *
671  * @returns IPRT status code.
672  * @param   pszFilename     The name of the file.
673  * @param   ppvFile         Where to store the pointer to the memory on successful return.
674  * @param   pcbFile         Where to store the size of the file on successful return.
675  *
676  * @remarks Note that this function may be implemented using memory mapping, which means
677  *          that the file may remain open until RTFileReadAllFree() is called. It also
678  *          means that the return memory may reflect the state of the file when it's
679  *          accessed instead of when this call was done. So, in short, don't use this
680  *          API for volatile files, then rather use the extended variant with a
681  *          yet-to-be-defined.
682  */
683 RTDECL(int) RTFileReadAll(const char *pszFilename, void **ppvFile, size_t *pcbFile);
684
685 /**
686  * Reads the file into memory.
687  *
688  * The caller must free the memory using RTFileReadAllFree().
689  *
690  * @returns IPRT status code.
691  * @param   pszFilename     The name of the file.
692  * @param   off             The offset to start reading at.
693  * @param   cbMax           The maximum number of bytes to read into memory. Specify RTFOFF_MAX
694  *                          to read to the end of the file.
695  * @param   fFlags          Flags for the future, must be 0.
696  * @param   ppvFile         Where to store the pointer to the memory on successful return.
697  * @param   pcbFile         Where to store the size of the file on successful return.
698  *
699  * @remarks See the remarks for RTFileReadAll.
700  */
701 RTDECL(int) RTFileReadAllEx(const char *pszFilename, RTFOFF off, RTFOFF cbMax, uint32_t fFlags, void **ppvFile, size_t *pcbFile);
702
703 /**
704  * Reads the file into memory.
705  *
706  * The caller must free the memory using RTFileReadAllFree().
707  *
708  * @returns IPRT status code.
709  * @param   File            The handle to the file.
710  * @param   ppvFile         Where to store the pointer to the memory on successful return.
711  * @param   pcbFile         Where to store the size of the file on successful return.
712  *
713  * @remarks See the remarks for RTFileReadAll.
714  */
715 RTDECL(int) RTFileReadAllByHandle(RTFILE File, void **ppvFile, size_t *pcbFile);
716
717 /**
718  * Reads the file into memory.
719  *
720  * The caller must free the memory using RTFileReadAllFree().
721  *
722  * @returns IPRT status code.
723  * @param   File            The handle to the file.
724  * @param   off             The offset to start reading at.
725  * @param   cbMax           The maximum number of bytes to read into memory. Specify RTFOFF_MAX
726  *                          to read to the end of the file.
727  * @param   fFlags          Flags for the future, must be 0.
728  * @param   ppvFile         Where to store the pointer to the memory on successful return.
729  * @param   pcbFile         Where to store the size of the file on successful return.
730  *
731  * @remarks See the remarks for RTFileReadAll.
732  */
733 RTDECL(int) RTFileReadAllByHandleEx(RTFILE File, RTFOFF off, RTFOFF cbMax, uint32_t fFlags, void **ppvFile, size_t *pcbFile);
734
735 /**
736  * Frees the memory returned by one of the RTFileReadAll(), RTFileReadAllEx(),
737  * RTFileReadAllByHandle() and RTFileReadAllByHandleEx() functions.
738  *
739  * @param   pvFile          Pointer to the memory.
740  * @param   cbFile          The size of the memory.
741  */
742 RTDECL(int) RTFileReadAllFree(void **ppvFile, size_t *pcbFile);
743
744 #endif /* IN_RING3 */
745
746 /** @} */
747
748 __END_DECLS
749
750 #endif
751
Note: See TracBrowser for help on using the browser.

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy