1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2021 Red Hat, Inc.
5 #ifdef RTE_HAS_LIBARCHIVE
13 #include <rte_common.h>
16 #include "eal_firmware.h"
18 #ifdef RTE_HAS_LIBARCHIVE
20 struct firmware_read_ctx {
25 firmware_open(struct firmware_read_ctx *ctx, const char *name, size_t blocksize)
27 struct archive_entry *e;
29 ctx->a = archive_read_new();
32 if (archive_read_support_format_raw(ctx->a) != ARCHIVE_OK ||
33 archive_read_support_filter_xz(ctx->a) != ARCHIVE_OK ||
34 archive_read_open_filename(ctx->a, name, blocksize) != ARCHIVE_OK ||
35 archive_read_next_header(ctx->a, &e) != ARCHIVE_OK) {
36 archive_read_free(ctx->a);
44 firmware_read_block(struct firmware_read_ctx *ctx, void *buf, size_t count)
46 return archive_read_data(ctx->a, buf, count);
50 firmware_close(struct firmware_read_ctx *ctx)
52 archive_read_free(ctx->a);
56 #else /* !RTE_HAS_LIBARCHIVE */
58 struct firmware_read_ctx {
63 firmware_open(struct firmware_read_ctx *ctx, const char *name,
64 __rte_unused size_t blocksize)
66 ctx->fd = open(name, O_RDONLY);
73 firmware_read_block(struct firmware_read_ctx *ctx, void *buf, size_t count)
75 return read(ctx->fd, buf, count);
79 firmware_close(struct firmware_read_ctx *ctx)
85 #endif /* !RTE_HAS_LIBARCHIVE */
88 firmware_read(const char *name, void **buf, size_t *bufsz)
90 const size_t blocksize = 4096;
91 struct firmware_read_ctx ctx;
98 if (firmware_open(&ctx, name, blocksize) < 0)
104 tmp = realloc(*buf, *bufsz + blocksize);
113 err = firmware_read_block(&ctx, RTE_PTR_ADD(*buf, *bufsz), blocksize);
126 firmware_close(&ctx);
131 rte_firmware_read(const char *name, void **buf, size_t *bufsz)
136 ret = firmware_read(name, buf, bufsz);
138 snprintf(path, sizeof(path), "%s.xz", name);
139 path[PATH_MAX - 1] = '\0';
140 #ifndef RTE_HAS_LIBARCHIVE
141 if (access(path, F_OK) == 0) {
142 RTE_LOG(WARNING, EAL, "libarchive not linked, %s cannot be decompressed\n",
146 ret = firmware_read(path, buf, bufsz);