Blame view
tools/imagetool.c
2.75 KB
d41ce506b Initial Release, ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
/* * (C) Copyright 2013 * * Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com> * * SPDX-License-Identifier: GPL-2.0+ */ #include "imagetool.h" #include <image.h> struct image_type_params *imagetool_get_type(int type) { struct image_type_params **curr; INIT_SECTION(image_type); struct image_type_params **start = __start_image_type; struct image_type_params **end = __stop_image_type; for (curr = start; curr != end; curr++) { if ((*curr)->check_image_type) { if (!(*curr)->check_image_type(type)) return *curr; } } return NULL; } int imagetool_verify_print_header( void *ptr, struct stat *sbuf, struct image_type_params *tparams, struct image_tool_params *params) { int retval = -1; struct image_type_params **curr; INIT_SECTION(image_type); struct image_type_params **start = __start_image_type; struct image_type_params **end = __stop_image_type; for (curr = start; curr != end; curr++) { if ((*curr)->verify_header) { retval = (*curr)->verify_header((unsigned char *)ptr, sbuf->st_size, params); if (retval == 0) { /* * Print the image information if verify is * successful */ if ((*curr)->print_header) { if (!params->quiet) (*curr)->print_header(ptr); } else { fprintf(stderr, "%s: print_header undefined for %s ", params->cmdname, (*curr)->name); } break; } } } return retval; } int imagetool_save_subimage( const char *file_name, ulong file_data, ulong file_len) { int dfd; dfd = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR | S_IWUSR); if (dfd < 0) { fprintf(stderr, "Can't open \"%s\": %s ", file_name, strerror(errno)); return -1; } if (write(dfd, (void *)file_data, file_len) != (ssize_t)file_len) { fprintf(stderr, "Write error on \"%s\": %s ", file_name, strerror(errno)); close(dfd); return -1; } close(dfd); return 0; } int imagetool_get_filesize(struct image_tool_params *params, const char *fname) { struct stat sbuf; int fd; fd = open(fname, O_RDONLY | O_BINARY); if (fd < 0) { fprintf(stderr, "%s: Can't open %s: %s ", params->cmdname, fname, strerror(errno)); return -1; } if (fstat(fd, &sbuf) < 0) { fprintf(stderr, "%s: Can't stat %s: %s ", params->cmdname, fname, strerror(errno)); close(fd); return -1; } close(fd); return sbuf.st_size; } time_t imagetool_get_source_date( struct image_tool_params *params, time_t fallback) { char *source_date_epoch = getenv("SOURCE_DATE_EPOCH"); if (source_date_epoch == NULL) return fallback; time_t time = (time_t) strtol(source_date_epoch, NULL, 10); if (gmtime(&time) == NULL) { fprintf(stderr, "%s: SOURCE_DATE_EPOCH is not valid ", params->cmdname); time = 0; } return time; } |