aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstore/device.c58
1 files changed, 31 insertions, 27 deletions
diff --git a/libstore/device.c b/libstore/device.c
index 1a79c249..1d8f57fd 100644
--- a/libstore/device.c
+++ b/libstore/device.c
@@ -94,42 +94,46 @@ static error_t
dopen (const char *name, device_t *device, int *mod_flags)
{
device_t dev_master;
- error_t err;
- if (*mod_flags & STORE_HARD_READONLY)
- {
- dev_master = file_name_lookup (name, O_READ, 0);
- if (dev_master != MACH_PORT_NULL)
- {
- err = device_open (dev_master, D_READ, "disk", device);
- if (err)
- err = ENODEV;
+ error_t err = ENODEV;
- mach_port_deallocate (mach_task_self (), dev_master);
- }
- else
- err = ENODEV;
- }
- else
+ if (name[0] == '/')
{
- dev_master = file_name_lookup (name, O_READ | O_WRITE, 0);
- if (dev_master != MACH_PORT_NULL)
+ if (*mod_flags & STORE_HARD_READONLY)
{
- err = device_open (dev_master, D_READ | D_WRITE, "disk", device);
- if (err == ED_READ_ONLY)
+ dev_master = file_name_lookup (name, O_READ, 0);
+ if (dev_master != MACH_PORT_NULL)
{
err = device_open (dev_master, D_READ, "disk", device);
- if (! err)
- *mod_flags |= STORE_HARD_READONLY;
- else
+ if (err)
err = ENODEV;
- }
- else if (! err)
- *mod_flags &= ~STORE_HARD_READONLY;
- mach_port_deallocate (mach_task_self (), dev_master);
+ mach_port_deallocate (mach_task_self (), dev_master);
+ }
+ else
+ err = ENODEV;
}
else
- err = ENODEV;
+ {
+ dev_master = file_name_lookup (name, O_READ | O_WRITE, 0);
+ if (dev_master != MACH_PORT_NULL)
+ {
+ err = device_open (dev_master, D_READ | D_WRITE, "disk", device);
+ if (err == ED_READ_ONLY)
+ {
+ err = device_open (dev_master, D_READ, "disk", device);
+ if (! err)
+ *mod_flags |= STORE_HARD_READONLY;
+ else
+ err = ENODEV;
+ }
+ else if (! err)
+ *mod_flags &= ~STORE_HARD_READONLY;
+
+ mach_port_deallocate (mach_task_self (), dev_master);
+ }
+ else
+ err = ENODEV;
+ }
}
if (err)