From 69795bfcd2d5aac82cef12eef7a91807cbd81a80 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 27 Sep 2016 01:26:31 -0400 Subject: [PATCH] Initial input/output port conversions --- srfi/106.sld | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/srfi/106.sld b/srfi/106.sld index d2102873..5bd5bb1b 100644 --- a/srfi/106.sld +++ b/srfi/106.sld @@ -254,12 +254,24 @@ " close(obj_obj2int(sockfd)); return_closcall1(data, k, boolean_t);") -;; TODO: implement both of these: +;; TODO: may not be good enough, socket may be closed if file is closed (define (socket-input-port sock) - (error "Not implemented yet")) + (%socket-input-port (socket->fd sock))) + + (define-c %socket-input-port + "(void *data, int argc, closure _, object k, object sockfd)" + " FILE *fp = fdopen(obj_obj2int(sockfd), \"r\"); + make_port(port, fp, 1); + return_closcall1(data, k, &port);") + (define (socket-output-port sock) - (error "Not implemented yet")) -;; END TODO + (%socket-output-port (socket->fd sock))) + + (define-c %socket-output-port + "(void *data, int argc, closure _, object k, object sockfd)" + " FILE *fp = fdopen(obj_obj2int(sockfd), \"w\"); + make_port(port, fp, 0); + return_closcall1(data, k, &port);") (define (call-with-socket socket proc) (let ((result (proc socket)))