X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Finclude%2Fvfs_ext.h;h=d7d74c40372a4030ec2431d17157544361ea2d1f;hb=dd2491a82880ed9b01b5d66b1814d271921797a4;hp=c9d51100dad8ec40c4291149c53a22ce2df9e440;hpb=077a1c5d962b20dee54c6b31c8f37d2fe79105ad;p=tpg%2Facess2.git diff --git a/Kernel/include/vfs_ext.h b/Kernel/include/vfs_ext.h index c9d51100..d7d74c40 100644 --- a/Kernel/include/vfs_ext.h +++ b/Kernel/include/vfs_ext.h @@ -6,6 +6,12 @@ #ifndef _VFS_EXT_H #define _VFS_EXT_H +//! Inode number type +typedef Uint64 tInode; + +//! Mountpoint identifier type +typedef Uint32 tMount; + // === CONSTANTS === //! Maximum size of a Memory Path generated by VFS_GetMemPath #define VFS_MEMPATH_SIZE (3 + (BITS/4)*2) @@ -29,6 +35,9 @@ //! Marks a VFS handle as belonging to the kernel #define VFS_KERNEL_FLAG 0x40000000 +//! Architectual maximum number of file descriptors +#define MAX_FILE_DESCS 128 + /** * \brief VFS_Seek directions */ @@ -72,6 +81,29 @@ enum eVFS_SeekDirs * \} */ +/** + * \brief MMap protection flags + * \{ + */ +#define MMAP_PROT_READ 0x001 //!< Readable memory +#define MMAP_PROT_WRITE 0x002 //!< Writable memory +#define MMAP_PROT_EXEC 0x004 //!< Executable memory +/** + * \} + */ + +/** + * \brief MMap mapping flags + * \{ + */ +#define MMAP_MAP_SHARED 0x001 //!< Shared with all other users of the FD +#define MMAP_MAP_PRIVATE 0x002 //!< Local (COW) copy +#define MMAP_MAP_FIXED 0x004 //!< Load to a fixed address +#define MMAP_MAP_ANONYMOUS 0x008 //!< Not associated with a FD +/** + * \} + */ + // -- System Call Structures --- /** * \brief ACL Defintion Structure @@ -86,30 +118,60 @@ typedef struct sVFS_ACL unsigned Inv: 1; //!< Invert Permissions unsigned Perms: 31; //!< Permission Flags }; -} tVFS_ACL; +} tVFS_ACL; /** * \brief SYS_FINFO structure */ typedef struct sFInfo { - Uint uid; //!< Owning User ID - Uint gid; //!< Owning Group ID - Uint flags; //!< File flags + tMount mount; //!< Mountpoint ID + tInode inode; //!< Inode + Uint32 uid; //!< Owning User ID + Uint32 gid; //!< Owning Group ID + Uint32 flags; //!< File flags Uint64 size; //!< File Size Sint64 atime; //!< Last Accessed time Sint64 mtime; //!< Last modified time Sint64 ctime; //!< Creation time - int numacls; //!< Total number of ACL entries + Sint32 numacls; //!< Total number of ACL entries tVFS_ACL acls[]; //!< ACL buffer (size is passed in the \a MaxACLs argument to VFS_FInfo) -} tFInfo; +} PACKED tFInfo; + +/** + * \brief fd_set for select() + */ +typedef struct +{ + //! Bitmap of set file descriptors + Uint16 flags[MAX_FILE_DESCS/16]; +} fd_set; + +/** + * \brief Clear a descriptor flag in a fd_set + * \param fd File descriptor to clear + * \param fdsetp Set to modify + */ +#define FD_CLR(fd, fdsetp) ((fdsetp)->flags[(fd)/16]&=~(1<<((fd)%16))) +/** + * \brief Set a descriptor flag in a fd_set + * \param fd File descriptor to set + * \param fdsetp Set to modify + */ +#define FD_SET(fd, fdsetp) ((fdsetp)->flags[(fd)/16]|=~(1<<((fd)%16))) +/** + * \brief Test a descriptor flag in a fd_set + * \param fd File descriptor to test + * \param fdsetp Set to modify + */ +#define FD_ISSET(fd, fdsetp) ((fdsetp)->flags[(fd)/16]&(1<<((fd)%16))) // === FUNCTIONS === /** * \brief Initialise the VFS (called by system.c) * \return Boolean Success */ -extern int VFS_Init(); +extern int VFS_Init(void); /** * \brief Open a file @@ -117,7 +179,25 @@ extern int VFS_Init(); * \param Mode Flags defining how to open the file * \return VFS Handle (an integer) or -1 if an error occured */ -extern int VFS_Open(char *Path, Uint Mode); +extern int VFS_Open(const char *Path, Uint Mode); +/** + * \brief Opens a file via an open directory + * \note The file to open must be a direct child of the parent + * \param FD Parent Directory + * \param Name Child name + * \param Mode Open mode + * \return File handle (same as returned from VFS_Open) + */ +extern int VFS_OpenChild(int FD, const char *Name, Uint Mode); +/** + * \brief Opens a file given a mount ID and an inode number + * \param Mount Mount ID returned by FInfo + * \param Inode Inode number from FInfo + * \param Mode Open mode (see VFS_Open) + * \return File handle (same as VFS_Open) + */ +extern int VFS_OpenInode(Uint32 Mount, Uint64 Inode, int Mode); + /** * \brief Close a currently open file * \param FD Handle returned by ::VFS_Open @@ -152,23 +232,23 @@ extern int VFS_GetACL(int FD, tVFS_ACL *Dest); * \param Dest New working directory (either absolute or relative to the current) * \return Boolean Success */ -extern int VFS_ChDir(char *Dest); +extern int VFS_ChDir(const char *Dest); /** * \brief Change the current virtual root for the user * \param New New virtual root (same as ::VFS_ChDir but cannot go * above the current virtual root) * \return Boolean success */ -extern int VFS_ChRoot(char *New); +extern int VFS_ChRoot(const char *New); /** * \brief Change the location of the current file pointer * \param FD File handle returned by ::VFS_Open * \param Offset Offset within the file to go to - * \param Direction A direction from ::eVFS_SeekDirs + * \param Whence A direction from ::eVFS_SeekDirs * \return Boolean success */ -extern int VFS_Seek(int FD, Sint64 Offset, int Direction); +extern int VFS_Seek(int FD, Sint64 Offset, int Whence); /** * \brief Returns the current file pointer * \param FD File handle returned by ::VFS_Open @@ -191,7 +271,7 @@ extern Uint64 VFS_Read(int FD, Uint64 Length, void *Buffer); * \param Buffer Source of written data * \return Number of bytes written */ -extern Uint64 VFS_Write(int FD, Uint64 Length, void *Buffer); +extern Uint64 VFS_Write(int FD, Uint64 Length, const void *Buffer); /** * \brief Reads from a specific offset in the file @@ -210,7 +290,7 @@ extern Uint64 VFS_ReadAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer); * \param Buffer Source of written data * \return Number of bytes written */ -extern Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer); +extern Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, const void *Buffer); /** * \brief Sends an IOCtl request to the driver @@ -234,7 +314,7 @@ extern void VFS_GetMemPath(char *Dest, void *Base, Uint Length); * \param Path File path (may contain symlinks, relative elements etc.) * \return Absolute path with no symlinks */ -extern char *VFS_GetTruePath(char *Path); +extern char *VFS_GetTruePath(const char *Path); /** * \brief Mounts a filesystem @@ -244,21 +324,21 @@ extern char *VFS_GetTruePath(char *Path); * \param Options Options string to pass the driver * \return 1 on succes, -1 on error */ -extern int VFS_Mount(char *Device, char *MountPoint, char *Filesystem, char *Options); +extern int VFS_Mount(const char *Device, const char *MountPoint, const char *Filesystem, const char *Options); /** * \brief Create a new directory * \param Path Path to new directory (absolute or relative) * \return Boolean success * \note The parent of the directory must exist */ -extern int VFS_MkDir(char *Path); +extern int VFS_MkDir(const char *Path); /** * \brief Create a symbolic link * \param Name Name of the symbolic link * \param Link File the symlink points to * \return Boolean success (\a Link is not tested for existence) */ -extern int VFS_Symlink(char *Name, char *Link); +extern int VFS_Symlink(const char *Name, const char *Link); /** * \brief Read from a directory * \param FD File handle returned by ::VFS_Open @@ -267,14 +347,32 @@ extern int VFS_Symlink(char *Name, char *Link); */ extern int VFS_ReadDir(int FD, char *Dest); /** - * \brief Opens a file via an open directory - * \note The file to open must be a direct child of the parent - * \param Errno Error number - * \param FD Parent Directory - * \param Name Child name - * \param Mode Open mode - * \return File handle (same as returned from VFS_Open) + * \brief Wait for an aciton on a file descriptor + * \param MaxHandle Maximum set handle in \a *Handles + * \param ReadHandles Handles to wait for data on + * \param WriteHandles Handles to wait to write to + * \param ErrHandles Handle to wait for errors on + * \param Timeout Timeout for select() (if null, there is no timeout), if zero select() is non blocking + * \param IsKernel Use kernel handles as opposed to user handles + * \return Number of handles that actioned + */ +extern int VFS_Select(int MaxHandle, fd_set *ReadHandles, fd_set *WriteHandles, fd_set *ErrHandles, tTime *Timeout, BOOL IsKernel); + +/** + * \brief Map a file into memory + * \param DestHint Suggested place for read data + * \param Length Size of area to map + * \param Protection Protection type (see `man mmap`) + * \param Flags Mapping flags + * \param FD File descriptor to load from + * \param Offset Start of region */ -extern int VFS_OpenChild(Uint *Errno, int FD, char *Name, Uint Mode); +extern void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, Uint64 Offset); +/** + * \brief Unmap memory allocated by VFS_MMap + * \param Addr Address of data to unmap + * \param Length Length of data + */ +extern int VFS_MUnmap(void *Addr, size_t Length); #endif