1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 #include <stdio.h>
  23 #include <stdlib.h>
  24 #include <unistd.h>
  25 #include <libintl.h>
  26 #include <locale.h>
  27 #include <errno.h>
  28 #include <string.h>
  29 #include <stddef.h>
  30 #include <sys/types.h>
  31 
  32 #include "projent.h"
  33 #include "util.h"
  34 
  35 /*
  36  * All the below test cases were copied from perl test code located at
  37  * "usr/src/cmd/perl/contrib/Sun/Solaris/Project/t/Project.t". Part of the
  38  * Parse/Validate test cases were commented out because the implementation
  39  * of users list parsing is more permissive in this C code compared to the
  40  * original perl code. It is more consistent this way that perl way.
  41  *
  42  * For example, the original perl code assume the below test succeeds
  43  *      { 0, 0, FLAG_000, "comma8:158:::root,,:"},
  44  * On the same time, it assumes, the below this test case to fail.
  45  *      { 1, 0, FLAG_000, "comma6:195:::,,root,bin:"},
  46  * This C implementations passes both of these cases and neglect the extra
  47  * commas in both cases.
  48  */
  49 
  50 /*
  51  * file1, parse error (extra ":") on group.staff project.
  52  */
  53 #define FILE1 "test1:123:project one:root,bin:adm:attr1=a;attr2=b\n"    \
  54 "user.test2:456:project two:adm,uucp:staff:attr1=p;attr2=q\n"           \
  55 "group.test3:678:project three::root,nobody:root,lp:attr1=y;attr2=z\n"  \
  56 "test4:678:project four:root:root:\n"                                   \
  57 "test5:679:project five::sys:\n"                                        \
  58 "test6:690::::\n"
  59 
  60 /*
  61  * file2, duplicate project names.
  62  */
  63 #define FILE2 "test1:123:project one:root,bin:adm:attr1=a;attr2=b\n"    \
  64 "user.test2:456:project two:adm,uucp:staff:attr1=p;attr2=q\n"           \
  65 "group.test3:677:project three:root,nobody:root,lp:attr1=y;attr2=z\n"   \
  66 "test1:678:project four:root:root:\n"                                   \
  67 "test5:679:project five::sys:\n"                                        \
  68 "test6:690::::\n"
  69 
  70 /*
  71  * file3, duplicate project ids.
  72  */
  73 #define FILE3 "test1:123:project one:root,bin:adm:attr1=a;attr2=b\n"    \
  74 "user.test2:456:project two:adm,uucp:staff:attr1=p;attr2=q\n"           \
  75 "group.test3:677:project three:root,nobody:root,lp:attr1=y;attr2=z\n"   \
  76 "test4:678:project four:root:root:\n"                                   \
  77 "test5:678:project five::sys:\n"                                        \
  78 "test6:690::::\n"
  79 
  80 /*
  81  * file4, system project ids.
  82  */
  83 #define FILE4 "system:0::::\n"                                          \
  84 "user.root:1::::\n"                                                     \
  85 "noproject:2::::\n"                                                     \
  86 "default:3::::\n"                                                       \
  87 "group.staff:10::::\n"                                                  \
  88 "test1:123:project one:root,bin:adm:attr1=a;attr2=b\n"                  \
  89 "user.test2:456:project two:adm,uucp:staff:attr1=p;attr2=q\n"           \
  90 "group.test3:677:project three:root,nobody:root,lp:attr1=y;attr2=z\n"   \
  91 "test4:678:project four:root:root:\n"                                   \
  92 "test5:679:project five::sys:\n"                                        \
  93 "test6:690::::\n"
  94 
  95 /*
  96  * file5, all unique user projects.
  97  */
  98 #define FILE5 "test1:123:project one:root,bin:adm:attr1=a;attr2=b\n"    \
  99 "user.test2:456:project two:adm,uucp:staff:attr1=p;attr2=q\n"           \
 100 "group.test3:677:project three:root,nobody:root,lp:attr1=y;attr2=z\n"   \
 101 "test4:678:project four:root:root:\n"                                   \
 102 "test5:679:project five::sys:\n"                                        \
 103 "test6:690::::\n"
 104 
 105 
 106 #define FLAG1   (0)
 107 #define FLAG2   (F_PAR_VLD)
 108 #define FLAG3   (F_PAR_VLD | F_PAR_RES)
 109 #define FLAG4   (F_PAR_VLD | F_PAR_DUP)
 110 
 111 
 112 typedef struct {
 113         char *file;
 114         int flags;
 115         int res;
 116 } read_test;
 117 
 118 #define READ_TESTS_SIZE 20
 119 read_test rtests[READ_TESTS_SIZE] = {
 120         {FILE1, FLAG1, 1},
 121         {FILE1, FLAG2, 1},
 122         {FILE1, FLAG3, 1},
 123         {FILE1, FLAG4, 1},
 124         {FILE2, FLAG1, 0},
 125         {FILE2, FLAG2, 1},
 126         {FILE2, FLAG3, 1},
 127         {FILE2, FLAG4, 1},
 128         {FILE3, FLAG1, 0},
 129         {FILE3, FLAG2, 1},
 130         {FILE3, FLAG3, 1},
 131         {FILE3, FLAG4, 0},
 132         {FILE4, FLAG1, 0},
 133         {FILE4, FLAG2, 1},
 134         {FILE4, FLAG3, 0},
 135         {FILE4, FLAG4, 1},
 136         {FILE5, FLAG1, 0},
 137         {FILE5, FLAG2, 0},
 138         {FILE5, FLAG3, 0},
 139         {FILE5, FLAG4, 0},
 140 };
 141 
 142 
 143 typedef struct {
 144         int pres;
 145         int vres;
 146         int flags;
 147         char *pline;
 148 } parse_validate_test;
 149 
 150 
 151 
 152 #define FLAG_000 0
 153 #define FLAG_RES F_PAR_RES
 154 #define FLAG_SPC F_PAR_SPC
 155 #define FLAG_UNT F_PAR_UNT
 156 
 157 #define PARSE_VALIDATE_TESTS_SIZE       302
 158 parse_validate_test pvtests[PARSE_VALIDATE_TESTS_SIZE] = {
 159 /* positive */
 160         { 0, 0, FLAG_RES, "system:0::::"},
 161         { 0, 0, FLAG_RES, "user.root:1::::"},
 162         { 0, 0, FLAG_RES, "noproject:2::::"},
 163         { 0, 0, FLAG_RES, "default:3::::"},
 164         { 0, 0, FLAG_RES, "group.staff:10::::"},
 165         { 0, 0, FLAG_000, "long:100::::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
 166         { 0, 0, FLAG_000, "Validname:101::::"},
 167         { 0, 0, FLAG_000, "Validname2:102::::"},
 168         { 0, 0, FLAG_000, "valid3name:103::::"},
 169         { 0, 0, FLAG_000, "VALIDNAME:104::::"},
 170         { 0, 0, FLAG_000, "VALIDNAME5:105::::"},
 171         { 0, 0, FLAG_000, "vAlid5name:106::::"},
 172         { 0, 0, FLAG_000, "valid.name:107::::"},
 173         { 0, 0, FLAG_000, "valid8.NAME:108::::"},
 174         { 0, 0, FLAG_000, "Valid_name9:109::::"},
 175         { 0, 0, FLAG_000, "V_alid.name10:110::::"},
 176         { 0, 0, FLAG_000, "valid12345678901234567890123456789012345678901234567890123456789:111::::"},
 177         { 0, 0, FLAG_000, "projid:2147483647::::"},
 178         { 0, 0, FLAG_000, "comment:111: this is ! & my crazy  !@#$%^&*()_+|~`\\=-]{ 0, 0, FLAG_000,}{';\\\"/.,?>< comment:::"},
 179         { 0, 0, FLAG_000, "user1:112::*::"},
 180         { 0, 0, FLAG_000, "user2:113::!*::"},
 181         { 0, 0, FLAG_000, "user3:114::root::"},
 182         { 0, 0, FLAG_000, "user4:115::!root::"},
 183         { 0, 0, FLAG_000, "user5:116::*,!sys::"},
 184         { 0, 0, FLAG_000, "user6:117::!*,daemon::"},
 185         { 0, 0, FLAG_000, "user7:118::root,sys,daemon,bin::"},
 186         { 0, 0, FLAG_000, "user8:119::root,!sys,daemon,!bin::"},
 187         { 0, 0, FLAG_SPC, "user9:116::*, !sys::"},
 188         { 0, 0, FLAG_SPC, "user10:117::!* ,daemon::"},
 189         { 0, 0, FLAG_SPC, "user11:118::root ,sys ,daemon, bin::"},
 190         { 0, 0, FLAG_SPC, "user12:119::root, !sys, daemon ,!bin::"},
 191         { 0, 0, FLAG_000, "group1:120:::*:"},
 192         { 0, 0, FLAG_000, "group2:121:::!*:"},
 193         { 0, 0, FLAG_000, "group3:122:::root:"},
 194         { 0, 0, FLAG_000, "group4:123:::!root:"},
 195         { 0, 0, FLAG_000, "group5:124:::*,!sys:"},
 196         { 0, 0, FLAG_000, "group6:125:::!*,daemon:"},
 197         { 0, 0, FLAG_000, "group7:126:::root,sys,daemon,bin:"},
 198         { 0, 0, FLAG_000, "group8:127:::root,!sys,daemon,!bin:"},
 199         { 0, 0, FLAG_SPC, "group9:124:::*, !sys:"},
 200         { 0, 0, FLAG_SPC, "group10:125:::!* ,daemon:"},
 201         { 0, 0, FLAG_SPC, "group11:126:::root, sys ,daemon, bin:"},
 202         { 0, 0, FLAG_SPC, "group12:127:::root ,!sys, daemon ,!bin:"},
 203         { 0, 0, FLAG_000, "group9:128:::sys:"},
 204         { 0, 0, FLAG_000, "attrib1:129::::one"},
 205         { 0, 0, FLAG_000, "attrib2:130::::One"},
 206         { 0, 0, FLAG_000, "attrib3:131::::ONE"},
 207         { 0, 0, FLAG_000, "attrib4:132::::attrib10"},
 208         { 0, 0, FLAG_000, "attrib5:133::::attrib.attrib="},
 209         { 0, 0, FLAG_000, "attrib6:134::::attib_"},
 210         { 0, 0, FLAG_000, "attrib7:135::::a10-._attib"},
 211         { 0, 0, FLAG_000, "attrib8:136::::SUNW,attrib"},
 212         { 0, 0, FLAG_000, "attrib9:137::::A,A10="},
 213         { 0, 0, FLAG_000, "attrib10:138::::FIVEE,name"},
 214         { 0, 0, FLAG_000, "attrib11:139::::one;two"},
 215         { 0, 0, FLAG_000, "attrib12:140::::one=1;two=four"},
 216         { 0, 0, FLAG_000, "attrib13:141::::one;two=;three=four"},
 217         { 0, 0, FLAG_000, "value1:142::::one=foo,bar"},
 218         { 0, 0, FLAG_000, "value2:143::::one=,bar,"},
 219         { 0, 0, FLAG_000, "value3:144::::one=(foo,bar)"},
 220         { 0, 0, FLAG_000, "value4:145::::one=(foo,bar,baz),boo"},
 221         { 0, 0, FLAG_000, "value5:146::::one;two=bar,(baz),foo,((baz)),(,)"},
 222         { 0, 0, FLAG_000, "value6:147::::one=100/200"},
 223         { 0, 0, FLAG_000, "value7:148::::two=.-_/="},
 224         { 0, 0, FLAG_000, "value8:149::::name=one=two"},
 225         { 0, 0, FLAG_UNT, "value9:150::::task.max-lwps=(priv,1000M,deny,signal=SIGHUP),(priv,1000k,deny,signal=SIGKILL)"},
 226         { 0, 0, FLAG_000, "comma1:151::,::"},
 227         { 0, 0, FLAG_000, "comma2:152::,,::"},
 228         { 0, 0, FLAG_000, "comma3:153::root,::"},
 229         { 0, 0, FLAG_000, "comma4:154::bin,root,,::"},
 230         { 0, 0, FLAG_000, "comma5:155:::,:"},
 231         { 0, 0, FLAG_000, "comma6:156:::,,:"},
 232         { 0, 0, FLAG_000, "comma7:157:::bin,root,:"},
 233         { 0, 0, FLAG_000, "comma8:158:::root,,:"},
 234         { 0, 0, FLAG_000, "semi1:159::::;"},
 235         { 0, 0, FLAG_000, "semi2:160::::;;"},
 236         { 0, 0, FLAG_000, "semi3:161::::foo=(one,two);"},
 237         { 0, 0, FLAG_000, "semi4:162::::foo;;"},
 238         { 0, 0, FLAG_UNT, "rctl1:163::::task.max-lwps=(priv,1000,deny,signal=HUP),(priv,1000k,deny,signal=15)"},
 239         { 0, 0, FLAG_000, "rctl1:163::::task.max-lwps=(priv,1000,deny,signal=HUP),(priv,10001,deny,signal=15)"},
 240         { 0, 0, FLAG_000, "rctl2:164::::process.max-port-events=(basic,1000,deny)"},
 241         { 0, 0, FLAG_UNT, "rctl3:165::::project.max-crypto-memory=(priv,2.2gb,deny)"},
 242         { 0, 0, FLAG_000, "rctl3:165::::project.max-crypto-memory=(priv,10,deny)"},
 243         { 0, 0, FLAG_UNT, "rctl4:166::::project.max-crypto-memory=(privileged,100m,deny)"},
 244         { 0, 0, FLAG_000, "rctl4:166::::project.max-crypto-memory=(privileged,100,deny)"},
 245         { 0, 0, FLAG_UNT, "rctl5:167::::project.max-crypto-memory=(priv,1000m,deny)"},
 246         { 0, 0, FLAG_000, "rctl5:167::::project.max-crypto-memory=(priv,1000,deny)"},
 247         { 0, 0, FLAG_UNT, "rctl6:168::::project.max-crypto-memory=(priv,1000k,deny)"},
 248         { 0, 0, FLAG_UNT, "rctl6:168::::project.max-crypto-memory=(priv,1000m,deny)"},
 249         { 0, 0, FLAG_000, "rctl7:169::::process.max-msg-messages=(priv,10,deny)"},
 250         { 0, 0, FLAG_UNT, "rctl8:170::::process.max-msg-qbytes=(priv,10000kb,deny)"},
 251         { 0, 0, FLAG_000, "rctl8:170::::process.max-msg-qbytes=(priv,10000,deny)"},
 252         { 0, 0, FLAG_000, "rctl9:171::::process.max-sem-ops=(priv,10000000,deny)"},
 253         { 0, 0, FLAG_000, "rctl10:172::::process.max-sem-nsems=(basic,1,deny)"},
 254         { 0, 0, FLAG_UNT, "rctl11:173::::process.max-address-space=(priv,2GB,deny)"},
 255         { 0, 0, FLAG_UNT, "rctl12:174::::process.max-file-descriptor=(basic,1K,deny),(basic,2K,deny)"},
 256         { 0, 0, FLAG_UNT, "rctl13:175::::process.max-core-size=(priv,10Mb,deny),(priv,2GB,deny)"},
 257         { 0, 0, FLAG_UNT, "rctl14:176::::process.max-stack-size=(priv,1.8Gb,deny),(priv,100MB,deny)"},
 258         { 0, 0, FLAG_000, "rctl15:177::::process.max-data-size=(priv,1010100101,deny)"},
 259         { 0, 0, FLAG_UNT, "rctl16:178::::process.max-file-size=(priv,100mb,deny,signal=SIGXFSZ),(priv,1000mb,deny,signal=31)"},
 260         { 0, 0, FLAG_UNT, "rctl17:179::::process.max-cpu-time=(priv,1t,signal=XCPU),(priv,100ms,sig=30)"},
 261         { 0, 0, FLAG_UNT, "rctl18:180::::task.max-cpu-time=(priv,1M,sig=SIGKILL)"},
 262         { 0, 0, FLAG_UNT, "rctl19:181::::task.max-lwps=(basic,10,signal=1),(priv,100,deny,signal=KILL)"},
 263         { 0, 0, FLAG_000, "rctl20:182::::project.max-device-locked-memory=(priv,1000,deny,sig=TERM)"},
 264         { 0, 0, FLAG_000, "rctl21:183::::project.max-port-ids=(priv,100,deny)"},
 265         { 0, 0, FLAG_UNT, "rctl22:184::::project.max-shm-memory=(priv,1000mb,deny)"},
 266         { 0, 0, FLAG_UNT, "rctl23:185::::project.max-shm-ids=(priv,1k,deny,signal=SIGSTOP)"},
 267         { 0, 0, FLAG_UNT, "rctl24:186::::project.max-msg-ids=(priv,1m,deny,signal=XRES)"},
 268         { 0, 0, FLAG_000, "rctl25:187::::project.max-sem-ids=(priv,10,deny,signal=ABRT)"},
 269         { 0, 0, FLAG_UNT, "rctl26:188::::project.cpu-shares=(priv,63k,none)"},
 270         { 0, 0, FLAG_UNT, "rctl27:189::::zone.cpu-shares=(priv,20k,none)"},
 271         { 0, 0, FLAG_000, "rctl28:190::::zone.cpu-shares=(priv,100,none)"},
 272         { 0, 0, FLAG_UNT, "rctl29:191::::project.max-shm-memory=(priv,200G,deny)"},
 273         { 0, 0, FLAG_UNT, "rctl30:192::::project.max-shm-memory=(priv,200Gb,deny)"},
 274         { 0, 0, FLAG_UNT, "rctl31:193::::project.max-shm-memory=(priv,2000B,deny)"},
 275         { 0, 0, FLAG_000, "rctl32:194::::project.max-shm-memory=(priv,2000,deny)"},
 276         { 0, 0, FLAG_000, "rctl33:195::::task.max-cpu-time=(priv,2000,none)"},
 277         { 0, 0, FLAG_UNT, "rctl34:196::::task.max-cpu-time=(priv,2000s,none)"},
 278         { 0, 0, FLAG_UNT, "rctl35:197::::task.max-cpu-time=(priv,20.1ps,none)"},
 279         { 0, 0, FLAG_UNT, "rctl36:198::::task.max-cpu-time=(priv,20T,none)"},
 280 /* negative */
 281         { 0, 1, FLAG_000, "system:0::::"},
 282         { 0, 1, FLAG_000, "user.root:1::::"},
 283         { 0, 1, FLAG_000, "noproject:2::::"},
 284         { 0, 1, FLAG_000, "default:3::::"},
 285         { 0, 1, FLAG_000, "group.staff:10::::"},
 286         { 0, 1, FLAG_000, "long:100::::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
 287         { 1, 0, FLAG_000, "extrafields:101:::::"},
 288         { 1, 0, FLAG_000, "missingfields:102:::"},
 289         { 1, 0, FLAG_000, "_invalidname:103::::"},
 290         { 1, 0, FLAG_000, "10invlidname:104::::"},
 291         { 1, 0, FLAG_000, "invalid%name:105::::"},
 292         { 1, 0, FLAG_000, "invalid/name:106::::"},
 293         { 1, 0, FLAG_000, ".invalidname:107::::"},
 294         { 1, 0, FLAG_000, "=invalidName:108::::"},
 295         { 1, 0, FLAG_000, "invalid=name:109::::"},
 296         { 1, 0, FLAG_000, "invalid/name:110::::"},
 297         { 1, 0, FLAG_000, "/invalidname:111::::"},
 298         { 1, 0, FLAG_000, "/invalidname:112::::"},
 299         { 1, 0, FLAG_000, "invalidname*:113::::"},
 300         { 1, 0, FLAG_000, "invalid?name:114::::"},
 301         { 1, 0, FLAG_000, ":115:invalid name comment:::"},
 302         { 1, 0, FLAG_000, "invalid!name:116::::"},
 303         { 1, 0, FLAG_000, "invalidname!:117::::"},
 304         { 1, 0, FLAG_000, "invalid12345678901234567890123456789012345678901234567890123456789:118::::"},
 305         { 1, 0, FLAG_000, "projid:-1::::"},
 306         { 1, 0, FLAG_000, "projid:abc::::"},
 307         { 1, 0, FLAG_000, "projid:2147483648::::"},
 308         { 1, 0, FLAG_000, "projid:::::"},
 309         { 1, 0, FLAG_000, "user1:118::*!::"},
 310         { 1, 0, FLAG_000, "user2:119::10user::"},
 311         { 0, 1, FLAG_000, "user3:120::NOLOWER::"},
 312         { 0, 1, FLAG_000, "user4:121::toooolong::"},
 313         { 1, 0, FLAG_000, "user5:122::root!::"},
 314         { 1, 0, FLAG_000, "user6:123::root;sys::"},
 315         { 0, 1, FLAG_000, "user7:124::sys,NOLOWER::"},
 316         { 1, 0, FLAG_000, "user8:125::sys/bin,root::"},
 317         { 1, 0, FLAG_000, "user9:116::*, !sys::"},
 318         { 1, 0, FLAG_000, "user10:117::!* ,daemon::"},
 319         { 1, 0, FLAG_000, "user11:118::root ,sys ,daemon, bin::"},
 320         { 1, 0, FLAG_000, "user12:119::root, !sys, daemon ,!bin::"},
 321         { 1, 0, FLAG_000, "group1:126:::*!:"},
 322         { 0, 1, FLAG_000, "group2:127:::oneUpper:"},
 323         { 0, 1, FLAG_000, "group3:128:::NOLOWER:"},
 324         { 0, 1, FLAG_000, "group4:129:::toooolong:"},
 325         { 1, 0, FLAG_000, "group5:130:::root!:"},
 326         { 1, 0, FLAG_000, "group6:131:::root;sys:"},
 327         { 0, 1, FLAG_000, "group7:132:::sys,NOLOWER:"},
 328         { 1, 0, FLAG_000, "group8:133:::sys-bin,root:"},
 329         { 1, 0, FLAG_000, "group9:124:::*, !sys:"},
 330         { 1, 0, FLAG_000, "group10:125:::!* ,daemon:"},
 331         { 1, 0, FLAG_000, "group11:126:::root, sys ,daemon, bin:"},
 332         { 1, 0, FLAG_000, "group12:127:::root ,!sys, daemon ,!bin:"},
 333         { 1, 0, FLAG_000, "attrib1:134::::10"},
 334         { 1, 0, FLAG_000, "attrib2:135::::_foo="},
 335         { 1, 0, FLAG_000, "attrib3:136::::,foo"},
 336         { 1, 0, FLAG_000, "attrib4:137::::sun,foo"},
 337         { 1, 0, FLAG_000, "attrib6:139::::!attrib"},
 338         { 1, 0, FLAG_000, "attrib7:140::::_attrib"},
 339         { 1, 0, FLAG_000, "attrib8:141::::attib,attrib"},
 340         { 1, 0, FLAG_000, "attrib9:142::::attrib/attrib"},
 341         { 1, 0, FLAG_000, "attrib10:143::::one;two,three"},
 342         { 1, 0, FLAG_000, "attrib11:144::::one=two;three/"},
 343         { 1, 0, FLAG_000, "value1:145::::one=foo%"},
 344         { 1, 0, FLAG_000, "value2:146::::one= two"},
 345         { 1, 0, FLAG_000, "value3:147::::var=foo?"},
 346         { 1, 0, FLAG_000, "value4:148::::name=value;name=value2)"},
 347         { 1, 0, FLAG_000, "value5:149::::(foo)"},
 348         { 1, 0, FLAG_000, "value6:150::::name=(foo,bar"},
 349         { 1, 0, FLAG_000, "value7:151::::name=(value)(value)"},
 350         { 1, 0, FLAG_000, "value8:152::::name=)"},
 351         { 1, 0, FLAG_000, "value9:153::::name=value,(value value)"},
 352         { 1, 0, FLAG_000, "value10:154::::name=(value(value))"},
 353         { 1, 0, FLAG_000, "value11:155::::name=(value)value"},
 354         { 1, 0, FLAG_000, "value11:156::::name=va?lue"},
 355         { 1, 0, FLAG_000, "value12:157::::name=(value,value))"},
 356         { 1, 0, FLAG_000, "value13:158::::name=(value),value)"},
 357         { 1, 0, FLAG_000, "space1 :159::::"},
 358         { 1, 0, FLAG_000, " space2:160::::"},
 359         { 1, 0, FLAG_000, "space3: 161::::"},
 360         { 1, 0, FLAG_000, "space4:162 ::::"},
 361         { 1, 0, FLAG_000, "space 5:163::::"},
 362         { 1, 0, FLAG_000, "space6:1 64::::"},
 363         { 1, 0, FLAG_000, "space7:165:: root::"},
 364         { 1, 0, FLAG_000, "space8:166::root ::"},
 365         { 1, 0, FLAG_000, "space9:167::daemon, root::"},
 366         { 1, 0, FLAG_000, "space10:168::bin root::"},
 367         { 1, 0, FLAG_000, "space11:169::daemon ,root::"},
 368         { 1, 0, FLAG_000, "space12 :170::::"},
 369         { 1, 0, FLAG_000, " space13:171::::"},
 370         { 1, 0, FLAG_000, "space14: 172::::"},
 371         { 1, 0, FLAG_000, "space15:173 ::::"},
 372         { 1, 0, FLAG_000, "space 16:174::::"},
 373         { 1, 0, FLAG_000, "space17:1 75::::"},
 374         { 1, 0, FLAG_000, "space18:176::: root:"},
 375         { 1, 0, FLAG_000, "space19:177:::root :"},
 376         { 1, 0, FLAG_000, "space20:178:::daemon, root:"},
 377         { 1, 0, FLAG_000, "space21:179:::bin root:"},
 378         { 1, 0, FLAG_000, "space22:180:::daemon ,root:"},
 379         { 1, 0, FLAG_000, "space23:181:::: foo"},
 380         { 1, 0, FLAG_000, "space34:182::::foo =one"},
 381         { 1, 0, FLAG_000, "space35:183::::foo= (one)"},
 382         { 1, 0, FLAG_000, "space36:184::::foo=(one, two)"},
 383         { 1, 0, FLAG_000, "space37:185::::foo=(one ,two)"},
 384         { 1, 0, FLAG_000, "space38:186::::foo=( one)"},
 385         { 1, 0, FLAG_000, "space39:187::::foo=(one )"},
 386         { 1, 0, FLAG_000, "space40:188::::foo=(one) ,two"},
 387         { 1, 0, FLAG_000, "space41:189::::foo=one, (two)"},
 388 /*
 389  *      { 1, 0, FLAG_000, "comma1:190::,root,bin::"},
 390  *      { 1, 0, FLAG_000, "comma2:191::root,,bin::"},
 391  *      { 1, 0, FLAG_000, "comma3:192::,,root,bin::"},
 392  *      { 1, 0, FLAG_000, "comma4:193:::,root,bin:"},
 393  *      { 1, 0, FLAG_000, "comma5:194:::root,,bin:"},
 394  *      { 1, 0, FLAG_000, "comma6:195:::,,root,bin:"},
 395  *      { 1, 0, FLAG_000, "semi1:196::::;foo"},
 396  *      { 1, 0, FLAG_000, "semi2:197::::foo;;bar=1"},
 397  *      { 1, 0, FLAG_000, "semi3:198::::;;bar=(10)"},
 398  */
 399         { 0, 1, FLAG_000, "rctl1:199::::task.max-lwps=,"},
 400         { 0, 1, FLAG_000, "rctl2:200::::task.max-lwps="},
 401         { 0, 1, FLAG_000, "rctl3:201::::task.max-lwps=priv"},
 402         { 0, 1, FLAG_000, "rctl4:202::::task.max-lwps=priv,1000"},
 403         { 0, 1, FLAG_000, "rctl5:203::::task.max-lwps=priv,1000,deny"},
 404         { 0, 1, FLAG_000, "rctl6:204::::task.max-lwps=(priv)"},
 405         { 0, 1, FLAG_000, "rctl7:205::::task.max-lwps=(priv,1000)"},
 406         { 0, 1, FLAG_000, "rctl8:206::::task.max-lwps=(foo,100,deny)"},
 407         { 0, 1, FLAG_000, "rctl9:207::::task.max-lwps=(priv,foo,none)"},
 408         { 1, 0, FLAG_UNT, "rctl9:207::::task.max-lwps=(priv,foo,none)"},
 409         { 1, 0, FLAG_UNT, "rctl10:208::::task.max-lwps=(priv,100foo,none)"},
 410         { 0, 1, FLAG_000, "rctl11:209::::task.max-lwps=(priv,1000,foo)"},
 411         { 0, 1, FLAG_UNT, "rctl12:210::::task.max-lwps=(priv,1000k,deny,signal)"},
 412         { 0, 1, FLAG_000, "rctl13:211::::task.max-lwps=(priv,1000,deny,signal=)"},
 413         { 0, 1, FLAG_000, "rctl14:212::::task.max-lwps=(priv,1000,deny,signal=foo)"},
 414         { 0, 1, FLAG_000, "rctl15:213::::task.max-lwps=(priv,1000,deny,signal=1fo)"},
 415         { 0, 1, FLAG_000, "rctl16:214::::task.max-lwps=(priv,1000,deny,signal=100)"},
 416         { 0, 1, FLAG_000, "rctl17:215::::task.max-lwps=(priv,1000,deny,signal=SIG)"},
 417         { 0, 1, FLAG_000, "rctl18:216::::task.max-lwps=(priv,1000,deny,signal=SIG1)"},
 418         { 0, 1, FLAG_000, "rctl19:217::::task.max-lwps=(priv,1000,deny,signal=SIGhup)"},
 419         { 0, 1, FLAG_000, "rctl20:218::::task.max-lwps=(priv,1000,deny,signal=SIGHU)"},
 420         { 0, 1, FLAG_000, "rctl21:219::::task.max-lwps=(priv,1000,deny,signal=SIGHUPP)"},
 421         { 0, 1, FLAG_000, "rctl22:220::::task.max-lwps=(priv,1000,deny,signal=SIGURG)"},
 422         { 0, 1, FLAG_000, "rctl23:221::::task.max-lwps=(priv,1000,deny,signal=SIGXCPU)"},
 423         { 0, 1, FLAG_000, "rctl24:222::::task.max-lwps=(priv,1000,deny,signal=SIGKILL,10)"},
 424         { 0, 1, FLAG_000, "rctl25:223::::task.max-lwps=(priv,1000,deny,signal=SIGKILL,foo)"},
 425         { 0, 1, FLAG_000, "rctl26:224::::process.max-port-events=(priv,1000,none)"},
 426         { 0, 1, FLAG_UNT, "rctl27:225::::process.max-address-space=(basic,1024mb,deny,signal=TERM)"},
 427         { 0, 1, FLAG_000, "rctl28:226::::process.max-cpu-time=(basic,3600,deny)"},
 428         { 0, 1, FLAG_000, "rctl29:227::::task.max-lwps=()"},
 429         { 0, 1, FLAG_000, "rctl30:228::::task.max-lwps=((priv),deny)"},
 430         { 0, 1, FLAG_000, "rctl31:229::::task.max-lwps=((priv,1000,deny))"},
 431         { 0, 1, FLAG_000, "rctl32:230::::task.max-lwps=(priv,((1000,2000,1000)),deny)"},
 432         { 0, 1, FLAG_000, "rctl33:231::::task.max-lwps=(,,,)"},
 433         { 0, 1, FLAG_000, "rctl34:232::::task.max-lwps=(priv,1000,(deny))"},
 434         { 0, 1, FLAG_000, "rctl35:233::::task.max-lwps=(priv,1000,deny),foo"},
 435         { 0, 1, FLAG_000, "rctl36:234::::task.max-lwps=(priv,1000,deny),(priv,1000)"},
 436         { 1, 0, FLAG_UNT, "rctl37:235::::project.max-msg-ids=(priv,15EB,deny)"},
 437         { 1, 0, FLAG_UNT, "rctl38:236::::process.max-address-space=(priv,16.1EB,deny)"},
 438         { 1, 0, FLAG_UNT, "rctl39:237::::process.max-address-space=(priv,18000000000gb,deny)"},
 439         { 1, 0, FLAG_UNT, "rctl40:238::::zone.cpu-shares=(priv,10kb,none)"},
 440         { 1, 0, FLAG_UNT, "rctl41:239::::zone.cpu-shares=(priv,10Ks,none)"},
 441         { 1, 0, FLAG_UNT, "rctl42:240::::zone.cpu-shares=(priv,10s,none)"},
 442         { 1, 0, FLAG_UNT, "rctl43:241::::zone.cpu-shares=(priv,100000b,none)"},
 443         { 1, 0, FLAG_UNT, "rctl44:242::::project.max-shm-memory=(priv,200Ts,deny)"},
 444         { 1, 0, FLAG_UNT, "rctl45:243::::project.max-shm-memory=(priv,200s,deny)"},
 445         { 1, 0, FLAG_UNT, "rctl46:244::::task.max-cpu-time=(priv,20B,none)"},
 446         { 1, 0, FLAG_UNT, "rctl47:245::::task.max-cpu-time=(priv,20Kb,none)"},
 447         { 0, 1, FLAG_UNT, "rctl48:246::::project.cpu-shares=(priv,100k,none)"},
 448         { 0, 1, FLAG_000, "rctl147:150::::task.max-lwps=(priv,1000M,deny,signal=SIGHUP),(priv,1000k,deny,signal=SIGKILL)"},
 449         { 0, 1, FLAG_000, "rctl148:163::::task.max-lwps=(priv,1000,deny,signal=HUP),(priv,1000k,deny,signal=15)"},
 450         { 0, 1, FLAG_000, "rctl3:165::::project.max-crypto-memory=(priv,10eb,deny)"},
 451         { 0, 1, FLAG_000, "rctl4:166::::project.max-crypto-memory=(privileged,100p,deny)"},
 452         { 0, 1, FLAG_000, "rctl5:167::::project.max-crypto-memory=(priv,1000t,deny)"},
 453         { 0, 1, FLAG_000, "rctl6:168::::project.max-crypto-memory=(priv,1000g,deny)"},
 454         { 0, 1, FLAG_000, "rctl7:169::::process.max-msg-messages=(priv,10m,deny)"},
 455         { 0, 1, FLAG_000, "rctl8:170::::process.max-msg-qbytes=(priv,10000kb,deny)"},
 456         { 0, 1, FLAG_000, "rctl11:173::::process.max-address-space=(priv,10EB,deny)"},
 457         { 0, 1, FLAG_000, "rctl12:174::::process.max-file-descriptor=(basic,1K,deny),(basic,2K,deny)"},
 458         { 0, 1, FLAG_000, "rctl13:175::::process.max-core-size=(priv,1Eb,deny),(priv,10PB,deny)"},
 459         { 0, 1, FLAG_000, "rctl14:176::::process.max-stack-size=(priv,10Tb,deny),(priv,10TB,deny)"},
 460         { 0, 1, FLAG_000, "rctl16:178::::process.max-file-size=(priv,100mb,deny,signal=SIGXFSZ),(priv,1000mb,deny,signal=31)"},
 461         { 0, 1, FLAG_000, "rctl17:179::::process.max-cpu-time=(priv,1t,signal=XCPU),(priv,100ms,sig=30)"},
 462         { 0, 1, FLAG_000, "rctl18:180::::task.max-cpu-time=(priv,1M,sig=SIGKILL)"},
 463         { 0, 1, FLAG_000, "rctl22:184::::project.max-shm-memory=(priv,1000mb,deny)"},
 464         { 0, 1, FLAG_000, "rctl23:185::::project.max-shm-ids=(priv,1k,deny,signal=SIGSTOP)"},
 465         { 0, 1, FLAG_000, "rctl24:186::::project.max-msg-ids=(priv,1m,deny,signal=XRES)"},
 466         { 0, 1, FLAG_000, "rctl26:188::::project.cpu-shares=(priv,63k,none)"},
 467         { 0, 1, FLAG_000, "rctl27:189::::zone.cpu-shares=(priv,20k,none)"},
 468         { 0, 1, FLAG_000, "rctl29:191::::project.max-shm-memory=(priv,200G,deny)"},
 469         { 0, 1, FLAG_000, "rctl30:192::::project.max-shm-memory=(priv,200Gb,deny)"},
 470         { 0, 1, FLAG_000, "rctl31:193::::project.max-shm-memory=(priv,2000B,deny)"},
 471         { 0, 1, FLAG_000, "rctl34:196::::task.max-cpu-time=(priv,2000s,none)"},
 472         { 0, 1, FLAG_000, "rctl35:197::::task.max-cpu-time=(priv,20.1ps,none)"},
 473         { 0, 1, FLAG_000, "rctl36:198::::task.max-cpu-time=(priv,20T,none)"},
 474 };
 475 
 476 
 477 boolean_t vflag = B_FALSE;
 478 boolean_t kflag = B_FALSE;
 479 
 480 int
 481 projtest_compare_two_files(char *file1, char *file2, lst_t *errlst)
 482 {
 483         FILE *fp1, *fp2;
 484         int c1, c2;
 485 
 486         if ((fp1 = fopen(file1, "r")) == NULL) {
 487                 util_add_errmsg(errlst, "failed to open \"%s\"", file1);
 488                 return (1);
 489         }
 490 
 491         if ((fp2 = fopen(file2, "r")) == NULL) {
 492                 util_add_errmsg(errlst, "failed to open \"%s\"", file2);
 493                 return (1);
 494         }
 495 
 496         c1 = getc(fp1);
 497         c2 = getc(fp2);
 498         while ((c1 != EOF) && (c2 != EOF) && (c1 == c2)) {
 499                 c1 = getc(fp1);
 500                 c2 = getc(fp2);
 501         }
 502         (void) fclose(fp1);
 503         (void) fclose(fp2);
 504 
 505         if (c1 != c2) {
 506                 util_add_errmsg(errlst, "files differ \"%s\" \"%s\"",
 507                     file1, file2);
 508                 return (1);
 509         }
 510 
 511         return (0);
 512 }
 513 
 514 void
 515 projtest_free_errlst(lst_t *errlst)
 516 {
 517         char *msg;
 518         while (!lst_is_empty(errlst)) {
 519                 msg = lst_at(errlst,  0);
 520                 (void) lst_remove(errlst, msg);
 521                 free(msg);
 522         }
 523 }
 524 
 525 void
 526 do_read_test(read_test *rt, int tnum)
 527 {
 528         FILE *fp;
 529         char *projfile, *projwrite;
 530         lst_t *plst;
 531         lst_t errlst;
 532         lst_create(&errlst);
 533 
 534 
 535         (void) asprintf(&projfile, "/tmp/project_%ld_%d_tmp", getpid(), tnum);
 536         (void) unlink(projfile);
 537         if ((fp = fopen(projfile, "wx")) == NULL) {
 538                 (void) fprintf(stderr, "error opening %s\n", projfile);
 539                 exit(1);
 540         }
 541         (void) fputs(rt->file, fp);
 542         (void) fclose(fp);
 543 
 544         (void) asprintf(&projwrite, "/tmp/project_%ld_%d_wrt", getpid(), tnum);
 545         if ((fp = fopen(projwrite, "wx")) == NULL) {
 546                 (void) fprintf(stderr, "error opening %s\n", projfile);
 547                 exit(1);
 548         }
 549         (void) fclose(fp);
 550 
 551 
 552         plst = projent_get_lst(projfile, rt->flags, &errlst);
 553 
 554 
 555         if (plst == NULL && rt->res == 1) {
 556                 (void) printf("Read test[%02d]: **************[-SUCCESS-]\n",
 557                     tnum);
 558         } else if (plst != NULL && rt->res == 0) {
 559 
 560                 projent_put_lst(projwrite, plst, &errlst);
 561                 (void) projtest_compare_two_files(projfile, projwrite, &errlst);
 562                 (void) printf("Read test[%02d]: **************[%s]\n", tnum,
 563                     lst_is_empty(&errlst) ? "-SUCCESS-" : "*FAILURE*");
 564 
 565         } else {
 566                 (void) printf("Read test[%02d]: **************[*FAILURE*]\n",
 567                     tnum);
 568         }
 569 
 570         if (vflag) {
 571                 util_print_errmsgs(&errlst);
 572         }
 573 
 574         if (!kflag) {
 575                 (void) unlink(projfile);
 576                 (void) unlink(projwrite);
 577         }
 578 
 579         projent_free_lst(plst);
 580         projtest_free_errlst(&errlst);
 581 }
 582 
 583 
 584 void
 585 do_parse_validate_test(parse_validate_test *pvt, int tnum)
 586 {
 587         lst_t errlst;
 588         projent_t *ent;
 589         int vres;
 590 
 591 
 592         lst_create(&errlst);
 593 
 594 
 595         ent = projent_parse(pvt->pline, pvt->flags, &errlst);
 596 
 597         if (ent == NULL && pvt->pres == 1) {
 598                 (void) printf("Prse test[%02d]: **************[-SUCCESS-]\n", tnum);
 599         } else if (ent != NULL && pvt->pres == 0) {
 600                 (void) printf("Prse test[%02d]: **************[-SUCCESS-]\n", tnum);
 601                 vres = projent_validate(ent, pvt->flags, &errlst);
 602                 (void) printf("Vdte test[%02d]: **************[%s]\n", tnum,
 603                     ((vres == 0 && pvt->vres == 0) ||
 604                     (vres != 0 && pvt->vres != 0)) ?
 605                     "-SUCCESS-" : "*FAILURE*");
 606         } else {
 607                 (void) printf("Prse test[%02d]: **************[*FAILURE*]\n", tnum);
 608         }
 609 
 610         if (vflag) {
 611                 util_print_errmsgs(&errlst);
 612         }
 613 
 614         if (ent != NULL) {
 615                 projent_free(ent);
 616                 free(ent);
 617         }
 618         projtest_free_errlst(&errlst);
 619 }
 620 
 621 void
 622 start_read_test(void)
 623 {
 624         int i;
 625         for (i = 0; i < READ_TESTS_SIZE; i++) {
 626                 do_read_test(&rtests[i], i);
 627         }
 628 }
 629 
 630 void
 631 start_parse_validate_test(void)
 632 {
 633         int i;
 634         for (i = 0; i < PARSE_VALIDATE_TESTS_SIZE; i++) {
 635                 do_parse_validate_test(&pvtests[i], i);
 636         }
 637 }
 638 
 639 void
 640 usage(void)
 641 {
 642         (void) fprintf(stderr,
 643             "Usage:\n"
 644             "projtest [-k] [-v]\n");
 645 }
 646 
 647 int
 648 main(int argc, char **argv)
 649 {
 650         int c;
 651 
 652         while ((c = getopt(argc, argv, "vk")) != EOF) {
 653                 switch (c) {
 654                         case 'v':
 655                                 vflag = B_TRUE;
 656                                 break;
 657                         case 'k':
 658                                 kflag = B_TRUE;
 659                                 break;
 660                         default:
 661                                 usage();
 662                                 exit(1);
 663                                 break;
 664                 }
 665         }
 666 
 667         start_read_test();
 668         start_parse_validate_test();
 669         return (0);
 670 }