From 72c4cc20f8c7dea85df964a3821f415cf9394d28 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Tue, 11 Mar 2014 09:19:17 +0000 Subject: [PATCH] Add an osd_truncate call to truncate files [O. Galibert] --- src/osd/osdcore.h | 17 +++++++++++++++++ src/osd/sdl/sdlfile.c | 23 +++++++++++++++++++++++ src/osd/windows/winfile.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h index 00a8c88b987..426870a808e 100644 --- a/src/osd/osdcore.h +++ b/src/osd/osdcore.h @@ -166,6 +166,23 @@ file_error osd_read(osd_file *file, void *buffer, UINT64 offset, UINT32 length, file_error osd_write(osd_file *file, const void *buffer, UINT64 offset, UINT32 length, UINT32 *actual); +/*----------------------------------------------------------------------------- + osd_truncate: change the size of an open file + + Parameters: + + file - handle to a file previously opened via osd_open + + offset - future size of the file + + Return value: + + a file_error describing any error that occurred while writing to + the file, or FILERR_NONE if no error occurred +-----------------------------------------------------------------------------*/ +file_error osd_truncate(osd_file *file, UINT64 offset); + + /*----------------------------------------------------------------------------- osd_rmfile: deletes a file diff --git a/src/osd/sdl/sdlfile.c b/src/osd/sdl/sdlfile.c index 542e2408b82..b6d0b1755cc 100644 --- a/src/osd/sdl/sdlfile.c +++ b/src/osd/sdl/sdlfile.c @@ -359,6 +359,29 @@ file_error osd_write(osd_file *file, const void *buffer, UINT64 offset, UINT32 c } +//============================================================ +// osd_truncate +//============================================================ + +file_error osd_truncate(osd_file *file, UINT64 offset) +{ + UINT32 result; + + switch (file->type) + { + case SDLFILE_FILE: + result = ftruncate(file->handle, offset); + if (!result) + return error_to_file_error(errno); + return FILERR_NONE; + break; + + default: + return FILERR_FAILURE; + } +} + + //============================================================ // osd_close //============================================================ diff --git a/src/osd/windows/winfile.c b/src/osd/windows/winfile.c index e5b919d9570..8130ef3cfc6 100644 --- a/src/osd/windows/winfile.c +++ b/src/osd/windows/winfile.c @@ -238,6 +238,43 @@ file_error osd_write(osd_file *file, const void *buffer, UINT64 offset, UINT32 l } +//============================================================ +// osd_truncate +//============================================================ + +file_error osd_truncate(osd_file *file, UINT64 offset) +{ + DWORD result; + LONG upper = offset >> 32; + + switch (file->type) + { + case WINFILE_FILE: + // attempt to set the file pointer + result = SetFilePointer(file->handle, (UINT32)offset, &upper, FILE_BEGIN); + if (result == INVALID_SET_FILE_POINTER) + { + DWORD error = GetLastError(); + if (error != NO_ERROR) + return win_error_to_mame_file_error(error); + } + + // then perform the truncation + if (!SetEndOfFile(file->handle)) + return win_error_to_mame_file_error(GetLastError()); + break; + case WINFILE_SOCKET: + return FILERR_FAILURE; + break; + case WINFILE_PTTY: + return FILERR_FAILURE; + break; + + } + return FILERR_NONE; +} + + //============================================================ // osd_close //============================================================