diff options
Diffstat (limited to 'libstore')
-rw-r--r-- | libstore/device.c | 58 |
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) |