From patchwork Fri Feb 26 09:42:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Adler X-Patchwork-Id: 1444866 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::63a; helo=mail-ej1-x63a.google.com; envelope-from=swupdate+bncbclp7i7wwmhrbk4f4oaqmgqeqtgxdlq@googlegroups.com; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20161025 header.b=QPvnCeX6; dkim-atps=neutral Received: from mail-ej1-x63a.google.com (mail-ej1-x63a.google.com [IPv6:2a00:1450:4864:20::63a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dn4Td2VLFz9sCD for ; Fri, 26 Feb 2021 20:43:12 +1100 (AEDT) Received: by mail-ej1-x63a.google.com with SMTP id ia14sf4012460ejc.8 for ; Fri, 26 Feb 2021 01:43:12 -0800 (PST) ARC-Seal: i=3; a=rsa-sha256; t=1614332588; cv=pass; d=google.com; s=arc-20160816; b=XeGpRC8u5VAqR8KFARDbeF+q62AhONQ/QFrZeQYDuZ5chb+hK+xgEuEiB7MuldB6Ih 32pXf/FKc/GiNNFWuNMmyR9dzla/vAyw3j5wYUMkgU69l1S6difMXxBsCKvMMV8y+crE uua5aJwWC9VgXAZx6rrl7QnSqzp6XY2zXtd+7P/FDbIP4//jt9EMaKa03GneEPn1M3B2 VGDDEWzteLhyPUhtKMDdcgQ3OcctZ1tzrWwdFok0LifoFez3uaAG8elcj3d0tFDl3yoU z5aJ+j2eFJCReYovawjju13OQA6iLKN2pQNDP2crNX2ElBWFHrxmX+iTKZ1EsfewwcTA Eg4Q== ARC-Message-Signature: i=3; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:dkim-signature; bh=DBZC4XDWLmVqc6IvXQitvdUmm4VNWtW+9IiueDd+es8=; b=Fcfa8KJ2RXuS5F4O737+0qJ8WsE7Ctlg3GPddXrkAz+c0K1fVNZ16nHClbnLAhX1yN iLeFo+6RNtzKG5wsUiYKPXEm7pFg0PCbgYU1uRC//C9Z1o23G94WKr4R1kp6DNHYQ3tk cbuw1DSzcOA0MkiKYfcX3ebMyoCg87zQhvdkMzQ/JEqEx77PnH7T+TEeLlfKHdnIaG7x qtr+d0LEc9dF6ROQtxmeKjgZ/jEhJDhvXyVp2HxeS6sJAMG7xC4UDkcoxZbG+QLQQDPF mI2f2z2u0++XYU3CsFYLsXToKTMCw+YT2cZMcq/RCdhMWbGjqquG29w6mQelo0uFUE42 gtiQ== ARC-Authentication-Results: i=3; gmr-mx.google.com; dkim=pass header.i=@siemens.onmicrosoft.com header.s=selector1-siemens-onmicrosoft-com header.b=kbrRnUKQ; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of michael.adler@siemens.com designates 40.107.1.44 as permitted sender) smtp.mailfrom=michael.adler@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=DBZC4XDWLmVqc6IvXQitvdUmm4VNWtW+9IiueDd+es8=; b=QPvnCeX6WtIKKVQ9SyKOVaRnMx9ZWocRsTe5TwUvSSEOAptLATXqqk3LPyt3155bBe DwVZvqdOVlrsjGnanQNWQzus40zBJNka4dwy30Cmnjeg+w9n4XVgQAE26ldisuzjkUzY l5lc+xRy7/bzsKMagbWJ9Xg1KHbDpjtn5OWt9X6Inffvc1oFMpKcWd8iXrJXPsqrgszr bq0mPYrngWNDQVyb1rEwu27oc1Zi2mIUx2cNrJeBvZF0JK0JmK3f0qWMMKD8oRPmB1Y3 qj8JtXGF8IlawMHUslkCvj/MOau4hn//g5EI8+EWZEU2GoU/8Hp6DzZwc1DJ6gDdnQ/4 5W0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=DBZC4XDWLmVqc6IvXQitvdUmm4VNWtW+9IiueDd+es8=; b=WSQn/qZO6XqXLLcM4FRjm7ocCCA/3ylZpFQc3/PfS48lULc7KM93SijJ5qQT03hD6c QY6M1DKccTzProQvggFGrXio+PVquyxm2Z6G99IN0L0pe7JbtCMBpfDWb1NB1zlO/xSb SflB+Hl2mF93mXyBvyoeKX8UsUo97sN6s0VH2geTJr7cqrcupQ+n27Ai9eD4UD71AeHV QE0z5wSrucdxXbPonYxJ/ldQw7vDYv5zrAuheY5XWHnA6BWEem4gif5slZ/Np6hJyLHR GOyNBowRIgilNS8ash/i/+XVfeTBUjhYQMM+zqpfWhG9WCMFul1SYDiKaBNxE10nsvX0 EDDQ== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOAM531GyRHOfdSHsa4RNEFjuP9Uk5HgiWrH+y7D7mNS5yrDabH/Z1My 9GizbqI6iFwIwamjjCezs28= X-Google-Smtp-Source: ABdhPJzds6uqwvqFeanlj/ljgCvdofrdVayuh2X1zkMRtXLu7YWKmQoqKgt4b9UmZzf7bYyv8dtYbw== X-Received: by 2002:a17:906:9bd2:: with SMTP id de18mr2434360ejc.191.1614332587961; Fri, 26 Feb 2021 01:43:07 -0800 (PST) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a17:906:e04:: with SMTP id l4ls2007007eji.11.gmail; Fri, 26 Feb 2021 01:43:07 -0800 (PST) X-Received: by 2002:a17:906:2747:: with SMTP id a7mr2458124ejd.250.1614332586956; Fri, 26 Feb 2021 01:43:06 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1614332586; cv=pass; d=google.com; s=arc-20160816; b=HM89Q/jMTzpjBsVNtYF4XEbRD9trIlBe9h6NPY4AolHDClSSj7BLxTdqAuLjqk8gZi p1bt9iSeq/xz/DJNiXm393g/7s7oAV1EaWprD/83lrtPYWbi0uMw2ROWLogCiAjwQsvf SEZCgIcnOt58BDisTMLmhKybQqMPGtt8OJAReWSxqddLzCIvWiHnuK4VnO8aFoYTv7ly XhBDi1KopedQVKlr00kd6ebbHF5IUmQofSnqGuktxhFRi9WNfHP/RfT3LgbcnvdLOJis IOhDEMU+fMKAAYRv8bFnBqis0yFSM2PFOex0c1UtmE6KTz4w+UEZTi0WtXZIVMv8GohI RXDg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:content-transfer-encoding:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=aT3K7Cu9O3v/FM/Qp9r3WeEDJ8OQx49cA8BSGX9AIbY=; b=X8wVQHP4XI98weCQ4NkC1/owxFvX67wCNqOi3MIZ83askw4yWV41XlsAgMQTKNlyQK FpjGChRZSjpwCIXBsUfRL0p32AX8tFGYF1C/u10Nb4eSsC7hT2S9LBh4fj0/zjcPnn0X X7nd3wxFEeaXEYgiG0bxWJDbuMRtiMMJj3+vHl/AvfScd5AhA4Gn+FKg6snE4QiDb7m+ 47YTVt7sGp3ohLqacbc3CqNt6+sfZlgUu1gL2YLZHRdkUGBQG+M5HUiDjxc9E20Z1Fl4 /oIumrT+N6p+wWkVn3LnOV221vytPdQp0YuUH4uOaXtid8bo4t1skHC7oh1Kw/lCXMzN tCLQ== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.onmicrosoft.com header.s=selector1-siemens-onmicrosoft-com header.b=kbrRnUKQ; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of michael.adler@siemens.com designates 40.107.1.44 as permitted sender) smtp.mailfrom=michael.adler@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10044.outbound.protection.outlook.com. [40.107.1.44]) by gmr-mx.google.com with ESMTPS id jz19si572778ejb.0.2021.02.26.01.43.06 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 26 Feb 2021 01:43:06 -0800 (PST) Received-SPF: pass (google.com: domain of michael.adler@siemens.com designates 40.107.1.44 as permitted sender) client-ip=40.107.1.44; ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CJOhG8ZyH3shdcyc98IVlJTeWoGZEpOPX+uC/MHYVzKm1WuFfr+k88GFOBRtv8iviuTdqbGNhqdgWoRVYTjl1dbUkgDQ2um9C40fsGHhhJ20EQ6z59klNE75gHv0qUNKujJnNLPEZmHodxSmoJiVsm5bUzsIsc9lrpUXA17YTXxcggyUE94FtG6otlguamhNQyNQx7OpK3FJXiwcWQwo8TQEN1t92OzTYwunCM+MCx48acO08UqDTv5LDxUMvyP5Hq80Qi6PMHzkCn5ik3Qjdb0c97Fr9nKr51gldG+1J2V1/agxmFhWA+bW+C890jheSY+3wKjT1HepZGA7WiJpVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aT3K7Cu9O3v/FM/Qp9r3WeEDJ8OQx49cA8BSGX9AIbY=; b=NSsZmdbtmGTSKE+5jAuBBPcI8+FcqMJpme7DFF1CQxWS/CEUSEy3yanlPo7jgN/ZcDLQ3jmzz2UctLmHGWJDuZiBUKib+KI/YWI1CSxjCKZzZkCEJGANKexnBccWB3y+nE5rXI8jiA8LIcoKIj3pPo0aCZgRq+e2BGIKPElKlw0jFLi7UR3pj5/GSj8AUMn3iq2qToLe6nwGQ3lp+E/3PmzMZbD59nXxklBu+bnpGXO3uE/WbSam9LN4ccoKddc/7twV/GptixRbRcFjhqOiSWoDr217zRGZx4yLNbC19xYbYlT+xdtWW0ClpsgPfKxBz4M6HLf91lutnwkM8akGIQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siemens.com; dmarc=pass action=none header.from=siemens.com; dkim=pass header.d=siemens.com; arc=none Received: from AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:d7::22) by AM0PR10MB3572.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:15e::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.19; Fri, 26 Feb 2021 09:43:05 +0000 Received: from AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM ([fe80::58ad:30dc:511a:964]) by AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM ([fe80::58ad:30dc:511a:964%7]) with mapi id 15.20.3890.019; Fri, 26 Feb 2021 09:43:05 +0000 From: Michael Adler To: swupdate@googlegroups.com Cc: sbabic@denx.de, Michael Adler , Christian Storm Subject: [swupdate] [PATCH v4] Avoid re-opening and reading configuration file Date: Fri, 26 Feb 2021 10:42:09 +0100 Message-Id: <20210226094209.1307-1-michael.adler@siemens.com> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: X-Originating-IP: [93.104.71.163] X-ClientProxiedBy: AM0PR10CA0019.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:17c::29) To AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:d7::22) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost (93.104.71.163) by AM0PR10CA0019.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:17c::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.19 via Frontend Transport; Fri, 26 Feb 2021 09:43:05 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 35e66f4e-79fe-464c-d18e-08d8da3aeab6 X-MS-TrafficTypeDiagnostic: AM0PR10MB3572: X-LD-Processed: 38ae3bcd-9579-4fd4-adda-b42e1495d55a,ExtAddr X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1468; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: pcAn9J1PwA73QJvLvNN3RCz5FlOaVctjHLcYZro0p3ulJUGQPsbK7+HdBqqMG7DEscIWiIMV4n6IhN05dEaR/XwMltjI051++WVB6Vvw3RMMHy5vLF9WzCXHUbRil8A/cPVYHx7K4CSltQ3gAr/VAwzspUOH23sAu8qBWeXDPtCUX0dM0zg5Otd+SIbXQxl5V5oeXOyLjSuBlEeermAfM74yEV3cFbF2jxG2I/+lwPsqu9mzUCroJM+fXGHlKceEBTgXcA3jyBVBfBKATbI/xbey1ZwDE186ntSSOU8ea244thILRpO1/wAdTgLnpke+OiaLumnlqAtrCRMKEEr6hnWRtmOtveguw8Fa+raGpBuMTVWHNZVR0jEqlWkK8s1c2Psr+qv4oZpAJjda1lu1sbumWC9O4g7nU93YH6iSV2jakOnUv+Fi8CXZWYl3QEKKgsvlgFDXMqIxWFZTs/d+xEPSuQ9FOOZ/aQOzeTU8mCENvYTm2xNiXVfgB4FTrAMPPhwKQLAFNScHAjMxb8dRTw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(376002)(39860400002)(346002)(396003)(366004)(136003)(6496006)(1076003)(478600001)(26005)(5660300002)(4326008)(16526019)(186003)(30864003)(83380400001)(44832011)(107886003)(6916009)(2906002)(54906003)(86362001)(36756003)(956004)(66946007)(316002)(8936002)(6486002)(2616005)(66556008)(8676002)(66476007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: bsICBdYXV6JQ3TS2fpHzL8wd+0ajU51TjvRBxQsJmYmKgQGEpN/iOzJNcSxE1AeVZG8xf1YzDJ42L8XAqYpilnTodeY3RSXWc3pSHJJPpS9808z/nZlgOlYlypMdbtDhtd+7DnJSMgnSiBEu3mfiQRtVkDT93ONSg2ZBNBVbaLgK2u4G+TnPJy5QCfU5/ZhuabzjlAFXavajShNGWhZU5gUGSFBGxGD0xnD3z0Wewf1PTlx5n51omtj7K5JQdgkawx/lJPIQSNNPLPwEyAXtuiup09ea3LbpnWIP01vrAXqwuE0ASEMfgnvdluU+HP1YMEuvVHTai3LUYGGJ1sYQQhu9jJwb4A6vD6R8t5/Sx7nupeKYt8EKmCeq8Q/aFQ9wtBLUnnMLpONYFXjVdGzrJ00OVBisItDkG39i7JCdZzGYmPsgkNQMvYUuLkd3SiQTbg6xCgUikTIn1XirybhqvYGBkfvS3/IzKYvaZvretmPYQN7FxVtQtSc4oHnuUtmlLOqsqDpQkuLA39/vDVAsjdrzZMFNKnfvPw57Mc9Ms2AVqBdDH6ecwnLGZDFoUwIDevauQAlrQvmr0clxAJA2C+TIG3Tara4C3OxfhoTzDqz6qx+uAwe8q+1q6KSEIksLlj4t98mdrRe0LrAyLb9uUBuKs3o8PaX6byKRiOLrbU0Ed0H1VSmnieb/7EzOpgCQ94wS21mc0GFjCMQOrZb1gbbef+LZvuwucmD2Lsv/2JHd1XelCluacGnoUhrpueBEpKGrqJsQkbgVdScN1qTVdJBvpKBUueJmePosdvT5AC4LvSEFtmw/2mPYANyB+03bKBFdvhpSaMAtXHcUhg0mzV/hcJ8sQTTPLrg4c+vioUndv+DbDOlZjBcTkbQJClS6KM6x3Y+8WLXYc6JIAUVGLg2sahAsOxAHKNNqADLlChSeDgF8JLFTDV+0920WxE40X1REae7cM5UZepPp8CwpkesX9b99XAnx6AHLEKV/tComX64uhPyLis6EKzzkpoYK2MX8/p6XLlzS03bvlH9LhOWvsQkxIMzO1WhlnZTK0U99L20u8U2cENn2kvq8vE/eBEnpwxAAnoC5StgYB7lIGRwViQA+YxOs41g33SfiAvmz6IJ6Rr5NeI4c6IPWo9dfwGMljzRJL0YLrIl3ClMbPuBFsw4mELFEQ79+OAW4HsDVLOLESRZfi01blrQAUUbUyCraw5JHKpoDTQhJdCPGAdo68OkcKYkgOUybwNkPwD4/nIFuEiiB65g3w95TZJx9Gxc1NP1VpzopjHDoGCMi0+0Kkx3/cB2aTKUJfNhnClZGsn5o/vSqNaQ0SBzo/Qp1 X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: 35e66f4e-79fe-464c-d18e-08d8da3aeab6 X-MS-Exchange-CrossTenant-AuthSource: AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2021 09:43:05.5682 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 38ae3bcd-9579-4fd4-adda-b42e1495d55a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YHfNC4yMzk6Xiz18hYnswq4GyiwCNbEqKdM3bQ7EjSRnh5zKYTKIlb+aHmPWW0GhuD4zG1aazIIgnfufRaH7L4HQf9GVy2WDxkulyZdI25g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR10MB3572 X-Original-Sender: Michael.Adler@siemens.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.onmicrosoft.com header.s=selector1-siemens-onmicrosoft-com header.b=kbrRnUKQ; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of michael.adler@siemens.com designates 40.107.1.44 as permitted sender) smtp.mailfrom=michael.adler@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , During a regular startup, the configuration file (swupdate.cfg) is at least open(2)ed and read(2) four times. This patch introduces a new API for reading the configuration file, which passes a handle to an in-memory copy of the configuration file around. For security reasons, the in-memory copy is not shared with subprocesses, because a less privileged subprocess (setuid(3p)) might not be allowed to read the configuration file. Future work could optimize this further and check if the subprocess runs under the same privileges and if so, share the configuration data via an appropriate mechanism (e.g. mmap(3p). Signed-off-by: Michael Adler Signed-off-by: Christian Storm --- core/artifacts_versions.c | 6 ++-- core/pctl.c | 20 ++++++------- core/swupdate.c | 41 +++++++++++++++++-------- corelib/downloader.c | 7 ++++- corelib/swupdate_settings.c | 56 ++++++++++++++++++++++++----------- include/parselib.h | 2 -- include/pctl.h | 9 ++++-- include/swupdate_settings.h | 44 ++++++++++++++++++++++----- include/util.h | 3 +- mongoose/mongoose_interface.c | 7 ++++- suricatta/server_general.c | 12 ++++---- suricatta/server_hawkbit.c | 28 ++++++++++-------- suricatta/suricatta.c | 11 +++++-- 13 files changed, 167 insertions(+), 79 deletions(-) diff --git a/core/artifacts_versions.c b/core/artifacts_versions.c index 9c1251c..90b5b32 100644 --- a/core/artifacts_versions.c +++ b/core/artifacts_versions.c @@ -129,10 +129,10 @@ static int versions_settings(void *setting, void *data) return 0; } -void get_sw_versions(char *cfgname, struct swupdate_cfg *sw) +void get_sw_versions(swupdate_cfg_handle *handle, struct swupdate_cfg *sw) { /* Try to read versions from configuration file */ - if (cfgname && read_module_settings(cfgname, "versions", versions_settings, sw) == 0) { + if (handle != NULL && read_module_settings(handle, "versions", versions_settings, sw) == 0) { return; } /* If not found, fall back to a legacy file in the format " " */ @@ -140,7 +140,7 @@ void get_sw_versions(char *cfgname, struct swupdate_cfg *sw) } #else -void get_sw_versions(char __attribute__ ((__unused__)) *cfgname, +void get_sw_versions(swupdate_cfg_handle __attribute__ ((__unused__))*handle, struct swupdate_cfg *sw) { read_sw_version_file(sw); diff --git a/core/pctl.c b/core/pctl.c index 01ad540..481f077 100644 --- a/core/pctl.c +++ b/core/pctl.c @@ -165,19 +165,16 @@ static int spawn_process(struct swupdate_task *task, } } -static void start_swupdate_subprocess(sourcetype type, - const char *name, const char *cfgfile, +static void start_swupdate_subprocess(sourcetype type, const char *name, + uid_t run_as_userid, gid_t run_as_groupid, + const char* cfgfile, int argc, char **argv, swupdate_process start, const char *cmdline) { - uid_t uid; - gid_t gid; - - read_settings_user_id(cfgfile, name, &uid, &gid); procs[nprocs].name = name; procs[nprocs].type = type; - if (spawn_process(&procs[nprocs], uid, gid, cfgfile, argc, argv, start, cmdline) < 0) { + if (spawn_process(&procs[nprocs], run_as_userid, run_as_groupid, cfgfile, argc, argv, start, cmdline) < 0) { ERROR("Spawning %s failed, exiting process...", name); exit(1); } @@ -188,19 +185,22 @@ static void start_swupdate_subprocess(sourcetype type, void start_subprocess_from_file(sourcetype type, const char *name, + uid_t run_as_userid, gid_t run_as_groupid, const char *cfgfile, int argc, char **argv, const char *cmdline) { - start_swupdate_subprocess(type, name, cfgfile, argc, argv, NULL, cmdline); + start_swupdate_subprocess(type, name, run_as_userid, run_as_groupid, cfgfile, argc, argv, NULL, cmdline); } -void start_subprocess(sourcetype type, const char *name, const char *cfgfile, +void start_subprocess(sourcetype type, const char *name, + uid_t run_as_userid, gid_t run_as_groupid, + const char *cfgfile, int argc, char **argv, swupdate_process start) { - start_swupdate_subprocess(type, name, cfgfile, argc, argv, start, NULL); + start_swupdate_subprocess(type, name, run_as_userid, run_as_groupid, cfgfile, argc, argv, start, NULL); } /* diff --git a/core/swupdate.c b/core/swupdate.c index 59dbf86..e959568 100644 --- a/core/swupdate.c +++ b/core/swupdate.c @@ -551,12 +551,17 @@ int main(int argc, char **argv) } /* Load configuration file */ + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle); if (cfgfname != NULL) { + int ret = swupdate_cfg_read_file(&handle, cfgfname); + /* * 'globals' section is mandatory if configuration file is specified. */ - int ret = read_module_settings(cfgfname, "globals", - read_globals_settings, &swcfg); + if (ret == 0) { + ret = read_module_settings(&handle, "globals", read_globals_settings, &swcfg); + } if (ret != 0) { /* * Exit on -ENODATA or -EINVAL errors. @@ -565,6 +570,7 @@ int main(int argc, char **argv) "Error parsing configuration file: %s, exiting.\n", ret == -ENODATA ? "'globals' section missing" : "cannot read"); + swupdate_cfg_destroy(&handle); exit(EXIT_FAILURE); } @@ -574,11 +580,8 @@ int main(int argc, char **argv) * The following sections are optional, hence -ENODATA error code is * ignored if the section is not found. -EINVAL will not happen here. */ - (void)read_module_settings(cfgfname, "logcolors", - read_console_settings, &swcfg); - - (void)read_module_settings(cfgfname, "processes", - read_processes_settings, &swcfg); + (void)read_module_settings(&handle, "logcolors", read_console_settings, &swcfg); + (void)read_module_settings(&handle, "processes", read_processes_settings, &swcfg); } /* @@ -834,7 +837,7 @@ int main(int argc, char **argv) } /* Read sw-versions */ - get_sw_versions(cfgfname, &swcfg); + get_sw_versions(&handle, &swcfg); /* * Start daemon if just a check is required @@ -847,7 +850,10 @@ int main(int argc, char **argv) /* Start embedded web server */ #if defined(CONFIG_MONGOOSE) if (opt_w) { - start_subprocess(SOURCE_WEBSERVER, "webserver", + uid_t uid; + gid_t gid; + read_settings_user_id(&handle, "webserver", &uid, &gid); + start_subprocess(SOURCE_WEBSERVER, "webserver", uid, gid, cfgfname, ac, av, start_mongoose); freeargs(av); @@ -856,7 +862,10 @@ int main(int argc, char **argv) #if defined(CONFIG_SURICATTA) if (opt_u) { - start_subprocess(SOURCE_SURICATTA, "suricatta", + uid_t uid; + gid_t gid; + read_settings_user_id(&handle, "suricatta", &uid, &gid); + start_subprocess(SOURCE_SURICATTA, "suricatta", uid, gid, cfgfname, argcount, argvalues, start_suricatta); @@ -866,7 +875,10 @@ int main(int argc, char **argv) #ifdef CONFIG_DOWNLOAD if (opt_d) { - start_subprocess(SOURCE_DOWNLOADER, "download", + uid_t uid; + gid_t gid; + read_settings_user_id(&handle, "download", &uid, &gid); + start_subprocess(SOURCE_DOWNLOADER, "download", uid, gid, cfgfname, dwlac, dwlav, start_download); freeargs(dwlav); @@ -883,7 +895,10 @@ int main(int argc, char **argv) dwlav[dwlac] = NULL; - start_subprocess_from_file(SOURCE_UNKNOWN, proc->name, + uid_t uid; + gid_t gid; + read_settings_user_id(&handle, proc->name, &uid, &gid); + start_subprocess_from_file(SOURCE_UNKNOWN, proc->name, uid, gid, cfgfname, dwlac, dwlav, dwlav[0]); @@ -910,6 +925,8 @@ int main(int argc, char **argv) sa.sa_handler = sigterm_handler; sigaction(SIGTERM, &sa, NULL); + swupdate_cfg_destroy(&handle); + /* * Go into supervisor loop */ diff --git a/corelib/downloader.c b/corelib/downloader.c index cda5cb1..785c1f7 100644 --- a/corelib/downloader.c +++ b/corelib/downloader.c @@ -108,7 +108,12 @@ static channel_data_t channel_options = { int start_download(const char *fname, int argc, char *argv[]) { if (fname) { - read_module_settings(fname, "download", download_settings, &channel_options); + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle); + if (swupdate_cfg_read_file(&handle, fname) == 0) { + read_module_settings(&handle, "download", download_settings, &channel_options); + } + swupdate_cfg_destroy(&handle); } /* reset to optind=1 to parse download's argument vector */ diff --git a/corelib/swupdate_settings.c b/corelib/swupdate_settings.c index 1802436..b358340 100644 --- a/corelib/swupdate_settings.c +++ b/corelib/swupdate_settings.c @@ -10,6 +10,7 @@ * starting swupdate with a long list of parameters. */ +#include #include #include #include @@ -53,6 +54,9 @@ static int read_settings_file(config_t *cfg, const char *filename) { int ret; + if (!filename) + return -EINVAL; + DEBUG("Reading config file %s", filename); ret = config_read_file(cfg, filename); if (ret != CONFIG_TRUE) { @@ -67,36 +71,23 @@ static int read_settings_file(config_t *cfg, const char *filename) return ret; } -int read_module_settings(const char *filename, const char *module, settings_callback fcn, void *data) +int read_module_settings(swupdate_cfg_handle *handle, const char *module, settings_callback fcn, void *data) { - config_t cfg; config_setting_t *elem; - if (!fcn || !filename) + if (handle == NULL || !fcn) return -EINVAL; - memset(&cfg, 0, sizeof(cfg)); - config_init(&cfg); - - if (read_settings_file(&cfg, filename) != CONFIG_TRUE) { - config_destroy(&cfg); - ERROR("Error reading configuration file, skipping...."); - return -EINVAL; - } - - elem = find_settings_node(&cfg, module); + elem = find_settings_node(&handle->cfg, module); if (!elem) { DEBUG("No config settings found for module %s", module); - config_destroy(&cfg); return -ENODATA; } DEBUG("Reading config settings for module %s", module); fcn(elem, data); - config_destroy(&cfg); - return 0; } @@ -110,7 +101,7 @@ static int get_run_as(void *elem, void *data) return 0; } -int read_settings_user_id(const char *filename, const char *module, uid_t *userid, gid_t *groupid) +int read_settings_user_id(swupdate_cfg_handle *handle, const char *module, uid_t *userid, gid_t *groupid) { struct run_as ids; int ret; @@ -118,7 +109,7 @@ int read_settings_user_id(const char *filename, const char *module, uid_t *useri *userid = ids.userid = getuid(); *groupid = ids.groupid = getgid(); - ret = read_module_settings(filename, module, get_run_as, &ids); + ret = read_module_settings(handle, module, get_run_as, &ids); if (ret) return -EINVAL; @@ -162,3 +153,32 @@ int settings_into_dict(void *settings, void *data) return 0; } + +/* + * Initialize handle with the settings found in filename. + * This allocates memory which needs to be released by calling swupdate_cfg_destroy(). + */ +void swupdate_cfg_init(swupdate_cfg_handle *handle) +{ + config_init(&handle->cfg); +} + +/* + * Read all settings from filename. + */ +int swupdate_cfg_read_file(swupdate_cfg_handle *handle, const char *filename) +{ + if (read_settings_file(&handle->cfg, filename) != CONFIG_TRUE) { + ERROR("Error reading configuration file %s", filename); + return -EINVAL; + } + return 0; +} + +/* + * This releases (internally) allocated memory by handle. + */ +void swupdate_cfg_destroy(swupdate_cfg_handle *handle) +{ + config_destroy(&handle->cfg); +} diff --git a/include/parselib.h b/include/parselib.h index 5cbc255..84a51e2 100644 --- a/include/parselib.h +++ b/include/parselib.h @@ -85,8 +85,6 @@ void *get_node_json(json_object *root, const char **nodes); #define get_node_json(root, nodes) (NULL) #endif -typedef int (*settings_callback)(void *elem, void *data); - const char *get_field_string(parsertype p, void *e, const char *path); void get_field_string_with_size(parsertype p, void *e, const char *path, char *d, size_t n); diff --git a/include/pctl.h b/include/pctl.h index de5f3b5..84cf549 100644 --- a/include/pctl.h +++ b/include/pctl.h @@ -9,6 +9,7 @@ #define _SWUPDATE_PCTL_H #include +#include extern int pid; extern int sw_sockfd; @@ -28,11 +29,15 @@ pthread_t start_thread(void *(* start_routine) (void *), void *arg); typedef int (*swupdate_process)(const char *cfgname, int argc, char **argv); -void start_subprocess(sourcetype type, const char *name, const char *cfgfile, +void start_subprocess(sourcetype type, const char *name, + uid_t run_as_userid, gid_t run_as_groupid, + const char *cfgfile, int argc, char **argv, swupdate_process start); -void start_subprocess_from_file(sourcetype type, const char *name, const char *cfgfile, +void start_subprocess_from_file(sourcetype type, const char *name, + uid_t run_as_userid, gid_t run_as_groupid, + const char *cfgfile, int argc, char **argv, const char *cmd); diff --git a/include/swupdate_settings.h b/include/swupdate_settings.h index c3b083d..06e40d5 100644 --- a/include/swupdate_settings.h +++ b/include/swupdate_settings.h @@ -8,24 +8,52 @@ #ifndef _SWUPDATE_SETTINGS_H #define _SWUPDATE_SETTINGS_H +#include + +typedef int (*settings_callback)(void *elem, void *data); + #ifdef CONFIG_LIBCONFIG -int read_module_settings(const char *filename, const char *module, settings_callback fcn, void *data); -int read_settings_user_id(const char *filename, const char *module, uid_t *userid, gid_t *groupid); + +#include + +typedef struct { + config_t cfg; +} swupdate_cfg_handle; + +void swupdate_cfg_init(swupdate_cfg_handle *handle); +int swupdate_cfg_read_file(swupdate_cfg_handle *handle, const char *filename); + +void swupdate_cfg_destroy(swupdate_cfg_handle *handle); +int read_module_settings(swupdate_cfg_handle *handle, const char *module, settings_callback fcn, void *data); +int read_settings_user_id(swupdate_cfg_handle *handle, const char *module, uid_t *userid, gid_t *groupid); int settings_into_dict(void *settings, void *data); #else -#include -static inline int read_module_settings(const char __attribute__ ((__unused__))*filename, - const char __attribute__ ((__unused__)) *module, - settings_callback __attribute__ ((__unused__)) fcn, - void __attribute__ ((__unused__)) *data) + +typedef struct {} swupdate_cfg_handle; + +static inline void swupdate_cfg_init(swupdate_cfg_handle __attribute__ ((__unused__))*handle) { } + +static inline int swupdate_cfg_read_file(swupdate_cfg_handle __attribute__ ((__unused__))*handle, + const char __attribute__ ((__unused__))*filename) { return -1; } +static inline void swupdate_cfg_destroy(swupdate_cfg_handle __attribute__ ((__unused__))*handle) { + return; +} + +static inline int read_module_settings(swupdate_cfg_handle __attribute__ ((__unused__))*handle, + const char __attribute__ ((__unused__))*module, + settings_callback __attribute__ ((__unused__))fcn, + void __attribute__ ((__unused__))*data) { + return -1; +}; + /* * Without LIBCONFIG, let run with current user */ -static inline int read_settings_user_id(const char __attribute__ ((__unused__))*filename, +static inline int read_settings_user_id(swupdate_cfg_handle __attribute__ ((__unused__))*handle, const char __attribute__ ((__unused__))*module, uid_t *userid, gid_t *groupid) { diff --git a/include/util.h b/include/util.h index a0edd3e..ad2e90c 100644 --- a/include/util.h +++ b/include/util.h @@ -17,6 +17,7 @@ #endif #include "swupdate.h" #include "swupdate_status.h" +#include "swupdate_settings.h" #include "compat.h" #define NOTIFY_BUF_SIZE 2048 @@ -208,7 +209,7 @@ char *substring(const char *src, int first, int len); size_t snescape(char *dst, size_t n, const char *src); void freeargs (char **argv); int get_hw_revision(struct hw_type *hw); -void get_sw_versions(char *cfgfname, struct swupdate_cfg *sw); +void get_sw_versions(swupdate_cfg_handle *handle, struct swupdate_cfg *sw); int compare_versions(const char* left_version, const char* right_version); int hwid_match(const char* rev, const char* hwrev); int check_hw_compatibility(struct swupdate_cfg *cfg); diff --git a/mongoose/mongoose_interface.c b/mongoose/mongoose_interface.c index cae9e89..1b03c55 100644 --- a/mongoose/mongoose_interface.c +++ b/mongoose/mongoose_interface.c @@ -504,7 +504,12 @@ int start_mongoose(const char *cfgfname, int argc, char *argv[]) watchdog_conn = 0; if (cfgfname) { - read_module_settings(cfgfname, "webserver", mongoose_settings, &opts); + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle); + if (swupdate_cfg_read_file(&handle, cfgfname) == 0) { + read_module_settings(&handle, "webserver", mongoose_settings, &opts); + } + swupdate_cfg_destroy(&handle); } optind = 1; diff --git a/suricatta/server_general.c b/suricatta/server_general.c index 1803981..e4e4a5c 100644 --- a/suricatta/server_general.c +++ b/suricatta/server_general.c @@ -604,11 +604,13 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) LIST_INIT(&server_general.configdata); if (fname) { - - read_module_settings(fname, "gservice", server_general_settings, - NULL); - read_module_settings(fname, "identify", settings_into_dict, - &server_general.configdata); + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle); + if (swupdate_cfg_read_file(&handle, fname) == 0) { + read_module_settings(&handle, "gservice", server_general_settings, NULL); + read_module_settings(&handle, "identify", settings_into_dict, &server_general.configdata); + } + swupdate_cfg_destroy(&handle); } if (loglevel >= DEBUGLEVEL) { diff --git a/suricatta/server_hawkbit.c b/suricatta/server_hawkbit.c index df48180..c122161 100644 --- a/suricatta/server_hawkbit.c +++ b/suricatta/server_hawkbit.c @@ -1650,19 +1650,21 @@ server_op_res_t server_start(char *fname, int argc, char *argv[]) LIST_INIT(&server_hawkbit.configdata); if (fname) { - /* - * Search "suricatta" section to be compatible with past - */ - read_module_settings(fname, "suricatta", server_hawkbit_settings, - NULL); - /* - * Then try "hawkBit" because each server has its own - * section - */ - read_module_settings(fname, "hawkbit", server_hawkbit_settings, - NULL); - read_module_settings(fname, "identify", settings_into_dict, - &server_hawkbit.configdata); + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle); + if (swupdate_cfg_read_file(&handle, fname) == 0) { + /* + * Search "suricatta" section to be compatible with past + */ + read_module_settings(&handle, "suricatta", server_hawkbit_settings, NULL); + /* + * Then try "hawkBit" because each server has its own + * section + */ + read_module_settings(&handle, "hawkbit", server_hawkbit_settings, NULL); + read_module_settings(&handle, "identify", settings_into_dict, &server_hawkbit.configdata); + } + swupdate_cfg_destroy(&handle); } if (loglevel >= DEBUGLEVEL) { diff --git a/suricatta/suricatta.c b/suricatta/suricatta.c index 9e07efb..c828452 100644 --- a/suricatta/suricatta.c +++ b/suricatta/suricatta.c @@ -181,9 +181,14 @@ int start_suricatta(const char *cfgfname, int argc, char *argv[]) * First check for common properties that do not depend * from server implementation */ - if (cfgfname) - read_module_settings(cfgfname, "suricatta", suricatta_settings, - NULL); + if (cfgfname) { + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle); + if (swupdate_cfg_read_file(&handle, cfgfname) == 0) { + read_module_settings(&handle, "suricatta", suricatta_settings, NULL); + } + swupdate_cfg_destroy(&handle); + } optind = 1; opterr = 0;