[{"id":35745,"web_url":"https://patchwork.libcamera.org/comment/35745/","msgid":"<175742520511.2127323.18328511816262304186@neptunite.rasen.tech>","date":"2025-09-09T13:40:05","subject":"Re: [PATCH v16 11/12] config: Make configuration file configurable","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Milan,\n\nThanks for the patch.\n\nQuoting Milan Zamazal (2025-07-29 16:31:59)\n> To support easy switching of configurations, let's introduce\n> LIBCAMERA_CONFIG_NAME environment variable, which:\n> \n> - specifies the path of the configuration file to load if it is an\n>   absolute path; or\n> - prevents any configuration file from loading if it is defined and\n>   empty; or\n> - specifies the path of the configuration file to load, relative to\n>   the configuration directories.\n> \n> If such a configuration file doesn't exist, no custom configuration is\n> loaded.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  Documentation/runtime_configuration.rst |  8 ++++++\n>  src/libcamera/global_configuration.cpp  | 36 +++++++++++++++++--------\n>  2 files changed, 33 insertions(+), 11 deletions(-)\n> \n> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n> index 0708302d4..71a1a175d 100644\n> --- a/Documentation/runtime_configuration.rst\n> +++ b/Documentation/runtime_configuration.rst\n> @@ -19,6 +19,14 @@ order:\n>  - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>  - LIBCAMERA_DATA_DIR/libcamera/configuration.yaml\n>  \n> +The default name of the configuration file, configuration.yaml, can be\n> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n> +can specify just an alternative configuration file name to be looked up\n> +in the locations above, or it can contain a whole relative or absolute\n\nafaiu (it was really hard to comprehend) you cannot use relative paths? At\nleast not in a real sense, as the relative path is confined to being relative\nto the configuration directories.\n\nI wonder if there's a way we can make this less confusing. Either you can specify the\nfull absolute path to the configuration file, or you can only specify the\nfilename to search for in the configuration directories.\n\n\nPaul\n\n> +path. If an absolute path is specified then it is the only location that\n> +is used; if the given file doesn't exist then no configuration file is\n> +read. If the variable is defined but empty, no configuration is loaded.\n> +\n>  The first configuration file found wins, configuration files in other\n>  locations are ignored.\n>  \n> diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n> index b9531fdfb..68a4731a1 100644\n> --- a/src/libcamera/global_configuration.cpp\n> +++ b/src/libcamera/global_configuration.cpp\n> @@ -23,13 +23,6 @@\n>  \n>  namespace libcamera {\n>  \n> -namespace {\n> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n> -       std::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n> -       std::filesystem::path(LIBCAMERA_DATA_DIR) / \"configuration.yaml\",\n> -};\n> -}\n> -\n>  LOG_DEFINE_CATEGORY(Configuration)\n>  \n>  /**\n> @@ -75,6 +68,28 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>  \n>  void GlobalConfiguration::load()\n>  {\n> +       const std::vector<std::filesystem::path> globalConfigurationDirectories = {\n> +               std::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n> +               std::filesystem::path(LIBCAMERA_DATA_DIR),\n> +       };\n> +\n> +       const char *libcameraConfigName =\n> +               utils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n> +       if (libcameraConfigName && libcameraConfigName[0] == '\\0')\n> +               return;\n> +       if (!libcameraConfigName)\n> +               libcameraConfigName = \"\";\n> +\n> +       std::filesystem::path configName(libcameraConfigName);\n> +\n> +       if (configName.is_absolute()) {\n> +               loadFile(configName);\n> +               return;\n> +       }\n> +\n> +       if (configName.empty())\n> +               configName = std::filesystem::path(\"configuration.yaml\");\n> +\n>         std::filesystem::path userConfigurationDirectory;\n>         const char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>         if (xdgConfigHome) {\n> @@ -88,15 +103,14 @@ void GlobalConfiguration::load()\n>  \n>         if (!userConfigurationDirectory.empty()) {\n>                 std::filesystem::path user_configuration_file =\n> -                       userConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n> +                       userConfigurationDirectory / \"libcamera\" / configName;\n>                 if (loadFile(user_configuration_file))\n>                         return;\n>         }\n>  \n> -       for (const auto &path : globalConfigurationFiles) {\n> -               if (loadFile(path))\n> +       for (const auto &path : globalConfigurationDirectories)\n> +               if (loadFile(path / configName))\n>                         return;\n> -       }\n>  }\n>  \n>  /**\n> -- \n> 2.50.1\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 6925BBDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  9 Sep 2025 13:40:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 695BC6936B;\n\tTue,  9 Sep 2025 15:40:13 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 188546934B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  9 Sep 2025 15:40:12 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:6f3a:4f34:f1fa:8b3])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 286C6605;\n\tTue,  9 Sep 2025 15:38:57 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"gUQhZSto\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1757425138;\n\tbh=YPJtGfKF1TomDmbRm7ZXuc/Wh1fkSbiRSqog7z/bVEA=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=gUQhZStoyfMH+oRcVR+cFseuBQIoBSldHFH/OX6K68DB+6kHQDSrI2amR61/w5iVJ\n\taG8mKqwPPskgyJ1vALD5oyrURmUmxDyMGwrd5dQVq78upD8IcpA5t6ydJjhNSkv4Ow\n\tZKCt8GY2bAgH+KV681lNfE+J9LjBd7NlvOuLLnsQ=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250729073201.5369-12-mzamazal@redhat.com>","References":"<20250729073201.5369-1-mzamazal@redhat.com>\n\t<20250729073201.5369-12-mzamazal@redhat.com>","Subject":"Re: [PATCH v16 11/12] config: Make configuration file configurable","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Tue, 09 Sep 2025 22:40:05 +0900","Message-ID":"<175742520511.2127323.18328511816262304186@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35757,"web_url":"https://patchwork.libcamera.org/comment/35757/","msgid":"<85v7lrpsrm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-09-09T15:09:17","subject":"Re: [PATCH v16 11/12] config: Make configuration file configurable","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Paul,\n\nthank you for review.\n\nPaul Elder <paul.elder@ideasonboard.com> writes:\n\n> Hi Milan,\n>\n> Thanks for the patch.\n>\n> Quoting Milan Zamazal (2025-07-29 16:31:59)\n>> To support easy switching of configurations, let's introduce\n>> LIBCAMERA_CONFIG_NAME environment variable, which:\n>> \n>> - specifies the path of the configuration file to load if it is an\n>>   absolute path; or\n>> - prevents any configuration file from loading if it is defined and\n>>   empty; or\n>> - specifies the path of the configuration file to load, relative to\n>>   the configuration directories.\n>> \n>> If such a configuration file doesn't exist, no custom configuration is\n>> loaded.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  Documentation/runtime_configuration.rst |  8 ++++++\n>>  src/libcamera/global_configuration.cpp  | 36 +++++++++++++++++--------\n>>  2 files changed, 33 insertions(+), 11 deletions(-)\n>> \n>> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n>> index 0708302d4..71a1a175d 100644\n>> --- a/Documentation/runtime_configuration.rst\n>> +++ b/Documentation/runtime_configuration.rst\n>> @@ -19,6 +19,14 @@ order:\n>>  - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>>  - LIBCAMERA_DATA_DIR/libcamera/configuration.yaml\n>>  \n>> +The default name of the configuration file, configuration.yaml, can be\n>> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n>> +can specify just an alternative configuration file name to be looked up\n>> +in the locations above, or it can contain a whole relative or absolute\n>\n> afaiu (it was really hard to comprehend) you cannot use relative paths? At\n> least not in a real sense, as the relative path is confined to being relative\n> to the configuration directories.\n\nThe relative path must be relative to something; in this case to the\nconfiguration directories.  I think allowing it being relative e.g. to\nthe current working directory is not a very good idea for a library, as\nthe current directory can become something else than the user expects.\nAnd what else should it be relative to?  The user can always use an\nabsolute path if needed, or LIBCAMERA_CONFIG_DIR variable introduced in\nthe following patch.\n\n> I wonder if there's a way we can make this less confusing. Either you can specify the\n> full absolute path to the configuration file, or you can only specify the\n> filename to search for in the configuration directories.\n\nOK, I don't mind removing the relative path case.  And it doesn't seem\nto be needed to cover the use cases given by Barnabás in the response to\nthe following patch.\n\n> Paul\n>\n>> +path. If an absolute path is specified then it is the only location that\n>> +is used; if the given file doesn't exist then no configuration file is\n>> +read. If the variable is defined but empty, no configuration is loaded.\n>> +\n>>  The first configuration file found wins, configuration files in other\n>>  locations are ignored.\n>>  \n>> diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n>> index b9531fdfb..68a4731a1 100644\n>> --- a/src/libcamera/global_configuration.cpp\n>> +++ b/src/libcamera/global_configuration.cpp\n>> @@ -23,13 +23,6 @@\n>>  \n>>  namespace libcamera {\n>>  \n>> -namespace {\n>> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n>> -       std::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n>> -       std::filesystem::path(LIBCAMERA_DATA_DIR) / \"configuration.yaml\",\n>> -};\n>> -}\n>> -\n>>  LOG_DEFINE_CATEGORY(Configuration)\n>>  \n>>  /**\n>> @@ -75,6 +68,28 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>>  \n>>  void GlobalConfiguration::load()\n>>  {\n>> +       const std::vector<std::filesystem::path> globalConfigurationDirectories = {\n>> +               std::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n>> +               std::filesystem::path(LIBCAMERA_DATA_DIR),\n>> +       };\n>> +\n>> +       const char *libcameraConfigName =\n>> +               utils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n>> +       if (libcameraConfigName && libcameraConfigName[0] == '\\0')\n>> +               return;\n>> +       if (!libcameraConfigName)\n>> +               libcameraConfigName = \"\";\n>> +\n>> +       std::filesystem::path configName(libcameraConfigName);\n>> +\n>> +       if (configName.is_absolute()) {\n>> +               loadFile(configName);\n>> +               return;\n>> +       }\n>> +\n>> +       if (configName.empty())\n>> +               configName = std::filesystem::path(\"configuration.yaml\");\n>> +\n>>         std::filesystem::path userConfigurationDirectory;\n>>         const char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>>         if (xdgConfigHome) {\n>> @@ -88,15 +103,14 @@ void GlobalConfiguration::load()\n>>  \n>>         if (!userConfigurationDirectory.empty()) {\n>>                 std::filesystem::path user_configuration_file =\n>> -                       userConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n>> +                       userConfigurationDirectory / \"libcamera\" / configName;\n>>                 if (loadFile(user_configuration_file))\n>>                         return;\n>>         }\n>>  \n>> -       for (const auto &path : globalConfigurationFiles) {\n>> -               if (loadFile(path))\n>> +       for (const auto &path : globalConfigurationDirectories)\n>> +               if (loadFile(path / configName))\n>>                         return;\n>> -       }\n>>  }\n>>  \n>>  /**\n>> -- \n>> 2.50.1\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 387DBBDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  9 Sep 2025 15:09:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D1EE06936D;\n\tTue,  9 Sep 2025 17:09:25 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EE7E86934B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  9 Sep 2025 17:09:23 +0200 (CEST)","from mail-wm1-f71.google.com (mail-wm1-f71.google.com\n\t[209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-397-6xty_sJ3MIqiTWgURIxD1w-1; Tue, 09 Sep 2025 11:09:21 -0400","by mail-wm1-f71.google.com with SMTP id\n\t5b1f17b1804b1-45de13167aaso26854095e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 09 Sep 2025 08:09:20 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb ([85.93.96.130])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-45cb5693921sm300249395e9.0.2025.09.09.08.09.18\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 09 Sep 2025 08:09:18 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"DYm8hXj/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1757430562;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=I13tu+y0j9ScAi7GTZ4NDJ7+Cr5NqW4AdJusDv7ybiM=;\n\tb=DYm8hXj/jkXWVedFDUWDNZ4pOD7oF6D9sNkMoQs2zGp3A7HGef443y+mgvkgWzIvkEJ/30\n\tCQfHODcBDzvMvhaIMxK0t21L2ddvYrQXiclJYmA0ZakRiT9OjJsBa2QFD1/mGqWpMurwjO\n\tTbQo1qC5zdUoiF5mj9dsPoWyKaxf9io=","X-MC-Unique":"6xty_sJ3MIqiTWgURIxD1w-1","X-Mimecast-MFC-AGG-ID":"6xty_sJ3MIqiTWgURIxD1w_1757430560","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1757430560; x=1758035360;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=K0nQoasQxTaoV8rQK6twx7LNHYwBt+eucdGXVrLDDY8=;\n\tb=TnXEjifRDgnK9qheYaM0BgRS6zzYqH0+V6k7Q3aPsSnmXTvBrcwlzeRpRzIyBK0AIm\n\tvBVQxBt6xYuwm0y8LMtM4kxwELKhR4VrwLeU+PbPG1CnXHBNwZLvhdLKREp61CVapsJ8\n\tEo7xHK4vTw43zF1kzhLvbWuuUsbGopep+dnO3BX29ajMF8aYWBnDJlIEVDG01+3hQxNu\n\tvyklgaTtNnVng7lQTFFFBOPwEb7zfk0ReyTiVshuy8y6gNP9wB808v/2lsUwy+Wr1jQS\n\t24wYvL9xADgrY+zqYHBbIedL7KTbd3R+x2uxvO5RpahcLJI+8HpZLmCgqthBeVdkxfuZ\n\tL7zw==","X-Gm-Message-State":"AOJu0YwPva2mueBPsZEJfy7dqlWq2QKRrCuNMMuJCjcP0N3KXrpzStSE\n\tLyDbN4O9YpoK7M6mmuXvS89t4KnYluy0XYFLQ2mAtCJlr1cD9KoWswhB/F6wPRo+7x/KIsus1D4\n\tv/yAY5ltllz5sN+CdbkmMDSM9FyBQwKh6Pd4TnXxXoUs+LA9G9i6Iar1YXd77WgZHwAKPPLYMNm\n\tQ=","X-Gm-Gg":"ASbGnctwxXnvqE8n0ACpcGTEAAz+L0caA0pT56NqncIbEfR3ySadTtefedCFDmsC+j2\n\tEDw9PLGLT9dGl6efnQ5d5eKzaccjC7DcjgcJkTDCXi8/HArDzBtgEkC1EqWc8j5x2yAs0vTNdz1\n\t7PrdI+BWw1XjkYMfQ3zPELEVfLoV3iE2bALRqvrN+/w3jb77rk+Nzdoimeu33uvP0t+KjUlf9LA\n\tEwgWtdo5492m+Af4QED8Xj7SS2cFaWNzI4Sa6lRrG3Rec5DOAD8ia3yfV/XM2mDV+htey4+eehU\n\t96kuikNnZ+g1iwsJ5bTRpcQlehnN78+JmOX1yFEOhkVIQi2NLCt8QFkmiAiHVujMrA==","X-Received":["by 2002:a05:600c:1912:b0:459:e398:ed89 with SMTP id\n\t5b1f17b1804b1-45de2cf9a5cmr89915465e9.1.1757430559719; \n\tTue, 09 Sep 2025 08:09:19 -0700 (PDT)","by 2002:a05:600c:1912:b0:459:e398:ed89 with SMTP id\n\t5b1f17b1804b1-45de2cf9a5cmr89915035e9.1.1757430559096; \n\tTue, 09 Sep 2025 08:09:19 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IGogdQRCuC+7g8YziQaP+pHRbSGKmoARMkGBhjfymQQ1rPnSMUF7P4R8WQN/st76l7w0+kLAA==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab?=\n\t=?utf-8?b?w6FzIFDFkWN6ZQ==?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart  <laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v16 11/12] config: Make configuration file configurable","In-Reply-To":"<175742520511.2127323.18328511816262304186@neptunite.rasen.tech>\n\t(Paul Elder's message of \"Tue, 09 Sep 2025 22:40:05 +0900\")","References":"<20250729073201.5369-1-mzamazal@redhat.com>\n\t<20250729073201.5369-12-mzamazal@redhat.com>\n\t<175742520511.2127323.18328511816262304186@neptunite.rasen.tech>","Date":"Tue, 09 Sep 2025 17:09:17 +0200","Message-ID":"<85v7lrpsrm.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"BlxgXVUnEmAa3GizhqrpGgTRlFQsiFDLiax--p5KlUg_1757430560","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]