|
Lines 43-60
Link Here
|
| 43 |
char buffer[PATH_MAX+40]; |
43 |
char buffer[PATH_MAX+40]; |
| 44 |
if (!name || !var) return EFI_INVALID_PARAMETER; |
44 |
if (!name || !var) return EFI_INVALID_PARAMETER; |
| 45 |
memset(buffer, 0, sizeof(buffer)); |
45 |
memset(buffer, 0, sizeof(buffer)); |
|
|
46 |
efi32_variable_t *var32; |
| 47 |
efi64_variable_t *var64; |
| 48 |
size_t varsize; |
| 46 |
|
49 |
|
| 47 |
snprintf(filename, PATH_MAX-1, "%s/%s/raw_var", SYSFS_DIR_EFI_VARS,name); |
50 |
snprintf(filename, PATH_MAX-1, "%s/%s/raw_var", SYSFS_DIR_EFI_VARS,name); |
| 48 |
fd = open(filename, O_RDONLY); |
51 |
fd = open(filename, O_RDONLY); |
| 49 |
if (fd == -1) { |
52 |
if (fd == -1) { |
| 50 |
return EFI_NOT_FOUND; |
53 |
return EFI_NOT_FOUND; |
| 51 |
} |
54 |
} |
| 52 |
readsize = read(fd, var, sizeof(*var)); |
55 |
|
| 53 |
if (readsize != sizeof(*var)) { |
56 |
/* Fix if kernel efi_variable_t not match */ |
|
|
57 |
switch (efi_var_type) { |
| 58 |
case EFI_VAR_TYPE_32: |
| 59 |
varsize = sizeof(*var32); |
| 60 |
var32 = malloc(varsize); |
| 61 |
if (! var32) return EFI_OUT_OF_RESOURCES; |
| 62 |
readsize = read(fd, var32, varsize); |
| 63 |
break; |
| 64 |
case EFI_VAR_TYPE_64: |
| 65 |
varsize = sizeof(*var64); |
| 66 |
var64 = malloc(varsize); |
| 67 |
if (! var64) return EFI_OUT_OF_RESOURCES; |
| 68 |
readsize = read(fd, var64, varsize); |
| 69 |
break; |
| 70 |
default: |
| 71 |
varsize = sizeof(*var); |
| 72 |
readsize = read(fd, var, varsize); |
| 73 |
break; |
| 74 |
} |
| 75 |
|
| 76 |
if (readsize != varsize) { |
| 54 |
close(fd); |
77 |
close(fd); |
| 55 |
return EFI_INVALID_PARAMETER; |
78 |
return EFI_INVALID_PARAMETER; |
| 56 |
} |
79 |
} |
| 57 |
close(fd); |
80 |
close(fd); |
|
|
81 |
|
| 82 |
if (efi_var_type == EFI_VAR_TYPE_32) { |
| 83 |
memcpy(&var->VariableName,&var32->VariableName,sizeof(var32->VariableName)); |
| 84 |
var->DataSize = var32->DataSize; |
| 85 |
memcpy(&var->Data,&var32->Data,sizeof(var32->Data)); |
| 86 |
var->Status = var32->Status; |
| 87 |
var->Attributes = var32->Attributes; |
| 88 |
} |
| 89 |
else if (efi_var_type == EFI_VAR_TYPE_64) { |
| 90 |
memcpy(&var->VariableName,&var64->VariableName,sizeof(var64->VariableName)); |
| 91 |
var->DataSize = var64->DataSize; |
| 92 |
memcpy(&var->Data,&var64->Data,sizeof(var64->Data)); |
| 93 |
var->Status = var64->Status; |
| 94 |
var->Attributes = var64->Attributes; |
| 95 |
} |
| 96 |
|
| 58 |
return var->Status; |
97 |
return var->Status; |
| 59 |
} |
98 |
} |
| 60 |
|
99 |
|
|
Lines 64-69
Link Here
|
| 64 |
int fd; |
103 |
int fd; |
| 65 |
size_t writesize; |
104 |
size_t writesize; |
| 66 |
char buffer[PATH_MAX+40]; |
105 |
char buffer[PATH_MAX+40]; |
|
|
106 |
efi32_variable_t *var32; |
| 107 |
efi64_variable_t *var64; |
| 108 |
size_t varsize; |
| 67 |
|
109 |
|
| 68 |
if (!filename || !var) return EFI_INVALID_PARAMETER; |
110 |
if (!filename || !var) return EFI_INVALID_PARAMETER; |
| 69 |
memset(buffer, 0, sizeof(buffer)); |
111 |
memset(buffer, 0, sizeof(buffer)); |
|
Lines 72-79
Link Here
|
| 72 |
if (fd == -1) { |
114 |
if (fd == -1) { |
| 73 |
return EFI_INVALID_PARAMETER; |
115 |
return EFI_INVALID_PARAMETER; |
| 74 |
} |
116 |
} |
| 75 |
writesize = write(fd, var, sizeof(*var)); |
117 |
|
| 76 |
if (writesize != sizeof(*var)) { |
118 |
/* Fix if kernel efi_variable_t not match */ |
|
|
119 |
if (efi_var_type == EFI_VAR_TYPE_32) { |
| 120 |
varsize = sizeof(*var32); |
| 121 |
var32 = malloc(varsize); |
| 122 |
if (! var32) return EFI_OUT_OF_RESOURCES; |
| 123 |
memcpy(&var32->VariableName,&var->VariableName,sizeof(var32->VariableName)); |
| 124 |
var32->DataSize = var->DataSize; |
| 125 |
memcpy(&var32->Data,&var->Data,sizeof(var32->Data)); |
| 126 |
var32->Status = var->Status; |
| 127 |
var32->Attributes = var->Attributes; |
| 128 |
writesize = write(fd, var32, sizeof(*var32)); |
| 129 |
free(var32); |
| 130 |
} |
| 131 |
else if (efi_var_type == EFI_VAR_TYPE_64) { |
| 132 |
varsize = sizeof(*var64); |
| 133 |
var64 = malloc(varsize); |
| 134 |
if (! var64) return EFI_OUT_OF_RESOURCES; |
| 135 |
memcpy(&var64->VariableName,&var->VariableName,sizeof(var64->VariableName)); |
| 136 |
var64->DataSize = var->DataSize; |
| 137 |
memcpy(&var64->Data,&var->Data,sizeof(var64->Data)); |
| 138 |
var64->Status = var->Status; |
| 139 |
var64->Attributes = var->Attributes; |
| 140 |
writesize = write(fd, var64, sizeof(*var64)); |
| 141 |
free(var64); |
| 142 |
} else { |
| 143 |
varsize = sizeof(*var); |
| 144 |
writesize = write(fd, var, sizeof(*var)); |
| 145 |
} |
| 146 |
|
| 147 |
if (writesize != varsize) { |
| 77 |
close(fd); |
148 |
close(fd); |
| 78 |
return EFI_INVALID_PARAMETER; |
149 |
return EFI_INVALID_PARAMETER; |
| 79 |
} |
150 |
} |