From patchwork Tue Nov 12 18:59:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phil Sutter X-Patchwork-Id: 1193772 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netfilter-devel-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=nwl.cc Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47CH9S0h2bz9sNx for ; Wed, 13 Nov 2019 05:59:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727183AbfKLS7i (ORCPT ); Tue, 12 Nov 2019 13:59:38 -0500 Received: from orbyte.nwl.cc ([151.80.46.58]:48500 "EHLO orbyte.nwl.cc" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726982AbfKLS7h (ORCPT ); Tue, 12 Nov 2019 13:59:37 -0500 Received: from localhost ([::1]:33358 helo=tatos) by orbyte.nwl.cc with esmtp (Exim 4.91) (envelope-from ) id 1iUbO4-0006Zn-Mr; Tue, 12 Nov 2019 19:59:36 +0100 From: Phil Sutter To: Pablo Neira Ayuso Cc: netfilter-devel@vger.kernel.org Subject: [nft PATCH] meta: Rewrite hour_type_print() Date: Tue, 12 Nov 2019 19:59:31 +0100 Message-Id: <20191112185931.8455-1-phil@nwl.cc> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org There was no point in this recursively called __hour_type_print_r() at all, it takes only four lines of code to split the number of seconds into hours, minutes and seconds. While being at it, inverse the conditional to reduce indenting for the largest part of the function's body. Also introduce SECONDS_PER_DAY macro to avoid magic numbers. Fixes: f8f32deda31df ("meta: Introduce new conditions 'time', 'day' and 'hour'") Signed-off-by: Phil Sutter Acked-by: Pablo Neira Ayuso --- src/meta.c | 49 +++++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/src/meta.c b/src/meta.c index f54b818e4e911..69a897a926869 100644 --- a/src/meta.c +++ b/src/meta.c @@ -490,46 +490,35 @@ static void day_type_print(const struct expr *expr, struct output_ctx *octx) return symbolic_constant_print(&day_type_tbl, expr, true, octx); } -static void __hour_type_print_r(int hours, int minutes, int seconds, char *out, size_t buflen) -{ - if (minutes == 60) - return __hour_type_print_r(++hours, 0, seconds, out, buflen); - else if (minutes > 60) - return __hour_type_print_r((int) (minutes / 60), minutes % 60, seconds, out, buflen); - - if (seconds == 60) - return __hour_type_print_r(hours, ++minutes, 0, out, buflen); - else if (seconds > 60) - return __hour_type_print_r(hours, (int) (seconds / 60), seconds % 60, out, buflen); - - if (seconds == 0) - snprintf(out, buflen, "%02d:%02d", hours, minutes); - else - snprintf(out, buflen, "%02d:%02d:%02d", hours, minutes, seconds); -} +#define SECONDS_PER_DAY (60 * 60 * 24) static void hour_type_print(const struct expr *expr, struct output_ctx *octx) { - uint32_t seconds = mpz_get_uint32(expr->value); + uint32_t seconds = mpz_get_uint32(expr->value), minutes, hours; struct tm *cur_tm; - char out[32]; time_t ts; - if (!nft_output_seconds(octx)) { - /* Obtain current tm, so that we can add tm_gmtoff */ - ts = time(NULL); - cur_tm = localtime(&ts); + if (nft_output_seconds(octx)) { + expr_basetype(expr)->print(expr, octx); + return; + } - if (cur_tm) - seconds = (seconds + cur_tm->tm_gmtoff) % 86400; + /* Obtain current tm, so that we can add tm_gmtoff */ + ts = time(NULL); + cur_tm = localtime(&ts); - __hour_type_print_r(0, 0, seconds, out, sizeof(out)); - nft_print(octx, "\"%s\"", out); + if (cur_tm) + seconds = (seconds + cur_tm->tm_gmtoff) % SECONDS_PER_DAY; - return; - } + minutes = seconds / 60; + seconds %= 60; + hours = minutes / 60; + minutes %= 60; - expr_basetype(expr)->print(expr, octx); + nft_print(octx, "\"%02d:%02d", hours, minutes); + if (seconds) + nft_print(octx, ":%02d", seconds); + nft_print(octx, "\""); } static struct error_record *hour_type_parse(struct parse_ctx *ctx,