|
|
/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
add2strt.h
Abstract:
Code for IP address-to-string translation routines.
Author:
Dave Thaler (dthaler) 3-28-2001
Revision History:
IPv6 conversion code originally by Rich Draves (richdr)
--*/
NTSTATUS RtlIpv6AddressToStringExT( IN const struct in6_addr *Address, IN ULONG ScopeId, IN USHORT Port, OUT LPTSTR AddressString, IN OUT PULONG AddressStringLength )
/*++
Routine Description:
This is the extension routine which handles a full address conversion including address, scopeid and port (scopeid and port are optional).
Arguments:
Address - The address part to be translated.
ScopeId - The Scope ID of the address (optional).
Port - The port number of the address (optional). Port is in network byte order.
AddressString - Pointer to output buffer where we will fill in address string.
AddressStringLength - For input, it is the length of the input buffer; for output it is the length we actual returned. Return Value:
STATUS_SUCCESS if the operation is successful, error code otherwise.
--*/ { TCHAR String[INET6_ADDRSTRLEN]; LPTSTR S; ULONG Length; if ((Address == NULL) || (AddressString == NULL) || (AddressStringLength == NULL)) {
return STATUS_INVALID_PARAMETER; } S = String; if (Port) { S += _stprintf(S, _T("[")); }
//
// Now translate this address.
//
S = RtlIpv6AddressToStringT(Address, S); if (ScopeId != 0) { S += _stprintf(S, _T("%%%u"), ScopeId); } if (Port != 0) { S += _stprintf(S, _T("]:%u"), RtlUshortByteSwap(Port)); } Length = (ULONG)(S - String + 1); if (*AddressStringLength < Length) { //
// Before return, tell the caller how big
// the buffer we need.
//
*AddressStringLength = Length; return STATUS_INVALID_PARAMETER; } *AddressStringLength = Length; RtlCopyMemory(AddressString, String, Length * sizeof(TCHAR)); return STATUS_SUCCESS;
}
NTSTATUS RtlIpv4AddressToStringExT( IN const struct in_addr *Address, IN USHORT Port, OUT LPTSTR AddressString, IN OUT PULONG AddressStringLength )
/*++
Routine Description:
This is the extension routine which handles a full address conversion including address and port (port is optional). Arguments:
Address - The address part to translate.
Port - Port number if there is any, otherwise 0. Port is in network byte order.
AddressString - Receives the formatted address string. AddressStringLength - On input, contains the length of AddressString. On output, contains the number of characters actually written to AddressString.
Return Value:
STATUS_SUCCESS if the operation is successful, error code otherwise.
--*/
{
TCHAR String[INET_ADDRSTRLEN]; LPTSTR S; ULONG Length;
//
// Quick sanity checks.
//
if ((Address == NULL) || (AddressString == NULL) || (AddressStringLength == NULL)) { return STATUS_INVALID_PARAMETER; } S = String;
//
// Now translate this address.
//
S = RtlIpv4AddressToStringT(Address, S); if (Port != 0) { S += _stprintf(S, _T(":%u"), RtlUshortByteSwap(Port)); } Length = (ULONG)(S - String + 1); if (*AddressStringLength < Length) { //
// Before return, tell the caller how big
// the buffer we need.
//
*AddressStringLength = Length; return STATUS_INVALID_PARAMETER; } RtlCopyMemory(AddressString, String, Length * sizeof(TCHAR)); *AddressStringLength = Length; return STATUS_SUCCESS; }
|