summaryrefslogtreecommitdiff
path: root/src/usr.bin/nc/socks.c
diff options
context:
space:
mode:
authormarkus <>2002-02-28 18:05:36 +0000
committermarkus <>2002-02-28 18:05:36 +0000
commit409c42a31740ca9da36e066b8f180e668520958c (patch)
tree9bb91c8654057cd73f96714ebbe6969bb46707dc /src/usr.bin/nc/socks.c
parentea9376d8ab0390826e5a195af0edfa4014c15cef (diff)
downloadopenbsd-409c42a31740ca9da36e066b8f180e668520958c.tar.gz
openbsd-409c42a31740ca9da36e066b8f180e668520958c.tar.bz2
openbsd-409c42a31740ca9da36e066b8f180e668520958c.zip
add support for SOCKS4 with option -X socks_version, default is 5; ok ericj@
Diffstat (limited to 'src/usr.bin/nc/socks.c')
-rw-r--r--src/usr.bin/nc/socks.c106
1 files changed, 66 insertions, 40 deletions
diff --git a/src/usr.bin/nc/socks.c b/src/usr.bin/nc/socks.c
index a68e36af06..af0fe29cff 100644
--- a/src/usr.bin/nc/socks.c
+++ b/src/usr.bin/nc/socks.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: socks.c,v 1.4 2002/02/19 22:42:04 ericj Exp $ */ 1/* $OpenBSD: socks.c,v 1.5 2002/02/28 18:05:36 markus Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1999 Niklas Hallqvist. All rights reserved. 4 * Copyright (c) 1999 Niklas Hallqvist. All rights reserved.
@@ -42,7 +42,8 @@
42#include <unistd.h> 42#include <unistd.h>
43 43
44#define SOCKS_PORT "1080" 44#define SOCKS_PORT "1080"
45#define SOCKS_VERSION 5 45#define SOCKS_V5 5
46#define SOCKS_V4 4
46#define SOCKS_NOAUTH 0 47#define SOCKS_NOAUTH 0
47#define SOCKS_NOMETHOD 0xff 48#define SOCKS_NOMETHOD 0xff
48#define SOCKS_CONNECT 1 49#define SOCKS_CONNECT 1
@@ -84,7 +85,8 @@ decode_port (const char *s)
84 85
85int 86int
86socks_connect (char *host, char *port, struct addrinfo hints, 87socks_connect (char *host, char *port, struct addrinfo hints,
87 char *proxyhost, char *proxyport, struct addrinfo proxyhints) 88 char *proxyhost, char *proxyport, struct addrinfo proxyhints,
89 int socksv)
88{ 90{
89 int proxyfd; 91 int proxyfd;
90 unsigned char buf[SOCKS_MAXCMDSZ]; 92 unsigned char buf[SOCKS_MAXCMDSZ];
@@ -103,43 +105,67 @@ socks_connect (char *host, char *port, struct addrinfo hints,
103 serveraddr = decode_addr (host); 105 serveraddr = decode_addr (host);
104 serverport = decode_port (port); 106 serverport = decode_port (port);
105 107
106 /* Version 5, one method: no authentication */ 108 if (socksv == 5) {
107 buf[0] = SOCKS_VERSION; 109 /* Version 5, one method: no authentication */
108 buf[1] = 1; 110 buf[0] = SOCKS_V5;
109 buf[2] = SOCKS_NOAUTH; 111 buf[1] = 1;
110 cnt = write (proxyfd, buf, 3); 112 buf[2] = SOCKS_NOAUTH;
111 if (cnt == -1) 113 cnt = write (proxyfd, buf, 3);
112 err (1, "write failed"); 114 if (cnt == -1)
113 if (cnt != 3) 115 err (1, "write failed");
114 errx (1, "short write, %d (expected 3)", cnt); 116 if (cnt != 3)
115 117 errx (1, "short write, %d (expected 3)", cnt);
116 read (proxyfd, buf, 2); 118
117 if (buf[1] == SOCKS_NOMETHOD) 119 read (proxyfd, buf, 2);
118 errx (1, "authentication method negotiation failed"); 120 if (buf[1] == SOCKS_NOMETHOD)
119 121 errx (1, "authentication method negotiation failed");
120 /* Version 5, connect: IPv4 address */ 122
121 buf[0] = SOCKS_VERSION; 123 /* Version 5, connect: IPv4 address */
122 buf[1] = SOCKS_CONNECT; 124 buf[0] = SOCKS_V5;
123 buf[2] = 0; 125 buf[1] = SOCKS_CONNECT;
124 buf[3] = SOCKS_IPV4; 126 buf[2] = 0;
125 memcpy (buf + 4, &serveraddr, sizeof serveraddr); 127 buf[3] = SOCKS_IPV4;
126 memcpy (buf + 8, &serverport, sizeof serverport); 128 memcpy (buf + 4, &serveraddr, sizeof serveraddr);
127 129 memcpy (buf + 8, &serverport, sizeof serverport);
128 /* XXX Handle short writes better */ 130
129 cnt = write (proxyfd, buf, 10); 131 /* XXX Handle short writes better */
130 if (cnt == -1) 132 cnt = write (proxyfd, buf, 10);
131 err (1, "write failed"); 133 if (cnt == -1)
132 if (cnt != 10) 134 err (1, "write failed");
133 errx (1, "short write, %d (expected 10)", cnt); 135 if (cnt != 10)
134 136 errx (1, "short write, %d (expected 10)", cnt);
135 /* XXX Handle short reads better */ 137
136 cnt = read (proxyfd, buf, sizeof buf); 138 /* XXX Handle short reads better */
137 if (cnt == -1) 139 cnt = read (proxyfd, buf, sizeof buf);
138 err (1, "read failed"); 140 if (cnt == -1)
139 if (cnt != 10) 141 err (1, "read failed");
140 errx (1, "unexpected reply size %d (expected 10)", cnt); 142 if (cnt != 10)
141 if (buf[1] != 0) 143 errx (1, "unexpected reply size %d (expected 10)", cnt);
142 errx (1, "connection failed, SOCKS error %d", buf[1]); 144 if (buf[1] != 0)
145 errx (1, "connection failed, SOCKS error %d", buf[1]);
146 } else {
147 /* Version 4 */
148 buf[0] = SOCKS_V4;
149 buf[1] = SOCKS_CONNECT; /* connect */
150 memcpy (buf + 2, &serverport, sizeof serverport);
151 memcpy (buf + 4, &serveraddr, sizeof serveraddr);
152 buf[8] = 0; /* empty username */
153
154 cnt = write (proxyfd, buf, 9);
155 if (cnt == -1)
156 err (1, "write failed");
157 if (cnt != 9)
158 errx (1, "short write, %d (expected 9)", cnt);
159
160 /* XXX Handle short reads better */
161 cnt = read (proxyfd, buf, 8);
162 if (cnt == -1)
163 err (1, "read failed");
164 if (cnt != 8)
165 errx (1, "unexpected reply size %d (expected 8)", cnt);
166 if (buf[1] != 90)
167 errx (1, "connection failed, SOCKS error %d", buf[1]);
168 }
143 169
144 return proxyfd; 170 return proxyfd;
145} 171}