64 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#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;
							 | 
						||
| 
								 | 
							
								}
							 |