|
|
/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corp., 1993 **/ /**********************************************************************/
/*
sockutil.c
This module contains utility routines for managing & manipulating sockets.
FILE HISTORY: VladimV 30-May-1995 Created
*/
#define INCL_INETSRV_INCS
#include "smtpinc.h"
extern HINSTANCE g_WSockMsgDll;
//
// Public functions.
//
/*******************************************************************
NAME: InitializeSockets
SYNOPSIS: Initializes socket access. Among other things, this routine is responsible for connecting to WinSock, and creating the connection thread.
RETURNS: APIERR - NO_ERROR if successful, otherwise a Win32 error code.
NOTES: This routine may only be called by a single thread of execution; it is not necessarily multi-thread safe.
HISTORY:
********************************************************************/ APIERR InitializeSockets( VOID ) { WSADATA wsadata; SOCKERR serr;
TraceFunctEnter( "InitializeSockets" );
//
// Connect to WinSock.
//
serr = WSAStartup( MAKEWORD( 1, 1 ), &wsadata );
if( serr != 0 ) {
// g_pInetSvc->LogEvent( SMTP_EVENT_CANNOT_INITIALIZE_WINSOCK,
// 0, (const CHAR **) NULL, serr);
FatalTrace( 0, "cannot initialize WinSock, socket error %d", serr); _ASSERT( FALSE); } else { DebugTrace( 0, "Sockets initialized"); } TraceFunctLeave(); return serr; } // InitializeSockets
/*******************************************************************
NAME: TerminateSockets
SYNOPSIS: Terminate socket access. This routine is responsible for closing the connection socket(s) and detaching from WinSock.
NOTES: This routine may only be called by a single thread of execution; it is not necessarily multi-thread safe.
HISTORY:
********************************************************************/ VOID TerminateSockets( VOID ) { SOCKERR serr;
TraceFunctEnter( "TerminateSockets" );
//
// Disconnect from WinSock.
//
serr = WSACleanup();
if( serr != 0 ) { FatalTrace( 0, "cannot terminate WinSock, error=%d", serr); _ASSERT( FALSE); } else { DebugTrace( 0, "Sockets terminated"); } TraceFunctLeave(); } // TerminateSockets
/*******************************************************************
NAME: GetSockErrorMessage
SYNOPSIS: This routine is responsible for getting winsock error messages stored in smtpsvc.dll
HISTORY:
********************************************************************/ DWORD GetSockErrorMessage(DWORD dwErrno, char * ErrorBuf, DWORD ErrorBufSize) { DWORD msglen; DWORD usMsgNum;
switch (dwErrno) { case WSAENAMETOOLONG: usMsgNum = SMTP_WSAENAMETOOLONG; break; case WSASYSNOTREADY: usMsgNum = SMTP_WSASYSNOTREADY; break; case WSAVERNOTSUPPORTED: usMsgNum = SMTP_WSAVERNOTSUPPORTED; break; case WSAESHUTDOWN: usMsgNum = SMTP_WSAESHUTDOWN; break; case WSAEINTR: usMsgNum = SMTP_WSAEINTR; break; case WSAHOST_NOT_FOUND: usMsgNum = SMTP_WSAHOST_NOT_FOUND; break; case WSATRY_AGAIN: usMsgNum = SMTP_WSATRY_AGAIN; break; case WSANO_RECOVERY: usMsgNum = SMTP_WSANO_RECOVERY; break; case WSANO_DATA: usMsgNum = SMTP_WSANO_DATA; break; case WSAEBADF: usMsgNum = SMTP_WSAEBADF; break; case WSAEWOULDBLOCK: usMsgNum = SMTP_WSAEWOULDBLOCK; break; case WSAEINPROGRESS: usMsgNum = SMTP_WSAEINPROGRESS; break; case WSAEALREADY: usMsgNum = SMTP_WSAEALREADY; break; case WSAEFAULT: usMsgNum = SMTP_WSAEFAULT; break; case WSAEDESTADDRREQ: usMsgNum = SMTP_WSAEDESTADDRREQ; break; case WSAEMSGSIZE: usMsgNum = SMTP_WSAEMSGSIZE; break; case WSAEPFNOSUPPORT: usMsgNum = SMTP_WSAEPFNOSUPPORT; break; case WSAENOTEMPTY: usMsgNum = SMTP_WSAENOTEMPTY; break; case WSAEPROCLIM: usMsgNum = SMTP_WSAEPROCLIM; break; case WSAEUSERS: usMsgNum = SMTP_WSAEUSERS; break; case WSAEDQUOT: usMsgNum = SMTP_WSAEDQUOT; break; case WSAESTALE: usMsgNum = SMTP_WSAESTALE; break; case WSAEINVAL: usMsgNum = SMTP_WSAEINVAL; break; case WSAEMFILE: usMsgNum = SMTP_WSAEMFILE; break; case WSAELOOP: usMsgNum = SMTP_WSAELOOP; break; case WSAEREMOTE: usMsgNum = SMTP_WSAEREMOTE; break; case WSAENOTSOCK: usMsgNum = SMTP_WSAENOTSOCK; break; case WSAEADDRNOTAVAIL: usMsgNum = SMTP_WSAEADDRNOTAVAIL; break; case WSAEADDRINUSE: usMsgNum = SMTP_WSAEADDRINUSE; break; case WSAEAFNOSUPPORT: usMsgNum = SMTP_WSAEAFNOSUPPORT; break; case WSAESOCKTNOSUPPORT: usMsgNum = SMTP_WSAESOCKTNOSUPPORT; break; case WSAEPROTONOSUPPORT: usMsgNum = SMTP_WSAEPROTONOSUPPORT; break; case WSAENOBUFS: usMsgNum = SMTP_WSAENOBUFS; break; case WSAETIMEDOUT: usMsgNum = SMTP_WSAETIMEDOUT; break; case WSAEISCONN: usMsgNum = SMTP_WSAEISCONN; break; case WSAENOTCONN: usMsgNum = SMTP_WSAENOTCONN; break; case WSAENOPROTOOPT: usMsgNum = SMTP_WSAENOPROTOOPT; break; case WSAECONNRESET: usMsgNum = SMTP_WSAECONNRESET; break; case WSAECONNABORTED: usMsgNum = SMTP_WSAECONNABORTED; break; case WSAENETDOWN: usMsgNum = SMTP_WSAENETDOWN; break; case WSAENETRESET: usMsgNum = SMTP_WSAENETRESET; break; case WSAECONNREFUSED: usMsgNum = SMTP_WSAECONNREFUSED; break; case WSAEHOSTDOWN: usMsgNum = SMTP_WSAEHOSTDOWN; break; case WSAEHOSTUNREACH: usMsgNum = SMTP_WSAEHOSTUNREACH; break; case WSAEPROTOTYPE: usMsgNum = SMTP_WSAEPROTOTYPE; break; case WSAEOPNOTSUPP: usMsgNum = SMTP_WSAEOPNOTSUPP; break; case WSAENETUNREACH: usMsgNum = SMTP_WSAENETUNREACH; break; case WSAETOOMANYREFS: usMsgNum = SMTP_WSAETOOMANYREFS; break; default: usMsgNum = dwErrno; break; }
// call the OS using US/ASCII
msglen = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, g_WSockMsgDll, usMsgNum, MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ), ErrorBuf, ErrorBufSize, NULL); return(msglen); }
/*++
Name : MyStrChr
Description: Works just like strchr(), but takes the size of the buffer
Arguments: Line - Buffer to search Val - Value to look for in the buffer LineSize - Size of Line
Returns: If Val is found, a pointer to Val is returned, els NULL
--*/ char * MyStrChr(char *Line, unsigned char Val, DWORD LineSize) { register DWORD Loop = 0; unsigned char * Match = NULL; register unsigned char * SearchPtr;
ASSERT( Line != NULL);
if(LineSize == 0) return NULL;
SearchPtr = (unsigned char *) Line;
// Scan the entire buffer looking for Val
for(Loop = 0; Loop < LineSize; Loop++) { if (SearchPtr[Loop] == Val) { Match = &SearchPtr[Loop]; break; }
} // for
return (char *) Match; }
|