summaryrefslogtreecommitdiff
path: root/src/kernel/idt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/idt.c')
-rw-r--r--src/kernel/idt.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/kernel/idt.c b/src/kernel/idt.c
index c79ae7b..1a78da0 100644
--- a/src/kernel/idt.c
+++ b/src/kernel/idt.c
@@ -52,6 +52,12 @@ uint32_t sc_file_get_size(uint32_t handle) {
return drives[handle >> 8].get_file_length(drives + (handle >> 8), handle & 0xff);
}
+void sc_file_set_size(uint32_t handle, uint32_t new_size) {
+ if (!handle)
+ return;
+ drives[handle >> 8].set_file_length(drives + (handle >> 8), handle & 0xff, new_size);
+}
+
uint32_t sc_file_read(uint32_t handle, uint32_t file_offset, uint32_t count, void *buffer) {
if (!handle)
return 0;
@@ -62,6 +68,23 @@ uint32_t sc_file_read(uint32_t handle, uint32_t file_offset, uint32_t count, voi
return count;
}
+uint32_t sc_file_write(uint32_t handle, uint32_t file_offset, uint32_t count, void *buffer) {
+ if (!handle)
+ return 0;
+ const struct drive *const d = drives + (handle >> 8);
+ const fs_id_t fid = handle & 0xff;
+
+ if (!d->is_writable(d, fid))
+ return 0;
+
+ const uint32_t l = d->get_file_length(d, fid);
+ if (file_offset + count > l)
+ count = l - file_offset;
+
+ mfcpy(d, fid, file_offset, buffer, count);
+ return count;
+}
+
uint32_t sc_start_task(uint32_t drive_number, char *path, const char *pass, uint32_t io_task) {
switch_to_kernel_cr3();
uint32_t process_id = try_elf_run(drives + drive_number, vma_to_pma(active_task->page_directory, path), pass, io_task);
@@ -183,7 +206,9 @@ void const *syscall_table[] = {
&find_unread_ipc,
&sc_wait_ipc_read,
&sc_is_task_running,
- &sc_get_timestamp
+ &sc_get_timestamp,
+ &sc_file_write,
+ &sc_file_set_size
};
//these aren't really void ()'s, but gcc complains if we take an address of a void, so we give it a type