ftp-client: `ftp-chdir' changes one step at a time.

* guix/ftp-client.scm (%char-set:not-slash): New variable.
  (ftp-chdir): Add docstring.  Change to DIR one step at a time.
  (ftp-retr): Fix indentation.
This commit is contained in:
Ludovic Courtès 2013-04-27 16:25:54 +02:00
parent accf7a373e
commit 87dfd45594

View file

@ -130,9 +130,22 @@ (define addresses
(define (ftp-close conn)
(close (ftp-connection-socket conn)))
(define %char-set:not-slash
(char-set-complement (char-set #\/)))
(define (ftp-chdir conn dir)
(%ftp-command (string-append "CWD " dir) 250
(ftp-connection-socket conn)))
"Change to directory DIR."
;; On ftp.gnupg.org, "PASV" right after "CWD /gcrypt/gnupg" hangs. Doing
;; CWD in two steps works, so just do this.
(let ((components (string-tokenize dir %char-set:not-slash)))
(fold (lambda (dir result)
(%ftp-command (string-append "CWD " dir) 250
(ftp-connection-socket conn)))
#f
(if (string-prefix? "/" dir)
(cons "/" components)
components))))
(define (ftp-size conn file)
"Return the size in bytes of FILE."
@ -238,15 +251,15 @@ (define (terminate)
(rec (read! bv start count)
(match (get-bytevector-n! s bv
start count)
((? eof-object?) 0)
(0
;; Nothing available yet, so try
;; again. This is important because
;; the return value of `read!' makes
;; it impossible to distinguish
;; between "not yet" and "EOF".
(read! bv start count))
(read read)))
((? eof-object?) 0)
(0
;; Nothing available yet, so try
;; again. This is important because
;; the return value of `read!' makes
;; it impossible to distinguish
;; between "not yet" and "EOF".
(read! bv start count))
(read read)))
#f #f ; no get/set position
terminate)))