summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeoff Levand <geoff@infradead.org>2018-08-02 17:29:34 +0000
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2018-08-07 11:30:36 +1000
commite38a41e8478093acd67d86c5dba4492370004500 (patch)
treeafc953acdae42c5c2f202c130cde8eab1e8107e5
parent70a58a78c951403ae67c44c839caf0e77d0d84db (diff)
downloadtalos-petitboot-e38a41e8478093acd67d86c5dba4492370004500.tar.gz
talos-petitboot-e38a41e8478093acd67d86c5dba4492370004500.zip
discover/parser: Add new parser_is_unique
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> Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
-rw-r--r--discover/parser.c30
-rw-r--r--discover/parser.h14
2 files changed, 44 insertions, 0 deletions
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 */
OpenPOWER on IntegriCloud