static void close_hook (struct trivfs_peropen *peropen) { struct dev *const dev = peropen->cntl->hook; if (peropen->hook) { mutex_lock (&dev->lock); if (--dev->nperopens == 0) store_set_flags (dev->store, STORE_INACTIVE); mutex_unlock (&dev->lock); open_free (peropen->hook); } }
error_t trivfs_S_file_get_storage_info (struct trivfs_protid *cred, mach_port_t reply, mach_msg_type_name_t reply_type, mach_port_t **ports, mach_msg_type_name_t *ports_type, mach_msg_type_number_t *num_ports, int **ints, mach_msg_type_number_t *num_ints, off_t **offsets, mach_msg_type_number_t *num_offsets, char **data, mach_msg_type_number_t *data_len) { *ports_type = MACH_MSG_TYPE_COPY_SEND; if (! cred || ! cred->po->hook) return EOPNOTSUPP; else { error_t err; 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)) { struct store *clone; err = store_clone (store, &clone); if (! err) { err = store_set_flags (clone, STORE_INACTIVE); if (err == EINVAL) err = EACCES; else err = store_return (clone, ports, num_ports, ints, num_ints, offsets, num_offsets, data, data_len); store_free (clone); } } else err = store_return (store, ports, num_ports, ints, num_ints, offsets, num_offsets, data, data_len); return err; } }