add initrd_write (working with small files only)

This commit is contained in:
Marian Ohligs 2011-04-12 16:48:16 +02:00
parent e16eb7ea07
commit 4990227b5c
5 changed files with 20 additions and 15 deletions

1
.gitignore vendored
View file

@ -8,6 +8,7 @@
*.a
*.log
*.DS_Store
*.swp
tags
include/metalsvm/config.h
Makefile

View file

@ -49,7 +49,7 @@ ssize_t write_fs(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset)
return ret;
spinlock_lock(&node->lock);
// Has the node got a write callback?
// Has the node got a write callback?
if (node->write != 0)
ret = node->write(node, buffer, size, offset);
spinlock_unlock(&node->lock);

View file

@ -90,6 +90,19 @@ static ssize_t initrd_read(vfs_node_t* node, uint8_t* buffer, size_t size, off_t
return size;
}
static ssize_t initrd_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset)
{
block_list_t* blist = &node->block_list;
char* data = (char*) blist->data[0];
//////////ACHTUNG keine Überprüfung der Blcoklängen etc.
memcpy(data, buffer, size);
return size;
}
static dirent_t* initrd_readdir(vfs_node_t* node, uint32_t index)
{
uint32_t i, j, count;
@ -296,6 +309,7 @@ int initrd_init(void)
memset(new_node, 0x00, sizeof(vfs_node_t));
new_node->type = FS_FILE;
new_node->read = initrd_read;
new_node->write = initrd_write;
new_node->block_size = file_desc->length;
new_node->block_list.data[0] = ((char*) header) + file_desc->offset;
spinlock_init(&new_node->lock);

View file

@ -33,7 +33,8 @@ static int sys_read(int fd, const char *buf, size_t len)
static int sys_write(int fd, const char *buf, size_t len)
{
write_fs(per_core(current_task)->fildes_table[fd].node, (uint8_t*)buf, len, per_core(current_task)->fildes_table[fd].offset);
//per_core(current_task)->fildes_table[fd].node->write = 1;
write_fs(per_core(current_task)->fildes_table[fd].node, (uint8_t*)buf, len, 0);//per_core(current_task)->fildes_table[fd].offset);
kprintf("ins Dateis. geschr. -- fd:%i, Dateilaenge:%i, Dateiinhalt: %s \n", fd, len, buf);
return len; ////////ACHTUNG: gaukelt dem Benutzer vor alles geschrieben zu haben.
}
@ -51,7 +52,6 @@ static int sys_open(const char* file, int flags, int mode)
kprintf("Unable to create filedescriptor");
return -EINVAL;
}
}
static int sys_close(int fd)

View file

@ -30,22 +30,12 @@ int main(int argc, char** argv)
//int i;
char* str = (char *)malloc(40 * sizeof(char));
FILE* testfile;
FILE* testfileX;
testfileX = fopen("/bin/tests", "w+r");
testfile = fopen("/bin/test", "w+r");
setbuf(testfile, NULL);
setbuf(testfileX, NULL);
fwrite("wtest1\n", 1, 10, testfileX);
//fflush(testfile);
fread(str, 1, 10, testfile);
printf("Schreiben: %s", str);
setbuf(testfile, NULL);
fread(str, 1, 20, testfileX);
//fgets(str, 2, testfile);
//setbuf(testfile, 0);
//printf("Stage 2: %s", str);
//printf("Hello from printf2!!!\n");
fwrite("wtest1\n", 1, 7, testfile);
fread(str, 1, 10, testfile);
return errno;
}