Add an osd_truncate call to truncate files [O. Galibert]

This commit is contained in:
Olivier Galibert 2014-03-11 09:19:17 +00:00
parent dff9b4b28b
commit 72c4cc20f8
3 changed files with 77 additions and 0 deletions

View File

@ -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

View File

@ -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
//============================================================

View File

@ -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
//============================================================