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 */