Beispiel #1
0
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);
    }
}
Beispiel #2
0
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;
    }
}