diff options
| author | 2011-04-28 00:17:28 +0000 | |
|---|---|---|
| committer | 2011-04-28 00:17:28 +0000 | |
| commit | 48ed0d113ab6191e50b1830ff930afcccf8457e6 (patch) | |
| tree | a4f6f55a30712c65fabe94350fa4d9392610e323 /usr.sbin/ftp-proxy/ftp-proxy.c | |
| parent | Fix a few off-by-1 errors in atascsi. (diff) | |
| download | wireguard-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.c | 16 |
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) { |
