Archived
1
0
Fork 0

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 @@ or a TCP port number), and return it."
(define (ftp-close conn) (define (ftp-close conn)
(close (ftp-connection-socket conn))) (close (ftp-connection-socket conn)))
(define %char-set:not-slash
(char-set-complement (char-set #\/)))
(define (ftp-chdir conn dir) (define (ftp-chdir conn dir)
(%ftp-command (string-append "CWD " dir) 250 "Change to directory DIR."
(ftp-connection-socket conn)))
;; 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) (define (ftp-size conn file)
"Return the size in bytes of FILE." "Return the size in bytes of FILE."
@ -238,15 +251,15 @@ must be closed before CONN can be used for other purposes."
(rec (read! bv start count) (rec (read! bv start count)
(match (get-bytevector-n! s bv (match (get-bytevector-n! s bv
start count) start count)
((? eof-object?) 0) ((? eof-object?) 0)
(0 (0
;; Nothing available yet, so try ;; Nothing available yet, so try
;; again. This is important because ;; again. This is important because
;; the return value of `read!' makes ;; the return value of `read!' makes
;; it impossible to distinguish ;; it impossible to distinguish
;; between "not yet" and "EOF". ;; between "not yet" and "EOF".
(read! bv start count)) (read! bv start count))
(read read))) (read read)))
#f #f ; no get/set position #f #f ; no get/set position
terminate))) terminate)))