From 91e1a457b567935784632b3aa0235a7a3b5d35f9 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sat, 6 Apr 2024 11:51:31 +0200 Subject: services: guix: Gracefully handle dangling symlink for ‘machines.scm’. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, if /etc/guix/machines.scm was a dangling symlink, it would be kept (because ‘file-exists?’ would return #f) and thus the following ‘symlink’ call would throw with EEXIST. * gnu/services/base.scm (guix-machines-files-installation): Use ‘lstat’ rather than ‘file-exists?’. Change-Id: I07c7eed842dacabbd19ae2a17ac3e59cf26e46b2 --- gnu/services/base.scm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 5104b3d104..3f912225a0 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -1790,13 +1790,14 @@ (define machines-file ;; If MACHINES-FILE already exists, move it out of the way. ;; Create a backup if it's a regular file: it's likely that the ;; user manually updated it. - (if (file-exists? machines-file) - (if (and (symbolic-link? machines-file) - (store-file-name? (readlink machines-file))) - (delete-file machines-file) - (rename-file machines-file - (string-append machines-file ".bak"))) - (mkdir-p (dirname machines-file))) + (let ((stat (false-if-exception (lstat machines-file)))) + (if stat + (if (and (eq? 'symlink (stat:type stat)) + (store-file-name? (readlink machines-file))) + (delete-file machines-file) + (rename-file machines-file + (string-append machines-file ".bak"))) + (mkdir-p (dirname machines-file)))) ;; Installed the declared machines file. (symlink #+(scheme-file "machines.scm" -- cgit v1.2.3