ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/sockinfo.C
Revision: 1.23
Committed: Thu Aug 7 17:54:27 2008 UTC (15 years, 9 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_2, rel-2_21, rel-2_22
Changes since 1.22: +24 -14 lines
Log Message:
update to gplv3, finally

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 pcg 1.1 void sockinfo::set (const sockaddr_in *sa, u8 prot_)
48     {
49     host = sa->sin_addr.s_addr;
50 pcg 1.9 port = prot_ & (PROT_IPv4 | PROT_ICMPv4) ? 0 : sa->sin_port;
51 pcg 1.1 prot = prot_;
52     }
53    
54 pcg 1.8 void sockinfo::set (const char *hostname, u16 port_, u8 prot_)
55 pcg 1.1 {
56 pcg 1.3 prot = prot_;
57 pcg 1.1 host = 0;
58 pcg 1.8 port = htons (port_);
59 pcg 1.1
60 pcg 1.9 if (prot & PROTv4
61 pcg 1.8 && hostname)
62 pcg 1.1 {
63 pcg 1.8 struct hostent *he = gethostbyname (hostname);
64 pcg 1.1
65     if (he
66     && he->h_addrtype == AF_INET && he->h_length == 4 && he->h_addr_list[0])
67     {
68     //sa->sin_family = he->h_addrtype;
69     memcpy (&host, he->h_addr_list[0], 4);
70     }
71     else
72 pcg 1.8 slog (L_NOTICE, _("unable to resolve host '%s'"), hostname);
73 pcg 1.1 }
74     }
75    
76 pcg 1.8 void
77     sockinfo::set (const conf_node *conf, u8 prot_)
78     {
79 pcg 1.14 if (prot_ == PROT_DNSv4)
80 pcg 1.16 {
81 pcg 1.18 host = htonl (conf->id); port = 0; prot = prot_;
82 pcg 1.16 }
83 pcg 1.14 else
84     set (conf->hostname,
85     prot_ == PROT_UDPv4 ? conf->udp_port
86     : prot_ == PROT_TCPv4 ? conf->tcp_port
87     : prot_ == PROT_DNSv4 ? conf->dns_port
88     : 0,
89     prot_);
90 pcg 1.8 }
91 pcg 1.1
92     const sockaddr *
93     sockinfo::sav4() const
94     {
95     static sockaddr_in sa;
96    
97     sa.sin_family = AF_INET;
98     sa.sin_port = port;
99     sa.sin_addr.s_addr = host;
100    
101     return (const sockaddr *)&sa;
102     }
103    
104 pcg 1.8 static char hostport[10 + 15 + 1 + 5 + 1]; // proto / IPv4 : port
105 pcg 1.1
106     const char *
107     sockinfo::ntoa () const
108     {
109     in_addr ia = { host };
110    
111     sprintf (hostport, "%.15s", inet_ntoa (ia));
112    
113     return hostport;
114     }
115    
116     sockinfo::operator const char *() const
117     {
118     in_addr ia = { host };
119    
120 pcg 1.4 sprintf (hostport, "%s/%.15s:%d", strprotocol (prot), inet_ntoa (ia), ntohs (port) & 0xffff);
121 pcg 1.1
122     return hostport;
123 pcg 1.4 }
124    
125 pcg 1.5 u8
126     sockinfo::supported_protocols (conf_node *conf)
127     {
128     u8 protocols = prot;
129    
130     if (prot & (PROT_UDPv4 | PROT_TCPv4))
131 pcg 1.9 protocols |= PROT_IPv4 | PROT_ICMPv4;
132 pcg 1.5
133     if (conf
134 pcg 1.9 && prot & PROTv4
135 pcg 1.5 && conf->protocols & PROT_UDPv4
136     && conf->udp_port)
137     protocols |= PROT_UDPv4;
138    
139     if (conf
140 pcg 1.9 && prot & PROTv4
141 pcg 1.5 && conf->protocols & PROT_TCPv4
142     && conf->tcp_port)
143     protocols |= PROT_TCPv4;
144 pcg 1.12
145     if (conf
146     && prot & PROTv4
147 pcg 1.13 && conf->protocols & PROT_DNSv4
148     && conf->dns_port)
149 pcg 1.12 protocols |= PROT_DNSv4;
150 pcg 1.5
151     return protocols;
152     }
153    
154     bool
155     sockinfo::upgrade_protocol (u8 prot_, conf_node *conf)
156     {
157     if (prot_ == prot)
158     return true;
159    
160 pcg 1.9 if (prot & PROTv4
161     && prot_ & PROTv4)
162 pcg 1.5 {
163 pcg 1.9 if (prot_ & (PROT_IPv4 | PROT_ICMPv4))
164 pcg 1.5 {
165     prot = prot_;
166     port = 0;
167     return true;
168     }
169    
170     if (conf
171     && prot_ & PROT_UDPv4
172     && conf->protocols & PROT_UDPv4
173     && conf->udp_port)
174     {
175     prot = prot_;
176 pcg 1.6 port = htons (conf->udp_port);
177 pcg 1.5 return true;
178     }
179    
180     if (conf
181     && prot_ & PROT_TCPv4
182     && conf->protocols & PROT_TCPv4
183     && conf->tcp_port)
184     {
185     prot = prot_;
186 pcg 1.6 port = htons (conf->tcp_port);
187 pcg 1.5 return true;
188     }
189     }
190    
191     return false;
192     }
193    
194 pcg 1.4 bool
195     operator == (const sockinfo &a, const sockinfo &b)
196     {
197     return a.host == b.host && a.port == b.port && a.prot == b.prot;
198     }
199    
200     bool
201     operator < (const sockinfo &a, const sockinfo &b)
202     {
203     return a.host < b.host
204     || (a.host == b.host && (a.port < b.port
205     || (a.port == b.port && a.prot < b.prot)));
206 pcg 1.1 }
207