From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id 2JQiEdGGyl7MXAAA0tVLHw (envelope-from ) for ; Sun, 24 May 2020 14:38:09 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id gBjiDNGGyl5GJQAAbx9fmQ (envelope-from ) for ; Sun, 24 May 2020 14:38:09 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 0BFA29402D1 for ; Sun, 24 May 2020 14:38:09 +0000 (UTC) Received: from localhost ([::1]:59024 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jcrlP-000496-WF for larch@yhetil.org; Sun, 24 May 2020 10:38:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44610) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jcrlK-00047U-LC for guix-patches@gnu.org; Sun, 24 May 2020 10:38:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:55131) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jcrlK-0000L3-Ca for guix-patches@gnu.org; Sun, 24 May 2020 10:38:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jcrlK-00087O-B4 for guix-patches@gnu.org; Sun, 24 May 2020 10:38:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#41507] [PATCH Shepherd 1/2] system: Add support for 'signalfd'. References: <20200524142700.6151-1-ludo@gnu.org> In-Reply-To: <20200524142700.6151-1-ludo@gnu.org> Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 24 May 2020 14:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 41507 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 41507@debbugs.gnu.org Cc: othacehe@gnu.org, Ludovic =?UTF-8?Q?Court=C3=A8s?= Received: via spool by 41507-submit@debbugs.gnu.org id=B41507.159033104431151 (code B ref 41507); Sun, 24 May 2020 14:38:02 +0000 Received: (at 41507) by debbugs.gnu.org; 24 May 2020 14:37:24 +0000 Received: from localhost ([127.0.0.1]:38443 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcrki-00086N-1Y for submit@debbugs.gnu.org; Sun, 24 May 2020 10:37:24 -0400 Received: from eggs.gnu.org ([209.51.188.92]:37098) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jcrkb-00085s-DN for 41507@debbugs.gnu.org; Sun, 24 May 2020 10:37:20 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:32835) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jcrkV-0000BM-Cx; Sun, 24 May 2020 10:37:11 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=54104 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1jcrkU-0002uq-2t; Sun, 24 May 2020 10:37:10 -0400 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Date: Sun, 24 May 2020 16:36:59 +0200 Message-Id: <20200524143700.6378-1-ludo@gnu.org> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Spam-Score: -3.3 (---) X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Spam-Score: 5.49 X-TUID: 5d5Di2shCHRR * configure.ac: Add 'AC_CHECK_SIZEOF' calls for 'struct signalfd_siginfo' and 'sigset_t'. Add 'AC_COMPUTE_INT' for 'SFD_CLOEXEC', 'SIG_BLOCK', and 'SIG_UNBLOCK'. Substitute the results. * modules/shepherd/system.scm.in (allocate-sigset, sigemptyset) (sigaddset, sigset): New procedures. (%sizeof-struct-signalfd-siginfo, SFD_CLOEXEC): New variables. (signalfd, consume-signalfd-siginfo): New procedures. (SIG_BLOCK, SIG_UNBLOCK): New variables. (sigprocmask, block-signals, unblock-signals): New procedures. --- configure.ac | 18 ++++++++++ modules/shepherd/system.scm.in | 65 ++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/configure.ac b/configure.ac index 5d11846..052a826 100644 --- a/configure.ac +++ b/configure.ac @@ -87,6 +87,24 @@ AC_COMPUTE_INT([PR_SET_CHILD_SUBREAPER], [PR_SET_CHILD_SUBREAPER], [#include ]) +AC_CHECK_SIZEOF([sigset_t], [], [#include ]) + +AC_MSG_CHECKING([ and constants]) +AC_COMPUTE_INT([SFD_CLOEXEC], [SFD_CLOEXEC], [#include ]) +AC_COMPUTE_INT([SIG_BLOCK], [SIG_BLOCK], [#include ]) +AC_COMPUTE_INT([SIG_UNBLOCK], [SIG_UNBLOCK], [#include ]) +AC_MSG_RESULT([done]) + +SIZEOF_STRUCT_SIGNALFD_SIGINFO="$ac_cv_sizeof_struct_signalfd_siginfo" +SIZEOF_SIGSET_T="$ac_cv_sizeof_sigset_t" +AC_SUBST([SIZEOF_STRUCT_SIGNALFD_SIGINFO]) +AC_SUBST([SIZEOF_SIGSET_T]) +AC_SUBST([SFD_CLOEXEC]) +AC_SUBST([SIG_BLOCK]) +AC_SUBST([SIG_UNBLOCK]) + AC_MSG_CHECKING([whether to build crash handler]) case "$host_os" in linux-gnu*) build_crash_handler=yes;; diff --git a/modules/shepherd/system.scm.in b/modules/shepherd/system.scm.in index e5ecd1f..872fad4 100644 --- a/modules/shepherd/system.scm.in +++ b/modules/shepherd/system.scm.in @@ -20,8 +20,10 @@ (define-module (shepherd system) #:use-module (system foreign) + #:use-module (ice-9 binary-ports) #:use-module (rnrs bytevectors) #:use-module (srfi srfi-11) + #:use-module (srfi srfi-26) #:export (disable-reboot-on-ctrl-alt-del reboot halt @@ -30,6 +32,11 @@ prctl PR_SET_CHILD_SUBREAPER getpgid + SFD_CLOEXEC + signalfd + consume-signalfd-siginfo + block-signals + unblock-signals without-automatic-finalization)) ;; The constants. @@ -132,6 +139,64 @@ ctrlaltdel(8) and see kernel/reboot.c in Linux." (list err)) result))))) +(define (allocate-sigset) + (bytevector->pointer (make-bytevector @SIZEOF_SIGSET_T@))) + +(define sigemptyset + (syscall->procedure int "sigemptyset" '(*))) + +(define sigaddset + (syscall->procedure int "sigaddset" `(* ,int))) + +(define (sigset signals) + "Return a pointer to a fresh 'sigset_t' for SIGNALS." + (let ((set (allocate-sigset))) + (sigemptyset set) + (for-each (cut sigaddset set <>) signals) + set)) + +(define %sizeof-struct-signalfd-siginfo + ;; Size of 'struct signalfd_siginfo' or zero if it doesn't exist, as is the + ;; case on GNU/Hurd. + @SIZEOF_STRUCT_SIGNALFD_SIGINFO@) + +(define SFD_CLOEXEC @SFD_CLOEXEC@) + +(define signalfd + (let ((proc (syscall->procedure int "signalfd" `(,int * ,int)))) + (lambda* (fd signals #:optional (flags SFD_CLOEXEC)) + "Return an open input port over a signal file descriptor for SIGNALS, a +list of signal constants; if FD is -1, a new file descriptor is allocated, +otherwise FD is returned and its associated state is updated. FLAGS must be a +bitmask of SFD_CLOEXEC or SFD_NONBLOCK." + (fdopen (proc fd (sigset signals) flags) "r0")))) + +(define (consume-signalfd-siginfo port) + "Read a 'signalfd_siginfo' structure from PORT and discard it. Return the +number of the signal received." + (let ((bv (get-bytevector-n port %sizeof-struct-signalfd-siginfo))) + ;; The first 'uint32_t' field of 'struct signalfd_siginfo' is the signal + ;; number. + (bytevector-u32-native-ref bv 0))) + +(define SIG_BLOCK @SIG_BLOCK@) +(define SIG_UNBLOCK @SIG_UNBLOCK@) + +(define sigprocmask + (let ((proc (syscall->procedure int "pthread_sigmask" `(,int * *)))) + (lambda (how signals) + "Add SIGNALS, a list of SIG* values, to the set of blocked signals if +HOW is SIG_BLOCK, or unblock them if HOW is SIG_UNBLOCK." + (proc how (sigset signals) %null-pointer)))) + +(define (block-signals signals) + "Block SIGNALS, a list of SIG* values, in the current thread." + (sigprocmask SIG_BLOCK signals)) + +(define (unblock-signals signals) + "Unblock SIGNALS, a list of SIG* values, in the current thread." + (sigprocmask SIG_UNBLOCK signals)) + ;;; ;;; Guile shenanigans. -- 2.26.2