diff options
author | Damien Zammit <damien@zamaudio.com> | 2018-12-23 23:59:29 -0500 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-12-26 20:59:06 +0100 |
commit | e5ac42699dfd94f1f9607d64799a53fd42e0290d (patch) | |
tree | 82cc02315be0cee179deb13088256852aa108664 /libstore/device.c | |
parent | 1e0dbfc45d3d02d52dee2cbc0b72c5673f52b05d (diff) | |
download | hurd-e5ac42699dfd94f1f9607d64799a53fd42e0290d.tar.gz hurd-e5ac42699dfd94f1f9607d64799a53fd42e0290d.tar.bz2 hurd-e5ac42699dfd94f1f9607d64799a53fd42e0290d.zip |
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.
Diffstat (limited to 'libstore/device.c')
-rw-r--r-- | libstore/device.c | 55 |
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; } |