~ruther/guix-local

3b07625ad667bf586ae5e3b2ca579933dc261dbe — Ludovic Courtès 12 years ago 37c825e
gnu: vm: Create shadow files with the right format.

* gnu/system/vm.scm (passwd-file): When SHADOW? is true, use the right
  shadow(5) format.  Always add a trailing newline.
1 files changed, 11 insertions(+), 7 deletions(-)

M gnu/system/vm.scm
M gnu/system/vm.scm => gnu/system/vm.scm +11 -7
@@ 367,21 367,25 @@ It can be used to provide additional files, such as /etc files."
  "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."
  ;; XXX: The resulting file is world-readable, so don't rely on it!
  ;; 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 ...)
         (loop rest
               (cons (string-append name
                                    ":" (if shadow? pass "x")
                                    ":" (number->string uid)
                                    ":" (number->string gid)
                                    ":" comment ":" home-dir ":" shell)
               (cons (if shadow?
                         (string-append name
                                        ":"       ; XXX: use (crypt PASS …)?
                                        ":::::::")
                         (string-append name
                                        ":" "x"
                                        ":" (number->string uid)
                                        ":" (number->string gid)
                                        ":" comment ":" home-dir ":" shell))
                     result)))
        (()
         (string-concatenate-reverse result)))))
         (string-join (reverse result) "\n" 'suffix)))))

  (add-text-to-store store (if shadow? "shadow" "passwd")
                     contents '()))