diff options
author | Roland McGrath <roland@gnu.org> | 1999-11-18 06:23:21 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1999-11-18 06:23:21 +0000 |
commit | a28b7971a74ad65d1d38fc96f0b53283abac15b4 (patch) | |
tree | 4345413c279e28e3a8744fbbcdea44f7c76ed048 | |
parent | 5406e6199f7faa54e96b6cef1ec382be26c2bfe8 (diff) |
1999-11-14 Roland McGrath <roland@baalperazim.frob.com>
* io.c (trivfs_S_file_get_storage_info): Fail with EOPNOTSUPP when
there is no store open.
* dev.h (struct dev): New member `enforced'.
* storeio.c (enforce_store): New variable.
(options, parse_opt, trivfs_append_args): Grok new option
--enforced/-e to set enforce_store.
(check_open_hook): Set DEVICE->enforced from enforce_store.
* io.c (trivfs_S_file_get_storage_info): If DEV->enforced is set
and the store flags lack STORE_ENFORCED, then return STORAGE_OTHER.
-rw-r--r-- | storeio/io.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/storeio/io.c b/storeio/io.c index f3a6a732..cffe917a 100644 --- a/storeio/io.c +++ b/storeio/io.c @@ -306,12 +306,38 @@ trivfs_S_file_get_storage_info (struct trivfs_protid *cred, { *ports_type = MACH_MSG_TYPE_COPY_SEND; - if (! cred) + if (! cred || ! cred->po->hook) return EOPNOTSUPP; else { error_t err; - struct store *store = ((struct open *)cred->po->hook)->dev->store; + struct dev *dev = ((struct open *)cred->po->hook)->dev; + struct store *store = dev->store; + + if (dev->enforced && !(store->flags & STORE_ENFORCED)) + { + /* The --enforced switch tells us not to let anyone + get at the device, no matter how trustable they are. */ + size_t name_len = (store->name ? strlen (store->name) + 1 : 0); + int i; + *num_ports = 0; + i = 0; + (*ints)[i++] = STORAGE_OTHER; + (*ints)[i++] = store->flags; + (*ints)[i++] = store->block_size; + (*ints)[i++] = 1; /* num_runs */ + (*ints)[i++] = name_len; + (*ints)[i++] = 0; /* misc_len */ + *num_ints = i; + i = 0; + (*offsets)[i++] = 0; + (*offsets)[i++] = store->size; + *num_offsets = i; + if (store->name) + memcpy (*data, store->name, name_len); + *data_len = name_len; + return 0; + } if (!cred->isroot && !store_is_securely_returnable (store, cred->po->openmodes)) |