summary refs log tree commit diff
path: root/gnu/system/shadow.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/system/shadow.scm')
-rw-r--r--gnu/system/shadow.scm33
1 files changed, 28 insertions, 5 deletions
diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm
index 71f8e0d771..c748596431 100644
--- a/gnu/system/shadow.scm
+++ b/gnu/system/shadow.scm
@@ -19,7 +19,18 @@
 (define-module (gnu system shadow)
   #:use-module (guix store)
   #:use-module (ice-9 match)
-  #:export (passwd-file))
+  #:use-module (guix records)
+  #:export (user-account
+            user-account?
+            user-account-name
+            user-account-pass
+            user-account-uid
+            user-account-gid
+            user-account-comment
+            user-account-home-directory
+            user-account-shell
+
+            passwd-file))
 
 ;;; Commentary:
 ;;;
@@ -27,16 +38,28 @@
 ;;;
 ;;; Code:
 
+(define-record-type* <user-account>
+  user-account make-user-account
+  user-account?
+  (name           user-account-name)
+  (password       user-account-pass (default ""))
+  (uid            user-account-uid)
+  (gid            user-account-gid)
+  (comment        user-account-comment (default ""))
+  (home-directory user-account-home-directory)
+  (shell          user-account-shell (default "/bin/sh")))
+
 (define* (passwd-file store accounts #:key shadow?)
-  "Return a password file for ACCOUNTS, a list of vectors as returned by
-'getpwnam'.  If SHADOW? is true, then it is a /etc/shadow file, otherwise it
-is a /etc/passwd file."
+  "Return a password file for ACCOUNTS, a list of <user-account> objects.  If
+SHADOW? is true, then it is a /etc/shadow file, otherwise it is a /etc/passwd
+file."
   ;; XXX: The resulting file is world-readable, so beware when SHADOW? is #t!
   (define contents
     (let loop ((accounts accounts)
                (result   '()))
       (match accounts
-        ((#(name pass uid gid comment home-dir shell) rest ...)
+        ((($ <user-account> name pass uid gid comment home-dir shell)
+          rest ...)
          (loop rest
                (cons (if shadow?
                          (string-append name