867 lines
16 KiB
C
867 lines
16 KiB
C
/*++
|
|
|
|
Copyright (c) 1991-1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
SmtpStub.C
|
|
|
|
Abstract:
|
|
|
|
These are the smtp service API RPC client stubs.
|
|
|
|
Author:
|
|
|
|
Johnson Apacible (johnsona) 17-Oct-1995
|
|
template used srvstub.c (Dan Lafferty)
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// INCLUDES
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <apiutil.h>
|
|
#include <lmcons.h> // NET_API_STATUS
|
|
#include <inetinfo.h>
|
|
#include <smtpapi.h>
|
|
#include <smtpsvc.h>
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpQueryStatistics(
|
|
IN LPWSTR servername,
|
|
IN DWORD level,
|
|
OUT LPBYTE *bufptr
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This is the DLL entrypoint for SmtpGetStatistics
|
|
|
|
Arguments:
|
|
|
|
servername --A pointer to an ASCIIZ string containing the name of
|
|
the remote server on which the function is to execute. A NULL
|
|
pointer or string specifies the local machine.
|
|
|
|
level --Level of information required. 100, 101 and 102 are valid
|
|
for all platforms. 302, 402, 403, 502 are valid for the
|
|
appropriate platform.
|
|
|
|
bufptr --On return a pointer to the return information structure
|
|
is returned in the address pointed to by bufptr.
|
|
|
|
Return Value:
|
|
|
|
--*/
|
|
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
*bufptr = NULL; // Must be NULL so RPC knows to fill it in.
|
|
|
|
RpcTryExcept
|
|
|
|
apiStatus = SmtprQueryStatistics(
|
|
servername,
|
|
level,
|
|
(LPSTAT_INFO) bufptr);
|
|
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
apiStatus = RpcExceptionCode( );
|
|
RpcEndExcept
|
|
|
|
return(apiStatus);
|
|
|
|
} // SmtpQueryStatistics
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpClearStatistics(
|
|
IN LPWSTR Server OPTIONAL, IN DWORD dwInstance)
|
|
{
|
|
NET_API_STATUS status;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
status = SmtpClearStatistics(
|
|
Server, dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
status = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return (status);
|
|
|
|
} // SmtpClearStatistics
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpGetAdminInformation(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
OUT LPSMTP_CONFIG_INFO * ppConfig,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This is the DLL entrypoint for SmtpGetAdminInformation
|
|
|
|
Arguments:
|
|
|
|
servername --A pointer to an ASCIIZ string containing the name of
|
|
the remote server on which the function is to execute. A NULL
|
|
pointer or string specifies the local machine.
|
|
|
|
ppConfig --Configuration information returned from the server.
|
|
|
|
Return Value:
|
|
|
|
--*/
|
|
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
*ppConfig = NULL; // Must be NULL so RPC knows to fill it in.
|
|
|
|
RpcTryExcept
|
|
|
|
apiStatus = SmtprGetAdminInformation(
|
|
pszServer,
|
|
(LPSMTP_CONFIG_INFO *) ppConfig,
|
|
dwInstance);
|
|
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
apiStatus = RpcExceptionCode( );
|
|
RpcEndExcept
|
|
|
|
return(apiStatus);
|
|
|
|
} // SmtpGetAdminInformation
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpSetAdminInformation(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN LPSMTP_CONFIG_INFO pConfig,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This is the DLL entrypoint for SmtpSetAdminInformation
|
|
|
|
Arguments:
|
|
|
|
servername --A pointer to an ASCIIZ string containing the name of
|
|
the remote server on which the function is to execute. A NULL
|
|
pointer or string specifies the local machine.
|
|
|
|
pConfig --Configuration information to be set on the server.
|
|
|
|
Return Value:
|
|
|
|
--*/
|
|
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
|
|
apiStatus = SmtprSetAdminInformation(
|
|
pszServer,
|
|
(LPSMTP_CONFIG_INFO) pConfig,
|
|
dwInstance);
|
|
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
apiStatus = RpcExceptionCode( );
|
|
RpcEndExcept
|
|
|
|
return(apiStatus);
|
|
|
|
} // SmtpSetAdminInformation
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpGetConnectedUserList
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpGetConnectedUserList(
|
|
IN LPWSTR wszServerName,
|
|
OUT LPSMTP_CONN_USER_LIST *ppConnUserList,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
*ppConnUserList = NULL;
|
|
|
|
RpcTryExcept
|
|
{
|
|
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprGetConnectedUserList(
|
|
wszServerName,
|
|
ppConnUserList,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpDisconnectUser
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpDisconnectUser(
|
|
IN LPWSTR wszServerName,
|
|
IN DWORD dwUserId,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprDisconnectUser(
|
|
wszServerName,
|
|
dwUserId,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpCreateUser
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpCreateUser(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN LPWSTR wszForwardEmail,
|
|
IN DWORD dwLocal,
|
|
IN DWORD dwMailboxSize,
|
|
IN DWORD dwMailboxMessageSize,
|
|
IN LPWSTR wszVRoot,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprCreateUser(
|
|
wszServerName,
|
|
wszEmail,
|
|
wszForwardEmail,
|
|
dwLocal,
|
|
dwMailboxSize,
|
|
dwMailboxMessageSize,
|
|
wszVRoot,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpDeleteUser
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpDeleteUser(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprDeleteUser(
|
|
wszServerName,
|
|
wszEmail,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpGetUserProps
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpGetUserProps(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
OUT LPSMTP_USER_PROPS *ppUserProps,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
*ppUserProps = NULL;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprGetUserProps(
|
|
wszServerName,
|
|
wszEmail,
|
|
ppUserProps,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpSetUserProps
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpSetUserProps(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN LPSMTP_USER_PROPS pUserProps,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprSetUserProps(
|
|
wszServerName,
|
|
wszEmail,
|
|
pUserProps,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpCreateDistList
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpCreateDistList(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN DWORD dwType,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprCreateDistList(
|
|
wszServerName,
|
|
wszEmail,
|
|
dwType,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpDeleteDistList
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpDeleteDistList(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN DWORD dwInstance
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprDeleteDistList(
|
|
wszServerName,
|
|
wszEmail,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpCreateDistListMember
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpCreateDistListMember(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN LPWSTR wszEmailMember,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprCreateDistListMember(
|
|
wszServerName,
|
|
wszEmail,
|
|
wszEmailMember,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpDeleteDistListMember
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpDeleteDistListMember(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN LPWSTR wszEmailMember,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprDeleteDistListMember(
|
|
wszServerName,
|
|
wszEmail,
|
|
wszEmailMember,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpGetNameList
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpGetNameList(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmail,
|
|
IN DWORD dwType,
|
|
IN DWORD dwRowsRequested,
|
|
IN BOOL fForward,
|
|
OUT LPSMTP_NAME_LIST *ppNameList,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
// Make sure RPC knows we want them to fill it in
|
|
*ppNameList = NULL;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprGetNameList(
|
|
wszServerName,
|
|
wszEmail,
|
|
dwType,
|
|
dwRowsRequested,
|
|
fForward,
|
|
ppNameList,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpGetNameListFromList
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpGetNameListFromList(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszEmailList,
|
|
IN LPWSTR wszEmail,
|
|
IN DWORD dwType,
|
|
IN DWORD dwRowsRequested,
|
|
IN BOOL fForward,
|
|
OUT LPSMTP_NAME_LIST *ppNameList,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprGetNameListFromList(
|
|
wszServerName,
|
|
wszEmailList,
|
|
wszEmail,
|
|
dwType,
|
|
dwRowsRequested,
|
|
fForward,
|
|
ppNameList,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpGetVRootSize
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpGetVRootSize(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszVRoot,
|
|
IN LPDWORD pdwBytes,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprGetVRootSize(
|
|
wszServerName,
|
|
wszVRoot,
|
|
pdwBytes,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SmtpBackupRoutingTable
|
|
|
|
Return Value:
|
|
|
|
API Status - NO_ERROR on success, WIN32 error code on failure.
|
|
|
|
--*/
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
SmtpBackupRoutingTable(
|
|
IN LPWSTR wszServerName,
|
|
IN LPWSTR wszPath,
|
|
IN DWORD dwInstance
|
|
|
|
)
|
|
{
|
|
NET_API_STATUS apiStatus;
|
|
|
|
RpcTryExcept
|
|
{
|
|
//
|
|
// Try RPC (local or remote) version of API.
|
|
//
|
|
apiStatus = SmtprBackupRoutingTable(
|
|
wszServerName,
|
|
wszPath,
|
|
dwInstance
|
|
);
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
apiStatus = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
return apiStatus;
|
|
}
|
|
|