Fixed SYS_READ and SYS_WRITE to return correct values
authorJohn Hodge <[email protected]>
Sun, 27 Sep 2009 08:35:57 +0000 (16:35 +0800)
committerJohn Hodge <[email protected]>
Sun, 27 Sep 2009 08:35:57 +0000 (16:35 +0800)
Kernel/syscalls.c
Usermode/Applications/CLIShell_src/main.c
Usermode/Libraries/ld-acess.so_src/main.c

index 74eaaea..ff47294 100644 (file)
@@ -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;
        
index 24c93dd..becbe80 100644 (file)
@@ -13,6 +13,7 @@
 // ==== PROTOTYPES ====\r
 char   *ReadCommandLine(int *Length);\r
 void   Parse_Args(char *str, char **dest);\r
+void   CallCommand(char **Args);\r
 void   Command_Colour(int argc, char **argv);\r
 void   Command_Clear(int argc, char **argv);\r
 void   Command_Cd(int argc, char **argv);\r
@@ -30,6 +31,7 @@ struct        {
 #define        BUILTIN_COUNT   (sizeof(cBUILTINS)/sizeof(cBUILTINS[0]))\r
 \r
 // ==== LOCAL VARIABLES ====\r
+char   **gasEnvironment;\r
 char   gsCommandBuffer[1024];\r
 char   *gsCurrentDirectory = NULL;\r
 char   gsTmpBuffer[1024];\r
@@ -43,10 +45,10 @@ int main(int argc, char *argv[], char *envp[])
        char    *sCommandStr;\r
        char    *saArgs[32];\r
         int    length = 0;\r
-        int    pid = -1;\r
         int    iArgCount = 0;\r
         int    bCached = 1;\r
-       t_sysFInfo      info;\r
+       \r
+       gasEnvironment = envp;\r
        \r
        Command_Clear(0, NULL);\r
        \r
@@ -61,7 +63,6 @@ int main(int argc, char *argv[], char *envp[])
                }\r
        }       \r
        \r
-       write(_stdout, 1, "\n");\r
        write(_stdout, 22, "Acess Shell Version 3\n");\r
        write(_stdout,  2, "\n");\r
        for(;;)\r
@@ -110,36 +111,9 @@ int main(int argc, char *argv[], char *envp[])
                }\r
                \r
                if(length != BUILTIN_COUNT)     continue;\r
-               
-               // - Calling a file\r
-               GeneratePath(saArgs[1], gsCurrentDirectory, gsTmpBuffer);\r
-               // Use length in place of fp\r
-               length = open(gsTmpBuffer, 0);\r
-               // Check file existence\r
-               if(length == -1) {\r
-                       Print("Unknown Command: `");Print(saArgs[1]);Print("'\n");      // Error Message\r
-                       continue;\r
-               }\r
-               // Check if the file is a directory\r
-               finfo( length, &info, 0 );
-               close( length );\r
-               if(info.flags & FILEFLAG_DIRECTORY) {\r
-                       Print("`");Print(saArgs[1]);    // Error Message\r
-                       Print("' is a directory.\n");\r
-                       continue;\r
-               }\r
-               // Load new executable\r
-               pid = clone(CLONE_VM, 0);\r
-               printf("pid = %i\n", pid);\r
-               if(pid == 0)    execve(gsTmpBuffer, &saArgs[1], envp);\r
-               if(pid <= 0) {\r
-                       Print("Unablt to create process: `");Print(gsTmpBuffer);Print("'\n");   // Error Message
-                       //SysDebug("pid = %i\n", pid);\r
-               }\r
-               else {\r
-                        int    status;\r
-                       waittid(pid, &status);\r
-               }\r
+               \r
+               // Shall we?\r
+               CallCommand( &saArgs[1] );\r
        }\r
 }\r
 \r
@@ -253,6 +227,50 @@ void Parse_Args(char *str, char **dest)
        }\r
 }\r
 \r
+/**\r
+ * \fn void CallCommand(char **Args)\r
+ */\r
+void CallCommand(char **Args)\r
+{\r
+       t_sysFInfo      info;\r
+        int    pid = -1;\r
+        int    fd = 0;\r
+       \r
+       \r
+       // - Calling a file\r
+       GeneratePath(Args[0], gsCurrentDirectory, gsTmpBuffer);\r
+       \r
+       \r
+       // Check file existence\r
+       fd = open(gsTmpBuffer, 0);\r
+       if(fd == -1) {\r
+               Print("Unknown Command: `");Print(Args[0]);Print("'\n");        // Error Message\r
+               return ;\r
+       }\r
+       \r
+       // Check if the file is a directory\r
+       finfo( fd, &info, 0 );\r
+       close( fd );\r
+       if(info.flags & FILEFLAG_DIRECTORY) {\r
+               Print("`");Print(gsTmpBuffer);  // Error Message\r
+               Print("' is a directory.\n");\r
+               return ;\r
+       }\r
+       \r
+       // Create new process\r
+       pid = clone(CLONE_VM, 0);\r
+       // Start Task\r
+       if(pid == 0)\r
+               execve(gsTmpBuffer, Args, gasEnvironment);\r
+       if(pid <= 0) {\r
+               Print("Unablt to create process: `");Print(gsTmpBuffer);Print("'\n");   // Error Message\r
+       }\r
+       else {\r
+                int    status;\r
+               waittid(pid, &status);\r
+       }\r
+}\r
+\r
 /**\r
  * \fn void Command_Colour(int argc, char **argv)\r
  * \brief \r
index fb9cd35..a250afa 100644 (file)
@@ -84,6 +84,6 @@ int CallUser(Uint entry, Uint sp)
        __asm__ __volatile__ (\r
        "mov %%eax, %%esp;\n\t"\r
        "jmp *%%ecx"\r
-       : : "a"(sp-4), "c"(entry));\r
+       : : "a"(sp), "c"(entry));\r
        for(;;);\r
 }\r

UCC git Repository :: git.ucc.asn.au