>From b24bbaad7227749286a3c081fc471e5da91cd59a Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sun, 23 Dec 2018 23:59:29 -0500 Subject: [PATCH] Prepare for rump disk access by making libstore take non-mach device --- libstore/device.c | 71 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/libstore/device.c b/libstore/device.c index b350bc7b..7d6eb20e 100644 --- a/libstore/device.c +++ b/libstore/device.c @@ -94,25 +94,66 @@ 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) + { + dev_master = file_name_lookup (name, O_READ, 0); + if (dev_master != MACH_PORT_NULL) { - if (*mod_flags & STORE_HARD_READONLY) - err = device_open (dev_master, D_READ, (char *)name, device); + err = device_open (dev_master, D_READ, "disk", device); + if (! err) + mach_port_deallocate (mach_task_self (), dev_master); 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; - } + err = ENODEV; + } + 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_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) + { + 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); + } + } return err; } -- 2.17.1