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