From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.migadu.com ([2001:41d0:306:2d92::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms9.migadu.com with LMTPS id AGKmLjrJHmVIJAEA9RJhRA:P1 (envelope-from ) for ; Thu, 05 Oct 2023 16:33:30 +0200 Received: from aspmx1.migadu.com ([2001:41d0:306:2d92::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id AGKmLjrJHmVIJAEA9RJhRA (envelope-from ) for ; Thu, 05 Oct 2023 16:33:30 +0200 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 3EE7E5C1E3 for ; Thu, 5 Oct 2023 16:33:30 +0200 (CEST) Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b="erceh9L/"; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1696516410; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=Qzq7FHWiPXKStbNUX0imjH9I9zt1tzFByrAIb3/RiE0=; b=qw8PaB3ckqnYc7DClYOsqx4tBuChrHstw1qpLEDZCZUY3zS0mO2mHY7vCyB+m6xEYXBJC2 j+pAploi3C2EbbFmN+wfpKU2lyanrT8YNcuUHKh5GD/chY/g6My3mLh8klZTU0zMQxacV5 MuL8d29aAJUEFPgcS8w0oagU3Fgt89dNPevP50PAzv1U/D7fHaxJSNw7El+E+PYaj0yILi hq5cZgRqaF66WMgC6lGeNCIVHVY709vd4IuHrlsGDqABXHT9g8yB62ZBGf6gvwA+xwwqlI V045eVeukEp9W7wJVMNt/4xFJzgOm4oVw8owYg/3osl3OAL3kDtN+4pqP15J6Q== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b="erceh9L/"; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Seal: i=1; s=key1; d=yhetil.org; t=1696516410; a=rsa-sha256; cv=none; b=MlanAnoU+DKy3WLRcLiW0UNM65BzhFH1PuzMdUWib/7qyMBSocrnMnRFmZdb8xFvFZ/4pQ XqaMY6aczRNE8U1GnXvObgUm5Bltc37NAykSWGjA6j+XJZAD/3FvXhBdj7ehjjRexpyn1r +I63J4gi06Csh0fuzRf0EGe5ulK0NyiMLv24/mcIcMN/wQNX9Pd7AH8I6xOJfGiikYaDmU BDD6CBYjaVRGvkVFhYNladAoyDJaYgeE+HGw6hTqn7ZYwXDMkgoFNHgaVZ8qDTPgoGlmGg 8uWMYWFJQzFhcJ7xcvO57l8riy1oPNqjxXv698qTRQaCT8Ln9cjq0AuiHRZLfA== Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qoPPS-0006OX-6K; Thu, 05 Oct 2023 10:33:02 -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 1qoPPC-00063v-VN for guix-patches@gnu.org; Thu, 05 Oct 2023 10:32:49 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qoPPA-0005fX-6w for guix-patches@gnu.org; Thu, 05 Oct 2023 10:32:45 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qoPPS-0008RE-D4 for guix-patches@gnu.org; Thu, 05 Oct 2023 10:33:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#66099] [PATCH gnome-team v7 3/5] gnu: udev-service-type: accept hwdb file extensions. Resent-From: Maxim Cournoyer Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 05 Oct 2023 14:33:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 66099 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Vivien Kraus Cc: 66099@debbugs.gnu.org, Liliana Marie Prikler , rg@raghavgururajan.name Received: via spool by 66099-submit@debbugs.gnu.org id=B66099.169651635032382 (code B ref 66099); Thu, 05 Oct 2023 14:33:02 +0000 Received: (at 66099) by debbugs.gnu.org; 5 Oct 2023 14:32:30 +0000 Received: from localhost ([127.0.0.1]:48066 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qoPOv-0008QD-4M for submit@debbugs.gnu.org; Thu, 05 Oct 2023 10:32:29 -0400 Received: from mail-qv1-xf30.google.com ([2607:f8b0:4864:20::f30]:60807) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qoPOh-0008Pl-Vm for 66099@debbugs.gnu.org; Thu, 05 Oct 2023 10:32:28 -0400 Received: by mail-qv1-xf30.google.com with SMTP id 6a1803df08f44-65cff6a6878so5354516d6.1 for <66099@debbugs.gnu.org>; Thu, 05 Oct 2023 07:31:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1696516311; x=1697121111; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=Qzq7FHWiPXKStbNUX0imjH9I9zt1tzFByrAIb3/RiE0=; b=erceh9L/nm3joNRsdlvP9E9XJ76PIyqDMdv3rqE4osGMPAbq0SJNhDt5S6g3mAjYE7 4VvZ/R8idec4g6Wl2AciDhMNa3gMkFjm09vivP+zlyWQS+5c0q83SGpM9ojhhFHOtaJf VKL59eLwjJAvpLKU82fDj/DWBTm2DORMSSJVWuzEN6oLhXXeBA6CkjmJEf8vTFmlLgXJ I8sIJRoET35NuR2U0uRH8C5v5FZNTfg6B2Lc3YQ+/LD+L3fHglAGIIifi0fkuKoEqUaG zF4tcDddhNWQTc8nLdzAFF3DcF00sboVsw9+rVJa/SNhy63JrYBbCuAHDsFHqzH/nO/T MP/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696516311; x=1697121111; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Qzq7FHWiPXKStbNUX0imjH9I9zt1tzFByrAIb3/RiE0=; b=bSleJuEizkPUAQn34OkMqtIwKQR3Ss62RO7dpul2nATghRmx5kMm+1OwsvGfa0ffZz AcTNSiD9aXPz8I+90VuJNGFbnZyEAu66NX4nXzwRzUpnj3b9p6os9Q/mT2+BY/A8xrkJ +qB+8vK9WKbcEzILxjMhjrpm8nTRJQ3y+V8+mdQGW4iHXF20LEkwh3ZKq0pxjeBMvRHF 4WdPXU4pQcK5q4DLVxqSPKunF0/BH+S5+o42G24bFDoXC/G1HI3Yjp8jRbXEBd8H31CL Qji6tw9A0L2mLeCn49CpJ6R31u84arlEDaIH6OkUi4zMPGmKeYY4VLifAzN2BcsjEB+4 bB9w== X-Gm-Message-State: AOJu0YxhLep/lOITlmKEFRYv9HEgALIIomilAgUXR0/JVqZl49Zme0WK hgxV2tyNLNQ8z0Snn8mNCkM= X-Google-Smtp-Source: AGHT+IF32F5wEYaZjzfun5PFWlsiMYUMjXCciwsSujGf0Cb7aOhtBD6IdQFkey1uifpcftsyDODNew== X-Received: by 2002:a0c:e54f:0:b0:64a:92e9:10e4 with SMTP id n15-20020a0ce54f000000b0064a92e910e4mr4551849qvm.63.1696516311428; Thu, 05 Oct 2023 07:31:51 -0700 (PDT) Received: from hurd (dsl-151-116.b2b2c.ca. [66.158.151.116]) by smtp.gmail.com with ESMTPSA id a14-20020a0cca8e000000b00655e4f57732sm536453qvk.35.2023.10.05.07.31.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Oct 2023 07:31:51 -0700 (PDT) From: Maxim Cournoyer In-Reply-To: <53b29725dbfa2210a4b29105828c611550a8eab7.1696482243.git.vivien@planete-kraus.eu> (Vivien Kraus's message of "Mon, 2 Oct 2023 21:08:49 +0200") References: <69e084520f189ab5f8a80afc7011a9b1ae911d2a.camel@gmail.com> <53b29725dbfa2210a4b29105828c611550a8eab7.1696482243.git.vivien@planete-kraus.eu> Date: Thu, 05 Oct 2023 10:31:50 -0400 Message-ID: <87lechrvhl.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Spam-Score: -0.59 X-Migadu-Scanner: mx2.migadu.com X-Migadu-Queue-Id: 3EE7E5C1E3 X-Spam-Score: -0.59 X-TUID: htp5uYioR8Hj Hi Vivien, Vivien Kraus writes: > The "rules" field in the udev-configuration record can now hold both rules and > hwdb files. > > The udev-rules-union has been made generic, and renamed to > udev-configuration-union, so that it works with either rules or hwdb files. > > Some udev-related auxiliary functions in (gnu services base) had non-texinfo > variable references in their docstrings ("FILE-NAME" instead of > "@var{file-name}"). That's fairly conventional. Texinfo is used in the manual documentation, package synopsis/descriptions and services documentation, not for every doc string in the code base. > The contents of the /etc directory now includes hwdb.d and hwdb.bin, which is > computed immediately. > > The documentation has been reworked so as to explain why creating udev rules > or hwdb needs helper functions for configuration or extension. > > The hwdb.bin file is conditionally computed by a native version of eudev, that > may be configured in the udev-service-type configuration. The condition is > that both target and native eudev have the same version. If so, we can > reasonably expect that the hwdb.bin file created by native eudev can later be > read by target eudev. > > * gnu/services/base.scm (udev-configuration-union): Make udev-rules-union generic. > (udev-hwdb): New function. > (file->udev-rule): Fix docstring. > (file->udev-hwdb): New function. > (udev-rules-service): Fix docstring. > (udev-hwdb-service): New function. > (udev-etc): Add hwdb.d and hwdb.bin. > (module): Export udev-hwdb, file->udev-hwdb, and udev-hwdb-service. > (): Add the native-udev field. > * doc/guix.texi (Base Services)[udev-service-type]: Explain configuration and > extension values. > * doc/guix.texi (Base Services)[udev-hwdb]: Document it. > [udev-hwdb-service]: Same. > * doc/guix.texi (Base Services)[udev-configuration]: Document the native-udev > field. > --- > doc/guix.texi | 52 +++++++++++++++++++----- > gnu/services/base.scm | 94 ++++++++++++++++++++++++++++++++++++------- > 2 files changed, 122 insertions(+), 24 deletions(-) > > diff --git a/doc/guix.texi b/doc/guix.texi > index 46591b2f64..3310271ec8 100644 > --- a/doc/guix.texi > +++ b/doc/guix.texi > @@ -19322,9 +19322,23 @@ Base Services > @file{/dev} directory dynamically, whose value is a > @code{} object. > > -This service type can be @emph{extended} using procedures > -@code{udev-rules-service} along with @code{file->udev-rule} or > -@code{udev-rule} which simplify the process of writing udev rules. > +Since the file names for udev rules and hwdb files matters, the s/matters/matter/ > +configuration items for rules and hwdb cannot simply be plain file-like > +objects with the rules content, because the name would be > +ignored. Instead, they are directory file-like objects that contain Please use double spaces to separate sentences (Guix convention). > +optional rules in @code{lib/udev/rules.d} and optional hwdb files in > +@code{lib/udev/hwdb.d}. This way, the service can be configured with s/@code/@file/ > +whole packages from which to take rules and hwdb files. > + > +The @code{udev-service-type} can be @emph{extended} with file-like > +directories that respect this hierarchy. However, to generate a > +configuration or an extension, it is advised to use @code{udev-rule} > and "However" sounds a bit strange to me. I'd rephrase the sentence to "For convenience, the @code{udev-rule} and @code{file->udev-rule} can be used to construct udev rules, while @code{udev-hwdb} and @code{file->udev-hwd} can be used to construct hwdb files." > +@code{file->udev-rule} for rules, and @code{udev-hwdb} and > +@code{file->udev-hwdb} for hwdb files. > + > +In an operating-system declaration, this service type can be @code{operating-system} > +@emph{extended} using procedures @code{udev-rules-service} and > +@code{udev-hwdb-service}. > @end defvar > > @deftp {Data Type} udev-configuration > @@ -19334,8 +19348,18 @@ Base Services > @item @code{udev} (default: @code{eudev}) (type: file-like) > Package object of the udev service. > > +@item @code{native-udev} (default: @code{eudev}) (type: file-like) > +Native udev package to compile @code{hwdb.bin}. The trie format used for > +@code{hwdb.bin} must be compatible with the @code{udev} and > +@code{native-udev} fields of the udev configuration. To avoid generating > +@code{hwdb.bin}, pass @code{#f} as the @code{native-udev} field. > + > +In any case, if the package version string differs between @code{udev} > +and @code{native-udev}, @code{hwdb.bin} is @strong{not} created. Shouldn't that raise an error with a useful error message? Then it doesn't need to be documented here. Thinking again, why is it necessary to have an explicite native-udev field? The gexps mechanism of the service could perhaps use #+udev instead of #$udev where needed, sharing the same 'udev' field for both purposes? > @item @code{rules} (default: @var{'()}) (type: list-of-file-like) > -List of file-like objects denoting udev-rule files. > +List of file-like objects denoting udev-rule or udev-hwdb files under a > +sub-directory. > > @end table > @end deftp > @@ -19358,6 +19382,11 @@ Base Services > @end lisp > @end deffn > > +@deffn {Procedure} udev-hwdb @var{file-name} @var{contents} > +Return a udev-hwdb file named @var{file-name} containing the hardware > +information @var{contents}. > +@end deffn > + > @deffn {Procedure} udev-rules-service @var{name} @var{rules} [#:groups '()] > Return a service that extends @code{udev-service-type} with @var{rules} > and @code{account-service-type} with @var{groups} as system groups. > @@ -19377,6 +19406,11 @@ Base Services > @end lisp > @end deffn > > +@deffn {Procedure} udev-hwdb-service @var{name} @var{hwdb} > +Return a service that extends @code{udev-service-type} with > +@var{hwdb}. The service name is @code{@var{name}-udev-hwdb}. > +@end deffn > + > @deffn {Procedure} file->udev-rule @var{file-name} @var{file} > Return a udev-rule file named @var{file-name} containing the rules > defined within @var{file}, a file-like object. > @@ -19401,12 +19435,10 @@ Base Services > @end lisp > @end deffn > > -Additionally, Guix package definitions can be included in @var{rules} in > -order to extend the udev rules with the definitions found under their > -@file{lib/udev/rules.d} sub-directory. In lieu of the previous > -@var{file->udev-rule} example, we could have used the > -@var{android-udev-rules} package which exists in Guix in the @code{(gnu > -packages android)} module. I'd preserve the disclaimer that for this example, it's wiser to simply use the @code{android-udev-rules} package. > +@deffn {Procedure} file->udev-hwdb @var{file-name} @var{file} > +Return a udev-hwdb file named @var{file-name} containing the rules > +defined within @var{file}, a file-like object. > +@end deffn > > The following example shows how to use the @var{android-udev-rules} > package so that the Android tool @command{adb} can detect devices > diff --git a/gnu/services/base.scm b/gnu/services/base.scm > index 190803b780..00916a35e4 100644 > --- a/gnu/services/base.scm > +++ b/gnu/services/base.scm > @@ -81,6 +81,7 @@ (define-module (gnu services base) > #:select (mount-flags->bit-mask > swap-space->flags-bit-mask)) > #:use-module (guix gexp) > + #:use-module ((guix packages) #:select (package-version)) > #:use-module (guix records) > #:use-module (guix modules) > #:use-module (guix pki) > @@ -153,8 +154,11 @@ (define-module (gnu services base) > udev-service-type > udev-service ; deprecated > udev-rule > + udev-hwdb > file->udev-rule > + file->udev-hwdb > udev-rules-service > + udev-hwdb-service > > login-configuration > login-configuration? > @@ -2181,12 +2185,15 @@ (define-record-type* > udev-configuration? > (udev udev-configuration-udev ;file-like > (default eudev)) > - (rules udev-configuration-rules ;list of file-like > + (native-udev udev-configuration-native-udev > + (default eudev)) As discussed earlier, I don't think that new field is needed. > + (rules udev-configuration-rules ;list of rule- and > + ;hwdb-providing packages > (default '()))) > > -(define (udev-rules-union packages) > - "Return the union of the @code{lib/udev/rules.d} directories found in each > -item of @var{packages}." > +(define (udev-configuration-union subdirectory packages) > + "Return the union of the @code{lib/udev/@var{subdirectory}.d} directories found > +in each item of @var{packages}." > (define build > (with-imported-modules '((guix build union) > (guix build utils)) > @@ -2197,7 +2204,8 @@ (define (udev-rules-union packages) > (srfi srfi-26)) > > (define %standard-locations > - '("/lib/udev/rules.d" "/libexec/udev/rules.d")) > + '(#$(string-append "/lib/udev/" subdirectory ".d") > + #$(string-append "/libexec/udev/" subdirectory ".d"))) > > (define (rules-sub-directory directory) > ;; Return the sub-directory of DIRECTORY containing udev rules, or > @@ -2208,15 +2216,21 @@ (define (udev-rules-union packages) > (union-build #$output > (filter-map rules-sub-directory '#$packages))))) > > - (computed-file "udev-rules" build)) > + (computed-file (string-append "udev-" subdirectory) build)) > (define (udev-rule file-name contents) > "Return a directory with a udev rule file @var{file-name} containing > @var{contents}." > (file->udev-rule file-name (plain-file file-name contents))) > > +(define (udev-hwdb file-name contents) > + "Return a directory with a udev hwdb file @var{file-name} containing > +@var{contents}." > + (file->udev-hwdb file-name (plain-file file-name contents))) > + > (define (file->udev-rule file-name file) > - "Return a directory with a udev rule file FILE-NAME which is a copy of FILE." > + "Return a directory with a udev rule file @var{file-name} which is a copy of > +@var{file}." As discussed above, I'm not convinced about changing dostrings to use Texinfo, but I see that was already the cases for some around. Hm. > (computed-file file-name > (with-imported-modules '((guix build utils)) > #~(begin > @@ -2231,6 +2245,23 @@ (define (file->udev-rule file-name file) > (mkdir-p rules.d) > (copy-file #$file file-copy-dest))))) > > +(define (file->udev-hwdb file-name file) > + "Return a directory with a udev hwdb file @var{file-name} which is a copy of > +@var{file}." > + (computed-file file-name > + (with-imported-modules '((guix build utils)) > + #~(begin > + (use-modules (guix build utils)) > + > + (define hwdb.d > + (string-append #$output "/lib/udev/hwdb.d")) > + > + (define file-copy-dest > + (string-append hwdb.d "/" #$file-name)) > + > + (mkdir-p hwdb.d) > + (copy-file #$file file-copy-dest))))) > + > (define kvm-udev-rule > ;; Return a directory with a udev rule that changes the group of /dev/kvm to > ;; "kvm" and makes it #o660. Apparently QEMU-KVM used to ship this rule, > @@ -2338,13 +2369,35 @@ (define udev.conf > > (define (udev-etc config) > (match-record config > - (udev rules) > + (udev native-udev rules) > + (let* ((hwdb.d > + (udev-configuration-union "hwdb" (cons* udev rules))) > + (hwdb.bin > + (and native-udev > + (equal? (package-version udev) > + (package-version native-udev)) > + (computed-file > + "hwdb.bin" > + (with-imported-modules '((guix build utils)) > + #~(begin > + (use-modules (guix build utils)) > + (setenv "UDEV_HWDB_PATH" #$hwdb.d) > + (invoke #+(file-append native-udev "/bin/udevadm") > + "hwdb" > + "--update" > + "-o" #$output))))))) > `(("udev" > ,(file-union "udev" > `(("udev.conf" ,udev.conf) > ("rules.d" > - ,(udev-rules-union (cons* udev kvm-udev-rule > - rules))))))))) > + ,(udev-configuration-union > + "rules" > + (cons* udev kvm-udev-rule > + rules))) > + ("hwdb.d" ,hwdb.d) > + ,@(if hwdb.bin > + `(("hwdb.bin" ,hwdb.bin)) > + '())))))))) As discussed above, this can probably be simplified by dropping native-udev. If it's truly needed, the pathological case where different versions are needed should be handled earliest and an error raised with a useful message. > (define udev-service-type > (service-type (name 'udev) > @@ -2373,10 +2426,10 @@ (define-deprecated (udev-service #:key (udev eudev) (rules '())) > (udev-configuration (udev udev) (rules rules)))) > > (define* (udev-rules-service name rules #:key (groups '())) > - "Return a service that extends udev-service-type with RULES and > -account-service-type with GROUPS as system groups. This works by creating a > -singleton service type NAME-udev-rules, of which the returned service is an > -instance." > + "Return a service that extends udev-service-type with @var{rules} and > +@code{account-service-type} with @var{groups} as system groups. This works by > +creating a singleton service type @code{@var{name}-udev-rules}, of which the > +returned service is an instance." I'd drop this change. Could you please send a v8 with changes along those suggested? -- Thanks Maxim