diff mbox series

[v1,09/30] discover/parser: Add new parser_is_unique

Message ID 3c5d51548258a14d28418b5672a042e16210f6a2.1532469861.git.geoff@infradead.org
State Superseded
Headers show
Series [v1,01/30] docker: Add libfdt-dev | expand

Commit Message

Geoff Levand July 24, 2018, 10:15 p.m. UTC
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 <geoff@infradead.org>
---
 discover/parser.c | 30 ++++++++++++++++++++++++++++++
 discover/parser.h | 14 ++++++++++++++
 2 files changed, 44 insertions(+)
diff mbox series

Patch

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 */