📄 osfinfo.c
字号:
* then mark it with INVALID_HANDLE_VALUE.
*
*Entry:
* int fh - CRT file handle
*
*Exit:
* Returns zero if successful.
* Returns -1 and sets errno to EBADF otherwise.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _free_osfhnd (
int fh /* user's file handle */
)
{
if ( (fh >= 0 && (unsigned)fh < (unsigned)_nhandle) &&
(_osfile(fh) & FOPEN) &&
(_osfhnd(fh) != (intptr_t)INVALID_HANDLE_VALUE) )
{
if ( __app_type == _CONSOLE_APP ) {
switch (fh) {
case 0:
SetStdHandle( STD_INPUT_HANDLE, NULL );
break;
case 1:
SetStdHandle( STD_OUTPUT_HANDLE, NULL );
break;
case 2:
SetStdHandle( STD_ERROR_HANDLE, NULL );
break;
}
}
_osfhnd(fh) = (intptr_t)INVALID_HANDLE_VALUE;
return(0);
} else {
errno = EBADF; /* bad handle */
_doserrno = 0L; /* not an OS error */
return -1;
}
}
/***
*long _get_osfhandle(int fh) - get Win32 HANDLE value
*
*Purpose:
* If fh is in range and marked open, return _osfhnd(fh).
*
*Entry:
* int fh - CRT file handle
*
*Exit:
* Returns the Win32 HANDLE successful.
* Returns -1 and sets errno to EBADF otherwise.
*
*Exceptions:
*
*******************************************************************************/
intptr_t __cdecl _get_osfhandle (
int fh /* user's file handle */
)
{
_CHECK_FH_CLEAR_OSSERR_RETURN( fh, EBADF, -1 );
_VALIDATE_CLEAR_OSSERR_RETURN((fh >= 0 && (unsigned)fh < (unsigned)_nhandle), EBADF, -1);
_VALIDATE_CLEAR_OSSERR_RETURN((_osfile(fh) & FOPEN), EBADF, -1);
return( _osfhnd(fh) );
}
/***
*int _open_osfhandle(long osfhandle, int flags) - open C Runtime file handle
*
*Purpose:
* This function allocates a free C Runtime file handle and associates
* it with the Win32 HANDLE specified by the first parameter.
*
*Entry:
* long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
* int flags - flags to associate with C Runtime file handle.
*
*Exit:
* returns index of entry in fh, if successful
* return -1, if no free entry is found
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _open_osfhandle(
intptr_t osfhandle,
int flags
)
{
int fh;
char fileflags; /* _osfile flags */
DWORD isdev; /* device indicator in low byte */
int success = FALSE;
/* copy relevant flags from second parameter */
fileflags = 0;
if ( flags & _O_APPEND )
fileflags |= FAPPEND;
if ( flags & _O_TEXT )
fileflags |= FTEXT;
if ( flags & _O_NOINHERIT )
fileflags |= FNOINHERIT;
/* find out what type of file (file/device/pipe) */
isdev = GetFileType((HANDLE)osfhandle);
if (isdev == FILE_TYPE_UNKNOWN) {
/* OS error */
_dosmaperr( GetLastError() ); /* map error */
return -1;
}
/* is isdev value to set flags */
if (isdev == FILE_TYPE_CHAR)
fileflags |= FDEV;
else if (isdev == FILE_TYPE_PIPE)
fileflags |= FPIPE;
/* attempt to allocate a C Runtime file handle */
if ( (fh = _alloc_osfhnd()) == -1 ) {
errno = EMFILE; /* too many open files */
_doserrno = 0L; /* not an OS error */
return -1; /* return error to caller */
}
__TRY
/*
* the file is open. now, set the info in _osfhnd array
*/
_set_osfhnd(fh, osfhandle);
fileflags |= FOPEN; /* mark as open */
_osfile(fh) = fileflags; /* set osfile entry */
_textmode(fh) = 0;
_tm_unicode(fh) = 0;
success = TRUE;
__FINALLY
if (!success)
{
_osfile(fh) &= ~FOPEN;
}
_unlock_fh(fh); /* unlock handle */
__END_TRY_FINALLY
return success ? fh : -1; /* return handle */
}
/***
*void __lock_fhandle(int fh) - lock file handle
*
*Purpose:
* Assert the lock associated with the passed file handle.
*
*Entry:
* int fh - CRT file handle
*
*Exit:
* Returns FALSE if the attempt to initialize the lock fails. This can
* only happen the first time the lock is taken, so the return status only
* needs to be checked on the first such attempt, which is always in
* _alloc_osfhnd (except for inherited or standard handles, and the lock
* is allocated manually in _ioinit for those).
*
*Exceptions:
*
*******************************************************************************/
int __cdecl __lock_fhandle (
int fh
)
{
ioinfo *pio = _pioinfo(fh);
int retval=TRUE;
/*
* Make sure the lock has been initialized.
*/
if ( pio->lockinitflag == 0 ) {
_mlock( _LOCKTAB_LOCK );
__TRY
if ( pio->lockinitflag == 0 ) {
if ( !InitializeCriticalSectionAndSpinCount( &(pio->lock), _CRT_SPINCOUNT )) {
/*
* Failed to initialize the lock, so return failure code.
*/
retval=FALSE;
}
pio->lockinitflag++;
}
__FINALLY
_munlock( _LOCKTAB_LOCK);
__END_TRY_FINALLY
}
if(retval)
{
EnterCriticalSection( &(_pioinfo(fh)->lock) );
}
return retval;
}
/***
*void _unlock_fhandle(int fh) - unlock file handle
*
*Purpose:
* Release the lock associated with passed file handle.
*
*Entry:
* int fh - CRT file handle
*
*Exit:
*
*Exceptions:
*
*******************************************************************************/
void __cdecl _unlock_fhandle (
int fh
)
{
LeaveCriticalSection( &(_pioinfo(fh)->lock) );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -