|  | #include <stdio.h> | 
|  | #include <stdint.h> | 
|  | #include <stdlib.h> | 
|  | #include <unistd.h> | 
|  | #include <sys/types.h> | 
|  | #include <sys/stat.h> | 
|  | #include <fcntl.h> | 
|  |  | 
|  | int main(int argc, char **argv) | 
|  | { | 
|  | const char *path; | 
|  | char buf[5]; | 
|  | int fd, rc; | 
|  |  | 
|  | if (argc < 2) { | 
|  | fprintf(stderr, "usage: %s <path>\n", argv[0]); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | path = argv[1]; | 
|  |  | 
|  | /* attributes: EFI_VARIABLE_NON_VOLATILE | | 
|  | *		EFI_VARIABLE_BOOTSERVICE_ACCESS | | 
|  | *		EFI_VARIABLE_RUNTIME_ACCESS | 
|  | */ | 
|  | *(uint32_t *)buf = 0x7; | 
|  | buf[4] = 0; | 
|  |  | 
|  | /* create a test variable */ | 
|  | fd = open(path, O_WRONLY | O_CREAT); | 
|  | if (fd < 0) { | 
|  | perror("open(O_WRONLY)"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | rc = write(fd, buf, sizeof(buf)); | 
|  | if (rc != sizeof(buf)) { | 
|  | perror("write"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | close(fd); | 
|  |  | 
|  | fd = open(path, O_RDONLY); | 
|  | if (fd < 0) { | 
|  | perror("open"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | if (unlink(path) < 0) { | 
|  | perror("unlink"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | rc = read(fd, buf, sizeof(buf)); | 
|  | if (rc > 0) { | 
|  | fprintf(stderr, "reading from an unlinked variable " | 
|  | "shouldn't be possible\n"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | return EXIT_SUCCESS; | 
|  | } |