From 8dcc7e5cce992392d2c853e65ba52af7ff064ae2 Mon Sep 17 00:00:00 2001 From: smea Date: Thu, 23 Jan 2014 18:30:36 +0100 Subject: [PATCH] srv : mini-fix FS : FSFILE_Write --- libctru/include/ctr/FS.h | 1 + libctru/include/ctr/types.h | 2 ++ libctru/source/FS.c | 22 +++++++++++++++++++++- libctru/source/srv.c | 2 +- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libctru/include/ctr/FS.h b/libctru/include/ctr/FS.h index 1881c19..73d9e64 100644 --- a/libctru/include/ctr/FS.h +++ b/libctru/include/ctr/FS.h @@ -35,6 +35,7 @@ Result FSUSER_OpenFile(Handle handle, Handle* out, u32 archiveid, FS_archive arc Result FSFILE_Close(Handle handle); Result FSFILE_Read(Handle handle, u32 *bytesRead, u64 offset, u32 *buffer, u32 size); +Result FSFILE_Write(Handle handle, u32 *bytesWritten, u64 offset, u32 *buffer, u32 size, u32 flushFlags); Result FSFILE_GetSize(Handle handle, u64 *size); #endif diff --git a/libctru/include/ctr/types.h b/libctru/include/ctr/types.h index 951bbb4..b3b4987 100644 --- a/libctru/include/ctr/types.h +++ b/libctru/include/ctr/types.h @@ -16,6 +16,8 @@ typedef signed int s32; typedef signed long long s64; + typedef u16 wchar; + typedef u32 Handle; typedef u32 Result; diff --git a/libctru/source/FS.c b/libctru/source/FS.c index d5ffe65..06df443 100644 --- a/libctru/source/FS.c +++ b/libctru/source/FS.c @@ -66,7 +66,6 @@ Result FSFILE_Read(Handle handle, u32 *bytesRead, u64 offset, u32 *buffer, u32 s cmdbuf[4]=(size<<4)|12; cmdbuf[5]=(u32)buffer; - Result ret=0; if((ret=svc_sendSyncRequest(handle)))return ret; @@ -75,6 +74,27 @@ Result FSFILE_Read(Handle handle, u32 *bytesRead, u64 offset, u32 *buffer, u32 s return cmdbuf[1]; } +//WARNING : using wrong flushFlags CAN corrupt the archive you're writing to +Result FSFILE_Write(Handle handle, u32 *bytesWritten, u64 offset, u32 *buffer, u32 size, u32 flushFlags) +{ + u32 *cmdbuf=getThreadCommandBuffer(); + + cmdbuf[0]=0x08030102; + cmdbuf[1]=(u32)offset; + cmdbuf[2]=(u32)(offset>>32); + cmdbuf[3]=size; + cmdbuf[4]=flushFlags; + cmdbuf[5]=(size<<4)|12; + cmdbuf[6]=(u32)buffer; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + if(bytesWritten)*bytesWritten=cmdbuf[2]; + + return cmdbuf[1]; +} + Result FSFILE_GetSize(Handle handle, u64 *size) { u32 *cmdbuf=getThreadCommandBuffer(); diff --git a/libctru/source/srv.c b/libctru/source/srv.c index 1fee413..d2bad41 100644 --- a/libctru/source/srv.c +++ b/libctru/source/srv.c @@ -19,7 +19,7 @@ void getSrvHandle(Handle* out) if(!out)return; svc_connectToPort(out, "srv:"); - srv_10002(*out); + srv_Initialize(*out); } void srv_getServiceHandle(Handle handle, Handle* out, char* server)