1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2013 4 * 5 * Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com> 6 */ 7 8 #include "imagetool.h" 9 10 #include <image.h> 11 12 struct image_type_params *imagetool_get_type(int type) 13 { 14 struct image_type_params **curr; 15 INIT_SECTION(image_type); 16 17 struct image_type_params **start = __start_image_type; 18 struct image_type_params **end = __stop_image_type; 19 20 for (curr = start; curr != end; curr++) { 21 if ((*curr)->check_image_type) { 22 if (!(*curr)->check_image_type(type)) 23 return *curr; 24 } 25 } 26 return NULL; 27 } 28 29 int imagetool_verify_print_header( 30 void *ptr, 31 struct stat *sbuf, 32 struct image_type_params *tparams, 33 struct image_tool_params *params) 34 { 35 int retval = -1; 36 struct image_type_params **curr; 37 INIT_SECTION(image_type); 38 39 struct image_type_params **start = __start_image_type; 40 struct image_type_params **end = __stop_image_type; 41 42 for (curr = start; curr != end; curr++) { 43 if ((*curr)->verify_header) { 44 retval = (*curr)->verify_header((unsigned char *)ptr, 45 sbuf->st_size, params); 46 47 if (retval == 0) { 48 /* 49 * Print the image information if verify is 50 * successful 51 */ 52 if ((*curr)->print_header) { 53 if (!params->quiet) 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 118 time_t imagetool_get_source_date( 119 const char *cmdname, 120 time_t fallback) 121 { 122 char *source_date_epoch = getenv("SOURCE_DATE_EPOCH"); 123 124 if (source_date_epoch == NULL) 125 return fallback; 126 127 time_t time = (time_t) strtol(source_date_epoch, NULL, 10); 128 129 if (gmtime(&time) == NULL) { 130 fprintf(stderr, "%s: SOURCE_DATE_EPOCH is not valid\n", 131 cmdname); 132 time = 0; 133 } 134 135 return time; 136 } 137