xref: /illumos-gate/usr/src/lib/libpkg/common/ckparam.c (revision 4656d474)
15c51f124SMoriah Waterland /*
25c51f124SMoriah Waterland  * CDDL HEADER START
35c51f124SMoriah Waterland  *
45c51f124SMoriah Waterland  * The contents of this file are subject to the terms of the
55c51f124SMoriah Waterland  * Common Development and Distribution License (the "License").
65c51f124SMoriah Waterland  * You may not use this file except in compliance with the License.
75c51f124SMoriah Waterland  *
85c51f124SMoriah Waterland  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c51f124SMoriah Waterland  * or http://www.opensolaris.org/os/licensing.
105c51f124SMoriah Waterland  * See the License for the specific language governing permissions
115c51f124SMoriah Waterland  * and limitations under the License.
125c51f124SMoriah Waterland  *
135c51f124SMoriah Waterland  * When distributing Covered Code, include this CDDL HEADER in each
145c51f124SMoriah Waterland  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155c51f124SMoriah Waterland  * If applicable, add the following below this CDDL HEADER, with the
165c51f124SMoriah Waterland  * fields enclosed by brackets "[]" replaced with your own identifying
175c51f124SMoriah Waterland  * information: Portions Copyright [yyyy] [name of copyright owner]
185c51f124SMoriah Waterland  *
195c51f124SMoriah Waterland  * CDDL HEADER END
205c51f124SMoriah Waterland  */
215c51f124SMoriah Waterland 
225c51f124SMoriah Waterland /*
235c51f124SMoriah Waterland  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245c51f124SMoriah Waterland  * Use is subject to license terms.
255c51f124SMoriah Waterland  */
265c51f124SMoriah Waterland 
275c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
285c51f124SMoriah Waterland /* All Rights Reserved */
295c51f124SMoriah Waterland 
305c51f124SMoriah Waterland 
315c51f124SMoriah Waterland 
325c51f124SMoriah Waterland #include <ctype.h>
335c51f124SMoriah Waterland #include <string.h>
345c51f124SMoriah Waterland #include <sys/types.h>
355c51f124SMoriah Waterland #include "pkglib.h"
365c51f124SMoriah Waterland #include "pkglibmsgs.h"
375c51f124SMoriah Waterland #include "pkglocale.h"
385c51f124SMoriah Waterland 
395c51f124SMoriah Waterland #define	MAXLEN 256
405c51f124SMoriah Waterland #define	TOKLEN 16
415c51f124SMoriah Waterland 
425c51f124SMoriah Waterland static int	proc_name(char *param, char *value);
435c51f124SMoriah Waterland static int	proc_arch(char *param, char *value);
445c51f124SMoriah Waterland static int	proc_version(char *param, char *value);
455c51f124SMoriah Waterland static int	proc_category(char *param, char *value);
465c51f124SMoriah Waterland static int	bad_first_char(char *param, char *value);
475c51f124SMoriah Waterland static int	not_alnum(char *param, char *pt);
485c51f124SMoriah Waterland static int	not_ascii(char *param, char *pt);
495c51f124SMoriah Waterland static int	too_long(char *param, char *pt, int len);
505c51f124SMoriah Waterland static int	isnull(char *param, char *pt);
515c51f124SMoriah Waterland 
525c51f124SMoriah Waterland int
535c51f124SMoriah Waterland ckparam(char *param, char *val)
545c51f124SMoriah Waterland {
555c51f124SMoriah Waterland 	char *value = strdup(val);
565c51f124SMoriah Waterland 	int ret_val = 0;	/* return value */
575c51f124SMoriah Waterland 
585c51f124SMoriah Waterland 	if (strcmp(param, "NAME") == 0)
595c51f124SMoriah Waterland 		ret_val = proc_name(param, value);
605c51f124SMoriah Waterland 
615c51f124SMoriah Waterland 	else if (strcmp(param, "ARCH") == 0)
625c51f124SMoriah Waterland 		ret_val = proc_arch(param, value);
635c51f124SMoriah Waterland 
645c51f124SMoriah Waterland 	else if (strcmp(param, "VERSION") == 0)
655c51f124SMoriah Waterland 		ret_val = proc_version(param, value);
665c51f124SMoriah Waterland 
675c51f124SMoriah Waterland 	else if (strcmp(param, "CATEGORY") == 0)
685c51f124SMoriah Waterland 		ret_val = proc_category(param, value);
695c51f124SMoriah Waterland 
705c51f124SMoriah Waterland 	/* param does not match existing parameters */
715c51f124SMoriah Waterland 	free(value);
725c51f124SMoriah Waterland 	return (ret_val);
735c51f124SMoriah Waterland }
745c51f124SMoriah Waterland 
755c51f124SMoriah Waterland static int
765c51f124SMoriah Waterland proc_name(char *param, char *value)
775c51f124SMoriah Waterland {
785c51f124SMoriah Waterland 	int ret_val;
795c51f124SMoriah Waterland 
805c51f124SMoriah Waterland 	if (!(ret_val = isnull(param, value))) {
815c51f124SMoriah Waterland 		ret_val += too_long(param, value, MAXLEN);
825c51f124SMoriah Waterland 		ret_val += not_ascii(param, value);
835c51f124SMoriah Waterland 	}
845c51f124SMoriah Waterland 
855c51f124SMoriah Waterland 	return (ret_val);
865c51f124SMoriah Waterland }
875c51f124SMoriah Waterland 
885c51f124SMoriah Waterland static int
895c51f124SMoriah Waterland proc_arch(char *param, char *value)
905c51f124SMoriah Waterland {
915c51f124SMoriah Waterland 	int ret_val;
925c51f124SMoriah Waterland 	char *token;
935c51f124SMoriah Waterland 
945c51f124SMoriah Waterland 	if (!(ret_val = isnull(param, value))) {
955c51f124SMoriah Waterland 		token = strtok(value, ", ");
965c51f124SMoriah Waterland 
975c51f124SMoriah Waterland 		while (token) {
985c51f124SMoriah Waterland 			ret_val += too_long(param, token, TOKLEN);
995c51f124SMoriah Waterland 			ret_val += not_ascii(param, token);
1005c51f124SMoriah Waterland 			token = strtok(NULL, ", ");
1015c51f124SMoriah Waterland 		}
1025c51f124SMoriah Waterland 	}
1035c51f124SMoriah Waterland 
1045c51f124SMoriah Waterland 	return (ret_val);
1055c51f124SMoriah Waterland }
1065c51f124SMoriah Waterland 
1075c51f124SMoriah Waterland static int
1085c51f124SMoriah Waterland proc_version(char *param, char *value)
1095c51f124SMoriah Waterland {
1105c51f124SMoriah Waterland 	int ret_val;
1115c51f124SMoriah Waterland 
1125c51f124SMoriah Waterland 	if (!(ret_val = isnull(param, value))) {
1135c51f124SMoriah Waterland 		ret_val += bad_first_char(param, value);
1145c51f124SMoriah Waterland 		ret_val += too_long(param, value, MAXLEN);
1155c51f124SMoriah Waterland 		ret_val += not_ascii(param, value);
1165c51f124SMoriah Waterland 	}
1175c51f124SMoriah Waterland 
1185c51f124SMoriah Waterland 	return (ret_val);
1195c51f124SMoriah Waterland }
1205c51f124SMoriah Waterland 
1215c51f124SMoriah Waterland static int
1225c51f124SMoriah Waterland proc_category(char *param, char *value)
1235c51f124SMoriah Waterland {
1245c51f124SMoriah Waterland 	int ret_val;
1255c51f124SMoriah Waterland 	char *token;
1265c51f124SMoriah Waterland 
1275c51f124SMoriah Waterland 	if (!(ret_val = isnull(param, value))) {
1285c51f124SMoriah Waterland 		token = strtok(value, ", ");
1295c51f124SMoriah Waterland 
1305c51f124SMoriah Waterland 		while (token) {
1315c51f124SMoriah Waterland 			ret_val += too_long(param, token, TOKLEN);
1325c51f124SMoriah Waterland 			ret_val += not_alnum(param, token);
1335c51f124SMoriah Waterland 			token = strtok(NULL, ", ");
1345c51f124SMoriah Waterland 		}
1355c51f124SMoriah Waterland 	}
1365c51f124SMoriah Waterland 
1375c51f124SMoriah Waterland 	return (ret_val);
1385c51f124SMoriah Waterland }
1395c51f124SMoriah Waterland 
1405c51f124SMoriah Waterland static int
1415c51f124SMoriah Waterland bad_first_char(char *param, char *value)
1425c51f124SMoriah Waterland {
1435c51f124SMoriah Waterland 	if (*value == '(') {
1445c51f124SMoriah Waterland 		progerr(pkg_gt(ERR_CHAR), param);
1455c51f124SMoriah Waterland 		return (1);
1465c51f124SMoriah Waterland 	}
1475c51f124SMoriah Waterland 
1485c51f124SMoriah Waterland 	return (0);
1495c51f124SMoriah Waterland }
1505c51f124SMoriah Waterland 
1515c51f124SMoriah Waterland static int
1525c51f124SMoriah Waterland isnull(char *param, char *pt)
1535c51f124SMoriah Waterland {
1545c51f124SMoriah Waterland 	if (!pt || *pt == '\0') {
1555c51f124SMoriah Waterland 		progerr(pkg_gt(ERR_UNDEF), param);
1565c51f124SMoriah Waterland 		return (1);
1575c51f124SMoriah Waterland 	}
1585c51f124SMoriah Waterland 	return (0);
1595c51f124SMoriah Waterland }
1605c51f124SMoriah Waterland 
1615c51f124SMoriah Waterland static int
1625c51f124SMoriah Waterland too_long(char *param, char *pt, int len)
1635c51f124SMoriah Waterland {
1645c51f124SMoriah Waterland 	if (strlen(pt) > (size_t)len) {
165*4656d474SGarrett D'Amore 		progerr(pkg_gt(ERR_LEN), param);
1665c51f124SMoriah Waterland 		return (1);
1675c51f124SMoriah Waterland 	}
1685c51f124SMoriah Waterland 	return (0);
1695c51f124SMoriah Waterland }
1705c51f124SMoriah Waterland 
1715c51f124SMoriah Waterland static int
1725c51f124SMoriah Waterland not_ascii(char *param, char *pt)
1735c51f124SMoriah Waterland {
1745c51f124SMoriah Waterland 	while (*pt) {
1755c51f124SMoriah Waterland 		if (!(isascii(*pt))) {
1765c51f124SMoriah Waterland 			progerr(pkg_gt(ERR_ASCII), param);
1775c51f124SMoriah Waterland 			return (1);
1785c51f124SMoriah Waterland 		}
1795c51f124SMoriah Waterland 		pt++;
1805c51f124SMoriah Waterland 	}
1815c51f124SMoriah Waterland 	return (0);
1825c51f124SMoriah Waterland }
1835c51f124SMoriah Waterland 
1845c51f124SMoriah Waterland static int
1855c51f124SMoriah Waterland not_alnum(char *param, char *pt)
1865c51f124SMoriah Waterland {
1875c51f124SMoriah Waterland 	while (*pt) {
1885c51f124SMoriah Waterland 		if (!(isalnum(*pt))) {
1895c51f124SMoriah Waterland 			progerr(pkg_gt(ERR_ALNUM), param);
1905c51f124SMoriah Waterland 			return (1);
1915c51f124SMoriah Waterland 		}
1925c51f124SMoriah Waterland 		pt++;
1935c51f124SMoriah Waterland 	}
1945c51f124SMoriah Waterland 
1955c51f124SMoriah Waterland 	return (0);
1965c51f124SMoriah Waterland }
197