ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/sockinfo.C
Revision: 1.24
Committed: Tue Feb 8 23:11:36 2011 UTC (13 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.23: +4 -2 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     if (prot & (PROT_UDPv4 | PROT_TCPv4))
133 pcg 1.9 protocols |= PROT_IPv4 | PROT_ICMPv4;
134 pcg 1.5
135     if (conf
136 pcg 1.9 && prot & PROTv4
137 pcg 1.5 && conf->protocols & PROT_UDPv4
138     && conf->udp_port)
139     protocols |= PROT_UDPv4;
140    
141     if (conf
142 pcg 1.9 && prot & PROTv4
143 pcg 1.5 && conf->protocols & PROT_TCPv4
144     && conf->tcp_port)
145     protocols |= PROT_TCPv4;
146 pcg 1.12
147     if (conf
148     && prot & PROTv4
149 pcg 1.13 && conf->protocols & PROT_DNSv4
150     && conf->dns_port)
151 pcg 1.12 protocols |= PROT_DNSv4;
152 pcg 1.5
153     return protocols;
154     }
155    
156     bool
157     sockinfo::upgrade_protocol (u8 prot_, conf_node *conf)
158     {
159     if (prot_ == prot)
160     return true;
161    
162 pcg 1.9 if (prot & PROTv4
163     && prot_ & PROTv4)
164 pcg 1.5 {
165 pcg 1.9 if (prot_ & (PROT_IPv4 | PROT_ICMPv4))
166 pcg 1.5 {
167     prot = prot_;
168     port = 0;
169     return true;
170     }
171    
172     if (conf
173     && prot_ & PROT_UDPv4
174     && conf->protocols & PROT_UDPv4
175     && conf->udp_port)
176     {
177     prot = prot_;
178 pcg 1.6 port = htons (conf->udp_port);
179 pcg 1.5 return true;
180     }
181    
182     if (conf
183     && prot_ & PROT_TCPv4
184     && conf->protocols & PROT_TCPv4
185     && conf->tcp_port)
186     {
187     prot = prot_;
188 pcg 1.6 port = htons (conf->tcp_port);
189 pcg 1.5 return true;
190     }
191     }
192    
193     return false;
194     }
195    
196 pcg 1.4 bool
197     operator == (const sockinfo &a, const sockinfo &b)
198     {
199     return a.host == b.host && a.port == b.port && a.prot == b.prot;
200     }
201    
202     bool
203     operator < (const sockinfo &a, const sockinfo &b)
204     {
205     return a.host < b.host
206     || (a.host == b.host && (a.port < b.port
207     || (a.port == b.port && a.prot < b.prot)));
208 pcg 1.1 }
209