summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2018-12-23 23:59:29 -0500
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-12-26 20:59:06 +0100
commite5ac42699dfd94f1f9607d64799a53fd42e0290d (patch)
tree82cc02315be0cee179deb13088256852aa108664
parent1e0dbfc45d3d02d52dee2cbc0b72c5673f52b05d (diff)
Prepare for rump disk access by making libstore take non-mach device
* libstore/device.c (dopen): Try to lookup the `name' parameter before trying the mach privileged port.
-rw-r--r--libstore/device.c55
1 files changed, 48 insertions, 7 deletions
diff --git a/libstore/device.c b/libstore/device.c
index b350bc7b..1a79c249 100644
--- a/libstore/device.c
+++ b/libstore/device.c
@@ -94,24 +94,65 @@ static error_t
dopen (const char *name, device_t *device, int *mod_flags)
{
device_t dev_master;
- error_t err = get_privileged_ports (0, &dev_master);
- if (! err)
+ error_t err;
+ if (*mod_flags & STORE_HARD_READONLY)
{
- if (*mod_flags & STORE_HARD_READONLY)
- err = device_open (dev_master, D_READ, (char *)name, device);
+ 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;
+
+ mach_port_deallocate (mach_task_self (), dev_master);
+ }
else
+ err = ENODEV;
+ }
+ else
+ {
+ dev_master = file_name_lookup (name, O_READ | O_WRITE, 0);
+ if (dev_master != MACH_PORT_NULL)
{
- err = device_open (dev_master, D_WRITE | D_READ, (char *)name, device);
+ err = device_open (dev_master, D_READ | D_WRITE, "disk", device);
if (err == ED_READ_ONLY)
{
- err = device_open (dev_master, D_READ, (char *)name, device);
+ 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)
+ {
+ err = get_privileged_ports (0, &dev_master);
+ if (! err)
+ {
+ if (*mod_flags & STORE_HARD_READONLY)
+ err = device_open (dev_master, D_READ, (char *)name, device);
+ else
+ {
+ err = device_open (dev_master, D_WRITE | D_READ, (char *)name, device);
+ if (err == ED_READ_ONLY)
+ {
+ err = device_open (dev_master, D_READ, (char *)name, device);
+ if (! err)
+ *mod_flags |= STORE_HARD_READONLY;
+ }
+ else if (! err)
+ *mod_flags &= ~STORE_HARD_READONLY;
+ }
+ mach_port_deallocate (mach_task_self (), dev_master);
}
- mach_port_deallocate (mach_task_self (), dev_master);
}
return err;
}