From patchwork Tue Sep 30 15:21:39 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alvaro Neira X-Patchwork-Id: 395026 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id A4B511400BE for ; Wed, 1 Oct 2014 01:21:41 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751874AbaI3PVk (ORCPT ); Tue, 30 Sep 2014 11:21:40 -0400 Received: from mail-wg0-f41.google.com ([74.125.82.41]:50465 "EHLO mail-wg0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751719AbaI3PVk (ORCPT ); Tue, 30 Sep 2014 11:21:40 -0400 Received: by mail-wg0-f41.google.com with SMTP id k14so15749038wgh.24 for ; Tue, 30 Sep 2014 08:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RyNRzy34BdiNTzOrk0EBmeRG4vTV36S/Z/IcIjxKw1E=; b=qyElB+UfFXZTSRDnaAw/776DowFtwki5LI6uXi50wupoEvFXtVHr0GsJWyEf0muzGQ RQBWfrqAwN0g/Z0oVhSRKzEkR8QoDUtn6/iG7Uzwurz78ztmB8nyaTIZ0vj16ghIMbgT UwxtBYVjSUeThg/WarX5LzvCLKFFODBcYEjBuRkTatDedVMfc4kqVMzi8W6KkWm4Hium GZ8sSAYv+BEWF5QxwHJ1SK28gDms4Tuz+/dAnbCFQwKpcMxZgAyYN3TdTDaOLdZ9YoeK 03F2LszdGL4Y+U0h1Dx4JPncgN1kQprxMNmtWqco7YiK6fhnaLz3HZNVlApFswh16NSz 9y8g== X-Received: by 10.180.95.230 with SMTP id dn6mr6668235wib.14.1412090498396; Tue, 30 Sep 2014 08:21:38 -0700 (PDT) Received: from localhost.localdomain (152.88.221.87.dynamic.jazztel.es. [87.221.88.152]) by mx.google.com with ESMTPSA id fo6sm15503336wic.3.2014.09.30.08.21.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Sep 2014 08:21:37 -0700 (PDT) From: Alvaro Neira Ayuso To: netfilter-devel@vger.kernel.org Cc: kaber@trash.net Subject: [nft PATCH 3/4 v3] datatype: Enhance symbolic_constant_parse() Date: Tue, 30 Sep 2014 17:21:39 +0200 Message-Id: <1412090500-4564-3-git-send-email-alvaroneay@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1412090500-4564-1-git-send-email-alvaroneay@gmail.com> References: <1412090500-4564-1-git-send-email-alvaroneay@gmail.com> Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org With this patch, this function finds the symbol inside the table. If the symbol doesn't exist we use the basetype to parse it and create the constant expression. Otherwise, return an error message. This a refactorization to reuse this code in a follow up patch. Signed-off-by: Alvaro Neira Ayuso --- [changes in v3] * Forgot to initialize res to NULL before to use basetype to parse it. src/datatype.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/datatype.c b/src/datatype.c index fdfee54..7090b0b 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -112,6 +112,7 @@ struct error_record *symbolic_constant_parse(const struct expr *sym, { const struct symbolic_constant *s; const struct datatype *dtype; + struct error_record *erec; for (s = tbl->symbols; s->identifier != NULL; s++) { if (!strcmp(sym->identifier, s->identifier)) @@ -119,8 +120,16 @@ struct error_record *symbolic_constant_parse(const struct expr *sym, } dtype = sym->dtype; - if (s->identifier == NULL) + if (s->identifier == NULL) { + *res = NULL; + erec = sym->dtype->basetype->parse(sym, res); + if (erec != NULL) + return erec; + if (*res) + return NULL; + return error(&sym->location, "Could not parse %s", dtype->desc); + } *res = constant_expr_alloc(&sym->location, dtype, dtype->byteorder, dtype->size, @@ -660,25 +669,6 @@ static void mark_type_print(const struct expr *expr) static struct error_record *mark_type_parse(const struct expr *sym, struct expr **res) { - struct error_record *erec; - const struct symbolic_constant *s; - - for (s = mark_tbl->symbols; s->identifier != NULL; s++) { - if (!strcmp(sym->identifier, s->identifier)) { - *res = constant_expr_alloc(&sym->location, sym->dtype, - sym->dtype->byteorder, - sym->dtype->size, - &s->value); - return NULL; - } - } - - *res = NULL; - erec = sym->dtype->basetype->parse(sym, res); - if (erec != NULL) - return erec; - if (*res) - return NULL; return symbolic_constant_parse(sym, mark_tbl, res); }