From 1cd56fdef52eb2e3c57fe6a5f52a915c19aaf5e7 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 27 Sep 2009 16:35:57 +0800 Subject: [PATCH] Fixed SYS_READ and SYS_WRITE to return correct values --- Kernel/syscalls.c | 8 +-- Usermode/Applications/CLIShell_src/main.c | 84 ++++++++++++++--------- Usermode/Libraries/ld-acess.so_src/main.c | 2 +- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 74eaaeaa..ff472941 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -134,17 +134,17 @@ void SyscallHandler(tSyscallRegs *Regs) case SYS_WRITE: #if BITS < 64 - VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); + ret = VFS_Write( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); #else - VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); + ret = VFS_Write( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); #endif break; case SYS_READ: #if BITS < 64 - VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); + ret = VFS_Read( Regs->Arg1, Regs->Arg2|((Uint64)Regs->Arg3<<32), (void*)Regs->Arg4 ); #else - VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); + ret = VFS_Read( Regs->Arg1, Regs->Arg2, (void*)Regs->Arg3 ); #endif break; diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index 24c93ddf..becbe80b 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -13,6 +13,7 @@ // ==== PROTOTYPES ==== char *ReadCommandLine(int *Length); void Parse_Args(char *str, char **dest); +void CallCommand(char **Args); void Command_Colour(int argc, char **argv); void Command_Clear(int argc, char **argv); void Command_Cd(int argc, char **argv); @@ -30,6 +31,7 @@ struct { #define BUILTIN_COUNT (sizeof(cBUILTINS)/sizeof(cBUILTINS[0])) // ==== LOCAL VARIABLES ==== +char **gasEnvironment; char gsCommandBuffer[1024]; char *gsCurrentDirectory = NULL; char gsTmpBuffer[1024]; @@ -43,10 +45,10 @@ int main(int argc, char *argv[], char *envp[]) char *sCommandStr; char *saArgs[32]; int length = 0; - int pid = -1; int iArgCount = 0; int bCached = 1; - t_sysFInfo info; + + gasEnvironment = envp; Command_Clear(0, NULL); @@ -61,7 +63,6 @@ int main(int argc, char *argv[], char *envp[]) } } - write(_stdout, 1, "\n"); write(_stdout, 22, "Acess Shell Version 3\n"); write(_stdout, 2, "\n"); for(;;) @@ -110,36 +111,9 @@ int main(int argc, char *argv[], char *envp[]) } if(length != BUILTIN_COUNT) continue; - - // - Calling a file - GeneratePath(saArgs[1], gsCurrentDirectory, gsTmpBuffer); - // Use length in place of fp - length = open(gsTmpBuffer, 0); - // Check file existence - if(length == -1) { - Print("Unknown Command: `");Print(saArgs[1]);Print("'\n"); // Error Message - continue; - } - // Check if the file is a directory - finfo( length, &info, 0 ); - close( length ); - if(info.flags & FILEFLAG_DIRECTORY) { - Print("`");Print(saArgs[1]); // Error Message - Print("' is a directory.\n"); - continue; - } - // Load new executable - pid = clone(CLONE_VM, 0); - printf("pid = %i\n", pid); - if(pid == 0) execve(gsTmpBuffer, &saArgs[1], envp); - if(pid <= 0) { - Print("Unablt to create process: `");Print(gsTmpBuffer);Print("'\n"); // Error Message - //SysDebug("pid = %i\n", pid); - } - else { - int status; - waittid(pid, &status); - } + + // Shall we? + CallCommand( &saArgs[1] ); } } @@ -253,6 +227,50 @@ void Parse_Args(char *str, char **dest) } } +/** + * \fn void CallCommand(char **Args) + */ +void CallCommand(char **Args) +{ + t_sysFInfo info; + int pid = -1; + int fd = 0; + + + // - Calling a file + GeneratePath(Args[0], gsCurrentDirectory, gsTmpBuffer); + + + // Check file existence + fd = open(gsTmpBuffer, 0); + if(fd == -1) { + Print("Unknown Command: `");Print(Args[0]);Print("'\n"); // Error Message + return ; + } + + // Check if the file is a directory + finfo( fd, &info, 0 ); + close( fd ); + if(info.flags & FILEFLAG_DIRECTORY) { + Print("`");Print(gsTmpBuffer); // Error Message + Print("' is a directory.\n"); + return ; + } + + // Create new process + pid = clone(CLONE_VM, 0); + // Start Task + if(pid == 0) + execve(gsTmpBuffer, Args, gasEnvironment); + if(pid <= 0) { + Print("Unablt to create process: `");Print(gsTmpBuffer);Print("'\n"); // Error Message + } + else { + int status; + waittid(pid, &status); + } +} + /** * \fn void Command_Colour(int argc, char **argv) * \brief diff --git a/Usermode/Libraries/ld-acess.so_src/main.c b/Usermode/Libraries/ld-acess.so_src/main.c index fb9cd352..a250afac 100644 --- a/Usermode/Libraries/ld-acess.so_src/main.c +++ b/Usermode/Libraries/ld-acess.so_src/main.c @@ -84,6 +84,6 @@ int CallUser(Uint entry, Uint sp) __asm__ __volatile__ ( "mov %%eax, %%esp;\n\t" "jmp *%%ecx" - : : "a"(sp-4), "c"(entry)); + : : "a"(sp), "c"(entry)); for(;;); } -- 2.20.1