From patchwork Wed Nov 20 02:43:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Kerr X-Patchwork-Id: 1197779 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47HngM1WdLz9sPc for ; Wed, 20 Nov 2019 14:07:43 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=ozlabs.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="uVbjEfUD"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 47HngM04g2zDqvT for ; Wed, 20 Nov 2019 14:07:43 +1100 (AEDT) X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Hn9T71ZqzDqfY for ; Wed, 20 Nov 2019 13:45:17 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=ozlabs.org Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="uVbjEfUD"; dkim-atps=neutral Received: by ozlabs.org (Postfix, from userid 1023) id 47Hn9T3qHTz9sPj; Wed, 20 Nov 2019 13:45:17 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ozlabs.org; s=201707; t=1574217917; bh=FMe8VNrF5WsayD51uUyOYmJjStsa1Y7U0hvhfYtvmXM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=uVbjEfUD5DZkJXA904h8LJp58bvcNq02qvEw8x4RnxKcUgM439yiMR+Uj8Js0rC+w K01PJ7tWoBA5ta/dQ/lKN3A+667tJthheyIEYeWqOFWRFgApAXYwQiwvEDBb+K3AHc ecrVBMBkCVymW9rLfVldWgQqds68lrt7DFU+nWWSTaNQP13IGlhGhZCpHrcsU6Q0ir 6cB5lvtRJB2EzX192NH91OveKhk5wkfp1WtLY3bpofXJ0v5uBSbC14nKLBmtglFKrV uqf+23lAOAYHSoZvnOqBlOwSYmuZfBSbdPpipaklRbo3PB6ZO70JBrLP94ydulqfQM cLz9jxDM8xnPA== From: Jeremy Kerr To: petitboot@lists.ozlabs.org Subject: [PATCH 10/14] discover/grub2: expose internal parse function Date: Wed, 20 Nov 2019 10:43:02 +0800 Message-Id: <20191120024306.16526-11-jk@ozlabs.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191120024306.16526-1-jk@ozlabs.org> References: <20191120024306.16526-1-jk@ozlabs.org> MIME-Version: 1.0 X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Upcoming changes will need a method to parse a secondary file (to support the 'source' command), but not execute it as a new script. This change exposes the parsing code, separate from the execution code. Signed-off-by: Jeremy Kerr --- discover/grub2/grub2-parser.y | 17 +++++++++++++++-- discover/grub2/grub2.c | 2 +- discover/grub2/grub2.h | 8 ++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/discover/grub2/grub2-parser.y b/discover/grub2/grub2-parser.y index 527a61c..f99bbfd 100644 --- a/discover/grub2/grub2-parser.y +++ b/discover/grub2/grub2-parser.y @@ -331,14 +331,15 @@ struct grub2_parser *grub2_parser_create(struct discover_context *ctx) return parser; } -void grub2_parser_parse(struct grub2_parser *parser, const char *filename, +/* performs a parse on buf, setting parser->script->statements */ +int grub2_parser_parse(struct grub2_parser *parser, const char *filename, char *buf, int len) { YY_BUFFER_STATE bufstate; int rc; if (!len) - return; + return -1; parser->script->filename = filename; @@ -349,6 +350,18 @@ void grub2_parser_parse(struct grub2_parser *parser, const char *filename, yy_delete_buffer(bufstate, parser->scanner); + parser->inter_word = false; + + return rc; +} + +void grub2_parser_parse_and_execute(struct grub2_parser *parser, + const char *filename, char *buf, int len) +{ + int rc; + + rc = grub2_parser_parse(parser, filename, buf, len); + if (!rc) script_execute(parser->script); } diff --git a/discover/grub2/grub2.c b/discover/grub2/grub2.c index a8d115f..b176ce2 100644 --- a/discover/grub2/grub2.c +++ b/discover/grub2/grub2.c @@ -169,7 +169,7 @@ static int grub2_parse(struct discover_context *dc) continue; parser = grub2_parser_create(dc); - grub2_parser_parse(parser, *filename, buf, len); + grub2_parser_parse_and_execute(parser, *filename, buf, len); device_handler_status_dev_info(dc->handler, dc->device, _("Parsed GRUB configuration from %s"), *filename); diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h index 323b461..668d070 100644 --- a/discover/grub2/grub2.h +++ b/discover/grub2/grub2.h @@ -204,9 +204,13 @@ struct grub2_file *grub2_parse_file(struct grub2_script *script, struct discover_device *grub2_lookup_device(struct device_handler *handler, const char *desc); +/* internal parse api */ +int grub2_parser_parse(struct grub2_parser *parser, const char *filename, + char *buf, int len); + /* external parser api */ struct grub2_parser *grub2_parser_create(struct discover_context *ctx); -void grub2_parser_parse(struct grub2_parser *parser, const char *filename, - char *buf, int len); +void grub2_parser_parse_and_execute(struct grub2_parser *parser, + const char *filename, char *buf, int len); #endif /* GRUB2_H */