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