/*++ Copyright (c) 1995 Microsoft Corporation Module Name : lsaux.hxx Abstract: This header declares all the auxiliary types, data and functions required for processing ls command in ftp service. Author: Murali R. Krishnan ( MuraliK ) 2-May-1995 Environment: Win32 -- User Mode Project: FTP Server DLL Revision History: --*/ # ifndef _LSAUX_HXX_ # define _LSAUX_HXX_ /************************************************************ * Include Headers ************************************************************/ # include "tsunami.hxx" /************************************************************ * Type Definitions ************************************************************/ /********************************************************************** * Symbolic Constants **********************************************************************/ // Attribute query macros. #define IS_HIDDEN(dwAttrib) \ ((((dwAttrib) & FILE_ATTRIBUTE_HIDDEN) == 0)? FALSE: TRUE) #define IS_SYSTEM(dwAttrib) \ ((((dwAttrib) & FILE_ATTRIBUTE_SYSTEM) == 0)? FALSE: TRUE) #define IS_DIR(dwAttrib) \ ((((dwAttrib) & FILE_ATTRIBUTE_DIRECTORY) == 0)? FALSE: TRUE) #define IS_EMPTY_PATH(pszPath) ((pszPath == NULL ) || ( *pszPath == '\0')) #define NULL_TIME(x) (((x).LowPart | (x).HighPart) == 0) #define NULL_FILE_TIME(x) (((x).dwLowDateTime | (x).dwHighDateTime) == 0) #define FILE_MODE_R 0x0001 #define FILE_MODE_W 0x0002 #define FILE_MODE_X 0x0004 #define FILE_MODE_ALL 0x0007 /********************************************************************** * Type Definitions **********************************************************************/ enum LS_OUTPUT { LsOutputSingleColumn = 0, // -1 (default) LsOutputLongFormat, // -l MaxLsOutput // Must be last! }; enum LS_SORT { // ls sorting method to be used. LsSortByName = 0, // (default) LsSortByWriteTime, // -t LsSortByCreationTime, // -c LsSortByAccessTime, // -u MaxLsSort // Must be last! }; enum LS_STYLE { LsStyleMsDos = 0, // default LsStyleUnix, MaxLsStyle // Must be last! }; // enum LS_STYLE typedef struct _LS_OPTIONS // LS options set by switches. { LS_OUTPUT OutputFormat; // Output format. LS_SORT SortMethod; // Sorting method. BOOL fReverseSort; // Reverse sort order if TRUE. BOOL fDecorate; // Decorate dirs if TRUE (-F). BOOL fShowAll; // Show all files. BOOL fShowDotDot; // Show . and .. BOOL fRecursive; // Recursive listing (-R). BOOL fFourDigitYear; // Display 4 digit year. LS_STYLE lsStyle; } LS_OPTIONS; typedef struct _LS_FORMAT_INFO { // // stores information required for long formatting operations // Used for avoiding sending multiple parameters in function call // for formatting information. // Also allows to include/exclude information relevant for formatting // // Following information dont change often. They are directory specific // These are required only in non-MsDos ( UNIX) long format output. BOOL fVolumeReadable; // Is this volume readable? BOOL fVolumeWritable; // Is this volume writable? BOOL fFourDigitYear; // Display year in 4 digit WORD wCurrentYear; // current year required for UNIX format HANDLE hUserToken; // token for the user requesting info CHAR * pszPathPart; // pointer to null-terminated path part // following may change for each file in a directory const char * pszFileName; // name of the file SYSTEMTIME stFile; // time to be formatted for file const char * pszDecorate; // what is the decoration character? } LS_FORMAT_INFO; struct FTP_LS_FILTER_INFO { BOOL fFilterHidden; // should we filter off Hidden Files? BOOL fFilterSystem; // should we filter off System Files? BOOL fFilterDotDot; // should we filter off files starting with '.' ? // If case is ignored, then expression should be in upper case BOOL fIgnoreCase; // should we ignore case?? BOOL fRegExpression; // supplied expression is a regular expression LPCSTR pszExpression; // the expression to be used for filename compare }; /************************************************** * LS_BUFFER definition and functions **************************************************/ class LS_BUFFER { public: LS_BUFFER( VOID) : m_pb ( NULL), m_cbTotal ( 0), m_cbCur ( 0) {} ~LS_BUFFER(VOID) { FreeBuffer(); } DWORD AllocateBuffer( DWORD cb) { m_pb = (BYTE *) TCP_ALLOC( cb); m_cbCur = 0; m_cbTotal = (m_pb != NULL) ? cb : 0; return ( m_pb == NULL) ? ERROR_NOT_ENOUGH_MEMORY : NO_ERROR; } VOID FreeBuffer( VOID) { if ( m_pb != NULL) { TCP_FREE( m_pb); m_pb = NULL; m_cbTotal = m_cbCur = 0; } } BYTE * QueryBufferPtr(VOID) const { return ( m_pb); } DWORD QueryCB(VOID) const { return (m_cbCur); } DWORD QueryRemainingCB(VOID) const { return ( m_cbTotal - m_cbCur); } VOID IncrementCB(IN DWORD cbUsed) { m_cbCur += cbUsed; } CHAR * QueryAppendPtr(VOID) { return (CHAR *) (m_pb + m_cbCur); } VOID ResetAppendPtr(VOID) { m_cbCur = 0; } CHAR * QueryBuffer(VOID) const { return (CHAR *) QueryBufferPtr(); } private: BYTE * m_pb; DWORD m_cbTotal; DWORD m_cbCur; }; // class LS_BUFFER # define DEFAULT_LS_BUFFER_ALLOC_SIZE ( 4096) # define MIN_LS_BUFFER_SIZE ( 2 * MAX_PATH) /********************************************************************** * Prototypes of Functions **********************************************************************/ // comparison routines used for sorting of type (PFN_CMP_WIN32_FIND_DATA); int __cdecl CompareNamesInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareNamesRevInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareWriteTimesInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareWriteTimesRevInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareAccessTimesInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareAccessTimesRevInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareCreationTimesInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); int __cdecl CompareCreationTimesRevInFileInfo( IN const void * pvFileInfo1, IN const void * pvFileInfo2 ); DWORD ComputeModeBits( IN HANDLE hUserToken, IN const CHAR * pszPathPart, IN const WIN32_FIND_DATA * pfdInfo, IN LPDWORD pcLinks, IN BOOL fVolumeReadable, IN BOOL fVolumeWritable ); APIERR ComputeFileInfo( IN HANDLE hUserToken, IN CHAR * pszFile, IN DWORD * pdwAccessGranted, IN DWORD * pcLinks ); DWORD GetFsFlags( IN CHAR chDrive); APIERR GetDirectoryInfo( IN LPUSER_DATA pUserData, OUT TS_DIRECTORY_INFO * pTsDirInfo, IN CHAR * pszSearchPath, IN const FTP_LS_FILTER_INFO * pfls, IN PFN_CMP_WIN32_FIND_DATA pfnCompare ); const FILETIME * PickFileTime(IN const WIN32_FIND_DATA * pfdInfo, IN const LS_OPTIONS * pOptions); # endif // _LSAUX_HXX_ /************************ End of File ***********************/