xref: /titanic_50/usr/src/lib/libadm/common/ckstr.c (revision 4656d4747c8743290bfbe910c64cd75eb4e4af8d)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
237c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
247c478bd9Sstevel@tonic-gate 
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate /*
277c478bd9Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
287c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
297c478bd9Sstevel@tonic-gate  */
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate #include <stdio.h>
327c478bd9Sstevel@tonic-gate #include <string.h>
337c478bd9Sstevel@tonic-gate #include <limits.h>
347c478bd9Sstevel@tonic-gate #include <sys/types.h>
357c478bd9Sstevel@tonic-gate #include "libadm.h"
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate /*
387c478bd9Sstevel@tonic-gate  * This file is the only one anywhere to need these functions,
397c478bd9Sstevel@tonic-gate  * so we declare them here, not in libadm.h
407c478bd9Sstevel@tonic-gate  */
417c478bd9Sstevel@tonic-gate extern char *__compile(char *, char *, const char *, int);
427c478bd9Sstevel@tonic-gate extern int __step(const char *, const char *);
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate #define	ESIZE	1024
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate #define	ERRMSG0 "Input is required."
477c478bd9Sstevel@tonic-gate #define	ERRMSG1	"Please enter a string containing no more than %d characters."
487c478bd9Sstevel@tonic-gate #define	ERRMSG2	\
497c478bd9Sstevel@tonic-gate 	"Pattern matching has failed."
507c478bd9Sstevel@tonic-gate #define	ERRMSG3 \
51*4656d474SGarrett D'Amore 	"Please enter a string which contains no embedded, \
527c478bd9Sstevel@tonic-gate 	leading or trailing spaces or tabs."
537c478bd9Sstevel@tonic-gate 
547c478bd9Sstevel@tonic-gate #define	HLPMSG0	"Please enter a string"
557c478bd9Sstevel@tonic-gate #define	HLPMSG1 "Please enter a string containing no more than %d characters"
567c478bd9Sstevel@tonic-gate #define	HLPMSG2 "matches one of the following patterns:"
577c478bd9Sstevel@tonic-gate #define	HLPMSG3 "matches the following pattern:"
58*4656d474SGarrett D'Amore #define	HLPMSG4 "contains no embedded, leading or trailing spaces or tabs."
597c478bd9Sstevel@tonic-gate 
607c478bd9Sstevel@tonic-gate static char	*errstr;
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate static char *
sethlp(char * msg,char * regexp[],int length)637c478bd9Sstevel@tonic-gate sethlp(char *msg, char *regexp[], int length)
647c478bd9Sstevel@tonic-gate {
657c478bd9Sstevel@tonic-gate 	int	i;
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate 	if (length)
687c478bd9Sstevel@tonic-gate 		(void) sprintf(msg, HLPMSG1, length);
697c478bd9Sstevel@tonic-gate 	else
707c478bd9Sstevel@tonic-gate 		(void) strcpy(msg, HLPMSG0);
717c478bd9Sstevel@tonic-gate 
727c478bd9Sstevel@tonic-gate 	(void) strcat(msg, length ? " and " : " which ");
737c478bd9Sstevel@tonic-gate 
747c478bd9Sstevel@tonic-gate 	if (regexp && regexp[0]) {
757c478bd9Sstevel@tonic-gate 		(void) strcat(msg, regexp[1] ? HLPMSG2 : HLPMSG3);
767c478bd9Sstevel@tonic-gate 		for (i = 0; regexp[i]; i++) {
777c478bd9Sstevel@tonic-gate 			(void) strcat(msg, "\\n\\t");
787c478bd9Sstevel@tonic-gate 			(void) strcat(msg, regexp[i]);
797c478bd9Sstevel@tonic-gate 		}
807c478bd9Sstevel@tonic-gate 	} else
817c478bd9Sstevel@tonic-gate 		(void) strcat(msg, HLPMSG4);
827c478bd9Sstevel@tonic-gate 	return (msg);
837c478bd9Sstevel@tonic-gate }
847c478bd9Sstevel@tonic-gate 
857c478bd9Sstevel@tonic-gate int
ckstr_val(char * regexp[],int length,char * input)867c478bd9Sstevel@tonic-gate ckstr_val(char *regexp[], int length, char *input)
877c478bd9Sstevel@tonic-gate {
887c478bd9Sstevel@tonic-gate 	char	expbuf[ESIZE];
897c478bd9Sstevel@tonic-gate 	int	i, valid;
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate 	valid = 1;
927c478bd9Sstevel@tonic-gate 	if (length && (strlen(input) > (size_t)length)) {
937c478bd9Sstevel@tonic-gate 		errstr = ERRMSG1;
947c478bd9Sstevel@tonic-gate 		return (1);
957c478bd9Sstevel@tonic-gate 	}
967c478bd9Sstevel@tonic-gate 	if (regexp && regexp[0]) {
977c478bd9Sstevel@tonic-gate 		valid = 0;
987c478bd9Sstevel@tonic-gate 		for (i = 0; !valid && regexp[i]; ++i) {
997c478bd9Sstevel@tonic-gate 			if (!__compile(regexp[i], expbuf, &expbuf[ESIZE], '\0'))
1007c478bd9Sstevel@tonic-gate 				return (2);
1017c478bd9Sstevel@tonic-gate 			valid = __step(input, expbuf);
1027c478bd9Sstevel@tonic-gate 		}
1037c478bd9Sstevel@tonic-gate 		if (!valid)
1047c478bd9Sstevel@tonic-gate 			errstr = ERRMSG2;
1057c478bd9Sstevel@tonic-gate 	} else if (strpbrk(input, " \t")) {
1067c478bd9Sstevel@tonic-gate 		errstr = ERRMSG3;
1077c478bd9Sstevel@tonic-gate 		valid = 0;
1087c478bd9Sstevel@tonic-gate 	}
1097c478bd9Sstevel@tonic-gate 	return (valid == 0);
1107c478bd9Sstevel@tonic-gate }
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate void
ckstr_err(char * regexp[],int length,char * error,char * input)1137c478bd9Sstevel@tonic-gate ckstr_err(char *regexp[], int length, char *error, char *input)
1147c478bd9Sstevel@tonic-gate {
1157c478bd9Sstevel@tonic-gate 	char	*defhlp;
1167c478bd9Sstevel@tonic-gate 	char	temp[1024];
1177c478bd9Sstevel@tonic-gate 
1187c478bd9Sstevel@tonic-gate 	if (input) {
1197c478bd9Sstevel@tonic-gate 		if (ckstr_val(regexp, length, input)) {
120*4656d474SGarrett D'Amore 			/* LINTED E_SEC_PRINTF_VAR_FMT */
121*4656d474SGarrett D'Amore 			(void) snprintf(temp, sizeof (temp), errstr, length);
1227c478bd9Sstevel@tonic-gate 			puterror(stdout, temp, error);
1237c478bd9Sstevel@tonic-gate 			return;
1247c478bd9Sstevel@tonic-gate 		}
1257c478bd9Sstevel@tonic-gate 	}
1267c478bd9Sstevel@tonic-gate 
1277c478bd9Sstevel@tonic-gate 	defhlp = sethlp(temp, regexp, length);
1287c478bd9Sstevel@tonic-gate 	puterror(stdout, defhlp, error);
1297c478bd9Sstevel@tonic-gate }
1307c478bd9Sstevel@tonic-gate 
1317c478bd9Sstevel@tonic-gate void
ckstr_hlp(char * regexp[],int length,char * help)1327c478bd9Sstevel@tonic-gate ckstr_hlp(char *regexp[], int length, char *help)
1337c478bd9Sstevel@tonic-gate {
1347c478bd9Sstevel@tonic-gate 	char	*defhlp;
1357c478bd9Sstevel@tonic-gate 	char	hlpbuf[1024];
1367c478bd9Sstevel@tonic-gate 
1377c478bd9Sstevel@tonic-gate 	defhlp = sethlp(hlpbuf, regexp, length);
1387c478bd9Sstevel@tonic-gate 	puthelp(stdout, defhlp, help);
1397c478bd9Sstevel@tonic-gate }
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate int
ckstr(char * strval,char * regexp[],int length,char * defstr,char * error,char * help,char * prompt)1427c478bd9Sstevel@tonic-gate ckstr(char *strval, char *regexp[], int length, char *defstr, char *error,
1437c478bd9Sstevel@tonic-gate 	char *help, char *prompt)
1447c478bd9Sstevel@tonic-gate {
1457c478bd9Sstevel@tonic-gate 	int	n;
1467c478bd9Sstevel@tonic-gate 	char	*defhlp;
1477c478bd9Sstevel@tonic-gate 	char	input[MAX_INPUT],
1487c478bd9Sstevel@tonic-gate 		hlpbuf[1024],
1497c478bd9Sstevel@tonic-gate 		errbuf[1024];
1507c478bd9Sstevel@tonic-gate 
1517c478bd9Sstevel@tonic-gate 	defhlp = NULL;
1527c478bd9Sstevel@tonic-gate 	if (!prompt)
1537c478bd9Sstevel@tonic-gate 		prompt = "Enter an appropriate value";
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate start:
1567c478bd9Sstevel@tonic-gate 	putprmpt(stderr, prompt, NULL, defstr);
1577c478bd9Sstevel@tonic-gate 	if (getinput(input))
1587c478bd9Sstevel@tonic-gate 		return (1);
1597c478bd9Sstevel@tonic-gate 
1607c478bd9Sstevel@tonic-gate 	n = (int)strlen(input);
1617c478bd9Sstevel@tonic-gate 	if (n == 0) {
1627c478bd9Sstevel@tonic-gate 		if (defstr) {
1637c478bd9Sstevel@tonic-gate 			(void) strcpy(strval, defstr);
1647c478bd9Sstevel@tonic-gate 			return (0);
1657c478bd9Sstevel@tonic-gate 		}
1667c478bd9Sstevel@tonic-gate 		puterror(stderr, ERRMSG0, error);
1677c478bd9Sstevel@tonic-gate 		goto start;
1687c478bd9Sstevel@tonic-gate 	}
1697c478bd9Sstevel@tonic-gate 	if (strcmp(input, "?") == 0) {
1707c478bd9Sstevel@tonic-gate 		if (defhlp == NULL)
1717c478bd9Sstevel@tonic-gate 			defhlp = sethlp(hlpbuf, regexp, length);
1727c478bd9Sstevel@tonic-gate 		puthelp(stderr, defhlp, help);
1737c478bd9Sstevel@tonic-gate 		goto start;
1747c478bd9Sstevel@tonic-gate 	}
1757c478bd9Sstevel@tonic-gate 	if (ckquit && (strcmp(input, "q") == 0)) {
1767c478bd9Sstevel@tonic-gate 		(void) strcpy(strval, input);
1777c478bd9Sstevel@tonic-gate 		return (3);
1787c478bd9Sstevel@tonic-gate 	}
1797c478bd9Sstevel@tonic-gate 	if (ckstr_val(regexp, length, input)) {
180*4656d474SGarrett D'Amore 		/* LINTED E_SEC_PRINTF_VAR_FMT */
181*4656d474SGarrett D'Amore 		(void) snprintf(errbuf, sizeof (errbuf), errstr, length);
1827c478bd9Sstevel@tonic-gate 		puterror(stderr, errbuf, error);
1837c478bd9Sstevel@tonic-gate 		goto start;
1847c478bd9Sstevel@tonic-gate 	}
1857c478bd9Sstevel@tonic-gate 	(void) strcpy(strval, input);
1867c478bd9Sstevel@tonic-gate 	return (0);
1877c478bd9Sstevel@tonic-gate }
188