summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2020-03-29 18:51:00 +1100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-03-29 17:28:20 +0200
commit0f77ef36b53b1259a7ce928dcdad22af0dffa52e (patch)
treee341e522f9ffd9c4cc6da80c964b5185e6faad39
parentca1b073bc058d3cd1a8ba152ef5a39d0a78a9e0e (diff)
libstore: Add ability to pass custom master device with format @master:/dev/device
-rw-r--r--libstore/device.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/libstore/device.c b/libstore/device.c
index 1d8f57fd6..b8961a524 100644
--- a/libstore/device.c
+++ b/libstore/device.c
@@ -95,15 +95,22 @@ dopen (const char *name, device_t *device, int *mod_flags)
{
device_t dev_master;
error_t err = ENODEV;
+ char *pos;
+ char *master;
+ char *rest;
- if (name[0] == '/')
+ /* Parse @master:/dev/hello */
+ if ( (name[0] == '@') && (pos = strchr (name, ':')) )
{
+ master = strndup (name+1, pos-(name+1));
+ rest = strdup (pos+1);
+
if (*mod_flags & STORE_HARD_READONLY)
{
- dev_master = file_name_lookup (name, O_READ, 0);
+ dev_master = file_name_lookup (master, O_READ, 0);
if (dev_master != MACH_PORT_NULL)
{
- err = device_open (dev_master, D_READ, "disk", device);
+ err = device_open (dev_master, D_READ, rest, device);
if (err)
err = ENODEV;
@@ -114,13 +121,13 @@ dopen (const char *name, device_t *device, int *mod_flags)
}
else
{
- dev_master = file_name_lookup (name, O_READ | O_WRITE, 0);
+ dev_master = file_name_lookup (master, O_READ | O_WRITE, 0);
if (dev_master != MACH_PORT_NULL)
{
- err = device_open (dev_master, D_READ | D_WRITE, "disk", device);
+ err = device_open (dev_master, D_READ | D_WRITE, rest, device);
if (err == ED_READ_ONLY)
{
- err = device_open (dev_master, D_READ, "disk", device);
+ err = device_open (dev_master, D_READ, rest, device);
if (! err)
*mod_flags |= STORE_HARD_READONLY;
else