2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2013 The FreeBSD Foundation
7 * This software was developed by Pawel Jakub Dawidek under sponsorship from
8 * the FreeBSD Foundation.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
35 #include <sys/capsicum.h>
47 #include <libcasper.h>
49 #include <casper/cap_grp.h>
53 #define CHECK(expr) do { \
55 printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
57 printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
61 #define CHECKX(expr) do { \
63 printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
65 printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
73 #define GID_OPERATOR 5
75 #define GETGRENT0 0x0001
76 #define GETGRENT1 0x0002
77 #define GETGRENT2 0x0004
78 #define GETGRENT (GETGRENT0 | GETGRENT1 | GETGRENT2)
79 #define GETGRENT_R0 0x0008
80 #define GETGRENT_R1 0x0010
81 #define GETGRENT_R2 0x0020
82 #define GETGRENT_R (GETGRENT_R0 | GETGRENT_R1 | GETGRENT_R2)
83 #define GETGRNAM 0x0040
84 #define GETGRNAM_R 0x0080
85 #define GETGRGID 0x0100
86 #define GETGRGID_R 0x0200
87 #define SETGRENT 0x0400
90 group_mem_compare(char **mem0, char **mem1)
94 if (mem0 == NULL && mem1 == NULL)
96 if (mem0 == NULL || mem1 == NULL)
99 for (i0 = 0; mem0[i0] != NULL; i0++) {
100 for (i1 = 0; mem1[i1] != NULL; i1++) {
101 if (strcmp(mem0[i0], mem1[i1]) == 0)
104 if (mem1[i1] == NULL)
112 group_compare(const struct group *grp0, const struct group *grp1)
115 if (grp0 == NULL && grp1 == NULL)
117 if (grp0 == NULL || grp1 == NULL)
120 if (strcmp(grp0->gr_name, grp1->gr_name) != 0)
123 if (grp0->gr_passwd != NULL || grp1->gr_passwd != NULL) {
124 if (grp0->gr_passwd == NULL || grp1->gr_passwd == NULL)
126 if (strcmp(grp0->gr_passwd, grp1->gr_passwd) != 0)
130 if (grp0->gr_gid != grp1->gr_gid)
133 if (!group_mem_compare(grp0->gr_mem, grp1->gr_mem))
140 runtest_cmds(cap_channel_t *capgrp)
142 char bufs[1024], bufc[1024];
144 struct group *grps, *grpc;
145 struct group sts, stc;
150 if (cap_setgrent(capgrp) == 1)
154 grpc = cap_getgrent(capgrp);
155 if (group_compare(grps, grpc)) {
158 grpc = cap_getgrent(capgrp);
159 if (group_compare(grps, grpc))
163 getgrent_r(&sts, bufs, sizeof(bufs), &grps);
164 cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
165 if (group_compare(grps, grpc)) {
166 result |= GETGRENT_R0;
167 getgrent_r(&sts, bufs, sizeof(bufs), &grps);
168 cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
169 if (group_compare(grps, grpc))
170 result |= GETGRENT_R1;
174 if (cap_setgrent(capgrp) == 1)
177 getgrent_r(&sts, bufs, sizeof(bufs), &grps);
178 cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
179 if (group_compare(grps, grpc))
180 result |= GETGRENT_R2;
183 grpc = cap_getgrent(capgrp);
184 if (group_compare(grps, grpc))
187 grps = getgrnam("wheel");
188 grpc = cap_getgrnam(capgrp, "wheel");
189 if (group_compare(grps, grpc)) {
190 grps = getgrnam("operator");
191 grpc = cap_getgrnam(capgrp, "operator");
192 if (group_compare(grps, grpc))
196 getgrnam_r("wheel", &sts, bufs, sizeof(bufs), &grps);
197 cap_getgrnam_r(capgrp, "wheel", &stc, bufc, sizeof(bufc), &grpc);
198 if (group_compare(grps, grpc)) {
199 getgrnam_r("operator", &sts, bufs, sizeof(bufs), &grps);
200 cap_getgrnam_r(capgrp, "operator", &stc, bufc, sizeof(bufc),
202 if (group_compare(grps, grpc))
203 result |= GETGRNAM_R;
206 grps = getgrgid(GID_WHEEL);
207 grpc = cap_getgrgid(capgrp, GID_WHEEL);
208 if (group_compare(grps, grpc)) {
209 grps = getgrgid(GID_OPERATOR);
210 grpc = cap_getgrgid(capgrp, GID_OPERATOR);
211 if (group_compare(grps, grpc))
215 getgrgid_r(GID_WHEEL, &sts, bufs, sizeof(bufs), &grps);
216 cap_getgrgid_r(capgrp, GID_WHEEL, &stc, bufc, sizeof(bufc), &grpc);
217 if (group_compare(grps, grpc)) {
218 getgrgid_r(GID_OPERATOR, &sts, bufs, sizeof(bufs), &grps);
219 cap_getgrgid_r(capgrp, GID_OPERATOR, &stc, bufc, sizeof(bufc),
221 if (group_compare(grps, grpc))
222 result |= GETGRGID_R;
229 test_cmds(cap_channel_t *origcapgrp)
231 cap_channel_t *capgrp;
232 const char *cmds[7], *fields[4], *names[5];
235 fields[0] = "gr_name";
236 fields[1] = "gr_passwd";
237 fields[2] = "gr_gid";
238 fields[3] = "gr_mem";
244 names[4] = "operator";
254 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
255 * getgrgid, getgrgid_r
256 * fields: gr_name, gr_passwd, gr_gid, gr_mem
258 * names: wheel, daemon, kmem, sys, operator
261 capgrp = cap_clone(origcapgrp);
262 CHECK(capgrp != NULL);
264 cmds[0] = "setgrent";
265 cmds[1] = "getgrent";
266 cmds[2] = "getgrent_r";
267 cmds[3] = "getgrnam";
268 cmds[4] = "getgrnam_r";
269 cmds[5] = "getgrgid";
270 cmds[6] = "getgrgid_r";
271 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);
272 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
273 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
275 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
276 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
282 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
283 * getgrgid, getgrgid_r
284 * fields: gr_name, gr_passwd, gr_gid, gr_mem
287 * gids: 0, 1, 2, 3, 5
289 capgrp = cap_clone(origcapgrp);
290 CHECK(capgrp != NULL);
292 cmds[0] = "setgrent";
293 cmds[1] = "getgrent";
294 cmds[2] = "getgrent_r";
295 cmds[3] = "getgrnam";
296 cmds[4] = "getgrnam_r";
297 cmds[5] = "getgrgid";
298 cmds[6] = "getgrgid_r";
299 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);
300 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
301 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
303 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
304 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
310 * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,
311 * getgrgid, getgrgid_r
312 * fields: gr_name, gr_passwd, gr_gid, gr_mem
314 * names: wheel, daemon, kmem, sys, operator
321 capgrp = cap_clone(origcapgrp);
322 CHECK(capgrp != NULL);
324 cmds[0] = "getgrent";
325 cmds[1] = "getgrent_r";
326 cmds[2] = "getgrnam";
327 cmds[3] = "getgrnam_r";
328 cmds[4] = "getgrgid";
329 cmds[5] = "getgrgid_r";
330 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
331 cmds[0] = "setgrent";
332 cmds[1] = "getgrent";
333 cmds[2] = "getgrent_r";
334 cmds[3] = "getgrnam";
335 cmds[4] = "getgrnam_r";
336 cmds[5] = "getgrgid";
337 cmds[6] = "getgrgid_r";
338 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
339 cmds[0] = "setgrent";
340 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
341 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
343 CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |
344 GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
350 * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,
351 * getgrgid, getgrgid_r
352 * fields: gr_name, gr_passwd, gr_gid, gr_mem
355 * gids: 0, 1, 2, 3, 5
361 capgrp = cap_clone(origcapgrp);
362 CHECK(capgrp != NULL);
364 cmds[0] = "getgrent";
365 cmds[1] = "getgrent_r";
366 cmds[2] = "getgrnam";
367 cmds[3] = "getgrnam_r";
368 cmds[4] = "getgrgid";
369 cmds[5] = "getgrgid_r";
370 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
371 cmds[0] = "setgrent";
372 cmds[1] = "getgrent";
373 cmds[2] = "getgrent_r";
374 cmds[3] = "getgrnam";
375 cmds[4] = "getgrnam_r";
376 cmds[5] = "getgrgid";
377 cmds[6] = "getgrgid_r";
378 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
379 cmds[0] = "setgrent";
380 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
381 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
383 CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |
384 GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
390 * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,
391 * getgrgid, getgrgid_r
392 * fields: gr_name, gr_passwd, gr_gid, gr_mem
394 * names: wheel, daemon, kmem, sys, operator
401 capgrp = cap_clone(origcapgrp);
402 CHECK(capgrp != NULL);
404 cmds[0] = "setgrent";
405 cmds[1] = "getgrent_r";
406 cmds[2] = "getgrnam";
407 cmds[3] = "getgrnam_r";
408 cmds[4] = "getgrgid";
409 cmds[5] = "getgrgid_r";
410 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
411 cmds[0] = "setgrent";
412 cmds[1] = "getgrent";
413 cmds[2] = "getgrent_r";
414 cmds[3] = "getgrnam";
415 cmds[4] = "getgrnam_r";
416 cmds[5] = "getgrgid";
417 cmds[6] = "getgrgid_r";
418 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
419 cmds[0] = "getgrent";
420 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
421 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
422 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
424 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |
425 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
431 * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,
432 * getgrgid, getgrgid_r
433 * fields: gr_name, gr_passwd, gr_gid, gr_mem
436 * gids: 0, 1, 2, 3, 5
442 capgrp = cap_clone(origcapgrp);
443 CHECK(capgrp != NULL);
445 cmds[0] = "setgrent";
446 cmds[1] = "getgrent_r";
447 cmds[2] = "getgrnam";
448 cmds[3] = "getgrnam_r";
449 cmds[4] = "getgrgid";
450 cmds[5] = "getgrgid_r";
451 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
452 cmds[0] = "setgrent";
453 cmds[1] = "getgrent";
454 cmds[2] = "getgrent_r";
455 cmds[3] = "getgrnam";
456 cmds[4] = "getgrnam_r";
457 cmds[5] = "getgrgid";
458 cmds[6] = "getgrgid_r";
459 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
460 cmds[0] = "getgrent";
461 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
462 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
463 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
465 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |
466 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
472 * cmds: setgrent, getgrent, getgrnam, getgrnam_r,
473 * getgrgid, getgrgid_r
474 * fields: gr_name, gr_passwd, gr_gid, gr_mem
476 * names: wheel, daemon, kmem, sys, operator
483 capgrp = cap_clone(origcapgrp);
484 CHECK(capgrp != NULL);
486 cmds[0] = "setgrent";
487 cmds[1] = "getgrent";
488 cmds[2] = "getgrnam";
489 cmds[3] = "getgrnam_r";
490 cmds[4] = "getgrgid";
491 cmds[5] = "getgrgid_r";
492 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
493 cmds[0] = "setgrent";
494 cmds[1] = "getgrent";
495 cmds[2] = "getgrent_r";
496 cmds[3] = "getgrnam";
497 cmds[4] = "getgrnam_r";
498 cmds[5] = "getgrgid";
499 cmds[6] = "getgrgid_r";
500 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
501 cmds[0] = "getgrent_r";
502 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
503 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
505 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |
506 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
512 * cmds: setgrent, getgrent, getgrnam, getgrnam_r,
513 * getgrgid, getgrgid_r
514 * fields: gr_name, gr_passwd, gr_gid, gr_mem
517 * gids: 0, 1, 2, 3, 5
523 capgrp = cap_clone(origcapgrp);
524 CHECK(capgrp != NULL);
526 cmds[0] = "setgrent";
527 cmds[1] = "getgrent";
528 cmds[2] = "getgrnam";
529 cmds[3] = "getgrnam_r";
530 cmds[4] = "getgrgid";
531 cmds[5] = "getgrgid_r";
532 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
533 cmds[0] = "setgrent";
534 cmds[1] = "getgrent";
535 cmds[2] = "getgrent_r";
536 cmds[3] = "getgrnam";
537 cmds[4] = "getgrnam_r";
538 cmds[5] = "getgrgid";
539 cmds[6] = "getgrgid_r";
540 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
541 cmds[0] = "getgrent_r";
542 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
543 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
545 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |
546 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
552 * cmds: setgrent, getgrent, getgrent_r, getgrnam_r,
553 * getgrgid, getgrgid_r
554 * fields: gr_name, gr_passwd, gr_gid, gr_mem
556 * names: wheel, daemon, kmem, sys, operator
563 capgrp = cap_clone(origcapgrp);
564 CHECK(capgrp != NULL);
566 cmds[0] = "setgrent";
567 cmds[1] = "getgrent";
568 cmds[2] = "getgrent_r";
569 cmds[3] = "getgrnam_r";
570 cmds[4] = "getgrgid";
571 cmds[5] = "getgrgid_r";
572 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
573 cmds[0] = "setgrent";
574 cmds[1] = "getgrent";
575 cmds[2] = "getgrent_r";
576 cmds[3] = "getgrnam";
577 cmds[4] = "getgrnam_r";
578 cmds[5] = "getgrgid";
579 cmds[6] = "getgrgid_r";
580 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
581 cmds[0] = "getgrnam";
582 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
583 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
584 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
586 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
587 GETGRNAM_R | GETGRGID | GETGRGID_R));
593 * cmds: setgrent, getgrent, getgrent_r, getgrnam_r,
594 * getgrgid, getgrgid_r
595 * fields: gr_name, gr_passwd, gr_gid, gr_mem
598 * gids: 0, 1, 2, 3, 5
604 capgrp = cap_clone(origcapgrp);
605 CHECK(capgrp != NULL);
607 cmds[0] = "setgrent";
608 cmds[1] = "getgrent";
609 cmds[2] = "getgrent_r";
610 cmds[3] = "getgrnam_r";
611 cmds[4] = "getgrgid";
612 cmds[5] = "getgrgid_r";
613 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
614 cmds[0] = "setgrent";
615 cmds[1] = "getgrent";
616 cmds[2] = "getgrent_r";
617 cmds[3] = "getgrnam";
618 cmds[4] = "getgrnam_r";
619 cmds[5] = "getgrgid";
620 cmds[6] = "getgrgid_r";
621 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
622 cmds[0] = "getgrnam";
623 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
624 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
625 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
627 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
628 GETGRNAM_R | GETGRGID | GETGRGID_R));
634 * cmds: setgrent, getgrent, getgrent_r, getgrnam,
635 * getgrgid, getgrgid_r
636 * fields: gr_name, gr_passwd, gr_gid, gr_mem
638 * names: wheel, daemon, kmem, sys, operator
645 capgrp = cap_clone(origcapgrp);
646 CHECK(capgrp != NULL);
648 cmds[0] = "setgrent";
649 cmds[1] = "getgrent";
650 cmds[2] = "getgrent_r";
651 cmds[3] = "getgrnam";
652 cmds[4] = "getgrgid";
653 cmds[5] = "getgrgid_r";
654 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
655 cmds[0] = "setgrent";
656 cmds[1] = "getgrent";
657 cmds[2] = "getgrent_r";
658 cmds[3] = "getgrnam";
659 cmds[4] = "getgrnam_r";
660 cmds[5] = "getgrgid";
661 cmds[6] = "getgrgid_r";
662 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
663 cmds[0] = "getgrnam_r";
664 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
665 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
667 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
668 GETGRNAM | GETGRGID | GETGRGID_R));
674 * cmds: setgrent, getgrent, getgrent_r, getgrnam,
675 * getgrgid, getgrgid_r
676 * fields: gr_name, gr_passwd, gr_gid, gr_mem
679 * gids: 0, 1, 2, 3, 5
685 capgrp = cap_clone(origcapgrp);
686 CHECK(capgrp != NULL);
688 cmds[0] = "setgrent";
689 cmds[1] = "getgrent";
690 cmds[2] = "getgrent_r";
691 cmds[3] = "getgrnam";
692 cmds[4] = "getgrgid";
693 cmds[5] = "getgrgid_r";
694 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
695 cmds[0] = "setgrent";
696 cmds[1] = "getgrent";
697 cmds[2] = "getgrent_r";
698 cmds[3] = "getgrnam";
699 cmds[4] = "getgrnam_r";
700 cmds[5] = "getgrgid";
701 cmds[6] = "getgrgid_r";
702 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
703 cmds[0] = "getgrnam_r";
704 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
705 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
707 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
708 GETGRNAM | GETGRGID | GETGRGID_R));
714 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
716 * fields: gr_name, gr_passwd, gr_gid, gr_mem
718 * names: wheel, daemon, kmem, sys, operator
725 capgrp = cap_clone(origcapgrp);
726 CHECK(capgrp != NULL);
728 cmds[0] = "setgrent";
729 cmds[1] = "getgrent";
730 cmds[2] = "getgrent_r";
731 cmds[3] = "getgrnam";
732 cmds[4] = "getgrnam_r";
733 cmds[5] = "getgrgid_r";
734 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
735 cmds[0] = "setgrent";
736 cmds[1] = "getgrent";
737 cmds[2] = "getgrent_r";
738 cmds[3] = "getgrnam";
739 cmds[4] = "getgrnam_r";
740 cmds[5] = "getgrgid";
741 cmds[6] = "getgrgid_r";
742 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
743 cmds[0] = "getgrgid";
744 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
745 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
746 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
748 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
749 GETGRNAM | GETGRNAM_R | GETGRGID_R));
755 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
757 * fields: gr_name, gr_passwd, gr_gid, gr_mem
760 * gids: 0, 1, 2, 3, 5
766 capgrp = cap_clone(origcapgrp);
767 CHECK(capgrp != NULL);
769 cmds[0] = "setgrent";
770 cmds[1] = "getgrent";
771 cmds[2] = "getgrent_r";
772 cmds[3] = "getgrnam";
773 cmds[4] = "getgrnam_r";
774 cmds[5] = "getgrgid_r";
775 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
776 cmds[0] = "setgrent";
777 cmds[1] = "getgrent";
778 cmds[2] = "getgrent_r";
779 cmds[3] = "getgrnam";
780 cmds[4] = "getgrnam_r";
781 cmds[5] = "getgrgid";
782 cmds[6] = "getgrgid_r";
783 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
784 cmds[0] = "getgrgid";
785 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
786 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
787 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
789 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
790 GETGRNAM | GETGRNAM_R | GETGRGID_R));
796 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
798 * fields: gr_name, gr_passwd, gr_gid, gr_mem
800 * names: wheel, daemon, kmem, sys, operator
807 capgrp = cap_clone(origcapgrp);
808 CHECK(capgrp != NULL);
810 cmds[0] = "setgrent";
811 cmds[1] = "getgrent";
812 cmds[2] = "getgrent_r";
813 cmds[3] = "getgrnam";
814 cmds[4] = "getgrnam_r";
815 cmds[5] = "getgrgid";
816 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
817 cmds[0] = "setgrent";
818 cmds[1] = "getgrent";
819 cmds[2] = "getgrent_r";
820 cmds[3] = "getgrnam";
821 cmds[4] = "getgrnam_r";
822 cmds[5] = "getgrgid";
823 cmds[6] = "getgrgid_r";
824 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
825 cmds[0] = "getgrgid_r";
826 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
827 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
829 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
830 GETGRNAM | GETGRNAM_R | GETGRGID));
836 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
838 * fields: gr_name, gr_passwd, gr_gid, gr_mem
841 * gids: 0, 1, 2, 3, 5
847 capgrp = cap_clone(origcapgrp);
848 CHECK(capgrp != NULL);
850 cmds[0] = "setgrent";
851 cmds[1] = "getgrent";
852 cmds[2] = "getgrent_r";
853 cmds[3] = "getgrnam";
854 cmds[4] = "getgrnam_r";
855 cmds[5] = "getgrgid";
856 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
857 cmds[0] = "setgrent";
858 cmds[1] = "getgrent";
859 cmds[2] = "getgrent_r";
860 cmds[3] = "getgrnam";
861 cmds[4] = "getgrnam_r";
862 cmds[5] = "getgrgid";
863 cmds[6] = "getgrgid_r";
864 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
865 cmds[0] = "getgrgid_r";
866 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
867 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
869 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
870 GETGRNAM | GETGRNAM_R | GETGRGID));
876 #define GR_PASSWD 0x02
881 group_fields(const struct group *grp)
887 if (grp->gr_name != NULL && grp->gr_name[0] != '\0')
890 if (grp->gr_passwd != NULL && grp->gr_passwd[0] != '\0')
893 if (grp->gr_gid != (gid_t)-1)
896 if (grp->gr_mem != NULL && grp->gr_mem[0] != NULL)
903 runtest_fields(cap_channel_t *capgrp, unsigned int expected)
909 (void)cap_setgrent(capgrp);
910 grp = cap_getgrent(capgrp);
911 if (group_fields(grp) != expected)
914 (void)cap_setgrent(capgrp);
915 cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);
916 if (group_fields(grp) != expected)
919 grp = cap_getgrnam(capgrp, "wheel");
920 if (group_fields(grp) != expected)
923 cap_getgrnam_r(capgrp, "wheel", &st, buf, sizeof(buf), &grp);
924 if (group_fields(grp) != expected)
927 grp = cap_getgrgid(capgrp, GID_WHEEL);
928 if (group_fields(grp) != expected)
931 cap_getgrgid_r(capgrp, GID_WHEEL, &st, buf, sizeof(buf), &grp);
932 if (group_fields(grp) != expected)
939 test_fields(cap_channel_t *origcapgrp)
941 cap_channel_t *capgrp;
942 const char *fields[4];
946 CHECK(runtest_fields(origcapgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));
950 * fields: gr_name, gr_passwd, gr_gid, gr_mem
952 capgrp = cap_clone(origcapgrp);
953 CHECK(capgrp != NULL);
955 fields[0] = "gr_name";
956 fields[1] = "gr_passwd";
957 fields[2] = "gr_gid";
958 fields[3] = "gr_mem";
959 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
961 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));
967 * fields: gr_passwd, gr_gid, gr_mem
969 capgrp = cap_clone(origcapgrp);
970 CHECK(capgrp != NULL);
972 fields[0] = "gr_passwd";
973 fields[1] = "gr_gid";
974 fields[2] = "gr_mem";
975 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
976 fields[0] = "gr_name";
977 fields[1] = "gr_passwd";
978 fields[2] = "gr_gid";
979 fields[3] = "gr_mem";
980 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
981 errno == ENOTCAPABLE);
983 CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID | GR_MEM));
989 * fields: gr_name, gr_gid, gr_mem
991 capgrp = cap_clone(origcapgrp);
992 CHECK(capgrp != NULL);
994 fields[0] = "gr_name";
995 fields[1] = "gr_gid";
996 fields[2] = "gr_mem";
997 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
998 fields[0] = "gr_name";
999 fields[1] = "gr_passwd";
1000 fields[2] = "gr_gid";
1001 fields[3] = "gr_mem";
1002 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1003 errno == ENOTCAPABLE);
1004 fields[0] = "gr_passwd";
1005 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1006 errno == ENOTCAPABLE);
1008 CHECK(runtest_fields(capgrp, GR_NAME | GR_GID | GR_MEM));
1014 * fields: gr_name, gr_passwd, gr_mem
1016 capgrp = cap_clone(origcapgrp);
1017 CHECK(capgrp != NULL);
1019 fields[0] = "gr_name";
1020 fields[1] = "gr_passwd";
1021 fields[2] = "gr_mem";
1022 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
1023 fields[0] = "gr_name";
1024 fields[1] = "gr_passwd";
1025 fields[2] = "gr_gid";
1026 fields[3] = "gr_mem";
1027 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1028 errno == ENOTCAPABLE);
1029 fields[0] = "gr_gid";
1030 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1031 errno == ENOTCAPABLE);
1033 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_MEM));
1039 * fields: gr_name, gr_passwd, gr_gid
1041 capgrp = cap_clone(origcapgrp);
1042 CHECK(capgrp != NULL);
1044 fields[0] = "gr_name";
1045 fields[1] = "gr_passwd";
1046 fields[2] = "gr_gid";
1047 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
1048 fields[0] = "gr_name";
1049 fields[1] = "gr_passwd";
1050 fields[2] = "gr_gid";
1051 fields[3] = "gr_mem";
1052 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1053 errno == ENOTCAPABLE);
1054 fields[0] = "gr_mem";
1055 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1056 errno == ENOTCAPABLE);
1058 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID));
1064 * fields: gr_name, gr_passwd
1066 capgrp = cap_clone(origcapgrp);
1067 CHECK(capgrp != NULL);
1069 fields[0] = "gr_name";
1070 fields[1] = "gr_passwd";
1071 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1072 fields[0] = "gr_name";
1073 fields[1] = "gr_passwd";
1074 fields[2] = "gr_gid";
1075 fields[3] = "gr_mem";
1076 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1077 errno == ENOTCAPABLE);
1078 fields[0] = "gr_gid";
1079 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1080 errno == ENOTCAPABLE);
1082 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD));
1088 * fields: gr_name, gr_gid
1090 capgrp = cap_clone(origcapgrp);
1091 CHECK(capgrp != NULL);
1093 fields[0] = "gr_name";
1094 fields[1] = "gr_gid";
1095 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1096 fields[0] = "gr_name";
1097 fields[1] = "gr_passwd";
1098 fields[2] = "gr_gid";
1099 fields[3] = "gr_mem";
1100 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1101 errno == ENOTCAPABLE);
1102 fields[0] = "gr_mem";
1103 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1104 errno == ENOTCAPABLE);
1106 CHECK(runtest_fields(capgrp, GR_NAME | GR_GID));
1112 * fields: gr_name, gr_mem
1114 capgrp = cap_clone(origcapgrp);
1115 CHECK(capgrp != NULL);
1117 fields[0] = "gr_name";
1118 fields[1] = "gr_mem";
1119 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1120 fields[0] = "gr_name";
1121 fields[1] = "gr_passwd";
1122 fields[2] = "gr_gid";
1123 fields[3] = "gr_mem";
1124 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1125 errno == ENOTCAPABLE);
1126 fields[0] = "gr_passwd";
1127 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1128 errno == ENOTCAPABLE);
1130 CHECK(runtest_fields(capgrp, GR_NAME | GR_MEM));
1136 * fields: gr_passwd, gr_gid
1138 capgrp = cap_clone(origcapgrp);
1139 CHECK(capgrp != NULL);
1141 fields[0] = "gr_passwd";
1142 fields[1] = "gr_gid";
1143 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1144 fields[0] = "gr_name";
1145 fields[1] = "gr_passwd";
1146 fields[2] = "gr_gid";
1147 fields[3] = "gr_mem";
1148 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1149 errno == ENOTCAPABLE);
1150 fields[0] = "gr_mem";
1151 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1152 errno == ENOTCAPABLE);
1154 CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID));
1160 * fields: gr_passwd, gr_mem
1162 capgrp = cap_clone(origcapgrp);
1163 CHECK(capgrp != NULL);
1165 fields[0] = "gr_passwd";
1166 fields[1] = "gr_mem";
1167 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1168 fields[0] = "gr_name";
1169 fields[1] = "gr_passwd";
1170 fields[2] = "gr_gid";
1171 fields[3] = "gr_mem";
1172 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1173 errno == ENOTCAPABLE);
1174 fields[0] = "gr_gid";
1175 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1176 errno == ENOTCAPABLE);
1178 CHECK(runtest_fields(capgrp, GR_PASSWD | GR_MEM));
1184 * fields: gr_gid, gr_mem
1186 capgrp = cap_clone(origcapgrp);
1187 CHECK(capgrp != NULL);
1189 fields[0] = "gr_gid";
1190 fields[1] = "gr_mem";
1191 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1192 fields[0] = "gr_name";
1193 fields[1] = "gr_passwd";
1194 fields[2] = "gr_gid";
1195 fields[3] = "gr_mem";
1196 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1197 errno == ENOTCAPABLE);
1198 fields[0] = "gr_passwd";
1199 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1200 errno == ENOTCAPABLE);
1202 CHECK(runtest_fields(capgrp, GR_GID | GR_MEM));
1208 runtest_groups(cap_channel_t *capgrp, const char **names, const gid_t *gids,
1214 unsigned int i, got;
1216 (void)cap_setgrent(capgrp);
1219 grp = cap_getgrent(capgrp);
1223 for (i = 0; i < ngroups; i++) {
1224 if (strcmp(names[i], grp->gr_name) == 0 &&
1225 gids[i] == grp->gr_gid) {
1235 (void)cap_setgrent(capgrp);
1238 cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);
1242 for (i = 0; i < ngroups; i++) {
1243 if (strcmp(names[i], grp->gr_name) == 0 &&
1244 gids[i] == grp->gr_gid) {
1254 for (i = 0; i < ngroups; i++) {
1255 grp = cap_getgrnam(capgrp, names[i]);
1260 for (i = 0; i < ngroups; i++) {
1261 cap_getgrnam_r(capgrp, names[i], &st, buf, sizeof(buf), &grp);
1266 for (i = 0; i < ngroups; i++) {
1267 grp = cap_getgrgid(capgrp, gids[i]);
1272 for (i = 0; i < ngroups; i++) {
1273 cap_getgrgid_r(capgrp, gids[i], &st, buf, sizeof(buf), &grp);
1282 test_groups(cap_channel_t *origcapgrp)
1284 cap_channel_t *capgrp;
1285 const char *names[5];
1291 * names: wheel, daemon, kmem, sys, tty
1294 capgrp = cap_clone(origcapgrp);
1295 CHECK(capgrp != NULL);
1298 names[1] = "daemon";
1302 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
1309 CHECK(runtest_groups(capgrp, names, gids, 5));
1316 * names: kmem, sys, tty
1319 capgrp = cap_clone(origcapgrp);
1320 CHECK(capgrp != NULL);
1325 CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);
1326 names[3] = "daemon";
1327 CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&
1328 errno == ENOTCAPABLE);
1329 names[0] = "daemon";
1330 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1331 errno == ENOTCAPABLE);
1337 CHECK(runtest_groups(capgrp, names, gids, 3));
1344 * names: wheel, kmem, tty
1347 capgrp = cap_clone(origcapgrp);
1348 CHECK(capgrp != NULL);
1353 CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);
1354 names[3] = "daemon";
1355 CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&
1356 errno == ENOTCAPABLE);
1357 names[0] = "daemon";
1358 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1359 errno == ENOTCAPABLE);
1365 CHECK(runtest_groups(capgrp, names, gids, 3));
1375 capgrp = cap_clone(origcapgrp);
1376 CHECK(capgrp != NULL);
1384 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);
1386 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&
1387 errno == ENOTCAPABLE);
1389 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1390 errno == ENOTCAPABLE);
1393 CHECK(runtest_groups(capgrp, names, gids, 3));
1403 capgrp = cap_clone(origcapgrp);
1404 CHECK(capgrp != NULL);
1412 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);
1414 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&
1415 errno == ENOTCAPABLE);
1417 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1418 errno == ENOTCAPABLE);
1421 CHECK(runtest_groups(capgrp, names, gids, 3));
1431 capgrp = cap_clone(origcapgrp);
1432 CHECK(capgrp != NULL);
1435 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == 0);
1436 names[1] = "daemon";
1437 CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == -1 &&
1438 errno == ENOTCAPABLE);
1439 names[0] = "daemon";
1440 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1441 errno == ENOTCAPABLE);
1445 CHECK(runtest_groups(capgrp, names, gids, 1));
1455 capgrp = cap_clone(origcapgrp);
1456 CHECK(capgrp != NULL);
1460 CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == 0);
1461 names[2] = "daemon";
1462 CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == -1 &&
1463 errno == ENOTCAPABLE);
1464 names[0] = "daemon";
1465 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1466 errno == ENOTCAPABLE);
1471 CHECK(runtest_groups(capgrp, names, gids, 2));
1481 capgrp = cap_clone(origcapgrp);
1482 CHECK(capgrp != NULL);
1486 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == 0);
1488 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == -1 &&
1489 errno == ENOTCAPABLE);
1491 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1492 errno == ENOTCAPABLE);
1495 CHECK(runtest_groups(capgrp, names, gids, 1));
1505 capgrp = cap_clone(origcapgrp);
1506 CHECK(capgrp != NULL);
1512 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == 0);
1514 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == -1 &&
1515 errno == ENOTCAPABLE);
1517 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1518 errno == ENOTCAPABLE);
1521 CHECK(runtest_groups(capgrp, names, gids, 2));
1529 cap_channel_t *capcas, *capgrp;
1534 capcas = cap_init();
1535 CHECKX(capcas != NULL);
1537 capgrp = cap_service_open(capcas, "system.grp");
1538 CHECKX(capgrp != NULL);
1544 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
1545 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
1549 test_fields(capgrp);
1551 test_groups(capgrp);