X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=test%2Fparser%2Futils.c;h=f0796fd30f9beea75005df2bd93c00430e56d50e;hp=0050d131c6409a9afc80ce53ec16434c95f09cbc;hb=1def8f21aecc41ac22652e7b8bd1f5bf7a4dae98;hpb=9c33c54f7b431074a7d0daddce34140044aaadf6 diff --git a/test/parser/utils.c b/test/parser/utils.c index 0050d13..f0796fd 100644 --- a/test/parser/utils.c +++ b/test/parser/utils.c @@ -17,6 +17,8 @@ #include "resource.h" #include "event.h" #include "platform.h" +#include "paths.h" +#include "parser-conf.h" #include "parser-test.h" @@ -71,7 +73,7 @@ struct discover_device *test_create_device(struct parser_test *test, { struct discover_device *dev; - dev = discover_device_create(test->handler, name); + dev = discover_device_create(test->handler, NULL, name); dev->device->id = talloc_strdup(dev, name); dev->device_path = talloc_asprintf(dev, "/dev/%s", name); @@ -193,6 +195,9 @@ void test_add_dir(struct parser_test *test, struct discover_device *dev, file->type = TEST_DIR; file->dev = dev; file->name = dirname; + /* Pick a non-zero size for directories so that "[ -s ]" sees that the file has non-zero size. */ + file->size = 1; list_add(&test->files, &file->list); } @@ -241,20 +246,34 @@ int parser_request_file(struct discover_context *ctx, return -1; } -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 parser_test *test = ctx->test_data; struct test_file *file; - printf("%s: %s\n", __func__, dirname); - list_for_each_entry(&test->files, file, list) { if (file->dev != dev) continue; - if (strcmp(file->name, dirname)) + if (strcmp(file->name, path)) continue; - return file->type == TEST_DIR ? 0 : -1; + + statbuf->st_size = (off_t)file->size; + switch (file->type) { + case TEST_FILE: + statbuf->st_mode = S_IFREG; + break; + case TEST_DIR: + statbuf->st_mode = S_IFDIR; + break; + default: + fprintf(stderr, "%s: bad test file mode %d!", __func__, + file->type); + exit(EXIT_FAILURE); + } + + return 0; } return -1; @@ -289,6 +308,61 @@ int parser_replace_file(struct discover_context *ctx, return 0; } +struct load_url_result *load_url_async(void *ctx, struct pb_url *url, + load_url_complete async_cb, void *async_data) +{ + struct conf_context *conf = async_data; + struct parser_test *test = conf->dc->test_data; + struct load_url_result *result; + char tmp[] = "/tmp/pb-XXXXXX"; + ssize_t rc = -1, sz = 0; + struct test_file *file; + int fd; + + fd = mkstemp(tmp); + + if (fd < 0) + return NULL; + + /* Some parsers will expect to need to read a file, so write the + * specified file to a temporary file */ + list_for_each_entry(&test->files, file, list) { + if (file->dev) + continue; + + if (strcmp(file->name, url->full)) + continue; + + while (sz < file->size) { + rc = write(fd, file->data, file->size); + if (rc < 0) { + fprintf(stderr, + "Failed to write to tmpfile, %m\n"); + break; + } + sz += rc; + } + break; + } + + close(fd); + + result = talloc_zero(ctx, struct load_url_result); + if (!result) + return NULL; + + result->local = talloc_strdup(result, tmp); + if (rc < 0) + result->status = LOAD_ERROR; + else + result->status = result->local ? LOAD_OK : LOAD_ERROR; + result->cleanup_local = true; + + async_cb(result, conf); + + return result; +} + int parser_request_url(struct discover_context *ctx, struct pb_url *url, char **buf, int *len) {