From patchwork Fri Mar 15 09:25:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 1912425 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20230601 header.b=Vgw4JqGD; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::239; helo=mail-lj1-x239.google.com; envelope-from=swupdate+bncbaabb7vh2cxqmgqe5r3b7cq@googlegroups.com; receiver=patchwork.ozlabs.org) Received: from mail-lj1-x239.google.com (mail-lj1-x239.google.com [IPv6:2a00:1450:4864:20::239]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TwzPK2VSzz23rx for ; Fri, 15 Mar 2024 20:25:23 +1100 (AEDT) Received: by mail-lj1-x239.google.com with SMTP id 38308e7fff4ca-2d48e6c8facsf1382831fa.3 for ; Fri, 15 Mar 2024 02:25:23 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710494720; cv=pass; d=google.com; s=arc-20160816; b=SHQU2nPMgjSl+ayOIR4SVWINVmlGgc8A5lmHJTn+ztGGVmCwaioB2iZiqUphooL9YL GbfheDjPJDAFSX8fVJ4B/mBRav8QOjdf4CRGtSXIIQudnnfyAH6ZccMGiC3m/bAgkEYg 6S3oIrZQIiIZiug+J4PL345NevOv4KPNFotGKHTzjCQHc/fjhLd2EwgJ5SVc4lXdEXOh B9BEO/MiFCxyxUBZOytVUfWhAHvg3/TUAefDhtddWIZPF5HmRo8ZPuF3InXRZOa5BR+S WMHh6HGEOHLEm1zsRCsYSOfJwPndoNJ0imdkcHL3/8/1P2sEkuazHLlkcVZwpeEOWfRH DQyA== ARC-Message-Signature: i=2; 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:ui-outboundreport:mime-version :message-id:date:subject:cc:to:from:sender:dkim-signature; bh=jmXoGrB3uFXjKFwCjLzFLboxJ7reV9RdN3LVQ690NhQ=; fh=TkWi4p1CSX4O1Zu0hjiZ0xvq6M9riUX7GgArdmf/DdM=; b=QAsGLtNdTvh9hAFm6CoKygzUBIFQSsa7ZkS+i3katx85jDJm1oIiLsRhqDbrw/jOUb ZJqvr1qKSh2NP8m1O8SdX0SZpBOal0aO5RA+PHW35RsKbnlbun6NAZM88+YZktTgKgYH K0xLUIE0zErpULUYtTcxd/3znY/kS5GiGaYO7hyKL2HZOyEBv8HateRHzLvqC/TTOQS9 VKYdMi+nQm6v5ctTmIql0Vi2KAGCpdxb+BkCu9Q3SAzK2+0ZX7l8nHWed1Jv9FOJFwGt 0grOam5qejlFHXnGRljFMuHBiCO5KRFIFS+p4n2T8/6HQzgXgrvwiQtVwbjEjtKCiofV cgFg==; darn=patchwork.ozlabs.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=wgW2j01N; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.13 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1710494720; x=1711099520; darn=patchwork.ozlabs.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:ui-outboundreport:mime-version:message-id:date :subject:cc:to:from:sender:from:to:cc:subject:date:message-id :reply-to; bh=jmXoGrB3uFXjKFwCjLzFLboxJ7reV9RdN3LVQ690NhQ=; b=Vgw4JqGD9Hzejp4rKp4W7UnfeBbjn4e1tQ+UGE49txI+wLX62O3r5SZjPjJ1LESGdm lA7LHM7zRMhVwE0WdeVpBKJedCxNCt2BeZ/WEb2XNjpH/L0Gcg9FNebrQTmEW33Eo+lt Vjy2SxUyicMOPo81NML3xlzHU7s1OdAtPlRfMuAl3oGmkUQaAl9fbWWT6NCVuXfXVaL5 kdE8KLOXvKEg/BCC/fNSEHbgMWrpMdxncGWb/RZRepHNDW7HEzTmNvxwKEsV62655n2K ijQV/ZzIvsdhBfzhcqXu2aDj+cQvE+9SnuJ5iSpesE1rtBqK2wdwQJzaDaKS72BqCwH8 e90A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710494720; x=1711099520; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender :ui-outboundreport:mime-version:message-id:date:subject:cc:to:from :x-beenthere:x-gm-message-state:sender:from:to:cc:subject:date :message-id:reply-to; bh=jmXoGrB3uFXjKFwCjLzFLboxJ7reV9RdN3LVQ690NhQ=; b=ZbKnYLBx0Q2LuEH/usrtQ2JJQu/2Av4v4xdWqFAQeDL0EPo3UV3aL9hoCkWwGtoYCI +x3G82Ml4m7IapTnzOdtV6HC0wm2qIWim1tKKIl10l2OPii6fy337fU7q497lKDju35l 9sprIH9Ly02HDT3JWY+JL/BSxEoVBIcxsPnww5H4cEGza/KKpccjeeRZrpUbmst4aJSU 0kUiIy6E4Wixk+zJaYCkOFTQRFsS2vqMLHmxHmSIutKF7uYUhxKCs8KeYApOqRk0ljZr 6Ck737iTJJNdpvX+v56SEnOX1eTbj5me5GhINQr3Uq/Y4Ry8TK+yx+qe3CMU1FWqnQQO Ol3A== Sender: swupdate@googlegroups.com X-Forwarded-Encrypted: i=2; AJvYcCXWzfl6GSu8yNl/ZIv4T7LDyCnPGljEUmdvfkEjU61pBA5Mb2MmQiTuMO7RfqcLUsG+xPY4l6Ok47MxApei6MWxUrZxZxfvFi6kTfAYBA== X-Gm-Message-State: AOJu0YzbR0BpxeWvu9i41pDVh3tfp0yNGQKKj4Sr9Z7uFc6EX4f2Tuco jnZ9tC7Ac6BQ4sqUSqzdoHiimqIK/euxCLSswNk8UrEOwrr8RrxQ X-Google-Smtp-Source: AGHT+IFvK5hMEX7vm/h1rx9F8LnOGLRFgYh1BpDRmAa1R4qYRQOg2wG9Kb+l2v0cmv//JxGnVyKpkA== X-Received: by 2002:a2e:a9a6:0:b0:2d3:e77:7801 with SMTP id x38-20020a2ea9a6000000b002d30e777801mr3510048ljq.3.1710494719510; Fri, 15 Mar 2024 02:25:19 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a2e:2281:0:b0:2d3:914b:406e with SMTP id i123-20020a2e2281000000b002d3914b406els138108lji.1.-pod-prod-08-eu; Fri, 15 Mar 2024 02:25:17 -0700 (PDT) X-Received: by 2002:a2e:9850:0:b0:2d4:7829:4d13 with SMTP id e16-20020a2e9850000000b002d478294d13mr2592656ljj.50.1710494717174; Fri, 15 Mar 2024 02:25:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1710494717; cv=none; d=google.com; s=arc-20160816; b=O8YqUdjjUSNUPyAFZGUROm7eKikBCjgX9XdMSqPlfQUU516KTkP8GOvsaZBT11RDgG yrvvdm40qHpa9/DpkPJM73FsOgyRM+iHid41Q4FoD8BxktzByPASL7rtjhSrBqB1eWKW SzuzryEydUzF+FVlhHVroTfo/kJfwlAwhsJeZSvFN8SU7IyfUUO/QlnC84oo1Ar1i7Cs wqwDIJG61EPhgSfm5FQ/8U2rYELirUAoM4eoUTfYTRlyVm/VVz0Az9kPqwchDkZ8RLEs 5QmmrXjP2YqafQGTENQqAutqHPknd40YQ4nhOzUz1EzGjwZ2ZBRJkmDmRxNjGgnp3Df1 CQWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=ui-outboundreport:content-transfer-encoding:mime-version:message-id :date:subject:cc:to:from:dkim-signature; bh=Jix/qSZwSU8h9U3/Ra5+SPe4vy19YDd92ygjMK8uIlo=; fh=TiEWcqMcKpHk5s7uErzpntoONrNfOXwKpI5P8bIlggk=; b=IQqrEcSEZVMsh9HKa41R9RswgCl2B8lMKN3RaAyIUbqQpdteWGHdZK9iqlI/OHdji4 qcDF/77h2avpYAH98PbUcNmwZsnFYCyPUMx4F9/0jXzg9oJYipOucLcM20uhGFHmqD82 2GX/N6RJ4YN6V2M1KpjFxeL+rX+j4rhZDeFeH+STc6tW8gObLpk02E8A/rkRFhX/F5bc e3yUK9AFAtSXEvz1S+7gPutvcH1Asqc1mUqFTATI5Ey09+2OYbvt5BbeZbCpCa+Xb1gv NzHYUWHFsaQCyzFff/W9ObGCHyTLNhpdHwrel8z7G5rE08NoXmQZ0d2I7em0bv1IWBIC U+NA==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=wgW2j01N; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.13 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org Received: from mout.kundenserver.de (mout.kundenserver.de. [212.227.17.13]) by gmr-mx.google.com with ESMTPS id z20-20020a2e9b94000000b002d46764b564si167659lji.6.2024.03.15.02.25.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Mar 2024 02:25:17 -0700 (PDT) Received-SPF: pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.13 as permitted sender) client-ip=212.227.17.13; X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from paperino.fritz.box ([88.217.136.221]) by mrelayeu.kundenserver.de (mreue106 [213.165.67.113]) with ESMTPSA (Nemesis) id 1M5xDJ-1rjfpX18jT-007Vx2; Fri, 15 Mar 2024 10:25:16 +0100 From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic Subject: [swupdate] [PATCH 1/2] handler: add function to unregister the handler Date: Fri, 15 Mar 2024 10:25:13 +0100 Message-Id: <20240315092514.485906-1-stefano.babic@swupdate.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Provags-ID: V03:K1:LT8UgbWqMqGghG/RkxT64/uQRr7h16fM0Sas8kHKggMe+9wL2Vd bPoKbeWW2Ua5BfgMlBQej2fcfAiE/VRbUxEDb8Km69jCz1+dFjWM7KJPcX95q/pVK0R/CY7 bpE8sZtTPSQAwRN0vbHbpxtxoO0H7JfCrw68YdkQw8pASJdWhYxU4aRB5nfCT7cT9mXEOT9 jVOxda0WUmldbA701vONQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:a/7zCpZqbKo=;8dfxH8G7jhFbAVJuespmAALW1Tr by27mO8y79VfmeGAPvyJoPLWPnteU/Jy3QkIFYt5RSIgIx3yt67n2qhFl0VJpHfRhZdRh8kzw u7LvyIeePre0ynUZitvZw4ORoLUyMSxlSWxK/SCGvOZSmr0bZ2GhBI1S/jBilj6uVgVE3G+1E t4voJM0vLYRKiTtVbkVpvApjS+Kohd//RQHDxPF2d/kiwYauEJ+PN8W1V4C34ElTlDHk4Me7g p/MejkGOY4D0XXPHscDycdTpeZ1b2lC//kKlFP9vW0RoQYvbnxdaY29TSmNjPndCHcbEofMga aKBuCGFQBzIzhF8LaJlDwg7SUYPxZSkG5vNiC0NG3JuXjg/Pia1IUIo1Tb+hd4vcZwBIQEL4o xzaaiArla56Ov7M9/0FsXKlDU5/Z8C+gkji8nQs0+IKphw7HjUc0rWQ+H9jt3hlna0689XptB pyouH8fs7vDFO4rauF02wrHN6CpwjAc9GQ8l0rE4bF261fqWuUSzg+prcrwuZbZrD6IEnlRgn vxXF41ZkOBuEOjfrecXvcdcF8/IE4cES317RYtzd0uE6ATAYJemRgiYruSe2u+gu66fbui6Lj mHJGYh6UUlg8+JC0f96xuPrdACKUFGa8pWNn0A4n1fnVI98qBB55fh1B0rLKlUyaXv5LP0KV+ hl3iBHDnY9MgPKzjriHF+Njgl1bG0/QXqSFfPYtKC2BaDuE2qO+gXzVBE8MV7hRHcx5Tl/zJE c6Fewy2ceXV74yRAcRRkwYR6qZfURCBOQBWh3hWv7BXF1RvI2qC6y4= X-Original-Sender: stefano.babic@swupdate.org X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=wgW2j01N; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.13 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org 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: , Up now, handlers are instantiated when SWUpdate starts. Add a function to unregister a handler that was set as temporary (noglobal flag) and was instantiated during an install transaction. This is to provide in future a way to add new handlers that are transferred together with the SWU. Signed-off-by: Stefano Babic --- core/handler.c | 54 +++++++++++++++++++++++++++++++++++++++++++++-- include/handler.h | 27 ++++++++++++++++++++---- 2 files changed, 75 insertions(+), 6 deletions(-) -- 2.34.1 diff --git a/core/handler.c b/core/handler.c index d3862a33..74a211ac 100644 --- a/core/handler.c +++ b/core/handler.c @@ -21,8 +21,8 @@ struct installer_handler supported_types[MAX_INSTALLER_HANDLER]; static unsigned long nr_installers = 0; static unsigned long handler_index = ULONG_MAX; -int register_handler(const char *desc, - handler installer, HANDLER_MASK mask, void *data) +static int __register_handler(const char *desc, + handler installer, HANDLER_MASK mask, void *data, handler_type_t lifetime) { int i; @@ -43,11 +43,61 @@ int register_handler(const char *desc, supported_types[nr_installers].installer = installer; supported_types[nr_installers].data = data; supported_types[nr_installers].mask = mask; + supported_types[nr_installers].noglobal = (lifetime == SESSION_HANDLER); nr_installers++; return 0; } +int register_handler(const char *desc, + handler installer, HANDLER_MASK mask, void *data) +{ + return __register_handler(desc, installer, mask, data, GLOBAL_HANDLER); +} + +int register_session_handler(const char *desc, + handler installer, HANDLER_MASK mask, void *data) +{ + return __register_handler(desc, installer, mask, data, SESSION_HANDLER); +} + +int unregister_handler(const char *desc) +{ + int i; + + for (i = 0; i < nr_installers; i++) { + if ((strlen(desc) == strlen(supported_types[i].desc)) && + IS_STR_EQUAL(desc, supported_types[i].desc)) { + break; + } + } + + /* Not found */ + if (i == nr_installers) + return -1; + for (int j = i + 1; j < nr_installers; j++) { + strlcpy(supported_types[j - 1].desc, supported_types[j].desc, + sizeof(supported_types[j -1].desc)); + supported_types[j - 1].installer = supported_types[j].installer; + supported_types[j - 1].data = supported_types[j].data; + supported_types[j - 1].mask = supported_types[j].mask; + } + nr_installers--; + + return 0; +} + +void unregister_session_handlers(void) +{ + int i; + + for (i = nr_installers - 1; i >= 0; i--) { + if (supported_types[i].noglobal) { + unregister_handler(supported_types[i].desc); + } + } +} + void print_registered_handlers(void) { unsigned int i; diff --git a/include/handler.h b/include/handler.h index 66529467..e100bd72 100644 --- a/include/handler.h +++ b/include/handler.h @@ -8,6 +8,8 @@ #pragma once +#include + struct img_type; /* @@ -36,16 +38,29 @@ typedef enum { NO_DATA_HANDLER = 32 } HANDLER_MASK; +/* + * Life-cycle for the handler: + * GLOBAL : handler is instantiated at startup and available for all updates + * SESSION : handler is part of the SWU and available only for the current update + */ + +typedef enum { + GLOBAL_HANDLER, + SESSION_HANDLER +} handler_type_t; + #define ANY_HANDLER (IMAGE_HANDLER | FILE_HANDLER | SCRIPT_HANDLER | \ BOOTLOADER_HANDLER | PARTITION_HANDLER | \ NO_DATA_HANDLER) typedef int (*handler)(struct img_type *img, void *data); struct installer_handler{ - char desc[64]; - handler installer; - void *data; - unsigned int mask; + char desc[64]; /* Name that identifies the handler */ + handler installer; /* Handler function */ + void *data; /* Private data for the handler */ + unsigned int mask; /* Mask (see HANDLER_MASK) */ + bool noglobal; /* true if handler is not global and + should be removed after install */ }; struct script_handler_data { @@ -59,6 +74,10 @@ struct script_handler_data { int register_handler(const char *desc, handler installer, HANDLER_MASK mask, void *data); +int register_session_handler(const char *desc, + handler installer, HANDLER_MASK mask, void *data); +int unregister_handler(const char *desc); +void unregister_session_handlers(void); struct installer_handler *find_handler(struct img_type *img); void print_registered_handlers(void); From patchwork Fri Mar 15 09:25:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 1912426 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20230601 header.b=t+St6VC3; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::23a; helo=mail-lj1-x23a.google.com; envelope-from=swupdate+bncbaabb75h2cxqmgqehc252lq@googlegroups.com; receiver=patchwork.ozlabs.org) Received: from mail-lj1-x23a.google.com (mail-lj1-x23a.google.com [IPv6:2a00:1450:4864:20::23a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TwzPK3CwVz23s1 for ; Fri, 15 Mar 2024 20:25:24 +1100 (AEDT) Received: by mail-lj1-x23a.google.com with SMTP id 38308e7fff4ca-2d4852423c0sf7091711fa.2 for ; Fri, 15 Mar 2024 02:25:24 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710494721; cv=pass; d=google.com; s=arc-20160816; b=VXcdj9mJ+2PsfIYvYhsUNIe/b6/Pn7hgZKOR1xO8JCW49NbkV88rM5z/VrWuBqUS8/ DZFxZMMjI3TDVIyBpSO2GJr9Ak3eS7E4GH0lxFjgVT77HmUFV9M6SsNWfnPhHYqvTc8p HYnUgdXvxBnh4cQrc/E3z+TAj+JO5qzv78izABSeibG6jwybl6rOvRcV/rBLRB/CFjz1 eG0knIiGBxKeh2sSlbyZa+KFUpAg4NhUbEOzu7JZRyJtHqQU54LotuxlHylFow/m6MwV zfSufpkTc/+nY3Byg7xxUXCGkrul+X6LJUhvJgNhcnJG5+/SDlrj+766eq+/yeOp/Vzh gy3Q== ARC-Message-Signature: i=2; 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:ui-outboundreport:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:sender :dkim-signature; bh=1UH24BANh4ul9+WWFrwoy+ZJC9Is2vUbGflKMylUCbw=; fh=Z/81suo9tHfNanT4HyP0fSrQM661PTrjc03grzvEfj0=; b=gcrV1hWjDMs4z7lCz9c9Ljk7Cxia6wqbYEWfpIRcMBoq7QJl2CXybWpmuRZWzyPnNI 5FRS5/zoJM077Y/Imu2XbmLE3lwF55rbEdnfdcrRrsF3WU1lHrVIHJWVUnNLcq6JWwyB XCGEWphXqA2ay28pUuWAbo13fXNWKtMGAZsuD3sjTAyij1roXjqkc3idK4HJzRIxvCWQ kh9C1cumyBs01Ockw5Gm/vbC0p1/jVwA6/H2hZi/AgLXmESQUBHme2Q+gZ5gfA2O/J0k cNcSjN6ibhgl+wsDtyuAXB+s1z25V5AZfAlLrLM/x9QOm4t6DSscZzX6qWsj0DbpAr03 Of9A==; darn=patchwork.ozlabs.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b="rJx4U/DC"; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.10 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1710494721; x=1711099521; darn=patchwork.ozlabs.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:ui-outboundreport:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:sender:from:to:cc :subject:date:message-id:reply-to; bh=1UH24BANh4ul9+WWFrwoy+ZJC9Is2vUbGflKMylUCbw=; b=t+St6VC3R/kz14P5/QIv24cE1JT5yR+udnrtGElZzCj+7IfpiYMcmbEh8SrfuOGFXk /QBZK058+SBvuntEkQPULKSQdlMLwyrwyJYqEH6uA3/jlCBoRpCh449VmD3i/FCxOonD wa8f0uLg53l5TbmJknAFzCC0blAUzuC1JbcD77S6HvV9d9/kaJv7jmcaZN1YWs3My2vK mkMdzn9hyqQLgA3X/1QXBJhKPCZ+xI6fXA322XPPzqIPqeU8vv55/63gywnz8n1SKih7 UX62JY72R+QrCi0e8osE7eBwtUc1p5WRi84mT5NtyofGYBtOmFthJkJj8mET+sNiwH6S Vpow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710494721; x=1711099521; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender :ui-outboundreport:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:x-beenthere:x-gm-message-state:sender:from :to:cc:subject:date:message-id:reply-to; bh=1UH24BANh4ul9+WWFrwoy+ZJC9Is2vUbGflKMylUCbw=; b=n7PIOEuxD7605ldt7Z5c6lu+9dUAJBX+xKk6OTEgFwiL5TdYYTkKWbAFVuEPUI2zbE vhjkHx7Tu+9NADVHTKMl9Eej1qDDidjf6It8B4NOjU04WQUpxloDDPw7BolReRwEKAc2 FXK1jFvLsqe9UokN0GQSygYuKTlJLsBpU7jHZ+LwqyLrtjVt/e6CuAfCM7m6MZsZdu5t T5jqkh/HaUe+V78t9JsMJNRitT/LDygMXIPh3iEL1gDVHXDFiFyocJEsFi+ZNR99/tV+ SZqiD/K02zMgIvH53/488dw5rdfyRzjXNwbIwO+0ZTAP/vw+B0/Yy2aY/Z7jCtuVKLjO xwuQ== Sender: swupdate@googlegroups.com X-Forwarded-Encrypted: i=2; AJvYcCXlTXfhkDbVGNFezvoOzCRmp82Y43eCtwBzNFS9LD+nhuITm7nTx9DRPvUgN1fq4Ug+V2gs18I7ZyplysZ8adScp2sVHjXPkF1wW1vMAA== X-Gm-Message-State: AOJu0YzaF/s2XJsJOrFwMssm85qnf26TAkiN/8fy9DCSd7RCKClEZqU9 LoHvssrPSS0gZet6/sWa+IulUk/5kw5jko+tIAjM3qt3CmV97sRT X-Google-Smtp-Source: AGHT+IGiIeNgVewr1fk+Z6+uL2G6TUwePrBLlzWyGv+11xd4Oc4+0OdubHeugAgXhcEhufLOb3QGIw== X-Received: by 2002:a2e:8505:0:b0:2d3:e954:221d with SMTP id j5-20020a2e8505000000b002d3e954221dmr2696710lji.34.1710494719675; Fri, 15 Mar 2024 02:25:19 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a2e:9c05:0:b0:2d4:6c0a:be17 with SMTP id s5-20020a2e9c05000000b002d46c0abe17ls12139lji.0.-pod-prod-02-eu; Fri, 15 Mar 2024 02:25:17 -0700 (PDT) X-Received: by 2002:a2e:90ce:0:b0:2d4:67e3:aa47 with SMTP id o14-20020a2e90ce000000b002d467e3aa47mr2797936ljg.48.1710494717261; Fri, 15 Mar 2024 02:25:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1710494717; cv=none; d=google.com; s=arc-20160816; b=dYzlTGleOJ2Tq5YY/MQHQidFQR73TQ9esIAimHOCeUjyclPvszgrehbxTOpPR7Cg5E dq8P1sTaOosW6sdxptWoznVUJ4E9WZTegShLbDrG4Dbd0dtxzrhaJGGCxdJKHpxcR4cH UGbZ1UWHsjaD3SfZ7O+L05V5fZCqSxRkeS5Ob+weWw+T+7wYj1TEu4wmzaqudldOImIJ RH7uBnFASJF9nriZo7cJUS1R8hZi9L1VT1FhYCJBomTWXME9Dfhmqy3ABBQTPm7+LLNt MSj7hMoBpfGLna9DLRuE1EkmOVAP5tPRRoVieFi/BNVslNkq23yoAIhwN2DsIXzbZsU5 PYvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=ui-outboundreport:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=r7YsHlvqEA2DiwMQ6WtBt7tC2wF/jAfxjOcaEy2vDbk=; fh=TiEWcqMcKpHk5s7uErzpntoONrNfOXwKpI5P8bIlggk=; b=KPPqeGViwTKRPmfpQkvKODvZL4JcwRhyU1JcAku3Ymm90pNQXXUfunYKFLDIm72qTj ZoVhPkLy7MUs84kZd937bpZ1q2ziLM05nR3++e0MwKbQIE7vHrVjvmHyUDKjsX19pQ26 BiSHpTnRMavAotktrhqfQXgvZ0NyH6gGJKZkkt+HIYEemOxbXzm4YrOhEd84TkyMrujK 1xYZl2eRFvch2s6pM+DeHX3XPQfyvRMr23Fs/APJ6ZhTTdQhkOxpcNRvfzdI1cjKSzjp cA9jyh9olCR1PDnU/URkIAu8MqKvJesOvI/4rBOkFqigg6bkSr05+Cz3SodnKGnHcWhu 0khw==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b="rJx4U/DC"; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.10 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org Received: from mout.kundenserver.de (mout.kundenserver.de. [212.227.17.10]) by gmr-mx.google.com with ESMTPS id q9-20020a2e9149000000b002d449d21a98si174306ljg.1.2024.03.15.02.25.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Mar 2024 02:25:17 -0700 (PDT) Received-SPF: pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.10 as permitted sender) client-ip=212.227.17.10; X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from paperino.fritz.box ([88.217.136.221]) by mrelayeu.kundenserver.de (mreue106 [213.165.67.113]) with ESMTPSA (Nemesis) id 1MHWzP-1rY9V71qxV-00Dbpq; Fri, 15 Mar 2024 10:25:16 +0100 From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic Subject: [swupdate] [PATCH 2/2] Introduce Handlers installable as plugin at runtime Date: Fri, 15 Mar 2024 10:25:14 +0100 Message-Id: <20240315092514.485906-2-stefano.babic@swupdate.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240315092514.485906-1-stefano.babic@swupdate.org> References: <20240315092514.485906-1-stefano.babic@swupdate.org> MIME-Version: 1.0 X-Provags-ID: V03:K1:bewaUZC8Ma9ozA6E2Qsdy+kNgLxAn5wX4MzNf54RsyLzTanuFu2 Y7e6jUqSwuNCwz1bPdsIYbJlDn1105RMyXDzW284NKB6FlZwINvG8RdkKjIsp8bC2ZPHhEv 4qBXYHBltwMCD3UtX8x6jK6Zd02Os6X46ZsqGCOgUX/1Rlsv+8Y2QfrjUOlzGwIQOUNG+0l lHqdZvGUri+tGgQhIs8oA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:4BGV/LrVAwQ=;TKilhVpY/j1JrlmIgMfM9ePThyM yATAAOUOP0gedIP8EXmaCScO+FFib4gheFptM36PVYQA1GHnU/XQ3Y7R+i+BjeeDRxBbJGNuI cfLUXTgn9ov9zLuGqDBE69cmmfNfxevol4Fk6PARFmE+d7la1vWzIraX+cgxe/DCif3WFrYC1 o5jLbGzo884pNr0dZGtDdTYXyw3fEHxv5n1nsI+CNrbLCd8Yv8qK7CnWs7YVmeaUwHJQnQHIf kummi6DxOVcI2IKbsB1XeJAMQMV3iOSVQNoy0UmLAv3I3E3f4e0E2YGrrV4eTRUgDpT7UGWm2 e1f0M3BsWvqwZUOOjHN6B8eIopLi37MOSxSZDz/59xm5agr2pcvEWF/X5O5ZoPgrxWmGOwgG2 Xlt8y+Rnuhzjnz+BBWqZFJHTLnwp6lZeDJ3hWOFqCO3o+d+Vs1181LqdhicWr60f/yY068bY4 EEju6rIpzw1frjEwggUL/f0Nny0OxnJi67muuRlATDLXBVVvVXgKHNx5nOgKimdn9LEyllBCk PrTXVEbisymPTVNu4hLC6GT3QsTYf88FovUzYdbQNwnhkUlvWFboOps3aOQfvqystF+sSGR6i NIVWPUQCQ95b89j9Guw+24WcRxKmqwyNMzRWT4x26DznHDB2m+vd88j8HjGHX4+Y9G4KVVVeb NrgKxpOSIDlTf3T+vFAYgGz9vpiIXoVGeqrwCABujRaXjsC+dIDkwUa9TGJF9sdFSBfjnol2u ocw8mLLPFmnI1TDWQMBM9Z2MAjzpizfZv3dx+xcjSKT5ikG2PRIWmQ= X-Original-Sender: stefano.babic@swupdate.org X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b="rJx4U/DC"; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.17.10 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org 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: , The project supports Lua as script language for pre- and postinstall script. This allows to install per update session Lua handlers at run-time allowing to expand SWUpdate to the cases not covered in the design phase of a product. Signed-off-by: Stefano Babic --- core/installer.c | 1 + core/swupdate.c | 2 +- corelib/lua_interface.c | 99 ++++++++++++++++++++++++++++------------- include/lua_util.h | 4 +- 4 files changed, 71 insertions(+), 35 deletions(-) -- 2.34.1 diff --git a/core/installer.c b/core/installer.c index f2fbbcab..48c7fe5e 100644 --- a/core/installer.c +++ b/core/installer.c @@ -483,6 +483,7 @@ void cleanup_files(struct swupdate_cfg *software) { * Drop Lua State if instantiated */ if (software->lua_state) { + unregister_session_handlers(); lua_exit(software->lua_state); software->lua_state = NULL; } diff --git a/core/swupdate.c b/core/swupdate.c index 140dec5e..a421e888 100644 --- a/core/swupdate.c +++ b/core/swupdate.c @@ -854,7 +854,7 @@ int main(int argc, char **argv) } } - lua_handlers_init(); + lua_handlers_init(NULL); if(!get_hw_revision(&swcfg.hw)) INFO("Running on %s Revision %s", swcfg.hw.boardname, swcfg.hw.revision); diff --git a/corelib/lua_interface.c b/corelib/lua_interface.c index 90aba6eb..03b74aed 100644 --- a/corelib/lua_interface.c +++ b/corelib/lua_interface.c @@ -1320,56 +1320,65 @@ static int l_handler_wrapper(struct img_type *img, void *data, int res = 0; lua_Number result; int l_func_ref; + lua_State *L; + struct installer_handler *hnd; + hnd = find_handler(img); - if (!gL || !img || !data) { + if (!gL || !img || !data || !hnd) { return -1; } + if (hnd->noglobal) { + L = img->L; + } else { + L = gL; + } + if (img->bootloader) { - lua_getglobal(gL, "swupdate"); - if (!lua_istable(gL, -1)) { + lua_getglobal(L, "swupdate"); + if (!lua_istable(L, -1)) { ERROR("Lua stack corrupted."); return -1; } - struct dict **udbootenv = lua_newuserdata(gL, sizeof(struct dict*)); + struct dict **udbootenv = lua_newuserdata(L, sizeof(struct dict*)); *udbootenv = img->bootloader; - luaL_setfuncs(gL, l_swupdate_bootenv, 1); - lua_pop(gL, 1); + luaL_setfuncs(L, l_swupdate_bootenv, 1); + lua_pop(L, 1); } l_func_ref = *((int*)data); /* get the callback function */ - lua_rawgeti(gL, LUA_REGISTRYINDEX, l_func_ref ); - image2table(gL, img); + lua_rawgeti(L, LUA_REGISTRYINDEX, l_func_ref ); + image2table(L, img); switch (scriptfn) { case PREINSTALL: - lua_pushstring(gL, "preinst"); + lua_pushstring(L, "preinst"); break; case POSTINSTALL: - lua_pushstring(gL, "postinst"); + lua_pushstring(L, "postinst"); break; default: - lua_pushnil(gL); + lua_pushnil(L); break; } - if (LUA_OK != (res = lua_pcall(gL, 2, 1, 0))) { + if (LUA_OK != (res = lua_pcall(L, 2, 1, 0))) { ERROR("Error %d while executing the Lua callback: %s", - res, lua_tostring(gL, -1)); - lua_pop(gL, 1); + res, lua_tostring(L, -1)); + lua_pop(L, 1); return -1; } /* retrieve result */ - if (!lua_isnumber(gL, -1)) { + if (!lua_isnumber(L, -1)) { ERROR("Lua Handler must return a number"); - lua_pop(gL, 1); + lua_pop(L, 1); return -1; } - result = lua_tonumber(gL, -1); - lua_pop(gL, 1); + result = lua_tonumber(L, -1); + lua_pop(L, 1); TRACE("[Lua handler] returned: %d",(int)result); return (int) result; @@ -1398,6 +1407,8 @@ static int l_other_handler_wrapper(struct img_type *img, void *data) */ static int l_register_handler( lua_State *L ) { int *l_func_ref = malloc(sizeof(int)); + handler_type_t lifetime = GLOBAL_HANDLER; + if(!l_func_ref) { ERROR("Lua handler: unable to allocate memory"); lua_pop(L, 2); @@ -1423,16 +1434,35 @@ static int l_register_handler( lua_State *L ) { } const char *handler_desc = luaL_checkstring(L, 1); + + /* + * Check if the handler must be registered globally + * or just during the update + */ + if (L != gL) { + lifetime = SESSION_HANDLER; + } /* store the callback function in registry */ *l_func_ref = luaL_ref (L, LUA_REGISTRYINDEX); /* cleanup stack */ lua_pop (L, 1); - register_handler(handler_desc, + switch (lifetime) { + case GLOBAL_HANDLER: + register_handler(handler_desc, + (mask & SCRIPT_HANDLER) ? + l_script_handler_wrapper : + l_other_handler_wrapper, + mask, l_func_ref); + break; + case SESSION_HANDLER: + register_session_handler(handler_desc, (mask & SCRIPT_HANDLER) ? l_script_handler_wrapper : l_other_handler_wrapper, mask, l_func_ref); + break; + } return 0; } } @@ -1486,7 +1516,7 @@ call_handler_exit: return 2; } -int lua_handlers_init(void) +int lua_handlers_init(lua_State *L) { static const char location[] = #if defined(CONFIG_EMBEDDED_LUA_HANDLER) @@ -1496,26 +1526,29 @@ int lua_handlers_init(void) #endif int ret = -1; - gL = luaL_newstate(); - if (gL) { + if (!L) { + gL = luaL_newstate(); + L = gL; + } + if (L) { /* prime gL as LUA_TYPE_HANDLER */ - lua_pushlightuserdata(gL, (void*)LUA_TYPE_HANDLER); - lua_setglobal(gL, "SWUPDATE_LUA_TYPE"); + lua_pushlightuserdata(L, (void*)LUA_TYPE_HANDLER); + lua_setglobal(L, "SWUPDATE_LUA_TYPE"); /* load standard libraries */ - luaL_openlibs(gL); - luaL_requiref( gL, "swupdate", luaopen_swupdate, 1 ); - lua_pop(gL, 1); /* remove unused copy left on stack */ + luaL_openlibs(L); + luaL_requiref(L, "swupdate", luaopen_swupdate, 1 ); + lua_pop(L, 1); /* remove unused copy left on stack */ /* try to load Lua handlers for the swupdate system */ #if defined(CONFIG_EMBEDDED_LUA_HANDLER) - ret = (luaL_loadbuffer(gL, EMBEDDED_LUA_SRC_START, EMBEDDED_LUA_SRC_END-EMBEDDED_LUA_SRC_START, "LuaHandler") || - lua_pcall(gL, 0, LUA_MULTRET, 0)); + ret = (luaL_loadbuffer(L, EMBEDDED_LUA_SRC_START, EMBEDDED_LUA_SRC_END-EMBEDDED_LUA_SRC_START, "LuaHandler") || + lua_pcall(L, 0, LUA_MULTRET, 0)); #else - ret = luaL_dostring(gL, "require (\"swupdate_handlers\")"); + ret = luaL_dostring(L, "require (\"swupdate_handlers\")"); #endif if (ret != 0) { INFO("%s Lua handler(s) not found.", location); - lua_report_exception(gL); - lua_pop(gL, 1); + lua_report_exception(L); + lua_pop(L, 1); } else { INFO("%s Lua handler(s) found and loaded.", location); } @@ -1542,6 +1575,8 @@ lua_State *lua_init(struct dict *bootenv) luaL_setfuncs(L, l_swupdate_bootenv, 1); lua_pop(L, 1); /* remove unused copy left on stack */ + lua_handlers_init(L); + return L; } diff --git a/include/lua_util.h b/include/lua_util.h index 11d4c61f..2c43c751 100644 --- a/include/lua_util.h +++ b/include/lua_util.h @@ -25,7 +25,7 @@ lua_State *lua_init(struct dict *bootenv); int lua_load_buffer(lua_State *L, const char *buf); int lua_parser_fn(lua_State *L, const char *fcn, struct img_type *img); int lua_handler_fn(lua_State *L, const char *fcn, const char *parms); -int lua_handlers_init(void); +int lua_handlers_init(lua_State *L); int lua_notify_trace(lua_State *L); int lua_notify_error(lua_State *L); @@ -109,5 +109,5 @@ static inline int lua_parser_fn(lua_State __attribute__ ((__unused__)) *L, static inline int lua_handler_fn(lua_State __attribute__ ((__unused__)) *L, const char __attribute__ ((__unused__)) *fcn, const char __attribute__ ((__unused__)) *parms) { return -1; } -static inline int lua_handlers_init(void) { return 0; } +static inline int lua_handlers_init(lua_State *L) { return 0; } #endif