2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Runtime Library
4 * PURPOSE: Network Address Translation implementation
5 * PROGRAMMER: Alex Ionescu (alexi@tinykrnl.org)
8 /* INCLUDES *****************************************************************/
15 /* maximum length of an ipv4 address expressed as a string */
16 #define IPV4_ADDR_STRING_MAX_LEN 16
18 /* maximum length of an ipv4 port expressed as a string */
19 #define IPV4_PORT_STRING_MAX_LEN 7 /* with the leading ':' */
21 /* network to host order conversion for little endian machines */
22 #define WN2H(w) (((w & 0xFF00) >> 8) | ((w & 0x00FF) << 8))
24 /* FUNCTIONS ***************************************************************/
31 RtlIpv4AddressToStringA(IN
struct in_addr
*Addr
,
36 if (!S
) return (LPSTR
)~0;
38 Length
= sprintf(S
, "%u.%u.%u.%u", Addr
->S_un
.S_un_b
.s_b1
,
39 Addr
->S_un
.S_un_b
.s_b2
,
40 Addr
->S_un
.S_un_b
.s_b3
,
41 Addr
->S_un
.S_un_b
.s_b4
);
51 RtlIpv4AddressToStringExA(IN
struct in_addr
*Address
,
53 OUT PCHAR AddressString
,
54 IN OUT PULONG AddressStringLength
)
56 CHAR Buffer
[IPV4_ADDR_STRING_MAX_LEN
+IPV4_PORT_STRING_MAX_LEN
];
59 if (!Address
|| !AddressString
|| !AddressStringLength
)
60 return STATUS_INVALID_PARAMETER
;
62 Length
= sprintf(Buffer
, "%u.%u.%u.%u", Address
->S_un
.S_un_b
.s_b1
,
63 Address
->S_un
.S_un_b
.s_b2
,
64 Address
->S_un
.S_un_b
.s_b3
,
65 Address
->S_un
.S_un_b
.s_b4
);
67 if (Port
) Length
+= sprintf(Buffer
+ Length
, ":%u", WN2H(Port
));
69 if (*AddressStringLength
> Length
)
71 *AddressStringLength
= Length
+ 1;
72 strcpy(AddressString
, Buffer
);
73 return STATUS_SUCCESS
;
76 *AddressStringLength
= Length
+ 1;
77 return STATUS_INVALID_PARAMETER
;
85 RtlIpv4AddressToStringW(IN
struct in_addr
*Addr
,
90 if (!S
) return (LPWSTR
)~0;
92 Length
= swprintf(S
, L
"%u.%u.%u.%u", Addr
->S_un
.S_un_b
.s_b1
,
93 Addr
->S_un
.S_un_b
.s_b2
,
94 Addr
->S_un
.S_un_b
.s_b3
,
95 Addr
->S_un
.S_un_b
.s_b4
);
104 RtlIpv4AddressToStringExW(IN
struct in_addr
*Address
,
106 OUT PWCHAR AddressString
,
107 IN OUT PULONG AddressStringLength
)
109 WCHAR Buffer
[IPV4_ADDR_STRING_MAX_LEN
+IPV4_PORT_STRING_MAX_LEN
];
112 if (!Address
|| !AddressString
|| !AddressStringLength
)
113 return STATUS_INVALID_PARAMETER
;
115 Length
= swprintf(Buffer
, L
"%u.%u.%u.%u", Address
->S_un
.S_un_b
.s_b1
,
116 Address
->S_un
.S_un_b
.s_b2
,
117 Address
->S_un
.S_un_b
.s_b3
,
118 Address
->S_un
.S_un_b
.s_b4
);
120 if (Port
) Length
+= swprintf(Buffer
+ Length
, L
":%u", WN2H(Port
));
122 if (*AddressStringLength
> Length
)
124 *AddressStringLength
= Length
+ 1;
125 wcscpy(AddressString
, Buffer
);
126 return STATUS_SUCCESS
;
129 *AddressStringLength
= Length
+ 1;
130 return STATUS_INVALID_PARAMETER
;
138 RtlIpv4StringToAddressA(IN PCSTR String
,
140 OUT PCSTR
*Terminator
,
141 OUT
struct in_addr
*Addr
)
144 return STATUS_NOT_IMPLEMENTED
;
152 RtlIpv4StringToAddressExA(IN PCSTR AddressString
,
154 OUT
struct in_addr
*Address
,
158 return STATUS_NOT_IMPLEMENTED
;
166 RtlIpv4StringToAddressW(IN PCWSTR String
,
168 OUT PCWSTR
*Terminator
,
169 OUT
struct in_addr
*Addr
)
172 return STATUS_NOT_IMPLEMENTED
;
180 RtlIpv4StringToAddressExW(IN PCWSTR AddressString
,
182 OUT
struct in_addr
*Address
,
186 return STATUS_NOT_IMPLEMENTED
;
194 RtlIpv6AddressToStringA(IN
struct in6_addr
*Addr
,
198 return STATUS_NOT_IMPLEMENTED
;
206 RtlIpv6AddressToStringExA(IN
struct in6_addr
*Address
,
209 OUT PCHAR AddressString
,
210 IN OUT PULONG AddressStringLength
)
213 return STATUS_NOT_IMPLEMENTED
;
221 RtlIpv6AddressToStringW(IN
struct in6_addr
*Addr
,
225 return STATUS_NOT_IMPLEMENTED
;
233 RtlIpv6AddressToStringExW(IN
struct in6_addr
*Address
,
236 IN OUT PWCHAR AddressString
,
237 IN OUT PULONG AddressStringLength
)
240 return STATUS_NOT_IMPLEMENTED
;
248 RtlIpv6StringToAddressA(IN PCHAR Name
,
249 OUT PCHAR
*Terminator
,
250 OUT
struct in6_addr
*Addr
)
253 return STATUS_NOT_IMPLEMENTED
;
261 RtlIpv6StringToAddressExA(IN PCHAR AddressString
,
262 OUT
struct in6_addr
*Address
,
267 return STATUS_NOT_IMPLEMENTED
;
275 RtlIpv6StringToAddressW(IN PWCHAR Name
,
276 OUT PCHAR
*Terminator
,
277 OUT
struct in6_addr
*Addr
)
280 return STATUS_NOT_IMPLEMENTED
;
288 RtlIpv6StringToAddressExW(IN PWCHAR AddressName
,
289 OUT
struct in6_addr
*Address
,
294 return STATUS_NOT_IMPLEMENTED
;