summaryrefslogtreecommitdiffstats
path: root/private/ntos/fw/alpha/jnsetenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/fw/alpha/jnsetenv.c')
-rw-r--r--private/ntos/fw/alpha/jnsetenv.c408
1 files changed, 408 insertions, 0 deletions
diff --git a/private/ntos/fw/alpha/jnsetenv.c b/private/ntos/fw/alpha/jnsetenv.c
new file mode 100644
index 000000000..a091f7793
--- /dev/null
+++ b/private/ntos/fw/alpha/jnsetenv.c
@@ -0,0 +1,408 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+Copyright (c) 1993 Digital Equipment Corporation
+
+Module Name:
+
+ jnsetenv.c
+
+Abstract:
+
+ This module contains the code to change an environment variable.
+
+ This module is Jensen-specific.
+
+
+Author:
+
+ John DeRosa 31-July-1992.
+
+ This module, and the entire setup program, was based on the jzsetup
+ program written by David M. Robinson (davidro) of Microsoft, dated
+ 9-Aug-1991.
+
+
+Revision History:
+
+--*/
+
+
+#include "fwp.h"
+#include "jnsnvdeo.h"
+#include "machdef.h"
+#include "string.h"
+#include "iodevice.h"
+#include "jnvendor.h"
+#include "fwstring.h"
+
+//
+// Environment variables.
+//
+
+PCHAR BootString[] = { "LOADIDENTIFIER",
+ "SYSTEMPARTITION",
+ "OSLOADER",
+ "OSLOADPARTITION",
+ "OSLOADFILENAME",
+ "OSLOADOPTIONS" };
+
+BOOLEAN
+JzSetBootEnvironmentVariable (
+ IN ULONG CurrentBootSelection
+ )
+
+/*++
+
+Routine Description:
+
+ This routine allows the user to edit boot environment variables.
+
+Arguments:
+
+ CurrentBootSelection - Supplies the current segment number to edit.
+
+Return Value:
+
+ Returns true if a variable was set, FALSE if ESC was pressed.
+
+--*/
+
+{
+ ARC_STATUS Status;
+ LONG Index;
+ PCHAR Variable;
+ PCHAR LastVariable;
+ CHAR VariableName[32];
+ CHAR VariableValue[128];
+ CHAR Segment[128];
+ GETSTRING_ACTION Action;
+ PCHAR NextVariable;
+
+ Index = 0;
+ do {
+
+ VenSetPosition( 4, 5);
+ VenPrint("\x9bK");
+ VenPrint(SS_NAME_MSG);
+ Action = JzGetString( VariableName,
+ sizeof(VariableName),
+ BootString[Index],
+ 4,
+ 5 + strlen(SS_NAME_MSG),
+ TRUE
+ );
+ switch (Action) {
+
+ case GetStringEscape:
+ return(FALSE);
+
+ case GetStringUpArrow:
+ if (Index == 0) {
+ Index = 5;
+ } else {
+ Index--;
+ }
+ break;
+
+ case GetStringDownArrow:
+ if (Index == 5) {
+ Index = 0;
+ } else {
+ Index++;
+ }
+ break;
+
+ default:
+ continue;
+
+ }
+
+ } while (Action != GetStringSuccess);
+
+ if (VariableName[0] == 0) {
+ return(FALSE);
+ }
+
+ Variable = NULL;
+
+ SetupROMPendingModified = TRUE;
+
+ Action = GetStringUpArrow;
+ do {
+
+ switch (Action) {
+
+ case GetStringEscape:
+ return(FALSE);
+
+ case GetStringUpArrow:
+ case GetStringDownArrow:
+ if (Variable == NULL) {
+ strcpy(Segment, VariableName);
+ FwGetVariableSegment( CurrentBootSelection, Segment );
+ strcpy(VariableValue, strchr(Segment, '=') + 1);
+ Variable = VariableValue;
+ } else {
+ Variable = NULL;
+ }
+ break;
+
+ default:
+ continue;
+ }
+
+ VenSetPosition( 5, 5);
+ VenPrint("\x9bK");
+ VenPrint(SS_VALUE_MSG);
+
+ Action = JzGetString( VariableValue,
+ sizeof(VariableValue),
+ Variable,
+ 5,
+ 5 + strlen(SS_VALUE_MSG),
+ TRUE
+ );
+
+ } while (Action != GetStringSuccess );
+
+
+ //
+ // Save the old value.
+ //
+
+ strcpy(Segment, VariableName);
+ FwGetVariableSegment( CurrentBootSelection, Segment );
+
+ //
+ // Delete the old value.
+ //
+
+ JzDeleteVariableSegment( VariableName, CurrentBootSelection );
+
+ //
+ // Add in the new value.
+ //
+
+ Status = FwSetVariableSegment( CurrentBootSelection,
+ VariableName,
+ VariableValue );
+
+ if (Status != ESUCCESS) {
+
+ //
+ // Try to add back in the old value.
+ //
+
+ FwSetVariableSegment( CurrentBootSelection,
+ VariableName,
+ strchr(Segment, '=') + 1);
+
+ VenSetPosition(7, 5);
+ if (Status == ENOSPC) {
+ VenPrint(SS_NO_NVRAM_SPACE_MSG);
+ } else {
+ VenPrint(SS_NVRAM_CHKSUM_MSG);
+ }
+ VenPrint(SS_PRESS_KEY2_MSG);
+ FwWaitForKeypress(TRUE);
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+BOOLEAN
+JzSetEnvironmentVariable (
+ VOID
+ )
+
+/*++
+
+Routine Description:
+
+ This routine allow the user to edit environment variables other than
+ the ones for boot.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ Returns true if a variable was set, FALSE if ESC was pressed.
+
+--*/
+
+{
+ ARC_STATUS Status;
+ LONG Index;
+ ULONG Position;
+ PCHAR EqualSign;
+ ULONG EnvironmentIndex;
+ PCHAR Variable;
+ PCHAR LastVariable;
+ CHAR VariableName[32];
+ CHAR InitialVariableName[32];
+ CHAR VariableValue[256];
+ CHAR Segment[256];
+ GETSTRING_ACTION Action;
+ PCHAR Environment;
+
+ SetupROMPendingModified = TRUE;
+
+ //
+ // Index of '0' is a blank entry, so the user can fill out a new environment
+ // variable if required.
+ //
+
+ Variable = NULL;
+ Index = 0;
+ do {
+
+ VenSetPosition( 5, 5);
+ VenPrint("\x9bK");
+ VenPrint(SS_NAME_MSG);
+ Action = JzGetString( VariableName,
+ sizeof(VariableName),
+ Variable,
+ 5,
+ 5 + strlen(SS_NAME_MSG),
+ TRUE
+ );
+ switch (Action) {
+
+ case GetStringEscape:
+ return(FALSE);
+
+ case GetStringUpArrow:
+ Index--;
+ break;
+
+ case GetStringDownArrow:
+ Index++;
+ break;
+
+ default:
+ continue;
+
+ }
+
+ Environment = VolatileEnvironment;
+ LastVariable = Environment;
+ EnvironmentIndex = 1;
+ while (TRUE) {
+
+ //
+ // Jump over any boot variables.
+ //
+
+ while((strstr(Environment, "SYSTEMPARTITION=") != NULL) ||
+ (strstr(Environment, "OSLOADER=") != NULL) ||
+ (strstr(Environment, "OSLOADPARTITION=") != NULL) ||
+ (strstr(Environment, "OSLOADFILENAME=") != NULL) ||
+ (strstr(Environment, "OSLOADOPTIONS=") != NULL) ||
+ (strstr(Environment, "LOADIDENTIFIER=") != NULL)) {
+ Environment = strchr(Environment, '\0') + 1;
+ if (*Environment == 0) {
+ break;
+ }
+ }
+
+ //
+ // The end of the environment was reached without matching
+ // the index. If the index is less than zero, set it to
+ // the last variable found, otherwise set it to 0.
+ //
+
+ if (*Environment == 0) {
+ EnvironmentIndex--;
+ if (Index < 0) {
+ Environment = LastVariable;
+ Index = EnvironmentIndex;
+ } else {
+ Index = 0;
+ Variable = NULL;
+ break;
+ }
+ }
+
+ //
+ // We're on the right variable.
+ //
+
+ if (Index == EnvironmentIndex) {
+
+ InitialVariableName[0] = 0;
+ EqualSign = strchr(Environment, '=');
+ if (EqualSign != NULL) {
+ Position = EqualSign - Environment;
+ strncpy(InitialVariableName, Environment, Position);
+ InitialVariableName[Position] = 0;
+ }
+ Variable = InitialVariableName;
+ break;
+ }
+
+ LastVariable = Environment;
+ Environment = strchr(Environment, '\0') + 1;
+ EnvironmentIndex++;
+ }
+
+ } while (Action != GetStringSuccess);
+
+ if (VariableName[0] == 0) {
+ return(FALSE);
+ }
+
+ Variable = NULL;
+ Action = GetStringUpArrow;
+ do {
+ switch (Action) {
+
+ case GetStringEscape:
+ return(FALSE);
+
+ case GetStringUpArrow:
+ case GetStringDownArrow:
+ if (Variable == NULL) {
+ Variable = ArcGetEnvironmentVariable(VariableName);
+ } else {
+ Variable = NULL;
+ }
+ break;
+
+ default:
+ continue;
+ }
+
+ VenSetPosition( 6, 5);
+ VenPrint("\x9bK");
+ VenPrint(SS_VALUE_MSG);
+
+ Action = JzGetString( VariableValue,
+ sizeof(VariableValue),
+ Variable,
+ 6,
+ 5 + strlen(SS_VALUE_MSG),
+ TRUE
+ );
+ } while (Action != GetStringSuccess );
+
+ if ((Status = FwCoreSetEnvironmentVariable(VariableName,
+ VariableValue,
+ FALSE)) != ESUCCESS) {
+ VenSetPosition(7, 5);
+ if (Status == ENOSPC) {
+ VenPrint(SS_NO_NVRAM_SPACE_MSG);
+ } else {
+ VenPrint(SS_NVRAM_CHKSUM_MSG);
+ }
+ VenPrint(SS_PRESS_KEY2_MSG);
+ FwWaitForKeypress(TRUE);
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+