/*++ * * Copyright (c) 1994 FirePower Systems, Inc. * Copyright (c) 1995 FirePower Systems, Inc. * * $RCSfile: vrenv.c $ * $Revision: 1.13 $ * $Date: 1996/06/19 23:13:26 $ * $Locker: $ * Module Name: vrenv.c Abstract: This module contains environment variable functions. Author: A. Benjamin 9-May-1994 Revision History: 08-08-94 Shin Iwamoto at FirePower Systems Inc. Made OptionsPhandle global static, and set the vales in VrEnvInitialize. 07-21-94 Shin Iwamoto at FirePower Systems Inc. Added VrEnvInitialize(). --*/ #include "veneer.h" #define MAX_ARGC 16 #define MAX_ENVC 16 extern char *VrArgv[MAX_ARGC], *VrEnvp[MAX_ENVC]; STATIC phandle OptionsPhandle = 0; STATIC VOID VrEnvOpen(VOID); PCHAR FindInLocalEnv( PCHAR Variable ); PCHAR ConvertToUpper( PCHAR Orig ); PCHAR GetEnvVar( PCHAR Variable ); PCHAR VrCanonicalName( IN PCHAR Variable); PCHAR VrCanonicalName( IN PCHAR Variable ) { static char CanonicalName[32]; if (strlen(Variable) > 31) { fatal( "Veneer: Environment variable name %s is longer than 31 characters\n", Variable); } strcpy(CanonicalName, Variable); return (capitalize(CanonicalName)); } /* * * ROUTINE: VrGetEnvironmentVariable( PCHAR Variable ) * * DESCRIPTION: * Exported Interface to an arc program. This routine will check * the environment passed to the program for the variable before calling * back into the firmware. Since ARC enforces no case sensitivity on * variables, this routine will force all variables to upper case before * checking the local environment. * */ PCHAR VrGetEnvironmentVariable( IN PCHAR Variable ) { PCHAR Value = NULL; debug(VRDBG_ENV, "VrGetEnvironmentVariable: Entry - Variable: '%s'\n", Variable ? Variable : "NULL"); if ((Value = FindInLocalEnv(Variable)) == NULL) { Value = GetEnvVar(Variable); } debug(VRDBG_ENV, "VrGetEnvironmentVariable: Exit '%s'\n", Value ? Value : "NULL"); return Value; } ARC_STATUS VrSetEnvironmentVariable( IN PCHAR Variable, IN PCHAR Value ) { long retval; debug(VRDBG_ENV, "VrSetEnvironmentVariable: Entry - Variable: '%s' Value '%s'\n", Variable, Value); if (OptionsPhandle == 0) { VrEnvOpen(); } retval = OFSetprop(OptionsPhandle, VrCanonicalName(Variable), Value, strlen(Value)); retval = (retval != (long) strlen(Value)); debug(VRDBG_ENV, "VrGetEnvironmentVariable: Exit '%s'\n", retval); return retval; } /* * Name: VrEnvInitialize * * Description: * This function initializes the Environment entry points in the firmware * transfer vector and the file table. * * Arguments: * None. * * Return Value: * None. * */ VOID VrEnvInitialize(VOID) { // // Initialize the I/O entry points in the firmware transfer vector. // debug(VRDBG_ENTRY, "VrEnvInitialize: BEGIN......\n"); (PARC_GET_ENVIRONMENT_ROUTINE) SYSTEM_BLOCK->FirmwareVector[GetEnvironmentRoutine] = VrGetEnvironmentVariable; (PARC_SET_ENVIRONMENT_ROUTINE) SYSTEM_BLOCK->FirmwareVector[SetEnvironmentRoutine] = VrSetEnvironmentVariable; debug(VRDBG_ENTRY, "VrEnvInitialize: .....END\n"); } /* * Name: VrEnvOpen * * Description: * This function gets the phandle for the Open Firmware options node * so that Open Firmware configuration variables can be later accessed. * * Arguments: * None. * * Return Value: * None. * */ STATIC VOID VrEnvOpen(VOID) { OptionsPhandle = OFFinddevice("/options"); if (OptionsPhandle == 0) { fatal("Veneer: Cannot access /options\n"); } } /* * ROUTINE: FindInLocalEnv( PCHAR Variable ) * * DESCRIPTION: * Force the passed in variable to upper case, check the local environ- * ment array for this variable and return it's contents if found. Assume * that the environment array is all upper case, at least for the key. * * RETURN: * returns a pointer to data of type CHAR. Null if no var found. */ PCHAR FindInLocalEnv( IN PCHAR Variable ) { PCHAR Value = NULL; PCHAR alpha; ULONG count=0,i=0; // // set the incoming variable to all upper case... // alpha = VrCanonicalName(Variable); debug(VRDBG_ENV, "FindInLocalEnv: Entry - Variable: '%s'\n",alpha); // // Run through the VrEnvp array looking for a match. Since the VrEnvp // array should all be upper case values, we shouldn't need to worry // about case. // while( VrEnvp[count] && *(VrEnvp[count]) ){ // Compare the capitalized version of the Variable passed in with // each entry in the VrEnvp array for a length equal to the Variable // less the null terminator. // if (!strncmp(VrEnvp[count], alpha, (strlen(alpha)-1))) { // we've found our match. Now return pointer to this value return(VrEnvp[count]+strlen(alpha)); } // // reset and try again // count++; } // // if we fall out of the loop, it's because we didn't match anything. // return((PCHAR)NULL); } /* * ROUTINE: GetEnvVar( PCHAR Variable ) * * DESCRIPTION: * This call is an internal only call that actually delves into the * OpenFirmware to retrieve a value. * * RETURN: * returns a pointer to data of type CHAR. Null if no var found. The * returned value is the contents of the variable found. */ PCHAR GetEnvVar( IN PCHAR Variable ) { PCHAR Value = NULL; debug(VRDBG_ENV, "GetEnvVar: Entry - Variable: '%s'\n",Variable); if (OptionsPhandle == 0) { VrEnvOpen(); } Value= get_str_prop(OptionsPhandle, VrCanonicalName(Variable), NOALLOC); return Value; }