summaryrefslogblamecommitdiffstats
path: root/private/ntos/boot/veneer/vrenv.c
blob: 5f8a4a9e35789003d7129c4f54f109b4b8cf3cce (plain) (tree)





























































































































































































































































                                                                                            
/*++
 *
 * 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;
}