diff options
author | markus <> | 2002-02-28 18:05:36 +0000 |
---|---|---|
committer | markus <> | 2002-02-28 18:05:36 +0000 |
commit | 409c42a31740ca9da36e066b8f180e668520958c (patch) | |
tree | 9bb91c8654057cd73f96714ebbe6969bb46707dc /src/usr.bin/nc/socks.c | |
parent | ea9376d8ab0390826e5a195af0edfa4014c15cef (diff) | |
download | openbsd-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.c | 106 |
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 | ||
85 | int | 86 | int |
86 | socks_connect (char *host, char *port, struct addrinfo hints, | 87 | socks_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 | } |