38
38
#include < stdlib.h>
39
39
#include < unistd.h>
40
40
41
+ #include < rdr/Exception.h>
42
+
41
43
#include < network/TcpSocket.h>
44
+
42
45
#include < rfb/LogWriter.h>
43
46
#include < rfb/Configuration.h>
44
47
#include < rfb/util.h>
@@ -82,15 +85,15 @@ int network::findFreeTcpPort (void)
82
85
addr.sin_addr .s_addr = INADDR_ANY;
83
86
84
87
if ((sock = socket (AF_INET, SOCK_STREAM, 0 )) < 0 )
85
- throw SocketException (" unable to create socket" , errorNumber);
88
+ throw socket_error (" unable to create socket" , errorNumber);
86
89
87
90
addr.sin_port = 0 ;
88
91
if (bind (sock, (struct sockaddr *)&addr, sizeof (addr)) < 0 )
89
- throw SocketException (" unable to find free port" , errorNumber);
92
+ throw socket_error (" unable to find free port" , errorNumber);
90
93
91
94
socklen_t n = sizeof (addr);
92
95
if (getsockname (sock, (struct sockaddr *)&addr, &n) < 0 )
93
- throw SocketException (" unable to get port number" , errorNumber);
96
+ throw socket_error (" unable to get port number" , errorNumber);
94
97
95
98
closesocket (sock);
96
99
return ntohs (addr.sin_port );
@@ -134,7 +137,7 @@ TcpSocket::TcpSocket(const char *host, int port)
134
137
hints.ai_next = nullptr ;
135
138
136
139
if ((result = getaddrinfo (host, nullptr , &hints, &ai)) != 0 ) {
137
- throw GAIException (" unable to resolve host by name" , result);
140
+ throw getaddrinfo_error (" unable to resolve host by name" , result);
138
141
}
139
142
140
143
sock = -1 ;
@@ -175,7 +178,7 @@ TcpSocket::TcpSocket(const char *host, int port)
175
178
if (sock == -1 ) {
176
179
err = errorNumber;
177
180
freeaddrinfo (ai);
178
- throw SocketException (" unable to create socket" , err);
181
+ throw socket_error (" unable to create socket" , err);
179
182
}
180
183
181
184
/* Attempt to connect to the remote host */
@@ -200,9 +203,9 @@ TcpSocket::TcpSocket(const char *host, int port)
200
203
201
204
if (sock == -1 ) {
202
205
if (err == 0 )
203
- throw Exception (" No useful address for host" );
206
+ throw std::runtime_error (" No useful address for host" );
204
207
else
205
- throw SocketException (" unable to connect to socket" , err);
208
+ throw socket_error (" unable to connect to socket" , err);
206
209
}
207
210
208
211
// Take proper ownership of the socket
@@ -299,15 +302,15 @@ TcpListener::TcpListener(const struct sockaddr *listenaddr,
299
302
int sock;
300
303
301
304
if ((sock = socket (listenaddr->sa_family , SOCK_STREAM, 0 )) < 0 )
302
- throw SocketException (" unable to create listening socket" , errorNumber);
305
+ throw socket_error (" unable to create listening socket" , errorNumber);
303
306
304
307
memcpy (&sa, listenaddr, listenaddrlen);
305
308
#ifdef IPV6_V6ONLY
306
309
if (listenaddr->sa_family == AF_INET6) {
307
310
if (setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&one, sizeof (one))) {
308
311
int e = errorNumber;
309
312
closesocket (sock);
310
- throw SocketException (" unable to set IPV6_V6ONLY" , e);
313
+ throw socket_error (" unable to set IPV6_V6ONLY" , e);
311
314
}
312
315
}
313
316
#endif /* defined(IPV6_V6ONLY) */
@@ -325,14 +328,14 @@ TcpListener::TcpListener(const struct sockaddr *listenaddr,
325
328
(char *)&one, sizeof (one)) < 0 ) {
326
329
int e = errorNumber;
327
330
closesocket (sock);
328
- throw SocketException (" unable to create listening socket" , e);
331
+ throw socket_error (" unable to create listening socket" , e);
329
332
}
330
333
#endif
331
334
332
335
if (bind (sock, &sa.u .sa , listenaddrlen) == -1 ) {
333
336
int e = errorNumber;
334
337
closesocket (sock);
335
- throw SocketException (" failed to bind socket" , e);
338
+ throw socket_error (" failed to bind socket" , e);
336
339
}
337
340
338
341
listen (sock);
@@ -443,7 +446,7 @@ void network::createTcpListeners(std::list<SocketListener*> *listeners,
443
446
snprintf (service, sizeof (service) - 1 , " %d" , port);
444
447
service[sizeof (service) - 1 ] = ' \0 ' ;
445
448
if ((result = getaddrinfo (addr, service, &hints, &ai)) != 0 )
446
- throw GAIException (" unable to resolve listening address" , result);
449
+ throw getaddrinfo_error (" unable to resolve listening address" , result);
447
450
448
451
try {
449
452
createTcpListeners (listeners, ai);
@@ -482,7 +485,7 @@ void network::createTcpListeners(std::list<SocketListener*> *listeners,
482
485
try {
483
486
new_listeners.push_back (new TcpListener (current->ai_addr ,
484
487
current->ai_addrlen ));
485
- } catch (SocketException & e) {
488
+ } catch (socket_error & e) {
486
489
// Ignore this if it is due to lack of address family support on
487
490
// the interface or on the system
488
491
if (e.err != EADDRNOTAVAIL && e.err != EAFNOSUPPORT) {
@@ -607,7 +610,7 @@ TcpFilter::Pattern TcpFilter::parsePattern(const char* p) {
607
610
608
611
parts = rfb::split (&p[1 ], ' /' );
609
612
if (parts.size () > 2 )
610
- throw Exception (" invalid filter specified" );
613
+ throw std::invalid_argument (" invalid filter specified" );
611
614
612
615
if (parts[0 ].empty ()) {
613
616
// Match any address
@@ -630,7 +633,7 @@ TcpFilter::Pattern TcpFilter::parsePattern(const char* p) {
630
633
}
631
634
632
635
if ((result = getaddrinfo (parts[0 ].c_str (), nullptr , &hints, &ai)) != 0 ) {
633
- throw GAIException (" unable to resolve host by name" , result);
636
+ throw getaddrinfo_error (" unable to resolve host by name" , result);
634
637
}
635
638
636
639
memcpy (&pattern.address .u .sa , ai->ai_addr , ai->ai_addrlen );
@@ -641,8 +644,8 @@ TcpFilter::Pattern TcpFilter::parsePattern(const char* p) {
641
644
if (parts.size () > 1 ) {
642
645
if (family == AF_INET &&
643
646
(parts[1 ].find (' .' ) != std::string::npos)) {
644
- throw Exception (" mask no longer supported for filter, "
645
- " use prefix instead" );
647
+ throw std::invalid_argument (" mask no longer supported for "
648
+ " filter, use prefix instead" );
646
649
}
647
650
648
651
pattern.prefixlen = (unsigned int ) atoi (parts[1 ].c_str ());
@@ -655,16 +658,17 @@ TcpFilter::Pattern TcpFilter::parsePattern(const char* p) {
655
658
pattern.prefixlen = 128 ;
656
659
break ;
657
660
default :
658
- throw Exception (" unknown address family" );
661
+ throw std::runtime_error (" unknown address family" );
659
662
}
660
663
}
661
664
}
662
665
663
666
family = pattern.address .u .sa .sa_family ;
664
667
665
668
if (pattern.prefixlen > (family == AF_INET ? 32 : 128 ))
666
- throw Exception (" invalid prefix length for filter address: %u" ,
667
- pattern.prefixlen );
669
+ throw std::invalid_argument (rfb::format (" invalid prefix length for "
670
+ " filter address: %u" ,
671
+ pattern.prefixlen ));
668
672
669
673
// Compute mask from address and prefix length
670
674
memset (&pattern.mask , 0 , sizeof (pattern.mask ));
0 commit comments