- // Clean up
- while(outCount--) free(output[outCount]);
- free(output);
- while(inCount--) free(input[inCount]);
- free(input);
-}
-
-// --- VFS Calls
-int open(const char *Path, int Flags) {
- int ret = 0;
- _Syscall(SYS_OPEN, "<i >s >i", &ret, Path, Flags);
- return ret;
-}
-
-void close(int FD) {
- _Syscall(SYS_CLOSE, ">i", FD);
-}
-
-size_t read(int FD, size_t Bytes, void *Dest) {
- int ret = 0;
- _Syscall(SYS_READ, "<i >i >i <d", &ret, FD, Bytes, Bytes, Dest);
- return ret;
+ Debug("req->NParams = %i", req->NParams);
+ assert(req->NParams >= 2);
+ // return
+ assert(req->Params[0].Type == ARG_TYPE_INT64);
+ assert(req->Params[0].Length == sizeof(uint64_t));
+ retValue = *(uint64_t*)dataPtr;
+ dataPtr += sizeof(uint64_t);
+ // errno
+ assert(req->Params[1].Type == ARG_TYPE_INT32);
+ assert(req->Params[1].Length == sizeof(uint32_t));
+ acess__errno = *(uint32_t*)dataPtr;
+ dataPtr += sizeof(uint32_t);
+
+ // Write changes to buffers
+ if( req->NParams - 2 != retCount ) {
+ fprintf(stderr, "syscalls.c: Return count inbalance (%i - 1 != exp %i) [Call %i]\n",
+ req->NParams, retCount, SyscallID);
+ exit(127);
+ }
+ retCount = 0;
+ for( i = 2; i < req->NParams; i ++ )
+ {
+ #if 0
+ int j;
+ printf("Return Data %i: (%i)", i, req->Params[i].Length);
+ for( j = 0; j < req->Params[i].Length; j ++ )
+ printf(" %02x", ((uint8_t*)dataPtr)[j]);
+ printf("\n");
+ #endif
+ assert( req->Params[i].Type == ARG_TYPE_DATA );
+ memcpy( retPtrs[retCount++], dataPtr, req->Params[i].Length );
+ dataPtr += req->Params[i].Length;
+ }
+
+ free( req );
+ free( retPtrs );
+
+ DEBUG(": %i 0x%llx", SyscallID, retValue);
+
+ return retValue;