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 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 /* 30 * show.c: support for scadm show <variable> option (to show the value of 31 * a service processor NV variable) 32 */ 33 34 #include <libintl.h> 35 #include <stdio.h> 36 #include <string.h> 37 #include <time.h> /* required by librsc.h */ 38 39 #include "librsc.h" 40 #include "adm.h" 41 42 43 44 char *ADM_Get_Var(char *Variable); 45 46 static void ADM_Show_Var(char *Variable); 47 static int ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize); 48 static void command_line(); 49 50 51 void 52 ADM_Process_show(int argc, char *argv[]) 53 { 54 char *oldVar; 55 static char newVar[128]; 56 57 58 if ((argc != 2) && (argc != 3)) { 59 (void) fprintf(stderr, "\n%s\n\n", 60 gettext("USAGE: scadm show [variable]")); 61 exit(-1); 62 } 63 64 ADM_Start(); 65 66 if (argc == 2) { 67 oldVar = NULL; 68 newVar[0] = 0x0; 69 while (ADM_Get_Next_Var(oldVar, newVar, 128) == 0) { 70 ADM_Show_Var(newVar); 71 oldVar = newVar; 72 } 73 } else { 74 ADM_Show_Var(argv[2]); 75 } 76 } 77 78 void 79 ADM_Process_show_network() 80 { 81 rscp_msg_t Message; 82 struct timespec Timeout; 83 dp_get_network_cfg_r_t *netParams; 84 85 ADM_Start(); 86 87 Message.type = DP_GET_NETWORK_CFG; 88 Message.len = 0; 89 Message.data = NULL; 90 91 ADM_Send(&Message); 92 93 Timeout.tv_nsec = 0; 94 Timeout.tv_sec = ADM_TIMEOUT; 95 ADM_Recv(&Message, &Timeout, 96 DP_GET_NETWORK_CFG_R, sizeof (dp_get_network_cfg_r_t)); 97 98 netParams = (dp_get_network_cfg_r_t *)Message.data; 99 100 /* Print the network configuration */ 101 if (netParams->status != 0) { 102 (void) printf("%s \r\n", gettext("SC ethernet is disabled.")); 103 } else { 104 #if 0 105 /* Include this if we want to display the IP mode */ 106 (void) printf("%s %s\r\n", 107 gettext("SC network configuration is:"), 108 netParams->ipMode); 109 #endif 110 if (strcmp(netParams->ipMode, "dhcp") == 0) 111 (void) printf("%s %s\r\n", gettext("DHCP server:"), 112 netParams->ipDHCPServer); 113 (void) printf("%s %s\r\n", gettext("IP Address:"), 114 netParams->ipAddr); 115 (void) printf("%s %s\r\n", gettext("Gateway address:"), 116 netParams->ipGateway); 117 (void) printf("%s %s\r\n", gettext("Netmask:"), 118 netParams->ipMask); 119 (void) printf("%s %s\r\n", gettext("Ethernet address:"), 120 netParams->ethAddr); 121 } 122 123 ADM_Free(&Message); 124 125 } 126 127 char 128 *ADM_Get_Var(char *Variable) 129 { 130 rscp_msg_t Message; 131 struct timespec Timeout; 132 char *varValue; 133 134 varValue = NULL; 135 136 Message.type = DP_GET_CFGVAR; 137 Message.len = strlen(Variable) + 1; /* + 1 for string termination */ 138 if (Message.len > DP_MAX_MSGLEN-4) { 139 command_line(); 140 exit(-1); 141 } 142 143 Message.data = Variable; 144 ADM_Send(&Message); 145 146 Timeout.tv_nsec = 0; 147 Timeout.tv_sec = ADM_TIMEOUT; 148 ADM_Recv(&Message, &Timeout, 149 DP_GET_CFGVAR_R, sizeof (dp_get_cfgvar_r_t)); 150 151 if (*(int *)Message.data != 0) { 152 (void) fprintf(stderr, "\n%s - \"%s\"\n\n", 153 gettext("scadm: invalid variable"), Variable); 154 exit(-1); 155 } 156 157 /* show variable setting */ 158 /* The variable setting is right after the Status of the message */ 159 varValue = (char *)(&((char *)Message.data)[ 160 sizeof (dp_get_cfgvar_r_t)]); 161 162 ADM_Free(&Message); 163 164 return (varValue); 165 } 166 167 static void 168 ADM_Show_Var(char *Variable) 169 { 170 char *varValue; 171 172 varValue = ADM_Get_Var(Variable); 173 (void) printf("%s=\"%s\"\n", Variable, varValue); 174 (void) fflush(stdout); 175 } 176 177 static int 178 ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize) 179 { 180 rscp_msg_t Message; 181 struct timespec Timeout; 182 char *var; 183 184 185 Message.type = DP_GET_CFGVAR_NAME; 186 if (oldVar == NULL) 187 Message.len = 0; 188 else 189 Message.len = strlen(oldVar) + 1; /* + 1 for string */ 190 /* termination */ 191 192 if (Message.len > DP_MAX_MSGLEN-4) { 193 command_line(); 194 exit(-1); 195 } 196 197 Message.data = oldVar; 198 ADM_Send(&Message); 199 200 Timeout.tv_nsec = 0; 201 Timeout.tv_sec = ADM_TIMEOUT; 202 ADM_Recv(&Message, &Timeout, 203 DP_GET_CFGVAR_NAME_R, sizeof (dp_get_cfgvar_name_r_t)); 204 if (*(int *)Message.data != 0) { 205 /* Last variable read */ 206 return (-1); 207 } 208 209 /* The variable is right after the Status of the message */ 210 var = (char *)(&((char *)Message.data)[ 211 sizeof (dp_get_cfgvar_name_r_t)]); 212 (void) strncpy(newVar, var, maxSize); 213 214 ADM_Free(&Message); 215 216 return (0); 217 } 218 219 220 static void 221 command_line() 222 { 223 (void) fprintf(stderr, "\n%s\n\n", 224 gettext("scadm: command line too long")); 225 } 226