?? osfinfo.c
字號:
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 */
}
/*
* 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 */
_unlock_fh(fh); /* unlock handle */
return fh; /* return handle */
}
#ifdef _MT
/***
*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:
*
*Exceptions:
*
*******************************************************************************/
void __cdecl _lock_fhandle (
int fh
)
{
ioinfo *pio = _pioinfo(fh);
/*
* Make sure the lock has been initialized.
*/
if ( pio->lockinitflag == 0 ) {
_mlock( _LOCKTAB_LOCK );
if ( pio->lockinitflag == 0 ) {
InitializeCriticalSection( &(pio->lock) );
pio->lockinitflag++;
}
_munlock( _LOCKTAB_LOCK);
}
EnterCriticalSection( &(_pioinfo(fh)->lock) );
}
/***
*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) );
}
#endif /* _MT */
#else /* _MAC */
#include <cruntime.h>
#include <errno.h>
#include <internal.h>
#include <fcntl.h>
#include <msdos.h>
#include <stdlib.h>
/***
*int _alloc_osfhnd() - get free _osfhnd[] entry
*
*Purpose:
* Finds the first free entry in _osfhnd[], mark it in use and return
* the index of the entry to the caller.
*
*Entry:
* none
*
*Exit:
* returns index of entry in fh, if successful
* return -1, if no free entry is found in _osfhnd[].
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _alloc_osfhnd(
void
)
{
int fh; /* _osfhnd[] index */
/*
* search _osfhnd[] for an entry that is not currently being used.
* if one is found, mark it in use and set the _osfhandle field to
* 0xffffffff.
*/
for ( fh = 0 ; fh < _nfile ; fh++ ) {
if ( (_osfile[fh] & FOPEN) == 0 ) {
/*
* free entry found! initialize it and
* break out of the loop
*/
_osfhnd[fh] = (long)0xffffffff;
break;
}
}
/*
* return the index of the previously free table entry, if one was
* found. return -1 otherwise.
*/
return( (fh >= _nfile) ? -1 : fh );
}
/***
*int _set_osfhnd(int fh) - set OS file handle table value
*
*Purpose:
* If fh is in range and if _osfhnd[fh] is marked with 0xfffffff
* then set _osfhnd[fh] to the passed value.
*
*Entry:
* int fh - index of _osfhnd[] entry
* long fh - new value of this handle entry
*
*Exit:
* Returns zero if successful.
* Returns -1 and sets errno to EBADF otherwise.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _set_osfhnd (
int fh, /* index into _osfhnd[] (user's file handle) */
long value
)
{
if ( ((unsigned)fh < (unsigned)_nfile) &&
_osfhnd[fh] == (long)0xffffffff
) {
_osfhnd[fh] = value;
return(0);
} else {
errno = EBADF; /* bad handle */
_macerrno = 0L; /* not an OS error */
return -1;
}
}
/***
*int _free_osfhnd(int fh) - free OS file handle table entry
*
*Purpose:
* If fh is in range and if _osfhnd[fh] is in use and NOT marked
* with 0xfffffff
*
*Entry:
* int fh - index of _osfhnd[] entry
*
*Exit:
* Returns zero if successful.
* Returns -1 and sets errno to EBADF otherwise.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _free_osfhnd (
int fh /* index into _osfhnd[] (user's file handle) */
)
{
if ( ((unsigned)fh < (unsigned)_nfile) &&
(_osfile[fh] & FOPEN) &&
_osfhnd[fh] != (long)0xffffffff
) {
_osfhnd[fh] = (long)0xffffffff;
return(0);
} else {
errno = EBADF; /* bad handle */
_macerrno = 0L; /* not an OS error */
return -1;
}
}
/***
*long _get_osfhandle(int fh) - get OS file handle
*
*Purpose:
* If fh is in range and if _osfhnd[fh] is marked free, return
* _osfhnd[fh]
*
*Entry:
* int fh - index of _osfhnd[] entry
*
*Exit:
* Returns the OS file handle if successful.
* Returns -1 and sets errno to EBADF otherwise.
*
*Exceptions:
*
*******************************************************************************/
long __cdecl _get_osfhandle (
int fh /* index into _osfhnd[] (user's file handle) */
)
{
if ( ((unsigned)fh < (unsigned)_nfile) && (_osfile[fh] & FOPEN))
return(_osfhnd[fh]);
else {
errno = EBADF; /* bad handle */
_macerrno = 0L; /* not an OS error */
return -1;
}
}
/***
*int _open_osfhandle(long osfhandle, int flags) - open C Runtime file handle
*
*Purpose:
* This function allocates a free C Runtime file handle and sets it
* to point to the Win32 file handle specified by the first parameter.
*
*Entry:
* long osfhandle -Win32 file 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 in _osfhnd[].
*
*Exceptions:
*
*******************************************************************************/
int __cdecl _open_osfhandle(
long osfhandle,
int flags
)
{
int fh;
char fileflags; /* _osfile flags */
/* copy relavent flags from second parameter */
fileflags = 0;
if ( flags & _O_RDONLY )
fileflags |= FRDONLY;
else if ( flags & _O_APPEND )
fileflags |= FAPPEND;
else if ( flags & _O_TEXT )
fileflags |= FTEXT;
/* attempt to allocate a C Runtime file handle */
if ( (fh = _alloc_osfhnd()) == -1 ) {
errno = EMFILE; /* too many open files */
_macerrno = 0L; /* not an OS error */
return -1; /* return error to caller */
}
/*
* 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 */
return fh; /* return handle */
}
#endif /* _MAC */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -