]>
git.ipfire.org Git - thirdparty/squid.git/blob - tools/purge/convert.cc
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 // Author: Jens-S. V?ckler <voeckler@rvs.uni-hannover.de>
14 // (c) 1997 Lehrgebiet Rechnernetze und Verteilte Systeme
15 // Universit?t Hannover, Germany
17 // Permission to use, copy, modify, distribute, and sell this software
18 // and its documentation for any purpose is hereby granted without fee,
19 // provided that (i) the above copyright notices and this permission
20 // notice appear in all copies of the software and related documentation,
21 // and (ii) the names of the Lehrgebiet Rechnernetze und Verteilte
22 // Systeme and the University of Hannover may not be used in any
23 // advertising or publicity relating to the software without the
24 // specific, prior written permission of Lehrgebiet Rechnernetze und
25 // Verteilte Systeme and the University of Hannover.
27 // THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
28 // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
29 // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
31 // IN NO EVENT SHALL THE LEHRGEBIET RECHNERNETZE UND VERTEILTE SYSTEME OR
32 // THE UNIVERSITY OF HANNOVER BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
33 // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
34 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
35 // ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
36 // ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
39 // Revision 1.3 2000/06/20 09:43:01 voeckler
40 // added FreeBSD related fixes and support.
42 // Revision 1.2 1999/01/19 11:00:50 voeckler
43 // Linux glibc2 fixes for sockets.
45 // Revision 1.1 1998/08/13 21:38:04 voeckler
54 #include <netinet/in.h>
55 #include <arpa/inet.h>
59 #define SA struct sockaddr
63 my_inet_ntoa( const struct in_addr
& a
, HostAddress output
)
64 // purpose: thread-safely convert IPv4 address -> ASCII representation
65 // paramtr: a (IN): networked representation of IPv4 address
66 // buffer (OUT): storage area to store representation into.
67 // returns: pointer to buffer
68 // goodies: INADDR_ANY will be converted to "*"
70 if ( a
.s_addr
== ntohl(INADDR_ANY
) ) {
71 // 'default' or '*' or ...
75 // ANSI C++ forbids casting to an array type, nag, nag, nag...
76 unsigned char s
[sizeof(a
.s_addr
)];
77 memcpy( s
, &a
.s_addr
, sizeof(a
.s_addr
) );
79 snprintf(output
, sizeof(HostAddress
), "%d.%d.%d.%d", s
[0], s
[1], s
[2], s
[3] );
85 my_sock_ntoa( const struct sockaddr_in
& a
, SockAddress buffer
)
86 // purpose: thread-safely convert IPv4 socket pair into ASCII rep.
87 // paramtr: a (IN): sockaddr_in address
88 // buffer (OUT): storage area to store representation into.
89 // returns: pointer to buffer
92 snprintf( buffer
, sizeof(SockAddress
), "%s:%u",
93 my_inet_ntoa(a
.sin_addr
,host
), ntohs(a
.sin_port
) );
98 my_sock_fd2a( int fd
, SockAddress buffer
, bool peer
)
99 // purpose: thread-safely convert IPv4 socket FD associated address
100 // to ASCII representation
101 // paramtr: fd (IN): open socket FD
102 // buffer (OUT): storage area
103 // peer (IN): true, use peer (remote) socket pair
104 // false, use own (local) socket pair
105 // returns: NULL in case of error, or pointer to buffer otherwise
106 // Refer to errno in case of error (usually unconnected fd...)
108 struct sockaddr_in socket
;
109 socklen_t len
= sizeof(socket
);
111 if ( (peer
? getpeername( fd
, (SA
*) &socket
, &len
) :
112 getsockname( fd
, (SA
*) &socket
, &len
)) == -1 )
115 return my_sock_ntoa( socket
, buffer
);
119 convertHostname( const char* host
, in_addr
& dst
)
120 // purpose: convert a numeric or symbolic hostname
121 // paramtr: host (IN): host description to convert
122 // dst (OUT): the internet address in network byteorder.
123 // returns: -1 in case of error, see h_errno; 0 otherwise.
125 if ( host
== 0 ) return -1;
126 unsigned long int h
= inet_addr(host
);
127 if ( h
== 0xFFFFFFFF && strncmp(host
,"255.255.255.255",15) != 0 ) {
129 struct hostent
* dns
= gethostbyname(host
);
130 if ( dns
== NULL
) return -1;
131 else memcpy( &dst
.s_addr
, dns
->h_addr
, dns
->h_length
);
140 convertPortname( const char* port
, unsigned short& dst
)
141 // purpose: convert a numeric or symbolic port number
142 // paramtr: port (IN): port description to convert
143 // dst (OUT): port number in network byteorder.
144 // returns: -1 in case of error, see errno; 0 otherwise.
146 int p
= strtoul(port
,0,0);
150 struct servent
* proto
= getservbyname( port
, "tcp" );
151 if ( proto
== NULL
) return -1;
152 else dst
= proto
->s_port
;