mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Implement file seek
This commit is contained in:
parent
b0e0415b3e
commit
50a0857524
@ -46,10 +46,45 @@ namespace Memory
|
|||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SeekFSFunction(MEM_Seek)
|
||||||
|
{
|
||||||
|
long NewOffset;
|
||||||
|
|
||||||
|
if (Whence == SEEK_SET)
|
||||||
|
{
|
||||||
|
if (Offset > node->Length)
|
||||||
|
return -1;
|
||||||
|
node->Offset = Offset;
|
||||||
|
NewOffset = node->Offset;
|
||||||
|
}
|
||||||
|
else if (Whence == SEEK_CUR)
|
||||||
|
{
|
||||||
|
NewOffset = node->Offset + Offset;
|
||||||
|
if (NewOffset > node->Length || NewOffset < 0)
|
||||||
|
return -1;
|
||||||
|
node->Offset = NewOffset;
|
||||||
|
}
|
||||||
|
else if (Whence == SEEK_END)
|
||||||
|
{
|
||||||
|
NewOffset = node->Length + Offset;
|
||||||
|
if (NewOffset < 0)
|
||||||
|
return -1;
|
||||||
|
node->Offset = NewOffset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error("Invalid whence!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewOffset;
|
||||||
|
}
|
||||||
|
|
||||||
VirtualFileSystem::FileSystemOperations mem_op = {
|
VirtualFileSystem::FileSystemOperations mem_op = {
|
||||||
.Name = "mem",
|
.Name = "mem",
|
||||||
.Read = MEM_Read,
|
.Read = MEM_Read,
|
||||||
.Write = MEM_Write,
|
.Write = MEM_Write,
|
||||||
|
.Seek = MEM_Seek,
|
||||||
};
|
};
|
||||||
|
|
||||||
uint64_t MemMgr::GetAllocatedMemorySize()
|
uint64_t MemMgr::GetAllocatedMemorySize()
|
||||||
|
@ -36,9 +36,44 @@ namespace VirtualFileSystem
|
|||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SeekFSFunction(USTAR_Seek)
|
||||||
|
{
|
||||||
|
long NewOffset;
|
||||||
|
|
||||||
|
if (Whence == SEEK_SET)
|
||||||
|
{
|
||||||
|
if (Offset > node->Length)
|
||||||
|
return -1;
|
||||||
|
node->Offset = Offset;
|
||||||
|
NewOffset = node->Offset;
|
||||||
|
}
|
||||||
|
else if (Whence == SEEK_CUR)
|
||||||
|
{
|
||||||
|
NewOffset = node->Offset + Offset;
|
||||||
|
if (NewOffset > node->Length || NewOffset < 0)
|
||||||
|
return -1;
|
||||||
|
node->Offset = NewOffset;
|
||||||
|
}
|
||||||
|
else if (Whence == SEEK_END)
|
||||||
|
{
|
||||||
|
NewOffset = node->Length + Offset;
|
||||||
|
if (NewOffset < 0)
|
||||||
|
return -1;
|
||||||
|
node->Offset = NewOffset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error("Invalid whence!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewOffset;
|
||||||
|
}
|
||||||
|
|
||||||
FileSystemOperations ustar_op = {
|
FileSystemOperations ustar_op = {
|
||||||
.Name = "ustar",
|
.Name = "ustar",
|
||||||
.Read = USTAR_Read,
|
.Read = USTAR_Read,
|
||||||
|
.Seek = USTAR_Seek,
|
||||||
};
|
};
|
||||||
|
|
||||||
USTAR::USTAR(uintptr_t Address, Virtual *vfs_ctx)
|
USTAR::USTAR(uintptr_t Address, Virtual *vfs_ctx)
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <memory.hpp>
|
#include <memory.hpp>
|
||||||
#include <lock.hpp>
|
#include <lock.hpp>
|
||||||
#include <exec.hpp>
|
#include <exec.hpp>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
@ -301,10 +302,19 @@ static uint64_t sys_file_write(SyscallsFrame *Frame, void *KernelPrivate, uint64
|
|||||||
UNUSED(Frame);
|
UNUSED(Frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sys_file_seek(SyscallsFrame *Frame)
|
static uint64_t sys_file_seek(SyscallsFrame *Frame, void *KernelPrivate, uint64_t Offset, int Whence)
|
||||||
{
|
{
|
||||||
fixme("sys_file_seek: %#lx", Frame);
|
if (KernelPrivate == nullptr)
|
||||||
return SYSCALL_NOT_IMPLEMENTED;
|
return 0;
|
||||||
|
|
||||||
|
debug("(KernelPrivate: %#lx, Offset: %#lx, Whence: %#lx)", KernelPrivate, Offset, Whence);
|
||||||
|
VirtualFileSystem::File *KPObj = (VirtualFileSystem::File *)KernelPrivate;
|
||||||
|
|
||||||
|
if (KPObj->node->Operator->Seek == nullptr)
|
||||||
|
return SYSCALL_INTERNAL_ERROR;
|
||||||
|
|
||||||
|
return KPObj->node->Operator->Seek(KPObj->node, Offset, Whence);
|
||||||
|
UNUSED(Frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sys_file_status(SyscallsFrame *Frame)
|
static int sys_file_status(SyscallsFrame *Frame)
|
||||||
|
@ -26,6 +26,10 @@ namespace VirtualFileSystem
|
|||||||
{
|
{
|
||||||
#define FILENAME_LENGTH 256
|
#define FILENAME_LENGTH 256
|
||||||
|
|
||||||
|
#define SEEK_SET 0
|
||||||
|
#define SEEK_CUR 1
|
||||||
|
#define SEEK_END 2
|
||||||
|
|
||||||
struct Node;
|
struct Node;
|
||||||
|
|
||||||
typedef size_t (*OperationMount)(const char *, unsigned long, const void *);
|
typedef size_t (*OperationMount)(const char *, unsigned long, const void *);
|
||||||
@ -37,6 +41,7 @@ namespace VirtualFileSystem
|
|||||||
typedef size_t (*OperationSync)(void);
|
typedef size_t (*OperationSync)(void);
|
||||||
typedef void (*OperationCreate)(Node *node, char *Name, uint16_t NameLength);
|
typedef void (*OperationCreate)(Node *node, char *Name, uint16_t NameLength);
|
||||||
typedef void (*OperationMkdir)(Node *node, char *Name, uint16_t NameLength);
|
typedef void (*OperationMkdir)(Node *node, char *Name, uint16_t NameLength);
|
||||||
|
typedef size_t (*OperationSeek)(Node *node, size_t Offset, uint8_t Whence);
|
||||||
|
|
||||||
#define MountFSFunction(name) size_t name(const char *unknown0, unsigned long unknown1, const uint8_t *unknown2)
|
#define MountFSFunction(name) size_t name(const char *unknown0, unsigned long unknown1, const uint8_t *unknown2)
|
||||||
#define UMountFSFunction(name) size_t name(int unknown0)
|
#define UMountFSFunction(name) size_t name(int unknown0)
|
||||||
@ -48,6 +53,7 @@ namespace VirtualFileSystem
|
|||||||
#define SyncFSFunction(name) size_t name(void)
|
#define SyncFSFunction(name) size_t name(void)
|
||||||
#define CreateFSFunction(name) void name(VirtualFileSystem::Node *node, char *Name, uint16_t NameLength)
|
#define CreateFSFunction(name) void name(VirtualFileSystem::Node *node, char *Name, uint16_t NameLength)
|
||||||
#define MkdirFSFunction(name) void name(VirtualFileSystem::Node *node, char *Name, uint16_t NameLength)
|
#define MkdirFSFunction(name) void name(VirtualFileSystem::Node *node, char *Name, uint16_t NameLength)
|
||||||
|
#define SeekFSFunction(name) size_t name(VirtualFileSystem::Node *node, size_t Offset, uint8_t Whence)
|
||||||
|
|
||||||
enum FileStatus
|
enum FileStatus
|
||||||
{
|
{
|
||||||
@ -101,6 +107,7 @@ namespace VirtualFileSystem
|
|||||||
OperationClose Close = nullptr;
|
OperationClose Close = nullptr;
|
||||||
OperationCreate Create = nullptr;
|
OperationCreate Create = nullptr;
|
||||||
OperationMkdir MakeDirectory = nullptr;
|
OperationMkdir MakeDirectory = nullptr;
|
||||||
|
OperationSeek Seek = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Node
|
struct Node
|
||||||
@ -113,6 +120,7 @@ namespace VirtualFileSystem
|
|||||||
uint64_t UserIdentifier = 0, GroupIdentifier = 0;
|
uint64_t UserIdentifier = 0, GroupIdentifier = 0;
|
||||||
uintptr_t Address = 0;
|
uintptr_t Address = 0;
|
||||||
size_t Length = 0;
|
size_t Length = 0;
|
||||||
|
uint64_t Offset = 0;
|
||||||
Node *Parent = nullptr;
|
Node *Parent = nullptr;
|
||||||
FileSystemOperations *Operator = nullptr;
|
FileSystemOperations *Operator = nullptr;
|
||||||
/* For root node:
|
/* For root node:
|
||||||
|
@ -109,7 +109,7 @@ enum NativeSyscalls
|
|||||||
_FileWrite,
|
_FileWrite,
|
||||||
|
|
||||||
/** @brief Seek in a file
|
/** @brief Seek in a file
|
||||||
* @fn
|
* @fn uint64_t FileSeek(void *KernelPrivate, uint64_t Offset, int Whence)
|
||||||
* This syscall is used to change the current offset in a file.
|
* This syscall is used to change the current offset in a file.
|
||||||
*/
|
*/
|
||||||
_FileSeek,
|
_FileSeek,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user