(define-module (txc utils serv) #:use-module (ice-9 threads) #:use-module (ice-9 format) #:export (start-repl exit-repl start-repl-no-thread)) (define (server-report action conn p) (display (strftime "%y%m%d %H:%M:%S: " (localtime (current-time))) p) (display action p) (display " connection from " p) (display (inet-ntoa (vector-ref conn 1)) p) (display " at port " p) (display (vector-ref conn 2) p) (newline p)) (define user-repl-interactive-flag #f) (define (start-repl server-port) (let ((o (current-output-port)) (port (socket AF_INET SOCK_STREAM 0))) (setsockopt port SOL_SOCKET SO_REUSEADDR 1) (bind port AF_INET INADDR_ANY server-port) (listen port 10) ; Queue up to 10 requests. (select (list port) '() '()) (set! user-repl-interactive-flag #t) (let ((p (accept port))) (begin-thread (server-report "Opening" (cdr p) o) (server-repl (car p)) (server-report "Closing" (cdr p) o) (close-port (car p))) (while user-repl-interactive-flag (usleep 1000))))) (define exit-repl (lambda () (set! user-repl-interactive-flag #f) (exit))) (define (start-repl-no-thread server-port) (let ((o (current-output-port)) (port (socket AF_INET SOCK_STREAM 0))) (setsockopt port SOL_SOCKET SO_REUSEADDR 1) (bind port AF_INET INADDR_ANY server-port) (listen port 10) ; Queue up to 10 requests. (select (list port) '() '()) (set! user-repl-interactive-flag #t) (let ((p (accept port))) (server-report "Opening" (cdr p) o) (server-repl (car p)) (server-report "Closing" (cdr p) o) (close-port (car p))) )) ;; As we are not running a Guile shell and we run things by way of ;; shells only, it is perfectly fine to not revert to the original ;; input/output ports. (define (server-repl p) ;; (let ((i-port (current-input-port)) ;; (o-port (current-output-port)) ;; (e-port (current-error-port))) (set-current-input-port p) (set-current-output-port p) (set-current-error-port p) (top-repl) ;; (set-current-input-port i-port) ;; (set-current-output-port o-port) ;; (set-current-error-port e-port)) ) (start-repl 12345)