When an nc SOCKS connection fails, you get an error message like this:

> connection failed, SOCKS error 6

Obviously, this would be clearer with error strings.

ok?


Index: socks.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/socks.c,v
retrieving revision 1.21
diff -u -p -r1.21 socks.c
--- socks.c     26 Mar 2015 21:19:51 -0000      1.21
+++ socks.c     1 Dec 2015 02:31:46 -0000
@@ -122,6 +122,43 @@ getproxypass(const char *proxyuser, cons
        return (pw);
 }
 
+/*
+ * Error strings adapted from the generally accepted SOCKSv4 spec:
+ *
+ * http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
+ */
+static const char *
+socks4_strerror(int e)
+{
+       switch (e) {
+       case 90: return "Succeeded";
+       case 91: return "Request rejected or failed";
+       case 92: return "SOCKS server cannot connect to identd on the client";
+       case 93: return "Client program and identd report different user-ids";
+       default: return "Unknown error";
+       }
+}
+
+/*
+ * Error strings taken almost directly from RFC 1928.
+ */
+static const char *
+socks5_strerror(int e)
+{
+       switch (e) {
+       case 0: return "Succeeded";
+       case 1: return "General SOCKS server failure";
+       case 2: return "Connection not allowed by ruleset";
+       case 3: return "Network unreachable";
+       case 4: return "Host unreachable";
+       case 5: return "Connection refused";
+       case 6: return "TTL expired";
+       case 7: return "Command not supported";
+       case 8: return "Address type not supported";
+       default: return "Unknown error";
+       }
+}
+
 int
 socks_connect(const char *host, const char *port,
     struct addrinfo hints __attribute__ ((__unused__)),
@@ -225,8 +262,10 @@ socks_connect(const char *host, const ch
                cnt = atomicio(read, proxyfd, buf, 4);
                if (cnt != 4)
                        err(1, "read failed (%zu/4)", cnt);
-               if (buf[1] != 0)
-                       errx(1, "connection failed, SOCKS error %d", buf[1]);
+               if (buf[1] != 0) {
+                       errx(1, "connection failed, SOCKS error: %s",
+                           socks5_strerror(buf[1]));
+               }
                switch (buf[3]) {
                case SOCKS_IPV4:
                        cnt = atomicio(read, proxyfd, buf + 4, 6);
@@ -261,8 +300,10 @@ socks_connect(const char *host, const ch
                cnt = atomicio(read, proxyfd, buf, 8);
                if (cnt != 8)
                        err(1, "read failed (%zu/8)", cnt);
-               if (buf[1] != 90)
-                       errx(1, "connection failed, SOCKS error %d", buf[1]);
+               if (buf[1] != 90) {
+                       errx(1, "connection failed, SOCKS error: %s",
+                           socks4_strerror(buf[1]));
+               }
        } else if (socksv == -1) {
                /* HTTP proxy CONNECT */
 

Reply via email to