diff options
Diffstat (limited to 'lib/libufs')
-rw-r--r-- | lib/libufs/block.c | 11 | ||||
-rw-r--r-- | lib/libufs/libufs.h | 1 | ||||
-rw-r--r-- | lib/libufs/type.c | 26 |
3 files changed, 30 insertions, 8 deletions
diff --git a/lib/libufs/block.c b/lib/libufs/block.c index 2b06dbf..efc39ef 100644 --- a/lib/libufs/block.c +++ b/lib/libufs/block.c @@ -75,14 +75,12 @@ ssize_t bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size) { ssize_t cnt; - int rofd; + int rv; ERROR(disk, NULL); - rofd = disk->d_fd; - - disk->d_fd = open(disk->d_name, O_WRONLY); - if (disk->d_fd < 0) { + rv = ufs_disk_write(disk); + if (rv == -1) { ERROR(disk, "failed to open disk for writing"); return -1; } @@ -93,8 +91,5 @@ bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size) return -1; } - close(disk->d_fd); - disk->d_fd = rofd; - return cnt; } diff --git a/lib/libufs/libufs.h b/lib/libufs/libufs.h index 34c2439..035f2a5 100644 --- a/lib/libufs/libufs.h +++ b/lib/libufs/libufs.h @@ -130,6 +130,7 @@ int ufs_disk_close(struct uufsd *); void ufs_disk_dtor(struct uufsd **); int ufs_disk_fillout(struct uufsd *, const char *); int ufs_disk_fillout_blank(struct uufsd *, const char *); +int ufs_disk_write(struct uufsd *); __END_DECLS diff --git a/lib/libufs/type.c b/lib/libufs/type.c index 41eacfd..5455465 100644 --- a/lib/libufs/type.c +++ b/lib/libufs/type.c @@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$"); /* Internally, track the 'name' value, it's ours. */ #define MINE_NAME 0x01 +/* Track if its fd points to a writable device. */ +#define MINE_WRITE 0x02 struct uufsd * ufs_disk_ctor(const char *name) @@ -175,3 +177,27 @@ again: if (stat(name, &st) < 0) { return 0; } + +int +ufs_disk_write(struct uufsd *disk) +{ + int rofd; + + ERROR(disk, NULL); + + if (disk->d_mine & MINE_WRITE) + return 0; + + rofd = disk->d_fd; + + disk->d_fd = open(disk->d_name, O_RDWR); + if (disk->d_fd < 0) { + ERROR(disk, "failed to open disk for writing"); + disk->d_fd = rofd; + return -1; + } + + disk->d_mine |= MINE_WRITE; + + return 0; +} |