예제 #1
0
파일: efivars.c 프로젝트: glpaschall/linux
static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
			     struct bin_attribute *bin_attr,
			     char *buf, loff_t pos, size_t count)
{
	struct efi_variable *del_var = (struct efi_variable *)buf;
	struct efivar_entry *entry;
	int err = 0;

	if (!capable(CAP_SYS_ADMIN))
		return -EACCES;

	efivar_entry_iter_begin();
	entry = efivar_entry_find(del_var->VariableName, del_var->VendorGuid,
				  &efivar_sysfs_list, true);
	if (!entry)
		err = -EINVAL;
	else if (__efivar_entry_delete(entry))
		err = -EIO;

	efivar_entry_iter_end();

	if (err)
		return err;

	efivar_unregister(entry);

	/* It's dead Jim.... */
	return count;
}
예제 #2
0
static int efivar_update_sysfs_entry(efi_char16_t *name, efi_guid_t vendor,
                                     unsigned long name_size, void *data)
{
    struct efivar_entry *entry = data;

    if (efivar_entry_find(name, vendor, &efivar_sysfs_list, false))
        return 0;

    memcpy(entry->var.VariableName, name, name_size);
    memcpy(&(entry->var.VendorGuid), &vendor, sizeof(efi_guid_t));

    return 1;
}
예제 #3
0
static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
                             struct bin_attribute *bin_attr,
                             char *buf, loff_t pos, size_t count)
{
    struct efi_variable *del_var = (struct efi_variable *)buf;
    struct compat_efi_variable *compat;
    struct efivar_entry *entry;
    efi_char16_t *name;
    efi_guid_t vendor;
    int err = 0;

    if (!capable(CAP_SYS_ADMIN))
        return -EACCES;

    if (is_compat()) {
        if (count != sizeof(*compat))
            return -EINVAL;

        compat = (struct compat_efi_variable *)buf;
        name = compat->VariableName;
        vendor = compat->VendorGuid;
    } else {
        if (count != sizeof(*del_var))
            return -EINVAL;

        name = del_var->VariableName;
        vendor = del_var->VendorGuid;
    }

    efivar_entry_iter_begin();
    entry = efivar_entry_find(name, vendor, &efivar_sysfs_list, true);
    if (!entry)
        err = -EINVAL;
    else if (__efivar_entry_delete(entry))
        err = -EIO;

    if (err) {
        efivar_entry_iter_end();
        return err;
    }

    if (!entry->scanning) {
        efivar_entry_iter_end();
        efivar_unregister(entry);
    } else
        efivar_entry_iter_end();

    /* It's dead Jim.... */
    return count;
}