xref: /freebsd/lib/libcasper/services/cap_grp/tests/grp_test.c (revision 5c2bc3db201a4fe8d7911cf816bea104d5dc2138)
1d3bfc725SMariusz Zaborski /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
328b6f7c8SMariusz Zaborski  *
4d3bfc725SMariusz Zaborski  * Copyright (c) 2013 The FreeBSD Foundation
5d3bfc725SMariusz Zaborski  *
6d3bfc725SMariusz Zaborski  * This software was developed by Pawel Jakub Dawidek under sponsorship from
7d3bfc725SMariusz Zaborski  * the FreeBSD Foundation.
8d3bfc725SMariusz Zaborski  *
9d3bfc725SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
10d3bfc725SMariusz Zaborski  * modification, are permitted provided that the following conditions
11d3bfc725SMariusz Zaborski  * are met:
12d3bfc725SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
13d3bfc725SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
14d3bfc725SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
15d3bfc725SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
16d3bfc725SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
17d3bfc725SMariusz Zaborski  *
18d3bfc725SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
19d3bfc725SMariusz Zaborski  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20d3bfc725SMariusz Zaborski  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21d3bfc725SMariusz Zaborski  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
22d3bfc725SMariusz Zaborski  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23d3bfc725SMariusz Zaborski  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24d3bfc725SMariusz Zaborski  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25d3bfc725SMariusz Zaborski  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26d3bfc725SMariusz Zaborski  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27d3bfc725SMariusz Zaborski  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28d3bfc725SMariusz Zaborski  * SUCH DAMAGE.
29d3bfc725SMariusz Zaborski  */
30d3bfc725SMariusz Zaborski 
31d3bfc725SMariusz Zaborski #include <sys/capsicum.h>
32ceb36bc9SMariusz Zaborski #include <sys/nv.h>
33d3bfc725SMariusz Zaborski 
34d3bfc725SMariusz Zaborski #include <assert.h>
35d3bfc725SMariusz Zaborski #include <err.h>
36d3bfc725SMariusz Zaborski #include <errno.h>
37d3bfc725SMariusz Zaborski #include <grp.h>
38d3bfc725SMariusz Zaborski #include <stdio.h>
39d3bfc725SMariusz Zaborski #include <stdlib.h>
40d3bfc725SMariusz Zaborski #include <string.h>
41d3bfc725SMariusz Zaborski #include <unistd.h>
42d3bfc725SMariusz Zaborski 
43d3bfc725SMariusz Zaborski #include <libcasper.h>
44d3bfc725SMariusz Zaborski 
45d3bfc725SMariusz Zaborski #include <casper/cap_grp.h>
46d3bfc725SMariusz Zaborski 
47d3bfc725SMariusz Zaborski static int ntest = 1;
48d3bfc725SMariusz Zaborski 
49d3bfc725SMariusz Zaborski #define CHECK(expr)     do {						\
50d3bfc725SMariusz Zaborski 	if ((expr))							\
51d3bfc725SMariusz Zaborski 		printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__);	\
52d3bfc725SMariusz Zaborski 	else								\
53d3bfc725SMariusz Zaborski 		printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__);	\
54ebe3e93cSEnji Cooper 	fflush(stdout);							\
55d3bfc725SMariusz Zaborski 	ntest++;							\
56d3bfc725SMariusz Zaborski } while (0)
57d3bfc725SMariusz Zaborski #define CHECKX(expr)     do {						\
58d3bfc725SMariusz Zaborski 	if ((expr)) {							\
59d3bfc725SMariusz Zaborski 		printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__);	\
60d3bfc725SMariusz Zaborski 	} else {							\
61d3bfc725SMariusz Zaborski 		printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__);	\
62d3bfc725SMariusz Zaborski 		exit(1);						\
63d3bfc725SMariusz Zaborski 	}								\
64ebe3e93cSEnji Cooper 	fflush(stdout);							\
65d3bfc725SMariusz Zaborski 	ntest++;							\
66d3bfc725SMariusz Zaborski } while (0)
67d3bfc725SMariusz Zaborski 
68d3bfc725SMariusz Zaborski #define	GID_WHEEL	0
69d3bfc725SMariusz Zaborski #define	GID_OPERATOR	5
70d3bfc725SMariusz Zaborski 
71d3bfc725SMariusz Zaborski #define	GETGRENT0	0x0001
72d3bfc725SMariusz Zaborski #define	GETGRENT1	0x0002
73d3bfc725SMariusz Zaborski #define	GETGRENT2	0x0004
74d3bfc725SMariusz Zaborski #define	GETGRENT	(GETGRENT0 | GETGRENT1 | GETGRENT2)
75d3bfc725SMariusz Zaborski #define	GETGRENT_R0	0x0008
76d3bfc725SMariusz Zaborski #define	GETGRENT_R1	0x0010
77d3bfc725SMariusz Zaborski #define	GETGRENT_R2	0x0020
78d3bfc725SMariusz Zaborski #define	GETGRENT_R	(GETGRENT_R0 | GETGRENT_R1 | GETGRENT_R2)
79d3bfc725SMariusz Zaborski #define	GETGRNAM	0x0040
80d3bfc725SMariusz Zaborski #define	GETGRNAM_R	0x0080
81d3bfc725SMariusz Zaborski #define	GETGRGID	0x0100
82d3bfc725SMariusz Zaborski #define	GETGRGID_R	0x0200
83d3bfc725SMariusz Zaborski #define	SETGRENT	0x0400
84d3bfc725SMariusz Zaborski 
85d3bfc725SMariusz Zaborski static bool
86d3bfc725SMariusz Zaborski group_mem_compare(char **mem0, char **mem1)
87d3bfc725SMariusz Zaborski {
88d3bfc725SMariusz Zaborski 	int i0, i1;
89d3bfc725SMariusz Zaborski 
90d3bfc725SMariusz Zaborski 	if (mem0 == NULL && mem1 == NULL)
91d3bfc725SMariusz Zaborski 		return (true);
92d3bfc725SMariusz Zaborski 	if (mem0 == NULL || mem1 == NULL)
93d3bfc725SMariusz Zaborski 		return (false);
94d3bfc725SMariusz Zaborski 
95d3bfc725SMariusz Zaborski 	for (i0 = 0; mem0[i0] != NULL; i0++) {
96d3bfc725SMariusz Zaborski 		for (i1 = 0; mem1[i1] != NULL; i1++) {
97d3bfc725SMariusz Zaborski 			if (strcmp(mem0[i0], mem1[i1]) == 0)
98d3bfc725SMariusz Zaborski 				break;
99d3bfc725SMariusz Zaborski 		}
100d3bfc725SMariusz Zaborski 		if (mem1[i1] == NULL)
101d3bfc725SMariusz Zaborski 			return (false);
102d3bfc725SMariusz Zaborski 	}
103d3bfc725SMariusz Zaborski 
104d3bfc725SMariusz Zaborski 	return (true);
105d3bfc725SMariusz Zaborski }
106d3bfc725SMariusz Zaborski 
107d3bfc725SMariusz Zaborski static bool
108d3bfc725SMariusz Zaborski group_compare(const struct group *grp0, const struct group *grp1)
109d3bfc725SMariusz Zaborski {
110d3bfc725SMariusz Zaborski 
111d3bfc725SMariusz Zaborski 	if (grp0 == NULL && grp1 == NULL)
112d3bfc725SMariusz Zaborski 		return (true);
113d3bfc725SMariusz Zaborski 	if (grp0 == NULL || grp1 == NULL)
114d3bfc725SMariusz Zaborski 		return (false);
115d3bfc725SMariusz Zaborski 
116d3bfc725SMariusz Zaborski 	if (strcmp(grp0->gr_name, grp1->gr_name) != 0)
117d3bfc725SMariusz Zaborski 		return (false);
118d3bfc725SMariusz Zaborski 
119d3bfc725SMariusz Zaborski 	if (grp0->gr_passwd != NULL || grp1->gr_passwd != NULL) {
120d3bfc725SMariusz Zaborski 		if (grp0->gr_passwd == NULL || grp1->gr_passwd == NULL)
121d3bfc725SMariusz Zaborski 			return (false);
122d3bfc725SMariusz Zaborski 		if (strcmp(grp0->gr_passwd, grp1->gr_passwd) != 0)
123d3bfc725SMariusz Zaborski 			return (false);
124d3bfc725SMariusz Zaborski 	}
125d3bfc725SMariusz Zaborski 
126d3bfc725SMariusz Zaborski 	if (grp0->gr_gid != grp1->gr_gid)
127d3bfc725SMariusz Zaborski 		return (false);
128d3bfc725SMariusz Zaborski 
129d3bfc725SMariusz Zaborski 	if (!group_mem_compare(grp0->gr_mem, grp1->gr_mem))
130d3bfc725SMariusz Zaborski 		return (false);
131d3bfc725SMariusz Zaborski 
132d3bfc725SMariusz Zaborski 	return (true);
133d3bfc725SMariusz Zaborski }
134d3bfc725SMariusz Zaborski 
135d3bfc725SMariusz Zaborski static unsigned int
136d3bfc725SMariusz Zaborski runtest_cmds(cap_channel_t *capgrp)
137d3bfc725SMariusz Zaborski {
138d3bfc725SMariusz Zaborski 	char bufs[1024], bufc[1024];
139d3bfc725SMariusz Zaborski 	unsigned int result;
140d3bfc725SMariusz Zaborski 	struct group *grps, *grpc;
141d3bfc725SMariusz Zaborski 	struct group sts, stc;
142d3bfc725SMariusz Zaborski 
143d3bfc725SMariusz Zaborski 	result = 0;
144d3bfc725SMariusz Zaborski 
145d3bfc725SMariusz Zaborski 	(void)setgrent();
146d3bfc725SMariusz Zaborski 	if (cap_setgrent(capgrp) == 1)
147d3bfc725SMariusz Zaborski 		result |= SETGRENT;
148d3bfc725SMariusz Zaborski 
149d3bfc725SMariusz Zaborski 	grps = getgrent();
150d3bfc725SMariusz Zaborski 	grpc = cap_getgrent(capgrp);
151d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc)) {
152d3bfc725SMariusz Zaborski 		result |= GETGRENT0;
153d3bfc725SMariusz Zaborski 		grps = getgrent();
154d3bfc725SMariusz Zaborski 		grpc = cap_getgrent(capgrp);
155d3bfc725SMariusz Zaborski 		if (group_compare(grps, grpc))
156d3bfc725SMariusz Zaborski 			result |= GETGRENT1;
157d3bfc725SMariusz Zaborski 	}
158d3bfc725SMariusz Zaborski 
159d3bfc725SMariusz Zaborski 	getgrent_r(&sts, bufs, sizeof(bufs), &grps);
160d3bfc725SMariusz Zaborski 	cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
161d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc)) {
162d3bfc725SMariusz Zaborski 		result |= GETGRENT_R0;
163d3bfc725SMariusz Zaborski 		getgrent_r(&sts, bufs, sizeof(bufs), &grps);
164d3bfc725SMariusz Zaborski 		cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
165d3bfc725SMariusz Zaborski 		if (group_compare(grps, grpc))
166d3bfc725SMariusz Zaborski 			result |= GETGRENT_R1;
167d3bfc725SMariusz Zaborski 	}
168d3bfc725SMariusz Zaborski 
169d3bfc725SMariusz Zaborski 	(void)setgrent();
170d3bfc725SMariusz Zaborski 	if (cap_setgrent(capgrp) == 1)
171d3bfc725SMariusz Zaborski 		result |= SETGRENT;
172d3bfc725SMariusz Zaborski 
173d3bfc725SMariusz Zaborski 	getgrent_r(&sts, bufs, sizeof(bufs), &grps);
174d3bfc725SMariusz Zaborski 	cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
175d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc))
176d3bfc725SMariusz Zaborski 		result |= GETGRENT_R2;
177d3bfc725SMariusz Zaborski 
178d3bfc725SMariusz Zaborski 	grps = getgrent();
179d3bfc725SMariusz Zaborski 	grpc = cap_getgrent(capgrp);
180d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc))
181d3bfc725SMariusz Zaborski 		result |= GETGRENT2;
182d3bfc725SMariusz Zaborski 
183d3bfc725SMariusz Zaborski 	grps = getgrnam("wheel");
184d3bfc725SMariusz Zaborski 	grpc = cap_getgrnam(capgrp, "wheel");
185d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc)) {
186d3bfc725SMariusz Zaborski 		grps = getgrnam("operator");
187d3bfc725SMariusz Zaborski 		grpc = cap_getgrnam(capgrp, "operator");
188d3bfc725SMariusz Zaborski 		if (group_compare(grps, grpc))
189d3bfc725SMariusz Zaborski 			result |= GETGRNAM;
190d3bfc725SMariusz Zaborski 	}
191d3bfc725SMariusz Zaborski 
192d3bfc725SMariusz Zaborski 	getgrnam_r("wheel", &sts, bufs, sizeof(bufs), &grps);
193d3bfc725SMariusz Zaborski 	cap_getgrnam_r(capgrp, "wheel", &stc, bufc, sizeof(bufc), &grpc);
194d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc)) {
195d3bfc725SMariusz Zaborski 		getgrnam_r("operator", &sts, bufs, sizeof(bufs), &grps);
196d3bfc725SMariusz Zaborski 		cap_getgrnam_r(capgrp, "operator", &stc, bufc, sizeof(bufc),
197d3bfc725SMariusz Zaborski 		    &grpc);
198d3bfc725SMariusz Zaborski 		if (group_compare(grps, grpc))
199d3bfc725SMariusz Zaborski 			result |= GETGRNAM_R;
200d3bfc725SMariusz Zaborski 	}
201d3bfc725SMariusz Zaborski 
202d3bfc725SMariusz Zaborski 	grps = getgrgid(GID_WHEEL);
203d3bfc725SMariusz Zaborski 	grpc = cap_getgrgid(capgrp, GID_WHEEL);
204d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc)) {
205d3bfc725SMariusz Zaborski 		grps = getgrgid(GID_OPERATOR);
206d3bfc725SMariusz Zaborski 		grpc = cap_getgrgid(capgrp, GID_OPERATOR);
207d3bfc725SMariusz Zaborski 		if (group_compare(grps, grpc))
208d3bfc725SMariusz Zaborski 			result |= GETGRGID;
209d3bfc725SMariusz Zaborski 	}
210d3bfc725SMariusz Zaborski 
211d3bfc725SMariusz Zaborski 	getgrgid_r(GID_WHEEL, &sts, bufs, sizeof(bufs), &grps);
212d3bfc725SMariusz Zaborski 	cap_getgrgid_r(capgrp, GID_WHEEL, &stc, bufc, sizeof(bufc), &grpc);
213d3bfc725SMariusz Zaborski 	if (group_compare(grps, grpc)) {
214d3bfc725SMariusz Zaborski 		getgrgid_r(GID_OPERATOR, &sts, bufs, sizeof(bufs), &grps);
215d3bfc725SMariusz Zaborski 		cap_getgrgid_r(capgrp, GID_OPERATOR, &stc, bufc, sizeof(bufc),
216d3bfc725SMariusz Zaborski 		    &grpc);
217d3bfc725SMariusz Zaborski 		if (group_compare(grps, grpc))
218d3bfc725SMariusz Zaborski 			result |= GETGRGID_R;
219d3bfc725SMariusz Zaborski 	}
220d3bfc725SMariusz Zaborski 
221d3bfc725SMariusz Zaborski 	return (result);
222d3bfc725SMariusz Zaborski }
223d3bfc725SMariusz Zaborski 
224d3bfc725SMariusz Zaborski static void
225d3bfc725SMariusz Zaborski test_cmds(cap_channel_t *origcapgrp)
226d3bfc725SMariusz Zaborski {
227d3bfc725SMariusz Zaborski 	cap_channel_t *capgrp;
228d3bfc725SMariusz Zaborski 	const char *cmds[7], *fields[4], *names[5];
229d3bfc725SMariusz Zaborski 	gid_t gids[5];
230d3bfc725SMariusz Zaborski 
231d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
232d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
233d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
234d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
235d3bfc725SMariusz Zaborski 
236d3bfc725SMariusz Zaborski 	names[0] = "wheel";
237d3bfc725SMariusz Zaborski 	names[1] = "daemon";
238d3bfc725SMariusz Zaborski 	names[2] = "kmem";
239d3bfc725SMariusz Zaborski 	names[3] = "sys";
240d3bfc725SMariusz Zaborski 	names[4] = "operator";
241d3bfc725SMariusz Zaborski 
242d3bfc725SMariusz Zaborski 	gids[0] = 0;
243d3bfc725SMariusz Zaborski 	gids[1] = 1;
244d3bfc725SMariusz Zaborski 	gids[2] = 2;
245d3bfc725SMariusz Zaborski 	gids[3] = 3;
246d3bfc725SMariusz Zaborski 	gids[4] = 5;
247d3bfc725SMariusz Zaborski 
248d3bfc725SMariusz Zaborski 	/*
249d3bfc725SMariusz Zaborski 	 * Allow:
250d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
251d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
252d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
253d3bfc725SMariusz Zaborski 	 * groups:
254d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
255d3bfc725SMariusz Zaborski 	 *     gids:
256d3bfc725SMariusz Zaborski 	 */
257d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
258d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
259d3bfc725SMariusz Zaborski 
260d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
261d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
262d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
263d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
264d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
265d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
266d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
267d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);
268d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
269d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
270d3bfc725SMariusz Zaborski 
271d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
272d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
273d3bfc725SMariusz Zaborski 
274d3bfc725SMariusz Zaborski 	cap_close(capgrp);
275d3bfc725SMariusz Zaborski 
276d3bfc725SMariusz Zaborski 	/*
277d3bfc725SMariusz Zaborski 	 * Allow:
278d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
279d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
280d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
281d3bfc725SMariusz Zaborski 	 * groups:
282d3bfc725SMariusz Zaborski 	 *     names:
283d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
284d3bfc725SMariusz Zaborski 	 */
285d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
286d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
287d3bfc725SMariusz Zaborski 
288d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
289d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
290d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
291d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
292d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
293d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
294d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
295d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);
296d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
297d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
298d3bfc725SMariusz Zaborski 
299d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
300d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
301d3bfc725SMariusz Zaborski 
302d3bfc725SMariusz Zaborski 	cap_close(capgrp);
303d3bfc725SMariusz Zaborski 
304d3bfc725SMariusz Zaborski 	/*
305d3bfc725SMariusz Zaborski 	 * Allow:
306d3bfc725SMariusz Zaborski 	 * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,
307d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
308d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
309d3bfc725SMariusz Zaborski 	 * groups:
310d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
311d3bfc725SMariusz Zaborski 	 *     gids:
312d3bfc725SMariusz Zaborski 	 * Disallow:
313d3bfc725SMariusz Zaborski 	 * cmds: setgrent
314d3bfc725SMariusz Zaborski 	 * fields:
315d3bfc725SMariusz Zaborski 	 * groups:
316d3bfc725SMariusz Zaborski 	 */
317d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
318d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
319d3bfc725SMariusz Zaborski 
3201a05d951SMark Johnston 	cap_setgrent(capgrp);
3211a05d951SMark Johnston 
322d3bfc725SMariusz Zaborski 	cmds[0] = "getgrent";
323d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent_r";
324d3bfc725SMariusz Zaborski 	cmds[2] = "getgrnam";
325d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
326d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
327d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
328d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
329d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
330d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
331d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
332d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
333d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
334d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
335d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
336d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
337d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
338d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
339d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
340d3bfc725SMariusz Zaborski 
341d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |
342d3bfc725SMariusz Zaborski 	    GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
343d3bfc725SMariusz Zaborski 
344d3bfc725SMariusz Zaborski 	cap_close(capgrp);
345d3bfc725SMariusz Zaborski 
346d3bfc725SMariusz Zaborski 	/*
347d3bfc725SMariusz Zaborski 	 * Allow:
348d3bfc725SMariusz Zaborski 	 * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,
349d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
350d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
351d3bfc725SMariusz Zaborski 	 * groups:
352d3bfc725SMariusz Zaborski 	 *     names:
353d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
354d3bfc725SMariusz Zaborski 	 * Disallow:
355d3bfc725SMariusz Zaborski 	 * cmds: setgrent
356d3bfc725SMariusz Zaborski 	 * fields:
357d3bfc725SMariusz Zaborski 	 * groups:
358d3bfc725SMariusz Zaborski 	 */
359d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
360d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
361d3bfc725SMariusz Zaborski 
3621a05d951SMark Johnston 	cap_setgrent(capgrp);
3631a05d951SMark Johnston 
364d3bfc725SMariusz Zaborski 	cmds[0] = "getgrent";
365d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent_r";
366d3bfc725SMariusz Zaborski 	cmds[2] = "getgrnam";
367d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
368d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
369d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
370d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
371d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
372d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
373d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
374d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
375d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
376d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
377d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
378d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
379d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
380d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
381d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
382d3bfc725SMariusz Zaborski 
383d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |
384d3bfc725SMariusz Zaborski 	    GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
385d3bfc725SMariusz Zaborski 
386d3bfc725SMariusz Zaborski 	cap_close(capgrp);
387d3bfc725SMariusz Zaborski 
388d3bfc725SMariusz Zaborski 	/*
389d3bfc725SMariusz Zaborski 	 * Allow:
390d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,
391d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
392d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
393d3bfc725SMariusz Zaborski 	 * groups:
394d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
395d3bfc725SMariusz Zaborski 	 *     gids:
396d3bfc725SMariusz Zaborski 	 * Disallow:
397d3bfc725SMariusz Zaborski 	 * cmds: getgrent
398d3bfc725SMariusz Zaborski 	 * fields:
399d3bfc725SMariusz Zaborski 	 * groups:
400d3bfc725SMariusz Zaborski 	 */
401d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
402d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
403d3bfc725SMariusz Zaborski 
404d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
405d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent_r";
406d3bfc725SMariusz Zaborski 	cmds[2] = "getgrnam";
407d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
408d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
409d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
410d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
411d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
412d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
413d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
414d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
415d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
416d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
417d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
418d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
419d3bfc725SMariusz Zaborski 	cmds[0] = "getgrent";
420d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
421d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
422d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
423d3bfc725SMariusz Zaborski 
424d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |
425d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
426d3bfc725SMariusz Zaborski 
427d3bfc725SMariusz Zaborski 	cap_close(capgrp);
428d3bfc725SMariusz Zaborski 
429d3bfc725SMariusz Zaborski 	/*
430d3bfc725SMariusz Zaborski 	 * Allow:
431d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,
432d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
433d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
434d3bfc725SMariusz Zaborski 	 * groups:
435d3bfc725SMariusz Zaborski 	 *     names:
436d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
437d3bfc725SMariusz Zaborski 	 * Disallow:
438d3bfc725SMariusz Zaborski 	 * cmds: getgrent
439d3bfc725SMariusz Zaborski 	 * fields:
440d3bfc725SMariusz Zaborski 	 * groups:
441d3bfc725SMariusz Zaborski 	 */
442d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
443d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
444d3bfc725SMariusz Zaborski 
445d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
446d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent_r";
447d3bfc725SMariusz Zaborski 	cmds[2] = "getgrnam";
448d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
449d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
450d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
451d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
452d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
453d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
454d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
455d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
456d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
457d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
458d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
459d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
460d3bfc725SMariusz Zaborski 	cmds[0] = "getgrent";
461d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
462d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
463d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
464d3bfc725SMariusz Zaborski 
465d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |
466d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
467d3bfc725SMariusz Zaborski 
468d3bfc725SMariusz Zaborski 	cap_close(capgrp);
469d3bfc725SMariusz Zaborski 
470d3bfc725SMariusz Zaborski 	/*
471d3bfc725SMariusz Zaborski 	 * Allow:
472d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrnam, getgrnam_r,
473d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
474d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
475d3bfc725SMariusz Zaborski 	 * groups:
476d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
477d3bfc725SMariusz Zaborski 	 *     gids:
478d3bfc725SMariusz Zaborski 	 * Disallow:
479d3bfc725SMariusz Zaborski 	 * cmds: getgrent_r
480d3bfc725SMariusz Zaborski 	 * fields:
481d3bfc725SMariusz Zaborski 	 * groups:
482d3bfc725SMariusz Zaborski 	 */
483d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
484d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
485d3bfc725SMariusz Zaborski 
486d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
487d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
488d3bfc725SMariusz Zaborski 	cmds[2] = "getgrnam";
489d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
490d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
491d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
492d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
493d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
494d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
495d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
496d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
497d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
498d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
499d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
500d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
501d3bfc725SMariusz Zaborski 	cmds[0] = "getgrent_r";
502d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
503d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
504d3bfc725SMariusz Zaborski 
505d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |
506d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
507d3bfc725SMariusz Zaborski 
508d3bfc725SMariusz Zaborski 	cap_close(capgrp);
509d3bfc725SMariusz Zaborski 
510d3bfc725SMariusz Zaborski 	/*
511d3bfc725SMariusz Zaborski 	 * Allow:
512d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrnam, getgrnam_r,
513d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
514d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
515d3bfc725SMariusz Zaborski 	 * groups:
516d3bfc725SMariusz Zaborski 	 *     names:
517d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
518d3bfc725SMariusz Zaborski 	 * Disallow:
519d3bfc725SMariusz Zaborski 	 * cmds: getgrent_r
520d3bfc725SMariusz Zaborski 	 * fields:
521d3bfc725SMariusz Zaborski 	 * groups:
522d3bfc725SMariusz Zaborski 	 */
523d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
524d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
525d3bfc725SMariusz Zaborski 
526d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
527d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
528d3bfc725SMariusz Zaborski 	cmds[2] = "getgrnam";
529d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
530d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
531d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
532d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
533d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
534d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
535d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
536d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
537d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
538d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
539d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
540d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
541d3bfc725SMariusz Zaborski 	cmds[0] = "getgrent_r";
542d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
543d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
544d3bfc725SMariusz Zaborski 
545d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |
546d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
547d3bfc725SMariusz Zaborski 
548d3bfc725SMariusz Zaborski 	cap_close(capgrp);
549d3bfc725SMariusz Zaborski 
550d3bfc725SMariusz Zaborski 	/*
551d3bfc725SMariusz Zaborski 	 * Allow:
552d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam_r,
553d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
554d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
555d3bfc725SMariusz Zaborski 	 * groups:
556d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
557d3bfc725SMariusz Zaborski 	 *     gids:
558d3bfc725SMariusz Zaborski 	 * Disallow:
559d3bfc725SMariusz Zaborski 	 * cmds: getgrnam
560d3bfc725SMariusz Zaborski 	 * fields:
561d3bfc725SMariusz Zaborski 	 * groups:
562d3bfc725SMariusz Zaborski 	 */
563d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
564d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
565d3bfc725SMariusz Zaborski 
566d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
567d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
568d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
569d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
570d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
571d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
572d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
573d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
574d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
575d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
576d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
577d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
578d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
579d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
580d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
581d3bfc725SMariusz Zaborski 	cmds[0] = "getgrnam";
582d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
583d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
584d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
585d3bfc725SMariusz Zaborski 
586d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
587d3bfc725SMariusz Zaborski 	    GETGRNAM_R | GETGRGID | GETGRGID_R));
588d3bfc725SMariusz Zaborski 
589d3bfc725SMariusz Zaborski 	cap_close(capgrp);
590d3bfc725SMariusz Zaborski 
591d3bfc725SMariusz Zaborski 	/*
592d3bfc725SMariusz Zaborski 	 * Allow:
593d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam_r,
594d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
595d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
596d3bfc725SMariusz Zaborski 	 * groups:
597d3bfc725SMariusz Zaborski 	 *     names:
598d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
599d3bfc725SMariusz Zaborski 	 * Disallow:
600d3bfc725SMariusz Zaborski 	 * cmds: getgrnam
601d3bfc725SMariusz Zaborski 	 * fields:
602d3bfc725SMariusz Zaborski 	 * groups:
603d3bfc725SMariusz Zaborski 	 */
604d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
605d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
606d3bfc725SMariusz Zaborski 
607d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
608d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
609d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
610d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam_r";
611d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
612d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
613d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
614d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
615d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
616d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
617d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
618d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
619d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
620d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
621d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
622d3bfc725SMariusz Zaborski 	cmds[0] = "getgrnam";
623d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
624d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
625d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
626d3bfc725SMariusz Zaborski 
627d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
628d3bfc725SMariusz Zaborski 	    GETGRNAM_R | GETGRGID | GETGRGID_R));
629d3bfc725SMariusz Zaborski 
630d3bfc725SMariusz Zaborski 	cap_close(capgrp);
631d3bfc725SMariusz Zaborski 
632d3bfc725SMariusz Zaborski 	/*
633d3bfc725SMariusz Zaborski 	 * Allow:
634d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam,
635d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
636d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
637d3bfc725SMariusz Zaborski 	 * groups:
638d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
639d3bfc725SMariusz Zaborski 	 *     gids:
640d3bfc725SMariusz Zaborski 	 * Disallow:
641d3bfc725SMariusz Zaborski 	 * cmds: getgrnam_r
642d3bfc725SMariusz Zaborski 	 * fields:
643d3bfc725SMariusz Zaborski 	 * groups:
644d3bfc725SMariusz Zaborski 	 */
645d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
646d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
647d3bfc725SMariusz Zaborski 
648d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
649d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
650d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
651d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
652d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
653d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
654d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
655d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
656d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
657d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
658d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
659d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
660d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
661d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
662d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
663d3bfc725SMariusz Zaborski 	cmds[0] = "getgrnam_r";
664d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
665d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
666d3bfc725SMariusz Zaborski 
667d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
668d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRGID | GETGRGID_R));
669d3bfc725SMariusz Zaborski 
670d3bfc725SMariusz Zaborski 	cap_close(capgrp);
671d3bfc725SMariusz Zaborski 
672d3bfc725SMariusz Zaborski 	/*
673d3bfc725SMariusz Zaborski 	 * Allow:
674d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam,
675d3bfc725SMariusz Zaborski 	 *       getgrgid, getgrgid_r
676d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
677d3bfc725SMariusz Zaborski 	 * groups:
678d3bfc725SMariusz Zaborski 	 *     names:
679d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
680d3bfc725SMariusz Zaborski 	 * Disallow:
681d3bfc725SMariusz Zaborski 	 * cmds: getgrnam_r
682d3bfc725SMariusz Zaborski 	 * fields:
683d3bfc725SMariusz Zaborski 	 * groups:
684d3bfc725SMariusz Zaborski 	 */
685d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
686d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
687d3bfc725SMariusz Zaborski 
688d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
689d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
690d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
691d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
692d3bfc725SMariusz Zaborski 	cmds[4] = "getgrgid";
693d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
694d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
695d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
696d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
697d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
698d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
699d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
700d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
701d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
702d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
703d3bfc725SMariusz Zaborski 	cmds[0] = "getgrnam_r";
704d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
705d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
706d3bfc725SMariusz Zaborski 
707d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
708d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRGID | GETGRGID_R));
709d3bfc725SMariusz Zaborski 
710d3bfc725SMariusz Zaborski 	cap_close(capgrp);
711d3bfc725SMariusz Zaborski 
712d3bfc725SMariusz Zaborski 	/*
713d3bfc725SMariusz Zaborski 	 * Allow:
714d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
715d3bfc725SMariusz Zaborski 	 *       getgrgid_r
716d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
717d3bfc725SMariusz Zaborski 	 * groups:
718d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
719d3bfc725SMariusz Zaborski 	 *     gids:
720d3bfc725SMariusz Zaborski 	 * Disallow:
721d3bfc725SMariusz Zaborski 	 * cmds: getgrgid
722d3bfc725SMariusz Zaborski 	 * fields:
723d3bfc725SMariusz Zaborski 	 * groups:
724d3bfc725SMariusz Zaborski 	 */
725d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
726d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
727d3bfc725SMariusz Zaborski 
728d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
729d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
730d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
731d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
732d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
733d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
734d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
735d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
736d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
737d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
738d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
739d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
740d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
741d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
742d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
743d3bfc725SMariusz Zaborski 	cmds[0] = "getgrgid";
744d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
745d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
746d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
747d3bfc725SMariusz Zaborski 
748d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
749d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID_R));
750d3bfc725SMariusz Zaborski 
751d3bfc725SMariusz Zaborski 	cap_close(capgrp);
752d3bfc725SMariusz Zaborski 
753d3bfc725SMariusz Zaborski 	/*
754d3bfc725SMariusz Zaborski 	 * Allow:
755d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
756d3bfc725SMariusz Zaborski 	 *       getgrgid_r
757d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
758d3bfc725SMariusz Zaborski 	 * groups:
759d3bfc725SMariusz Zaborski 	 *     names:
760d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
761d3bfc725SMariusz Zaborski 	 * Disallow:
762d3bfc725SMariusz Zaborski 	 * cmds: getgrgid
763d3bfc725SMariusz Zaborski 	 * fields:
764d3bfc725SMariusz Zaborski 	 * groups:
765d3bfc725SMariusz Zaborski 	 */
766d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
767d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
768d3bfc725SMariusz Zaborski 
769d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
770d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
771d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
772d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
773d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
774d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid_r";
775d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
776d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
777d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
778d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
779d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
780d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
781d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
782d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
783d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
784d3bfc725SMariusz Zaborski 	cmds[0] = "getgrgid";
785d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
786d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
787d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
788d3bfc725SMariusz Zaborski 
789d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
790d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID_R));
791d3bfc725SMariusz Zaborski 
792d3bfc725SMariusz Zaborski 	cap_close(capgrp);
793d3bfc725SMariusz Zaborski 
794d3bfc725SMariusz Zaborski 	/*
795d3bfc725SMariusz Zaborski 	 * Allow:
796d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
797d3bfc725SMariusz Zaborski 	 *       getgrgid
798d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
799d3bfc725SMariusz Zaborski 	 * groups:
800d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, operator
801d3bfc725SMariusz Zaborski 	 *     gids:
802d3bfc725SMariusz Zaborski 	 * Disallow:
803d3bfc725SMariusz Zaborski 	 * cmds: getgrgid_r
804d3bfc725SMariusz Zaborski 	 * fields:
805d3bfc725SMariusz Zaborski 	 * groups:
806d3bfc725SMariusz Zaborski 	 */
807d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
808d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
809d3bfc725SMariusz Zaborski 
810d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
811d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
812d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
813d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
814d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
815d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
816d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
817d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
818d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
819d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
820d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
821d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
822d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
823d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
824d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
825d3bfc725SMariusz Zaborski 	cmds[0] = "getgrgid_r";
826d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
827d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
828d3bfc725SMariusz Zaborski 
829d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
830d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID));
831d3bfc725SMariusz Zaborski 
832d3bfc725SMariusz Zaborski 	cap_close(capgrp);
833d3bfc725SMariusz Zaborski 
834d3bfc725SMariusz Zaborski 	/*
835d3bfc725SMariusz Zaborski 	 * Allow:
836d3bfc725SMariusz Zaborski 	 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
837d3bfc725SMariusz Zaborski 	 *       getgrgid
838d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
839d3bfc725SMariusz Zaborski 	 * groups:
840d3bfc725SMariusz Zaborski 	 *     names:
841d3bfc725SMariusz Zaborski 	 *     gids: 0, 1, 2, 3, 5
842d3bfc725SMariusz Zaborski 	 * Disallow:
843d3bfc725SMariusz Zaborski 	 * cmds: getgrgid_r
844d3bfc725SMariusz Zaborski 	 * fields:
845d3bfc725SMariusz Zaborski 	 * groups:
846d3bfc725SMariusz Zaborski 	 */
847d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
848d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
849d3bfc725SMariusz Zaborski 
850d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
851d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
852d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
853d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
854d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
855d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
856d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
857d3bfc725SMariusz Zaborski 	cmds[0] = "setgrent";
858d3bfc725SMariusz Zaborski 	cmds[1] = "getgrent";
859d3bfc725SMariusz Zaborski 	cmds[2] = "getgrent_r";
860d3bfc725SMariusz Zaborski 	cmds[3] = "getgrnam";
861d3bfc725SMariusz Zaborski 	cmds[4] = "getgrnam_r";
862d3bfc725SMariusz Zaborski 	cmds[5] = "getgrgid";
863d3bfc725SMariusz Zaborski 	cmds[6] = "getgrgid_r";
864d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
865d3bfc725SMariusz Zaborski 	cmds[0] = "getgrgid_r";
866d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
867d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
868d3bfc725SMariusz Zaborski 
869d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
870d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID));
871d3bfc725SMariusz Zaborski 
872d3bfc725SMariusz Zaborski 	cap_close(capgrp);
873d3bfc725SMariusz Zaborski }
874d3bfc725SMariusz Zaborski 
875d3bfc725SMariusz Zaborski #define	GR_NAME		0x01
876d3bfc725SMariusz Zaborski #define	GR_PASSWD	0x02
877d3bfc725SMariusz Zaborski #define	GR_GID		0x04
878d3bfc725SMariusz Zaborski #define	GR_MEM		0x08
879d3bfc725SMariusz Zaborski 
880d3bfc725SMariusz Zaborski static unsigned int
881d3bfc725SMariusz Zaborski group_fields(const struct group *grp)
882d3bfc725SMariusz Zaborski {
883d3bfc725SMariusz Zaborski 	unsigned int result;
884d3bfc725SMariusz Zaborski 
885d3bfc725SMariusz Zaborski 	result = 0;
886d3bfc725SMariusz Zaborski 
887d3bfc725SMariusz Zaborski 	if (grp->gr_name != NULL && grp->gr_name[0] != '\0')
888d3bfc725SMariusz Zaborski 		result |= GR_NAME;
889d3bfc725SMariusz Zaborski 
890d3bfc725SMariusz Zaborski 	if (grp->gr_passwd != NULL && grp->gr_passwd[0] != '\0')
891d3bfc725SMariusz Zaborski 		result |= GR_PASSWD;
892d3bfc725SMariusz Zaborski 
893d3bfc725SMariusz Zaborski 	if (grp->gr_gid != (gid_t)-1)
894d3bfc725SMariusz Zaborski 		result |= GR_GID;
895d3bfc725SMariusz Zaborski 
896d3bfc725SMariusz Zaborski 	if (grp->gr_mem != NULL && grp->gr_mem[0] != NULL)
897d3bfc725SMariusz Zaborski 		result |= GR_MEM;
898d3bfc725SMariusz Zaborski 
899d3bfc725SMariusz Zaborski 	return (result);
900d3bfc725SMariusz Zaborski }
901d3bfc725SMariusz Zaborski 
902d3bfc725SMariusz Zaborski static bool
903d3bfc725SMariusz Zaborski runtest_fields(cap_channel_t *capgrp, unsigned int expected)
904d3bfc725SMariusz Zaborski {
905d3bfc725SMariusz Zaborski 	char buf[1024];
906d3bfc725SMariusz Zaborski 	struct group *grp;
907d3bfc725SMariusz Zaborski 	struct group st;
908d3bfc725SMariusz Zaborski 
909d3bfc725SMariusz Zaborski 	(void)cap_setgrent(capgrp);
910d3bfc725SMariusz Zaborski 	grp = cap_getgrent(capgrp);
911d3bfc725SMariusz Zaborski 	if (group_fields(grp) != expected)
912d3bfc725SMariusz Zaborski 		return (false);
913d3bfc725SMariusz Zaborski 
914d3bfc725SMariusz Zaborski 	(void)cap_setgrent(capgrp);
915d3bfc725SMariusz Zaborski 	cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);
916d3bfc725SMariusz Zaborski 	if (group_fields(grp) != expected)
917d3bfc725SMariusz Zaborski 		return (false);
918d3bfc725SMariusz Zaborski 
919d3bfc725SMariusz Zaborski 	grp = cap_getgrnam(capgrp, "wheel");
920d3bfc725SMariusz Zaborski 	if (group_fields(grp) != expected)
921d3bfc725SMariusz Zaborski 		return (false);
922d3bfc725SMariusz Zaborski 
923d3bfc725SMariusz Zaborski 	cap_getgrnam_r(capgrp, "wheel", &st, buf, sizeof(buf), &grp);
924d3bfc725SMariusz Zaborski 	if (group_fields(grp) != expected)
925d3bfc725SMariusz Zaborski 		return (false);
926d3bfc725SMariusz Zaborski 
927d3bfc725SMariusz Zaborski 	grp = cap_getgrgid(capgrp, GID_WHEEL);
928d3bfc725SMariusz Zaborski 	if (group_fields(grp) != expected)
929d3bfc725SMariusz Zaborski 		return (false);
930d3bfc725SMariusz Zaborski 
931d3bfc725SMariusz Zaborski 	cap_getgrgid_r(capgrp, GID_WHEEL, &st, buf, sizeof(buf), &grp);
932d3bfc725SMariusz Zaborski 	if (group_fields(grp) != expected)
933d3bfc725SMariusz Zaborski 		return (false);
934d3bfc725SMariusz Zaborski 
935d3bfc725SMariusz Zaborski 	return (true);
936d3bfc725SMariusz Zaborski }
937d3bfc725SMariusz Zaborski 
938d3bfc725SMariusz Zaborski static void
939d3bfc725SMariusz Zaborski test_fields(cap_channel_t *origcapgrp)
940d3bfc725SMariusz Zaborski {
941d3bfc725SMariusz Zaborski 	cap_channel_t *capgrp;
942d3bfc725SMariusz Zaborski 	const char *fields[4];
943d3bfc725SMariusz Zaborski 
944d3bfc725SMariusz Zaborski 	/* No limits. */
945d3bfc725SMariusz Zaborski 
946d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(origcapgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));
947d3bfc725SMariusz Zaborski 
948d3bfc725SMariusz Zaborski 	/*
949d3bfc725SMariusz Zaborski 	 * Allow:
950d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid, gr_mem
951d3bfc725SMariusz Zaborski 	 */
952d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
953d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
954d3bfc725SMariusz Zaborski 
955d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
956d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
957d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
958d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
959d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
960d3bfc725SMariusz Zaborski 
961d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));
962d3bfc725SMariusz Zaborski 
963d3bfc725SMariusz Zaborski 	cap_close(capgrp);
964d3bfc725SMariusz Zaborski 
965d3bfc725SMariusz Zaborski 	/*
966d3bfc725SMariusz Zaborski 	 * Allow:
967d3bfc725SMariusz Zaborski 	 * fields: gr_passwd, gr_gid, gr_mem
968d3bfc725SMariusz Zaborski 	 */
969d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
970d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
971d3bfc725SMariusz Zaborski 
972d3bfc725SMariusz Zaborski 	fields[0] = "gr_passwd";
973d3bfc725SMariusz Zaborski 	fields[1] = "gr_gid";
974d3bfc725SMariusz Zaborski 	fields[2] = "gr_mem";
975d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
976d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
977d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
978d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
979d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
980d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
981d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
982d3bfc725SMariusz Zaborski 
983d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID | GR_MEM));
984d3bfc725SMariusz Zaborski 
985d3bfc725SMariusz Zaborski 	cap_close(capgrp);
986d3bfc725SMariusz Zaborski 
987d3bfc725SMariusz Zaborski 	/*
988d3bfc725SMariusz Zaborski 	 * Allow:
989d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_gid, gr_mem
990d3bfc725SMariusz Zaborski 	 */
991d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
992d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
993d3bfc725SMariusz Zaborski 
994d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
995d3bfc725SMariusz Zaborski 	fields[1] = "gr_gid";
996d3bfc725SMariusz Zaborski 	fields[2] = "gr_mem";
997d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
998d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
999d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1000d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1001d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1002d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1003d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1004d3bfc725SMariusz Zaborski 	fields[0] = "gr_passwd";
1005d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1006d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1007d3bfc725SMariusz Zaborski 
1008d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_GID | GR_MEM));
1009d3bfc725SMariusz Zaborski 
1010d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1011d3bfc725SMariusz Zaborski 
1012d3bfc725SMariusz Zaborski 	/*
1013d3bfc725SMariusz Zaborski 	 * Allow:
1014d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_mem
1015d3bfc725SMariusz Zaborski 	 */
1016d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1017d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1018d3bfc725SMariusz Zaborski 
1019d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1020d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1021d3bfc725SMariusz Zaborski 	fields[2] = "gr_mem";
1022d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
1023d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1024d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1025d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1026d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1027d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1028d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1029d3bfc725SMariusz Zaborski 	fields[0] = "gr_gid";
1030d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1031d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1032d3bfc725SMariusz Zaborski 
1033d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_MEM));
1034d3bfc725SMariusz Zaborski 
1035d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1036d3bfc725SMariusz Zaborski 
1037d3bfc725SMariusz Zaborski 	/*
1038d3bfc725SMariusz Zaborski 	 * Allow:
1039d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd, gr_gid
1040d3bfc725SMariusz Zaborski 	 */
1041d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1042d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1043d3bfc725SMariusz Zaborski 
1044d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1045d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1046d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1047d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
1048d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1049d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1050d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1051d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1052d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1053d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1054d3bfc725SMariusz Zaborski 	fields[0] = "gr_mem";
1055d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1056d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1057d3bfc725SMariusz Zaborski 
1058d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID));
1059d3bfc725SMariusz Zaborski 
1060d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1061d3bfc725SMariusz Zaborski 
1062d3bfc725SMariusz Zaborski 	/*
1063d3bfc725SMariusz Zaborski 	 * Allow:
1064d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_passwd
1065d3bfc725SMariusz Zaborski 	 */
1066d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1067d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1068d3bfc725SMariusz Zaborski 
1069d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1070d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1071d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1072d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1073d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1074d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1075d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1076d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1077d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1078d3bfc725SMariusz Zaborski 	fields[0] = "gr_gid";
1079d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1080d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1081d3bfc725SMariusz Zaborski 
1082d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD));
1083d3bfc725SMariusz Zaborski 
1084d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1085d3bfc725SMariusz Zaborski 
1086d3bfc725SMariusz Zaborski 	/*
1087d3bfc725SMariusz Zaborski 	 * Allow:
1088d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_gid
1089d3bfc725SMariusz Zaborski 	 */
1090d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1091d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1092d3bfc725SMariusz Zaborski 
1093d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1094d3bfc725SMariusz Zaborski 	fields[1] = "gr_gid";
1095d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1096d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1097d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1098d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1099d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1100d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1101d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1102d3bfc725SMariusz Zaborski 	fields[0] = "gr_mem";
1103d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1104d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1105d3bfc725SMariusz Zaborski 
1106d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_GID));
1107d3bfc725SMariusz Zaborski 
1108d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1109d3bfc725SMariusz Zaborski 
1110d3bfc725SMariusz Zaborski 	/*
1111d3bfc725SMariusz Zaborski 	 * Allow:
1112d3bfc725SMariusz Zaborski 	 * fields: gr_name, gr_mem
1113d3bfc725SMariusz Zaborski 	 */
1114d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1115d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1116d3bfc725SMariusz Zaborski 
1117d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1118d3bfc725SMariusz Zaborski 	fields[1] = "gr_mem";
1119d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1120d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1121d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1122d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1123d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1124d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1125d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1126d3bfc725SMariusz Zaborski 	fields[0] = "gr_passwd";
1127d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1128d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1129d3bfc725SMariusz Zaborski 
1130d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_NAME | GR_MEM));
1131d3bfc725SMariusz Zaborski 
1132d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1133d3bfc725SMariusz Zaborski 
1134d3bfc725SMariusz Zaborski 	/*
1135d3bfc725SMariusz Zaborski 	 * Allow:
1136d3bfc725SMariusz Zaborski 	 * fields: gr_passwd, gr_gid
1137d3bfc725SMariusz Zaborski 	 */
1138d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1139d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1140d3bfc725SMariusz Zaborski 
1141d3bfc725SMariusz Zaborski 	fields[0] = "gr_passwd";
1142d3bfc725SMariusz Zaborski 	fields[1] = "gr_gid";
1143d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1144d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1145d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1146d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1147d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1148d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1149d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1150d3bfc725SMariusz Zaborski 	fields[0] = "gr_mem";
1151d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1152d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1153d3bfc725SMariusz Zaborski 
1154d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID));
1155d3bfc725SMariusz Zaborski 
1156d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1157d3bfc725SMariusz Zaborski 
1158d3bfc725SMariusz Zaborski 	/*
1159d3bfc725SMariusz Zaborski 	 * Allow:
1160d3bfc725SMariusz Zaborski 	 * fields: gr_passwd, gr_mem
1161d3bfc725SMariusz Zaborski 	 */
1162d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1163d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1164d3bfc725SMariusz Zaborski 
1165d3bfc725SMariusz Zaborski 	fields[0] = "gr_passwd";
1166d3bfc725SMariusz Zaborski 	fields[1] = "gr_mem";
1167d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1168d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1169d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1170d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1171d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1172d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1173d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1174d3bfc725SMariusz Zaborski 	fields[0] = "gr_gid";
1175d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1176d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1177d3bfc725SMariusz Zaborski 
1178d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_PASSWD | GR_MEM));
1179d3bfc725SMariusz Zaborski 
1180d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1181d3bfc725SMariusz Zaborski 
1182d3bfc725SMariusz Zaborski 	/*
1183d3bfc725SMariusz Zaborski 	 * Allow:
1184d3bfc725SMariusz Zaborski 	 * fields: gr_gid, gr_mem
1185d3bfc725SMariusz Zaborski 	 */
1186d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1187d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1188d3bfc725SMariusz Zaborski 
1189d3bfc725SMariusz Zaborski 	fields[0] = "gr_gid";
1190d3bfc725SMariusz Zaborski 	fields[1] = "gr_mem";
1191d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1192d3bfc725SMariusz Zaborski 	fields[0] = "gr_name";
1193d3bfc725SMariusz Zaborski 	fields[1] = "gr_passwd";
1194d3bfc725SMariusz Zaborski 	fields[2] = "gr_gid";
1195d3bfc725SMariusz Zaborski 	fields[3] = "gr_mem";
1196d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1197d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1198d3bfc725SMariusz Zaborski 	fields[0] = "gr_passwd";
1199d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1200d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1201d3bfc725SMariusz Zaborski 
1202d3bfc725SMariusz Zaborski 	CHECK(runtest_fields(capgrp, GR_GID | GR_MEM));
1203d3bfc725SMariusz Zaborski 
1204d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1205d3bfc725SMariusz Zaborski }
1206d3bfc725SMariusz Zaborski 
1207d3bfc725SMariusz Zaborski static bool
1208d3bfc725SMariusz Zaborski runtest_groups(cap_channel_t *capgrp, const char **names, const gid_t *gids,
1209d3bfc725SMariusz Zaborski     size_t ngroups)
1210d3bfc725SMariusz Zaborski {
1211d3bfc725SMariusz Zaborski 	char buf[1024];
1212d3bfc725SMariusz Zaborski 	struct group *grp;
1213d3bfc725SMariusz Zaborski 	struct group st;
1214d3bfc725SMariusz Zaborski 	unsigned int i, got;
1215d3bfc725SMariusz Zaborski 
1216d3bfc725SMariusz Zaborski 	(void)cap_setgrent(capgrp);
1217d3bfc725SMariusz Zaborski 	got = 0;
1218d3bfc725SMariusz Zaborski 	for (;;) {
1219d3bfc725SMariusz Zaborski 		grp = cap_getgrent(capgrp);
1220d3bfc725SMariusz Zaborski 		if (grp == NULL)
1221d3bfc725SMariusz Zaborski 			break;
1222d3bfc725SMariusz Zaborski 		got++;
1223d3bfc725SMariusz Zaborski 		for (i = 0; i < ngroups; i++) {
1224d3bfc725SMariusz Zaborski 			if (strcmp(names[i], grp->gr_name) == 0 &&
1225d3bfc725SMariusz Zaborski 			    gids[i] == grp->gr_gid) {
1226d3bfc725SMariusz Zaborski 				break;
1227d3bfc725SMariusz Zaborski 			}
1228d3bfc725SMariusz Zaborski 		}
1229d3bfc725SMariusz Zaborski 		if (i == ngroups)
1230d3bfc725SMariusz Zaborski 			return (false);
1231d3bfc725SMariusz Zaborski 	}
1232d3bfc725SMariusz Zaborski 	if (got != ngroups)
1233d3bfc725SMariusz Zaborski 		return (false);
1234d3bfc725SMariusz Zaborski 
1235d3bfc725SMariusz Zaborski 	(void)cap_setgrent(capgrp);
1236d3bfc725SMariusz Zaborski 	got = 0;
1237d3bfc725SMariusz Zaborski 	for (;;) {
1238d3bfc725SMariusz Zaborski 		cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);
1239d3bfc725SMariusz Zaborski 		if (grp == NULL)
1240d3bfc725SMariusz Zaborski 			break;
1241d3bfc725SMariusz Zaborski 		got++;
1242d3bfc725SMariusz Zaborski 		for (i = 0; i < ngroups; i++) {
1243d3bfc725SMariusz Zaborski 			if (strcmp(names[i], grp->gr_name) == 0 &&
1244d3bfc725SMariusz Zaborski 			    gids[i] == grp->gr_gid) {
1245d3bfc725SMariusz Zaborski 				break;
1246d3bfc725SMariusz Zaborski 			}
1247d3bfc725SMariusz Zaborski 		}
1248d3bfc725SMariusz Zaborski 		if (i == ngroups)
1249d3bfc725SMariusz Zaborski 			return (false);
1250d3bfc725SMariusz Zaborski 	}
1251d3bfc725SMariusz Zaborski 	if (got != ngroups)
1252d3bfc725SMariusz Zaborski 		return (false);
1253d3bfc725SMariusz Zaborski 
1254d3bfc725SMariusz Zaborski 	for (i = 0; i < ngroups; i++) {
1255d3bfc725SMariusz Zaborski 		grp = cap_getgrnam(capgrp, names[i]);
1256d3bfc725SMariusz Zaborski 		if (grp == NULL)
1257d3bfc725SMariusz Zaborski 			return (false);
1258d3bfc725SMariusz Zaborski 	}
1259d3bfc725SMariusz Zaborski 
1260d3bfc725SMariusz Zaborski 	for (i = 0; i < ngroups; i++) {
1261d3bfc725SMariusz Zaborski 		cap_getgrnam_r(capgrp, names[i], &st, buf, sizeof(buf), &grp);
1262d3bfc725SMariusz Zaborski 		if (grp == NULL)
1263d3bfc725SMariusz Zaborski 			return (false);
1264d3bfc725SMariusz Zaborski 	}
1265d3bfc725SMariusz Zaborski 
1266d3bfc725SMariusz Zaborski 	for (i = 0; i < ngroups; i++) {
1267d3bfc725SMariusz Zaborski 		grp = cap_getgrgid(capgrp, gids[i]);
1268d3bfc725SMariusz Zaborski 		if (grp == NULL)
1269d3bfc725SMariusz Zaborski 			return (false);
1270d3bfc725SMariusz Zaborski 	}
1271d3bfc725SMariusz Zaborski 
1272d3bfc725SMariusz Zaborski 	for (i = 0; i < ngroups; i++) {
1273d3bfc725SMariusz Zaborski 		cap_getgrgid_r(capgrp, gids[i], &st, buf, sizeof(buf), &grp);
1274d3bfc725SMariusz Zaborski 		if (grp == NULL)
1275d3bfc725SMariusz Zaborski 			return (false);
1276d3bfc725SMariusz Zaborski 	}
1277d3bfc725SMariusz Zaborski 
1278d3bfc725SMariusz Zaborski 	return (true);
1279d3bfc725SMariusz Zaborski }
1280d3bfc725SMariusz Zaborski 
1281d3bfc725SMariusz Zaborski static void
1282d3bfc725SMariusz Zaborski test_groups(cap_channel_t *origcapgrp)
1283d3bfc725SMariusz Zaborski {
1284d3bfc725SMariusz Zaborski 	cap_channel_t *capgrp;
1285d3bfc725SMariusz Zaborski 	const char *names[5];
1286d3bfc725SMariusz Zaborski 	gid_t gids[5];
1287d3bfc725SMariusz Zaborski 
1288d3bfc725SMariusz Zaborski 	/*
1289d3bfc725SMariusz Zaborski 	 * Allow:
1290d3bfc725SMariusz Zaborski 	 * groups:
1291d3bfc725SMariusz Zaborski 	 *     names: wheel, daemon, kmem, sys, tty
1292d3bfc725SMariusz Zaborski 	 *     gids:
1293d3bfc725SMariusz Zaborski 	 */
1294d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1295d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1296d3bfc725SMariusz Zaborski 
1297d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1298d3bfc725SMariusz Zaborski 	names[1] = "daemon";
1299d3bfc725SMariusz Zaborski 	names[2] = "kmem";
1300d3bfc725SMariusz Zaborski 	names[3] = "sys";
1301d3bfc725SMariusz Zaborski 	names[4] = "tty";
1302d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
1303d3bfc725SMariusz Zaborski 	gids[0] = 0;
1304d3bfc725SMariusz Zaborski 	gids[1] = 1;
1305d3bfc725SMariusz Zaborski 	gids[2] = 2;
1306d3bfc725SMariusz Zaborski 	gids[3] = 3;
1307d3bfc725SMariusz Zaborski 	gids[4] = 4;
1308d3bfc725SMariusz Zaborski 
1309d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 5));
1310d3bfc725SMariusz Zaborski 
1311d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1312d3bfc725SMariusz Zaborski 
1313d3bfc725SMariusz Zaborski 	/*
1314d3bfc725SMariusz Zaborski 	 * Allow:
1315d3bfc725SMariusz Zaborski 	 * groups:
1316d3bfc725SMariusz Zaborski 	 *     names: kmem, sys, tty
1317d3bfc725SMariusz Zaborski 	 *     gids:
1318d3bfc725SMariusz Zaborski 	 */
1319d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1320d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1321d3bfc725SMariusz Zaborski 
1322d3bfc725SMariusz Zaborski 	names[0] = "kmem";
1323d3bfc725SMariusz Zaborski 	names[1] = "sys";
1324d3bfc725SMariusz Zaborski 	names[2] = "tty";
1325d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);
1326d3bfc725SMariusz Zaborski 	names[3] = "daemon";
1327d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&
1328d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1329d3bfc725SMariusz Zaborski 	names[0] = "daemon";
1330d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1331d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1332d3bfc725SMariusz Zaborski 	names[0] = "kmem";
1333d3bfc725SMariusz Zaborski 	gids[0] = 2;
1334d3bfc725SMariusz Zaborski 	gids[1] = 3;
1335d3bfc725SMariusz Zaborski 	gids[2] = 4;
1336d3bfc725SMariusz Zaborski 
1337d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 3));
1338d3bfc725SMariusz Zaborski 
1339d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1340d3bfc725SMariusz Zaborski 
1341d3bfc725SMariusz Zaborski 	/*
1342d3bfc725SMariusz Zaborski 	 * Allow:
1343d3bfc725SMariusz Zaborski 	 * groups:
1344d3bfc725SMariusz Zaborski 	 *     names: wheel, kmem, tty
1345d3bfc725SMariusz Zaborski 	 *     gids:
1346d3bfc725SMariusz Zaborski 	 */
1347d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1348d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1349d3bfc725SMariusz Zaborski 
1350d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1351d3bfc725SMariusz Zaborski 	names[1] = "kmem";
1352d3bfc725SMariusz Zaborski 	names[2] = "tty";
1353d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);
1354d3bfc725SMariusz Zaborski 	names[3] = "daemon";
1355d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&
1356d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1357d3bfc725SMariusz Zaborski 	names[0] = "daemon";
1358d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1359d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1360d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1361d3bfc725SMariusz Zaborski 	gids[0] = 0;
1362d3bfc725SMariusz Zaborski 	gids[1] = 2;
1363d3bfc725SMariusz Zaborski 	gids[2] = 4;
1364d3bfc725SMariusz Zaborski 
1365d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 3));
1366d3bfc725SMariusz Zaborski 
1367d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1368d3bfc725SMariusz Zaborski 
1369d3bfc725SMariusz Zaborski 	/*
1370d3bfc725SMariusz Zaborski 	 * Allow:
1371d3bfc725SMariusz Zaborski 	 * groups:
1372d3bfc725SMariusz Zaborski 	 *     names:
1373d3bfc725SMariusz Zaborski 	 *     gids: 2, 3, 4
1374d3bfc725SMariusz Zaborski 	 */
1375d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1376d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1377d3bfc725SMariusz Zaborski 
1378d3bfc725SMariusz Zaborski 	names[0] = "kmem";
1379d3bfc725SMariusz Zaborski 	names[1] = "sys";
1380d3bfc725SMariusz Zaborski 	names[2] = "tty";
1381d3bfc725SMariusz Zaborski 	gids[0] = 2;
1382d3bfc725SMariusz Zaborski 	gids[1] = 3;
1383d3bfc725SMariusz Zaborski 	gids[2] = 4;
1384d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);
1385d3bfc725SMariusz Zaborski 	gids[3] = 0;
1386d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&
1387d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1388d3bfc725SMariusz Zaborski 	gids[0] = 0;
1389d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1390d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1391d3bfc725SMariusz Zaborski 	gids[0] = 2;
1392d3bfc725SMariusz Zaborski 
1393d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 3));
1394d3bfc725SMariusz Zaborski 
1395d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1396d3bfc725SMariusz Zaborski 
1397d3bfc725SMariusz Zaborski 	/*
1398d3bfc725SMariusz Zaborski 	 * Allow:
1399d3bfc725SMariusz Zaborski 	 * groups:
1400d3bfc725SMariusz Zaborski 	 *     names:
1401d3bfc725SMariusz Zaborski 	 *     gids: 0, 2, 4
1402d3bfc725SMariusz Zaborski 	 */
1403d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1404d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1405d3bfc725SMariusz Zaborski 
1406d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1407d3bfc725SMariusz Zaborski 	names[1] = "kmem";
1408d3bfc725SMariusz Zaborski 	names[2] = "tty";
1409d3bfc725SMariusz Zaborski 	gids[0] = 0;
1410d3bfc725SMariusz Zaborski 	gids[1] = 2;
1411d3bfc725SMariusz Zaborski 	gids[2] = 4;
1412d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);
1413d3bfc725SMariusz Zaborski 	gids[3] = 1;
1414d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&
1415d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1416d3bfc725SMariusz Zaborski 	gids[0] = 1;
1417d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1418d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1419d3bfc725SMariusz Zaborski 	gids[0] = 0;
1420d3bfc725SMariusz Zaborski 
1421d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 3));
1422d3bfc725SMariusz Zaborski 
1423d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1424d3bfc725SMariusz Zaborski 
1425d3bfc725SMariusz Zaborski 	/*
1426d3bfc725SMariusz Zaborski 	 * Allow:
1427d3bfc725SMariusz Zaborski 	 * groups:
1428d3bfc725SMariusz Zaborski 	 *     names: kmem
1429d3bfc725SMariusz Zaborski 	 *     gids:
1430d3bfc725SMariusz Zaborski 	 */
1431d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1432d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1433d3bfc725SMariusz Zaborski 
1434d3bfc725SMariusz Zaborski 	names[0] = "kmem";
1435d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == 0);
1436d3bfc725SMariusz Zaborski 	names[1] = "daemon";
1437d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == -1 &&
1438d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1439d3bfc725SMariusz Zaborski 	names[0] = "daemon";
1440d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1441d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1442d3bfc725SMariusz Zaborski 	names[0] = "kmem";
1443d3bfc725SMariusz Zaborski 	gids[0] = 2;
1444d3bfc725SMariusz Zaborski 
1445d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 1));
1446d3bfc725SMariusz Zaborski 
1447d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1448d3bfc725SMariusz Zaborski 
1449d3bfc725SMariusz Zaborski 	/*
1450d3bfc725SMariusz Zaborski 	 * Allow:
1451d3bfc725SMariusz Zaborski 	 * groups:
1452d3bfc725SMariusz Zaborski 	 *     names: wheel, tty
1453d3bfc725SMariusz Zaborski 	 *     gids:
1454d3bfc725SMariusz Zaborski 	 */
1455d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1456d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1457d3bfc725SMariusz Zaborski 
1458d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1459d3bfc725SMariusz Zaborski 	names[1] = "tty";
1460d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == 0);
1461d3bfc725SMariusz Zaborski 	names[2] = "daemon";
1462d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == -1 &&
1463d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1464d3bfc725SMariusz Zaborski 	names[0] = "daemon";
1465d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1466d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1467d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1468d3bfc725SMariusz Zaborski 	gids[0] = 0;
1469d3bfc725SMariusz Zaborski 	gids[1] = 4;
1470d3bfc725SMariusz Zaborski 
1471d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 2));
1472d3bfc725SMariusz Zaborski 
1473d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1474d3bfc725SMariusz Zaborski 
1475d3bfc725SMariusz Zaborski 	/*
1476d3bfc725SMariusz Zaborski 	 * Allow:
1477d3bfc725SMariusz Zaborski 	 * groups:
1478d3bfc725SMariusz Zaborski 	 *     names:
1479d3bfc725SMariusz Zaborski 	 *     gids: 2
1480d3bfc725SMariusz Zaborski 	 */
1481d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1482d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1483d3bfc725SMariusz Zaborski 
1484d3bfc725SMariusz Zaborski 	names[0] = "kmem";
1485d3bfc725SMariusz Zaborski 	gids[0] = 2;
1486d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == 0);
1487d3bfc725SMariusz Zaborski 	gids[1] = 1;
1488d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == -1 &&
1489d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1490d3bfc725SMariusz Zaborski 	gids[0] = 1;
1491d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1492d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1493d3bfc725SMariusz Zaborski 	gids[0] = 2;
1494d3bfc725SMariusz Zaborski 
1495d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 1));
1496d3bfc725SMariusz Zaborski 
1497d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1498d3bfc725SMariusz Zaborski 
1499d3bfc725SMariusz Zaborski 	/*
1500d3bfc725SMariusz Zaborski 	 * Allow:
1501d3bfc725SMariusz Zaborski 	 * groups:
1502d3bfc725SMariusz Zaborski 	 *     names:
1503d3bfc725SMariusz Zaborski 	 *     gids: 0, 4
1504d3bfc725SMariusz Zaborski 	 */
1505d3bfc725SMariusz Zaborski 	capgrp = cap_clone(origcapgrp);
1506d3bfc725SMariusz Zaborski 	CHECK(capgrp != NULL);
1507d3bfc725SMariusz Zaborski 
1508d3bfc725SMariusz Zaborski 	names[0] = "wheel";
1509d3bfc725SMariusz Zaborski 	names[1] = "tty";
1510d3bfc725SMariusz Zaborski 	gids[0] = 0;
1511d3bfc725SMariusz Zaborski 	gids[1] = 4;
1512d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == 0);
1513d3bfc725SMariusz Zaborski 	gids[2] = 1;
1514d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == -1 &&
1515d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1516d3bfc725SMariusz Zaborski 	gids[0] = 1;
1517d3bfc725SMariusz Zaborski 	CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1518d3bfc725SMariusz Zaborski 	    errno == ENOTCAPABLE);
1519d3bfc725SMariusz Zaborski 	gids[0] = 0;
1520d3bfc725SMariusz Zaborski 
1521d3bfc725SMariusz Zaborski 	CHECK(runtest_groups(capgrp, names, gids, 2));
1522d3bfc725SMariusz Zaborski 
1523d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1524d3bfc725SMariusz Zaborski }
1525d3bfc725SMariusz Zaborski 
1526d3bfc725SMariusz Zaborski int
1527d3bfc725SMariusz Zaborski main(void)
1528d3bfc725SMariusz Zaborski {
1529d3bfc725SMariusz Zaborski 	cap_channel_t *capcas, *capgrp;
1530d3bfc725SMariusz Zaborski 
1531d3bfc725SMariusz Zaborski 	printf("1..199\n");
1532ebe3e93cSEnji Cooper 	fflush(stdout);
1533d3bfc725SMariusz Zaborski 
1534d3bfc725SMariusz Zaborski 	capcas = cap_init();
1535d3bfc725SMariusz Zaborski 	CHECKX(capcas != NULL);
1536d3bfc725SMariusz Zaborski 
1537d3bfc725SMariusz Zaborski 	capgrp = cap_service_open(capcas, "system.grp");
1538d3bfc725SMariusz Zaborski 	CHECKX(capgrp != NULL);
1539d3bfc725SMariusz Zaborski 
1540d3bfc725SMariusz Zaborski 	cap_close(capcas);
1541d3bfc725SMariusz Zaborski 
1542d3bfc725SMariusz Zaborski 	/* No limits. */
1543d3bfc725SMariusz Zaborski 
1544d3bfc725SMariusz Zaborski 	CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
1545d3bfc725SMariusz Zaborski 	    GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
1546d3bfc725SMariusz Zaborski 
1547d3bfc725SMariusz Zaborski 	test_cmds(capgrp);
1548d3bfc725SMariusz Zaborski 
1549d3bfc725SMariusz Zaborski 	test_fields(capgrp);
1550d3bfc725SMariusz Zaborski 
1551d3bfc725SMariusz Zaborski 	test_groups(capgrp);
1552d3bfc725SMariusz Zaborski 
1553d3bfc725SMariusz Zaborski 	cap_close(capgrp);
1554d3bfc725SMariusz Zaborski 
1555d3bfc725SMariusz Zaborski 	exit(0);
1556d3bfc725SMariusz Zaborski }
1557