From patchwork Tue Jul 24 22:15:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geoff Levand X-Patchwork-Id: 948879 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 41Zt4x6MpTz9s2g for ; Wed, 25 Jul 2018 08:17:05 +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="grvyDRWY"; 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 41Zt4x4hmczDrS7 for ; Wed, 25 Jul 2018 08:17:05 +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="grvyDRWY"; 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 Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=infradead.org header.i=@infradead.org header.b="grvyDRWY"; dkim-atps=neutral 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 41Zt3P700ZzDrTJ for ; Wed, 25 Jul 2018 08:15:45 +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=VGIEnp5XDzPHJgMUAa4dbpujvhsctu83QYSacgpp5Jg=; b=grvyDRWYLhT31dl7bWO/XVRad Jnf3gPrfbA1L1l3PFmX7XwQ0xPVyESaogbeKi2BZi3QI6OZMmzNYkzO2z7fj5p4uv0aIeWcj1a/8K NHwq4siPQ2ieJlDgcbXABFGvAr4DgBT90N0lfqq0+eLclwHVv/Fuy/FYMQVBuYjjggFavIrN7e3Lt hWW2leZOXD+6R9UOQhg49bIVbJ5vWPXZiA7g0dGxh/3oqpT/Ps49JNxEDThPxfH6unj3jgmRwv39Z 9pNw6JUcmjBSknZJuiQsoiMkoJYTmw3ZPAZ3wzsgcSQ7+SDg5FOcZJjtg/g/fycnkYrya+rld9kk2 7tvYyZm1A==; Received: from geoff by merlin.infradead.org with local (Exim 4.90_1 #2 (Red Hat Linux)) id 1fi5am-0004jS-Pm; Tue, 24 Jul 2018 22:15:40 +0000 Message-Id: <3c5d51548258a14d28418b5672a042e16210f6a2.1532469861.git.geoff@infradead.org> In-Reply-To: References: From: Geoff Levand Patch-Date: Tue, 24 Jul 2018 15:03:16 -0700 Subject: [PATCH v1 09/30] discover/parser: Add new parser_is_unique To: Samuel Mendoza-Jonas Date: Tue, 24 Jul 2018 22:15:40 +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: Ge Song , 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 9fe1925..5478720 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -73,6 +73,36 @@ out: return rc; } +bool parser_is_unique(struct discover_context *ctx, 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(ctx, 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 bff52e3..e7d52fe 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); @@ -85,4 +91,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_context *ctx, struct discover_device *dev, const char *filename, + struct list *found_list); + #endif /* _PARSER_H */