diff options
Diffstat (limited to 'lib/libufs/block.c')
-rw-r--r-- | lib/libufs/block.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/libufs/block.c b/lib/libufs/block.c index 234991a..2b06dbf 100644 --- a/lib/libufs/block.c +++ b/lib/libufs/block.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include <ufs/ffs/fs.h> #include <errno.h> +#include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> @@ -74,14 +75,26 @@ ssize_t bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size) { ssize_t cnt; + int rofd; ERROR(disk, NULL); + rofd = disk->d_fd; + + disk->d_fd = open(disk->d_name, O_WRONLY); + if (disk->d_fd < 0) { + ERROR(disk, "failed to open disk for writing"); + return -1; + } + cnt = pwrite(disk->d_fd, data, size, (off_t)(blockno * disk->d_bsize)); if (cnt != size) { ERROR(disk, "short write to block device"); return -1; } + + close(disk->d_fd); + disk->d_fd = rofd; return cnt; } |