static uint gasket_ioctl_check_permissions()

in tools/driver/drivers/gasket/gasket_ioctl.c [129:160]


static uint gasket_ioctl_check_permissions(struct gasket_dev *gasket_dev,
                                           struct file *filp, uint cmd) {
  uint alive, root, device_owner;
  fmode_t read, write;
  alive = (gasket_dev->status == GASKET_STATUS_ALIVE);
  root = capable(CAP_SYS_ADMIN);
  read = filp->f_mode & FMODE_READ;
  write = filp->f_mode & FMODE_WRITE;
  device_owner = (gasket_dev->ownership.is_owned &&
                  current->tgid == gasket_dev->ownership.owner);
  switch (cmd) {
    case GASKET_IOCTL_RESET:
    case GASKET_IOCTL_CLEAR_INTERRUPT_COUNTS:
      return root || (write && device_owner);
    case GASKET_IOCTL_PAGE_TABLE_SIZE:
    case GASKET_IOCTL_SIMPLE_PAGE_TABLE_SIZE:
    case GASKET_IOCTL_NUMBER_PAGE_TABLES:
      return root || read;
    case GASKET_IOCTL_PARTITION_PAGE_TABLE:
      return alive && (root || (write && device_owner));
    case GASKET_IOCTL_MAP_BUFFER:
    case GASKET_IOCTL_UNMAP_BUFFER:
    case GASKET_IOCTL_MAP_DMA_BUF:
      return alive && (root || (write && device_owner));
    case GASKET_IOCTL_CLEAR_EVENTFD:
    case GASKET_IOCTL_SET_EVENTFD:
    case GASKET_IOCTL_REGISTER_INTERRUPT:
    case GASKET_IOCTL_UNREGISTER_INTERRUPT:
      return alive && (root || (write && device_owner));
  }
  return 0;
}