summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
author宋文武 <iyzsong@member.fsf.org>2021-02-14 12:02:57 +0800
committer宋文武 <iyzsong@member.fsf.org>2021-02-15 08:38:00 +0800
commit858898e348eb300a94b74115328ee39191829bda (patch)
tree7072433c11469b46d942a7ec0ae8f46c99ce302a /guix
parent392e230d5e63fe0f5d7aa9b5085516250630d879 (diff)
ftp-client: Before 'PASV', try 'EPSV' first for IPv6.
This fixes <https://bugs.gnu.org/46481>. * guix/ftp-client.scm (ftp-epsv, ftp-passive): New procedures. (ftp-list, ftp-retr): Replace call to 'ftp-pasv' with 'ftp-passive'.
Diffstat (limited to 'guix')
-rw-r--r--guix/ftp-client.scm15
1 files changed, 13 insertions, 2 deletions
diff --git a/guix/ftp-client.scm b/guix/ftp-client.scm
index 8d5adcb8ed..9cc34cc7ec 100644
--- a/guix/ftp-client.scm
+++ b/guix/ftp-client.scm
@@ -216,6 +216,17 @@ TIMEOUT, an ETIMEDOUT error is raised."
(else
(throw 'ftp-error conn "PASV" 227 message)))))
+(define (ftp-epsv conn)
+ (let* ((message (%ftp-command "EPSV" 229 (ftp-connection-socket conn))))
+ (string->number
+ (match:substring (string-match "\\(...([0-9]+).\\)" message) 1))))
+
+(define (ftp-passive conn)
+ "Enter passive mode using EPSV or PASV, return a data connection port on
+success."
+ ;; IPv6 only works with EPSV, so try it first.
+ (or (false-if-exception (ftp-epsv conn)) (ftp-pasv conn)))
+
(define (address-with-port sa port)
"Return a socket-address object based on SA, but with PORT."
(let ((fam (sockaddr:fam sa))
@@ -232,7 +243,7 @@ TIMEOUT, an ETIMEDOUT error is raised."
(if directory
(ftp-chdir conn directory))
- (let* ((port (ftp-pasv conn))
+ (let* ((port (ftp-passive conn))
(ai (ftp-connection-addrinfo conn))
(s (socket (addrinfo:fam ai) (addrinfo:socktype ai)
(addrinfo:protocol ai))))
@@ -281,7 +292,7 @@ must be closed before CONN can be used for other purposes."
;; Ask for "binary mode".
(%ftp-command "TYPE I" 200 (ftp-connection-socket conn))
- (let* ((port (ftp-pasv conn))
+ (let* ((port (ftp-passive conn))
(ai (ftp-connection-addrinfo conn))
(s (with-fluids ((%default-port-encoding #f))
(socket (addrinfo:fam ai) (addrinfo:socktype ai)