]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/util/IOUtils.java
Workaround possible GraalVM issue
[signal-cli] / src / main / java / org / asamk / signal / util / IOUtils.java
index b4c4c6dd883f1ea24cc81df9ed99283e62078971..2d4ffd8efe4d225502b4d7489bb42471fac6da8b 100644 (file)
@@ -39,6 +39,11 @@ public class IOUtils {
     private IOUtils() {
     }
 
+    public static Charset getConsoleCharset() {
+        final var console = System.console();
+        return console == null ? Charset.defaultCharset() : console.charset();
+    }
+
     public static String readAll(InputStream in, Charset charset) throws IOException {
         var output = new StringWriter();
         var buffer = new byte[4096];
@@ -98,23 +103,29 @@ public class IOUtils {
     public static InetSocketAddress parseInetSocketAddress(final String tcpAddress) throws UserErrorException {
         final var colonIndex = tcpAddress.lastIndexOf(':');
         if (colonIndex < 0) {
-            throw new UserErrorException("Invalid tcp bind address: " + tcpAddress);
+            throw new UserErrorException("Invalid tcp bind address (expected host:port): " + tcpAddress);
         }
-        final String host = tcpAddress.substring(0, colonIndex);
+        final var host = tcpAddress.substring(0, colonIndex);
+        final var portString = tcpAddress.substring(colonIndex + 1);
+
         final int port;
         try {
-            port = Integer.parseInt(tcpAddress.substring(colonIndex + 1));
+            port = Integer.parseInt(portString);
         } catch (NumberFormatException e) {
-            throw new UserErrorException("Invalid tcp bind address: " + tcpAddress, e);
+            throw new UserErrorException("Invalid tcp port: " + portString, e);
+        }
+        final var socketAddress = new InetSocketAddress(host, port);
+        if (socketAddress.isUnresolved()) {
+            throw new UserErrorException("Invalid tcp bind address, invalid host: " + host);
         }
-        return new InetSocketAddress(host, port);
+        return socketAddress;
     }
 
     public static UnixDomainPrincipal getUnixDomainPrincipal(final SocketChannel channel) throws IOException {
         UnixDomainPrincipal principal = null;
         try {
             principal = channel.getOption(ExtendedSocketOptions.SO_PEERCRED);
-        } catch (UnsupportedOperationException ignored) {
+        } catch (UnsupportedOperationException | NoClassDefFoundError ignored) {
         }
         return principal;
     }
@@ -130,7 +141,7 @@ public class IOUtils {
             logger.info("Listening on socket: " + address);
             postBind(address);
         } catch (IOException e) {
-            throw new IOErrorException("Failed to bind socket: " + e.getMessage(), e);
+            throw new IOErrorException("Failed to bind socket " + address + ": " + e.getMessage(), e);
         }
         return serverChannel;
     }