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