From e5ac42699dfd94f1f9607d64799a53fd42e0290d Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sun, 23 Dec 2018 23:59:29 -0500 Subject: 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. --- libstore/device.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 7 deletions(-) (limited to 'libstore/device.c') 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; } -- cgit v1.2.3