-;;; Connection with Gacela Skin
-(let (socket)
- (defun start-skin-client (port)
- (when (null socket) (setq socket (si::socket port :host "localhost"))))
-
- (defun eval-from-skin ()
- (when (si::listen socket)
- (secure-block socket (eval (read socket)))))
-
- (defun stop-skin-client ()
- (when socket
- (si::close socket)
- (setq socket nil))))
+;;; Connection with Gacela Clients
+(let (server-socket clients)
+ (defun start-server (port)
+ (cond ((null server-socket) (setq server-socket (si::socket port :server #'check-connections)))))
+
+ (defun check-connections ()
+ (cond ((and server-socket (listen server-socket)) (setq clients (cons (si::accept server-socket) clients)))))
+
+ (defun eval-from-clients ()
+ (labels ((eval-clients (cli-socks)
+ (cond (cli-socks
+ (let ((cli (car cli-socks)))
+ (cond ((si::listen cli)
+ (secure-block cli (eval (read cli)))
+ (si::close cli)
+ (eval-clients (cdr cli-socks)))
+ (t
+ (cons cli (eval-clients (cdr cli-socks))))))))))
+ (setq clients (eval-clients clients))))
+
+ (defun stop-server ()
+ (cond (server-socket (si::close server-socket) (setq server-socket nil)))
+ (cond (clients
+ (labels ((close-clients (cli-socks)
+ (si::close (car cli-socks))
+ (close-clients (cdr cli-socks))))
+ (close-clients clients))
+ (setq clients nil)))))