summary refs log tree commit diff
path: root/gnu/services/security-token.scm
diff options
context:
space:
mode:
authorChris Marusich <cmmarusich@gmail.com>2018-08-20 00:16:06 -0700
committerChris Marusich <cmmarusich@gmail.com>2018-08-20 21:43:56 -0700
commit6fb6ac6857df31c55a640eead2a5f79edd7dab14 (patch)
treeb9feaacd5aff2a5857a596f4231fe64d0a1a6bbf /gnu/services/security-token.scm
parent6d863cdedd9dae614479fcea7fe3ad30ac853bb5 (diff)
downloadguix-6fb6ac6857df31c55a640eead2a5f79edd7dab14.tar.gz
gnu: services: Fix pcscd activation bug.
Fixes: <https://bugs.gnu.org/32478>.

* gnu/services/security-token.scm (pcscd-activation): Idempotently create the
/var/lib/pcsc symlink so that it does not fail when it already exists.
Diffstat (limited to 'gnu/services/security-token.scm')
-rw-r--r--gnu/services/security-token.scm25
1 files changed, 17 insertions, 8 deletions
diff --git a/gnu/services/security-token.scm b/gnu/services/security-token.scm
index 7e7ea54a50..354549b33c 100644
--- a/gnu/services/security-token.scm
+++ b/gnu/services/security-token.scm
@@ -20,6 +20,7 @@
   #:use-module (gnu services)
   #:use-module (gnu services shepherd)
   #:use-module (gnu packages admin)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages security-token)
   #:use-module (gnu system shadow)
   #:use-module (guix gexp)
@@ -62,14 +63,22 @@
 (define pcscd-activation
   (match-lambda
     (($ <pcscd-configuration> pcsc-lite usb-drivers)
-     #~(begin
-         (use-modules (guix build utils))
-         (mkdir-p "/var/lib")
-         (symlink #$(directory-union
-                     "pcsc"
-                     (map (cut file-append <> "/pcsc")
-                          usb-drivers))
-                  "/var/lib/pcsc")))))
+     (with-imported-modules (source-module-closure
+                             '((guix build utils)))
+       #~(begin
+           (use-modules (guix build utils))
+           ;; XXX: We can't use (guix utils) because it requires a
+           ;; dynamically-linked Guile, hence the duplicate switch-symlinks.
+           (define (switch-symlinks link target)
+             (let ((pivot (string-append link ".new")))
+               (symlink target pivot)
+               (rename-file pivot link)))
+           (mkdir-p "/var/lib")
+           (switch-symlinks "/var/lib/pcsc"
+                            #$(directory-union
+                               "pcsc"
+                               (map (cut file-append <> "/pcsc")
+                                    usb-drivers))))))))
 
 (define pcscd-service-type
   (service-type