summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ftp-proxy/ftp-proxy.c
diff options
context:
space:
mode:
authormikeb <mikeb@openbsd.org>2011-04-28 00:17:28 +0000
committermikeb <mikeb@openbsd.org>2011-04-28 00:17:28 +0000
commit48ed0d113ab6191e50b1830ff930afcccf8457e6 (patch)
treea4f6f55a30712c65fabe94350fa4d9392610e323 /usr.sbin/ftp-proxy/ftp-proxy.c
parentFix a few off-by-1 errors in atascsi. (diff)
downloadwireguard-openbsd-48ed0d113ab6191e50b1830ff930afcccf8457e6.tar.xz
wireguard-openbsd-48ed0d113ab6191e50b1830ff930afcccf8457e6.zip
switch ftp-proxy over to divert-to instead of rdr-to. this avoids
an expensive state lookup (via natlook ioctl) and shrinks the code. tested by me and sthen, ok reyk sthen
Diffstat (limited to 'usr.sbin/ftp-proxy/ftp-proxy.c')
-rw-r--r--usr.sbin/ftp-proxy/ftp-proxy.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/usr.sbin/ftp-proxy/ftp-proxy.c b/usr.sbin/ftp-proxy/ftp-proxy.c
index 0b8fbede6ab..2a56df3406e 100644
--- a/usr.sbin/ftp-proxy/ftp-proxy.c
+++ b/usr.sbin/ftp-proxy/ftp-proxy.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ftp-proxy.c,v 1.21 2011/03/25 14:51:31 claudio Exp $ */
+/* $OpenBSD: ftp-proxy.c,v 1.22 2011/04/28 00:17:28 mikeb Exp $ */
/*
* Copyright (c) 2004, 2005 Camiel Dobbelaar, <cd@sentia.nl>
@@ -374,7 +374,7 @@ handle_connection(const int listen_fd, short event, void *ev)
{
struct sockaddr_storage tmp_ss;
struct sockaddr *client_sa, *server_sa, *fixed_server_sa;
- struct sockaddr *client_to_proxy_sa, *proxy_to_server_sa;
+ struct sockaddr *proxy_to_server_sa;
struct session *s;
socklen_t len;
int client_fd, fc, on;
@@ -411,7 +411,6 @@ handle_connection(const int listen_fd, short event, void *ev)
/* Cast it once, and be done with it. */
client_sa = sstosa(&s->client_ss);
server_sa = sstosa(&s->server_ss);
- client_to_proxy_sa = sstosa(&tmp_ss);
proxy_to_server_sa = sstosa(&s->proxy_ss);
fixed_server_sa = sstosa(&fixed_server_ss);
@@ -423,14 +422,17 @@ handle_connection(const int listen_fd, short event, void *ev)
* Find out the real server and port that the client wanted.
*/
len = sizeof(struct sockaddr_storage);
- if ((getsockname(s->client_fd, client_to_proxy_sa, &len)) < 0) {
+ if (getsockname(s->client_fd, server_sa, &len) < 0) {
logmsg(LOG_CRIT, "#%d getsockname failed: %s", s->id,
strerror(errno));
goto fail;
}
- if (server_lookup(client_sa, client_to_proxy_sa, server_sa,
- &s->client_rd) != 0) {
- logmsg(LOG_CRIT, "#%d server lookup failed (no rdr?)", s->id);
+ len = sizeof(s->client_rd);
+ if (client_sa->sa_family == AF_INET &&
+ getsockopt(s->client_fd, IPPROTO_IP, SO_RTABLE, &s->client_rd,
+ &len)) {
+ logmsg(LOG_CRIT, "#%d getsockopt failed: %s", s->id,
+ strerror(errno));
goto fail;
}
if (fixed_server) {