View | Details | Raw Unified | Return to bug 202614
Collapse All | Expand All

(-)sys/boot/efi/loader/main.c (-29 / +76 lines)
Lines 518-523 Link Here
518
	return (buf);
518
	return (buf);
519
}
519
}
520
520
521
#define EFI_VAR_MAXSZ	128
522
static const char *
523
ucs2_to_string(CHAR16 *str16)
524
{
525
	static char buf[EFI_VAR_MAXSZ];
526
	int i;
527
528
	for(i = 0; ((char)str16[i] != '\0') && (i < (EFI_VAR_MAXSZ - 1)); i++)
529
		buf[i] = (char)str16[i];
530
	buf[i] = '\0';
531
532
	return (buf);
533
}
534
521
static int
535
static int
522
command_configuration(int argc, char *argv[])
536
command_configuration(int argc, char *argv[])
523
{
537
{
Lines 611-659 Link Here
611
}
625
}
612
626
613
627
614
COMMAND_SET(nvram, "nvram", "get or set NVRAM variables", command_nvram);
628
COMMAND_SET(nvram, "nvram", "get NVRAM variables", command_nvram);
615
629
616
static int
630
static int
617
command_nvram(int argc, char *argv[])
631
command_nvram(int argc, char *argv[])
618
{
632
{
619
	CHAR16 var[128];
633
	CHAR16 var[EFI_VAR_MAXSZ];
634
	const char *varstr;
620
	CHAR16 *data;
635
	CHAR16 *data;
621
	EFI_STATUS status;
636
	EFI_STATUS nstatus, status;
622
	EFI_GUID varguid = { 0,0,0,{0,0,0,0,0,0,0,0} };
637
	EFI_GUID varguid = { 0,0,0,{0,0,0,0,0,0,0,0} };
623
	UINTN varsz, datasz, i;
638
	UINTN varsz, datasz, i;
624
	SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
639
	int verbose = 0;
640
	char *lookup;
625
641
626
	conout = ST->ConOut;
642
	lookup = NULL;
643
	if (argc > 1) {
644
		if ((argv[1][0] == '-') && (argv[1][1] == 'v')) {
645
			verbose = 1;
646
			if (argc > 2)
647
				lookup = argv[2];
648
		}
649
		else
650
			lookup = argv[1];
651
	}
627
652
628
	/* Initiate the search */
653
	/* Initiate the search */
629
	status = RS->GetNextVariableName(&varsz, NULL, NULL);
654
	var[0] = '\0';
655
	varsz = EFI_VAR_MAXSZ;
656
	nstatus = RS->GetNextVariableName(&varsz, var, &varguid);
630
657
631
	for (; status != EFI_NOT_FOUND; ) {
658
	while (nstatus == EFI_SUCCESS) {
632
		status = RS->GetNextVariableName(&varsz, var, &varguid);
659
		varstr = ucs2_to_string(var);
633
		//if (EFI_ERROR(status))
660
		/* Check if this variable matches our lookup filter */
634
			//break;
661
		if ((lookup == NULL) ||
635
662
		    ((lookup != NULL) && (strcmp(varstr, lookup) == 0))) {
636
		conout->OutputString(conout, var);
663
			/* Display variable name... */
637
		printf("=");
664
			printf("%s (%s)", varstr, guid_to_string(&varguid));
638
		datasz = 0;
665
	
639
		status = RS->GetVariable(var, &varguid, NULL, &datasz, NULL);
666
			/* ... and its contents if verbose mode is enabled */
640
		/* XXX: check status */
667
			if (verbose) {
641
		data = malloc(datasz);
668
				printf("=");
642
		status = RS->GetVariable(var, &varguid, NULL, &datasz, data);
669
	
643
		if (EFI_ERROR(status))
670
				datasz = 0;
644
			printf("<error retrieving variable>");
671
				status = RS->GetVariable(var, &varguid, NULL,
645
		else {
672
				    &datasz, NULL);
646
			for (i = 0; i < datasz; i++) {
673
				if (EFI_ERROR(status) &&
647
				if (isalnum(data[i]) || isspace(data[i]))
674
				    (status != EFI_BUFFER_TOO_SMALL))
648
					printf("%c", data[i]);
675
					printf("<error retrieving variable>");
649
				else
676
				else {
650
					printf("\\x%02x", data[i]);
677
					data = malloc(datasz);
678
					status = RS->GetVariable(var, &varguid,
679
					    NULL, &datasz, data);
680
					if (EFI_ERROR(status))
681
						printf("<error retrieving "
682
						    "variable>");
683
					else
684
						for (i = 0; i < datasz; i++)
685
						    printf("%04x ", data[i]);
686
					free(data);
687
				}
688
				/* Stop if 'q' is selected */
689
				if(pager_output("\n") != 0) {
690
					nstatus = EFI_NOT_FOUND;
691
					break;
692
				}
651
			}
693
			}
694
			else
695
				printf("\n");
652
		}
696
		}
653
		/* XXX */
697
654
		pager_output("\n");
698
		varsz = EFI_VAR_MAXSZ;
655
		free(data);
699
		nstatus = RS->GetNextVariableName(&varsz, var, &varguid);
656
	}
700
	}
701
	if (nstatus != EFI_NOT_FOUND)
702
		printf("Error retrieving EFI vars: GetNextVariableName() "
703
		    "returned 0x%lx\n", (long)nstatus);
657
704
658
	return (CMD_OK);
705
	return (CMD_OK);
659
}
706
}

Return to bug 202614