#lang scheme/base (require (planet "socket.ss" ("vyzo" "socket.plt" 1 2))) (define (_socket->input-port client) (make-input-port #f (lambda (buf) (socket-recv client buf)) #f (lambda () (socket-close client)))) (define ((handle-port ->input-port) client) (let ((in (->input-port client)) (out (socket->output-port client))) (parameterize ((current-output-port out)) (let next () (printf "~s\n" (read in)) (next))))) (define (start address handle) (define server (let ((node (string->path address))) (when (file-exists? node) (delete-file node)) (let ((server (socket AF_UNIX))) (socket-bind server node) (socket-listen server 5) server))) (let next () (let-values (((client address) (socket-accept server))) (thread (lambda () (handle client))) (next)))) ;; using the original socket->input-port fails (start "/tmp/broem" (handle-port socket->input-port)) ;; but this one seems to work ;; (start "/tmp/broem" (handle-port _socket->input-port)) ;; i used "socat unux-client:/tmp/broem -" to test it.