- some design changes

This commit is contained in:
Marian Ohligs 2011-07-05 15:36:39 +02:00
parent 7b63bf1d27
commit c1336596ab
2 changed files with 23 additions and 15 deletions

View file

@ -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 */

View file

@ -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: {