msvcrt: Implemented _chsize_s.

This commit is contained in:
Andrey Zhezherun 2013-11-05 09:04:19 +00:00 committed by Alexandre Julliard
parent b436087217
commit 3bb2c11757
7 changed files with 25 additions and 13 deletions

View File

@ -725,7 +725,7 @@
@ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
@ cdecl _chmod(str long) msvcrt._chmod @ cdecl _chmod(str long) msvcrt._chmod
@ cdecl _chsize(long long) msvcrt._chsize @ cdecl _chsize(long long) msvcrt._chsize
@ stub _chsize_s @ cdecl _chsize_s(long int64) msvcrt._chsize_s
@ cdecl _clearfp() msvcrt._clearfp @ cdecl _clearfp() msvcrt._clearfp
@ cdecl _close(long) msvcrt._close @ cdecl _close(long) msvcrt._close
@ cdecl _commit(long) msvcrt._commit @ cdecl _commit(long) msvcrt._commit

View File

@ -1073,7 +1073,7 @@
@ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
@ cdecl _chmod(str long) msvcrt._chmod @ cdecl _chmod(str long) msvcrt._chmod
@ cdecl _chsize(long long) msvcrt._chsize @ cdecl _chsize(long long) msvcrt._chsize
@ stub _chsize_s @ cdecl _chsize_s(long int64) msvcrt._chsize_s
@ cdecl _clearfp() msvcrt._clearfp @ cdecl _clearfp() msvcrt._clearfp
@ cdecl _close(long) msvcrt._close @ cdecl _close(long) msvcrt._close
@ cdecl _commit(long) msvcrt._commit @ cdecl _commit(long) msvcrt._commit

View File

@ -389,7 +389,7 @@
@ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
@ cdecl _chmod(str long) msvcrt._chmod @ cdecl _chmod(str long) msvcrt._chmod
@ cdecl _chsize(long long) msvcrt._chsize @ cdecl _chsize(long long) msvcrt._chsize
@ stub _chsize_s @ cdecl _chsize_s(long int64) msvcrt._chsize_s
@ cdecl _clearfp() msvcrt._clearfp @ cdecl _clearfp() msvcrt._clearfp
@ cdecl _close(long) msvcrt._close @ cdecl _close(long) msvcrt._close
@ cdecl _commit(long) msvcrt._commit @ cdecl _commit(long) msvcrt._commit

View File

@ -372,7 +372,7 @@
@ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp @ cdecl -arch=i386 -norelay _chkesp() msvcrt._chkesp
@ cdecl _chmod(str long) msvcrt._chmod @ cdecl _chmod(str long) msvcrt._chmod
@ cdecl _chsize(long long) msvcrt._chsize @ cdecl _chsize(long long) msvcrt._chsize
@ stub _chsize_s @ cdecl _chsize_s(long int64) msvcrt._chsize_s
@ cdecl _clearfp() msvcrt._clearfp @ cdecl _clearfp() msvcrt._clearfp
@ cdecl _close(long) msvcrt._close @ cdecl _close(long) msvcrt._close
@ cdecl _commit(long) msvcrt._commit @ cdecl _commit(long) msvcrt._commit

View File

@ -1259,15 +1259,17 @@ int CDECL MSVCRT_fseek(MSVCRT_FILE* file, MSVCRT_long offset, int whence)
} }
/********************************************************************* /*********************************************************************
* _chsize (MSVCRT.@) * _chsize_s (MSVCRT.@)
*/ */
int CDECL MSVCRT__chsize(int fd, MSVCRT_long size) int CDECL MSVCRT__chsize_s(int fd, __int64 size)
{ {
LONG cur, pos; __int64 cur, pos;
HANDLE handle; HANDLE handle;
BOOL ret = FALSE; BOOL ret = FALSE;
TRACE("(fd=%d, size=%d)\n", fd, size); TRACE("(fd=%d, size=%s)\n", fd, wine_dbgstr_longlong(size));
if (!MSVCRT_CHECK_PMT(size >= 0)) return MSVCRT_EINVAL;
LOCK_FILES(); LOCK_FILES();
@ -1275,10 +1277,10 @@ int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
if (handle != INVALID_HANDLE_VALUE) if (handle != INVALID_HANDLE_VALUE)
{ {
/* save the current file pointer */ /* save the current file pointer */
cur = MSVCRT__lseek(fd, 0, SEEK_CUR); cur = MSVCRT__lseeki64(fd, 0, SEEK_CUR);
if (cur >= 0) if (cur >= 0)
{ {
pos = MSVCRT__lseek(fd, size, SEEK_SET); pos = MSVCRT__lseeki64(fd, size, SEEK_SET);
if (pos >= 0) if (pos >= 0)
{ {
ret = SetEndOfFile(handle); ret = SetEndOfFile(handle);
@ -1286,12 +1288,21 @@ int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
} }
/* restore the file pointer */ /* restore the file pointer */
MSVCRT__lseek(fd, cur, SEEK_SET); MSVCRT__lseeki64(fd, cur, SEEK_SET);
} }
} }
UNLOCK_FILES(); UNLOCK_FILES();
return ret ? 0 : -1; return ret ? 0 : *MSVCRT__errno();
}
/*********************************************************************
* _chsize (MSVCRT.@)
*/
int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
{
/* _chsize_s returns errno on failure but _chsize should return -1 */
return MSVCRT__chsize_s( fd, size ) == 0 ? 0 : -1;
} }
/********************************************************************* /*********************************************************************

View File

@ -356,7 +356,7 @@
@ cdecl -arch=i386 -norelay _chkesp() @ cdecl -arch=i386 -norelay _chkesp()
@ cdecl _chmod(str long) MSVCRT__chmod @ cdecl _chmod(str long) MSVCRT__chmod
@ cdecl _chsize(long long) MSVCRT__chsize @ cdecl _chsize(long long) MSVCRT__chsize
# stub _chsize_s(long int64) @ cdecl _chsize_s(long int64) MSVCRT__chsize_s
# stub _chvalidator(long long) # stub _chvalidator(long long)
# stub _chvalidator_l(ptr long long) # stub _chvalidator_l(ptr long long)
@ cdecl _clearfp() @ cdecl _clearfp()

View File

@ -87,6 +87,7 @@ extern "C" {
int __cdecl _access(const char*,int); int __cdecl _access(const char*,int);
int __cdecl _chmod(const char*,int); int __cdecl _chmod(const char*,int);
int __cdecl _chsize(int,__msvcrt_ulong); int __cdecl _chsize(int,__msvcrt_ulong);
int __cdecl _chsize_s(int,__int64);
int __cdecl _close(int); int __cdecl _close(int);
int __cdecl _commit(int); int __cdecl _commit(int);
int __cdecl _creat(const char*,int); int __cdecl _creat(const char*,int);