From aefc7e116584143ebe09490d8c702ed85b53d32e Mon Sep 17 00:00:00 2001 From: Marian Ohligs Date: Tue, 19 Apr 2011 00:33:45 +0200 Subject: [PATCH] add to dev folder: stdin, stdout and stderr --- drivers/char/Makefile | 1 + drivers/stderr/Makefile | 5 ++ drivers/stderr/stderr.c | 106 ++++++++++++++++++++++++++++++++++++++++ drivers/stdin/Makefile | 5 ++ drivers/stdin/stdin.c | 106 ++++++++++++++++++++++++++++++++++++++++ drivers/stdout/Makefile | 5 ++ drivers/stdout/stdout.c | 106 ++++++++++++++++++++++++++++++++++++++++ fs/initrd.c | 3 ++ kernel/tests.c | 4 +- 9 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 drivers/stderr/Makefile create mode 100644 drivers/stderr/stderr.c create mode 100644 drivers/stdin/Makefile create mode 100644 drivers/stdin/stdin.c create mode 100644 drivers/stdout/Makefile create mode 100644 drivers/stdout/stdout.c diff --git a/drivers/char/Makefile b/drivers/char/Makefile index aac9ef95..f76488cf 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -1,4 +1,5 @@ C_source := null.c + MODULE := drivers_char include $(TOPDIR)/Makefile.inc diff --git a/drivers/stderr/Makefile b/drivers/stderr/Makefile new file mode 100644 index 00000000..f0b38c86 --- /dev/null +++ b/drivers/stderr/Makefile @@ -0,0 +1,5 @@ +C_source := stderr.c + +MODULE := drivers_stderr + +include $(TOPDIR)/Makefile.inc diff --git a/drivers/stderr/stderr.c b/drivers/stderr/stderr.c new file mode 100644 index 00000000..effc5942 --- /dev/null +++ b/drivers/stderr/stderr.c @@ -0,0 +1,106 @@ +/* + * Copyright 2010 Stefan Lankes, Chair for Operating Systems, + * RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#include +#include +#include +#include +#include +#include + +/* Implementation of a simple stderr device */ + +static ssize_t stderr_read(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) +{ + return size; +} + +static ssize_t stderr_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) +{ + kprintf("\nFehler: %s", buffer); + return size; +} + +static int stderr_open(vfs_node_t* node) +{ + return 0; +} + +static int stderr_close(vfs_node_t* node) +{ + return 0; +} + +int stderr_init(vfs_node_t* node, const char* name) +{ + uint32_t i, j; + vfs_node_t* new_node; + dir_block_t* blockdir; + dirent_t* dirent; + block_list_t* blist; + + if (BUILTIN_EXPECT(!node || !name, 0)) + return -EINVAL; + + if (BUILTIN_EXPECT(node->type != FS_DIRECTORY, 0)) + return -EINVAL; + + if (finddir_fs(node, name)) + return -EINVAL; + + new_node = kmalloc(sizeof(vfs_node_t)); + if (BUILTIN_EXPECT(!new_node, 0)) + return -ENOMEM; + + memset(new_node, 0x00, sizeof(vfs_node_t)); + new_node->type = FS_CHARDEVICE; + new_node->open = &stderr_open; + new_node->close = &stderr_close; + new_node->read = &stderr_read; + new_node->write = &stderr_write; + spinlock_init(&new_node->lock); + + blist= &node->block_list; + do { + for(i=0; idata[i]) { + blockdir = (dir_block_t*) blist->data[i]; + for(j=0; jentries[j]; + if (!dirent->vfs_node) { + dirent->vfs_node = new_node; + strncpy(dirent->name, name, MAX_FNAME); + return 0; + } + } + } + } + + if (!blist->next) { + blist->next = (block_list_t*) kmalloc(sizeof(block_list_t)); + if (blist->next) + memset(blist->next, 0x00, sizeof(block_list_t)); + } + + } while(blist); + + kfree(new_node, sizeof(vfs_node_t)); + + return -ENOMEM; +} diff --git a/drivers/stdin/Makefile b/drivers/stdin/Makefile new file mode 100644 index 00000000..d3470a70 --- /dev/null +++ b/drivers/stdin/Makefile @@ -0,0 +1,5 @@ +C_source := stdin.c + +MODULE := drivers_stdin + +include $(TOPDIR)/Makefile.inc diff --git a/drivers/stdin/stdin.c b/drivers/stdin/stdin.c new file mode 100644 index 00000000..6b848082 --- /dev/null +++ b/drivers/stdin/stdin.c @@ -0,0 +1,106 @@ +/* + * Copyright 2010 Stefan Lankes, Chair for Operating Systems, + * RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#include +#include +#include +#include +#include +#include + +/* Implementation of a simple stdin device */ + +static ssize_t stdin_read(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) +{ + kprintf("Keine Eingabe implementiert"); + return size; +} + +static ssize_t stdin_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) +{ + return size; +} + +static int stdin_open(vfs_node_t* node) +{ + return 0; +} + +static int stdin_close(vfs_node_t* node) +{ + return 0; +} + +int stdin_init(vfs_node_t* node, const char* name) +{ + uint32_t i, j; + vfs_node_t* new_node; + dir_block_t* blockdir; + dirent_t* dirent; + block_list_t* blist; + + if (BUILTIN_EXPECT(!node || !name, 0)) + return -EINVAL; + + if (BUILTIN_EXPECT(node->type != FS_DIRECTORY, 0)) + return -EINVAL; + + if (finddir_fs(node, name)) + return -EINVAL; + + new_node = kmalloc(sizeof(vfs_node_t)); + if (BUILTIN_EXPECT(!new_node, 0)) + return -ENOMEM; + + memset(new_node, 0x00, sizeof(vfs_node_t)); + new_node->type = FS_CHARDEVICE; + new_node->open = &stdin_open; + new_node->close = &stdin_close; + new_node->read = &stdin_read; + new_node->write = &stdin_write; + spinlock_init(&new_node->lock); + + blist= &node->block_list; + do { + for(i=0; idata[i]) { + blockdir = (dir_block_t*) blist->data[i]; + for(j=0; jentries[j]; + if (!dirent->vfs_node) { + dirent->vfs_node = new_node; + strncpy(dirent->name, name, MAX_FNAME); + return 0; + } + } + } + } + + if (!blist->next) { + blist->next = (block_list_t*) kmalloc(sizeof(block_list_t)); + if (blist->next) + memset(blist->next, 0x00, sizeof(block_list_t)); + } + + } while(blist); + + kfree(new_node, sizeof(vfs_node_t)); + + return -ENOMEM; +} diff --git a/drivers/stdout/Makefile b/drivers/stdout/Makefile new file mode 100644 index 00000000..a1c84436 --- /dev/null +++ b/drivers/stdout/Makefile @@ -0,0 +1,5 @@ +C_source := stdout.c + +MODULE := drivers_stdout + +include $(TOPDIR)/Makefile.inc diff --git a/drivers/stdout/stdout.c b/drivers/stdout/stdout.c new file mode 100644 index 00000000..268a4009 --- /dev/null +++ b/drivers/stdout/stdout.c @@ -0,0 +1,106 @@ +/* + * Copyright 2010 Stefan Lankes, Chair for Operating Systems, + * RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#include +#include +#include +#include +#include +#include + +/* Implementation of a simple stdout device */ + +static ssize_t stdout_read(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) +{ + return size; +} + +static ssize_t stdout_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) +{ + kprintf("%s", buffer); + return size; +} + +static int stdout_open(vfs_node_t* node) +{ + return 0; +} + +static int stdout_close(vfs_node_t* node) +{ + return 0; +} + +int stdout_init(vfs_node_t* node, const char* name) +{ + uint32_t i, j; + vfs_node_t* new_node; + dir_block_t* blockdir; + dirent_t* dirent; + block_list_t* blist; + + if (BUILTIN_EXPECT(!node || !name, 0)) + return -EINVAL; + + if (BUILTIN_EXPECT(node->type != FS_DIRECTORY, 0)) + return -EINVAL; + + if (finddir_fs(node, name)) + return -EINVAL; + + new_node = kmalloc(sizeof(vfs_node_t)); + if (BUILTIN_EXPECT(!new_node, 0)) + return -ENOMEM; + + memset(new_node, 0x00, sizeof(vfs_node_t)); + new_node->type = FS_CHARDEVICE; + new_node->open = &stdout_open; + new_node->close = &stdout_close; + new_node->read = &stdout_read; + new_node->write = &stdout_write; + spinlock_init(&new_node->lock); + + blist= &node->block_list; + do { + for(i=0; idata[i]) { + blockdir = (dir_block_t*) blist->data[i]; + for(j=0; jentries[j]; + if (!dirent->vfs_node) { + dirent->vfs_node = new_node; + strncpy(dirent->name, name, MAX_FNAME); + return 0; + } + } + } + } + + if (!blist->next) { + blist->next = (block_list_t*) kmalloc(sizeof(block_list_t)); + if (blist->next) + memset(blist->next, 0x00, sizeof(block_list_t)); + } + + } while(blist); + + kfree(new_node, sizeof(vfs_node_t)); + + return -ENOMEM; +} diff --git a/fs/initrd.c b/fs/initrd.c index 218540d3..b18392c3 100644 --- a/fs/initrd.c +++ b/fs/initrd.c @@ -268,6 +268,9 @@ int initrd_init(void) tmp = mkdir_fs(fs_root, "dev"); /* create the character device "null" */ null_init(tmp, "null"); + stdin_init(tmp, "stdin"); + stdout_init(tmp, "stdout"); + stderr_init(tmp, "stderr"); /* For every module.. */ #ifdef CONFIG_MULTIBOOT diff --git a/kernel/tests.c b/kernel/tests.c index 314f3a32..a0aea794 100644 --- a/kernel/tests.c +++ b/kernel/tests.c @@ -102,7 +102,7 @@ static int STDCALL join_test(void* arg) int test_init(void) { - char* argv[] = {"/bin/tests", NULL}; + //char* argv[] = {"/bin/tests", NULL}; //sem_init(&producing, 1); //sem_init(&consuming, 0); @@ -112,7 +112,7 @@ int test_init(void) //create_kernel_task(NULL, join_test, NULL); //create_kernel_task(NULL, producer, NULL); //create_kernel_task(NULL, consumer, NULL); - create_user_task(NULL, "/bin/hello", argv); + create_user_task(NULL, "/bin/hello", NULL); //create_user_task(NULL, "/bin/tests", argv); return 0;