(define (open-input-fd fd) (make-input-port (lambda () (thread-wait-for-i/o! fd #:input) (string-ref (car (file-read fd 1)) 0)) (lambda () (nth-value 0 (file-select fd #f 0))) (lambda () (file-close fd)))) (define (open-output-fd fd) (let ((port (open-output-file* fd))) (make-output-port (lambda (buffer) (let loop ((buffer buffer) (len (string-length buffer))) (thread-wait-for-i/o! fd #:output) (let ((written (file-write fd buffer))) (unless (= written len) (loop (substring written len) (- len written)))))) (lambda () (close-output-port port)) (lambda () (flush-output port)))))