xref: /onnv-gate/usr/src/cmd/lms/tools/ATNetworkTool.h (revision 9203:3ebffd0a1b10)
1*9203SMark.Logan@Sun.COM /*******************************************************************************
2*9203SMark.Logan@Sun.COM  * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
3*9203SMark.Logan@Sun.COM  *
4*9203SMark.Logan@Sun.COM  * Redistribution and use in source and binary forms, with or without
5*9203SMark.Logan@Sun.COM  * modification, are permitted provided that the following conditions are met:
6*9203SMark.Logan@Sun.COM  *
7*9203SMark.Logan@Sun.COM  *  - Redistributions of source code must retain the above copyright notice,
8*9203SMark.Logan@Sun.COM  *    this list of conditions and the following disclaimer.
9*9203SMark.Logan@Sun.COM  *
10*9203SMark.Logan@Sun.COM  *  - Redistributions in binary form must reproduce the above copyright notice,
11*9203SMark.Logan@Sun.COM  *    this list of conditions and the following disclaimer in the documentation
12*9203SMark.Logan@Sun.COM  *    and/or other materials provided with the distribution.
13*9203SMark.Logan@Sun.COM  *
14*9203SMark.Logan@Sun.COM  *  - Neither the name of Intel Corp. nor the names of its
15*9203SMark.Logan@Sun.COM  *    contributors may be used to endorse or promote products derived from this
16*9203SMark.Logan@Sun.COM  *    software without specific prior written permission.
17*9203SMark.Logan@Sun.COM  *
18*9203SMark.Logan@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
19*9203SMark.Logan@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*9203SMark.Logan@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*9203SMark.Logan@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
22*9203SMark.Logan@Sun.COM  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*9203SMark.Logan@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*9203SMark.Logan@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*9203SMark.Logan@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*9203SMark.Logan@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*9203SMark.Logan@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*9203SMark.Logan@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
29*9203SMark.Logan@Sun.COM  *******************************************************************************/
30*9203SMark.Logan@Sun.COM 
31*9203SMark.Logan@Sun.COM #ifndef _AT_NETWORK_TOOL_H_
32*9203SMark.Logan@Sun.COM #define _AT_NETWORK_TOOL_H_
33*9203SMark.Logan@Sun.COM 
34*9203SMark.Logan@Sun.COM #include <string>
35*9203SMark.Logan@Sun.COM #include <set>
36*9203SMark.Logan@Sun.COM #include <vector>
37*9203SMark.Logan@Sun.COM #include <map>
38*9203SMark.Logan@Sun.COM #include <cstring>
39*9203SMark.Logan@Sun.COM #include <sys/types.h>
40*9203SMark.Logan@Sun.COM #include <sys/socket.h>
41*9203SMark.Logan@Sun.COM #include <arpa/inet.h>
42*9203SMark.Logan@Sun.COM #include <netinet/in.h>
43*9203SMark.Logan@Sun.COM 
44*9203SMark.Logan@Sun.COM class ATAddress
45*9203SMark.Logan@Sun.COM {
46*9203SMark.Logan@Sun.COM private:
47*9203SMark.Logan@Sun.COM 	struct sockaddr_storage ip;
48*9203SMark.Logan@Sun.COM 
49*9203SMark.Logan@Sun.COM public:
50*9203SMark.Logan@Sun.COM 
ATAddress()51*9203SMark.Logan@Sun.COM 	ATAddress()
52*9203SMark.Logan@Sun.COM 	{
53*9203SMark.Logan@Sun.COM 		memset(&(this->ip), 0, sizeof(struct sockaddr_storage));
54*9203SMark.Logan@Sun.COM 	};
55*9203SMark.Logan@Sun.COM 
ATAddress(const ATAddress & y)56*9203SMark.Logan@Sun.COM 	ATAddress(const ATAddress &y)
57*9203SMark.Logan@Sun.COM 	{
58*9203SMark.Logan@Sun.COM 		memcpy(&(this->ip), y.addr(), sizeof(struct sockaddr_storage));
59*9203SMark.Logan@Sun.COM 	};
60*9203SMark.Logan@Sun.COM 
ATAddress(const struct sockaddr * yip)61*9203SMark.Logan@Sun.COM 	ATAddress(const struct sockaddr *yip)
62*9203SMark.Logan@Sun.COM 	{
63*9203SMark.Logan@Sun.COM 		memset(&(this->ip), 0, sizeof(struct sockaddr_storage));
64*9203SMark.Logan@Sun.COM 		memcpy(&(this->ip), yip, saSize(yip));
65*9203SMark.Logan@Sun.COM 	};
66*9203SMark.Logan@Sun.COM 
ATAddress(const ATAddress & y,in_port_t yport)67*9203SMark.Logan@Sun.COM 	ATAddress(const ATAddress &y, in_port_t yport)
68*9203SMark.Logan@Sun.COM 	{
69*9203SMark.Logan@Sun.COM 		memcpy(&(this->ip), y.addr(), sizeof(struct sockaddr_storage));
70*9203SMark.Logan@Sun.COM 		ATAddress::saSetPort((const struct sockaddr *)&(this->ip), yport);
71*9203SMark.Logan@Sun.COM 	};
72*9203SMark.Logan@Sun.COM 
ATAddress(const struct sockaddr * yip,in_port_t yport)73*9203SMark.Logan@Sun.COM 	ATAddress(const struct sockaddr *yip, in_port_t yport)
74*9203SMark.Logan@Sun.COM 	{
75*9203SMark.Logan@Sun.COM 		memset(&(this->ip), 0, sizeof(struct sockaddr_storage));
76*9203SMark.Logan@Sun.COM 		memcpy(&(this->ip), yip, saSize(yip));
77*9203SMark.Logan@Sun.COM 		ATAddress::saSetPort((const struct sockaddr *)&(this->ip), yport);
78*9203SMark.Logan@Sun.COM 	};
79*9203SMark.Logan@Sun.COM 
saSetPort(const struct sockaddr * ip,in_port_t yport)80*9203SMark.Logan@Sun.COM 	static void saSetPort(const struct sockaddr *ip, in_port_t yport)
81*9203SMark.Logan@Sun.COM 	{
82*9203SMark.Logan@Sun.COM 		switch (ip->sa_family) {
83*9203SMark.Logan@Sun.COM 		case AF_INET6:
84*9203SMark.Logan@Sun.COM 			((struct sockaddr_in6 *)ip)->sin6_port = htons(yport);
85*9203SMark.Logan@Sun.COM 			break;
86*9203SMark.Logan@Sun.COM 
87*9203SMark.Logan@Sun.COM 		case AF_INET:
88*9203SMark.Logan@Sun.COM 			((struct sockaddr_in *)ip)->sin_port = htons(yport);
89*9203SMark.Logan@Sun.COM 			break;
90*9203SMark.Logan@Sun.COM 		}
91*9203SMark.Logan@Sun.COM 	}
92*9203SMark.Logan@Sun.COM 
saIsInet(const struct sockaddr * ip)93*9203SMark.Logan@Sun.COM 	static bool saIsInet(const struct sockaddr *ip)
94*9203SMark.Logan@Sun.COM 	{
95*9203SMark.Logan@Sun.COM 		return ((ip->sa_family == AF_INET) || (ip->sa_family == AF_INET6));
96*9203SMark.Logan@Sun.COM 	};
97*9203SMark.Logan@Sun.COM 
saSize(const struct sockaddr * ip)98*9203SMark.Logan@Sun.COM 	static unsigned int saSize(const struct sockaddr *ip)
99*9203SMark.Logan@Sun.COM 	{
100*9203SMark.Logan@Sun.COM 		switch (ip->sa_family) {
101*9203SMark.Logan@Sun.COM 		case AF_INET6:
102*9203SMark.Logan@Sun.COM 			return sizeof(struct sockaddr_in6);
103*9203SMark.Logan@Sun.COM 			break;
104*9203SMark.Logan@Sun.COM 
105*9203SMark.Logan@Sun.COM 		case AF_INET:
106*9203SMark.Logan@Sun.COM 			return sizeof(struct sockaddr_in);
107*9203SMark.Logan@Sun.COM 			break;
108*9203SMark.Logan@Sun.COM 
109*9203SMark.Logan@Sun.COM 		default:
110*9203SMark.Logan@Sun.COM 			return 0;
111*9203SMark.Logan@Sun.COM 		}
112*9203SMark.Logan@Sun.COM 	};
113*9203SMark.Logan@Sun.COM 
saInPort(const struct sockaddr * ip)114*9203SMark.Logan@Sun.COM 	static in_port_t saInPort(const struct sockaddr *ip)
115*9203SMark.Logan@Sun.COM 	{
116*9203SMark.Logan@Sun.COM 		switch (ip->sa_family) {
117*9203SMark.Logan@Sun.COM 		case AF_INET6:
118*9203SMark.Logan@Sun.COM 			return ntohs(((struct sockaddr_in6 *)ip)->sin6_port);
119*9203SMark.Logan@Sun.COM 			break;
120*9203SMark.Logan@Sun.COM 
121*9203SMark.Logan@Sun.COM 		case AF_INET:
122*9203SMark.Logan@Sun.COM 			return ntohs(((struct sockaddr_in *)ip)->sin_port);
123*9203SMark.Logan@Sun.COM 			break;
124*9203SMark.Logan@Sun.COM 
125*9203SMark.Logan@Sun.COM 		default:
126*9203SMark.Logan@Sun.COM 			return 0;
127*9203SMark.Logan@Sun.COM 		}
128*9203SMark.Logan@Sun.COM 	};
129*9203SMark.Logan@Sun.COM 
saInAddr(const struct sockaddr * ip,size_t & asize)130*9203SMark.Logan@Sun.COM 	static const void *saInAddr(const struct sockaddr *ip, size_t &asize)
131*9203SMark.Logan@Sun.COM 	{
132*9203SMark.Logan@Sun.COM 		switch (ip->sa_family) {
133*9203SMark.Logan@Sun.COM 		case AF_INET6:
134*9203SMark.Logan@Sun.COM 			asize = sizeof(in6_addr);
135*9203SMark.Logan@Sun.COM 			return (const void *)&(((struct sockaddr_in6 *)ip)->sin6_addr);
136*9203SMark.Logan@Sun.COM 			break;
137*9203SMark.Logan@Sun.COM 
138*9203SMark.Logan@Sun.COM 		case AF_INET:
139*9203SMark.Logan@Sun.COM 			asize = sizeof(in_addr);
140*9203SMark.Logan@Sun.COM 			return (const void *)&(((struct sockaddr_in *)ip)->sin_addr);
141*9203SMark.Logan@Sun.COM 			break;
142*9203SMark.Logan@Sun.COM 
143*9203SMark.Logan@Sun.COM 		default:
144*9203SMark.Logan@Sun.COM 			asize = 0;
145*9203SMark.Logan@Sun.COM 			return NULL;
146*9203SMark.Logan@Sun.COM 		}
147*9203SMark.Logan@Sun.COM 	};
148*9203SMark.Logan@Sun.COM 
saInNtoP(const struct sockaddr * ip,char * buf,size_t buflen)149*9203SMark.Logan@Sun.COM 	static const char *saInNtoP(const struct sockaddr *ip, char *buf, size_t buflen)
150*9203SMark.Logan@Sun.COM 	{
151*9203SMark.Logan@Sun.COM 		if (!ATAddress::saIsInet(ip)) {
152*9203SMark.Logan@Sun.COM 			return NULL;
153*9203SMark.Logan@Sun.COM 		}
154*9203SMark.Logan@Sun.COM 
155*9203SMark.Logan@Sun.COM 		size_t asize;
156*9203SMark.Logan@Sun.COM 		const void *src = ATAddress::saInAddr(ip, asize);
157*9203SMark.Logan@Sun.COM 		if (NULL == src) {
158*9203SMark.Logan@Sun.COM 			return NULL;
159*9203SMark.Logan@Sun.COM 		}
160*9203SMark.Logan@Sun.COM 		return inet_ntop(ip->sa_family, src, buf, buflen);
161*9203SMark.Logan@Sun.COM 	};
162*9203SMark.Logan@Sun.COM 
family()163*9203SMark.Logan@Sun.COM 	sa_family_t family() const { return ip.ss_family; };
164*9203SMark.Logan@Sun.COM 
isInet()165*9203SMark.Logan@Sun.COM 	bool isInet() const { return ((ip.ss_family == AF_INET) || (ip.ss_family == AF_INET6)); };
166*9203SMark.Logan@Sun.COM 
size()167*9203SMark.Logan@Sun.COM 	unsigned int size() const
168*9203SMark.Logan@Sun.COM 	{
169*9203SMark.Logan@Sun.COM 		return ATAddress::saSize((const struct sockaddr *)&(this->ip));
170*9203SMark.Logan@Sun.COM 	};
171*9203SMark.Logan@Sun.COM 
addr()172*9203SMark.Logan@Sun.COM 	const struct sockaddr *addr() const
173*9203SMark.Logan@Sun.COM 	{
174*9203SMark.Logan@Sun.COM 		return (const struct sockaddr *)&ip;
175*9203SMark.Logan@Sun.COM 	};
176*9203SMark.Logan@Sun.COM 
inPort()177*9203SMark.Logan@Sun.COM 	in_port_t inPort() const
178*9203SMark.Logan@Sun.COM 	{
179*9203SMark.Logan@Sun.COM 		return ATAddress::saInPort((const struct sockaddr *)&(this->ip));
180*9203SMark.Logan@Sun.COM 	};
181*9203SMark.Logan@Sun.COM 
inAddr(size_t & asize)182*9203SMark.Logan@Sun.COM 	const void *inAddr(size_t &asize) const
183*9203SMark.Logan@Sun.COM 	{
184*9203SMark.Logan@Sun.COM 		return ATAddress::saInAddr((const struct sockaddr *)&(this->ip), asize);
185*9203SMark.Logan@Sun.COM 	};
186*9203SMark.Logan@Sun.COM 
inNtoP(char * buf,size_t buflen)187*9203SMark.Logan@Sun.COM 	const char *inNtoP(char *buf, size_t buflen)
188*9203SMark.Logan@Sun.COM 	{
189*9203SMark.Logan@Sun.COM 		return ATAddress::saInNtoP((const struct sockaddr *)&(this->ip), buf, buflen);
190*9203SMark.Logan@Sun.COM 	};
191*9203SMark.Logan@Sun.COM 
192*9203SMark.Logan@Sun.COM 	ATAddress &operator=(const ATAddress &y)
193*9203SMark.Logan@Sun.COM 	{
194*9203SMark.Logan@Sun.COM 		if (this != &y) {
195*9203SMark.Logan@Sun.COM 			memcpy(&(this->ip), y.addr(), sizeof(struct sockaddr_storage));
196*9203SMark.Logan@Sun.COM 		}
197*9203SMark.Logan@Sun.COM 		return *this;
198*9203SMark.Logan@Sun.COM 	};
199*9203SMark.Logan@Sun.COM 
200*9203SMark.Logan@Sun.COM 	ATAddress &operator=(const struct sockaddr &yip)
201*9203SMark.Logan@Sun.COM 	{
202*9203SMark.Logan@Sun.COM 		memset(&(this->ip), 0, sizeof(struct sockaddr_storage));
203*9203SMark.Logan@Sun.COM 		memcpy(&(this->ip), &yip, saSize(&yip));
204*9203SMark.Logan@Sun.COM 		return *this;
205*9203SMark.Logan@Sun.COM 	};
206*9203SMark.Logan@Sun.COM 
compare(const ATAddress & y)207*9203SMark.Logan@Sun.COM 	int compare(const ATAddress &y) const
208*9203SMark.Logan@Sun.COM 	{
209*9203SMark.Logan@Sun.COM 		if (this->family() != y.family()) {
210*9203SMark.Logan@Sun.COM 			return (this->family() - y.family());
211*9203SMark.Logan@Sun.COM 		}
212*9203SMark.Logan@Sun.COM 
213*9203SMark.Logan@Sun.COM 		size_t asize = 0;
214*9203SMark.Logan@Sun.COM 		const void *a = this->inAddr(asize);
215*9203SMark.Logan@Sun.COM 		const void *b = y.inAddr(asize);
216*9203SMark.Logan@Sun.COM 		if ((0 != asize) && (NULL != a) && (NULL != b)) {
217*9203SMark.Logan@Sun.COM 			int adiff = memcmp(a, b, asize);
218*9203SMark.Logan@Sun.COM 			if (adiff != 0) {
219*9203SMark.Logan@Sun.COM 				return adiff;
220*9203SMark.Logan@Sun.COM 			}
221*9203SMark.Logan@Sun.COM 		}
222*9203SMark.Logan@Sun.COM 
223*9203SMark.Logan@Sun.COM 		in_port_t ap = this->inPort();
224*9203SMark.Logan@Sun.COM 		in_port_t bp = y.inPort();
225*9203SMark.Logan@Sun.COM 		if ((ap == 0) || (bp == 0)) {
226*9203SMark.Logan@Sun.COM 			return 0;
227*9203SMark.Logan@Sun.COM 		}
228*9203SMark.Logan@Sun.COM 		if (ap != bp) {
229*9203SMark.Logan@Sun.COM 			return (ap - bp);
230*9203SMark.Logan@Sun.COM 		}
231*9203SMark.Logan@Sun.COM 
232*9203SMark.Logan@Sun.COM 		return memcmp(&(this->ip), y.addr(), this->size());
233*9203SMark.Logan@Sun.COM 	};
234*9203SMark.Logan@Sun.COM 
235*9203SMark.Logan@Sun.COM 	bool operator<(const ATAddress &y) const
236*9203SMark.Logan@Sun.COM 	{
237*9203SMark.Logan@Sun.COM 		if (this == &y) {
238*9203SMark.Logan@Sun.COM 			return false;
239*9203SMark.Logan@Sun.COM 		}
240*9203SMark.Logan@Sun.COM 		return (this->compare(y) < 0);
241*9203SMark.Logan@Sun.COM 	};
242*9203SMark.Logan@Sun.COM 
243*9203SMark.Logan@Sun.COM 	bool operator>(const ATAddress &y) const
244*9203SMark.Logan@Sun.COM 	{
245*9203SMark.Logan@Sun.COM 		if (this == &y) {
246*9203SMark.Logan@Sun.COM 			return false;
247*9203SMark.Logan@Sun.COM 		}
248*9203SMark.Logan@Sun.COM 		return (this->compare(y) > 0);
249*9203SMark.Logan@Sun.COM 	};
250*9203SMark.Logan@Sun.COM 
251*9203SMark.Logan@Sun.COM 	bool operator==(const ATAddress &y) const
252*9203SMark.Logan@Sun.COM 	{
253*9203SMark.Logan@Sun.COM 		if (this == &y) {
254*9203SMark.Logan@Sun.COM 			return true;
255*9203SMark.Logan@Sun.COM 		}
256*9203SMark.Logan@Sun.COM 		if (this->family() != y.family()) {
257*9203SMark.Logan@Sun.COM 			return false;
258*9203SMark.Logan@Sun.COM 		}
259*9203SMark.Logan@Sun.COM 		return (memcmp(&(this->ip), y.addr(), this->size()) == 0);
260*9203SMark.Logan@Sun.COM 	};
261*9203SMark.Logan@Sun.COM 
262*9203SMark.Logan@Sun.COM 	bool operator!=(const ATAddress &y) const
263*9203SMark.Logan@Sun.COM 	{
264*9203SMark.Logan@Sun.COM 		if (this == &y) {
265*9203SMark.Logan@Sun.COM 			return false;
266*9203SMark.Logan@Sun.COM 		}
267*9203SMark.Logan@Sun.COM 		if (this->family() != y.family()) {
268*9203SMark.Logan@Sun.COM 			return true;
269*9203SMark.Logan@Sun.COM 		}
270*9203SMark.Logan@Sun.COM 		return (memcmp(&(this->ip), y.addr(), this->size()) != 0);
271*9203SMark.Logan@Sun.COM 	};
272*9203SMark.Logan@Sun.COM 
273*9203SMark.Logan@Sun.COM 	static bool IsAddressIP(const char *address, int family = AF_INET)
274*9203SMark.Logan@Sun.COM 	{
275*9203SMark.Logan@Sun.COM 		struct sockaddr_storage inaddr;
276*9203SMark.Logan@Sun.COM 
277*9203SMark.Logan@Sun.COM 		if (address == NULL) {
278*9203SMark.Logan@Sun.COM 			return false;
279*9203SMark.Logan@Sun.COM 		}
280*9203SMark.Logan@Sun.COM 		return (0 < inet_pton(family, address, &inaddr));
281*9203SMark.Logan@Sun.COM 	};
282*9203SMark.Logan@Sun.COM };
283*9203SMark.Logan@Sun.COM 
284*9203SMark.Logan@Sun.COM 
285*9203SMark.Logan@Sun.COM typedef std::set<ATAddress> ATAddressList;
286*9203SMark.Logan@Sun.COM typedef std::map<ATAddress, std::string> ATDomainMap;
287*9203SMark.Logan@Sun.COM typedef std::vector<int> ATSocketList;
288*9203SMark.Logan@Sun.COM 
289*9203SMark.Logan@Sun.COM class ATNetworkTool
290*9203SMark.Logan@Sun.COM {
291*9203SMark.Logan@Sun.COM public:
292*9203SMark.Logan@Sun.COM 	static const int DefaultBacklog = 5;
293*9203SMark.Logan@Sun.COM 	static const int DefaultFamily = AF_INET;
294*9203SMark.Logan@Sun.COM 	static const int AF_XINETX = AF_MAX + 10;
295*9203SMark.Logan@Sun.COM 
296*9203SMark.Logan@Sun.COM 	/* Gets Domain name from Hostname
297*9203SMark.Logan@Sun.COM 	 * @param name hostname
298*9203SMark.Logan@Sun.COM 	 * @param domain [out] domain name
299*9203SMark.Logan@Sun.COM 	 * @return bool true if success, false if domain unknown
300*9203SMark.Logan@Sun.COM 	 */
301*9203SMark.Logan@Sun.COM 	static bool GetHostNameDomain(const char *name, std::string &domain);
302*9203SMark.Logan@Sun.COM 
303*9203SMark.Logan@Sun.COM 	/* Gets Domain name from IP
304*9203SMark.Logan@Sun.COM 	 * @param ip address
305*9203SMark.Logan@Sun.COM 	 * @param domain [out] domain name
306*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
307*9203SMark.Logan@Sun.COM 	 * @return bool true if success, false if domain unknown
308*9203SMark.Logan@Sun.COM 	 */
309*9203SMark.Logan@Sun.COM 	static bool GetIPDomain(const ATAddress &ip, std::string &domain, int &error);
310*9203SMark.Logan@Sun.COM 
311*9203SMark.Logan@Sun.COM 	/* Gets Domain name from host entry
312*9203SMark.Logan@Sun.COM 	 * @param hent pointer to host entry structure
313*9203SMark.Logan@Sun.COM 	 * @param domain [out] domain name
314*9203SMark.Logan@Sun.COM 	 * @return bool true if success, false if domain unknown
315*9203SMark.Logan@Sun.COM 	 */
316*9203SMark.Logan@Sun.COM 	static bool GetHentDomain(struct hostent *hent, std::string &domain);
317*9203SMark.Logan@Sun.COM 
318*9203SMark.Logan@Sun.COM 	/* Gets Domain name from socket
319*9203SMark.Logan@Sun.COM 	 * @param sock checked socket
320*9203SMark.Logan@Sun.COM 	 * @param domain [out] domain name
321*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
322*9203SMark.Logan@Sun.COM 	 * @return int ==1 if success, <0 on error, ==0 if no domain
323*9203SMark.Logan@Sun.COM 	 */
324*9203SMark.Logan@Sun.COM 	static int GetSockDomain(int sock, std::string &domain, int &error);
325*9203SMark.Logan@Sun.COM 
326*9203SMark.Logan@Sun.COM 	/* Gets all local (IPv4/6) from local running network interfaces
327*9203SMark.Logan@Sun.COM 	 * @param addresses [out] set of local IP addresses
328*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
329*9203SMark.Logan@Sun.COM 	 * @param family filtered address family
330*9203SMark.Logan@Sun.COM 	 * @param withloopback true if get loopback addresses too
331*9203SMark.Logan@Sun.COM 	 * @return int ==0 if success, !=0 on error
332*9203SMark.Logan@Sun.COM 	 */
333*9203SMark.Logan@Sun.COM 	static int GetLocalIPs(ATAddressList &addresses, int &error,
334*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
335*9203SMark.Logan@Sun.COM 				bool withloopback = false);
336*9203SMark.Logan@Sun.COM 
337*9203SMark.Logan@Sun.COM 	/* Gets all local domains from local running network interfaces
338*9203SMark.Logan@Sun.COM 	 * @param domains [out] map of <local IP address> => <domain name>
339*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
340*9203SMark.Logan@Sun.COM 	 * @param family filtered address family
341*9203SMark.Logan@Sun.COM 	 * @return int ==0 if success, !=0 on error
342*9203SMark.Logan@Sun.COM 	 */
343*9203SMark.Logan@Sun.COM 	static int GetLocalNetDomains(ATDomainMap &domains, int &error,
344*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX);
345*9203SMark.Logan@Sun.COM 
346*9203SMark.Logan@Sun.COM 	/* Gets all (IPv4/6) network interfaces of socket peer
347*9203SMark.Logan@Sun.COM 	 * @param addresses [out] set of peer IP addresses
348*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
349*9203SMark.Logan@Sun.COM 	 * @param family filtered address family
350*9203SMark.Logan@Sun.COM 	 * @param zeroport set port to 0 in result list
351*9203SMark.Logan@Sun.COM 	 * @return int ==0 if success, !=0 on error
352*9203SMark.Logan@Sun.COM 	 */
353*9203SMark.Logan@Sun.COM 	static int GetSockPeerIPs(int sock, ATAddressList &addresses,
354*9203SMark.Logan@Sun.COM 				int &error,
355*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
356*9203SMark.Logan@Sun.COM 				bool zeroport = false);
357*9203SMark.Logan@Sun.COM 
358*9203SMark.Logan@Sun.COM 	/* Checks if socket peer is (IPv4/6) local address
359*9203SMark.Logan@Sun.COM 	 * @param sock checked socket
360*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
361*9203SMark.Logan@Sun.COM 	 * @param family filtered address family
362*9203SMark.Logan@Sun.COM 	 * @return int ==1 if peer is local, ==0 if remote, <0 on error
363*9203SMark.Logan@Sun.COM 	 */
364*9203SMark.Logan@Sun.COM 	static int IsSockPeerLocal(int sock, int &error,
365*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX);
366*9203SMark.Logan@Sun.COM 
367*9203SMark.Logan@Sun.COM 	/* Closes socket
368*9203SMark.Logan@Sun.COM 	 * @param s socket to close
369*9203SMark.Logan@Sun.COM 	 * @return int ==0 if success, !=0 on error
370*9203SMark.Logan@Sun.COM 	 */
371*9203SMark.Logan@Sun.COM 	static int CloseSocket(int s);
372*9203SMark.Logan@Sun.COM 
373*9203SMark.Logan@Sun.COM 	/* Sets/removes O_NONBLOCKING flag to socket
374*9203SMark.Logan@Sun.COM 	 * @param s socket
375*9203SMark.Logan@Sun.COM 	 * @param block - true to set flag, false to remove flag
376*9203SMark.Logan@Sun.COM 	 * @return int ==0 if success, !=0 on error
377*9203SMark.Logan@Sun.COM 	 */
378*9203SMark.Logan@Sun.COM 	static int SetNonBlocking(int s, bool block = true);
379*9203SMark.Logan@Sun.COM 
380*9203SMark.Logan@Sun.COM 	/* Creates socket
381*9203SMark.Logan@Sun.COM 	 * @param addr socket parameters
382*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
383*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
384*9203SMark.Logan@Sun.COM 	 */
385*9203SMark.Logan@Sun.COM 	static int CreateSocket(const struct addrinfo *addr, int &error);
386*9203SMark.Logan@Sun.COM 
387*9203SMark.Logan@Sun.COM 	/* Creates socket
388*9203SMark.Logan@Sun.COM 	 * @param addr socket address
389*9203SMark.Logan@Sun.COM 	 * @param addrlen socket address length
390*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
391*9203SMark.Logan@Sun.COM 	 * @param family socket expected family
392*9203SMark.Logan@Sun.COM 	 * @param socktype socket type
393*9203SMark.Logan@Sun.COM 	 * @param protocol socket protocol
394*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
395*9203SMark.Logan@Sun.COM 	 */
396*9203SMark.Logan@Sun.COM 	static int CreateSocket(const struct sockaddr *addr, socklen_t addrlen,
397*9203SMark.Logan@Sun.COM 				int &error,
398*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::DefaultFamily,
399*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
400*9203SMark.Logan@Sun.COM 
401*9203SMark.Logan@Sun.COM 	/* Creates server listening socket
402*9203SMark.Logan@Sun.COM 	 * @param addr socket parameters
403*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
404*9203SMark.Logan@Sun.COM 	 * @param nonblocking true for nonblocking socket
405*9203SMark.Logan@Sun.COM 	 * @param backlog listening backlog
406*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
407*9203SMark.Logan@Sun.COM 	 */
408*9203SMark.Logan@Sun.COM 	static int CreateServerSocket(const struct addrinfo *addr,
409*9203SMark.Logan@Sun.COM 				int &error, bool nonblocking = true,
410*9203SMark.Logan@Sun.COM 				int backlog = ATNetworkTool::DefaultBacklog);
411*9203SMark.Logan@Sun.COM 
412*9203SMark.Logan@Sun.COM 	/* Creates server listening sockets
413*9203SMark.Logan@Sun.COM 	 * @param sockets [out] list of created server listening sockets
414*9203SMark.Logan@Sun.COM 	 * @param port listening port
415*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
416*9203SMark.Logan@Sun.COM 	 * @param loopback true to listen only on loopback
417*9203SMark.Logan@Sun.COM 	 * @param nonblocking true for nonblocking sockets
418*9203SMark.Logan@Sun.COM 	 * @param family sockets expected family
419*9203SMark.Logan@Sun.COM 	 * @param socktype sockets type
420*9203SMark.Logan@Sun.COM 	 * @param protocol sockets protocol
421*9203SMark.Logan@Sun.COM 	 * @param backlog listening backlog
422*9203SMark.Logan@Sun.COM 	 * @param one true if want create only one socket
423*9203SMark.Logan@Sun.COM 	 * @return int >=0 number of created server sockets, ==-1 on error
424*9203SMark.Logan@Sun.COM 	 */
425*9203SMark.Logan@Sun.COM 	static int CreateServerSockets(ATSocketList &sockets, in_port_t port,
426*9203SMark.Logan@Sun.COM 				int &error,
427*9203SMark.Logan@Sun.COM 				bool loopback = false, bool nonblocking = true,
428*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
429*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0,
430*9203SMark.Logan@Sun.COM 				int backlog = ATNetworkTool::DefaultBacklog,
431*9203SMark.Logan@Sun.COM 				bool one = false);
432*9203SMark.Logan@Sun.COM 	static int CreateServerSockets(ATSocketList &sockets, const char *port,
433*9203SMark.Logan@Sun.COM 				int &error,
434*9203SMark.Logan@Sun.COM 				bool loopback = false, bool nonblocking = true,
435*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
436*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0,
437*9203SMark.Logan@Sun.COM 				int backlog = ATNetworkTool::DefaultBacklog,
438*9203SMark.Logan@Sun.COM 				bool one = false);
439*9203SMark.Logan@Sun.COM 
440*9203SMark.Logan@Sun.COM 	/* Creates one server listening socket
441*9203SMark.Logan@Sun.COM 	 * @param port listening port
442*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
443*9203SMark.Logan@Sun.COM 	 * @param loopback true to listen only on loopback
444*9203SMark.Logan@Sun.COM 	 * @param nonblocking true for nonblocking sockets
445*9203SMark.Logan@Sun.COM 	 * @param family sockets expected family
446*9203SMark.Logan@Sun.COM 	 * @param socktype sockets type
447*9203SMark.Logan@Sun.COM 	 * @param protocol sockets protocol
448*9203SMark.Logan@Sun.COM 	 * @param backlog listening backlog
449*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
450*9203SMark.Logan@Sun.COM 	 */
451*9203SMark.Logan@Sun.COM 	static int CreateServerSocket(in_port_t port,
452*9203SMark.Logan@Sun.COM 				int &error,
453*9203SMark.Logan@Sun.COM 				bool loopback = false, bool nonblocking = true,
454*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
455*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0,
456*9203SMark.Logan@Sun.COM 				int backlog = ATNetworkTool::DefaultBacklog);
457*9203SMark.Logan@Sun.COM 	static int CreateServerSocket(const char *port,
458*9203SMark.Logan@Sun.COM 				int &error,
459*9203SMark.Logan@Sun.COM 				bool loopback = false, bool nonblocking = true,
460*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
461*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0,
462*9203SMark.Logan@Sun.COM 				int backlog = ATNetworkTool::DefaultBacklog);
463*9203SMark.Logan@Sun.COM 
464*9203SMark.Logan@Sun.COM 	/* Connects to local socket
465*9203SMark.Logan@Sun.COM 	 * @param sock socket to connect to
466*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
467*9203SMark.Logan@Sun.COM 	 * @param loopback true to use loopback, false to use any local address
468*9203SMark.Logan@Sun.COM 	 * @param socktype sockets type
469*9203SMark.Logan@Sun.COM 	 * @param protocol sockets protocol
470*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
471*9203SMark.Logan@Sun.COM 	 */
472*9203SMark.Logan@Sun.COM 	static int ConnectToSocket(int sock,
473*9203SMark.Logan@Sun.COM 				int &error, bool loopback = true,
474*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
475*9203SMark.Logan@Sun.COM 
476*9203SMark.Logan@Sun.COM 	/* Connects to address
477*9203SMark.Logan@Sun.COM 	 * @param addr destination address parameters
478*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
479*9203SMark.Logan@Sun.COM 	 * @param loopback true to use loopback, false to use any local address
480*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
481*9203SMark.Logan@Sun.COM 	 */
482*9203SMark.Logan@Sun.COM 	static int ConnectSocket(struct addrinfo *addr,
483*9203SMark.Logan@Sun.COM 				int &error, bool loopback = false);
484*9203SMark.Logan@Sun.COM 
485*9203SMark.Logan@Sun.COM 	/* Connects to address
486*9203SMark.Logan@Sun.COM 	 * @param addr destination address
487*9203SMark.Logan@Sun.COM 	 * @param addrlen socket address length
488*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
489*9203SMark.Logan@Sun.COM 	 * @param loopback true to use loopback, false to use any local address
490*9203SMark.Logan@Sun.COM 	 * @param family sockets expected family
491*9203SMark.Logan@Sun.COM 	 * @param socktype sockets type
492*9203SMark.Logan@Sun.COM 	 * @param protocol sockets protocol
493*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
494*9203SMark.Logan@Sun.COM 	 */
495*9203SMark.Logan@Sun.COM 	static int ConnectSocket(const struct sockaddr *addr, socklen_t addrlen,
496*9203SMark.Logan@Sun.COM 				int &error, bool loopback = false,
497*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
498*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
499*9203SMark.Logan@Sun.COM 
500*9203SMark.Logan@Sun.COM 	/* Connects to address
501*9203SMark.Logan@Sun.COM 	 * @param hostname name of destination host
502*9203SMark.Logan@Sun.COM 	 * @param port destination port
503*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
504*9203SMark.Logan@Sun.COM 	 * @param family sockets expected family
505*9203SMark.Logan@Sun.COM 	 * @param socktype sockets type
506*9203SMark.Logan@Sun.COM 	 * @param protocol sockets protocol
507*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
508*9203SMark.Logan@Sun.COM 	 */
509*9203SMark.Logan@Sun.COM 	static int Connect(const char *host, in_port_t port,
510*9203SMark.Logan@Sun.COM 				int &error,
511*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
512*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
513*9203SMark.Logan@Sun.COM 	static int Connect(const char *host, const char *port,
514*9203SMark.Logan@Sun.COM 				int &error,
515*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
516*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
517*9203SMark.Logan@Sun.COM 
518*9203SMark.Logan@Sun.COM 	/* Connects to loopback port
519*9203SMark.Logan@Sun.COM 	 * @param port destination port
520*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
521*9203SMark.Logan@Sun.COM 	 * @param family sockets expected family
522*9203SMark.Logan@Sun.COM 	 * @param socktype sockets type
523*9203SMark.Logan@Sun.COM 	 * @param protocol sockets protocol
524*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
525*9203SMark.Logan@Sun.COM 	 */
526*9203SMark.Logan@Sun.COM 	static int ConnectLoopback(in_port_t port,
527*9203SMark.Logan@Sun.COM 				int &error,
528*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
529*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
530*9203SMark.Logan@Sun.COM 	static int ConnectLoopback(const char *port,
531*9203SMark.Logan@Sun.COM 				int &error,
532*9203SMark.Logan@Sun.COM 				int family = ATNetworkTool::AF_XINETX,
533*9203SMark.Logan@Sun.COM 				int socktype = SOCK_STREAM, int protocol = 0);
534*9203SMark.Logan@Sun.COM 
535*9203SMark.Logan@Sun.COM 	/* Returns local port associated with socket
536*9203SMark.Logan@Sun.COM 	 * @param sock socket
537*9203SMark.Logan@Sun.COM 	 * @return unsigned int port number, or 0 - on error
538*9203SMark.Logan@Sun.COM 	 */
539*9203SMark.Logan@Sun.COM 	static unsigned int GetLocalPort(int sock);
540*9203SMark.Logan@Sun.COM 
541*9203SMark.Logan@Sun.COM 	/* Accepts connection on sockets - returns address or error
542*9203SMark.Logan@Sun.COM 	 * @param s socket accepting connection
543*9203SMark.Logan@Sun.COM 	 * @param address [out] peer address of accepted connection
544*9203SMark.Logan@Sun.COM 	 * @param error [out] error code
545*9203SMark.Logan@Sun.COM 	 * @param nonblocking true for nonblocking sockets
546*9203SMark.Logan@Sun.COM 	 * @return int !=-1 socket, ==-1 on error
547*9203SMark.Logan@Sun.COM 	 */
548*9203SMark.Logan@Sun.COM 	static int Accept(int s, ATAddress &address,
549*9203SMark.Logan@Sun.COM 			  int &error, bool nonblocking = true);
550*9203SMark.Logan@Sun.COM };
551*9203SMark.Logan@Sun.COM 
552*9203SMark.Logan@Sun.COM #endif //_AT_NETWORK_TOOL_H_
553*9203SMark.Logan@Sun.COM 
554