• Home
  • Raw
  • Download

Lines Matching +full:- +full:- +full:file

2  * libkmod - interface to kernel module operations
4 * Copyright (C) 2011-2013 ProFUSION embedded systems
42 #include "libkmod-internal.h"
46 int (*load)(struct kmod_file *file);
47 void (*unload)(struct kmod_file *file);
70 static int zstd_read_block(struct kmod_file *file, size_t block_size, in zstd_read_block() argument
77 free((void *)input->src); in zstd_read_block()
78 input->src = malloc(block_size); in zstd_read_block()
79 if (input->src == NULL) { in zstd_read_block()
80 ret = -errno; in zstd_read_block()
81 ERR(file->ctx, "zstd: %m\n"); in zstd_read_block()
87 rdret = read(file->fd, (void *)input->src, block_size); in zstd_read_block()
89 ret = -errno; in zstd_read_block()
90 ERR(file->ctx, "zstd: %m\n"); in zstd_read_block()
94 input->pos = 0; in zstd_read_block()
95 input->size = rdret; in zstd_read_block()
101 uint8_t *old_buffer = buffer->dst; in zstd_ensure_outbuffer_space()
104 if (buffer->size - buffer->pos >= min_free) in zstd_ensure_outbuffer_space()
107 buffer->size += min_free; in zstd_ensure_outbuffer_space()
108 buffer->dst = realloc(buffer->dst, buffer->size); in zstd_ensure_outbuffer_space()
109 if (buffer->dst == NULL) { in zstd_ensure_outbuffer_space()
110 ret = -errno; in zstd_ensure_outbuffer_space()
117 static int zstd_decompress_block(struct kmod_file *file, ZSTD_DStream *dstr, in zstd_decompress_block() argument
129 ERR(file->ctx, "zstd: %s\n", strerror(-ret)); in zstd_decompress_block()
135 ret = -EINVAL; in zstd_decompress_block()
136 ERR(file->ctx, "zstd: %s\n", ZSTD_getErrorName(dsret)); in zstd_decompress_block()
141 } while (input->pos < input->size in zstd_decompress_block()
142 || output->pos > output->size in zstd_decompress_block()
143 || output->size - output->pos < out_buf_min_size); in zstd_decompress_block()
148 static int load_zstd(struct kmod_file *file) in load_zstd() argument
159 ret = -EINVAL; in load_zstd()
160 ERR(file->ctx, "zstd: Failed to create decompression stream\n"); in load_zstd()
167 ret = zstd_read_block(file, next_block_size, &zst_inb, in load_zstd()
174 ret = zstd_decompress_block(file, dstr, &zst_inb, &zst_outb, in load_zstd()
182 file->zstd_used = true; in load_zstd()
183 file->memory = zst_outb.dst; in load_zstd()
184 file->size = zst_outb.pos; in load_zstd()
194 static void unload_zstd(struct kmod_file *file) in unload_zstd() argument
196 if (!file->zstd_used) in unload_zstd()
198 free(file->memory); in unload_zstd()
205 static void xz_uncompress_belch(struct kmod_file *file, lzma_ret ret) in xz_uncompress_belch() argument
209 ERR(file->ctx, "xz: %s\n", strerror(ENOMEM)); in xz_uncompress_belch()
212 ERR(file->ctx, "xz: File format not recognized\n"); in xz_uncompress_belch()
215 ERR(file->ctx, "xz: Unsupported compression options\n"); in xz_uncompress_belch()
218 ERR(file->ctx, "xz: File is corrupt\n"); in xz_uncompress_belch()
221 ERR(file->ctx, "xz: Unexpected end of input\n"); in xz_uncompress_belch()
224 ERR(file->ctx, "xz: Internal error (bug)\n"); in xz_uncompress_belch()
229 static int xz_uncompress(lzma_stream *strm, struct kmod_file *file) in xz_uncompress() argument
237 strm->avail_in = 0; in xz_uncompress()
238 strm->next_out = out_buf; in xz_uncompress()
239 strm->avail_out = sizeof(out_buf); in xz_uncompress()
242 if (strm->avail_in == 0) { in xz_uncompress()
243 ssize_t rdret = read(file->fd, in_buf, sizeof(in_buf)); in xz_uncompress()
245 ret = -errno; in xz_uncompress()
248 strm->next_in = in_buf; in xz_uncompress()
249 strm->avail_in = rdret; in xz_uncompress()
254 if (strm->avail_out == 0 || ret != LZMA_OK) { in xz_uncompress()
255 size_t write_size = BUFSIZ - strm->avail_out; in xz_uncompress()
258 ret = -errno; in xz_uncompress()
264 strm->next_out = out_buf; in xz_uncompress()
265 strm->avail_out = BUFSIZ; in xz_uncompress()
270 xz_uncompress_belch(file, ret); in xz_uncompress()
271 ret = -EINVAL; in xz_uncompress()
275 file->xz_used = true; in xz_uncompress()
276 file->memory = p; in xz_uncompress()
277 file->size = total; in xz_uncompress()
284 static int load_xz(struct kmod_file *file) in load_xz() argument
292 ERR(file->ctx, "xz: %s\n", strerror(ENOMEM)); in load_xz()
293 return -ENOMEM; in load_xz()
295 ERR(file->ctx, "xz: Internal error (bug)\n"); in load_xz()
296 return -EINVAL; in load_xz()
298 ret = xz_uncompress(&strm, file); in load_xz()
303 static void unload_xz(struct kmod_file *file) in unload_xz() argument
305 if (!file->xz_used) in unload_xz()
307 free(file->memory); in unload_xz()
315 static int load_zlib(struct kmod_file *file) in load_zlib() argument
322 file->gzf = gzdopen(file->fd, "rb"); in load_zlib()
323 if (file->gzf == NULL) in load_zlib()
324 return -errno; in load_zlib()
325 file->fd = -1; /* now owned by gzf due gzdopen() */ in load_zlib()
333 err = -errno; in load_zlib()
340 r = gzread(file->gzf, p + did, total - did); in load_zlib()
345 const char *gz_errmsg = gzerror(file->gzf, &gzerr); in load_zlib()
347 ERR(file->ctx, "gzip: %s\n", gz_errmsg); in load_zlib()
350 err = gzerr == Z_ERRNO ? -errno : -EINVAL; in load_zlib()
356 file->memory = p; in load_zlib()
357 file->size = did; in load_zlib()
362 gzclose(file->gzf); in load_zlib()
366 static void unload_zlib(struct kmod_file *file) in unload_zlib() argument
368 if (file->gzf == NULL) in unload_zlib()
370 free(file->memory); in unload_zlib()
371 gzclose(file->gzf); /* closes file->fd */ in unload_zlib()
394 static int load_reg(struct kmod_file *file) in load_reg() argument
398 if (fstat(file->fd, &st) < 0) in load_reg()
399 return -errno; in load_reg()
401 file->size = st.st_size; in load_reg()
402 file->memory = mmap(NULL, file->size, PROT_READ, MAP_PRIVATE, in load_reg()
403 file->fd, 0); in load_reg()
404 if (file->memory == MAP_FAILED) in load_reg()
405 return -errno; in load_reg()
406 file->direct = true; in load_reg()
410 static void unload_reg(struct kmod_file *file) in unload_reg() argument
412 munmap(file->memory, file->size); in unload_reg()
419 struct kmod_elf *kmod_file_get_elf(struct kmod_file *file) in kmod_file_get_elf() argument
421 if (file->elf) in kmod_file_get_elf()
422 return file->elf; in kmod_file_get_elf()
424 file->elf = kmod_elf_new(file->memory, file->size); in kmod_file_get_elf()
425 return file->elf; in kmod_file_get_elf()
431 struct kmod_file *file = calloc(1, sizeof(struct kmod_file)); in kmod_file_open() local
436 if (file == NULL) in kmod_file_open()
439 file->fd = open(filename, O_RDONLY|O_CLOEXEC); in kmod_file_open()
440 if (file->fd < 0) { in kmod_file_open()
441 err = -errno; in kmod_file_open()
445 for (itr = comp_types; itr->ops.load != NULL; itr++) { in kmod_file_open()
446 if (magic_size_max < itr->magic_size) in kmod_file_open()
447 magic_size_max = itr->magic_size; in kmod_file_open()
450 file->direct = false; in kmod_file_open()
456 err = -errno; in kmod_file_open()
459 sz = read_str_safe(file->fd, buf, magic_size_max + 1); in kmod_file_open()
460 lseek(file->fd, 0, SEEK_SET); in kmod_file_open()
465 err = -EINVAL; in kmod_file_open()
469 for (itr = comp_types; itr->ops.load != NULL; itr++) { in kmod_file_open()
470 if (memcmp(buf, itr->magic_bytes, itr->magic_size) == 0) in kmod_file_open()
473 if (itr->ops.load != NULL) in kmod_file_open()
474 file->ops = &itr->ops; in kmod_file_open()
477 if (file->ops == NULL) in kmod_file_open()
478 file->ops = &reg_ops; in kmod_file_open()
480 err = file->ops->load(file); in kmod_file_open()
481 file->ctx = ctx; in kmod_file_open()
484 if (file->fd >= 0) in kmod_file_open()
485 close(file->fd); in kmod_file_open()
486 free(file); in kmod_file_open()
487 errno = -err; in kmod_file_open()
491 return file; in kmod_file_open()
494 void *kmod_file_get_contents(const struct kmod_file *file) in kmod_file_get_contents() argument
496 return file->memory; in kmod_file_get_contents()
499 off_t kmod_file_get_size(const struct kmod_file *file) in kmod_file_get_size() argument
501 return file->size; in kmod_file_get_size()
504 bool kmod_file_get_direct(const struct kmod_file *file) in kmod_file_get_direct() argument
506 return file->direct; in kmod_file_get_direct()
509 int kmod_file_get_fd(const struct kmod_file *file) in kmod_file_get_fd() argument
511 return file->fd; in kmod_file_get_fd()
514 void kmod_file_unref(struct kmod_file *file) in kmod_file_unref() argument
516 if (file->elf) in kmod_file_unref()
517 kmod_elf_unref(file->elf); in kmod_file_unref()
519 file->ops->unload(file); in kmod_file_unref()
520 if (file->fd >= 0) in kmod_file_unref()
521 close(file->fd); in kmod_file_unref()
522 free(file); in kmod_file_unref()