From 23ed63a12d941ad836f3fc9902ba4f145db1975c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Sat, 10 May 2014 22:58:22 +0200
Subject: [PATCH] services: Use (guix build syscalls) instead of util-linux.

* gnu/services/dmd.scm (dmd-configuration-file): Add derivations for
  the (guix build syscalls) module, and add that to the load path of
  dmd.conf.
* gnu/services/base.scm (root-file-system-service): Rewrite using the
  'sync' and 'mount' procedures.
---
 gnu/services/base.scm | 19 +++++++--------
 gnu/services/dmd.scm  | 56 ++++++++++++++++++++++++++-----------------
 2 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 5157349aec7..e0f2888ee07 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -22,8 +22,7 @@ (define-module (gnu services base)
   #:use-module (gnu system linux)                 ; 'pam-service', etc.
   #:use-module (gnu packages admin)
   #:use-module ((gnu packages base)
-                #:select (glibc-final %final-inputs))
-  #:use-module (gnu packages linux)
+                #:select (glibc-final))
   #:use-module (gnu packages package-management)
   #:use-module (guix gexp)
   #:use-module (guix monads)
@@ -52,9 +51,6 @@ (define (root-file-system-service)
 
 This service must be the root of the service dependency graph so that its
 'stop' action is invoked when dmd is the only process left."
-  (define coreutils
-    (car (assoc-ref %final-inputs "coreutils")))
-
   (with-monad %store-monad
     (return
      (service
@@ -63,7 +59,7 @@ (define coreutils
       (start #~(const #t))
       (stop #~(lambda _
                 ;; Return #f if successfully stopped.
-                (system* (string-append #$coreutils "/bin/sync"))
+                (sync)
 
                 (call-with-blocked-asyncs
                  (lambda ()
@@ -82,12 +78,13 @@ (define coreutils
                      ;; Close /dev/console.
                      (for-each close-fdes '(0 1 2))
 
-                     ;; At this points, there are no open files left, so the
+                     ;; At this point, there are no open files left, so the
                      ;; root file system can be re-mounted read-only.
-                     (not (zero?
-                           (system* (string-append #$util-linux "/bin/mount")
-                                    "-n" "-o" "remount,ro"
-                                    "-t" "dummy" "dummy" "/"))))))))
+                     (mount #f "/" #f
+                            (logior MS_REMOUNT MS_RDONLY)
+                            #:update-mtab? #f)
+
+                     #f)))))
       (respawn? #f)))))
 
 (define* (user-processes-service #:key (grace-delay 2))
diff --git a/gnu/services/dmd.scm b/gnu/services/dmd.scm
index 161a971edda..8d4c483cc45 100644
--- a/gnu/services/dmd.scm
+++ b/gnu/services/dmd.scm
@@ -32,27 +32,39 @@ (define-module (gnu services dmd)
 
 (define (dmd-configuration-file services)
   "Return the dmd configuration file for SERVICES."
-  (define config
-    #~(begin
-        (use-modules (ice-9 ftw))
-
-        (register-services
-         #$@(map (lambda (service)
-                   #~(make <service>
-                       #:docstring '#$(service-documentation service)
-                       #:provides '#$(service-provision service)
-                       #:requires '#$(service-requirement service)
-                       #:respawn? '#$(service-respawn? service)
-                       #:start #$(service-start service)
-                       #:stop #$(service-stop service)))
-                 services))
-
-        ;; guix-daemon 0.6 aborts if 'PATH' is undefined, so work around it.
-        (setenv "PATH" "/run/current-system/bin")
-
-        (format #t "starting services...~%")
-        (for-each start '#$(append-map service-provision services))))
-
-  (gexp->file "dmd.conf" config))
+  (define modules
+    ;; Extra modules visible to dmd.conf.
+    '((guix build syscalls)))
+
+  (mlet %store-monad ((modules  (imported-modules modules))
+                      (compiled (compiled-modules modules)))
+    (define config
+      #~(begin
+          (eval-when (expand load eval)
+            (set! %load-path (cons #$modules %load-path))
+            (set! %load-compiled-path
+                  (cons #$compiled %load-compiled-path)))
+
+          (use-modules (ice-9 ftw)
+                       (guix build syscalls))
+
+          (register-services
+           #$@(map (lambda (service)
+                     #~(make <service>
+                         #:docstring '#$(service-documentation service)
+                         #:provides '#$(service-provision service)
+                         #:requires '#$(service-requirement service)
+                         #:respawn? '#$(service-respawn? service)
+                         #:start #$(service-start service)
+                         #:stop #$(service-stop service)))
+                   services))
+
+          ;; guix-daemon 0.6 aborts if 'PATH' is undefined, so work around it.
+          (setenv "PATH" "/run/current-system/bin")
+
+          (format #t "starting services...~%")
+          (for-each start '#$(append-map service-provision services))))
+
+    (gexp->file "dmd.conf" config)))
 
 ;;; dmd.scm ends here
-- 
GitLab