X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fparser.c;h=54787201553010d808297eaf8cc8c1730540d0db;hp=fbf31b2806060009a4d136906fc5b03be64917dc;hb=c3dfc9b7b91045172d460651c0309b09b0ab121a;hpb=d9fc4558e66c32834f2a4fdab31010b40f0a88de diff --git a/discover/parser.c b/discover/parser.c index fbf31b2..5478720 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -1,8 +1,6 @@ #include #include -#include -#include #include "types/types.h" #include @@ -49,24 +47,60 @@ int parser_request_file(struct discover_context *ctx, return rc; } -int parser_check_dir(struct discover_context *ctx, - struct discover_device *dev, const char *dirname) +int parser_stat_path(struct discover_context *ctx, + struct discover_device *dev, const char *path, + struct stat *statbuf) { - struct stat statbuf; - char *path; - int rc; + int rc = -1; + char *full_path; + /* we only support local files at present */ if (!dev->mount_path) return -1; - path = local_path(ctx, dev, dirname); + full_path = local_path(ctx, dev, path); - rc = stat(path, &statbuf); - talloc_free(path); - if (!rc) - return -1; + rc = stat(full_path, statbuf); + if (rc) { + rc = -1; + goto out; + } - return S_ISDIR(statbuf.st_mode) ? 0 : -1; + rc = 0; +out: + talloc_free(full_path); + + 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, @@ -124,6 +158,22 @@ out: return -1; } +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 **)) +{ + char *path; + int n; + + path = talloc_asprintf(ctx, "%s%s", ctx->device->mount_path, dirname); + if (!path) + return -1; + + n = scandir(path, files, filter, comp); + talloc_free(path); + return n; +} + void iterate_parsers(struct discover_context *ctx) { struct p_item* i;