diff options
Diffstat (limited to 'usr/src/cmd/scadm/sparc/mpxu/common/show.c')
| -rw-r--r-- | usr/src/cmd/scadm/sparc/mpxu/common/show.c | 225 | 
1 files changed, 225 insertions, 0 deletions
| diff --git a/usr/src/cmd/scadm/sparc/mpxu/common/show.c b/usr/src/cmd/scadm/sparc/mpxu/common/show.c new file mode 100644 index 0000000000..18c2dbbf5a --- /dev/null +++ b/usr/src/cmd/scadm/sparc/mpxu/common/show.c @@ -0,0 +1,225 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License").  You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2002 Sun Microsystems, Inc.  All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident	"%Z%%M%	%I%	%E% SMI" + +/* + * show.c: support for scadm show <variable> option (to show the value of + * a service processor NV variable) + */ + +#include <libintl.h> +#include <stdio.h> +#include <string.h> +#include <time.h>  /* required by librsc.h */ + +#include "librsc.h" +#include "adm.h" + + + +char *ADM_Get_Var(char *Variable); + +static void ADM_Show_Var(char *Variable); +static int ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize); +static void command_line(); + + +void +ADM_Process_show(int argc, char *argv[]) +{ +	char		*oldVar; +	static char	newVar[128]; + + +	if ((argc != 2) && (argc != 3)) { +		(void) fprintf(stderr, "\n%s\n\n", +		    gettext("USAGE: scadm show [variable]")); +		exit(-1); +	} + +	ADM_Start(); + +	if (argc == 2) { +		oldVar = NULL; +		newVar[0] = 0x0; +		while (ADM_Get_Next_Var(oldVar, newVar, 128) == 0) { +			ADM_Show_Var(newVar); +			oldVar = newVar; +		} +	} else { +		ADM_Show_Var(argv[2]); +	} +} + +void +ADM_Process_show_network() +{ +	rscp_msg_t		Message; +	struct timespec		Timeout; +	dp_get_network_cfg_r_t	*netParams; + +	ADM_Start(); + +	Message.type = DP_GET_NETWORK_CFG; +	Message.len = 0; +	Message.data = NULL; + +	ADM_Send(&Message); + +	Timeout.tv_nsec = 0; +	Timeout.tv_sec = ADM_TIMEOUT; +	ADM_Recv(&Message, &Timeout, +	    DP_GET_NETWORK_CFG_R, sizeof (dp_get_network_cfg_r_t)); + +	netParams = (dp_get_network_cfg_r_t *)Message.data; + +	/* Print the network configuration */ +	if (netParams->status != 0) { +		(void) printf("%s \r\n", gettext("SC ethernet is disabled.")); +	} else { +#if 0 +		/* Include this if we want to display the IP mode */ +		(void) printf("%s %s\r\n", +		    gettext("SC network configuration is:"), +		    netParams->ipMode); +#endif +	if (strcmp(netParams->ipMode, "dhcp") == 0) +		(void) printf("%s %s\r\n", gettext("DHCP server:"), +		    netParams->ipDHCPServer); +		(void) printf("%s %s\r\n", gettext("IP Address:"), +		    netParams->ipAddr); +		(void) printf("%s %s\r\n", gettext("Gateway address:"), +		    netParams->ipGateway); +		(void) printf("%s %s\r\n", gettext("Netmask:"), +		    netParams->ipMask); +		(void) printf("%s %s\r\n", gettext("Ethernet address:"), +		    netParams->ethAddr); +	} + +	ADM_Free(&Message); + +} + +char +*ADM_Get_Var(char *Variable) +{ +	rscp_msg_t	Message; +	struct timespec	Timeout; +	char		*varValue; + +	varValue = NULL; + +	Message.type = DP_GET_CFGVAR; +	Message.len = strlen(Variable) + 1; /* + 1 for string termination */ +	if (Message.len > DP_MAX_MSGLEN-4) { +		command_line(); +		exit(-1); +	} + +	Message.data = Variable; +	ADM_Send(&Message); + +	Timeout.tv_nsec = 0; +	Timeout.tv_sec = ADM_TIMEOUT; +	ADM_Recv(&Message, &Timeout, +	    DP_GET_CFGVAR_R, sizeof (dp_get_cfgvar_r_t)); + +	if (*(int *)Message.data != 0) { +		(void) fprintf(stderr, "\n%s - \"%s\"\n\n", +		    gettext("scadm: invalid variable"), Variable); +		exit(-1); +	} + +	/* show variable setting */ +	/* The variable setting is right after the Status of the message */ +	varValue = (char *)(&((char *)Message.data)[ +	    sizeof (dp_get_cfgvar_r_t)]); + +	ADM_Free(&Message); + +	return (varValue); +} + +static void +ADM_Show_Var(char *Variable) +{ +	char *varValue; + +	varValue = ADM_Get_Var(Variable); +	(void) printf("%s=\"%s\"\n", Variable, varValue); +	(void) fflush(stdout); +} + +static int +ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize) +{ +	rscp_msg_t	Message; +	struct timespec	Timeout; +	char		*var; + + +	Message.type = DP_GET_CFGVAR_NAME; +	if (oldVar == NULL) +		Message.len = 0; +	else +		Message.len  = strlen(oldVar) + 1;	/* + 1 for string */ +							/* termination */ + +	if (Message.len > DP_MAX_MSGLEN-4) { +		command_line(); +		exit(-1); +	} + +	Message.data = oldVar; +	ADM_Send(&Message); + +	Timeout.tv_nsec = 0; +	Timeout.tv_sec  = ADM_TIMEOUT; +	ADM_Recv(&Message, &Timeout, +	    DP_GET_CFGVAR_NAME_R, sizeof (dp_get_cfgvar_name_r_t)); +	if (*(int *)Message.data != 0) { +		/* Last variable read */ +		return (-1); +	} + +	/* The variable is right after the Status of the message */ +	var = (char *)(&((char *)Message.data)[ +	    sizeof (dp_get_cfgvar_name_r_t)]); +	(void) strncpy(newVar, var, maxSize); + +	ADM_Free(&Message); + +	return (0); +} + + +static void +command_line() +{ +	(void) fprintf(stderr, "\n%s\n\n", +	    gettext("scadm: command line too long")); +} | 
