1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2002 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * show.c: support for scadm show <variable> option (to show the value of 29 * a service processor NV variable) 30 */ 31 32 #include <libintl.h> 33 #include <stdio.h> 34 #include <string.h> 35 #include <time.h> /* required by librsc.h */ 36 37 #include "librsc.h" 38 #include "adm.h" 39 40 41 42 char *ADM_Get_Var(char *Variable); 43 44 static void ADM_Show_Var(char *Variable); 45 static int ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize); 46 static void command_line(); 47 48 49 void 50 ADM_Process_show(int argc, char *argv[]) 51 { 52 char *oldVar; 53 static char newVar[128]; 54 55 56 if ((argc != 2) && (argc != 3)) { 57 (void) fprintf(stderr, "\n%s\n\n", 58 gettext("USAGE: scadm show [variable]")); 59 exit(-1); 60 } 61 62 ADM_Start(); 63 64 if (argc == 2) { 65 oldVar = NULL; 66 newVar[0] = 0x0; 67 while (ADM_Get_Next_Var(oldVar, newVar, 128) == 0) { 68 ADM_Show_Var(newVar); 69 oldVar = newVar; 70 } 71 } else { 72 ADM_Show_Var(argv[2]); 73 } 74 } 75 76 void 77 ADM_Process_show_network() 78 { 79 rscp_msg_t Message; 80 struct timespec Timeout; 81 dp_get_network_cfg_r_t *netParams; 82 83 ADM_Start(); 84 85 Message.type = DP_GET_NETWORK_CFG; 86 Message.len = 0; 87 Message.data = NULL; 88 89 ADM_Send(&Message); 90 91 Timeout.tv_nsec = 0; 92 Timeout.tv_sec = ADM_TIMEOUT; 93 ADM_Recv(&Message, &Timeout, 94 DP_GET_NETWORK_CFG_R, sizeof (dp_get_network_cfg_r_t)); 95 96 netParams = (dp_get_network_cfg_r_t *)Message.data; 97 98 /* Print the network configuration */ 99 if (netParams->status != 0) { 100 (void) printf("%s \r\n", gettext("SC ethernet is disabled.")); 101 } else { 102 #if 0 103 /* Include this if we want to display the IP mode */ 104 (void) printf("%s %s\r\n", 105 gettext("SC network configuration is:"), 106 netParams->ipMode); 107 #endif 108 if (strcmp(netParams->ipMode, "dhcp") == 0) { 109 (void) printf("%s %s\r\n", gettext("DHCP server:"), 110 netParams->ipDHCPServer); 111 } 112 (void) printf("%s %s\r\n", gettext("IP Address:"), 113 netParams->ipAddr); 114 (void) printf("%s %s\r\n", gettext("Gateway address:"), 115 netParams->ipGateway); 116 (void) printf("%s %s\r\n", gettext("Netmask:"), 117 netParams->ipMask); 118 (void) printf("%s %s\r\n", gettext("Ethernet address:"), 119 netParams->ethAddr); 120 } 121 122 ADM_Free(&Message); 123 124 } 125 126 char 127 *ADM_Get_Var(char *Variable) 128 { 129 rscp_msg_t Message; 130 struct timespec Timeout; 131 char *varValue; 132 133 varValue = NULL; 134 135 Message.type = DP_GET_CFGVAR; 136 Message.len = strlen(Variable) + 1; /* + 1 for string termination */ 137 if (Message.len > DP_MAX_MSGLEN-4) { 138 command_line(); 139 exit(-1); 140 } 141 142 Message.data = Variable; 143 ADM_Send(&Message); 144 145 Timeout.tv_nsec = 0; 146 Timeout.tv_sec = ADM_TIMEOUT; 147 ADM_Recv(&Message, &Timeout, 148 DP_GET_CFGVAR_R, sizeof (dp_get_cfgvar_r_t)); 149 150 if (*(int *)Message.data != 0) { 151 (void) fprintf(stderr, "\n%s - \"%s\"\n\n", 152 gettext("scadm: invalid variable"), Variable); 153 exit(-1); 154 } 155 156 /* show variable setting */ 157 /* The variable setting is right after the Status of the message */ 158 varValue = (char *)(&((char *)Message.data)[ 159 sizeof (dp_get_cfgvar_r_t)]); 160 161 ADM_Free(&Message); 162 163 return (varValue); 164 } 165 166 static void 167 ADM_Show_Var(char *Variable) 168 { 169 char *varValue; 170 171 varValue = ADM_Get_Var(Variable); 172 (void) printf("%s=\"%s\"\n", Variable, varValue); 173 (void) fflush(stdout); 174 } 175 176 static int 177 ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize) 178 { 179 rscp_msg_t Message; 180 struct timespec Timeout; 181 char *var; 182 183 184 Message.type = DP_GET_CFGVAR_NAME; 185 if (oldVar == NULL) 186 Message.len = 0; 187 else 188 Message.len = strlen(oldVar) + 1; /* + 1 for string */ 189 /* termination */ 190 191 if (Message.len > DP_MAX_MSGLEN-4) { 192 command_line(); 193 exit(-1); 194 } 195 196 Message.data = oldVar; 197 ADM_Send(&Message); 198 199 Timeout.tv_nsec = 0; 200 Timeout.tv_sec = ADM_TIMEOUT; 201 ADM_Recv(&Message, &Timeout, 202 DP_GET_CFGVAR_NAME_R, sizeof (dp_get_cfgvar_name_r_t)); 203 if (*(int *)Message.data != 0) { 204 /* Last variable read */ 205 return (-1); 206 } 207 208 /* The variable is right after the Status of the message */ 209 var = (char *)(&((char *)Message.data)[ 210 sizeof (dp_get_cfgvar_name_r_t)]); 211 (void) strncpy(newVar, var, maxSize); 212 213 ADM_Free(&Message); 214 215 return (0); 216 } 217 218 219 static void 220 command_line() 221 { 222 (void) fprintf(stderr, "\n%s\n\n", 223 gettext("scadm: command line too long")); 224 } 225