(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))) (if (negative? written) (case (errno) ((errno/intr errno/again) (loop buffer len)) (else (error "Error writing to fd" fd (errno)))) (unless (= written len) (loop (substring buffer written len) (- len written))))))) (lambda () (close-output-port port)) (lambda () (flush-output port)))))