From patchwork Mon Jul 9 21:21:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geoff Levand X-Patchwork-Id: 941687 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.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41PdbW17jwz9rxs for ; Tue, 10 Jul 2018 07:23:03 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=infradead.org header.i=@infradead.org header.b="dX9DU5oj"; 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 41PdbV6bQgzDr10 for ; Tue, 10 Jul 2018 07:23:02 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=infradead.org header.i=@infradead.org header.b="dX9DU5oj"; dkim-atps=neutral X-Original-To: Petitboot@lists.ozlabs.org Delivered-To: Petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=none (mailfrom) smtp.mailfrom=infradead.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=geoff@infradead.org; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=infradead.org Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 41PdZJ3T1lzDrTn for ; Tue, 10 Jul 2018 07:21:59 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=Date:Cc:To:Subject:From:References: In-Reply-To:Message-Id:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=mkgXTIbD18/QDaf/BPAAgILr946FP1s9GaOiu4soAMw=; b=dX9DU5ojxAmjgRqAOKHrOHseA 6a7NBydQcH7OvX1UCG/JDaDV112pNCBkCmOidQdf6tBKm4oGAebl6xiPpH7raNxLAmgVNT8injm31 vEynsVA1KmL+TfxnlB+eGwmbnsT5tSsNdiujuYGVq0cKpChaA1Yj2KrKzZN0tBhFh6osy0yIM/qwz xgbxcBBGgTo2ivKYhuHODUDYwu69chrFh7pDBXE8stpqzK/tNZQ45W58OzhbNTmCPwbiG7pnOwmd5 kgJ9tHB4Wh+jRQle/hVfrvRXEUqtzB+/iJ4YYDr+yhUljjU+Mo8FlewWD4LpSPt4bcDpJmG/Tl71+ oJbYlJY0Q==; Received: from geoff by merlin.infradead.org with local (Exim 4.90_1 #2 (Red Hat Linux)) id 1fcdbY-0001SM-5K; Mon, 09 Jul 2018 21:21:56 +0000 Message-Id: <3ea3c12d2e1fb0016e384084cc6b8349c42fdf69.1531170563.git.geoff@infradead.org> In-Reply-To: References: From: Geoff Levand Patch-Date: Mon, 9 Jul 2018 13:57:53 -0700 Subject: [PATCH v1 09/10] discover/parser: Add new parser_is_unique To: Samuel Mendoza-Jonas Date: Mon, 09 Jul 2018 21:21:56 +0000 X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Petitboot@lists.ozlabs.org MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Add a new routine parser_is_unique that tests a file's inode against a list of known file inodes. Useful when searching case-insensitive filesystems. Signed-off-by: Geoff Levand --- discover/parser.c | 30 ++++++++++++++++++++++++++++++ discover/parser.h | 14 ++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/discover/parser.c b/discover/parser.c index db23e0d..849185c 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -71,6 +71,36 @@ out: return rc; } +bool parser_is_unique(struct discover_device *dev, const char *filename, + struct list *found_list) +{ + struct stat stat; + struct parser_found_file *found_file; + const struct parser_found_file *entry; + + if (parser_stat_path(dev, filename, &stat)) { + pb_debug("%s: Not found: '%s'\n", __func__, filename); + return false; + } + + list_for_each_entry(found_list, entry, list) { + if (entry->ino == stat.st_ino) { + pb_log("%s: Duplicate: '%s' = '%s'\n", + __func__, filename, entry->filename); + return false; + } + } + + pb_debug("%s: Found: '%s'\n", __func__, filename); + + found_file = talloc_zero(found_list, struct parser_found_file); + found_file->filename = talloc_strdup(found_file, filename); + found_file->ino = stat.st_ino; + list_add(found_list, &found_file->list); + + return true; +} + int parser_replace_file(struct discover_context *ctx, struct discover_device *dev, const char *filename, char *buf, int len) diff --git a/discover/parser.h b/discover/parser.h index f14259c..4fb5d45 100644 --- a/discover/parser.h +++ b/discover/parser.h @@ -45,6 +45,12 @@ enum generic_icon_type { ICON_TYPE_UNKNOWN }; +struct parser_found_file { + const char *filename; + unsigned ino; + struct list_item list; +}; + #define streq(a,b) (!strcasecmp((a),(b))) void parser_init(void); @@ -84,4 +90,12 @@ int parser_scandir(struct discover_context *ctx, const char *dirname, struct dirent ***files, int (*filter)(const struct dirent *), int (*comp)(const struct dirent **, const struct dirent **)); +/* parser_is_unique - Test a file against a list of known files. + * If the file @filename exists and the file is not in @found_list add the + * file to @found_list and return true. Use when searching case-insensitive + * filesystems. + */ +bool parser_is_unique(struct discover_device *dev, const char *filename, + struct list *found_list); + #endif /* _PARSER_H */