1*5c51f124SMoriah Waterland /* 2*5c51f124SMoriah Waterland * CDDL HEADER START 3*5c51f124SMoriah Waterland * 4*5c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 5*5c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 6*5c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 7*5c51f124SMoriah Waterland * 8*5c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 10*5c51f124SMoriah Waterland * See the License for the specific language governing permissions 11*5c51f124SMoriah Waterland * and limitations under the License. 12*5c51f124SMoriah Waterland * 13*5c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 14*5c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 16*5c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 17*5c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 18*5c51f124SMoriah Waterland * 19*5c51f124SMoriah Waterland * CDDL HEADER END 20*5c51f124SMoriah Waterland */ 21*5c51f124SMoriah Waterland 22*5c51f124SMoriah Waterland /* 23*5c51f124SMoriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*5c51f124SMoriah Waterland * Use is subject to license terms. 25*5c51f124SMoriah Waterland */ 26*5c51f124SMoriah Waterland 27*5c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28*5c51f124SMoriah Waterland /* All Rights Reserved */ 29*5c51f124SMoriah Waterland 30*5c51f124SMoriah Waterland 31*5c51f124SMoriah Waterland 32*5c51f124SMoriah Waterland #include <ctype.h> 33*5c51f124SMoriah Waterland #include <string.h> 34*5c51f124SMoriah Waterland #include <sys/types.h> 35*5c51f124SMoriah Waterland #include "pkglib.h" 36*5c51f124SMoriah Waterland #include "pkglibmsgs.h" 37*5c51f124SMoriah Waterland #include "pkglocale.h" 38*5c51f124SMoriah Waterland 39*5c51f124SMoriah Waterland #define MAXLEN 256 40*5c51f124SMoriah Waterland #define TOKLEN 16 41*5c51f124SMoriah Waterland 42*5c51f124SMoriah Waterland static int proc_name(char *param, char *value); 43*5c51f124SMoriah Waterland static int proc_arch(char *param, char *value); 44*5c51f124SMoriah Waterland static int proc_version(char *param, char *value); 45*5c51f124SMoriah Waterland static int proc_category(char *param, char *value); 46*5c51f124SMoriah Waterland static int bad_first_char(char *param, char *value); 47*5c51f124SMoriah Waterland static int not_alnum(char *param, char *pt); 48*5c51f124SMoriah Waterland static int not_ascii(char *param, char *pt); 49*5c51f124SMoriah Waterland static int too_long(char *param, char *pt, int len); 50*5c51f124SMoriah Waterland static int isnull(char *param, char *pt); 51*5c51f124SMoriah Waterland 52*5c51f124SMoriah Waterland int 53*5c51f124SMoriah Waterland ckparam(char *param, char *val) 54*5c51f124SMoriah Waterland { 55*5c51f124SMoriah Waterland char *value = strdup(val); 56*5c51f124SMoriah Waterland int ret_val = 0; /* return value */ 57*5c51f124SMoriah Waterland 58*5c51f124SMoriah Waterland if (strcmp(param, "NAME") == 0) 59*5c51f124SMoriah Waterland ret_val = proc_name(param, value); 60*5c51f124SMoriah Waterland 61*5c51f124SMoriah Waterland else if (strcmp(param, "ARCH") == 0) 62*5c51f124SMoriah Waterland ret_val = proc_arch(param, value); 63*5c51f124SMoriah Waterland 64*5c51f124SMoriah Waterland else if (strcmp(param, "VERSION") == 0) 65*5c51f124SMoriah Waterland ret_val = proc_version(param, value); 66*5c51f124SMoriah Waterland 67*5c51f124SMoriah Waterland else if (strcmp(param, "CATEGORY") == 0) 68*5c51f124SMoriah Waterland ret_val = proc_category(param, value); 69*5c51f124SMoriah Waterland 70*5c51f124SMoriah Waterland /* param does not match existing parameters */ 71*5c51f124SMoriah Waterland free(value); 72*5c51f124SMoriah Waterland return (ret_val); 73*5c51f124SMoriah Waterland } 74*5c51f124SMoriah Waterland 75*5c51f124SMoriah Waterland static int 76*5c51f124SMoriah Waterland proc_name(char *param, char *value) 77*5c51f124SMoriah Waterland { 78*5c51f124SMoriah Waterland int ret_val; 79*5c51f124SMoriah Waterland 80*5c51f124SMoriah Waterland if (!(ret_val = isnull(param, value))) { 81*5c51f124SMoriah Waterland ret_val += too_long(param, value, MAXLEN); 82*5c51f124SMoriah Waterland ret_val += not_ascii(param, value); 83*5c51f124SMoriah Waterland } 84*5c51f124SMoriah Waterland 85*5c51f124SMoriah Waterland return (ret_val); 86*5c51f124SMoriah Waterland } 87*5c51f124SMoriah Waterland 88*5c51f124SMoriah Waterland static int 89*5c51f124SMoriah Waterland proc_arch(char *param, char *value) 90*5c51f124SMoriah Waterland { 91*5c51f124SMoriah Waterland int ret_val; 92*5c51f124SMoriah Waterland char *token; 93*5c51f124SMoriah Waterland 94*5c51f124SMoriah Waterland if (!(ret_val = isnull(param, value))) { 95*5c51f124SMoriah Waterland token = strtok(value, ", "); 96*5c51f124SMoriah Waterland 97*5c51f124SMoriah Waterland while (token) { 98*5c51f124SMoriah Waterland ret_val += too_long(param, token, TOKLEN); 99*5c51f124SMoriah Waterland ret_val += not_ascii(param, token); 100*5c51f124SMoriah Waterland token = strtok(NULL, ", "); 101*5c51f124SMoriah Waterland } 102*5c51f124SMoriah Waterland } 103*5c51f124SMoriah Waterland 104*5c51f124SMoriah Waterland return (ret_val); 105*5c51f124SMoriah Waterland } 106*5c51f124SMoriah Waterland 107*5c51f124SMoriah Waterland static int 108*5c51f124SMoriah Waterland proc_version(char *param, char *value) 109*5c51f124SMoriah Waterland { 110*5c51f124SMoriah Waterland int ret_val; 111*5c51f124SMoriah Waterland 112*5c51f124SMoriah Waterland if (!(ret_val = isnull(param, value))) { 113*5c51f124SMoriah Waterland ret_val += bad_first_char(param, value); 114*5c51f124SMoriah Waterland ret_val += too_long(param, value, MAXLEN); 115*5c51f124SMoriah Waterland ret_val += not_ascii(param, value); 116*5c51f124SMoriah Waterland } 117*5c51f124SMoriah Waterland 118*5c51f124SMoriah Waterland return (ret_val); 119*5c51f124SMoriah Waterland } 120*5c51f124SMoriah Waterland 121*5c51f124SMoriah Waterland static int 122*5c51f124SMoriah Waterland proc_category(char *param, char *value) 123*5c51f124SMoriah Waterland { 124*5c51f124SMoriah Waterland int ret_val; 125*5c51f124SMoriah Waterland char *token; 126*5c51f124SMoriah Waterland 127*5c51f124SMoriah Waterland if (!(ret_val = isnull(param, value))) { 128*5c51f124SMoriah Waterland token = strtok(value, ", "); 129*5c51f124SMoriah Waterland 130*5c51f124SMoriah Waterland while (token) { 131*5c51f124SMoriah Waterland ret_val += too_long(param, token, TOKLEN); 132*5c51f124SMoriah Waterland ret_val += not_alnum(param, token); 133*5c51f124SMoriah Waterland token = strtok(NULL, ", "); 134*5c51f124SMoriah Waterland } 135*5c51f124SMoriah Waterland } 136*5c51f124SMoriah Waterland 137*5c51f124SMoriah Waterland return (ret_val); 138*5c51f124SMoriah Waterland } 139*5c51f124SMoriah Waterland 140*5c51f124SMoriah Waterland static int 141*5c51f124SMoriah Waterland bad_first_char(char *param, char *value) 142*5c51f124SMoriah Waterland { 143*5c51f124SMoriah Waterland if (*value == '(') { 144*5c51f124SMoriah Waterland progerr(pkg_gt(ERR_CHAR), param); 145*5c51f124SMoriah Waterland return (1); 146*5c51f124SMoriah Waterland } 147*5c51f124SMoriah Waterland 148*5c51f124SMoriah Waterland return (0); 149*5c51f124SMoriah Waterland } 150*5c51f124SMoriah Waterland 151*5c51f124SMoriah Waterland static int 152*5c51f124SMoriah Waterland isnull(char *param, char *pt) 153*5c51f124SMoriah Waterland { 154*5c51f124SMoriah Waterland if (!pt || *pt == '\0') { 155*5c51f124SMoriah Waterland progerr(pkg_gt(ERR_UNDEF), param); 156*5c51f124SMoriah Waterland return (1); 157*5c51f124SMoriah Waterland } 158*5c51f124SMoriah Waterland return (0); 159*5c51f124SMoriah Waterland } 160*5c51f124SMoriah Waterland 161*5c51f124SMoriah Waterland static int 162*5c51f124SMoriah Waterland too_long(char *param, char *pt, int len) 163*5c51f124SMoriah Waterland { 164*5c51f124SMoriah Waterland if (strlen(pt) > (size_t)len) { 165*5c51f124SMoriah Waterland progerr(pkg_gt(ERR_LEN), pt); 166*5c51f124SMoriah Waterland return (1); 167*5c51f124SMoriah Waterland } 168*5c51f124SMoriah Waterland return (0); 169*5c51f124SMoriah Waterland } 170*5c51f124SMoriah Waterland 171*5c51f124SMoriah Waterland static int 172*5c51f124SMoriah Waterland not_ascii(char *param, char *pt) 173*5c51f124SMoriah Waterland { 174*5c51f124SMoriah Waterland while (*pt) { 175*5c51f124SMoriah Waterland if (!(isascii(*pt))) { 176*5c51f124SMoriah Waterland progerr(pkg_gt(ERR_ASCII), param); 177*5c51f124SMoriah Waterland return (1); 178*5c51f124SMoriah Waterland } 179*5c51f124SMoriah Waterland pt++; 180*5c51f124SMoriah Waterland } 181*5c51f124SMoriah Waterland return (0); 182*5c51f124SMoriah Waterland } 183*5c51f124SMoriah Waterland 184*5c51f124SMoriah Waterland static int 185*5c51f124SMoriah Waterland not_alnum(char *param, char *pt) 186*5c51f124SMoriah Waterland { 187*5c51f124SMoriah Waterland while (*pt) { 188*5c51f124SMoriah Waterland if (!(isalnum(*pt))) { 189*5c51f124SMoriah Waterland progerr(pkg_gt(ERR_ALNUM), param); 190*5c51f124SMoriah Waterland return (1); 191*5c51f124SMoriah Waterland } 192*5c51f124SMoriah Waterland pt++; 193*5c51f124SMoriah Waterland } 194*5c51f124SMoriah Waterland 195*5c51f124SMoriah Waterland return (0); 196*5c51f124SMoriah Waterland } 197