summaryrefslogtreecommitdiff
path: root/futility/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'futility/misc.c')
-rw-r--r--futility/misc.c75
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)