From 62e33bcd7df00209dd5d7eebcb0695ca6776b978 Mon Sep 17 00:00:00 2001 From: ahodgkinson Date: Wed, 10 May 2006 22:21:40 +0000 Subject: [PATCH] First round of changes to support ring 0 NLMs. git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@404 0109f412-320b-0410-ab79-c3e0c5ffbbe6 --- ftk/Makefile | 4 +- ftk/src/ftk.h | 95 ++++++++++-- ftk/src/ftkbtree.cpp | 1 - ftk/src/ftkdir.cpp | 245 +++++++++++++++++++++++++++---- ftk/src/ftkerror.cpp | 2 +- ftk/src/ftkfsys.cpp | 136 +++++++++++++++-- ftk/src/ftkftx.cpp | 66 +++++++-- ftk/src/ftkmisc.cpp | 69 ++++----- ftk/src/ftksem.cpp | 101 +++++++++++-- ftk/src/ftksys.h | 340 ++++++++++++++++++++++++++++++------------- ftk/src/ftkthrd.cpp | 60 +++++++- 11 files changed, 902 insertions(+), 217 deletions(-) diff --git a/ftk/Makefile b/ftk/Makefile index c6a9187..86f5c0e 100644 --- a/ftk/Makefile +++ b/ftk/Makefile @@ -1002,13 +1002,13 @@ ifdef netware_target endif ifndef wc_dir - $(error Watcom compiler could not be found. Please define wc_dir.) + $(error Watcom compiler could not be found. Please define wc_dir) endif wc_dir := $(call normpath,$(wc_dir)) ifndef ndk_dir - $(error Netware SDK could not be found. Please define ndk_dir.) + $(error Netware SDK could not be found. Please define ndk_dir) endif ndk_dir := $(call normpath,$(ndk_dir)) diff --git a/ftk/src/ftk.h b/ftk/src/ftk.h index e3551cd..c8e3041 100644 --- a/ftk/src/ftk.h +++ b/ftk/src/ftk.h @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// Desc: FLAIM toolkit definitions and interfaces +// Desc: FLAIM's cross-platform toolkit public definitions and interfaces // // Tabs: 3 // @@ -146,7 +146,11 @@ #error Cannot define both FLM_32BIT and FLM_64BIT #endif - #define FSTATIC static + #ifdef FLM_NLM + #define FSTATIC + #else + #define FSTATIC static + #endif // Debug or release build? @@ -321,27 +325,50 @@ = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #endif - #define FLMEXTC extern "C" + #define FLMEXTC extern "C" #if defined( FLM_WIN) - #define FLMAPI __stdcall - #define FLMEXP __declspec(dllexport) + #define FLMAPI __stdcall + #define FLMEXP __declspec(dllexport) #ifdef FLM_DEBUG - #define FINLINE inline + #define FINLINE inline #else - #define FINLINE __forceinline + #define FINLINE __forceinline #endif #elif defined( FLM_NLM) - #define FLMAPI __stdcall - #define FLMEXP FLMEXTC - #define FINLINE inline + #define FLMAPI __stdcall + #define FLMEXP FLMEXTC + #define FINLINE inline #elif defined( FLM_UNIX) #define FLMAPI - #define FLMEXP FLMEXTC - #define FINLINE inline + #define FLMEXP FLMEXTC + #define FINLINE inline #else #error Platform not supported #endif + + #define f_alignedsize(n) \ + ((sizeof(n) + FLM_ALIGN_SIZE - 1) & ~(FLM_ALIGN_SIZE - 1) ) + + #if defined( FLM_GNUC) + #define f_va_start( list, name) \ + __builtin_va_start( list, name) + + #define f_va_arg( list, type) \ + __builtin_va_arg( list, type) + + #define f_va_end( list) \ + __builtin_va_end( list) + #else + #define f_va_start( list, name) \ + (list = (f_va_list)&(name) + f_alignedsize( name)) + + #define f_va_arg( list, type) \ + (*(type *)((list += f_alignedsize( type)) - f_alignedsize( type))) + + #define f_va_end( list) \ + (list = (f_va_list)0) + #endif // flmnovtbl keeps MS compilers from generating vtables for interfaces @@ -1117,6 +1144,10 @@ const char * pszFileName, const char * pszNewFileName) = 0; + virtual RCODE FLMAPI setReadOnly( + const char * pszFileName, + FLMBOOL bReadOnly) = 0; + virtual RCODE FLMAPI getSectorSize( const char * pszFileName, FLMUINT * puiSectorSize) = 0; @@ -1158,6 +1189,8 @@ RCODE FLMAPI FlmGetFileSystem( IF_FileSystem ** ppFileSystem); + IF_FileSystem * FLMAPI f_getFileSysPtr( void); + /**************************************************************************** Desc: ****************************************************************************/ @@ -1650,6 +1683,10 @@ RCODE FLMAPI FlmAllocRandomGenerator( IF_RandomGenerator ** ppRandomGenerator); + + FLMUINT32 FLMAPI f_getRandomUINT32( + FLMUINT32 ui32Low = 0, + FLMUINT32 ui32High = FLM_MAX_RANDOM); /********************************************************************** Desc: Atomic operations @@ -3838,6 +3875,40 @@ FLMUINT uiMaxRespLen, FLMUINT * puiTermChar); + void FLMAPI FTXBeep( void); + + /**************************************************************************** + Desc: Status and return codes + ****************************************************************************/ + #ifndef RC_OK + #define RC_OK( rc) ((rc) == 0) + #endif + + #ifndef RC_BAD + #define RC_BAD( rc) ((rc) != 0) + #endif + + #define FTK_ERROR_BASE(e) ((RCODE)((int)(0x81055000+(e)))) + #define FTK_ERROR_END ((RCODE)((int)(0x81055FFF))) + + const char * FLMAPI f_errorString( + RCODE rc); + + RCODE FLMAPI f_mapPlatformError( + FLMINT iError, + RCODE defaultRc); + + FINLINE FLMBOOL FLMAPI f_isToolkitError( + RCODE rc) + { + if( rc > FTK_ERROR_BASE( 0) && rc < FTK_ERROR_END) + { + return( TRUE); + } + + return( FALSE); + } + /**************************************************************************** Desc: General errors ****************************************************************************/ diff --git a/ftk/src/ftkbtree.cpp b/ftk/src/ftkbtree.cpp index a489aef..c976258 100644 --- a/ftk/src/ftkbtree.cpp +++ b/ftk/src/ftkbtree.cpp @@ -12243,4 +12243,3 @@ void gv_ftkbtree( void) { } #endif - diff --git a/ftk/src/ftkdir.cpp b/ftk/src/ftkdir.cpp index a717f0c..40980a3 100644 --- a/ftk/src/ftkdir.cpp +++ b/ftk/src/ftkdir.cpp @@ -41,7 +41,7 @@ FSTATIC FLMBOOL f_fileMeetsFindCriteria( F_IO_FIND_DATA * pFindData); -#elif defined( FLM_UNIX) || defined( FLM_NLM) +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) #define F_IO_FA_NORMAL 0x01 // Normal file, no attributes #define F_IO_FA_RDONLY 0x02 // Read only attribute @@ -66,7 +66,7 @@ char * FilePath, struct stat * StatusRec); -#else +#elif !defined( FLM_RING_0_NLM) #error Platform not supported @@ -157,9 +157,24 @@ Desc: ****************************************************************************/ FLMBOOL FLMAPI F_DirHdl::currentItemIsDir( void) { +#if defined( FLM_WIN) || defined( FLM_UNIX) || defined( FLM_LIBC_NLM) + return( ((m_uiAttrib & F_IO_FA_DIRECTORY) ? TRUE : FALSE)); + +#elif defined( FLM_NLM) + + if( !m_FindData.m_pCurrentItem) + { + return( FALSE); + } + + return( (m_FindData.m_pCurrentItem->DFileAttributes & SUBDIRECTORY_BIT) + ? TRUE + : FALSE); + +#endif } /**************************************************************************** @@ -174,8 +189,13 @@ FLMUINT64 FLMAPI F_DirHdl::currentItemSize( void) #if defined( FLM_WIN) ui64Size = (((FLMUINT64)m_FindData.findBuffer.nFileSizeHigh) << 32) + m_FindData.findBuffer.nFileSizeLow; -#elif defined( FLM_UNIX) || defined ( FLM_NLM) +#elif defined( FLM_UNIX) || defined ( FLM_LIBC_NLM) ui64Size = m_FindData.FileStat.st_size; +#elif defined( FLM_RING_0_NLM) + if( m_FindData.m_pCurrentItem != NULL ) + { + ui64Size = m_FindData.m_pCurrentItem->DFileSize; + } #endif } return( ui64Size); @@ -184,6 +204,7 @@ FLMUINT64 FLMAPI F_DirHdl::currentItemSize( void) /**************************************************************************** Desc: Get the next item in a directory ****************************************************************************/ +#if defined( FLM_WIN) || defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE FLMAPI F_DirHdl::next( void) { char szFoundPath[ F_PATH_MAX_SIZE]; @@ -206,8 +227,8 @@ RCODE FLMAPI F_DirHdl::next( void) { m_bFirstTime = FALSE; - if( RC_BAD( m_rc = f_fileFindFirst( m_szDirectoryPath, uiSearchAttributes, - &m_FindData, szFoundPath, &uiFoundAttrib))) + if( RC_BAD( m_rc = f_fileFindFirst( m_szDirectoryPath, + uiSearchAttributes, &m_FindData, szFoundPath, &uiFoundAttrib))) { goto Exit; } @@ -242,6 +263,54 @@ Exit: return( m_rc); } +#endif + +/**************************************************************************** +Desc: Get the next item in a directory +****************************************************************************/ +#if defined( FLM_RING_0_NLM) +RCODE FLMAPI F_DirHdl::next( void) +{ + LONG lError = 0; + IF_FileSystem * pFileSystem = f_getFileSysPtr(); + + if( RC_BAD( m_rc)) + { + goto Exit; + } + + for( ;;) + { + if( (lError = DirectorySearch( 0, m_FindData.m_lVolumeNumber, + m_FindData.m_lDirectoryNumber, LONGNameSpace, + m_FindData.m_lCurrentEntryNumber, (BYTE *)"\x02\xFF*", + -1, &m_FindData.m_pCurrentItem, + &m_FindData.m_lCurrentEntryNumber)) != 0) + { + if( (lError == ERR_NO_FILES_FOUND) || (lError == ERR_INVALID_PATH)) + { + m_rc = RC_SET( NE_FLM_IO_NO_MORE_FILES); + } + else + { + m_rc = f_mapPlatformError(lError, NE_FLM_READING_FILE); + } + + break; + } + + if( pFileSystem->doesFileMatch( + (const char *)m_FindData.m_pCurrentItem->DFileName, m_szPattern)) + { + break; + } + } + +Exit: + + return( m_rc); +} +#endif /**************************************************************************** Desc: Open a directory @@ -279,6 +348,7 @@ Exit: /**************************************************************************** Desc: Create a directory (and parent directories if necessary). ****************************************************************************/ +#if defined( FLM_WIN) || defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE FLMAPI F_DirHdl::createDir( const char * pszDirPath) { @@ -335,7 +405,7 @@ RCODE FLMAPI F_DirHdl::createDir( rc = f_mapPlatformError( GetLastError(), NE_FLM_CREATING_FILE); } -#elif defined( FLM_UNIX) || defined( FLM_NLM) +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) if( mkdir( (char *)pszDirPath, 0777) == -1) { @@ -353,6 +423,51 @@ Exit: return( rc); } +#endif + +/**************************************************************************** +Desc: +****************************************************************************/ +#if defined( FLM_RING_0_NLM) +RCODE FLMAPI F_DirHdl::createDir( + const char * pszDirPath) +{ + RCODE rc = NE_FLM_OK; + FLMBYTE pucPseudoLNamePath[ F_PATH_MAX_SIZE + 1]; + FLMBYTE pucLNamePath[ F_PATH_MAX_SIZE]; + LONG lVolumeID; + LONG lPathID; + LONG lLNamePathCount; + LONG lNewDirectoryID; + void * pNotUsed; + LONG lErrorCode; + + f_strcpy( (char *)&pucPseudoLNamePath[1], pszDirPath); + pucPseudoLNamePath[0] = (FLMBYTE)f_strlen( pszDirPath); + + if( (lErrorCode = ConvertPathString( 0, 0, pucPseudoLNamePath, &lVolumeID, + &lPathID, pucLNamePath, &lLNamePathCount)) != 0) + { + goto Exit; + } + + if( (lErrorCode = CreateDirectory( 0, lVolumeID, lPathID, pucLNamePath, + lLNamePathCount, LONGNameSpace, MaximumDirectoryAccessBits, + &lNewDirectoryID, &pNotUsed)) != 0) + { + goto Exit; + } + +Exit: + + if( lErrorCode) + { + rc = f_mapPlatformError( lErrorCode, NE_FLM_CREATING_FILE); + } + + return( rc); +} +#endif /**************************************************************************** Desc: Remove a directory @@ -370,7 +485,7 @@ RCODE FLMAPI F_DirHdl::removeDir( return( NE_FLM_OK); -#elif defined( FLM_UNIX) || defined( FLM_NLM) +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) if( rmdir( (char *)pszDirName) == -1) { @@ -378,13 +493,59 @@ RCODE FLMAPI F_DirHdl::removeDir( } return( NE_FLM_OK); + +#elif defined( FLM_RING_0_NLM) + + return( f_netwareRemoveDir( pszDirName)); #endif } +/**************************************************************************** +Desc: +****************************************************************************/ +#if defined( FLM_RING_0_NLM) +RCODE f_netwareRemoveDir( + const char * pszDirName) +{ + RCODE rc = NE_FLM_OK; + FLMBYTE pucPseudoLNamePath[ F_PATH_MAX_SIZE + 1]; + FLMBYTE pucLNamePath[ F_PATH_MAX_SIZE]; + LONG lVolumeID; + LONG lPathID; + LONG lLNamePathCount; + LONG lErrorCode; + + f_strcpy( (char *)&pucPseudoLNamePath[1], pszDirName); + pucPseudoLNamePath[0] = (FLMBYTE)f_strlen( pszDirName); + + if( (lErrorCode = ConvertPathString( 0, 0, pucPseudoLNamePath, &lVolumeID, + &lPathID, pucLNamePath, &lLNamePathCount)) != 0) + { + goto Exit; + } + + if( (lErrorCode = DeleteDirectory( 0, lVolumeID, lPathID, pucLNamePath, + lLNamePathCount, LONGNameSpace)) != 0) + { + goto Exit; + } + +Exit: + + if( lErrorCode) + { + rc = f_mapPlatformError( lErrorCode, NE_FLM_IO_DELETING_FILE); + } + + return( rc); +} +#endif + /**************************************************************************** Desc: Find the first file that matches the supplied criteria ****************************************************************************/ +#ifdef FLM_WIN RCODE f_fileFindFirst( char * pszSearchPath, FLMUINT uiSearchAttrib, @@ -392,7 +553,6 @@ RCODE f_fileFindFirst( char * pszFoundPath, FLMUINT * puiFoundAttrib) { -#ifdef FLM_WIN RCODE rc = NE_FLM_OK; char szTmpPath[ F_PATH_MAX_SIZE]; char * pszWildCard = "*.*"; @@ -469,9 +629,20 @@ Exit: } return( rc); +} +#endif -#else - +/**************************************************************************** +Desc: Find the first file that matches the supplied criteria +****************************************************************************/ +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) +RCODE f_fileFindFirst( + char * pszSearchPath, + FLMUINT uiSearchAttrib, + F_IO_FIND_DATA * pFindData, + char * pszFoundPath, + FLMUINT * puiFoundAttrib) +{ RCODE rc = NE_FLM_OK; char szTmpPath[ F_PATH_MAX_SIZE]; FSTATIC char pszWildCard[] = {'*',0}; @@ -571,12 +742,13 @@ Exit: Exit: return( rc); -#endif } +#endif /**************************************************************************** Desc: Find the next file that matches the supplied criteria ****************************************************************************/ +#ifdef FLM_WIN RCODE f_fileFindNext( F_IO_FIND_DATA * pFindData, char * pszFoundPath, @@ -585,8 +757,6 @@ RCODE f_fileFindNext( RCODE rc = NE_FLM_OK; IF_FileSystem * pFileSystem = f_getFileSysPtr(); -#ifdef FLM_WIN - if( FindNextFile( pFindData->findHandle, &(pFindData->findBuffer)) == FALSE) { @@ -625,8 +795,24 @@ RCODE f_fileFindNext( *puiFoundAttrib = pFindData->findBuffer.dwFileAttributes; -#elif defined( FLM_UNIX) || defined( FLM_NLM) - int iRetVal; +Exit: + + return( rc); +} +#endif + +/**************************************************************************** +Desc: Find the next file that matches the supplied criteria +****************************************************************************/ +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) +RCODE f_fileFindNext( + F_IO_FIND_DATA * pFindData, + char * pszFoundPath, + FLMUINT * puiFoundAttrib) +{ + RCODE rc = NE_FLM_OK; + IF_FileSystem * pFileSystem = f_getFileSysPtr(); + int iRetVal; if( (iRetVal = Find2( pFindData)) != 0) { @@ -655,24 +841,20 @@ RCODE f_fileFindNext( *puiFoundAttrib = (FLMUINT)ReturnAttributes( pFindData->FileStat.st_mode, pszFoundPath); -#else - rc = RC_SET_AND_ASSERT( NE_FLM_NOT_IMPLEMENTED); - goto Exit; -#endif Exit: return( rc); } +#endif /**************************************************************************** Desc: Releases any memory allocated to an F_IO_FIND_DATA structure ****************************************************************************/ +#ifdef FLM_WIN void f_fileFindClose( F_IO_FIND_DATA * pFindData) { -#ifdef FLM_WIN - // Don't call it on an already closed or invalid handle. if( pFindData->findHandle != INVALID_HANDLE_VALUE) @@ -680,15 +862,24 @@ void f_fileFindClose( FindClose( pFindData->findHandle ); pFindData->findHandle = INVALID_HANDLE_VALUE; } -#elif defined( FLM_UNIX) || defined ( FLM_NLM) +} +#endif + +/**************************************************************************** +Desc: +****************************************************************************/ +#if defined( FLM_UNIX) || defined ( FLM_LIBC_NLM) +void f_fileFindClose( + F_IO_FIND_DATA * pFindData) +{ if( pFindData->globbuf.gl_pathv) { pFindData->globbuf.gl_offs = 0; globfree( &pFindData->globbuf); pFindData->globbuf.gl_pathv = 0; } -#endif } +#endif /**************************************************************************** Desc: Find the next file that matches the supplied criteria @@ -722,7 +913,7 @@ FSTATIC FLMBOOL f_fileMeetsFindCriteria( /**************************************************************************** Desc: Search for file names matching FindTemplate (UNIX) ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FSTATIC int Find1( char * FindTemplate, F_IO_FIND_DATA * DirInfo) @@ -826,7 +1017,7 @@ FSTATIC int Find1( /**************************************************************************** Desc: Search for file names matching FindTemplate (UNIX) ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FSTATIC int Find2( F_IO_FIND_DATA * DirStuff) { @@ -916,7 +1107,7 @@ FSTATIC int Find2( /**************************************************************************** Desc: Return file's attributes (UNIX) ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FSTATIC FLMBYTE ReturnAttributes( mode_t FileMode, char * fileName) @@ -948,7 +1139,7 @@ FSTATIC FLMBYTE ReturnAttributes( /**************************************************************************** Desc: Return file's attributes (UNIX) || (NetWare) ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FSTATIC int RetrieveFileStat( char * FilePath, struct stat * StatusRec) diff --git a/ftk/src/ftkerror.cpp b/ftk/src/ftkerror.cpp index 3a5c995..d78cc59 100644 --- a/ftk/src/ftkerror.cpp +++ b/ftk/src/ftkerror.cpp @@ -58,7 +58,7 @@ RCODE FLMAPI f_makeErr( /*************************************************************************** Desc: Map POSIX errno to Flaim IO errors. ***************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE FLMAPI f_mapPlatformError( FLMINT iError, RCODE defaultRc) diff --git a/ftk/src/ftkfsys.cpp b/ftk/src/ftkfsys.cpp index 862c2cf..91d8640 100644 --- a/ftk/src/ftkfsys.cpp +++ b/ftk/src/ftkfsys.cpp @@ -184,7 +184,7 @@ public: const char * pszFileName, FLMUINT * puiSectorSize); - RCODE setReadOnly( + RCODE FLMAPI setReadOnly( const char * pszFileName, FLMBOOL bReadOnly); @@ -785,7 +785,7 @@ RCODE F_FileSystem::removeEmptyDir( return( NE_FLM_OK); -#elif defined( FLM_UNIX) || defined( FLM_NLM) +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) if( rmdir( pszDirPath) == -1 ) { @@ -793,6 +793,11 @@ RCODE F_FileSystem::removeEmptyDir( } return( NE_FLM_OK); + +#elif defined( FLM_RING_0_NLM) + + return( f_netwareRemoveDir( pszDirPath)); + #endif } @@ -811,7 +816,7 @@ RCODE FLMAPI F_FileSystem::doesFileExist( return NE_FLM_OK; -#else +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) if( access( pszPath, F_OK) == -1) { @@ -820,6 +825,10 @@ RCODE FLMAPI F_FileSystem::doesFileExist( return( NE_FLM_OK); +#elif defined( FLM_RING_0_NLM) + + return( f_netwareTestIfFileExists( pszPath)); + #endif } @@ -913,7 +922,7 @@ Exit: return( rc); -#else +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) struct stat filestatus; @@ -924,6 +933,80 @@ Exit: *puiTimeStamp = (FLMUINT)filestatus.st_mtime; // st_mtime is UTC return NE_FLM_OK; + +#elif defined( FLM_RING_0_NLM) + + RCODE rc = NE_FLM_OK; + FLMUINT uiTmp; + FLMBYTE ucPseudoLNamePath[ F_PATH_MAX_SIZE + 1]; + FLMBYTE ucLNamePath[ F_PATH_MAX_SIZE]; + LONG lVolumeID; + LONG lPathID; + LONG lLNamePathCount; + LONG lDirectoryID; + LONG lErrorCode; + struct DirectoryStructure * pFileInfo = NULL; + + flmAssert( puiTimeStamp); + *puiTimeStamp = 0; + + f_strcpy( (char *)&ucPseudoLNamePath[1], pszPath); + ucPseudoLNamePath[ 0] = (FLMBYTE)f_strlen( pszPath ); + + if( (lErrorCode = ConvertPathString( 0, 0, ucPseudoLNamePath, &lVolumeID, + &lPathID, ucLNamePath, &lLNamePathCount)) != 0) + { + goto Exit; + } + + if( (lErrorCode = GetEntryFromPathStringBase( 0, lVolumeID, 0, ucLNamePath, + lLNamePathCount, LONGNameSpace, LONGNameSpace, &pFileInfo, + &lDirectoryID)) != 0) + { + goto Exit; + } + + if( pFileInfo) + { + FLMUINT uiTime; + FLMUINT uiDate; + F_TMSTAMP dateTime; + LONG DayMask = 0x001F; + LONG MonthMask = 0x01E0; + LONG YearMask = 0xFE00; + LONG SecMask = 0x001F; + LONG MinMask = 0x07E0; + LONG HourMask = 0xF800; + + //Get the low-order 16 bits + + uiTime = (FLMUINT)pFileInfo->DLastUpdatedDateAndTime; + + //Get the high-order 16 bits + + uiDate = (FLMUINT)(pFileInfo->DLastUpdatedDateAndTime >> 16); + + f_memset( &dateTime, 0, sizeof( dateTime)); + dateTime.second = (FLMBYTE) ((uiTime & SecMask) * 2); + dateTime.minute = (FLMBYTE) ((uiTime & MinMask) >> 5); + dateTime.hour = (FLMBYTE) ((uiTime & HourMask) >> 11); + dateTime.day = (FLMBYTE) (uiDate & DayMask); + dateTime.month = (FLMBYTE) ((uiDate & MonthMask) >> 5)-1; + dateTime.year = (FLMUINT16)(((uiDate & YearMask) >> 9) + 1980); + + f_timeDateToSeconds( &dateTime, &uiTmp); + *puiTimeStamp = uiTmp; + *puiTimeStamp = f_localTimeToUTC(*puiTimeStamp); + } + +Exit: + + if( lErrorCode != 0 ) + { + rc = f_mapPlatformError( lErrorCode, NE_FLM_PARSING_FILE_NAME); + } + + return( rc); #endif } @@ -945,7 +1028,7 @@ FLMBOOL FLMAPI F_FileSystem::isDir( return (FileAttr & FILE_ATTRIBUTE_DIRECTORY) ? TRUE : FALSE; -#else +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) struct stat filestatus; @@ -955,6 +1038,32 @@ FLMBOOL FLMAPI F_FileSystem::isDir( } return ( S_ISDIR( filestatus.st_mode)) ? TRUE : FALSE; + +#elif defined( FLM_RING_0_NLM) + + LONG lIsFile; + FLMBYTE ucPseudoLNamePath[ F_PATH_MAX_SIZE + 1]; + FLMBYTE ucLNamePath[ F_PATH_MAX_SIZE]; + LONG lVolumeID; + LONG lPathID; + LONG lLNamePathCount; + LONG lDirectoryID; + FLMBOOL bIsDir = FALSE; + + f_strcpy( (char *)&ucPseudoLNamePath[1], pszDirName); + ucPseudoLNamePath[0] = (FLMBYTE)f_strlen( pszDirName); + if( ConvertPathString( 0, 0, ucPseudoLNamePath, &lVolumeID, &lPathID, + ucLNamePath, &lLNamePathCount) == 0) + { + if( MapPathToDirectoryNumber( 0, lVolumeID, 0, ucLNamePath, + lLNamePathCount, LONGNameSpace, &lDirectoryID, &lIsFile) == 0) + { + bIsDir = (FLMBOOL)((lIsFile == 0) ? (FLMBOOL)TRUE : (FLMBOOL)FALSE); + } + } + + return( bIsDir); + #endif } @@ -973,7 +1082,7 @@ RCODE FLMAPI F_FileSystem::deleteFile( return( NE_FLM_OK); -#else +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) struct stat FileStat; @@ -997,6 +1106,10 @@ RCODE FLMAPI F_FileSystem::deleteFile( } return( NE_FLM_OK); + +#elif defined( FLM_RING_0_NLM) + + return( f_netwareDeleteFile( pszFileName)); #endif } @@ -1244,7 +1357,7 @@ RCODE FLMAPI F_FileSystem::renameFile( return( rc); -#else +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE rc; FLMBOOL bSrcIsDir; @@ -1294,6 +1407,11 @@ RCODE FLMAPI F_FileSystem::renameFile( } return( NE_FLM_OK); + +#elif defined( FLM_RING_0_NLM) + + return( f_netwareRenameFile( pszFileName, pszNewFileName)); + #endif } @@ -1307,7 +1425,7 @@ RCODE FLMAPI F_FileSystem::getSectorSize( #ifdef FLM_NLM F_UNREFERENCED_PARM( pszFileName); - *puiSectorSize = F_NETWARE_SECTOR_SIZE; + *puiSectorSize = FLM_NLM_SECTOR_SIZE; return( NE_FLM_OK); #elif defined( FLM_WIN) @@ -1368,7 +1486,7 @@ Exit: /**************************************************************************** Desc: Set the Read-Only Attribute (not supported on all platforms). ****************************************************************************/ -RCODE F_FileSystem::setReadOnly( +RCODE FLMAPI F_FileSystem::setReadOnly( const char * pszFileName, FLMBOOL bReadOnly) { diff --git a/ftk/src/ftkftx.cpp b/ftk/src/ftkftx.cpp index 3fa96ad..9183338 100644 --- a/ftk/src/ftkftx.cpp +++ b/ftk/src/ftkftx.cpp @@ -437,6 +437,9 @@ FSTATIC void ftxDisplaySetBackFore( eColorType backgroundColor, eColorType foregroundColor); +FSTATIC FLMUINT ftxMapFlmColorToWin32( + eColorType uiColor); + RCODE _ftxBackgroundThread( IF_Thread * pThread); @@ -444,8 +447,6 @@ FLMBOOL ftxKBTest( void); FLMUINT ftxKBGetChar( void); -FLMBOOL ftxBeep( void); - RCODE _ftxDefaultDisplayHandler( IF_Thread * pThread); @@ -3301,8 +3302,10 @@ FSTATIC void ftxWin32Refresh( void) pWinScreen->uiCols) + (uiSubloop + pWinImage->uiUlx)]); paCell->Char.AsciiChar = pWinImage->pszBuffer[ uiOffset]; paCell->Attributes = - (WORD)(((pWinImage->pucForeAttrib[ uiOffset] & 0x8F) | - ((pWinImage->pucBackAttrib[ uiOffset] << 4) & 0x7F))); + (ftxMapFlmColorToWin32( + (eColorType)pWinImage->pucForeAttrib[ uiOffset]) & 0x8F) | + ((ftxMapFlmColorToWin32( + (eColorType)pWinImage->pucBackAttrib[ uiOffset]) << 4) & 0x7F); } } @@ -4239,6 +4242,51 @@ FSTATIC FLMUINT ftxDisplayStrOut( } #endif +/**************************************************************************** +Desc: Set the background and foreground colors of the "physical" screen +****************************************************************************/ +FSTATIC FLMUINT ftxMapFlmColorToWin32( + eColorType uiColor) +{ + switch( uiColor) + { + case FLM_BLACK: + return( 0); + case FLM_BLUE: + return( 1); + case FLM_GREEN: + return( 2); + case FLM_CYAN: + return( 3); + case FLM_RED: + return( 4); + case FLM_MAGENTA: + return( 5); + case FLM_BROWN: + return( 6); + case FLM_LIGHTGRAY: + return( 7); + case FLM_DARKGRAY: + return( 8); + case FLM_LIGHTBLUE: + return( 9); + case FLM_LIGHTGREEN: + return( 10); + case FLM_LIGHTCYAN: + return( 11); + case FLM_LIGHTRED: + return( 12); + case FLM_LIGHTMAGENTA: + return( 13); + case FLM_YELLOW: + return( 14); + case FLM_WHITE: + return( 15); + default: + return( 0); + } +} + /**************************************************************************** Desc: Set the background and foreground colors of the "physical" screen ****************************************************************************/ @@ -4251,7 +4299,8 @@ FSTATIC void ftxDisplaySetBackFore( FLMUINT uiAttrib = 0; - uiAttrib = (foregroundColor & 0x8F) | ((backgroundColor << 4) & 0x7F); + uiAttrib = (ftxMapFlmColorToWin32( foregroundColor) & 0x8F) | + ((ftxMapFlmColorToWin32( backgroundColor) << 4) & 0x7F); SetConsoleTextAttribute( gv_hStdOut, (WORD)uiAttrib); #else @@ -4562,16 +4611,11 @@ Exit: Desc: Causes the console to "beep" Ret: If the console does not support this feature, FALSE is returned. ****************************************************************************/ -FLMBOOL ftxBeep( void) +void FLMAPI FTXBeep( void) { #if defined( FLM_WIN) Beep( (DWORD)2000, (DWORD)250); - return( TRUE); - -#else - - return( FALSE); #endif } diff --git a/ftk/src/ftkmisc.cpp b/ftk/src/ftkmisc.cpp index 7a63167..dc535b2 100644 --- a/ftk/src/ftkmisc.cpp +++ b/ftk/src/ftkmisc.cpp @@ -26,18 +26,18 @@ #include "ftksys.h" static FLMUINT gv_uiStartupCount = 0; -static FLMUINT gv_uiSerialInitCount = 0; -static F_MUTEX gv_hSerialMutex = F_MUTEX_NULL; -static IF_RandomGenerator * gv_pSerialRandom = NULL; +static FLMUINT gv_uiRandomGenInitCount = 0; +static F_MUTEX gv_hRandomGenMutex = F_MUTEX_NULL; +static IF_RandomGenerator * gv_pRandomGenerator = NULL; static FLMUINT32 * gv_pui32CRCTbl = NULL; static IF_ThreadMgr * gv_pThreadMgr = NULL; static IF_FileSystem * gv_pFileSystem = NULL; static FLMUINT gv_uiMaxFileSize = FLM_MAXIMUM_FILE_SIZE; static F_XML * gv_pXml = NULL; -FSTATIC RCODE f_initSerialNumberGenerator( void); +FSTATIC RCODE f_initRandomGenerator( void); -FSTATIC void f_freeSerialNumberGenerator( void); +FSTATIC void f_freeRandomGenerator( void); FSTATIC RCODE f_initCRCTable( FLMUINT32 ** ppui32CRCTbl); @@ -120,7 +120,7 @@ RCODE FLMAPI ftkStartup( void) goto Exit; } - if( RC_BAD( rc = f_initSerialNumberGenerator())) + if( RC_BAD( rc = f_initRandomGenerator())) { goto Exit; } @@ -208,7 +208,7 @@ void FLMAPI ftkShutdown( void) gv_pXml->Release(); } - f_freeSerialNumberGenerator(); + f_freeRandomGenerator(); f_freeCharMappingTables(); f_memoryCleanup(); } @@ -270,22 +270,19 @@ void FLMAPI f_sleep( #endif /**************************************************************************** -Desc: This routine initializes the serial number generator. If the O/S - does not provide support for GUID generation or if the GUID - routines fail for some reason, a pseudo-GUID will be generated. -Notes: This routine should only be called once by the process. +Desc: ****************************************************************************/ -FSTATIC RCODE f_initSerialNumberGenerator( void) +FSTATIC RCODE f_initRandomGenerator( void) { FLMUINT uiTime; RCODE rc = NE_FLM_OK; - if (++gv_uiSerialInitCount > 1) + if (++gv_uiRandomGenInitCount > 1) { goto Exit; } - if( RC_BAD( rc = f_mutexCreate( &gv_hSerialMutex))) + if( RC_BAD( rc = f_mutexCreate( &gv_hRandomGenMutex))) { goto Exit; } @@ -294,12 +291,12 @@ FSTATIC RCODE f_initSerialNumberGenerator( void) #if defined( FLM_UNIX) || defined( FLM_NLM) - if( RC_BAD( rc = FlmAllocRandomGenerator( &gv_pSerialRandom))) + if( RC_BAD( rc = FlmAllocRandomGenerator( &gv_pRandomGenerator))) { goto Exit; } - gv_pSerialRandom->setSeed( (FLMUINT32)(uiTime ^ (FLMUINT)getpid())); + gv_pRandomGenerator->setSeed( (FLMUINT32)(uiTime ^ (FLMUINT)getpid())); #endif Exit: @@ -310,22 +307,22 @@ Exit: /**************************************************************************** Desc: ****************************************************************************/ -FSTATIC void f_freeSerialNumberGenerator( void) +FSTATIC void f_freeRandomGenerator( void) { - if( (--gv_uiSerialInitCount) > 0) + if( (--gv_uiRandomGenInitCount) > 0) { return; } - if( gv_pSerialRandom) + if( gv_pRandomGenerator) { - gv_pSerialRandom->Release(); - gv_pSerialRandom = NULL; + gv_pRandomGenerator->Release(); + gv_pRandomGenerator = NULL; } - if( gv_hSerialMutex != F_MUTEX_NULL) + if( gv_hRandomGenMutex != F_MUTEX_NULL) { - f_mutexDestroy( &gv_hSerialMutex); + f_mutexDestroy( &gv_hRandomGenMutex); } } @@ -360,16 +357,10 @@ RCODE FLMAPI f_createSerialNumber( // Generate a pseudo GUID value - f_assert( gv_hSerialMutex != F_MUTEX_NULL); - - f_mutexLock( gv_hSerialMutex); - - UD2FBA( gv_pSerialRandom->getUINT32(), &pszSerialNum[ 0]); - UD2FBA( gv_pSerialRandom->getUINT32(), &pszSerialNum[ 4]); - UD2FBA( gv_pSerialRandom->getUINT32(), &pszSerialNum[ 8]); - UD2FBA( gv_pSerialRandom->getUINT32(), &pszSerialNum[ 12]); - - f_mutexUnlock( gv_hSerialMutex); + UD2FBA( f_getRandomUINT32(), &pszSerialNum[ 0]); + UD2FBA( f_getRandomUINT32(), &pszSerialNum[ 4]); + UD2FBA( f_getRandomUINT32(), &pszSerialNum[ 8]); + UD2FBA( f_getRandomUINT32(), &pszSerialNum[ 12]); #endif @@ -1076,7 +1067,7 @@ FLMINT FLMAPI F_Object::Release( void) /********************************************************************** Desc: **********************************************************************/ -IF_FileSystem * f_getFileSysPtr( void) +IF_FileSystem * FLMAPI f_getFileSysPtr( void) { return( gv_pFileSystem); } @@ -1497,3 +1488,13 @@ IF_XML * f_getXmlObjPtr( void) { return( gv_pXml); } + +/**************************************************************************** +Desc: +****************************************************************************/ +FLMUINT32 FLMAPI f_getRandomUINT32( + FLMUINT32 ui32Low, + FLMUINT32 ui32High) +{ + return( gv_pRandomGenerator->getUINT32( ui32Low, ui32High)); +} diff --git a/ftk/src/ftksem.cpp b/ftk/src/ftksem.cpp index 8c851fc..bf636ad 100644 --- a/ftk/src/ftksem.cpp +++ b/ftk/src/ftksem.cpp @@ -28,7 +28,7 @@ /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) typedef struct { pthread_mutex_t lock; @@ -82,7 +82,7 @@ void FLMAPI f_mutexDestroy( /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE FLMAPI f_mutexCreate( F_MUTEX * phMutex) { @@ -139,7 +139,7 @@ Exit: /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) void FLMAPI f_mutexDestroy( F_MUTEX * phMutex) { @@ -162,7 +162,7 @@ void FLMAPI f_mutexDestroy( /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) void FLMAPI f_mutexLock( F_MUTEX hMutex) { @@ -173,7 +173,7 @@ void FLMAPI f_mutexLock( /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) void FLMAPI f_mutexUnlock( F_MUTEX hMutex) { @@ -184,7 +184,7 @@ void FLMAPI f_mutexUnlock( /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) void FLMAPI f_assertMutexLocked( F_MUTEX) { @@ -194,7 +194,7 @@ void FLMAPI f_assertMutexLocked( /**************************************************************************** Desc: Initializes a semaphore handle on UNIX ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FINLINE int sema_init( sema_t * pSem) { @@ -222,7 +222,7 @@ Exit: /**************************************************************************** Desc: Frees a semaphore handle on UNIX ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FINLINE void sema_destroy( sema_t * pSem) { @@ -234,7 +234,7 @@ FINLINE void sema_destroy( /**************************************************************************** Desc: Waits for a semaphore to be signaled on UNIX ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FINLINE int sema_wait( sema_t * pSem) { @@ -270,7 +270,7 @@ Exit: Desc: Waits a specified number of milliseconds for a semaphore to be signaled on UNIX ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) FINLINE int sema_timedwait( sema_t * pSem, unsigned int msecs) @@ -322,7 +322,7 @@ Exit: /**************************************************************************** Desc: Signals a semaphore on UNIX ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) int sema_signal( sema_t * pSem) { @@ -339,7 +339,7 @@ int sema_signal( /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE f_semCreate( F_SEM * phSem) { @@ -369,7 +369,7 @@ Exit: /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) void f_semDestroy( F_SEM * phSem) { @@ -387,7 +387,7 @@ void f_semDestroy( /**************************************************************************** Desc: Get the lock on a semaphore - p operation ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) RCODE f_semWait( F_SEM hSem, FLMUINT uiTimeout) @@ -424,7 +424,7 @@ RCODE f_semWait( /**************************************************************************** Desc: Get the lock on a semaphore - p operation ****************************************************************************/ -#if defined( FLM_UNIX) || defined( FLM_NLM) +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) void FLMAPI f_semSignal( F_SEM hSem) { @@ -432,6 +432,77 @@ void FLMAPI f_semSignal( } #endif +/************************************************************************* +Desc: +*************************************************************************/ +#if defined( FLM_RING_0_NLM) +RCODE FLMAPI f_semCreate( + F_SEM * phSem) +{ + if( (*phSem = (F_SEM)kSemaphoreAlloc( (BYTE *)"NOVDB", 0)) == F_SEM_NULL) + { + return( RC_SET( NE_FLM_MEM)); + } + + return( NE_FLM_OK); +} +#endif + +/************************************************************************* +Desc: +*************************************************************************/ +#if defined( FLM_RING_0_NLM) +void FLMAPI f_semDestroy( + F_SEM * phSem) +{ + if (*phSem != F_SEM_NULL) + { + (void)kSemaphoreFree( (SEMAPHORE)(*phSem)); + *phSem = F_SEM_NULL; + } +} +#endif + +/************************************************************************* +Desc: +*************************************************************************/ +#if defined( FLM_RING_0_NLM) +RCODE FLMAPI f_semWait( + F_SEM hSem, + FLMUINT uiTimeout) +{ + RCODE rc = NE_FLM_OK; + + if( uiTimeout == F_SEM_WAITFOREVER) + { + if( kSemaphoreWait( (SEMAPHORE)hSem) != 0) + { + rc = RC_SET( NE_FLM_ERROR_WAITING_ON_SEMPAHORE); + } + } + else + { + if( kSemaphoreTimedWait( (SEMAPHORE)hSem, (UINT)uiTimeout) != 0) + { + rc = RC_SET( NE_FLM_ERROR_WAITING_ON_SEMPAHORE); + } + } + + return( rc); +} +#endif + +/************************************************************************* +Desc: +*************************************************************************/ +#if defined( FLM_RING_0_NLM) +void FLMAPI f_semSignal( + F_SEM hSem) +{ + (void)kSemaphoreSignal( (SEMAPHORE)hSem); +} +#endif + /**************************************************************************** Desc: ****************************************************************************/ diff --git a/ftk/src/ftksys.h b/ftk/src/ftksys.h index 7cb82af..590c915 100644 --- a/ftk/src/ftksys.h +++ b/ftk/src/ftksys.h @@ -28,6 +28,17 @@ #define FTKSYS_H #include "ftk.h" + + #ifdef FLM_NLM + #define FLM_RING_0_NLM + #endif +// #ifndef FLM_RING_0_NLM +// #define FLM_LIBC_NLM +// #endif + + #if defined( FLM_RING_0_NLM) && defined( FLM_LIBC_NLM) + #error Cannot target both LIBC and RING 0 + #endif class F_FileHdl; class F_Thread; @@ -45,99 +56,13 @@ #define FLM_DEFAULT_OPEN_THRESHOLD 100 #define FLM_DEFAULT_MAX_AVAIL_TIME 900 #define FLM_MAX_KEY_SIZE 1024 + #define FLM_NLM_SECTOR_SIZE 512 /**************************************************************************** Desc: NLM ****************************************************************************/ #if defined( FLM_NLM) - - #if defined( FLM_WATCOM_NLM) - #pragma warning 007 9 - - // Disable "Warning! W549: col(XX) 'sizeof' operand contains - // compiler generated information" - - #pragma warning 549 9 - - // Disable "Warning! W656: col(XX) define this function inside its class - // definition (may improve code quality)" - - #pragma warning 656 9 - - // Disable Warning! W555: col(XX) expression for 'while' is always - // "false" - - #pragma warning 555 9 - #endif - - #define _POSIX_SOURCE - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - - // The typedef for va_list in stdarg.h do not function properly when - // a va_list is passed down multiple layers as a pointer (va_list *). - // Therefore, the following definitions/typedefs were taken from a - // "fixed" version of stdarg.h implemented by DS. - - // typedef unsigned long f_va_list; - - #define f_argsize(x) \ - ((sizeof(x)+sizeof(int)-1) & ~(sizeof(int)-1)) - - #define f_va_start(ap, parmN) \ - ((void)((ap) = (unsigned long)&(parmN) + f_argsize(parmN))) - - #define f_va_arg(ap, type) \ - (*(type *)(((ap) += f_argsize(type)) - (f_argsize(type)))) - - #define f_va_end(ap) ((void)0) - - #ifndef _SIZE_T - #define _SIZE_T - typedef unsigned int size_t; - #endif - - #ifndef _WCHAR_T - #define _WCHAR_T - typedef unsigned short wchar_t; - #endif - - #ifndef WCHAR - #define WCHAR wchar_t - #endif - - #ifndef LONG - #define LONG unsigned long - #endif - - #ifndef BYTE - #define BYTE unsigned char - #endif - - #ifndef UINT - #define UINT unsigned int - #endif - - #define F_NETWARE_SECTOR_SIZE 512 - - FINLINE void * f_getNLMHandle( void) - { - return( getnlmhandle()); - } - + #include "ftknlm.h" #endif /**************************************************************************** @@ -181,9 +106,6 @@ #pragma warning( disable : 4710) #define ENDLINE ENDLINE_CRLF - #define f_va_start va_start - #define f_va_arg va_arg - #define f_va_end va_end #endif @@ -244,10 +166,6 @@ #include #endif - #define f_va_start va_start - #define f_va_arg va_arg - #define f_va_end va_end - typedef int SOCKET; #define INVALID_SOCKET -1 @@ -1004,7 +922,7 @@ /*************************************************************************** Desc: ***************************************************************************/ - #if defined( FLM_UNIX) || defined( FLM_NLM) + #if defined( FLM_UNIX) class F_FileHdl : public IF_FileHdl { public: @@ -1187,6 +1105,207 @@ friend class F_MultiFileHdl; }; #endif + + /*************************************************************************** + Desc: + ***************************************************************************/ + #if defined( FLM_NLM) + class F_FileHdl : public IF_FileHdl + { + public: + + F_FileHdl(); + + virtual ~F_FileHdl(); + + RCODE FLMAPI flush( void); + + RCODE FLMAPI read( + FLMUINT64 ui64Offset, + FLMUINT uiLength, + void * pvBuffer, + FLMUINT * puiBytesRead); + + RCODE FLMAPI seek( + FLMUINT64 ui64Offset, + FLMINT iWhence, + FLMUINT64 * pui64NewOffset); + + RCODE FLMAPI size( + FLMUINT64 * pui64Size); + + RCODE FLMAPI tell( + FLMUINT64 * pui64Offset); + + RCODE FLMAPI truncate( + FLMUINT64 ui64Size); + + RCODE FLMAPI write( + FLMUINT64 ui64Offset, + FLMUINT uiLength, + const void * pvBuffer, + FLMUINT * puiBytesWritten); + + RCODE FLMAPI sectorRead( + FLMUINT64 ui64ReadOffset, + FLMUINT uiBytesToRead, + void * pvBuffer, + FLMUINT * puiBytesReadRV); + + RCODE FLMAPI sectorWrite( + FLMUINT64 ui64WriteOffset, + FLMUINT uiBytesToWrite, + const void * pvBuffer, + FLMUINT uiBufferSize, + void * pvBufferObj, + FLMUINT * puiBytesWrittenRV, + FLMBOOL bZeroFill = TRUE); + + RCODE FLMAPI close( void); + + FLMBOOL FLMAPI canDoAsync( void); + + FINLINE void FLMAPI setExtendSize( + FLMUINT uiExtendSize) + { + m_uiExtendSize = uiExtendSize; + } + + FINLINE void FLMAPI setMaxAutoExtendSize( + FLMUINT uiMaxAutoExtendSize) + { + m_uiMaxAutoExtendSize = uiMaxAutoExtendSize; + } + + FINLINE void FLMAPI setSuballocation( + FLMBOOL bDoSuballocation) + { + m_bDoSuballocation = bDoSuballocation; + } + + FINLINE FLMUINT FLMAPI getSectorSize( void) + { + return( FLM_NLM_SECTOR_SIZE); + } + + FINLINE FLMUINT FLMAPI getBlockSize( void) + { + return( m_uiBlockSize); + } + + FINLINE FLMBOOL FLMAPI isReadOnly( void) + { + return( m_bOpenedReadOnly); + } + + RCODE FLMAPI lock( void); + + RCODE FLMAPI unlock( void); + + FINLINE void FLMAPI setBlockSize( + FLMUINT uiBlockSize) + { + m_uiBlockSize = uiBlockSize; + } + + private: + + RCODE setup( void); + + RCODE create( + const char * pszFileName, + FLMUINT uiIoFlags); + + RCODE createUnique( + char * pszDirName, + const char * pszFileExtension, + FLMUINT uiIoFlags); + + RCODE open( + const char * pszFileName, + FLMUINT uiIoFlags); + + RCODE openOrCreate( + const char * pszFileName, + FLMUINT uiAccess, + FLMBOOL bCreateFlag); + + RCODE _read( + FLMUINT uiOffset, + FLMUINT uiLength, + void * pvBuffer, + FLMUINT * puiBytesRead); + + RCODE _directIORead( + FLMUINT uiOffset, + FLMUINT uiLength, + void * pvBuffer, + FLMUINT * puiBytesRead); + + RCODE _directIOSectorRead( + FLMUINT uiReadOffset, + FLMUINT uiBytesToRead, + void * pvBuffer, + FLMUINT * puiBytesReadRV); + + RCODE _write( + FLMUINT uiWriteOffset, + FLMUINT uiBytesToWrite, + const void * pvBuffer, + FLMUINT * puiBytesWrittenRV); + + RCODE _directIOWrite( + FLMUINT uiWriteOffset, + FLMUINT uiBytesToWrite, + const void * pvBuffer, + FLMUINT * puiBytesWrittenRV); + + RCODE expand( + LONG lStartSector, + LONG lSectorsToAlloc); + + RCODE writeSectors( + void * pvBuffer, + LONG lStartSector, + LONG lSectorCount, + IF_IOBuffer * pBufferObj, + FLMBOOL * pbDidAsync = NULL); + + RCODE _directIOSectorWrite( + FLMUINT uiWriteOffset, + FLMUINT uiBytesToWrite, + const void * pvBuffer, + IF_IOBuffer * pBufferObj, + FLMUINT * puiBytesWrittenRV, + FLMBOOL bZeroFill); + + char * m_pszIoPath; + FLMBOOL m_bDeleteOnClose; + FLMUINT m_uiMaxFileSize; + FLMBOOL m_bFileOpened; + FLMBOOL m_bOpenedExclusive; + FLMBOOL m_bOpenedReadOnly; + FLMUINT m_uiBlockSize; + + LONG m_lFileHandle; + LONG m_lOpenAttr; + LONG m_lVolumeID; + LONG m_lLNamePathCount; + FLMBOOL m_bDoSuballocation; + FLMUINT m_uiExtendSize; + FLMUINT m_uiMaxAutoExtendSize; + FLMBOOL m_bDoDirectIO; + LONG m_lSectorsPerBlock; + LONG m_lMaxBlocks; + FLMUINT m_uiCurrentPos; + FLMBOOL m_bNSS; + FLMINT64 m_NssKey; + FLMBOOL m_bNSSFileOpen; + + friend class F_FileSystem; + friend class F_MultiFileHdl; + }; + #endif /*************************************************************************** Desc: @@ -1371,7 +1490,7 @@ FLMUINT uiSearchAttrib; } F_IO_FIND_DATA; - #elif defined( FLM_UNIX) || defined( FLM_NLM) + #elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) typedef struct { @@ -1384,6 +1503,18 @@ char dirpath[ F_PATH_MAX_SIZE]; glob_t globbuf; } F_IO_FIND_DATA; + + #elif defined( FLM_RING_0_NLM) + + typedef struct + { + LONG m_lVolumeNumber; + LONG m_lDirectoryNumber; + LONG m_lCurrentEntryNumber; + struct DirectoryStructure * m_pCurrentItem; + char m_ucTempBuffer[ F_FILENAME_SIZE]; + } F_IO_FIND_DATA; + #else #error Platform not supported @@ -2164,8 +2295,6 @@ RCODE f_allocDirHdl( F_DirHdl ** ppDirHdl); - IF_FileSystem * f_getFileSysPtr( void); - IF_ThreadMgr * f_getThreadMgrPtr( void); RCODE f_verifyMetaphoneRoutines( void); @@ -2175,5 +2304,18 @@ void f_freeCharMappingTables( void); IF_XML * f_getXmlObjPtr( void); + + RCODE f_netwareRemoveDir( + const char * pszDirName); + + RCODE f_netwareTestIfFileExists( + const char * pPath); + + RCODE f_netwareDeleteFile( + const char * pPath); + + RCODE f_netwareRenameFile( + const char * pOldFilePath, + const char * pNewFilePath); #endif // FTKSYS_H diff --git a/ftk/src/ftkthrd.cpp b/ftk/src/ftkthrd.cpp index 0502eb6..e3a9563 100644 --- a/ftk/src/ftkthrd.cpp +++ b/ftk/src/ftkthrd.cpp @@ -25,9 +25,13 @@ #include "ftksys.h" -#ifdef FLM_NLM +#ifdef FLM_LIBC_NLM void * threadStub( void * pvThread); +#elif defined( FLM_RING_0_NLM) + void * threadStub( + void * pvUnused, + void * pvThread); #elif defined( FLM_WIN) unsigned __stdcall threadStub( void * pvThread); @@ -396,10 +400,15 @@ RCODE FLMAPI F_Thread::startThread( RCODE rc = NE_FLM_OK; F_ThreadMgr * pThreadMgr = (F_ThreadMgr *)f_getThreadMgrPtr(); FLMBOOL bManagerMutexLocked = FALSE; -#ifdef FLM_NLM +#ifdef FLM_LIBC_NLM pthread_attr_t thread_attr; pthread_t uiThreadId; #endif +#ifdef FLM_RING_0_NLM +#ifdef FLM_NLM + void * hThread = NULL; +#endif +#endif #ifdef FLM_WIN unsigned uiThreadId; #endif @@ -495,7 +504,7 @@ RCODE FLMAPI F_Thread::startThread( goto Exit; } m_uiThreadId = (FLMUINT)uiThreadId; -#elif defined( FLM_NLM) +#elif defined( FLM_LIBC_NLM) pthread_attr_init( &thread_attr); pthread_attr_setdetachstate( &thread_attr, PTHREAD_CREATE_DETACHED); @@ -508,6 +517,33 @@ RCODE FLMAPI F_Thread::startThread( m_uiThreadId = (FLMUINT)uiThreadId; pthread_attr_destroy( &thread_attr); +#elif defined( FLM_RING_0_NLM) +#elif defined( FLM_NLM) + if( (hThread = kCreateThread( + (BYTE *)((m_pszThreadName) + ? (BYTE *)m_pszThreadName + : (BYTE *)"NDSDB"), + threadStub, NULL, (LONG)m_uiStackSize, + (void *)this)) == NULL) + { + rc = RC_SET( NE_FLM_COULD_NOT_START_THREAD); + goto Exit; + } + m_uiThreadId = (FLMUINT)hThread; + + if( kSetThreadLoadHandle( hThread, (LONG)f_getNLMHandle()) != 0) + { + (void)kDestroyThread( hThread); + rc = RC_SET( NE_FLM_COULD_NOT_START_THREAD); + goto Exit; + } + + if( kScheduleThread( hThread) != 0) + { + (void)kDestroyThread( hThread); + rc = RC_SET( NE_FLM_COULD_NOT_START_THREAD); + goto Exit; + } #elif defined( FLM_UNIX) #ifdef _POSIX_THREADS pthread_attr_init( &thread_attr); @@ -592,9 +628,13 @@ void FLMAPI F_Thread::stopThread( void) Desc: Begins a new thread of execution and calls the passed function. Performs generic thread init and cleanup functions. ****************************************************************************/ -#ifdef FLM_NLM +#ifdef FLM_LIBC_NLM void * threadStub( void * pvThread) +#elif defined( FLM_RING_0_NLM) +void * threadStub( + void * pvUnused, + void * pvThread) #elif defined( FLM_WIN) unsigned __stdcall threadStub( void * pvThread) @@ -606,7 +646,11 @@ void * threadStub( F_Thread * pThread = (F_Thread *)pvThread; F_ThreadMgr * pThreadMgr = (F_ThreadMgr *)f_getThreadMgrPtr(); -#if defined( FLM_UNIX) || defined( FLM_NLM) +#ifdef FLM_RING_0_NLM + F_UNREFERENCED_PARM( pvUnused); +#endif + +#if defined( FLM_UNIX) || defined( FLM_LIBC_NLM) // Block all signals (main thread will handle all signals) sigset_t mask; @@ -660,6 +704,8 @@ void * threadStub( #if defined( FLM_WIN) _endthreadex( 0); return( 0); +#elif defined( FLM_RING_0_NLM) + kExitThread( NULL); #endif #if defined( FLM_NLM) || defined( FLM_UNIX) @@ -1324,8 +1370,10 @@ FLMUINT FLMAPI f_threadId( void) { #ifdef FLM_WIN return( (FLMUINT)_threadid); -#elif defined( FLM_NLM) || defined( FLM_UNIX) +#elif defined( FLM_UNIX) || defined( FLM_LIBC_NLM) return( (FLMUINT)pthread_self()); +#elif defined( FLM_RING_0_NLM) + return( (FLMUINT)kCurrentThread()); #else #error Platform not supprted #endif