ftpgetput: add EPSV support (PASV-like thing for IPv6)
No binary (build failed)
—
(log yok)
| @@ -156,7 +156,7 @@ static int xconnect_ftpdata(void) | |
| unsigned port_num; | |
| /* | |
| - | TODO: PASV command will not work for IPv6. RFC2428 describes |
| + | PASV command will not work for IPv6. RFC2428 describes |
| IPv6-capable "extended PASV" - EPSV. | |
| "EPSV [protocol]" asks server to bind to and listen on a data port | |
| @@ -171,15 +171,16 @@ but we don't need that. | |
| NB: PASV may still work for some servers even over IPv6. | |
| For example, vsftp happily answers | |
| "227 Entering Passive Mode (0,0,0,0,n,n)" and proceeds as usual. | |
| - | |
| - | TODO2: need to stop ignoring IP address in PASV response. |
| */ | |
| - | //if (ftpcmd("EPSV", NULL) != 229) { |
| + | if (!ENABLE_FEATURE_IPV6 |
| + | || ftpcmd("EPSV", NULL) != 229 |
| + | ) { |
| + | /* maybe also go straight to PAST if lsa->u.sa.sa_family == AF_INET? */ |
| if (ftpcmd("PASV", NULL) != 227) { | |
| ftp_die("PASV"); | |
| } | |
| - | /* Response is "NNN garbageN1,N2,N3,N4,P1,P2[)garbage] |
| + | /* Response is "NNN garbageN1,N2,N3,N4,P1,P2[)garbage]" |
| * Server's IP is N1.N2.N3.N4 (we ignore it) | |
| * Server's port for data connection is P1*256+P2 */ | |
| buf_ptr = strrchr(buf, ')'); | |
| @@ -192,7 +193,16 @@ TODO2: need to stop ignoring IP address in PASV response. | |
| buf_ptr = strrchr(buf, ','); | |
| *buf_ptr = '\0'; | |
| port_num += xatoul_range(buf_ptr + 1, 0, 255) * 256; | |
| - | //} |
| + | } else { |
| + | /* Response is "NNN garbage(|||P1|)" |
| + | * Server's port for data connection is P1 */ |
| + | buf_ptr = strrchr(buf, '|'); |
| + | if (buf_ptr) *buf_ptr = '\0'; |
| + | |
| + | buf_ptr = strrchr(buf, '|'); |
| + | *buf_ptr = '\0'; |
| + | port_num = xatoul_range(buf_ptr + 1, 0, 65535); |
| + | } |
| set_nport(&lsa->u.sa, htons(port_num)); | |
| return xconnect_stream(lsa); | |