API for opening (and tracking) writable file descriptors per disk.

This commit is contained in:
jmallett 2003-01-29 23:19:46 +00:00
parent dfe5702c03
commit 994054cea6
3 changed files with 30 additions and 8 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}