convert.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3  *
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.
7  */
8 
9 // Author: Jens-S. V?ckler <voeckler@rvs.uni-hannover.de>
10 //
11 // File: convert.cc
12 // Thu Oct 30 1997
13 //
14 // (c) 1997 Lehrgebiet Rechnernetze und Verteilte Systeme
15 // Universit?t Hannover, Germany
16 //
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.
26 //
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.
30 //
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
37 // SOFTWARE.
38 //
39 // Revision 1.3 2000/06/20 09:43:01 voeckler
40 // added FreeBSD related fixes and support.
41 //
42 // Revision 1.2 1999/01/19 11:00:50 voeckler
43 // Linux glibc2 fixes for sockets.
44 //
45 // Revision 1.1 1998/08/13 21:38:04 voeckler
46 // Initial revision
47 //
48 
49 #include "squid.h"
50 #include "convert.hh"
51 
52 #include <cstdlib>
53 #include <cstring>
54 #include <netinet/in.h>
55 #include <arpa/inet.h>
56 #include <netdb.h>
57 
58 #ifndef SA
59 #define SA struct sockaddr
60 #endif
61 
62 const char*
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 "*"
69 {
70  if ( a.s_addr == ntohl(INADDR_ANY) ) {
71  // 'default' or '*' or ...
72  output[0] = '*';
73  output[1] = '\0';
74  } else {
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) );
78 
79  snprintf(output, sizeof(HostAddress), "%d.%d.%d.%d", s[0], s[1], s[2], s[3] );
80  }
81  return output;
82 }
83 
84 const char*
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
90 {
91  HostAddress host;
92  snprintf( buffer, sizeof(SockAddress), "%s:%u",
93  my_inet_ntoa(a.sin_addr,host), ntohs(a.sin_port) );
94  return buffer;
95 }
96 
97 const char*
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...)
107 {
108  struct sockaddr_in socket;
109  socklen_t len = sizeof(socket);
110 
111  if ( (peer ? getpeername( fd, (SA*) &socket, &len ) :
112  getsockname( fd, (SA*) &socket, &len )) == -1 )
113  return NULL;
114  else
115  return my_sock_ntoa( socket, buffer );
116 }
117 
118 int
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.
124 {
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 ) {
128  // symbolic host
129  struct hostent* dns = gethostbyname(host);
130  if ( dns == NULL ) return -1;
131  else memcpy( &dst.s_addr, dns->h_addr, dns->h_length );
132  } else {
133  // numeric host
134  dst.s_addr = h;
135  }
136  return 0;
137 }
138 
139 int
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.
145 {
146  int p = strtoul(port,0,0);
147 
148  if ( p == 0 ) {
149  // symbolic port
150  struct servent* proto = getservbyname( port, "tcp" );
151  if ( proto == NULL ) return -1;
152  else dst = proto->s_port;
153  } else {
154  // numeric port
155  dst = htons(p);
156  }
157  return 0;
158 }
159 
int socklen_t
Definition: types.h:158
const char * my_sock_fd2a(int fd, SockAddress buffer, bool peer)
Definition: convert.cc:98
char * p
Definition: membanger.c:43
const char * my_inet_ntoa(const struct in_addr &a, HostAddress output)
Definition: convert.cc:63
struct servent * getservbyname()
int convertPortname(const char *port, unsigned short &dst)
Definition: convert.cc:140
int convertHostname(const char *host, in_addr &dst)
Definition: convert.cc:119
const char * my_sock_ntoa(const struct sockaddr_in &a, SockAddress buffer)
Definition: convert.cc:85
static int port
Definition: ldap_backend.cc:69
int unsigned int const char *desc STUB void int len
Definition: stub_fd.cc:20
struct hostent * gethostbyname()
int a
Definition: membanger.c:50
#define SA
Definition: convert.cc:59
#define NULL
Definition: types.h:166

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors