#include <stdlib.h>
#include <os/os.h>
#include <os/fs.h>
#include <string.h>
#include <os/device.h>
addr_t fsOpen(const wchar_t* path)
{
static wchar_t fullpath[MAX_PATH];
addr_t ret;
if (!fsFullPath(path, fullpath))
return NULL;
asm("int $0x30" : "=a" (ret) : "a" (0x700), "b" (fullpath));
return ret;
}
bool fsClose(addr_t fd)
{
bool ret;
asm("int $0x30" : "=a" (ret) : "a" (0x701), "b" (fd));
return ret;
}
bool fsRequest(addr_t fd, request_t* req, size_t size)
{
bool ret;
asm("int $0x30" : "=a" (ret) : "a" (0x702), "b" (fd), "c" (req), "d" (size));
return ret;
}
bool fsRequestSync(addr_t fd, request_t* req, size_t size)
{
if (!fsRequest(fd, req, size))
{
devUserFinishRequest(req, true);
return false;
}
thrWaitHandle(&req->header.event, 1, true);
devUserFinishRequest(req, true);
if (req->header.result)
sysSetErrno(req->header.result);
return req->header.result == 0;
}
bool fsRead(addr_t fd, void* buffer, size_t* length)
{
request_t req;
req.header.code = FS_READ;
req.params.fs_read.buffer = (addr_t) buffer;
req.params.fs_read.length = *length;
req.params.fs_read.fd = fd;
if (!fsRequest(fd, &req, sizeof(req)))
{
devUserFinishRequest(&req, true);
*length = req.params.fs_read.length;
sysSetErrno(req.header.result);
return false;
}
thrWaitHandle(&req.header.event, 1, true);
devUserFinishRequest(&req, true);
*length = req.params.fs_read.length;
if (req.header.result)
sysSetErrno(req.header.result);
return req.header.result == 0;
}
bool fsWrite(addr_t fd, const void* buffer, size_t* length)
{
request_t req;
req.header.code = FS_WRITE;
req.params.fs_write.buffer = (addr_t) buffer;
req.params.fs_write.length = *length;
req.params.fs_write.fd = fd;
if (!fsRequest(fd, &req, sizeof(req)))
{
devUserFinishRequest(&req, true);
*length = req.params.fs_read.length;
return req.header.result;
}
thrWaitHandle(&req.header.event, 1, true);
devUserFinishRequest(&req, true);
if (req.header.result)
sysSetErrno(req.header.result);
*length = req.params.fs_read.length;
return req.header.result == 0;
}
bool fsIoCtl(addr_t fd, dword code, void* params, size_t length)
{
request_t req;
req.header.code = FS_IOCTL;
req.params.fs_ioctl.buffer = params;
req.params.fs_ioctl.length = length;
req.params.fs_ioctl.code = code;
req.params.fs_ioctl.fd = fd;
return fsRequestSync(fd, &req, sizeof(req));
}
bool fsSeek(addr_t fd, qword pos)
{
bool ret;
dword high, low;
high = (dword) (pos >> 32);
low = (dword) pos;
asm("int $0x30"
: "=a" (ret)
: "a" (0x703), "b" (fd), "c" (low), "d" (high));
return ret;
}
qword fsGetPosition(addr_t fd)
{
dword pos;
asm("int $0x30"
: "=a" (pos)
: "a" (0x704), "b" (fd)
: "edx");
return pos;
}
qword fsGetLength(addr_t fd)
{
dword length;
asm("int $0x30"
: "=a" (length)
: "a" (0x705), "b" (fd)
: "edx");
return length;
}