From patchwork Fri Jan 29 11:51:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Adler X-Patchwork-Id: 1433274 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=2607:f8b0:4864:20::c3d; helo=mail-oo1-xc3d.google.com; envelope-from=swupdate+bncbclp7i7wwmhrb2hoz6aamgqeksd4qqy@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=PXHEp3vU; dkim-atps=neutral Received: from mail-oo1-xc3d.google.com (mail-oo1-xc3d.google.com [IPv6:2607:f8b0:4864:20::c3d]) (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 4DRwjn5Kwcz9rx8 for ; Fri, 29 Jan 2021 22:54:21 +1100 (AEDT) Received: by mail-oo1-xc3d.google.com with SMTP id u9sf4146507oon.23 for ; Fri, 29 Jan 2021 03:54:21 -0800 (PST) ARC-Seal: i=3; a=rsa-sha256; t=1611921257; cv=pass; d=google.com; s=arc-20160816; b=Af3wtwd5WfnozR01ejatigJkBsdM0VeBdzivIrai3cFM7BHtqMy4HwWg9sNX8lo1pF itJ+Enn2CG4Qi8znAhI9eaPx2Pc4gWTiHvag3RErn1M5ksk499JssbLEMqA25qV+wxev LWuAqKJtHblmVzGQd7fY4s0zg5mU8YYPSXPuxOjNeJgbs1QgCW1zDxiDNpBQiQp+Uzt5 hZQPm+AA4Sfy1ZzX2OXEm3q4U4Yu0gtf5LKEntgCj1FqR5lreYzPNotF0QRMQXfsN42z xfMVGwwkm5gUdLHUcMML6yCGkXfBM1lq1s9buUm10BfwdZsQdXA7GJ8aBs3JkaNsY4FE i4bQ== 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=ZiBVsDW2wg75QtZNS7FXhYJrryxBR2ZSNUCQfhFq+C4=; b=J7pmekZhQgBR6DEoNVyiIuK0vjcssLNJ8kX2tkTKh2CmAGs6pzNN5efieNalI29lrQ /RpFANA2HaOvC08TBxJ3N1wfyNFM9JNLaTHPns3jHJSy/EmkX1GMyiFCtH4Pz2TpjbhO ehpcypM1UQ2Cwb2IMxvAz23EjZklyMQcrIiCnqpISBCkpv7q5RISWSBRJbKOF3MJK8+q FNc5f0Hll88p/Cn0Cz9WcQ4mtA+0fcGQMv1EXrk2O4sEjsxOybJl4KyUofLzfKnFJRsP eX42bp2dKnUbuA+dA/K+QfoWbk0mq5lwdi+lOc2X8tPwwuPEQ7aQnGyOItMuYPPvsUnC DKQw== ARC-Authentication-Results: i=3; gmr-mx.google.com; dkim=pass header.i=@siemens.onmicrosoft.com header.s=selector1-siemens-onmicrosoft-com header.b=N5pnplf5; 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.7.53 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=ZiBVsDW2wg75QtZNS7FXhYJrryxBR2ZSNUCQfhFq+C4=; b=PXHEp3vUrLG9mfl3url4Z9Lp7jWGBIm8GV4yVIwlYxJ0CYyit79jEuGH9A/mc6DM53 E44Lqzlbc7KSpw7Gl2c70niwqXI/3Oai2nktmTQunXc5GKJAvXkGxBlbJf8pgosM96qA cnb+sOo/JPhd+qwkBzEfGJKQme8sEC2bb2b4eNy4mPtJtZS7L4mY8H2Qc9KpbnniQxDu lhN66wwh29gwbnMrJCXSJ2o3+reQF6EnpLDu6j5ZDdizEgAoSFZDHXZqdeHMAEJvQI7A OKgjmt+5Fh9Ti6PHJHayocoLSNdBYdAYFoGmjnAxGPJAMVe3eT7n6FmrjcoHpHe9fY8i AVbQ== 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=ZiBVsDW2wg75QtZNS7FXhYJrryxBR2ZSNUCQfhFq+C4=; b=FjoZaerR9tDsMJt8Sq8iZ2USQ1Fxin2q8cUrVcdvJJ51caUughLrWMYPkVIDh+T9PC n3330OaoxyvR63maHpJrSUYKkJ6MSmr8djZW8WuQNnrK9ChYMUBlTgRuOAZpVt16DxTi rovTLzD0DvzbWBoL/UMUPYwp7O7b4DZnWqqCHiLHFYrh/GTMRzRU+Fn6t7PXs8pxA0qH 8SSuNbHWpzG6hoZij/We0+LAjNoyCXLhV53bJzF7vkGZdp52CvJYN50TX/E/PjZYmVEu g02gdwryO34GLfbYg/SphOnKOZxM2oXbBnR4aVQH1lpswRBA3Jap4yG3ELiezD9zlRKu VMnQ== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOAM531gyonyrKn1OHfi0uCEab9yflubwMSJABxskhXbUq5xJ+Kv7nij JBKWHQGHk5sbmiIZMKkM8kU= X-Google-Smtp-Source: ABdhPJx/Qrw0ffaFlg7rSPY/vzNdUOJRbzuMVZ7TXvUpJtSSrtGhat0REEAxaKZKq5qdwEXWamx/Vg== X-Received: by 2002:a05:6830:1d42:: with SMTP id p2mr2662893oth.232.1611921256900; Fri, 29 Jan 2021 03:54:16 -0800 (PST) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a4a:9c89:: with SMTP id z9ls13372ooj.1.gmail; Fri, 29 Jan 2021 03:54:16 -0800 (PST) X-Received: by 2002:a05:6820:445:: with SMTP id p5mr2834593oou.63.1611921256554; Fri, 29 Jan 2021 03:54:16 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1611921256; cv=pass; d=google.com; s=arc-20160816; b=MdphE+qv1SAgXidGWkQKhfTTKYNJdAXIiXVg8d+UKdWDwISXcMVYTs0Z5YCHXkCNtr KefdE2UII6H2D+BL7PChfpX+3UaUDkJ/Lwje03KzLdXYY14cm4JjCQAlmn4Fw+C5+j0g 3lli8RiIhND0+FQASqCDZ7VujII3QB5AoXwj+R6pLVtx0KPqvU801cONSRgzsDkUHBUE kdOUQABda1BTbQnOh5mrM/4NbPqJZuVABpIrJpk3jCz0Fu31TK3t828yd0h12sY88PZO xClw0t/k0ibeoMX7lvAy6VX/G6JyeeKm2IBxgtQiK18XLmdvmFdnvUlwTCOixAy+f3zm vhHw== 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=MqMFWzQPjQdCAFPIPW2TTG3WPKwyTZ+ax5uCOD5FEKQ=; b=gl89N+K2JV4LBrfydSlVai2CYqXLGqv0S7juCCNI4Qd3ZtIZT7/p3lpgIjqKpajP9K QnouCwHNUjCfdj9QQLoA4uE3douahn72y5y17MuCBz7UIyLmlL8XaNE0NmTb9iqmGTsS cZLQYfjj7jIwuhQg4uWn1kwMTMGnbOUbmPbEZk5vEIPgpf800NssH9hntkVpcNH7PaaW ak2SqvaWqoB803Az2DfMSryB8m69qHHpD391GpbLaOhBbJWaPGy3cyeKXEohIfasIlBW LUqMFc2UgGasnqbmX9peJr+v94ZX+Gs6PZ1IyFYGQucxO9G5EMDVNFhyWDH6gLBuQABY m+qA== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.onmicrosoft.com header.s=selector1-siemens-onmicrosoft-com header.b=N5pnplf5; 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.7.53 as permitted sender) smtp.mailfrom=michael.adler@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-eopbgr70053.outbound.protection.outlook.com. [40.107.7.53]) by gmr-mx.google.com with ESMTPS id s139si550138oih.5.2021.01.29.03.54.15 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 29 Jan 2021 03:54:16 -0800 (PST) Received-SPF: pass (google.com: domain of michael.adler@siemens.com designates 40.107.7.53 as permitted sender) client-ip=40.107.7.53; ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Q6x3QjeqeNQY6oVx38Y94Q+pwENqCNISgATX2t8qG094KwnvrHuit0qWvGRZ7Mfpo+WmFAVyGlvSvCoBGWH0SmhiXAvrjj8CtnTe19qsTKrIOT1SEqPA3hBkzDObrt2hl/rD33HPuIuaglHYBCSL7kIXZH7VtSFb4EhjYkAWkWoHB8Qv+j9i2tKUWmVFVdYNRa6gPNbth6wxWE7sLLW2/Dd/Bl+BOA1D+TjdxblvVrMFONqXWDXDlyx/qiWKIu0datC8Kv45GP2IUsU9+7m8w4ik7ZymnH8EJkOntcTo6e/rcT7Unsl4LMjgIOoJBT/zpfvVxT4kmKJGVAq9VFczkw== 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=MqMFWzQPjQdCAFPIPW2TTG3WPKwyTZ+ax5uCOD5FEKQ=; b=kn20zYaUDIMeF/pNcDEz2/JHtX9XzsbocyS8h4RuCw1kMy+8zTvLEX5S61Sb9LpA/lhjtMVQwOBVYWW1CimHkc/xcjk/k8amqgLtvIpUUaIxQ4/AqzpTdSlyZfwEUqph3xhSbDy4acjD9DA8kkTL/MbdTEQ0frtVFQ6sB2UvZ0xq3XUJnJXrIWnusmJXlxxt2S+9EvZckUjvq4pUwNaOpdGGpWqFS/sJhKXVaIw13fSqEJq5KWWSLl+tORGXa/9bsPPOplyKWmXbVK7/Gt5Zs6bjTSLXcMKWnMQfCn7TNrmDVpJHKxSabEt88+leKh/GfGSGAfsk5jh1ymZsjUy14w== 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 AM0PR10MB2721.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:124::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3805.19; Fri, 29 Jan 2021 11:54:04 +0000 Received: from AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM ([fe80::2838:c46a:e3fe:2c7a]) by AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM ([fe80::2838:c46a:e3fe:2c7a%4]) with mapi id 15.20.3784.019; Fri, 29 Jan 2021 11:54:04 +0000 From: Michael Adler To: swupdate@googlegroups.com Cc: Michael Adler , Christian Storm Subject: [swupdate] [PATCH v2 5/5] Avoid re-opening and reading configuration file Date: Fri, 29 Jan 2021 12:51:55 +0100 Message-Id: <20210129115155.13116-6-michael.adler@siemens.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210129115155.13116-1-michael.adler@siemens.com> References: <20210129115155.13116-1-michael.adler@siemens.com> X-Originating-IP: [93.104.94.155] X-ClientProxiedBy: AM4PR0101CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::33) 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.94.155) by AM4PR0101CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3805.16 via Frontend Transport; Fri, 29 Jan 2021 11:54:03 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: b4c8641e-dd14-4983-d67f-08d8c44c931c X-MS-TrafficTypeDiagnostic: AM0PR10MB2721: 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: rTcbpuHLjLrCfEC8r9RmMXBMV8nj8oK1oxsScMmcgysJQLryRVOr1SPIazKs4YW4Gt4qDESJrS+6x4Zbq1auNv1Q/k0wnLSUsK5qz3tjlTUJmHBziz8CwOTw+l6m3ltVWhElECfGn0ODSG9LXYMZ+5qlg8F7NJo8+PB5dm0dH55QYHRW5l8cry4eDi0FUEJ2e2wWhKZWM8z7MhB2yTDxJH6hytCK2uhypseLiMVpr+th4I87mQDzORXCTBjndpysE5xHu+M3zmBgGmNqUZADYCUJTXHP0ue7CXP/5NjEd5MgUs3k2J9WM0sQiszD34u5R3J5dMmDfcSWQ1SBc4H7bCHpTppH72fX4L8AjHcg0v/8y5fJmQRY+9EnQ6MQIsblB22scAeWdviKWBsGrMfJ+4HGrNEZ2DLEMqXE+vTlJxoI8xT16V9MPdxxRyjMmqv4Ccd7UwaBKlP4h7jtAcn2sc46g6JHN1IrW1jPspEvMXJfJo8qVBrsUNbW9JpBJnTrVaXy7c5ISPx7NMCrGb0M3g== 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)(39860400002)(376002)(346002)(136003)(366004)(396003)(83380400001)(316002)(26005)(66946007)(6916009)(186003)(4326008)(16526019)(2906002)(86362001)(66556008)(66476007)(956004)(2616005)(478600001)(6496006)(44832011)(6666004)(1076003)(6486002)(30864003)(8936002)(107886003)(5660300002)(54906003)(36756003)(8676002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: XS51wxhae9tTkLhlBBKjQ/71tBj0qUJj3O0F+iu8TVZ85VIIExydfj0stpqYqa9h4KR+AR3LlngNK2MOxQGCDpdOM91u3viedZWr8QSBJu7gHYS6b8QeoIN5oXqYtwJcxZa5AgwA0flJQ2AoEVPAJbkIVYB0YWRFzePuX/hbvyyz6iAtFpMTrR69v45xQAvbprK0G4gj85F2esvujecUAgEmNw1iwksX2PTzwVJ5Wd3fF+KVRs/Lzrm43wmkFEOtlvFw8jLGQbWi6YPcPx9mqTNGICgfvPpXlhzkU6jYAtiTeGnHh8mHFq9QAP4g0EWfkYwk3MGgNNBHhm5jbw0day42XsS4GfS4EQp+rQljelPZO2eH2DcA6GYS/vQRORlS0/qYgCPj5lxPKXDL2WoyUcf7Gz5iriPjK+LN1E/DMH61gxo9U09BenckucRXSa2mPgWCZQ1Z3+uSY6O/zyKtcW+LdBPgGw/QfqcnoYOP0z16mfr5/6nWM8dLHSRsWKcAjpXd92hT4m2waegU3S2F/ngDqSswzmxBfuyNeF92pCKamg9V0RH3XypdLk6dP1ZPC1hULu4YT68LuhCGtYUdr1n5AzdMugaFiBijnhn8wAr/VUBkgtrc75kJJjbF5SNfe3isc3BMh9Jh79NgMwo3FNLOpX8nTU05vbKbRcSE/z2YJe+HlyVcK+jUfyAtrf06bzClZitB0z/UTXqIV7qRKEogyHUKrZ1nCCO0pNheMNzTAAh0kQxCufLOn8Ash/slisBOmFeV+AqTA4A+Rm/5Wglvx1z3oBzc8V4ULMRRKJ+nPfYynNFe5SYPlTWXmDaoY/8pUGPCKL32svEimP7rmXN43fwnOymJxuQLl3s3xwmadBDXri1alNte4srdWB4i7yRRmfgtUBvwyYIEe2woGEsLyHJx7GnsWtjLC9xuh9oYz6jqxalYdChv3O5GsO874P+Up0gTEP/FIBqj2vP8YcfinAnG/95Fd1afMyrBSFmblw+whOZ1mhIJvOxs/dvakvkDjLn/29NNoiIEq3zJbbk9sTZKZvQD+64eDF/YHevGBzA1EmgLZOtgNPnS4Pz3 X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: b4c8641e-dd14-4983-d67f-08d8c44c931c X-MS-Exchange-CrossTenant-AuthSource: AM0PR10MB2322.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jan 2021 11:54:03.9993 (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: DO9lyA8WZE60jFEF6ZzsUyuVC1aYY00semcbwkvI3X1wNm2nNBwzF20kxQy8OXRMhBMDblURzBze9GS1vwTnMTSKqC6EuiY5pPV9H4f0qh8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR10MB2721 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=N5pnplf5; 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.7.53 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 | 44 +++++++++++++++++++++++-------- corelib/downloader.c | 7 ++++- corelib/swupdate_settings.c | 49 ++++++++++++++++++++++------------- include/parselib.h | 2 -- include/pctl.h | 9 +++++-- include/swupdate_settings.h | 40 ++++++++++++++++++++++------ include/util.h | 3 ++- mongoose/mongoose_interface.c | 7 ++++- suricatta/server_general.c | 10 +++---- suricatta/server_hawkbit.c | 14 +++++----- suricatta/suricatta.c | 11 +++++--- 13 files changed, 151 insertions(+), 71 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 f783c72..8e97567 100644 --- a/core/swupdate.c +++ b/core/swupdate.c @@ -548,13 +548,18 @@ int main(int argc, char **argv) } } + swupdate_cfg_handle *p_handle = NULL; /* Load configuration file */ if (cfgfname != NULL) { + swupdate_cfg_handle handle; + int ret = swupdate_cfg_init(&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. @@ -563,6 +568,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); } @@ -572,11 +578,11 @@ 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(&handle, "logcolors", read_console_settings, &swcfg); + (void)read_module_settings(&handle, "processes", read_processes_settings, &swcfg); - (void)read_module_settings(cfgfname, "processes", - read_processes_settings, &swcfg); + /* save the handle for later usage */ + p_handle = &handle; } /* @@ -828,7 +834,7 @@ int main(int argc, char **argv) } /* Read sw-versions */ - get_sw_versions(cfgfname, &swcfg); + get_sw_versions(p_handle, &swcfg); /* * Start daemon if just a check is required @@ -841,7 +847,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(p_handle, "webserver", &uid, &gid); + start_subprocess(SOURCE_WEBSERVER, "webserver", uid, gid, cfgfname, ac, av, start_mongoose); freeargs(av); @@ -850,7 +859,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(p_handle, "suricatta", &uid, &gid); + start_subprocess(SOURCE_SURICATTA, "suricatta", uid, gid, cfgfname, argcount, argvalues, start_suricatta); @@ -860,7 +872,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(p_handle, "download", &uid, &gid); + start_subprocess(SOURCE_DOWNLOADER, "download", uid, gid, cfgfname, dwlac, dwlav, start_download); freeargs(dwlav); @@ -877,7 +892,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(p_handle, proc->name, &uid, &gid); + start_subprocess_from_file(SOURCE_UNKNOWN, proc->name, uid, gid, cfgfname, dwlac, dwlav, dwlav[0]); @@ -904,6 +922,10 @@ int main(int argc, char **argv) sa.sa_handler = sigterm_handler; sigaction(SIGTERM, &sa, NULL); + if (p_handle != NULL) { + swupdate_cfg_destroy(p_handle); + } + /* * Go into supervisor loop */ diff --git a/corelib/downloader.c b/corelib/downloader.c index cda5cb1..600e4c8 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; + int ret = swupdate_cfg_init(&handle, fname); + if (ret == 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..53f0d89 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) - 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...."); + if (handle == NULL || !fcn) 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,25 @@ 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 in swupdate_cfg_destroy(). + */ +int swupdate_cfg_init(swupdate_cfg_handle *handle, const char *filename) +{ + config_init(&handle->cfg); + 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..3da7777 100644 --- a/include/swupdate_settings.h +++ b/include/swupdate_settings.h @@ -8,24 +8,48 @@ #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; + +int swupdate_cfg_init(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 int swupdate_cfg_init(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..9014a71 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; + int ret = swupdate_cfg_init(&handle, cfgfname); + if (ret == 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..a12ee4b 100644 --- a/suricatta/server_general.c +++ b/suricatta/server_general.c @@ -604,11 +604,11 @@ 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, fname); + 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..e95ea68 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) { + swupdate_cfg_handle handle; + swupdate_cfg_init(&handle, fname); + /* * Search "suricatta" section to be compatible with past */ - read_module_settings(fname, "suricatta", server_hawkbit_settings, - NULL); + read_module_settings(&handle, "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); + 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..83b517a 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; + int ret = swupdate_cfg_init(&handle, cfgfname); + if (ret == 0) { + read_module_settings(&handle, "suricatta", suricatta_settings, NULL); + } + swupdate_cfg_destroy(&handle); + } optind = 1; opterr = 0;