/* * 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 static int sys_write(int fd, const char *buf, size_t len) { int i; if (BUILTIN_EXPECT(!buf, 0)) return -1; for (i = 0; ifildes_table[fd].node, (uint8_t*)buf, len, per_core(current_task)->fildes_table[fd].offset); kprintf("Dateiinhalt:%i\n", len); sys_write(fd, buf, len); kprintf("\n"); ret = 8; break; } case __NR_write: { int fd = va_arg(vl, int); const char* buf = va_arg(vl, const char*); size_t len = va_arg(vl, size_t); ret = write_fs(per_core(current_task)->fildes_table[fd].node, (uint8_t*)buf, len, per_core(current_task)->fildes_table[fd].offset); break; } case __NR_open: { const char* file = va_arg(vl, const char*); int flags = va_arg(vl, int); int mode = va_arg(vl, int); int fd = 0; for (fd = 0; fd < MAX_FILDES; fd++) { if (per_core(current_task)->fildes_table[fd].node == NULL) { per_core(current_task)->fildes_table[fd].node = findnode_fs((char*) file); ret = fd; break; } } if (fd >= MAX_FILDES) { kprintf("Unable to create filedescriptor"); ret = -EINVAL; } break; } case __NR_close: { int fd = va_arg(vl, int); 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; ret = 0; break; } case __NR_getpid: ret = per_core(current_task)->id; break; case __NR_fork: ret = sys_fork(); break; case __NR_wait: { int32_t* status = va_arg(vl, int32_t*); ret = wait(status); break; } case __NR_execve: { const char* name = va_arg(vl, const char*); char** argv = va_arg(vl, char**); char** env = va_arg(vl, char**); ret = sys_execve(name, argv, env); break; } default: kputs("invalid system call\n"); ret = -ENOSYS; break; }; va_end(vl); return ret; }