diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 888e446..f39a0a4 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -46,6 +46,7 @@ device-mapping-service swap-service user-processes-service + dmd-repl-service host-name-service console-keymap-service console-font-service @@ -287,6 +288,34 @@ stopped before 'kill' is called." #f)) (respawn? #f))))) + +(define* (dmd-repl-service #:optional (file-name "/var/run/dmd/repl") + #:key (dmd dmd)) + "Return a service that opens a REPL for dmd. Authorized users can connect +to the REPL at @var{file-name}, which points to a Unix-domain socket. This +may be done from the command using @command{socat unix-connect:@var{file-name} +stdio}, or from Emacs using @code{M-x geiser-connect-local}." + (with-monad %store-monad + (return (service + (documentation "Run a REPL service inside dmd.") + (provision '(dmd-repl)) + (requirement '(root-file-system)) + (start #~(begin + (use-modules (system repl server)) + + (lambda* (#:optional (file-name #$file-name)) + (let ((socket (make-unix-domain-server-socket + #:path file-name))) + (spawn-server socket) + #t)))) + (stop #~(begin + (use-modules (system repl server)) + + (lambda _ + (stop-server-and-clients!) + #f))) + (auto-start? #f))))) + (define (host-name-service name) "Return a service that sets the host name to @var{name}." (with-monad %store-monad