- some design changes
This commit is contained in:
parent
7b63bf1d27
commit
c1336596ab
2 changed files with 23 additions and 15 deletions
|
@ -24,6 +24,8 @@
|
|||
#include <metalsvm/fs.h>
|
||||
#include <metalsvm/spinlock.h>
|
||||
#include <asm/kb.h>
|
||||
#include <metalsvm/tasks.h>
|
||||
|
||||
|
||||
/* Implementation of a simple stdin device */
|
||||
|
||||
|
|
|
@ -33,10 +33,11 @@ static int sys_write(int fd, const char *buf, size_t len)
|
|||
(uint8_t*)buf, len);
|
||||
}
|
||||
|
||||
static int sys_open(const char* file, int flags, int mode)
|
||||
static int sys_open(const char* fname, int flags, int mode)
|
||||
{
|
||||
int fd;
|
||||
if (!findnode_fs((char*) file)) {
|
||||
fildes_t* file = NULL;
|
||||
if (!findnode_fs((char*) fname)) {
|
||||
if (flags & O_CREAT) {
|
||||
//create file, not implemented yet
|
||||
}
|
||||
|
@ -48,9 +49,10 @@ static int sys_open(const char* file, int flags, int mode)
|
|||
|
||||
for (fd = 3; fd < NR_OPEN; fd++) {
|
||||
if (per_core(current_task)->fildes_table[fd].node == NULL) {
|
||||
per_core(current_task)->fildes_table[fd].node = findnode_fs((char*) file);
|
||||
per_core(current_task)->fildes_table[fd].mode = mode;
|
||||
per_core(current_task)->fildes_table[fd].flags = flags;
|
||||
file = &(per_core(current_task)->fildes_table[fd]);
|
||||
file->node = findnode_fs((char*) fname);
|
||||
file->mode = mode;
|
||||
file->flags = flags;
|
||||
}
|
||||
}
|
||||
if (fd >= NR_OPEN) {
|
||||
|
@ -64,9 +66,12 @@ static int sys_open(const char* file, int flags, int mode)
|
|||
|
||||
static int sys_close(int fd)
|
||||
{
|
||||
close_fs(per_core(current_task)->fildes_table[fd].node);
|
||||
per_core(current_task)->fildes_table[fd].node = NULL;
|
||||
per_core(current_task)->fildes_table[fd].offset = 0;
|
||||
fildes_t* file = &(per_core(current_task)->fildes_table[fd]);
|
||||
close_fs(file->node);
|
||||
file->node = NULL;
|
||||
file->offset = 0;
|
||||
file->mode = 0;
|
||||
file->flags = 0;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
@ -80,24 +85,25 @@ static int sys_read(int fd, const char *buf, size_t len)
|
|||
static int sys_lseek(int fd, off_t pos, int origin)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
fildes_t* file = &(per_core(current_task)->fildes_table[fd]);
|
||||
|
||||
if (BUILTIN_EXPECT(per_core(current_task)->fildes_table[fd].node->type != FS_FILE
|
||||
&& per_core(current_task)->fildes_table[fd].node->type != FS_CHARDEVICE, 0));
|
||||
if (BUILTIN_EXPECT(file->node->type != FS_FILE
|
||||
&& file->node->type != FS_CHARDEVICE, 0));
|
||||
return -EINVAL;
|
||||
|
||||
switch(origin)
|
||||
{
|
||||
case SEEK_SET: { /* set file offset to offset */
|
||||
per_core(current_task)->fildes_table[fd].offset = pos;
|
||||
file->offset = pos;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
case SEEK_CUR: { /* set file offset to current plus offset */
|
||||
ret = pos + per_core(current_task)->fildes_table[fd].offset;
|
||||
ret = pos + file->offset;
|
||||
break;
|
||||
}
|
||||
case SEEK_END: { /* set file offset to EOF plus offset */
|
||||
per_core(current_task)->fildes_table[fd].offset = pos + per_core(current_task)->fildes_table[fd].node->block_size;
|
||||
file->offset = pos + file->node->block_size;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -157,10 +163,10 @@ int syscall_handler(uint32_t sys_nr, ...)
|
|||
break;
|
||||
}
|
||||
case __NR_open: {
|
||||
const char* file = va_arg(vl, const char*);
|
||||
const char* fname = va_arg(vl, const char*);
|
||||
int flags = va_arg(vl, int);
|
||||
int mode = va_arg(vl, int);
|
||||
ret = sys_open(file, flags, mode);
|
||||
ret = sys_open(fname, flags, mode);
|
||||
break;
|
||||
}
|
||||
case __NR_close: {
|
||||
|
|
Loading…
Add table
Reference in a new issue