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
44char *ADM_Get_Var(char *Variable);
45
46static void ADM_Show_Var(char *Variable);
47static int ADM_Get_Next_Var(char *oldVar, char *newVar, int maxSize);
48static void command_line();
49
50
51void
52ADM_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
78void
79ADM_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
127char
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
167static void
168ADM_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
177static int
178ADM_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
220static void
221command_line()
222{
223	(void) fprintf(stderr, "\n%s\n\n",
224	    gettext("scadm: command line too long"));
225}
226