From e38a41e8478093acd67d86c5dba4492370004500 Mon Sep 17 00:00:00 2001 From: Geoff Levand Date: Thu, 2 Aug 2018 17:29:34 +0000 Subject: [PATCH 1/1] 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 Signed-off-by: Samuel Mendoza-Jonas --- 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 */ -- 2.39.2