diff options
-rw-r--r-- | src/image.c | 66 | ||||
-rw-r--r-- | src/image.h | 4 |
2 files changed, 68 insertions, 2 deletions
diff --git a/src/image.c b/src/image.c index 42ba53d..75943fd 100644 --- a/src/image.c +++ b/src/image.c @@ -212,6 +212,7 @@ struct image * image_alloc_from_file(const char * file, const char * type, const image->size = lseek(image->fd, 0, SEEK_END); image->offset = 0; image->cur = 0; + image->orig_filename = strdup(file); image_append(image, type, device, hwrevs, version, layout); @@ -262,6 +263,7 @@ void image_free(struct image * image) { free(image->hwrevs); free(image->version); free(image->layout); + free(image->orig_filename); free(image); @@ -360,14 +362,25 @@ void image_list_del(struct image_list * list) { if ( ! list ) return; + image_list_unlink(list); + image_free(list->image); + free(list); + +} + +void image_list_unlink(struct image_list * list) { + + if ( ! list ) + return; + if ( list->prev ) list->prev->next = list->next; if ( list->next ) list->next->prev = list->prev; - image_free(list->image); - free(list); + list->prev = NULL; + list->next = NULL; } @@ -474,3 +487,52 @@ const char * image_type_to_string(enum image_type type) { return image_types[type]; } + +int image_hwrev_is_valid(struct image * image, const char * hwrev) { + + const char * ptr = image->hwrevs; + const char * oldptr = ptr; + + if ( ! hwrev || ! ptr ) + return 1; + + while ( (ptr = strchr(ptr, ',')) ) { + if ( strncmp(hwrev, oldptr, ptr-oldptr) == 0 ) + return 1; + ++ptr; + oldptr = ptr; + } + + if ( strcmp(hwrev, oldptr) == 0 ) + return 1; + else + return 0; + +} + +void image_print_info(struct image * image) { + + const char * str; + + if ( image->orig_filename ) + printf("File: %s\n", image->orig_filename); + + str = image_type_to_string(image->type); + printf(" Image type: %s\n", str ? str : "unknown"); + printf(" Image size: %d bytes\n", image->size); + + if ( image->version ) + printf(" Image version: %s\n", image->version); + + if ( image->device == DEVICE_UNKNOWN ) + str = "unknown device"; + else + str = device_to_string(image->device); + + if ( str ) + printf(" Valid for device: %s\n", str); + + if ( image->hwrevs ) + printf(" Valid for HW revisions: %s\n", image->hwrevs); + +} diff --git a/src/image.h b/src/image.h index a16852e..5ac8286 100644 --- a/src/image.h +++ b/src/image.h @@ -56,6 +56,7 @@ struct image { off_t offset; off_t cur; off_t acur; + char * orig_filename; }; struct image_list { @@ -69,13 +70,16 @@ struct image * image_alloc_from_shared_fd(int fd, size_t size, size_t offset, ui void image_free(struct image * image); void image_seek(struct image * image, off_t whence); size_t image_read(struct image * image, void * buf, size_t count); +void image_print_info(struct image * image); void image_list_add(struct image_list ** list, struct image * image); void image_list_del(struct image_list * list); +void image_list_unlink(struct image_list * list); uint16_t image_hash_from_data(struct image * image); enum image_type image_type_from_data(struct image * image); char * image_name_alloc_from_values(struct image * image); enum image_type image_type_from_string(const char * type); const char * image_type_to_string(enum image_type type); +int image_hwrev_is_valid(struct image * image, const char * hwrev); #endif |