image: Add new function image_alloc_from_fd()
This commit is contained in:
1 parent
1ec3777cb8
commit
5cbd5e92b8
2 files changed
+24
-12
No files matched your search
+23
-12
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in new issue
Block a user