You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2002/07/17 19:56:00 UTC
cvs commit: httpd-2.0/modules/proxy proxy_ftp.c
trawick 2002/07/17 10:55:59
Modified: . CHANGES
modules/proxy proxy_ftp.c
Log:
Get proxy ftp to work over IPv6.
Submitted by: Shoichi Sakane <sa...@kame.net>
Reviewed and modified slightly by: Jeff Trawick
Revision Changes Path
1.868 +2 -0 httpd-2.0/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/httpd-2.0/CHANGES,v
retrieving revision 1.867
retrieving revision 1.868
diff -u -r1.867 -r1.868
--- CHANGES 16 Jul 2002 18:33:05 -0000 1.867
+++ CHANGES 17 Jul 2002 17:55:58 -0000 1.868
@@ -1,5 +1,7 @@
Changes with Apache 2.0.40
+ *) Get proxy ftp to work over IPv6. [Shoichi Sakane <sa...@kame.net>]
+
*) Look for OpenSSL libraries in /usr/lib64. [Peter Poeml <po...@suse.de>]
*) Update SuSE layout. [Peter Poeml <po...@suse.de>]
1.129 +40 -49 httpd-2.0/modules/proxy/proxy_ftp.c
Index: proxy_ftp.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_ftp.c,v
retrieving revision 1.128
retrieving revision 1.129
diff -u -r1.128 -r1.129
--- proxy_ftp.c 15 Jul 2002 08:05:10 -0000 1.128
+++ proxy_ftp.c 17 Jul 2002 17:55:59 -0000 1.129
@@ -942,43 +942,6 @@
connectname, NULL));
}
-
- if ((rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "proxy: FTP: error creating socket");
- return HTTP_INTERNAL_SERVER_ERROR;
- }
-
-#if !defined(TPF) && !defined(BEOS)
- if (conf->recv_buffer_size > 0
- && (rv = apr_socket_opt_set(sock, APR_SO_RCVBUF,
- conf->recv_buffer_size))) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "apr_socket_opt_set(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
- }
-#endif
-
- if ((rv = apr_socket_opt_set(sock, APR_SO_REUSEADDR, one))
- != APR_SUCCESS) {
-#ifndef _OSD_POSIX /* BS2000 has this option "always on" */
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "proxy: FTP: error setting reuseaddr option: apr_socket_opt_set(SO_REUSEADDR)");
- return HTTP_INTERNAL_SERVER_ERROR;
-#endif /* _OSD_POSIX */
- }
-
- /* Set a timeout on the socket */
- if (conf->timeout_set == 1) {
- apr_socket_timeout_set(sock, conf->timeout);
- }
- else {
- apr_socket_timeout_set(sock, r->server->timeout);
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "proxy: FTP: socket has been created");
-
-
/*
* At this point we have a list of one or more IP addresses of the
* machine to connect to. If configured, reorder this list so that the
@@ -994,20 +957,48 @@
int failed = 1;
while (connect_addr) {
- /* FIXME: @@@: We created an APR_INET socket. Now there may be
- * IPv6 (AF_INET6) DNS addresses in the list... IMO the socket
- * should be created with the correct family in the first place.
- * (either do it in this loop, or make at least two attempts
- * with the AF_INET and AF_INET6 elements in the list)
- */
+ if ((rv = apr_socket_create(&sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+ "proxy: FTP: error creating socket");
+ continue;
+ }
+
+#if !defined(TPF) && !defined(BEOS)
+ if (conf->recv_buffer_size > 0
+ && (rv = apr_socket_opt_set(sock, APR_SO_RCVBUF,
+ conf->recv_buffer_size))) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+ "apr_socket_opt_set(APR_SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
+ }
+#endif
+
+ if (APR_SUCCESS != (rv = apr_socket_opt_set(sock, APR_SO_REUSEADDR, one))) {
+ apr_socket_close(sock);
+#ifndef _OSD_POSIX /* BS2000 has this option "always on" */
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+ "proxy: FTP: error setting reuseaddr option: apr_socket_opt_set(APR_SO_REUSEADDR)");
+ continue;
+#endif /* _OSD_POSIX */
+ }
+
+ /* Set a timeout on the socket */
+ if (conf->timeout_set == 1) {
+ apr_socket_timeout_set(sock, conf->timeout);
+ }
+ else {
+ apr_socket_timeout_set(sock, r->server->timeout);
+ }
+
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
- "proxy: FTP: trying to connect to %pI (%s)...", connect_addr, connectname);
+ "proxy: FTP: fam %d socket created, trying to connect to %pI (%s)...",
+ connect_addr->family, connect_addr, connectname);
/* make the connection out of the socket */
rv = apr_connect(sock, connect_addr);
/* if an error occurred, loop round and try again */
if (rv != APR_SUCCESS) {
+ apr_socket_close(sock);
ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
"proxy: FTP: attempt to connect to %pI (%s) failed", connect_addr, connectname);
connect_addr = connect_addr->next;
@@ -1282,7 +1273,7 @@
"proxy: FTP: EPSV contacting remote host on port %d",
data_port);
- if ((rv = apr_socket_create(&data_sock, APR_INET, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
+ if ((rv = apr_socket_create(&data_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy: FTP: error creating EPSV socket");
return HTTP_INTERNAL_SERVER_ERROR;
@@ -1300,7 +1291,7 @@
/* make the connection */
apr_socket_addr_get(&data_addr, APR_REMOTE, sock);
apr_sockaddr_ip_get(&data_ip, data_addr);
- apr_sockaddr_info_get(&epsv_addr, data_ip, APR_INET, data_port, 0, p);
+ apr_sockaddr_info_get(&epsv_addr, data_ip, connect_addr->family, data_port, 0, p);
rv = apr_connect(data_sock, epsv_addr);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
@@ -1369,7 +1360,7 @@
"proxy: FTP: PASV contacting host %d.%d.%d.%d:%d",
h3, h2, h1, h0, pasvport);
- if ((rv = apr_socket_create(&data_sock, APR_INET, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
+ if ((rv = apr_socket_create(&data_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy: error creating PASV socket");
return HTTP_INTERNAL_SERVER_ERROR;
@@ -1385,7 +1376,7 @@
#endif
/* make the connection */
- apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, "%d.%d.%d.%d", h3, h2, h1, h0), APR_INET, pasvport, 0, p);
+ apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, "%d.%d.%d.%d", h3, h2, h1, h0), connect_addr->family, pasvport, 0, p);
rv = apr_connect(data_sock, pasv_addr);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
@@ -1412,7 +1403,7 @@
apr_port_t local_port;
unsigned int h0, h1, h2, h3, p0, p1;
- if ((rv = apr_socket_create(&local_sock, APR_INET, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
+ if ((rv = apr_socket_create(&local_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy: FTP: error creating local socket");
return HTTP_INTERNAL_SERVER_ERROR;