xref: /onnv-gate/usr/src/cmd/scadm/sparc/mpxu/common/user.c (revision 1708:ea74d8598a3a)
1*1708Sstevel /*
2*1708Sstevel  * CDDL HEADER START
3*1708Sstevel  *
4*1708Sstevel  * The contents of this file are subject to the terms of the
5*1708Sstevel  * Common Development and Distribution License, Version 1.0 only
6*1708Sstevel  * (the "License").  You may not use this file except in compliance
7*1708Sstevel  * with the License.
8*1708Sstevel  *
9*1708Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*1708Sstevel  * or http://www.opensolaris.org/os/licensing.
11*1708Sstevel  * See the License for the specific language governing permissions
12*1708Sstevel  * and limitations under the License.
13*1708Sstevel  *
14*1708Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
15*1708Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*1708Sstevel  * If applicable, add the following below this CDDL HEADER, with the
17*1708Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
18*1708Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
19*1708Sstevel  *
20*1708Sstevel  * CDDL HEADER END
21*1708Sstevel  */
22*1708Sstevel /*
23*1708Sstevel  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
24*1708Sstevel  * Use is subject to license terms.
25*1708Sstevel  */
26*1708Sstevel 
27*1708Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*1708Sstevel 
29*1708Sstevel /*
30*1708Sstevel  * user.c: support for the scadm useradd, userdel, usershow, userpassword,
31*1708Sstevel  * userperm options (administration of service processor users)
32*1708Sstevel  */
33*1708Sstevel 
34*1708Sstevel #include <libintl.h>
35*1708Sstevel #include <signal.h>
36*1708Sstevel #include <stdio.h>
37*1708Sstevel #include <string.h>
38*1708Sstevel #include <termios.h>
39*1708Sstevel #include <time.h>  /* required by librsc.h */
40*1708Sstevel 
41*1708Sstevel #include "librsc.h"
42*1708Sstevel #include "adm.h"
43*1708Sstevel 
44*1708Sstevel 
45*1708Sstevel static void ADM_Get_Password(char  *password);
46*1708Sstevel static void ADM_Destroy_Password(char  *password);
47*1708Sstevel static void max_username();
48*1708Sstevel static void malformed_username();
49*1708Sstevel static void wrong_response();
50*1708Sstevel static void no_user();
51*1708Sstevel static void no_info();
52*1708Sstevel static void userperm_usage();
53*1708Sstevel static void show_header();
54*1708Sstevel static void cleanup();
55*1708Sstevel 
56*1708Sstevel 
57*1708Sstevel /* Globals so that exit routine can clean up echo */
58*1708Sstevel static int		echoOff = 0;
59*1708Sstevel static struct termios	oldOpts;
60*1708Sstevel 
61*1708Sstevel typedef union {
62*1708Sstevel 	char	DataBuffer[DP_MAX_MSGLEN];
63*1708Sstevel 	void	*DataBuffer_p;
64*1708Sstevel } data_buffer_t;
65*1708Sstevel 
66*1708Sstevel 
67*1708Sstevel void
ADM_Process_useradd(int argc,char * argv[])68*1708Sstevel ADM_Process_useradd(int argc, char *argv[])
69*1708Sstevel {
70*1708Sstevel 	static data_buffer_t	dataBuffer;
71*1708Sstevel 	rscp_msg_t		Message;
72*1708Sstevel 	struct timespec		Timeout;
73*1708Sstevel 	dp_user_adm_t		*admMessage;
74*1708Sstevel 	dp_user_adm_r_t		*admResponse;
75*1708Sstevel 	char			*userName;
76*1708Sstevel 
77*1708Sstevel 
78*1708Sstevel 	if (argc != 3) {
79*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
80*1708Sstevel 		    gettext("USAGE: scadm useradd <username>"));
81*1708Sstevel 		exit(-1);
82*1708Sstevel 	}
83*1708Sstevel 
84*1708Sstevel 	ADM_Start();
85*1708Sstevel 
86*1708Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
87*1708Sstevel 		max_username();
88*1708Sstevel 		exit(-1);
89*1708Sstevel 	}
90*1708Sstevel 
91*1708Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
92*1708Sstevel 	userName   = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
93*1708Sstevel 	admMessage->command = DP_USER_CMD_ADD;
94*1708Sstevel 	(void) strcpy(userName, argv[2]);
95*1708Sstevel 
96*1708Sstevel 	Message.type = DP_USER_ADM;
97*1708Sstevel 	Message.len  = sizeof (dp_user_adm_t) + strlen(userName) + 1;
98*1708Sstevel 	Message.data = admMessage;
99*1708Sstevel 	ADM_Send(&Message);
100*1708Sstevel 
101*1708Sstevel 	Timeout.tv_nsec = 0;
102*1708Sstevel 	Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
103*1708Sstevel 	ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
104*1708Sstevel 
105*1708Sstevel 	admResponse = (dp_user_adm_r_t *)Message.data;
106*1708Sstevel 	if (admResponse->command != DP_USER_CMD_ADD) {
107*1708Sstevel 		wrong_response();
108*1708Sstevel 		exit(-1);
109*1708Sstevel 	}
110*1708Sstevel 
111*1708Sstevel 	if (admResponse->status == DP_ERR_USER_FULL) {
112*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
113*1708Sstevel 		    gettext("scadm: all user slots are full"));
114*1708Sstevel 		exit(-1);
115*1708Sstevel 	} else if (admResponse->status == DP_ERR_USER_THERE) {
116*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
117*1708Sstevel 		    gettext("scadm: user already exists"));
118*1708Sstevel 		exit(-1);
119*1708Sstevel 	} else if (admResponse->status == DP_ERR_USER_WARNING) {
120*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
121*1708Sstevel 		    gettext("scadm: username did not start with letter\n"
122*1708Sstevel 		    "        or did not contain lower case letter\n"));
123*1708Sstevel 		exit(-1);
124*1708Sstevel 	} else if (admResponse->status == DP_ERR_USER_BAD) {
125*1708Sstevel 		malformed_username();
126*1708Sstevel 		exit(-1);
127*1708Sstevel 	} else if (admResponse->status != 0) {
128*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
129*1708Sstevel 		    gettext("scadm: couldn't add user"));
130*1708Sstevel 		exit(-1);
131*1708Sstevel 	}
132*1708Sstevel 
133*1708Sstevel 	ADM_Free(&Message);
134*1708Sstevel }
135*1708Sstevel 
136*1708Sstevel 
137*1708Sstevel void
ADM_Process_userdel(int argc,char * argv[])138*1708Sstevel ADM_Process_userdel(int argc, char *argv[])
139*1708Sstevel {
140*1708Sstevel 	static data_buffer_t	dataBuffer;
141*1708Sstevel 	rscp_msg_t		Message;
142*1708Sstevel 	struct timespec		Timeout;
143*1708Sstevel 	dp_user_adm_t		*admMessage;
144*1708Sstevel 	dp_user_adm_r_t		*admResponse;
145*1708Sstevel 	char			*userName;
146*1708Sstevel 
147*1708Sstevel 
148*1708Sstevel 	if (argc != 3) {
149*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
150*1708Sstevel 		    gettext("USAGE: scadm userdel <username>"));
151*1708Sstevel 		exit(-1);
152*1708Sstevel 	}
153*1708Sstevel 
154*1708Sstevel 	ADM_Start();
155*1708Sstevel 
156*1708Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
157*1708Sstevel 		max_username();
158*1708Sstevel 		exit(-1);
159*1708Sstevel 	}
160*1708Sstevel 
161*1708Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
162*1708Sstevel 	userName   = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
163*1708Sstevel 	admMessage->command = DP_USER_CMD_DEL;
164*1708Sstevel 	(void) strcpy(userName, argv[2]);
165*1708Sstevel 
166*1708Sstevel 	Message.type = DP_USER_ADM;
167*1708Sstevel 	Message.len  = sizeof (dp_user_adm_t) + strlen(userName) + 1;
168*1708Sstevel 	Message.data = admMessage;
169*1708Sstevel 	ADM_Send(&Message);
170*1708Sstevel 
171*1708Sstevel 	Timeout.tv_nsec = 0;
172*1708Sstevel 	Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
173*1708Sstevel 	ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
174*1708Sstevel 
175*1708Sstevel 	admResponse = (dp_user_adm_r_t *)Message.data;
176*1708Sstevel 	if (admResponse->command != DP_USER_CMD_DEL) {
177*1708Sstevel 		wrong_response();
178*1708Sstevel 		exit(-1);
179*1708Sstevel 	}
180*1708Sstevel 
181*1708Sstevel 	if (admResponse->status == DP_ERR_USER_NONE) {
182*1708Sstevel 		no_user();
183*1708Sstevel 		exit(-1);
184*1708Sstevel 	} else if (admResponse->status == DP_ERR_USER_BAD) {
185*1708Sstevel 		malformed_username();
186*1708Sstevel 		exit(-1);
187*1708Sstevel 	} else if (admResponse->status != 0) {
188*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
189*1708Sstevel 		    gettext("scadm: couldn't delete user"));
190*1708Sstevel 		exit(-1);
191*1708Sstevel 	}
192*1708Sstevel 
193*1708Sstevel 	ADM_Free(&Message);
194*1708Sstevel }
195*1708Sstevel 
196*1708Sstevel 
197*1708Sstevel void
ADM_Process_usershow(int argc,char * argv[])198*1708Sstevel ADM_Process_usershow(int argc, char *argv[])
199*1708Sstevel {
200*1708Sstevel 	static data_buffer_t	dataBuffer;
201*1708Sstevel 	rscp_msg_t		Message;
202*1708Sstevel 	struct timespec		Timeout;
203*1708Sstevel 	dp_user_adm_t		*admMessage;
204*1708Sstevel 	dp_user_adm_r_t		*admResponse;
205*1708Sstevel 	char			*userName;
206*1708Sstevel 	char			*permissions;
207*1708Sstevel 	char			*passwd;
208*1708Sstevel 	int			index;
209*1708Sstevel 
210*1708Sstevel 
211*1708Sstevel 
212*1708Sstevel 	if ((argc != 2) && (argc != 3)) {
213*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
214*1708Sstevel 		    gettext("USAGE: scadm usershow [username]"));
215*1708Sstevel 		exit(-1);
216*1708Sstevel 	}
217*1708Sstevel 
218*1708Sstevel 	ADM_Start();
219*1708Sstevel 
220*1708Sstevel 	if (argc == 3) {
221*1708Sstevel 		admMessage = (dp_user_adm_t *)&dataBuffer;
222*1708Sstevel 		admMessage->command = DP_USER_CMD_SHOW;
223*1708Sstevel 		Message.type = DP_USER_ADM;
224*1708Sstevel 		Message.data = admMessage;
225*1708Sstevel 
226*1708Sstevel 		if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
227*1708Sstevel 			max_username();
228*1708Sstevel 			exit(-1);
229*1708Sstevel 		}
230*1708Sstevel 		userName = (char *)(&((char *)admMessage)[
231*1708Sstevel 		    sizeof (dp_user_adm_t)]);
232*1708Sstevel 		(void) strcpy(userName, argv[2]);
233*1708Sstevel 		admMessage->parm = DP_USER_SHOW_USERNAME;
234*1708Sstevel 		Message.len = sizeof (dp_user_adm_t) + strlen(userName) + 1;
235*1708Sstevel 		ADM_Send(&Message);
236*1708Sstevel 
237*1708Sstevel 		Timeout.tv_nsec = 0;
238*1708Sstevel 		Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
239*1708Sstevel 		ADM_Recv(&Message, &Timeout,
240*1708Sstevel 		    DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
241*1708Sstevel 
242*1708Sstevel 		admResponse = (dp_user_adm_r_t *)Message.data;
243*1708Sstevel 		if (admResponse->command != DP_USER_CMD_SHOW) {
244*1708Sstevel 			wrong_response();
245*1708Sstevel 			exit(-1);
246*1708Sstevel 		}
247*1708Sstevel 
248*1708Sstevel 		if (admResponse->status == DP_ERR_USER_NONE) {
249*1708Sstevel 			no_user();
250*1708Sstevel 			exit(-1);
251*1708Sstevel 		} else if (admResponse->status == DP_ERR_USER_BAD) {
252*1708Sstevel 			malformed_username();
253*1708Sstevel 			exit(-1);
254*1708Sstevel 		} else if (admResponse->status != 0) {
255*1708Sstevel 			no_info();
256*1708Sstevel 			exit(-1);
257*1708Sstevel 		}
258*1708Sstevel 
259*1708Sstevel 		userName = &(((char *)admResponse)[
260*1708Sstevel 		    sizeof (dp_user_adm_r_t)]);
261*1708Sstevel 		permissions = &userName[strlen(userName)+1];
262*1708Sstevel 		passwd = &permissions[strlen(permissions)+1];
263*1708Sstevel 		show_header();
264*1708Sstevel 		(void) printf(" %-16s    %-15s    ", userName, permissions);
265*1708Sstevel 		if (strncmp(passwd, "Assigned", 12) == 0) {
266*1708Sstevel 			(void) printf("%s\n\n", gettext("Assigned"));
267*1708Sstevel 		} else if (strncmp(passwd, "None", 12) == 0) {
268*1708Sstevel 			(void) printf("%s\n\n", gettext("None"));
269*1708Sstevel 		} else {
270*1708Sstevel 			(void) printf("%-12s\n\n", passwd);
271*1708Sstevel 		}
272*1708Sstevel 		ADM_Free(&Message);
273*1708Sstevel 	} else {
274*1708Sstevel 		show_header();
275*1708Sstevel 		for (index = 1; index <= DP_USER_MAX; index++) {
276*1708Sstevel 			admMessage = (dp_user_adm_t *)&dataBuffer;
277*1708Sstevel 			admMessage->command = DP_USER_CMD_SHOW;
278*1708Sstevel 			admMessage->parm    = index;
279*1708Sstevel 
280*1708Sstevel 			Message.type = DP_USER_ADM;
281*1708Sstevel 			Message.data = admMessage;
282*1708Sstevel 			Message.len  = sizeof (dp_user_adm_t);
283*1708Sstevel 			ADM_Send(&Message);
284*1708Sstevel 
285*1708Sstevel 			Timeout.tv_nsec = 0;
286*1708Sstevel 			Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
287*1708Sstevel 			ADM_Recv(&Message, &Timeout,
288*1708Sstevel 			    DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
289*1708Sstevel 
290*1708Sstevel 			admResponse = (dp_user_adm_r_t *)Message.data;
291*1708Sstevel 			if (admResponse->command != DP_USER_CMD_SHOW) {
292*1708Sstevel 				wrong_response();
293*1708Sstevel 				exit(-1);
294*1708Sstevel 			}
295*1708Sstevel 
296*1708Sstevel 			if (admResponse->status == DP_ERR_USER_NONE) {
297*1708Sstevel 				ADM_Free(&Message);
298*1708Sstevel 				continue;
299*1708Sstevel 			} else if (admResponse->status == DP_ERR_USER_BAD) {
300*1708Sstevel 				malformed_username();
301*1708Sstevel 				exit(-1);
302*1708Sstevel 			} else if (admResponse->status != 0) {
303*1708Sstevel 				no_info();
304*1708Sstevel 				exit(-1);
305*1708Sstevel 			}
306*1708Sstevel 
307*1708Sstevel 			userName = &(((char *)admResponse)[
308*1708Sstevel 			    sizeof (dp_user_adm_r_t)]);
309*1708Sstevel 			permissions = &userName[strlen(userName)+1];
310*1708Sstevel 			passwd = &permissions[strlen(permissions)+1];
311*1708Sstevel 			(void) printf(" %-16s    %-15s    ",
312*1708Sstevel 			    userName, permissions);
313*1708Sstevel 			if (strncmp(passwd, "Assigned", 12) == 0) {
314*1708Sstevel 				(void) printf("%s\n", gettext("Assigned"));
315*1708Sstevel 			} else if (strncmp(passwd, "None", 12) == 0) {
316*1708Sstevel 				(void) printf("%s\n", gettext("None"));
317*1708Sstevel 			} else {
318*1708Sstevel 				(void) printf("%-12s\n", passwd);
319*1708Sstevel 			}
320*1708Sstevel 
321*1708Sstevel 			ADM_Free(&Message);
322*1708Sstevel 		}
323*1708Sstevel 		(void) printf("\n");
324*1708Sstevel 	}
325*1708Sstevel }
326*1708Sstevel 
327*1708Sstevel 
328*1708Sstevel void
ADM_Process_userpassword(int argc,char * argv[])329*1708Sstevel ADM_Process_userpassword(int argc, char *argv[])
330*1708Sstevel {
331*1708Sstevel 	static data_buffer_t	dataBuffer;
332*1708Sstevel 	rscp_msg_t		Message;
333*1708Sstevel 	struct timespec		Timeout;
334*1708Sstevel 	dp_user_adm_t		*admMessage;
335*1708Sstevel 	dp_user_adm_r_t		*admResponse;
336*1708Sstevel 	char			*userName;
337*1708Sstevel 	char			*password;
338*1708Sstevel 	int			passTry;
339*1708Sstevel 
340*1708Sstevel 
341*1708Sstevel 	/* Try to set password up to 3 times on Malformed password */
342*1708Sstevel 	passTry = 3;
343*1708Sstevel 
344*1708Sstevel 	if (argc != 3) {
345*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
346*1708Sstevel 		    gettext("USAGE: scadm userpassword <username>"));
347*1708Sstevel 		exit(-1);
348*1708Sstevel 	}
349*1708Sstevel 
350*1708Sstevel 	ADM_Start();
351*1708Sstevel 
352*1708Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
353*1708Sstevel 		max_username();
354*1708Sstevel 		exit(-1);
355*1708Sstevel 	}
356*1708Sstevel 
357*1708Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
358*1708Sstevel 	admMessage->command = DP_USER_CMD_PASSWORD;
359*1708Sstevel 	userName = (&((char *)admMessage)[sizeof (dp_user_adm_t)]);
360*1708Sstevel 	(void) strcpy(userName, argv[2]);
361*1708Sstevel 	password = (&((char *)admMessage)[sizeof (dp_user_adm_t) +
362*1708Sstevel 	    strlen(userName) + 1]);
363*1708Sstevel 
364*1708Sstevel 	for (;;) {
365*1708Sstevel 		ADM_Get_Password(password);
366*1708Sstevel 
367*1708Sstevel 		Message.type = DP_USER_ADM;
368*1708Sstevel 		Message.len  = sizeof (dp_user_adm_t) + strlen(userName) +
369*1708Sstevel 		    strlen(password) + 2;
370*1708Sstevel 		Message.data = admMessage;
371*1708Sstevel 		ADM_Send(&Message);
372*1708Sstevel 
373*1708Sstevel 		ADM_Destroy_Password(password);
374*1708Sstevel 		Timeout.tv_nsec = 0;
375*1708Sstevel 		Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
376*1708Sstevel 		ADM_Recv(&Message, &Timeout,
377*1708Sstevel 		    DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
378*1708Sstevel 
379*1708Sstevel 		admResponse = (dp_user_adm_r_t *)Message.data;
380*1708Sstevel 		if (admResponse->command != DP_USER_CMD_PASSWORD) {
381*1708Sstevel 			wrong_response();
382*1708Sstevel 			exit(-1);
383*1708Sstevel 		}
384*1708Sstevel 
385*1708Sstevel 		if (admResponse->status == DP_ERR_USER_NONE) {
386*1708Sstevel 			no_user();
387*1708Sstevel 			exit(-1);
388*1708Sstevel 		} else if (admResponse->status == DP_ERR_USER_BAD) {
389*1708Sstevel 			malformed_username();
390*1708Sstevel 			exit(-1);
391*1708Sstevel 		} else if (admResponse->status == DP_ERR_USER_PASSWD) {
392*1708Sstevel 			(void) fprintf(stderr, "\n%s\n\n",
393*1708Sstevel 			    gettext("scadm: malformed password\n"
394*1708Sstevel 			    "        A valid password is between 6 and 8 "
395*1708Sstevel 			    "characters,\n"
396*1708Sstevel 			    "        has at least two alphabetic characters, "
397*1708Sstevel 			    "and at\n"
398*1708Sstevel 			    "        least one numeric or special character. "
399*1708Sstevel 			    "The\n"
400*1708Sstevel 			    "        password must differ from the user's "
401*1708Sstevel 			    "login name\n"
402*1708Sstevel 			    "        and any reverse or circular shift of that "
403*1708Sstevel 			    "login\n"
404*1708Sstevel 			    "        name.\n"));
405*1708Sstevel 			passTry--;
406*1708Sstevel 			if (passTry > 0) {
407*1708Sstevel 				ADM_Free(&Message);
408*1708Sstevel 				continue;
409*1708Sstevel 			} else
410*1708Sstevel 				exit(-1);
411*1708Sstevel 		} else if (admResponse->status != 0) {
412*1708Sstevel 			(void) fprintf(stderr, "\n%s\n\n",
413*1708Sstevel 			    gettext("scadm: couldn't change password"));
414*1708Sstevel 			exit(-1);
415*1708Sstevel 		}
416*1708Sstevel 
417*1708Sstevel 		/* password was changed successfully, get out of while */
418*1708Sstevel 		break;
419*1708Sstevel 	}
420*1708Sstevel 
421*1708Sstevel 	ADM_Free(&Message);
422*1708Sstevel }
423*1708Sstevel 
424*1708Sstevel 
425*1708Sstevel void
ADM_Process_userperm(int argc,char * argv[])426*1708Sstevel ADM_Process_userperm(int argc, char *argv[])
427*1708Sstevel {
428*1708Sstevel 	static data_buffer_t	dataBuffer;
429*1708Sstevel 	rscp_msg_t		Message;
430*1708Sstevel 	struct timespec		Timeout;
431*1708Sstevel 	dp_user_adm_t		*admMessage;
432*1708Sstevel 	dp_user_adm_r_t		*admResponse;
433*1708Sstevel 	char			*userName;
434*1708Sstevel 	int			permissions;
435*1708Sstevel 	int			index;
436*1708Sstevel 
437*1708Sstevel 
438*1708Sstevel 	if ((argc != 3) && (argc != 4)) {
439*1708Sstevel 		userperm_usage();
440*1708Sstevel 		exit(-1);
441*1708Sstevel 	}
442*1708Sstevel 
443*1708Sstevel 	if (argc == 3) {
444*1708Sstevel 		permissions = 0;
445*1708Sstevel 	} else {
446*1708Sstevel 		if ((strlen(argv[3]) > 4) || (strlen(argv[3]) < 1)) {
447*1708Sstevel 			userperm_usage();
448*1708Sstevel 			exit(-1);
449*1708Sstevel 		}
450*1708Sstevel 
451*1708Sstevel 		permissions = 0;
452*1708Sstevel 		for (index = 0; index < strlen(argv[3]); index++) {
453*1708Sstevel 			if ((argv[3][index] != 'c') &&
454*1708Sstevel 			    (argv[3][index] != 'C') &&
455*1708Sstevel 			    (argv[3][index] != 'u') &&
456*1708Sstevel 			    (argv[3][index] != 'U') &&
457*1708Sstevel 			    (argv[3][index] != 'a') &&
458*1708Sstevel 			    (argv[3][index] != 'A') &&
459*1708Sstevel 			    (argv[3][index] != 'r') &&
460*1708Sstevel 			    (argv[3][index] != 'R')) {
461*1708Sstevel 				userperm_usage();
462*1708Sstevel 				exit(-1);
463*1708Sstevel 			}
464*1708Sstevel 
465*1708Sstevel 			if ((argv[3][index] == 'c') ||
466*1708Sstevel 			    (argv[3][index] == 'C')) {
467*1708Sstevel 				/* See if this field was entered twice */
468*1708Sstevel 				if ((permissions & DP_USER_PERM_C) != 0) {
469*1708Sstevel 					userperm_usage();
470*1708Sstevel 					exit(-1);
471*1708Sstevel 				}
472*1708Sstevel 				permissions = permissions | DP_USER_PERM_C;
473*1708Sstevel 			}
474*1708Sstevel 
475*1708Sstevel 			if ((argv[3][index] == 'u') ||
476*1708Sstevel 			    (argv[3][index] == 'U')) {
477*1708Sstevel 				/* See if this field was enetered twice */
478*1708Sstevel 				if ((permissions & DP_USER_PERM_U) != 0) {
479*1708Sstevel 					userperm_usage();
480*1708Sstevel 					exit(-1);
481*1708Sstevel 				}
482*1708Sstevel 				permissions = permissions | DP_USER_PERM_U;
483*1708Sstevel 			}
484*1708Sstevel 
485*1708Sstevel 			if ((argv[3][index] == 'a') ||
486*1708Sstevel 			    (argv[3][index] == 'A')) {
487*1708Sstevel 				/* See if this field was enetered twice */
488*1708Sstevel 				if ((permissions & DP_USER_PERM_A) != 0) {
489*1708Sstevel 					userperm_usage();
490*1708Sstevel 					exit(-1);
491*1708Sstevel 				}
492*1708Sstevel 				permissions = permissions | DP_USER_PERM_A;
493*1708Sstevel 			}
494*1708Sstevel 
495*1708Sstevel 			if ((argv[3][index] == 'r') ||
496*1708Sstevel 			    (argv[3][index] == 'R')) {
497*1708Sstevel 				/* See if this field was enetered twice */
498*1708Sstevel 				if ((permissions & DP_USER_PERM_R) != 0) {
499*1708Sstevel 					userperm_usage();
500*1708Sstevel 					exit(-1);
501*1708Sstevel 				}
502*1708Sstevel 				permissions = permissions | DP_USER_PERM_R;
503*1708Sstevel 			}
504*1708Sstevel 		}
505*1708Sstevel 	}
506*1708Sstevel 
507*1708Sstevel 	ADM_Start();
508*1708Sstevel 
509*1708Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
510*1708Sstevel 		max_username();
511*1708Sstevel 		exit(-1);
512*1708Sstevel 	}
513*1708Sstevel 
514*1708Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
515*1708Sstevel 	admMessage->command = DP_USER_CMD_PERM;
516*1708Sstevel 	admMessage->parm    = permissions;
517*1708Sstevel 	userName   = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
518*1708Sstevel 	(void) strcpy(userName, argv[2]);
519*1708Sstevel 
520*1708Sstevel 	Message.type = DP_USER_ADM;
521*1708Sstevel 	Message.len  = sizeof (dp_user_adm_t) + strlen(userName) + 1;
522*1708Sstevel 	Message.data = admMessage;
523*1708Sstevel 	ADM_Send(&Message);
524*1708Sstevel 
525*1708Sstevel 	Timeout.tv_nsec = 0;
526*1708Sstevel 	Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
527*1708Sstevel 	ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
528*1708Sstevel 
529*1708Sstevel 	admResponse = (dp_user_adm_r_t *)Message.data;
530*1708Sstevel 	if (admResponse->command != DP_USER_CMD_PERM) {
531*1708Sstevel 		wrong_response();
532*1708Sstevel 		exit(-1);
533*1708Sstevel 	}
534*1708Sstevel 
535*1708Sstevel 	if (admResponse->status == DP_ERR_USER_NONE) {
536*1708Sstevel 		no_user();
537*1708Sstevel 		exit(-1);
538*1708Sstevel 	} else if (admResponse->status == DP_ERR_USER_BAD) {
539*1708Sstevel 		malformed_username();
540*1708Sstevel 		exit(-1);
541*1708Sstevel 	} else if (admResponse->status != 0) {
542*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
543*1708Sstevel 		    gettext("scadm: couldn't change permissions"));
544*1708Sstevel 		exit(-1);
545*1708Sstevel 	}
546*1708Sstevel 
547*1708Sstevel 	ADM_Free(&Message);
548*1708Sstevel }
549*1708Sstevel 
550*1708Sstevel 
551*1708Sstevel static void
ADM_Get_Password(char * password)552*1708Sstevel ADM_Get_Password(char *password)
553*1708Sstevel {
554*1708Sstevel 	static char		pass1[64];
555*1708Sstevel 	static char		pass2[64];
556*1708Sstevel 	static struct termios	newOpts;
557*1708Sstevel 	int			passTry;
558*1708Sstevel 	int			validPass;
559*1708Sstevel 
560*1708Sstevel 
561*1708Sstevel 	validPass = 0;
562*1708Sstevel 	passTry   = 3;
563*1708Sstevel 
564*1708Sstevel 	if (signal(SIGINT, cleanup) == SIG_ERR) {
565*1708Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
566*1708Sstevel 		    gettext("scadm: cleanup() registration failed"));
567*1708Sstevel 		exit(-1);
568*1708Sstevel 	}
569*1708Sstevel 
570*1708Sstevel 	echoOff = 1;
571*1708Sstevel 	(void) tcgetattr(0, &oldOpts);
572*1708Sstevel 	newOpts = oldOpts;
573*1708Sstevel 	newOpts.c_lflag &= ~ECHO;
574*1708Sstevel 	(void) tcsetattr(0, TCSANOW, &newOpts);
575*1708Sstevel 
576*1708Sstevel 	while ((passTry > 0) && (validPass == 0)) {
577*1708Sstevel 		passTry = passTry - 1;
578*1708Sstevel 		(void) printf("%s", gettext("Password: "));
579*1708Sstevel 		(void) scanf("%s", pass1);
580*1708Sstevel 		(void) printf("\n");
581*1708Sstevel 		(void) fflush(stdin);
582*1708Sstevel 		(void) printf("%s", gettext("Re-enter Password: "));
583*1708Sstevel 		(void) scanf("%s", pass2);
584*1708Sstevel 		(void) printf("\n");
585*1708Sstevel 
586*1708Sstevel 		/* Truncate at 8 characters  */
587*1708Sstevel 		pass1[8] = pass2[8] = '\0';
588*1708Sstevel 
589*1708Sstevel 		if ((strcmp(pass1, pass2) != 0) && (passTry > 0)) {
590*1708Sstevel 			ADM_Destroy_Password(pass1);
591*1708Sstevel 			ADM_Destroy_Password(pass2);
592*1708Sstevel 			(void) fprintf(stderr, "%s\n\n",
593*1708Sstevel 			    gettext("Passwords didn't match, try again"));
594*1708Sstevel 		} else if ((strcmp(pass1, pass2) != 0) && (passTry <= 0)) {
595*1708Sstevel 			ADM_Destroy_Password(pass1);
596*1708Sstevel 			ADM_Destroy_Password(pass2);
597*1708Sstevel 			(void) fprintf(stderr, "\n%s\n\n",
598*1708Sstevel 			    gettext("scadm: ERROR, passwords didn't match"));
599*1708Sstevel 			(void) tcsetattr(0, TCSANOW, &oldOpts);
600*1708Sstevel 			exit(-1);
601*1708Sstevel 		} else {
602*1708Sstevel 			validPass = 1;
603*1708Sstevel 		}
604*1708Sstevel 	}
605*1708Sstevel 
606*1708Sstevel 	(void) tcsetattr(0, TCSANOW, &oldOpts);
607*1708Sstevel 	echoOff = 0;
608*1708Sstevel 	(void) strcpy(password, pass1);
609*1708Sstevel 	ADM_Destroy_Password(pass1);
610*1708Sstevel 	ADM_Destroy_Password(pass2);
611*1708Sstevel }
612*1708Sstevel 
613*1708Sstevel 
614*1708Sstevel static void
cleanup()615*1708Sstevel cleanup()
616*1708Sstevel {
617*1708Sstevel 	if (echoOff)
618*1708Sstevel 		(void) tcsetattr(0, TCSANOW, &oldOpts);
619*1708Sstevel 
620*1708Sstevel 	exit(-1);
621*1708Sstevel }
622*1708Sstevel 
623*1708Sstevel 
624*1708Sstevel static void
ADM_Destroy_Password(char * password)625*1708Sstevel ADM_Destroy_Password(char *password)
626*1708Sstevel {
627*1708Sstevel 	int index;
628*1708Sstevel 
629*1708Sstevel 	for (index = 0; index < strlen(password); index++)
630*1708Sstevel 		password[index] = 0x1;
631*1708Sstevel }
632*1708Sstevel 
633*1708Sstevel 
634*1708Sstevel static void
max_username()635*1708Sstevel max_username()
636*1708Sstevel {
637*1708Sstevel 	(void) fprintf(stderr,
638*1708Sstevel 	    gettext("\nscadm: maximum username length is %d\n\n"),
639*1708Sstevel 	    DP_USER_NAME_SIZE);
640*1708Sstevel }
641*1708Sstevel 
642*1708Sstevel 
643*1708Sstevel static void
malformed_username()644*1708Sstevel malformed_username()
645*1708Sstevel {
646*1708Sstevel 	(void) fprintf(stderr,
647*1708Sstevel 	    "\n%s\n\n", gettext("scadm: malformed username"));
648*1708Sstevel }
649*1708Sstevel 
650*1708Sstevel 
651*1708Sstevel static void
wrong_response()652*1708Sstevel wrong_response()
653*1708Sstevel {
654*1708Sstevel 	(void) fprintf(stderr, "\n%s\n\n",
655*1708Sstevel 	    gettext("scadm: SC returned wrong response"));
656*1708Sstevel }
657*1708Sstevel 
658*1708Sstevel 
659*1708Sstevel static void
no_user()660*1708Sstevel no_user()
661*1708Sstevel {
662*1708Sstevel 	(void) fprintf(stderr,
663*1708Sstevel 	    "\n%s\n\n", gettext("scadm: username does not exist"));
664*1708Sstevel }
665*1708Sstevel 
666*1708Sstevel 
667*1708Sstevel static void
no_info()668*1708Sstevel no_info()
669*1708Sstevel {
670*1708Sstevel 	(void) fprintf(stderr, "\n%s\n\n",
671*1708Sstevel 	    gettext("scadm: couldn't get information on user"));
672*1708Sstevel }
673*1708Sstevel 
674*1708Sstevel 
675*1708Sstevel static void
userperm_usage()676*1708Sstevel userperm_usage()
677*1708Sstevel {
678*1708Sstevel 	(void) fprintf(stderr, "\n%s\n\n",
679*1708Sstevel 	    gettext("USAGE: scadm userperm <username> [cuar]"));
680*1708Sstevel }
681*1708Sstevel 
682*1708Sstevel 
683*1708Sstevel static void
show_header()684*1708Sstevel show_header()
685*1708Sstevel {
686*1708Sstevel 	int i;
687*1708Sstevel 	int usernLen = strlen(gettext("username"));
688*1708Sstevel 	int permLen = strlen(gettext("permissions"));
689*1708Sstevel 	int pwdLen = strlen(gettext("password"));
690*1708Sstevel 
691*1708Sstevel 	(void) printf("\n");
692*1708Sstevel 	(void) putchar(' ');
693*1708Sstevel 	(void) printf("%s", gettext("username"));
694*1708Sstevel 	for (i = 0; i < (20 - usernLen); i++)
695*1708Sstevel 		(void) putchar(' ');
696*1708Sstevel 
697*1708Sstevel 	(void) printf("%s", gettext("permissions"));
698*1708Sstevel 	for (i = 0; i < (19 - permLen); i++)
699*1708Sstevel 		(void) putchar(' ');
700*1708Sstevel 
701*1708Sstevel 	(void) printf("%s\n", gettext("password"));
702*1708Sstevel 
703*1708Sstevel 	(void) putchar(' ');
704*1708Sstevel 	for (i = 0; i < usernLen; i++)
705*1708Sstevel 		(void) putchar('-');
706*1708Sstevel 	for (; i < 20; i++)
707*1708Sstevel 		(void) putchar(' ');
708*1708Sstevel 
709*1708Sstevel 	for (i = 0; i < permLen; i++)
710*1708Sstevel 		(void) putchar('-');
711*1708Sstevel 	for (; i < 19; i++)
712*1708Sstevel 		(void) putchar(' ');
713*1708Sstevel 
714*1708Sstevel 	for (i = 0; i < pwdLen; i++)
715*1708Sstevel 		(void) putchar('-');
716*1708Sstevel 	(void) printf("\n");
717*1708Sstevel }
718