From 4e431fda5f2ec76b6d6a271be7c30b1324431329 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 5 Jan 2024 00:20:50 +0100 Subject: services: shepherd: Remove ‘dynamic-wind’ in ‘call-with-*-file’. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes . The ‘dynamic-wind’ was causing files to be closed prematurely when leaving the dynamic extent of PROC for instance via a delimited continuation, using Fibers (that ‘dynamic-wind’ call was also semantically incorrect in the first place). * gnu/services/shepherd.scm (shepherd-configuration-file) [config](call-with-file): Remove. (call-with-input-file, call-with-output-file): Rewrite in terms of ‘call-with-port’. Change-Id: Ica8af71a04f525a15be99985552063cb98cd6ee8 --- gnu/services/shepherd.scm | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) (limited to 'gnu') diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm index e9d3a631c2..8e122f1aab 100644 --- a/gnu/services/shepherd.scm +++ b/gnu/services/shepherd.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013-2016, 2018-2023 Ludovic Courtès +;;; Copyright © 2013-2016, 2018-2024 Ludovic Courtès ;;; Copyright © 2017 Clément Lassieur ;;; Copyright © 2018 Carlo Zancanaro ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen @@ -371,17 +371,6 @@ (define config (use-modules (srfi srfi-34) (system repl error-handling)) - (define (call-with-file file flags proc) - (let ((port #f)) - (dynamic-wind - (lambda () - (set! port (open file flags))) - (lambda () - (proc port)) - (lambda () - (close-port port) - (set! port #f))))) - ;; There's code run from shepherd that uses 'call-with-input-file' & ;; co.--e.g., the 'urandom-seed' service. Starting from Shepherd ;; 0.9.2, users need to make sure not to leak non-close-on-exec file @@ -389,12 +378,12 @@ (define (call-with-file file flags proc) ;; standard bindings with O_CLOEXEC variants. (set! call-with-input-file (lambda (file proc) - (call-with-file file (logior O_RDONLY O_CLOEXEC) - proc))) + (call-with-port (open file (logior O_RDONLY O_CLOEXEC)) + proc))) (set! call-with-output-file (lambda (file proc) - (call-with-file file (logior O_WRONLY O_CREAT O_CLOEXEC) - proc))) + (call-with-port (open file (logior O_WRONLY O_CREAT O_CLOEXEC)) + proc))) ;; Specify the default environment visible to all the services. ;; Without this statement, all the environment variables of PID 1 -- cgit v1.2.3