summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock/src/bdpart-read.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libblock/src/bdpart-read.c')
-rw-r--r--cpukit/libblock/src/bdpart-read.c65
1 files changed, 42 insertions, 23 deletions
diff --git a/cpukit/libblock/src/bdpart-read.c b/cpukit/libblock/src/bdpart-read.c
index 3560dbd3a3..4604e1080b 100644
--- a/cpukit/libblock/src/bdpart-read.c
+++ b/cpukit/libblock/src/bdpart-read.c
@@ -23,6 +23,9 @@
#include "config.h"
#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+
#include <rtems.h>
#include <rtems/bdbuf.h>
#include <rtems/bdpart.h>
@@ -64,48 +67,59 @@ bool rtems_bdpart_to_mbr_partition_type(
*/
rtems_status_code rtems_bdpart_get_disk_data(
const char *disk_name,
- dev_t *disk,
+ int *fd_ptr,
+ const rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
rtems_blkdev_bnum disk_begin = 0;
rtems_blkdev_bnum block_size = 0;
- rtems_disk_device *dd = NULL;
- struct stat st;
+
+ /* Open device file */
+ fd = open( disk_name, O_RDWR);
+ if (fd < 0) {
+ sc = RTEMS_INVALID_NAME;
+ goto error;
+ }
/* Get disk handle */
- rv = stat( disk_name, &st);
+ rv = rtems_disk_fd_get_disk_device( fd, &dd);
if (rv != 0) {
- return RTEMS_INVALID_NAME;
+ sc = RTEMS_INVALID_NAME;
+ goto error;
}
- *disk = st.st_rdev;
/* Get disk begin, end and block size */
- dd = rtems_disk_obtain( *disk);
- if (dd == NULL) {
- return RTEMS_INVALID_NAME;
- }
disk_begin = dd->start;
*disk_end = dd->size;
block_size = dd->block_size;
- sc = rtems_disk_release( dd);
- if (sc != RTEMS_SUCCESSFUL) {
- return sc;
- }
/* Check block size */
if (block_size < RTEMS_BDPART_BLOCK_SIZE) {
- return RTEMS_IO_ERROR;
+ sc = RTEMS_IO_ERROR;
+ goto error;
}
/* Check that we have do not have a logical disk */
if (disk_begin != 0) {
- return RTEMS_IO_ERROR;
+ sc = RTEMS_IO_ERROR;
+ goto error;
}
- return RTEMS_SUCCESSFUL;
+error:
+
+ if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
+ *fd_ptr = fd;
+ *dd_ptr = dd;
+ } else {
+ close( fd);
+ }
+
+ return sc;
}
static bool rtems_bdpart_is_valid_record( const uint8_t *data)
@@ -171,7 +185,7 @@ static rtems_status_code rtems_bdpart_read_mbr_partition(
}
static rtems_status_code rtems_bdpart_read_record(
- dev_t disk,
+ const rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
@@ -187,7 +201,7 @@ static rtems_status_code rtems_bdpart_read_record(
}
/* Read the record block */
- sc = rtems_bdbuf_read( disk, index, block);
+ sc = rtems_bdbuf_read( dd, index, block);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
@@ -220,9 +234,10 @@ rtems_status_code rtems_bdpart_read(
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
- dev_t disk = 0;
size_t i = 0;
const uint8_t *data = NULL;
+ int fd = -1;
+ const rtems_disk_device *dd = NULL;
/* Check parameter */
if (format == NULL || pt == NULL || count == NULL) {
@@ -233,13 +248,13 @@ rtems_status_code rtems_bdpart_read(
*count = 0;
/* Get disk data */
- sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
+ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
/* Read MBR */
- sc = rtems_bdpart_read_record( disk, 0, &block);
+ sc = rtems_bdpart_read_record( dd, 0, &block);
if (sc != RTEMS_SUCCESSFUL) {
esc = sc;
goto cleanup;
@@ -283,7 +298,7 @@ rtems_status_code rtems_bdpart_read(
rtems_blkdev_bnum tmp = 0;
/* Read EBR */
- sc = rtems_bdpart_read_record( disk, ebr, &block);
+ sc = rtems_bdpart_read_record( dd, ebr, &block);
if (sc != RTEMS_SUCCESSFUL) {
esc = sc;
goto cleanup;
@@ -340,6 +355,10 @@ rtems_status_code rtems_bdpart_read(
cleanup:
+ if (fd >= 0) {
+ close( fd);
+ }
+
if (block != NULL) {
rtems_bdbuf_release( block);
}