From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms1.migadu.com with LMTPS id 4LMcCX76P2bHggEAqHPOHw:P1 (envelope-from ) for ; Sun, 12 May 2024 01:08:46 +0200 Received: from aspmx1.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id 4LMcCX76P2bHggEAqHPOHw (envelope-from ) for ; Sun, 12 May 2024 01:08:46 +0200 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-devel-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-devel-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1715468926; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=VLiT3Ohfvm/JpvgX6w1h4jfcLFY6AHcfQ7WbcWcwVBw=; b=pXVC0x6dERtNLCLzyzclpX5TX5KrKZZeDI0cbHMziiUXtc5I/QUPAftwf6obFUNPs4g/U4 bczVbcNHj5XBtVEuobyEO1P9/mAuklo0jljQheRC1sf+Ao/AMELYVOxlyetpeBSCYkEpql GXOUCV4yxsvuAxay3HmMHf+LONs2KQS61XYZe9j1CHBrlvyaENu5LM9vkKIonFu1zePnqI FnEWjRgpmvxmKh16K4Czhy6T7lLIh/suPaNIs+pvFJrHlzTa8vEpJqFM16TCewsCLqMlka oLITZL4regs/3hm518pY9gDdpdwzEkEi5kHqmlqoBVfPgfZinIhJhTl9iC4IMg== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1715468926; a=rsa-sha256; cv=none; b=qkLVZf9Cj4vKVTfGxHyDj4wdCUQNYFLYPAXKztl6TcNj8FnpfD0m/s34EfsJDcoRBPHY1U mM9MCgkKhcahMUArS/mLtEU486vt4oq0ULxeTlzWCNL+fl87yrclrhBcUmPDTNaiORYK2L gBet+SnJV9UnvseYYII0UVOooq7ARQm6vBPVHeO94Za3TTrIS7BWa01IEXvaH2G0eSah6W 9aGvT6bbKcfbii/3lZlg36NyknxN9LoqD/oOQDCndgtbniznkyeX3qEtTQJQEjVyskhoxq dc99nSpNHr65Is1UcgaHqHeOoK0BfdHazHRBI0K+lAZDr8qorek/PryoX/B1Wg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-devel-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-devel-bounces+larch=yhetil.org@gnu.org" 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 960F83B1AE for ; Sun, 12 May 2024 01:08:45 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1s5voy-0007gL-Gm; Sat, 11 May 2024 19:08:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s5vox-0007fv-26 for guix-devel@gnu.org; Sat, 11 May 2024 19:08:03 -0400 Received: from 14.mo582.mail-out.ovh.net ([46.105.56.113]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s5vos-0005qW-PT for guix-devel@gnu.org; Sat, 11 May 2024 19:08:02 -0400 Received: from director6.ghost.mail-out.ovh.net (unknown [10.109.148.22]) by mo582.mail-out.ovh.net (Postfix) with ESMTP id 4VcLy21ky8z124p for ; Sat, 11 May 2024 23:07:54 +0000 (UTC) Received: from ghost-submission-6684bf9d7b-44nbn (unknown [10.110.113.119]) by director6.ghost.mail-out.ovh.net (Postfix) with ESMTPS id 96B081FD3D; Sat, 11 May 2024 23:07:52 +0000 (UTC) Received: from ngraves.fr ([37.59.142.106]) by ghost-submission-6684bf9d7b-44nbn with ESMTPSA id eOSEFkj6P2Y43xUALLha0w (envelope-from ); Sat, 11 May 2024 23:07:52 +0000 X-OVh-ClientIp: 176.191.136.151 To: Stefan Monnier Cc: Ludovic =?utf-8?Q?Court=C3=A8s?= , emacs-devel@gnu.org, Andrew Tropin , guix-devel@gnu.org, bjorn.bidar@thaodan.de, rudi@constantly.at, felix.lechner@lease-up.com Subject: Re: [Nicolas Graves] [PATCH v6 01/10] rde: emacs: Start emacs in --daemon mode, with shepherd and pid-file In-Reply-To: <87msow5cm8.fsf@ngraves.fr> References: <20240410234923.29319-2-ngraves@ngraves.fr> <875xwotg35.fsf@trop.in> <87zfu0m9ps.fsf@ngraves.fr> <87jzl22u5w.fsf@gnu.org> <87frvp4a4u.fsf@ngraves.fr> <87msow5cm8.fsf@ngraves.fr> Date: Sun, 12 May 2024 01:07:51 +0200 Message-ID: <87msow7xrs.fsf@ngraves.fr> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Ovh-Tracer-Id: 18035227660736651816 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvledrvdeguddgudekucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefujghffffkgggtsehmtderredttddtnecuhfhrohhmpefpihgtohhlrghsucfirhgrvhgvshcuoehnghhrrghvvghssehnghhrrghvvghsrdhfrheqnecuggftrfgrthhtvghrnhepffdtvedtgedvgfdugeefueeuudeuhfegtdelgfdviedvteeuffejteeiheeutdfgnecukfhppeduvdejrddtrddtrddupddujeeirdduledurddufeeirdduhedupdefjedrheelrddugedvrddutdeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepuddvjedrtddrtddruddpmhgrihhlfhhrohhmpehnghhrrghvvghssehnghhrrghvvghsrdhfrhdpnhgspghrtghpthhtohepuddprhgtphhtthhopehguhhigidquggvvhgvlhesghhnuhdrohhrghdpoffvtefjohhsthepmhhoheekvddpmhhouggvpehsmhhtphhouhht Received-SPF: pass client-ip=46.105.56.113; envelope-from=ngraves@ngraves.fr; helo=14.mo582.mail-out.ovh.net X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Nicolas Graves From: Nicolas Graves via "Development of GNU Guix and the GNU System distribution." Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: guix-devel-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Spam-Score: -3.88 X-Spam-Score: -3.88 X-Migadu-Queue-Id: 960F83B1AE X-Migadu-Scanner: mx11.migadu.com X-TUID: iiwjiIbMK2C8 --=-=-= Content-Type: text/plain A lightly cleaned-up version attached. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-Implement-systemd-socket.patch >From 8ba972aec7026878bfbbe5cfb387c5c723672380 Mon Sep 17 00:00:00 2001 From: Nicolas Graves Date: Sat, 13 Apr 2024 19:37:34 +0200 Subject: [PATCH] Implement systemd socket. --- configure.ac | 19 +------ lib/Makefile.in | 2 +- lib/gnulib.mk.in | 2 - lib/sd-socket.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++ lib/sd-socket.h | 57 ++++++++++++++++++++ msdos/sed1v2.inp | 3 -- src/Makefile.in | 9 ++-- src/deps.mk | 2 +- src/emacs.c | 50 ++++++++--------- 9 files changed, 226 insertions(+), 55 deletions(-) create mode 100644 lib/sd-socket.c create mode 100644 lib/sd-socket.h diff --git a/configure.ac b/configure.ac index 29b71ea2730..a245a7b5ccc 100644 --- a/configure.ac +++ b/configure.ac @@ -457,7 +457,6 @@ AC_DEFUN OPTION_DEFAULT_ON([webp],[don't compile with WebP image support]) OPTION_DEFAULT_ON([sqlite3],[don't compile with sqlite3 support]) OPTION_DEFAULT_ON([lcms2],[don't compile with Little CMS support]) -OPTION_DEFAULT_ON([libsystemd],[don't compile with libsystemd support]) OPTION_DEFAULT_ON([cairo],[don't compile with Cairo drawing]) OPTION_DEFAULT_OFF([cairo-xcb], [use XCB surfaces for Cairo support]) OPTION_DEFAULT_ON([xml2],[don't compile with XML parsing support]) @@ -3203,21 +3202,6 @@ AC_DEFUN AC_SUBST([LIBGNUTLS_LIBS]) AC_SUBST([LIBGNUTLS_CFLAGS]) -HAVE_LIBSYSTEMD=no -if test "${with_libsystemd}" = "yes" ; then - dnl This code has been tested with libsystemd 222 and later. - dnl FIXME: Find the earliest version number for which Emacs should work, - dnl and change '222' to that number. - EMACS_CHECK_MODULES([LIBSYSTEMD], [libsystemd >= 222], - [HAVE_LIBSYSTEMD=yes], [HAVE_LIBSYSTEMD=no]) - if test "${HAVE_LIBSYSTEMD}" = "yes"; then - AC_DEFINE([HAVE_LIBSYSTEMD], [1], [Define if using libsystemd.]) - fi -fi - -AC_SUBST([LIBSYSTEMD_LIBS]) -AC_SUBST([LIBSYSTEMD_CFLAGS]) - HAVE_JSON=no JSON_OBJ= @@ -6652,7 +6636,7 @@ AC_DEFUN optsep= emacs_config_features= for opt in ACL BE_APP CAIRO DBUS FREETYPE GCONF GIF GLIB GMP GNUTLS GPM GSETTINGS \ - HARFBUZZ IMAGEMAGICK JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 \ + HARFBUZZ IMAGEMAGICK JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBXML2 \ M17N_FLT MODULES NATIVE_COMP NOTIFY NS OLDXMENU PDUMPER PGTK PNG RSVG SECCOMP \ SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER \ UNEXEC WEBP X11 XAW3D XDBE XFT XIM XINPUT2 XPM XWIDGETS X_TOOLKIT \ @@ -6721,7 +6705,6 @@ AC_DEFUN Does Emacs use -lm17n-flt? ${HAVE_M17N_FLT} Does Emacs use -lotf? ${HAVE_LIBOTF} Does Emacs use -lxft? ${HAVE_XFT} - Does Emacs use -lsystemd? ${HAVE_LIBSYSTEMD} Does Emacs use -ljansson? ${HAVE_JSON} Does Emacs use -ltree-sitter? ${HAVE_TREE_SITTER} Does Emacs use the GMP library? ${HAVE_GMP} diff --git a/lib/Makefile.in b/lib/Makefile.in index 71199c32277..d934a755e85 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -74,7 +74,7 @@ Makefile: not_emacs_OBJECTS = regex.o malloc/%.o free.o libgnu_a_OBJECTS = fingerprint.o $(gl_LIBOBJS) \ - $(patsubst %.c,%.o,$(filter %.c,$(libgnu_a_SOURCES))) + $(patsubst %.c,%.o,$(filter %.c,$(libgnu_a_SOURCES))) sd-socket.o for_emacs_OBJECTS = $(filter-out $(not_emacs_OBJECTS),$(libgnu_a_OBJECTS)) libegnu_a_OBJECTS = $(patsubst %.o,e-%.o,$(for_emacs_OBJECTS)) diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in index 9ab4b741595..f9ed4a4cb23 100644 --- a/lib/gnulib.mk.in +++ b/lib/gnulib.mk.in @@ -912,8 +912,6 @@ LIBSECCOMP_CFLAGS = @LIBSECCOMP_CFLAGS@ LIBSECCOMP_LIBS = @LIBSECCOMP_LIBS@ LIBSELINUX_LIBS = @LIBSELINUX_LIBS@ LIBSOUND = @LIBSOUND@ -LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@ -LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@ LIBS_ECLIENT = @LIBS_ECLIENT@ LIBS_GNUSTEP = @LIBS_GNUSTEP@ LIBS_MAIL = @LIBS_MAIL@ diff --git a/lib/sd-socket.c b/lib/sd-socket.c new file mode 100644 index 00000000000..205ddcf433d --- /dev/null +++ b/lib/sd-socket.c @@ -0,0 +1,137 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* Copied and adapted from systemd source code. */ + +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sd-socket.h" +#define _cleanup_(f) __attribute__((cleanup(f))) + +int sd_is_socket(int fd, int type, int listening) { + struct stat st_fd; + + assert(fd >= 0); + assert(type >= 0); + + if (fstat(fd, &st_fd) < 0) + return -errno; + + if (!S_ISSOCK(st_fd.st_mode)) + return 0; + + if (type != 0) { + int other_type = 0; + socklen_t l = sizeof(other_type); + + if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0) + return -errno; + + if (l != sizeof(other_type)) + return -EINVAL; + + if (other_type != type) + return 0; + } + + if (listening >= 0) { + int accepting = 0; + socklen_t l = sizeof(accepting); + + if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0) + return -errno; + + if (l != sizeof(accepting)) + return -EINVAL; + + if (!accepting != !listening) + return 0; + } + + return 1; +} + +/* SPDX-License-Identifier: MIT-0 */ + +/* Implement the systemd notify protocol without external dependencies. + * Supports both readiness notification on startup and on reloading, + * according to the protocol defined at: + * https://www.freedesktop.org/software/systemd/man/latest/sd_notify.html + * This protocol is guaranteed to be stable as per: + * https://systemd.io/PORTABILITY_AND_STABILITY/ */ + +static void closep(int *fd) { + if (!fd || *fd < 0) + return; + + close(*fd); + *fd = -1; +} + +static int sd_notify(const char *message) { + union sockaddr_union { + struct sockaddr sa; + struct sockaddr_un sun; + } socket_addr = { + .sun.sun_family = AF_UNIX, + }; + size_t path_length, message_length; + _cleanup_(closep) int fd = -1; + const char *socket_path; + + /* Verify the argument first */ + if (!message) + return -EINVAL; + + message_length = strlen(message); + if (message_length == 0) + return -EINVAL; + + /* If the variable is not set, the protocol is a noop */ + socket_path = getenv("NOTIFY_SOCKET"); + if (!socket_path) + return 0; /* Not set? Nothing to do */ + + /* Only AF_UNIX is supported, with path or abstract sockets */ + if (socket_path[0] != '/' && socket_path[0] != '@') + return -EAFNOSUPPORT; + + path_length = strlen(socket_path); + /* Ensure there is room for NUL byte */ + if (path_length >= sizeof(socket_addr.sun.sun_path)) + return -E2BIG; + + memcpy(socket_addr.sun.sun_path, socket_path, path_length); + + /* Support for abstract socket */ + if (socket_addr.sun.sun_path[0] == '@') + socket_addr.sun.sun_path[0] = 0; + + fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); + if (fd < 0) + return -errno; + + if (connect(fd, &socket_addr.sa, offsetof(struct sockaddr_un, sun_path) + path_length) != 0) + return -errno; + + ssize_t written = write(fd, message, message_length); + if (written != (ssize_t) message_length) + return written < 0 ? -errno : -EPROTO; + + return 1; /* Notified! */ +} + +int sd_notify_ready(void) { + return sd_notify("READY=1"); +} + +int sd_notify_stopping(void) { + return sd_notify("STOPPING=1"); +} diff --git a/lib/sd-socket.h b/lib/sd-socket.h new file mode 100644 index 00000000000..217dbfce8a6 --- /dev/null +++ b/lib/sd-socket.h @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* Copied and adapted from systemd source code. */ +#ifndef _SD_SOCKET_H +#define _SD_SOCKET_H 1 + +#include +#include +#include + +/* + The following functionality is provided: + + - Support for logging with log levels on stderr + - File descriptor passing for socket-based activation + - Daemon startup and status notification + - Detection of systemd boots + + See sd-daemon(3) for more information. +*/ + +/* The first passed file descriptor is fd 3 */ +#define SD_LISTEN_FDS_START 3 + +/* + Helper call for identifying a passed file descriptor. Returns 1 if + the file descriptor is a socket of type (SOCK_DGRAM, SOCK_STREAM, + ...), 0 otherwise. If type is 0 a socket type check will not be done + and the call only verifies if the file descriptor refers to a + socket. If listening is > 0 it is verified that the socket is in + listening mode. (i.e. listen() has been called) If listening is == 0 + it is verified that the socket is not in listening mode. If + listening is < 0 no listening mode check is done. Returns a negative + errno style error code on failure. + + See sd_is_socket(3) for more information. +*/ +int sd_is_socket(int fd, int type, int listening); + +/* + Tells systemd that daemon startup or daemon reload is finished (only + relevant for services of Type=notify). + + See https://www.freedesktop.org/software/systemd/man/devel/sd_notify.html#Notes + for more information. +*/ +int sd_notify_ready(void); + +/* + Tells systemd that the daemon is about to go down. + + See https://www.freedesktop.org/software/systemd/man/devel/sd_notify.html#Notes + for more information. + + */ +int sd_notify_stopping(void); + +#endif diff --git a/msdos/sed1v2.inp b/msdos/sed1v2.inp index 4d4c80a6b1a..d6d80ff809c 100644 --- a/msdos/sed1v2.inp +++ b/msdos/sed1v2.inp @@ -138,8 +138,6 @@ s/ *@WEBP_LIBS@// /^LIBMODULES *=/s/@LIBMODULES@// /^MODULES_OBJ *=/s/@MODULES_OBJ@// /^LIBSELINUX_LIBS *=/s/@LIBSELINUX_LIBS@// -/^LIBSYSTEMD_LIBS *=/s/@LIBSYSTEMD_LIBS@// -/^LIBSYSTEMD_CFLAGS *=/s/@LIBSYSTEMD_CFLAGS@// /^LIB_CLOCK_GETTIME *=/s/@[^@\n]*@//g /^LIB_TIMER_TIME *=/s/@[^@\n]*@//g /^LIB_EXECINFO *=/s/@[^@\n]*@//g @@ -269,7 +267,6 @@ s/echo.*buildobj.lst/dj&/ # Make the GCC command line fit one screen line /^[ ][ ]*\$(GNUSTEP_CFLAGS)/d /^[ ][ ]*\$(LIBGNUTLS_CFLAGS)/d -/^[ ][ ]*\$(LIBSYSTEMD_CFLAGS)/d /^[ ][ ]*\$(XRANDR_CFLAGS)/d /^[ ][ ]*\$(WEBKIT_CFLAGS)/d /^[ ][ ]*\$(SETTINGS_CFLAGS)/d diff --git a/src/Makefile.in b/src/Makefile.in index 9bc53c072ea..d3a7f432ea8 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -336,9 +336,6 @@ LIBSELINUX_LIBS = LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ -LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@ -LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@ - JSON_LIBS = @JSON_LIBS@ JSON_CFLAGS = @JSON_CFLAGS@ JSON_OBJ = @JSON_OBJ@ @@ -405,11 +402,11 @@ EMACS_CFLAGS= $(C_SWITCH_MACHINE) $(C_SWITCH_SYSTEM) $(C_SWITCH_X_SITE) \ $(GNUSTEP_CFLAGS) $(CFLAGS_SOUND) $(RSVG_CFLAGS) $(IMAGEMAGICK_CFLAGS) \ $(PNG_CFLAGS) $(LIBXML2_CFLAGS) $(LIBGCCJIT_CFLAGS) $(DBUS_CFLAGS) \ - $(XRANDR_CFLAGS) $(XINERAMA_CFLAGS) $(XFIXES_CFLAGS) $(XDBE_CFLAGS) \ + $(XRANDR_CFLAGS) $(XINERAMA_CFLAGS) $(XFIXES_CFLAGS) $(XDBE_CFAGS) \ $(XINPUT_CFLAGS) $(WEBP_CFLAGS) $(WEBKIT_CFLAGS) $(LCMS2_CFLAGS) \ $(SETTINGS_CFLAGS) $(FREETYPE_CFLAGS) $(FONTCONFIG_CFLAGS) \ $(HARFBUZZ_CFLAGS) $(LIBOTF_CFLAGS) $(M17N_FLT_CFLAGS) $(DEPFLAGS) \ - $(LIBSYSTEMD_CFLAGS) $(JSON_CFLAGS) $(XSYNC_CFLAGS) $(TREE_SITTER_CFLAGS) \ + $(JSON_CFLAGS) $(XSYNC_CFLAGS) $(TREE_SITTER_CFLAGS) \ $(LIBGNUTLS_CFLAGS) $(NOTIFY_CFLAGS) $(CAIRO_CFLAGS) \ $(WERROR_CFLAGS) $(HAIKU_CFLAGS) $(XCOMPOSITE_CFLAGS) $(XSHAPE_CFLAGS) ALL_CFLAGS = $(EMACS_CFLAGS) $(WARN_CFLAGS) $(CFLAGS) @@ -567,7 +564,7 @@ LIBES = $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \ $(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(HARFBUZZ_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \ $(LIBGNUTLS_LIBS) $(LIB_PTHREAD) $(GETADDRINFO_A_LIBS) $(LCMS2_LIBS) \ - $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES) $(LIBSYSTEMD_LIBS) \ + $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES) \ $(JSON_LIBS) $(LIBGMP) $(LIBGCCJIT_LIBS) $(XINPUT_LIBS) $(HAIKU_LIBS) \ $(TREE_SITTER_LIBS) $(SQLITE3_LIBS) $(XCOMPOSITE_LIBS) $(XSHAPE_LIBS) diff --git a/src/deps.mk b/src/deps.mk index a7c8ae11f72..b932764f267 100644 --- a/src/deps.mk +++ b/src/deps.mk @@ -92,7 +92,7 @@ editfns.o: emacs.o: emacs.c commands.h systty.h syssignal.h blockinput.h process.h \ termhooks.h buffer.h atimer.h systime.h $(INTERVALS_H) lisp.h $(config_h) \ globals.h ../lib/unistd.h window.h dispextern.h keyboard.h keymap.h \ - frame.h coding.h gnutls.h msdos.h dosfns.h unexec.h + frame.h coding.h gnutls.h msdos.h dosfns.h unexec.h ../lib/sd-socket.h fileio.o: fileio.c window.h buffer.h systime.h $(INTERVALS_H) character.h \ coding.h msdos.h blockinput.h atimer.h lisp.h $(config_h) frame.h \ commands.h globals.h ../lib/unistd.h diff --git a/src/emacs.c b/src/emacs.c index dde305edbc2..c0381c23c37 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -57,10 +57,8 @@ #define MAIN_PROGRAM #include "dosfns.h" #endif -#ifdef HAVE_LIBSYSTEMD -# include -# include -#endif +#include "sd-socket.h" +#include #if defined HAVE_LINUX_SECCOMP_H && defined HAVE_LINUX_FILTER_H \ && HAVE_DECL_SECCOMP_SET_MODE_FILTER \ @@ -1719,20 +1717,19 @@ main (int argc, char **argv) } } /* daemon_type == 2 */ -#ifdef HAVE_LIBSYSTEMD /* Read the number of sockets passed through by systemd. */ - int systemd_socket = sd_listen_fds (1); - - if (systemd_socket > 1) - fputs (("\n" - "Warning: systemd passed more than one socket to Emacs.\n" - "Try 'Accept=false' in the Emacs socket unit file.\n"), - stderr); - else if (systemd_socket == 1 - && (0 < sd_is_socket (SD_LISTEN_FDS_START, - AF_UNSPEC, SOCK_STREAM, 1))) - sockfd = SD_LISTEN_FDS_START; -#endif /* HAVE_LIBSYSTEMD */ + const char *fds = getenv("LISTEN_FDS"); + if (fds) { + int systemd_socket = strtol(fds, NULL, 0); + if (systemd_socket > 1) + fputs (("\n" + "Warning: systemd passed more than one socket to Emacs.\n" + "Try 'Accept=false' in the Emacs socket unit file.\n"), + stderr); + else if (systemd_socket == 1 + && (0 < sd_is_socket (SD_LISTEN_FDS_START, SOCK_STREAM, 1))) + sockfd = SD_LISTEN_FDS_START; + } /* On X, the bug happens because we call abort to avoid GLib crashes upon a longjmp in our X error handler. @@ -2857,12 +2854,15 @@ DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 2, "P", } #endif -#ifdef HAVE_LIBSYSTEMD /* Notify systemd we are shutting down, but only if we have notified it about startup. */ - if (daemon_type == -1) - sd_notify(0, "STOPPING=1"); -#endif /* HAVE_LIBSYSTEMD */ + if (daemon_type == -1){ + int r = sd_notify_stopping(); + if (r < 0) { + fprintf(stderr, "Failed to report termination to $NOTIFY_SOCKET: %s\n", strerror(-r)); + exit (EXIT_FAILURE); + } + } /* Fsignal calls emacs_abort () if it sees that waiting_for_input is set. */ @@ -3382,9 +3382,11 @@ DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0, if (daemon_type == 1) { -#ifdef HAVE_LIBSYSTEMD - sd_notify(0, "READY=1"); -#endif /* HAVE_LIBSYSTEMD */ + int r = sd_notify_ready(); + if (r < 0) { + fprintf(stderr, "Failed to notify readiness to $NOTIFY_SOCKET: %s\n", strerror(-r)); + exit (EXIT_FAILURE); + } } if (daemon_type == 2) -- 2.41.0 --=-=-= Content-Type: text/plain On 2024-05-11 22:15, Nicolas Graves wrote: > On 2024-04-13 11:16, Stefan Monnier wrote: > >>> Maybe some feedback on the Emacs side about this? There are indeed very >>> few places where systemd sd_* functions are called in emacs.c, should we >>> try and re-implement them instead of using the library as is? Would that >>> be a contribution Emacs devs would be interested in? That would >>> definitely be beneficial for Emacs on Guix as highlighted by Ludo'. >> >> It's hard to tell without seeing the actual patch. > > Seems to work properly on my side with the following patch, on Guix with > the shepherd service I sent a few weeks ago. The patch is actually > pretty simple. > > Some choices : > > - I removed most of the code in former function sd_listen_fds' upstream > source code, because it didn't seem related to integration functionality > with emacs but rather to systemd inner workings. Some edge cases might > not be as well covered (strtol with defaults instead of systemd's > safe_atoi), but it works on my side. The functionality is directly > integrated in emacs.c rather than the function itself reproduced. > > - I simplified the sd_is_socket function to instead use the upstream > untouched sd_is_socket_internal function. This is because the default > family argument was set in emacs.c. > > - The sd_notify code is taken from > https://www.freedesktop.org/software/systemd/man/devel/sd_notify.html#Notes > > Disclaimer : I'm not a seasoned C nor emacs developer, some things are > probably odd, but I would need for feedback to make things more emacsy / > rigorous in C. > > From c9f3af7dc4accc4da352ef8ffdb95478bcf2bd16 Mon Sep 17 00:00:00 2001 > From: Nicolas Graves > Date: Sat, 13 Apr 2024 19:37:34 +0200 > Subject: [PATCH] Implement systemd socket. > > --- > configure.ac | 19 +----- > lib/Makefile.in | 2 +- > lib/gnulib.mk.in | 2 - > lib/sd-socket.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++ > lib/sd-socket.h | 127 ++++++++++++++++++++++++++++++++++++++++ > msdos/sed1v2.inp | 3 - > src/Makefile.in | 9 +-- > src/deps.mk | 2 +- > src/emacs.c | 50 ++++++++-------- > 9 files changed, 308 insertions(+), 55 deletions(-) > create mode 100644 lib/sd-socket.c > create mode 100644 lib/sd-socket.h > > diff --git a/configure.ac b/configure.ac > index 29b71ea2730..a245a7b5ccc 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -457,7 +457,6 @@ AC_DEFUN > OPTION_DEFAULT_ON([webp],[don't compile with WebP image support]) > OPTION_DEFAULT_ON([sqlite3],[don't compile with sqlite3 support]) > OPTION_DEFAULT_ON([lcms2],[don't compile with Little CMS support]) > -OPTION_DEFAULT_ON([libsystemd],[don't compile with libsystemd support]) > OPTION_DEFAULT_ON([cairo],[don't compile with Cairo drawing]) > OPTION_DEFAULT_OFF([cairo-xcb], [use XCB surfaces for Cairo support]) > OPTION_DEFAULT_ON([xml2],[don't compile with XML parsing support]) > @@ -3203,21 +3202,6 @@ AC_DEFUN > AC_SUBST([LIBGNUTLS_LIBS]) > AC_SUBST([LIBGNUTLS_CFLAGS]) > > -HAVE_LIBSYSTEMD=no > -if test "${with_libsystemd}" = "yes" ; then > - dnl This code has been tested with libsystemd 222 and later. > - dnl FIXME: Find the earliest version number for which Emacs should work, > - dnl and change '222' to that number. > - EMACS_CHECK_MODULES([LIBSYSTEMD], [libsystemd >= 222], > - [HAVE_LIBSYSTEMD=yes], [HAVE_LIBSYSTEMD=no]) > - if test "${HAVE_LIBSYSTEMD}" = "yes"; then > - AC_DEFINE([HAVE_LIBSYSTEMD], [1], [Define if using libsystemd.]) > - fi > -fi > - > -AC_SUBST([LIBSYSTEMD_LIBS]) > -AC_SUBST([LIBSYSTEMD_CFLAGS]) > - > HAVE_JSON=no > JSON_OBJ= > > @@ -6652,7 +6636,7 @@ AC_DEFUN > optsep= > emacs_config_features= > for opt in ACL BE_APP CAIRO DBUS FREETYPE GCONF GIF GLIB GMP GNUTLS GPM GSETTINGS \ > - HARFBUZZ IMAGEMAGICK JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 \ > + HARFBUZZ IMAGEMAGICK JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBXML2 \ > M17N_FLT MODULES NATIVE_COMP NOTIFY NS OLDXMENU PDUMPER PGTK PNG RSVG SECCOMP \ > SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER \ > UNEXEC WEBP X11 XAW3D XDBE XFT XIM XINPUT2 XPM XWIDGETS X_TOOLKIT \ > @@ -6721,7 +6705,6 @@ AC_DEFUN > Does Emacs use -lm17n-flt? ${HAVE_M17N_FLT} > Does Emacs use -lotf? ${HAVE_LIBOTF} > Does Emacs use -lxft? ${HAVE_XFT} > - Does Emacs use -lsystemd? ${HAVE_LIBSYSTEMD} > Does Emacs use -ljansson? ${HAVE_JSON} > Does Emacs use -ltree-sitter? ${HAVE_TREE_SITTER} > Does Emacs use the GMP library? ${HAVE_GMP} > diff --git a/lib/Makefile.in b/lib/Makefile.in > index 71199c32277..d934a755e85 100644 > --- a/lib/Makefile.in > +++ b/lib/Makefile.in > @@ -74,7 +74,7 @@ Makefile: > not_emacs_OBJECTS = regex.o malloc/%.o free.o > > libgnu_a_OBJECTS = fingerprint.o $(gl_LIBOBJS) \ > - $(patsubst %.c,%.o,$(filter %.c,$(libgnu_a_SOURCES))) > + $(patsubst %.c,%.o,$(filter %.c,$(libgnu_a_SOURCES))) sd-socket.o > for_emacs_OBJECTS = $(filter-out $(not_emacs_OBJECTS),$(libgnu_a_OBJECTS)) > libegnu_a_OBJECTS = $(patsubst %.o,e-%.o,$(for_emacs_OBJECTS)) > > diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in > index 9ab4b741595..f9ed4a4cb23 100644 > --- a/lib/gnulib.mk.in > +++ b/lib/gnulib.mk.in > @@ -912,8 +912,6 @@ LIBSECCOMP_CFLAGS = @LIBSECCOMP_CFLAGS@ > LIBSECCOMP_LIBS = @LIBSECCOMP_LIBS@ > LIBSELINUX_LIBS = @LIBSELINUX_LIBS@ > LIBSOUND = @LIBSOUND@ > -LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@ > -LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@ > LIBS_ECLIENT = @LIBS_ECLIENT@ > LIBS_GNUSTEP = @LIBS_GNUSTEP@ > LIBS_MAIL = @LIBS_MAIL@ > diff --git a/lib/sd-socket.c b/lib/sd-socket.c > new file mode 100644 > index 00000000000..6350882006d > --- /dev/null > +++ b/lib/sd-socket.c > @@ -0,0 +1,149 @@ > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > +/* Copied and adapted from systemd source code. */ > + > +#define _GNU_SOURCE 1 > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "sd-socket.h" > +#define _cleanup_(f) __attribute__((cleanup(f))) > + > +int sd_is_socket(int fd, int type, int listening) { > + struct stat st_fd; > + > + assert(fd >= 0); > + assert(type >= 0); > + > + if (fstat(fd, &st_fd) < 0) > + return -errno; > + > + if (!S_ISSOCK(st_fd.st_mode)) > + return 0; > + > + if (type != 0) { > + int other_type = 0; > + socklen_t l = sizeof(other_type); > + > + if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0) > + return -errno; > + > + if (l != sizeof(other_type)) > + return -EINVAL; > + > + if (other_type != type) > + return 0; > + } > + > + if (listening >= 0) { > + int accepting = 0; > + socklen_t l = sizeof(accepting); > + > + if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0) > + return -errno; > + > + if (l != sizeof(accepting)) > + return -EINVAL; > + > + if (!accepting != !listening) > + return 0; > + } > + > + return 1; > +} > + > +/* SPDX-License-Identifier: MIT-0 */ > + > +/* Implement the systemd notify protocol without external dependencies. > + * Supports both readiness notification on startup and on reloading, > + * according to the protocol defined at: > + * https://www.freedesktop.org/software/systemd/man/latest/sd_notify.html > + * This protocol is guaranteed to be stable as per: > + * https://systemd.io/PORTABILITY_AND_STABILITY/ */ > + > +static void closep(int *fd) { > + if (!fd || *fd < 0) > + return; > + > + close(*fd); > + *fd = -1; > +} > + > +static int sd_notify(const char *message) { > + union sockaddr_union { > + struct sockaddr sa; > + struct sockaddr_un sun; > + } socket_addr = { > + .sun.sun_family = AF_UNIX, > + }; > + size_t path_length, message_length; > + _cleanup_(closep) int fd = -1; > + const char *socket_path; > + > + /* Verify the argument first */ > + if (!message) > + return -EINVAL; > + > + message_length = strlen(message); > + if (message_length == 0) > + return -EINVAL; > + > + /* If the variable is not set, the protocol is a noop */ > + socket_path = getenv("NOTIFY_SOCKET"); > + if (!socket_path) > + return 0; /* Not set? Nothing to do */ > + > + /* Only AF_UNIX is supported, with path or abstract sockets */ > + if (socket_path[0] != '/' && socket_path[0] != '@') > + return -EAFNOSUPPORT; > + > + path_length = strlen(socket_path); > + /* Ensure there is room for NUL byte */ > + if (path_length >= sizeof(socket_addr.sun.sun_path)) > + return -E2BIG; > + > + memcpy(socket_addr.sun.sun_path, socket_path, path_length); > + > + /* Support for abstract socket */ > + if (socket_addr.sun.sun_path[0] == '@') > + socket_addr.sun.sun_path[0] = 0; > + > + fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); > + if (fd < 0) > + return -errno; > + > + if (connect(fd, &socket_addr.sa, offsetof(struct sockaddr_un, sun_path) + path_length) != 0) > + return -errno; > + > + ssize_t written = write(fd, message, message_length); > + if (written != (ssize_t) message_length) > + return written < 0 ? -errno : -EPROTO; > + > + return 1; /* Notified! */ > +} > + > +int sd_notify_ready(void) { > + return sd_notify("READY=1"); > +} > + > +int sd_notify_stopping(void) { > + return sd_notify("STOPPING=1"); > +} > diff --git a/lib/sd-socket.h b/lib/sd-socket.h > new file mode 100644 > index 00000000000..31450c731e9 > --- /dev/null > +++ b/lib/sd-socket.h > @@ -0,0 +1,127 @@ > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > +/* Copied and adapted from systemd source code. */ > +#ifndef _SD_SOCKET_H > +#define _SD_SOCKET_H 1 > + > +#include > +#include > +#include > + > +/* > + The following functionality is provided: > + > + - Support for logging with log levels on stderr > + - File descriptor passing for socket-based activation > + - Daemon startup and status notification > + - Detection of systemd boots > + > + See sd-daemon(3) for more information. > +*/ > + > +/* The first passed file descriptor is fd 3 */ > +#define SD_LISTEN_FDS_START 3 > + > +/* > + Helper call for identifying a passed file descriptor. Returns 1 if > + the file descriptor is a socket of type (SOCK_DGRAM, SOCK_STREAM, > + ...), 0 otherwise. If type is 0 a socket type check will not be done > + and the call only verifies if the file descriptor refers to a > + socket. If listening is > 0 it is verified that the socket is in > + listening mode. (i.e. listen() has been called) If listening is == 0 > + it is verified that the socket is not in listening mode. If > + listening is < 0 no listening mode check is done. Returns a negative > + errno style error code on failure. > + > + See sd_is_socket(3) for more information. > +*/ > +int sd_is_socket(int fd, int type, int listening); > + > +/* > + Informs systemd about changed daemon state. This takes a number of > + newline separated environment-style variable assignments in a > + string. The following variables are known: > + > + MAINPID=... The main PID of a daemon, in case systemd did not > + fork off the process itself. Example: "MAINPID=4711" > + > + READY=1 Tells systemd that daemon startup or daemon reload > + is finished (only relevant for services of Type=notify). > + The passed argument is a boolean "1" or "0". Since there > + is little value in signaling non-readiness the only > + value daemons should send is "READY=1". > + > + RELOADING=1 Tell systemd that the daemon began reloading its > + configuration. When the configuration has been > + reloaded completely, READY=1 should be sent to inform > + systemd about this. > + > + STOPPING=1 Tells systemd that the daemon is about to go down. > + > + STATUS=... Passes a single-line status string back to systemd > + that describes the daemon state. This is free-form > + and can be used for various purposes: general state > + feedback, fsck-like programs could pass completion > + percentages and failing programs could pass a human > + readable error message. Example: "STATUS=Completed > + 66% of file system check..." > + > + NOTIFYACCESS=... > + Reset the access to the service status notification socket. > + Example: "NOTIFYACCESS=main" > + > + ERRNO=... If a daemon fails, the errno-style error code, > + formatted as string. Example: "ERRNO=2" for ENOENT. > + > + BUSERROR=... If a daemon fails, the D-Bus error-style error > + code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut" > + > + WATCHDOG=1 Tells systemd to update the watchdog timestamp. > + Services using this feature should do this in > + regular intervals. A watchdog framework can use the > + timestamps to detect failed services. Also see > + sd_watchdog_enabled() below. > + > + WATCHDOG_USEC=... > + Reset watchdog_usec value during runtime. > + To reset watchdog_usec value, start the service again. > + Example: "WATCHDOG_USEC=20000000" > + > + FDSTORE=1 Store the file descriptors passed along with the > + message in the per-service file descriptor store, > + and pass them to the main process again on next > + invocation. This variable is only supported with > + sd_pid_notify_with_fds(). > + > + FDSTOREREMOVE=1 > + Remove one or more file descriptors from the file > + descriptor store, identified by the name specified > + in FDNAME=, see below. > + > + FDNAME= A name to assign to new file descriptors stored in the > + file descriptor store, or the name of the file descriptors > + to remove in case of FDSTOREREMOVE=1. > + > + Daemons can choose to send additional variables. However, it is > + recommended to prefix variable names not listed above with X_. > + > + Returns a negative errno-style error code on failure. Returns > 0 > + if systemd could be notified, 0 if it couldn't possibly because > + systemd is not running. > + > + Example: When a daemon finished starting up, it could issue this > + call to notify systemd about it: > + > + sd_notify(0, "READY=1"); > + > + See sd_notifyf() for more complete examples. > + > + See sd_notify(3) for more information. > +*/ > + > +/* This is actually a simplified version that you can find right there : > + https://www.freedesktop.org/software/systemd/man/devel/sd_notify.html#Notes > + */ > +int sd_notify_ready(void); > +int sd_notify_stopping(void); > + > +#endif > diff --git a/msdos/sed1v2.inp b/msdos/sed1v2.inp > index 4d4c80a6b1a..d6d80ff809c 100644 > --- a/msdos/sed1v2.inp > +++ b/msdos/sed1v2.inp > @@ -138,8 +138,6 @@ s/ *@WEBP_LIBS@// > /^LIBMODULES *=/s/@LIBMODULES@// > /^MODULES_OBJ *=/s/@MODULES_OBJ@// > /^LIBSELINUX_LIBS *=/s/@LIBSELINUX_LIBS@// > -/^LIBSYSTEMD_LIBS *=/s/@LIBSYSTEMD_LIBS@// > -/^LIBSYSTEMD_CFLAGS *=/s/@LIBSYSTEMD_CFLAGS@// > /^LIB_CLOCK_GETTIME *=/s/@[^@\n]*@//g > /^LIB_TIMER_TIME *=/s/@[^@\n]*@//g > /^LIB_EXECINFO *=/s/@[^@\n]*@//g > @@ -269,7 +267,6 @@ s/echo.*buildobj.lst/dj&/ > # Make the GCC command line fit one screen line > /^[ ][ ]*\$(GNUSTEP_CFLAGS)/d > /^[ ][ ]*\$(LIBGNUTLS_CFLAGS)/d > -/^[ ][ ]*\$(LIBSYSTEMD_CFLAGS)/d > /^[ ][ ]*\$(XRANDR_CFLAGS)/d > /^[ ][ ]*\$(WEBKIT_CFLAGS)/d > /^[ ][ ]*\$(SETTINGS_CFLAGS)/d > diff --git a/src/Makefile.in b/src/Makefile.in > index 9bc53c072ea..d3a7f432ea8 100644 > --- a/src/Makefile.in > +++ b/src/Makefile.in > @@ -336,9 +336,6 @@ LIBSELINUX_LIBS = > LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ > LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ > > -LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@ > -LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@ > - > JSON_LIBS = @JSON_LIBS@ > JSON_CFLAGS = @JSON_CFLAGS@ > JSON_OBJ = @JSON_OBJ@ > @@ -405,11 +402,11 @@ EMACS_CFLAGS= > $(C_SWITCH_MACHINE) $(C_SWITCH_SYSTEM) $(C_SWITCH_X_SITE) \ > $(GNUSTEP_CFLAGS) $(CFLAGS_SOUND) $(RSVG_CFLAGS) $(IMAGEMAGICK_CFLAGS) \ > $(PNG_CFLAGS) $(LIBXML2_CFLAGS) $(LIBGCCJIT_CFLAGS) $(DBUS_CFLAGS) \ > - $(XRANDR_CFLAGS) $(XINERAMA_CFLAGS) $(XFIXES_CFLAGS) $(XDBE_CFLAGS) \ > + $(XRANDR_CFLAGS) $(XINERAMA_CFLAGS) $(XFIXES_CFLAGS) $(XDBE_CFAGS) \ > $(XINPUT_CFLAGS) $(WEBP_CFLAGS) $(WEBKIT_CFLAGS) $(LCMS2_CFLAGS) \ > $(SETTINGS_CFLAGS) $(FREETYPE_CFLAGS) $(FONTCONFIG_CFLAGS) \ > $(HARFBUZZ_CFLAGS) $(LIBOTF_CFLAGS) $(M17N_FLT_CFLAGS) $(DEPFLAGS) \ > - $(LIBSYSTEMD_CFLAGS) $(JSON_CFLAGS) $(XSYNC_CFLAGS) $(TREE_SITTER_CFLAGS) \ > + $(JSON_CFLAGS) $(XSYNC_CFLAGS) $(TREE_SITTER_CFLAGS) \ > $(LIBGNUTLS_CFLAGS) $(NOTIFY_CFLAGS) $(CAIRO_CFLAGS) \ > $(WERROR_CFLAGS) $(HAIKU_CFLAGS) $(XCOMPOSITE_CFLAGS) $(XSHAPE_CFLAGS) > ALL_CFLAGS = $(EMACS_CFLAGS) $(WARN_CFLAGS) $(CFLAGS) > @@ -567,7 +564,7 @@ LIBES = > $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \ > $(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(HARFBUZZ_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \ > $(LIBGNUTLS_LIBS) $(LIB_PTHREAD) $(GETADDRINFO_A_LIBS) $(LCMS2_LIBS) \ > - $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES) $(LIBSYSTEMD_LIBS) \ > + $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES) \ > $(JSON_LIBS) $(LIBGMP) $(LIBGCCJIT_LIBS) $(XINPUT_LIBS) $(HAIKU_LIBS) \ > $(TREE_SITTER_LIBS) $(SQLITE3_LIBS) $(XCOMPOSITE_LIBS) $(XSHAPE_LIBS) > > diff --git a/src/deps.mk b/src/deps.mk > index a7c8ae11f72..b932764f267 100644 > --- a/src/deps.mk > +++ b/src/deps.mk > @@ -92,7 +92,7 @@ editfns.o: > emacs.o: emacs.c commands.h systty.h syssignal.h blockinput.h process.h \ > termhooks.h buffer.h atimer.h systime.h $(INTERVALS_H) lisp.h $(config_h) \ > globals.h ../lib/unistd.h window.h dispextern.h keyboard.h keymap.h \ > - frame.h coding.h gnutls.h msdos.h dosfns.h unexec.h > + frame.h coding.h gnutls.h msdos.h dosfns.h unexec.h ../lib/sd-socket.h > fileio.o: fileio.c window.h buffer.h systime.h $(INTERVALS_H) character.h \ > coding.h msdos.h blockinput.h atimer.h lisp.h $(config_h) frame.h \ > commands.h globals.h ../lib/unistd.h > diff --git a/src/emacs.c b/src/emacs.c > index dde305edbc2..c0381c23c37 100644 > --- a/src/emacs.c > +++ b/src/emacs.c > @@ -57,10 +57,8 @@ #define MAIN_PROGRAM > #include "dosfns.h" > #endif > > -#ifdef HAVE_LIBSYSTEMD > -# include > -# include > -#endif > +#include "sd-socket.h" > +#include > > #if defined HAVE_LINUX_SECCOMP_H && defined HAVE_LINUX_FILTER_H \ > && HAVE_DECL_SECCOMP_SET_MODE_FILTER \ > @@ -1719,20 +1717,19 @@ main (int argc, char **argv) > } > } /* daemon_type == 2 */ > > -#ifdef HAVE_LIBSYSTEMD > /* Read the number of sockets passed through by systemd. */ > - int systemd_socket = sd_listen_fds (1); > - > - if (systemd_socket > 1) > - fputs (("\n" > - "Warning: systemd passed more than one socket to Emacs.\n" > - "Try 'Accept=false' in the Emacs socket unit file.\n"), > - stderr); > - else if (systemd_socket == 1 > - && (0 < sd_is_socket (SD_LISTEN_FDS_START, > - AF_UNSPEC, SOCK_STREAM, 1))) > - sockfd = SD_LISTEN_FDS_START; > -#endif /* HAVE_LIBSYSTEMD */ > + const char *fds = getenv("LISTEN_FDS"); > + if (fds) { > + int systemd_socket = strtol(fds, NULL, 0); > + if (systemd_socket > 1) > + fputs (("\n" > + "Warning: systemd passed more than one socket to Emacs.\n" > + "Try 'Accept=false' in the Emacs socket unit file.\n"), > + stderr); > + else if (systemd_socket == 1 > + && (0 < sd_is_socket (SD_LISTEN_FDS_START, SOCK_STREAM, 1))) > + sockfd = SD_LISTEN_FDS_START; > + } > > /* On X, the bug happens because we call abort to avoid GLib > crashes upon a longjmp in our X error handler. > @@ -2857,12 +2854,15 @@ DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 2, "P", > } > #endif > > -#ifdef HAVE_LIBSYSTEMD > /* Notify systemd we are shutting down, but only if we have notified > it about startup. */ > - if (daemon_type == -1) > - sd_notify(0, "STOPPING=1"); > -#endif /* HAVE_LIBSYSTEMD */ > + if (daemon_type == -1){ > + int r = sd_notify_stopping(); > + if (r < 0) { > + fprintf(stderr, "Failed to report termination to $NOTIFY_SOCKET: %s\n", strerror(-r)); > + exit (EXIT_FAILURE); > + } > + } > > /* Fsignal calls emacs_abort () if it sees that waiting_for_input is > set. */ > @@ -3382,9 +3382,11 @@ DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0, > > if (daemon_type == 1) > { > -#ifdef HAVE_LIBSYSTEMD > - sd_notify(0, "READY=1"); > -#endif /* HAVE_LIBSYSTEMD */ > + int r = sd_notify_ready(); > + if (r < 0) { > + fprintf(stderr, "Failed to notify readiness to $NOTIFY_SOCKET: %s\n", strerror(-r)); > + exit (EXIT_FAILURE); > + } > } > > if (daemon_type == 2) > -- > 2.41.0 > > >> >> But if the code is sufficiently simple, it implements a protocol that's >> well documented, and it allows us to eliminate the dependency on the >> systemd library, we might like it. >> >> >> Stefan >> -- Best regards, Nicolas Graves --=-=-=--