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 if (!params->quiet) 55 (*curr)->print_header(ptr); 56 } else { 57 fprintf(stderr, 58 "%s: print_header undefined for %s\n", 59 params->cmdname, (*curr)->name); 60 } 61 break; 62 } 63 } 64 } 65 66 return retval; 67 } 68 69 int imagetool_save_subimage( 70 const char *file_name, 71 ulong file_data, 72 ulong file_len) 73 { 74 int dfd; 75 76 dfd = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 77 S_IRUSR | S_IWUSR); 78 if (dfd < 0) { 79 fprintf(stderr, "Can't open \"%s\": %s\n", 80 file_name, strerror(errno)); 81 return -1; 82 } 83 84 if (write(dfd, (void *)file_data, file_len) != (ssize_t)file_len) { 85 fprintf(stderr, "Write error on \"%s\": %s\n", 86 file_name, strerror(errno)); 87 close(dfd); 88 return -1; 89 } 90 91 close(dfd); 92 93 return 0; 94 } 95 96 int imagetool_get_filesize(struct image_tool_params *params, const char *fname) 97 { 98 struct stat sbuf; 99 int fd; 100 101 fd = open(fname, O_RDONLY | O_BINARY); 102 if (fd < 0) { 103 fprintf(stderr, "%s: Can't open %s: %s\n", 104 params->cmdname, fname, strerror(errno)); 105 return -1; 106 } 107 108 if (fstat(fd, &sbuf) < 0) { 109 fprintf(stderr, "%s: Can't stat %s: %s\n", 110 params->cmdname, fname, strerror(errno)); 111 close(fd); 112 return -1; 113 } 114 close(fd); 115 116 return sbuf.st_size; 117 } 118 119 time_t imagetool_get_source_date( 120 struct image_tool_params *params, 121 time_t fallback) 122 { 123 char *source_date_epoch = getenv("SOURCE_DATE_EPOCH"); 124 125 if (source_date_epoch == NULL) 126 return fallback; 127 128 time_t time = (time_t) strtol(source_date_epoch, NULL, 10); 129 130 if (gmtime(&time) == NULL) { 131 fprintf(stderr, "%s: SOURCE_DATE_EPOCH is not valid\n", 132 params->cmdname); 133 time = 0; 134 } 135 136 return time; 137 } 138