diff options
Diffstat (limited to 'futility/misc.c')
-rw-r--r-- | futility/misc.c | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/futility/misc.c b/futility/misc.c index 76b8ad1e..4aec13a3 100644 --- a/futility/misc.c +++ b/futility/misc.c @@ -5,6 +5,7 @@ #include <assert.h> #include <errno.h> +#include <fcntl.h> #if !defined(HAVE_MACOS) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include <linux/fs.h> /* For BLKGETSIZE64 */ #endif @@ -258,8 +259,40 @@ void futil_copy_file_or_die(const char *infile, const char *outfile) exit(1); } +enum futil_file_err futil_open_file(const char *infile, int *fd, + enum file_mode mode) +{ + if (mode == FILE_RW) { + VB2_DEBUG("open RW %s\n", infile); + *fd = open(infile, O_RDWR); + if (*fd < 0) { + fprintf(stderr, "Can't open %s for writing: %s\n", + infile, strerror(errno)); + return FILE_ERR_OPEN; + } + } else { + VB2_DEBUG("open RO %s\n", infile); + *fd = open(infile, O_RDONLY); + if (*fd < 0) { + fprintf(stderr, "Can't open %s for reading: %s\n", + infile, strerror(errno)); + return FILE_ERR_OPEN; + } + } + return FILE_ERR_NONE; +} + +enum futil_file_err futil_close_file(int fd) +{ + if (fd >= 0 && close(fd)) { + fprintf(stderr, "Error when closing ifd: %s\n", + strerror(errno)); + return FILE_ERR_CLOSE; + } + return FILE_ERR_NONE; +} -enum futil_file_err futil_map_file(int fd, int writeable, +enum futil_file_err futil_map_file(int fd, enum file_mode mode, uint8_t **buf, uint32_t *len) { struct stat sb; @@ -284,7 +317,7 @@ enum futil_file_err futil_map_file(int fd, int writeable, } reasonable_len = (uint32_t)sb.st_size; - if (writeable) + if (mode == FILE_RW) mmap_ptr = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); else @@ -293,7 +326,7 @@ enum futil_file_err futil_map_file(int fd, int writeable, if (mmap_ptr == (void *)-1) { fprintf(stderr, "Can't mmap %s file: %s\n", - writeable ? "output" : "input", + mode == FILE_RW ? "output" : "input", strerror(errno)); return FILE_ERR_MMAP; } @@ -303,14 +336,14 @@ enum futil_file_err futil_map_file(int fd, int writeable, return FILE_ERR_NONE; } -enum futil_file_err futil_unmap_file(int fd, int writeable, +enum futil_file_err futil_unmap_file(int fd, enum file_mode mode, uint8_t *buf, uint32_t len) { void *mmap_ptr = buf; enum futil_file_err err = FILE_ERR_NONE; - if (writeable && - (0 != msync(mmap_ptr, len, MS_SYNC|MS_INVALIDATE))) { + if (mode == FILE_RW && + (0 != msync(mmap_ptr, len, MS_SYNC | MS_INVALIDATE))) { fprintf(stderr, "msync failed: %s\n", strerror(errno)); err = FILE_ERR_MSYNC; } @@ -325,6 +358,36 @@ enum futil_file_err futil_unmap_file(int fd, int writeable, return err; } +enum futil_file_err futil_open_and_map_file(const char *infile, int *fd, + enum file_mode mode, uint8_t **buf, + uint32_t *len) +{ + enum futil_file_err rv = futil_open_file(infile, fd, mode); + if (rv != FILE_ERR_NONE) + return rv; + + rv = futil_map_file(*fd, mode, buf, len); + if (rv != FILE_ERR_NONE) + futil_close_file(*fd); + + return rv; +} + +enum futil_file_err futil_unmap_and_close_file(int fd, enum file_mode mode, + uint8_t *buf, uint32_t len) +{ + enum futil_file_err rv = FILE_ERR_NONE; + + if (buf) + rv = futil_unmap_file(fd, mode, buf, len); + if (rv != FILE_ERR_NONE) + return rv; + + if (fd != -1) + return futil_close_file(fd); + else + return FILE_ERR_NONE; +} #define DISK_SECTOR_SIZE 512 enum futil_file_type ft_recognize_gpt(uint8_t *buf, uint32_t len) |