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