#!/usr/bin/guile \ -e main -s !# (use-modules (ice-9 threads) (ice-9 popen)) (define mutex (make-mutex)) (define message-ready (make-condition-variable)) (define message "") (define (main args) (begin-thread (thread)) (begin-thread (thread)) (begin-thread (thread)) (begin-thread (thread)) (begin-thread (thread)) (let ((sock #f) (fileno #f)) (lock-mutex mutex) (set! sock (socket AF_INET SOCK_STREAM 0)) (unlock-mutex mutex) (bind sock AF_INET INADDR_ANY 6008) (listen sock 5) (while #t (let* ((client-connection (accept/no-block sock)) (client-details (cdr client-connection)) (client (car client-connection))) (lock-mutex mutex) (do ((line (read-line client) (read-line client))) ((eof-object? line) (shutdown client 2)) (set! message (string-append message line "\n"))) (signal-condition-variable message-ready) (unlock-mutex mutex))))) (define (thread) (while #t (lock-mutex mutex) (if (not (> (string-length message) 0)) (wait-condition-variable message-ready mutex) (let ((outgoing message)) (set! message "") (unlock-mutex mutex) (piper outgoing))) (unlock-mutex mutex))) (define (piper message) (lock-mutex mutex) (let ((pipe (open-output-pipe "./buggy-companion.scm"))) (display message pipe) (close-port pipe)) (unlock-mutex mutex)) (define (accept/no-block s) (if (null? (car (select (vector s) '() '()))) ; This select complains (accept/no-block s) (let ((client #f)) (lock-mutex mutex) (set! client (accept s)) (unlock-mutex mutex) client)))