
  https://github.com/shellinabox/shellinabox/pull/406/commits/dce1dfd6b57fb71a6c85a7e29199f1e10269253a

diff --git a/libhttp/httpconnection.c b/libhttp/httpconnection.c
index 95648e7..b012a18 100644
--- a/libhttp/httpconnection.c
+++ b/libhttp/httpconnection.c
@@ -288,33 +288,40 @@ static void httpDestroyHeaders(void *arg ATTR_UNUSED, char *key, char *value) {
 }
 
 static char *getPeerName(int fd, int *port, int numericHosts) {
-  struct sockaddr peerAddr;
+  struct sockaddr_storage peerAddr;
   socklen_t sockLen = sizeof(peerAddr);
-  if (getpeername(fd, &peerAddr, &sockLen)) {
+
+  if (getpeername(fd, (struct sockaddr*)&peerAddr, &sockLen)) {
     if (port) {
       *port         = -1;
     }
     return NULL;
   }
+
+  char ipaddr[INET6_ADDRSTRLEN];
   char *ret;
-  if (peerAddr.sa_family == AF_UNIX) {
+  if (peerAddr.ss_family == AF_INET) {
+    struct sockaddr_in *s = (struct sockaddr_in *)&peerAddr;
+    *port = ntohs(s->sin_port);
+    inet_ntop(AF_INET, &s->sin_addr, ipaddr, sizeof ipaddr);
+  } else if (peerAddr.ss_family == AF_INET6) {
+    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&peerAddr;
+    *port = ntohs(s->sin6_port);
+    inet_ntop(AF_INET6, &s->sin6_addr, ipaddr, sizeof ipaddr);
+  } else { // AF_UNIX
     if (port) {
       *port         = 0;
     }
     check(ret       = strdup("localhost"));
     return ret;
   }
-  char host[256];
-  if (numericHosts ||
-      getnameinfo(&peerAddr, sockLen, host, sizeof(host), NULL, 0, NI_NOFQDN)){
-    check(inet_ntop(peerAddr.sa_family,
-                    &((struct sockaddr_in *)&peerAddr)->sin_addr,
-                    host, sizeof(host)));
-  }
-  if (port) {
-    *port           = ntohs(((struct sockaddr_in *)&peerAddr)->sin_port);
+
+  char host[1024];
+  if (numericHosts || getnameinfo((struct sockaddr *)&peerAddr, sockLen, host, sizeof(host), 0, 0, NI_NOFQDN)) {
+    check(ret         = strdup(ipaddr));
+  } else {
+    check(ret         = strdup(host));
   }
-  check(ret         = strdup(host));
   return ret;
 }
 
diff --git a/libhttp/server.c b/libhttp/server.c
index d19a3a0..bd06344 100644
--- a/libhttp/server.c
+++ b/libhttp/server.c
@@ -333,14 +333,14 @@ void initServer(struct Server *server, int localhostOnly, int portMin,
     return;
   }
 
-  server->serverFd              = socket(PF_INET, SOCK_STREAM, 0);
+  server->serverFd              = socket(PF_INET6, SOCK_STREAM, 0);
   check(server->serverFd >= 0);
   check(!setsockopt(server->serverFd, SOL_SOCKET, SO_REUSEADDR,
                     &true, sizeof(true)));
-  struct sockaddr_in serverAddr = { 0 };
-  serverAddr.sin_family         = AF_INET;
-  serverAddr.sin_addr.s_addr    = htonl(localhostOnly
-                                        ? INADDR_LOOPBACK : INADDR_ANY);
+  struct sockaddr_in6 serverAddr = { 0 };
+  serverAddr.sin6_family         = AF_INET6;
+  serverAddr.sin6_addr           = localhostOnly
+                                        ? in6addr_loopback : in6addr_any;
 
   // Linux unlike BSD does not have support for picking a local port range.
   // So, we have to randomly pick a port from our allowed port range, and then
@@ -355,14 +355,14 @@ void initServer(struct Server *server, int localhostOnly, int portMin,
     int portStart               = rand() % (portMax - portMin + 1) + portMin;
     for (int p = 0; p <= portMax-portMin; p++) {
       int port                  = (p+portStart)%(portMax-portMin+1)+ portMin;
-      serverAddr.sin_port       = htons(port);
+      serverAddr.sin6_port      = htons(port);
       if (!bind(server->serverFd, (struct sockaddr *)&serverAddr,
                 sizeof(serverAddr))) {
         break;
       }
-      serverAddr.sin_port       = 0;
+      serverAddr.sin6_port      = 0;
     }
-    if (!serverAddr.sin_port) {
+    if (!serverAddr.sin6_port) {
       fatal("[server] Failed to find any available port!");
     }
   }
@@ -372,7 +372,7 @@ void initServer(struct Server *server, int localhostOnly, int portMin,
   check(!getsockname(server->serverFd, (struct sockaddr *)&serverAddr,
                      &socklen));
   check(socklen == sizeof(serverAddr));
-  server->port                  = ntohs(serverAddr.sin_port);
+  server->port                  = ntohs(serverAddr.sin6_port);
   info("[server] Listening on port %d...", server->port);
 
   check(server->pollFds         = malloc(sizeof(struct pollfd)));
diff --git a/shellinabox/launcher.c b/shellinabox/launcher.c
index ba54b36..3108afa 100644
--- a/shellinabox/launcher.c
+++ b/shellinabox/launcher.c
@@ -1827,7 +1827,7 @@ static void launcherDaemon(int fd) {
       if (!((*s >= '0' && *s <= '9') ||
             (*s >= 'A' && *s <= 'Z') ||
             (*s >= 'a' && *s <= 'z') ||
-             *s == '.' || *s == '-')) {
+             *s == '.' || *s == '-' || *s == ':')) {
         *s                    = '-';
       }
     }
