]> source.dussan.org Git - tigervnc.git/commitdiff
Throw GAIException() for getaddrinfo errors 973/head
authorAlex Tanskanen <aleta@cendio.com>
Tue, 10 Mar 2020 12:33:01 +0000 (13:33 +0100)
committerAlex Tanskanen <aleta@cendio.com>
Tue, 17 Mar 2020 13:46:20 +0000 (14:46 +0100)
Created a new subclass of Exception called GAIException() that will
handle error messages from getaddrinfo() instead of letting Exception()
handle it. GAIException() will make use of gai_strerror() to map the
error code to text. On Windows, gai_strerrorW() must be used if the text
is encoded with UTF-8.

common/network/TcpSocket.cxx
common/rdr/Exception.cxx
common/rdr/Exception.h

index f5d92e25de92639dd9f2b817559438bee86b5b73..07c8d2cdc1394bd5c2043f47ce065ee21264085b 100644 (file)
@@ -133,8 +133,7 @@ TcpSocket::TcpSocket(const char *host, int port)
   hints.ai_next = NULL;
 
   if ((result = getaddrinfo(host, NULL, &hints, &ai)) != 0) {
-    throw Exception("unable to resolve host by name: %s",
-                    gai_strerror(result));
+    throw GAIException("unable to resolve host by name", result);
   }
 
   sock = -1;
@@ -452,8 +451,7 @@ void network::createTcpListeners(std::list<SocketListener*> *listeners,
   snprintf (service, sizeof (service) - 1, "%d", port);
   service[sizeof (service) - 1] = '\0';
   if ((result = getaddrinfo(addr, service, &hints, &ai)) != 0)
-    throw rdr::Exception("unable to resolve listening address: %s",
-                         gai_strerror(result));
+    throw GAIException("unable to resolve listening address", result);
 
   try {
     createTcpListeners(listeners, ai);
@@ -645,8 +643,7 @@ TcpFilter::Pattern TcpFilter::parsePattern(const char* p) {
     }
 
     if ((result = getaddrinfo (p, NULL, &hints, &ai)) != 0) {
-      throw Exception("unable to resolve host by name: %s",
-                      gai_strerror(result));
+      throw GAIException("unable to resolve host by name", result);
     }
 
     memcpy (&pattern.address.u.sa, ai->ai_addr, ai->ai_addrlen);
index e0592b290c40f463cd61b6177cd07b918cfaad18..9b6096b66da65af05ed95252b08e58cc6ac8b6b2 100644 (file)
@@ -31,6 +31,9 @@
 #include <tchar.h>
 #include <winsock2.h>
 #include <windows.h>
+#include <ws2tcpip.h>
+#else
+#include <netdb.h>
 #endif
 
 #include <string.h>
@@ -49,6 +52,21 @@ Exception::Exception(const char *format, ...) {
        va_end(ap);
 }
 
+GAIException::GAIException(const char* s, int err)
+  : Exception("%s", s)
+{
+  strncat(str_, ": ", len-1-strlen(str_));
+#ifdef _WIN32
+  wchar_t currStr[len-strlen(str_)];
+  wcsncpy(currStr, gai_strerrorW(err), len-1-strlen(str_));
+  WideCharToMultiByte(CP_UTF8, 0, currStr, -1, str_+strlen(str_),
+                      len-1-strlen(str_), 0, 0);
+#else
+  //FIXME: perhaps print the error number (NNNN)
+  strncat(str_, gai_strerror(err), len-1-strlen(str_));
+#endif
+}
+
 SystemException::SystemException(const char* s, int err_)
   : Exception("%s", s), err(err_)
 {
index 69abbedb75aa7bd8c9346f98f4f1ce24e183c8c7..eb3c8a9dd30dade21e1850ad854de126c13375e4 100644 (file)
@@ -40,12 +40,17 @@ namespace rdr {
   struct SystemException : public Exception {
     int err;
     SystemException(const char* s, int err_);
-  }; 
+  };
+
+  struct GAIException : public Exception {
+    int err;
+    GAIException(const char* s, int err_);
+  };
 
   struct TimedOut : public Exception {
     TimedOut() : Exception("Timed out") {}
   };
+
   struct EndOfStream : public Exception {
     EndOfStream() : Exception("End of stream") {}
   };