* \{
*/
//! Open for execution
-#define VFS_OPENFLAG_EXEC 0x01
+#define VFS_OPENFLAG_EXEC 0x001
//! Open for reading
-#define VFS_OPENFLAG_READ 0x02
+#define VFS_OPENFLAG_READ 0x002
//! Open for writing
-#define VFS_OPENFLAG_WRITE 0x04
+#define VFS_OPENFLAG_WRITE 0x004
//! Do not resolve the final symbolic link
-#define VFS_OPENFLAG_NOLINK 0x40
+#define VFS_OPENFLAG_NOLINK 0x040
//! Create the file if it doesn't exist
-#define VFS_OPENFLAG_CREATE 0x80
+#define VFS_OPENFLAG_CREATE 0x080
+//! Open file as non-blocking
+#define VFS_OPENFLAG_NONBLOCK 0x100
//! Treat as a directory
-#define VFS_OPENFLAG_DIRECTORY 0x100
+#define VFS_OPENFLAG_DIRECTORY 0x1000
//! Open as a user
#define VFS_OPENFLAG_USER 0x8000
/**
* \name ACL Permissions
* \{
*/
-/**
- * \brief Readable
- */
-#define VFS_PERM_READ 0x00000001
-/**
- * \brief Writeable
- */
-#define VFS_PERM_WRITE 0x00000002
-/**
- * \brief Append allowed
- */
-#define VFS_PERM_APPEND 0x00000004
-/**
- * \brief Executable
- */
-#define VFS_PERM_EXECUTE 0x00000008
-/**
- * \brief All permissions granted
- */
-#define VFS_PERM_ALL 0x7FFFFFFF // Mask for permissions
-/**
- * \brief Denies instead of granting permissions
- * \note Denials take precedence
- */
-#define VFS_PERM_DENY 0x80000000 // Inverts permissions
+#define VFS_PERM_READ 0x00000001 //!< Readable
+#define VFS_PERM_WRITE 0x00000002 //!< Writable
+#define VFS_PERM_APPEND 0x00000004 //!< Appendable (/create file)
+#define VFS_PERM_EXEC 0x00000008 //!< Executable (/Traversable)
+#define VFS_PERM_ALL 0x7FFFFFFF //!< All permission bits
+#define VFS_PERM_DENY 0x80000000 //!< Flag for denying a permission set (higher precedence)
/**
* \}
*/
*/
extern int VFS_OpenInode(Uint32 Mount, Uint64 Inode, int Mode);
+/**
+ * \brief Open a file reusing an old FD
+ */
+extern int VFS_Reopen(int FD, const char *Path, int Flags);
+
/**
* \brief Close a currently open file
* \param FD Handle returned by ::VFS_Open
*/
extern int VFS_DuplicateFD(int SrcFD, int DstFD);
+/**
+ * \brief Update the flags on a FD
+ */
+extern int VFS_SetFDFlags(int FD, int Mask, int Value);
+
+/**
+ * \brief Save specified file handle such that it can be passed between processes
+ * \param FD File descriptor to save
+ * \return Marshalled handle, or (uint64_t)-1 on error
+ */
+extern Uint64 VFS_MarshalHandle(int FD);
+
+/**
+ * \brief Restore a marshalled handle into the current process
+ * \param Handle returned by VFS_MarshalHandle
+ * \return File descriptor, or -1 on error
+ */
+extern int VFS_UnmarshalHandle(Uint64 Handle);
+
/**
* \brief Get file information from an open file
* \param FD File handle returned by ::VFS_Open
*/
extern size_t VFS_WriteAt(int FD, Uint64 Offset, size_t Length, const void *Buffer);
+/**
+ * \brief Set the valid size of a file
+ * \param FD File descriptor
+ * \param Size New file size
+ * \return Actual new file size (-1 if error occurred)
+ *
+ * \note Not all files support this call (will return ENOTIMPL)
+ */
+extern off_t VFS_Truncate(int FD, off_t Size);
+
/**
* \brief Sends an IOCtl request to the driver
* \param FD File handle returned by ::VFS_Open