/* * 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. */ /* * show.c: support for scadm show option (to show the value of * a service processor NV variable) */ #include #include #include #include /* 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")); }