image: Add new function image_alloc_from_fd()

This commit is contained in:
Pali Rohár committed 2017-06-17 23:47:10 +02:00
1 parent 1ec3777cb8
commit 5cbd5e92b8
2 files changed
+24 -12

No files matched your search

+23 -12
View File
@@ -246,22 +246,33 @@ static struct image * image_alloc(void) {
struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) { struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) {
off_t offset; int fd;
struct image * image = image_alloc();
if ( ! image )
return NULL;
image->is_shared_fd = 0; fd = open(file, O_RDONLY);
image->fd = open(file, O_RDONLY); if ( fd < 0 ) {
if ( image->fd < 0 ) {
ERROR_INFO("Cannot open image file %s", file); ERROR_INFO("Cannot open image file %s", file);
free(image);
return NULL; return NULL;
} }
return image_alloc_from_fd(fd, file, type, device, hwrevs, version, layout);
}
struct image * image_alloc_from_fd(int fd, const char * orig_filename, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout) {
off_t offset;
struct image * image = image_alloc();
if ( ! image ) {
close(fd);
return NULL;
}
image->is_shared_fd = 0;
image->fd = fd;
offset = lseek(image->fd, 0, SEEK_END); offset = lseek(image->fd, 0, SEEK_END);
if ( offset == (off_t)-1 ) { if ( offset == (off_t)-1 ) {
ERROR_INFO("Cannot seek to end of file %s", file); ERROR_INFO("Cannot seek to end of file %s", orig_filename);
close(image->fd); close(image->fd);
free(image); free(image);
return NULL; return NULL;
@@ -270,10 +281,10 @@ struct image * image_alloc_from_file(const char * file, const char * type, const
image->size = offset; image->size = offset;
image->offset = 0; image->offset = 0;
image->cur = 0; image->cur = 0;
image->orig_filename = strdup(file); image->orig_filename = strdup(orig_filename);
if ( lseek(image->fd, 0, SEEK_SET) == (off_t)-1 ) { if ( lseek(image->fd, 0, SEEK_SET) == (off_t)-1 ) {
ERROR_INFO("Cannot seek to begin of file %s", file); ERROR_INFO("Cannot seek to begin of file %s", orig_filename);
close(image->fd); close(image->fd);
free(image->orig_filename); free(image->orig_filename);
free(image); free(image);
@@ -284,7 +295,7 @@ struct image * image_alloc_from_file(const char * file, const char * type, const
return NULL; return NULL;
if ( ( ! type || ! type[0] ) && ( ! device || ! device[0] ) && ( ! hwrevs || ! hwrevs[0] ) && ( ! version || ! version[0] ) ) if ( ( ! type || ! type[0] ) && ( ! device || ! device[0] ) && ( ! hwrevs || ! hwrevs[0] ) && ( ! version || ! version[0] ) )
image_missing_values_from_name(image, file); image_missing_values_from_name(image, orig_filename);
image_align(image); image_align(image);
+1
View File
@@ -64,6 +64,7 @@ struct image_list {
}; };
struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout); struct image * image_alloc_from_file(const char * file, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
struct image * image_alloc_from_fd(int fd, const char * orig_filename, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
struct image * image_alloc_from_shared_fd(int fd, size_t size, size_t offset, uint16_t hash, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout); struct image * image_alloc_from_shared_fd(int fd, size_t size, size_t offset, uint16_t hash, const char * type, const char * device, const char * hwrevs, const char * version, const char * layout);
void image_free(struct image * image); void image_free(struct image * image);
void image_seek(struct image * image, size_t whence); void image_seek(struct image * image, size_t whence);