/**********************************************************************/
/**                       Microsoft Windows NT                       **/
/**                Copyright(c) Microsoft Corp., 1993                **/
/**********************************************************************/

/*
    proc.hxx

    This file contains the global procedure definitions for the
    FTPD Service.


    FILE HISTORY:
        KeithMo     07-Mar-1993 Created.
        MuraliK     April-1995 Modified/deleted functions for New FTP service

*/


#ifndef _PROC_HXX_
#define _PROC_HXX_


//
//  Global variable initialization & termination function.
//

APIERR
InitializeGlobals(
    VOID
    );

VOID
TerminateGlobals(
    VOID
    );

VOID
ClearStatistics(
    VOID
    );

#define LockGlobals()          EnterCriticalSection( &g_GlobalLock );
#define UnlockGlobals()        LeaveCriticalSection( &g_GlobalLock );

//
//  Socket utilities.
//

APIERR
InitializeSockets(
    VOID
    );

VOID
TerminateSockets(
    VOID
    );

SOCKERR
CreateDataSocket(
    SOCKET * psock,
    ULONG    addrLocal,
    PORT     portLocal,
    ULONG    addrRemote,
    PORT     portRemote
    );

SOCKERR
CreateFtpdSocket(
    SOCKET * psock,
    ULONG    addrLocal,
    PORT     portLocal,
    FTP_SERVER_INSTANCE *pInstance
    );

SOCKERR
CloseSocket(
    SOCKET sock
    );

SOCKERR
ResetSocket(
    SOCKET sock
    );

SOCKERR
AcceptSocket(
    SOCKET          sockListen,
    SOCKET   *      psockNew,
    LPSOCKADDR_IN   paddr,
    BOOL            fEnforceTimeout,
    FTP_SERVER_INSTANCE *pInstance
    );


DWORD
ClientThread(
    LPVOID Param
    );

SOCKERR
SockSend(
    LPUSER_DATA pUserData,
    SOCKET      sock,
    LPVOID      pBuffer,
    DWORD       cbBuffer
    );

SOCKERR
SockRecv(
    LPUSER_DATA pUserData,
    SOCKET      sock,
    LPVOID      pBuffer,
    DWORD       cbBuffer,
    LPDWORD     pbReceived
    );

SOCKERR
__cdecl
SockPrintf2(
    LPUSER_DATA pUserData,
    SOCKET      sock,
    LPCSTR      pszFormat,
    ...
    );


SOCKERR
__cdecl
ReplyToUser(
    IN LPUSER_DATA  pUserData,
    IN UINT         ReplyCode,
    IN LPCSTR       pszFormat,
    ...
    );


SOCKERR
__cdecl
SockReplyFirst2(
    LPUSER_DATA pUserData,
    SOCKET      sock,
    UINT        ReplyCode,
    LPCSTR      pszFormat,
    ...
    );


//
//  User database functions.
//

VOID
UserDereference(
    LPUSER_DATA pUserData
    );

BOOL
DisconnectUser(
    DWORD UserId,
    FTP_SERVER_INSTANCE *pInstance
    );

VOID
DisconnectUsersWithNoAccess(
    VOID
    );

BOOL
EnumerateUsers(
    PCHAR   pBuffer,
    PDWORD  pcbBuffer,
    PDWORD  nRead,
    FTP_SERVER_INSTANCE *pInstance
    );


//
//  IPC functions.
//

APIERR
InitializeIPC(
    VOID
    );

VOID
TerminateIPC(
    VOID
    );


//
//  Service control functions.
//

VOID
ServiceEntry(
    DWORD                cArgs,
    LPWSTR               pArgs[]
    );


//
//  Virtual file i/o functions.
//

APIERR
VirtualCreateFile(
    LPUSER_DATA pUserData,
    LPHANDLE    phFile,
    LPSTR       pszFile,
    BOOL        fAppend
    );

APIERR
VirtualCreateUniqueFile(
    LPUSER_DATA pUserData,
    LPHANDLE    phFile,
    LPSTR       pszTmpFile
    );

FILE *
Virtual_fopen(
    LPUSER_DATA pUserData,
    LPSTR       pszFile,
    LPSTR       pszMode
    );


APIERR
VirtualDeleteFile(
    LPUSER_DATA pUserData,
    LPSTR       pszFile
    );

APIERR
VirtualRenameFile(
    LPUSER_DATA pUserData,
    LPSTR       pszExisting,
    LPSTR       pszNew
    );

APIERR
VirtualChDir(
    LPUSER_DATA pUserData,
    LPSTR       pszDir
    );

APIERR
VirtualRmDir(
    LPUSER_DATA pUserData,
    LPSTR       pszDir
    );

APIERR
VirtualMkDir(
    LPUSER_DATA pUserData,
    LPSTR       pszDir
    );


//
//  Command parser functions.
//

VOID
ParseCommand(
    LPUSER_DATA pUserData,
    LPSTR       pszCommandText
    );


//
//  General utility functions.
//

LPSTR
TransferType(
    XFER_TYPE type
    );

LPSTR
TransferMode(
    XFER_MODE mode
    );

LPSTR
DisplayBool(
    BOOL fFlag
    );

BOOL
IsDecimalNumber(
    LPSTR psz
    );

LPSTR
AllocErrorText(
    APIERR err
    );

VOID
FreeErrorText(
    LPSTR pszText
    );

DWORD
OpenPathForAccess(
    LPHANDLE    phFile,
    LPSTR       pszPath,
    ULONG       DesiredAccess,
    ULONG       ShareAccess,
    HANDLE      hImpersonation
    );

LPSTR
FlipSlashes(
    LPSTR pszPath
    );

PSTR
P_strncpy(
    PSTR dst,
    PCSTR src,
    DWORD cnt);

//
//  LS simulator functions.
//

APIERR
SimulateLs(
    IN LPUSER_DATA pUserData,
    IN LPSTR       pszArg,
    IN BOOL        fUseDataSocket, // TRUE ==>DataSocket, FALSE==>ControlSocket
    IN BOOL        fDefaultLong = FALSE  // TRUE ==> generate long listing
    );


APIERR
SpecialLs(
    IN LPUSER_DATA pUserData,
    IN LPSTR       pszSearchPath,
    IN BOOL        fUseDataSocket  // TRUE ==>DataSocket, FALSE==>ControlSocket
    );


//
//  Some handy macros.
//

#define IS_PATH_SEP(x) (((x) == '\\') || ((x) == '/'))

VOID
VirtualpSanitizePath(
    CHAR * pszPath
    );

DWORD
FtpFormatResponseMessage( IN UINT     uiReplyCode,
                          IN LPCTSTR  pszReplyMsg,
                          OUT LPTSTR  pszReplyBuffer,
                          IN DWORD    cchReplyBuffer);


#endif  // _PROC_HXX_