ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/sockinfo.C
Revision: 1.25
Committed: Thu Mar 24 21:52:49 2011 UTC (13 years, 2 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.24: +12 -18 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2 pcg 1.4 sockinfo.C -- socket address management
3 pcg 1.23 Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.15 This file is part of GVPE.
6    
7 pcg 1.23 GVPE is free software; you can redistribute it and/or modify it
8     under the terms of the GNU General Public License as published by the
9     Free Software Foundation; either version 3 of the License, or (at your
10     option) any later version.
11    
12     This program is distributed in the hope that it will be useful, but
13     WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15     Public License for more details.
16    
17     You should have received a copy of the GNU General Public License along
18     with this program; if not, see <http://www.gnu.org/licenses/>.
19    
20     Additional permission under GNU GPL version 3 section 7
21    
22     If you modify this Program, or any covered work, by linking or
23     combining it with the OpenSSL project's OpenSSL library (or a modified
24     version of that library), containing parts covered by the terms of the
25     OpenSSL or SSLeay licenses, the licensors of this Program grant you
26     additional permission to convey the resulting work. Corresponding
27     Source for a non-source form of such a combination shall include the
28     source code for the parts of OpenSSL used as well as that of the
29     covered work.
30 pcg 1.1 */
31    
32     #include "config.h"
33    
34 pcg 1.2 #include <netdb.h>
35 pcg 1.1
36 pcg 1.20 #include "gettext.h"
37    
38 pcg 1.1 #include "sockinfo.h"
39     #include "slog.h"
40    
41 pcg 1.22 #include <cstring>
42     #include <cstdio>
43    
44 pcg 1.9 // all ipv4-based protocols
45 pcg 1.13 #define PROTv4 (PROT_UDPv4 | PROT_TCPv4 | PROT_ICMPv4 | PROT_IPv4 | PROT_DNSv4)
46 pcg 1.9
47 root 1.24 void
48     sockinfo::set (const sockaddr_in *sa, u8 prot_)
49 pcg 1.1 {
50     host = sa->sin_addr.s_addr;
51 pcg 1.9 port = prot_ & (PROT_IPv4 | PROT_ICMPv4) ? 0 : sa->sin_port;
52 pcg 1.1 prot = prot_;
53     }
54    
55 root 1.24 void
56     sockinfo::set (const char *hostname, u16 port_, u8 prot_)
57 pcg 1.1 {
58 pcg 1.3 prot = prot_;
59 pcg 1.1 host = 0;
60 pcg 1.8 port = htons (port_);
61 pcg 1.1
62 pcg 1.9 if (prot & PROTv4
63 pcg 1.8 && hostname)
64 pcg 1.1 {
65 pcg 1.8 struct hostent *he = gethostbyname (hostname);
66 pcg 1.1
67     if (he
68     && he->h_addrtype == AF_INET && he->h_length == 4 && he->h_addr_list[0])
69     {
70     //sa->sin_family = he->h_addrtype;
71     memcpy (&host, he->h_addr_list[0], 4);
72     }
73     else
74 pcg 1.8 slog (L_NOTICE, _("unable to resolve host '%s'"), hostname);
75 pcg 1.1 }
76     }
77    
78 pcg 1.8 void
79     sockinfo::set (const conf_node *conf, u8 prot_)
80     {
81 pcg 1.14 if (prot_ == PROT_DNSv4)
82 pcg 1.16 {
83 pcg 1.18 host = htonl (conf->id); port = 0; prot = prot_;
84 pcg 1.16 }
85 pcg 1.14 else
86     set (conf->hostname,
87     prot_ == PROT_UDPv4 ? conf->udp_port
88     : prot_ == PROT_TCPv4 ? conf->tcp_port
89     : prot_ == PROT_DNSv4 ? conf->dns_port
90     : 0,
91     prot_);
92 pcg 1.8 }
93 pcg 1.1
94     const sockaddr *
95     sockinfo::sav4() const
96     {
97     static sockaddr_in sa;
98    
99     sa.sin_family = AF_INET;
100     sa.sin_port = port;
101     sa.sin_addr.s_addr = host;
102    
103     return (const sockaddr *)&sa;
104     }
105    
106 pcg 1.8 static char hostport[10 + 15 + 1 + 5 + 1]; // proto / IPv4 : port
107 pcg 1.1
108     const char *
109     sockinfo::ntoa () const
110     {
111     in_addr ia = { host };
112    
113     sprintf (hostport, "%.15s", inet_ntoa (ia));
114    
115     return hostport;
116     }
117    
118     sockinfo::operator const char *() const
119     {
120     in_addr ia = { host };
121    
122 pcg 1.4 sprintf (hostport, "%s/%.15s:%d", strprotocol (prot), inet_ntoa (ia), ntohs (port) & 0xffff);
123 pcg 1.1
124     return hostport;
125 pcg 1.4 }
126    
127 pcg 1.5 u8
128     sockinfo::supported_protocols (conf_node *conf)
129     {
130     u8 protocols = prot;
131    
132 root 1.25 if (prot & (PROT_IPv4 | PROT_ICMPv4 | PROT_UDPv4 | PROT_TCPv4))
133 pcg 1.9 protocols |= PROT_IPv4 | PROT_ICMPv4;
134 pcg 1.5
135 root 1.25 if (conf && prot & PROTv4)
136     {
137     if (conf->protocols & PROT_UDPv4 && conf->udp_port)
138     protocols |= PROT_UDPv4;
139    
140     if (conf->protocols & PROT_TCPv4 && conf->tcp_port)
141     protocols |= PROT_TCPv4;
142    
143     if (conf->protocols & PROT_DNSv4 && conf->dns_port)
144     protocols |= PROT_DNSv4;
145     }
146 pcg 1.5
147     return protocols;
148     }
149    
150     bool
151     sockinfo::upgrade_protocol (u8 prot_, conf_node *conf)
152     {
153     if (prot_ == prot)
154     return true;
155    
156 pcg 1.9 if (prot & PROTv4
157     && prot_ & PROTv4)
158 pcg 1.5 {
159 pcg 1.9 if (prot_ & (PROT_IPv4 | PROT_ICMPv4))
160 pcg 1.5 {
161     prot = prot_;
162     port = 0;
163     return true;
164     }
165    
166     if (conf
167     && prot_ & PROT_UDPv4
168     && conf->protocols & PROT_UDPv4
169     && conf->udp_port)
170     {
171     prot = prot_;
172 pcg 1.6 port = htons (conf->udp_port);
173 pcg 1.5 return true;
174     }
175    
176     if (conf
177     && prot_ & PROT_TCPv4
178     && conf->protocols & PROT_TCPv4
179     && conf->tcp_port)
180     {
181     prot = prot_;
182 pcg 1.6 port = htons (conf->tcp_port);
183 pcg 1.5 return true;
184     }
185     }
186    
187     return false;
188     }
189    
190 pcg 1.4 bool
191     operator == (const sockinfo &a, const sockinfo &b)
192     {
193     return a.host == b.host && a.port == b.port && a.prot == b.prot;
194     }
195    
196     bool
197     operator < (const sockinfo &a, const sockinfo &b)
198     {
199     return a.host < b.host
200     || (a.host == b.host && (a.port < b.port
201     || (a.port == b.port && a.prot < b.prot)));
202 pcg 1.1 }
203