306 lines
8.2 KiB
C++
306 lines
8.2 KiB
C++
/*++
|
||
|
||
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 ***********************/
|