2 * Copyright (c) 2013 The FreeBSD Foundation
5 * This software was developed by Pawel Jakub Dawidek under sponsorship from
6 * the FreeBSD Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
33 #include <sys/capsicum.h>
44 #include <libcasper.h>
46 #include <casper/cap_grp.h>
50 #define CHECK(expr) do { \
52 printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
54 printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
58 #define CHECKX(expr) do { \
60 printf("ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
62 printf("not ok %d %s:%u\n", ntest, __FILE__, __LINE__); \
70 #define GID_OPERATOR 5
72 #define GETGRENT0 0x0001
73 #define GETGRENT1 0x0002
74 #define GETGRENT2 0x0004
75 #define GETGRENT (GETGRENT0 | GETGRENT1 | GETGRENT2)
76 #define GETGRENT_R0 0x0008
77 #define GETGRENT_R1 0x0010
78 #define GETGRENT_R2 0x0020
79 #define GETGRENT_R (GETGRENT_R0 | GETGRENT_R1 | GETGRENT_R2)
80 #define GETGRNAM 0x0040
81 #define GETGRNAM_R 0x0080
82 #define GETGRGID 0x0100
83 #define GETGRGID_R 0x0200
84 #define SETGRENT 0x0400
87 group_mem_compare(char **mem0, char **mem1)
91 if (mem0 == NULL && mem1 == NULL)
93 if (mem0 == NULL || mem1 == NULL)
96 for (i0 = 0; mem0[i0] != NULL; i0++) {
97 for (i1 = 0; mem1[i1] != NULL; i1++) {
98 if (strcmp(mem0[i0], mem1[i1]) == 0)
101 if (mem1[i1] == NULL)
109 group_compare(const struct group *grp0, const struct group *grp1)
112 if (grp0 == NULL && grp1 == NULL)
114 if (grp0 == NULL || grp1 == NULL)
117 if (strcmp(grp0->gr_name, grp1->gr_name) != 0)
120 if (grp0->gr_passwd != NULL || grp1->gr_passwd != NULL) {
121 if (grp0->gr_passwd == NULL || grp1->gr_passwd == NULL)
123 if (strcmp(grp0->gr_passwd, grp1->gr_passwd) != 0)
127 if (grp0->gr_gid != grp1->gr_gid)
130 if (!group_mem_compare(grp0->gr_mem, grp1->gr_mem))
137 runtest_cmds(cap_channel_t *capgrp)
139 char bufs[1024], bufc[1024];
141 struct group *grps, *grpc;
142 struct group sts, stc;
147 if (cap_setgrent(capgrp) == 1)
151 grpc = cap_getgrent(capgrp);
152 if (group_compare(grps, grpc)) {
155 grpc = cap_getgrent(capgrp);
156 if (group_compare(grps, grpc))
160 getgrent_r(&sts, bufs, sizeof(bufs), &grps);
161 cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
162 if (group_compare(grps, grpc)) {
163 result |= GETGRENT_R0;
164 getgrent_r(&sts, bufs, sizeof(bufs), &grps);
165 cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
166 if (group_compare(grps, grpc))
167 result |= GETGRENT_R1;
171 if (cap_setgrent(capgrp) == 1)
174 getgrent_r(&sts, bufs, sizeof(bufs), &grps);
175 cap_getgrent_r(capgrp, &stc, bufc, sizeof(bufc), &grpc);
176 if (group_compare(grps, grpc))
177 result |= GETGRENT_R2;
180 grpc = cap_getgrent(capgrp);
181 if (group_compare(grps, grpc))
184 grps = getgrnam("wheel");
185 grpc = cap_getgrnam(capgrp, "wheel");
186 if (group_compare(grps, grpc)) {
187 grps = getgrnam("operator");
188 grpc = cap_getgrnam(capgrp, "operator");
189 if (group_compare(grps, grpc))
193 getgrnam_r("wheel", &sts, bufs, sizeof(bufs), &grps);
194 cap_getgrnam_r(capgrp, "wheel", &stc, bufc, sizeof(bufc), &grpc);
195 if (group_compare(grps, grpc)) {
196 getgrnam_r("operator", &sts, bufs, sizeof(bufs), &grps);
197 cap_getgrnam_r(capgrp, "operator", &stc, bufc, sizeof(bufc),
199 if (group_compare(grps, grpc))
200 result |= GETGRNAM_R;
203 grps = getgrgid(GID_WHEEL);
204 grpc = cap_getgrgid(capgrp, GID_WHEEL);
205 if (group_compare(grps, grpc)) {
206 grps = getgrgid(GID_OPERATOR);
207 grpc = cap_getgrgid(capgrp, GID_OPERATOR);
208 if (group_compare(grps, grpc))
212 getgrgid_r(GID_WHEEL, &sts, bufs, sizeof(bufs), &grps);
213 cap_getgrgid_r(capgrp, GID_WHEEL, &stc, bufc, sizeof(bufc), &grpc);
214 if (group_compare(grps, grpc)) {
215 getgrgid_r(GID_OPERATOR, &sts, bufs, sizeof(bufs), &grps);
216 cap_getgrgid_r(capgrp, GID_OPERATOR, &stc, bufc, sizeof(bufc),
218 if (group_compare(grps, grpc))
219 result |= GETGRGID_R;
226 test_cmds(cap_channel_t *origcapgrp)
228 cap_channel_t *capgrp;
229 const char *cmds[7], *fields[4], *names[5];
232 fields[0] = "gr_name";
233 fields[1] = "gr_passwd";
234 fields[2] = "gr_gid";
235 fields[3] = "gr_mem";
241 names[4] = "operator";
251 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
252 * getgrgid, getgrgid_r
253 * fields: gr_name, gr_passwd, gr_gid, gr_mem
255 * names: wheel, daemon, kmem, sys, operator
258 capgrp = cap_clone(origcapgrp);
259 CHECK(capgrp != NULL);
261 cmds[0] = "setgrent";
262 cmds[1] = "getgrent";
263 cmds[2] = "getgrent_r";
264 cmds[3] = "getgrnam";
265 cmds[4] = "getgrnam_r";
266 cmds[5] = "getgrgid";
267 cmds[6] = "getgrgid_r";
268 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);
269 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
270 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
272 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
273 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
279 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
280 * getgrgid, getgrgid_r
281 * fields: gr_name, gr_passwd, gr_gid, gr_mem
284 * gids: 0, 1, 2, 3, 5
286 capgrp = cap_clone(origcapgrp);
287 CHECK(capgrp != NULL);
289 cmds[0] = "setgrent";
290 cmds[1] = "getgrent";
291 cmds[2] = "getgrent_r";
292 cmds[3] = "getgrnam";
293 cmds[4] = "getgrnam_r";
294 cmds[5] = "getgrgid";
295 cmds[6] = "getgrgid_r";
296 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == 0);
297 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
298 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
300 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
301 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
307 * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,
308 * getgrgid, getgrgid_r
309 * fields: gr_name, gr_passwd, gr_gid, gr_mem
311 * names: wheel, daemon, kmem, sys, operator
318 capgrp = cap_clone(origcapgrp);
319 CHECK(capgrp != NULL);
321 cmds[0] = "getgrent";
322 cmds[1] = "getgrent_r";
323 cmds[2] = "getgrnam";
324 cmds[3] = "getgrnam_r";
325 cmds[4] = "getgrgid";
326 cmds[5] = "getgrgid_r";
327 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
328 cmds[0] = "setgrent";
329 cmds[1] = "getgrent";
330 cmds[2] = "getgrent_r";
331 cmds[3] = "getgrnam";
332 cmds[4] = "getgrnam_r";
333 cmds[5] = "getgrgid";
334 cmds[6] = "getgrgid_r";
335 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
336 cmds[0] = "setgrent";
337 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
338 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
340 CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |
341 GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
347 * cmds: getgrent, getgrent_r, getgrnam, getgrnam_r,
348 * getgrgid, getgrgid_r
349 * fields: gr_name, gr_passwd, gr_gid, gr_mem
352 * gids: 0, 1, 2, 3, 5
358 capgrp = cap_clone(origcapgrp);
359 CHECK(capgrp != NULL);
361 cmds[0] = "getgrent";
362 cmds[1] = "getgrent_r";
363 cmds[2] = "getgrnam";
364 cmds[3] = "getgrnam_r";
365 cmds[4] = "getgrgid";
366 cmds[5] = "getgrgid_r";
367 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
368 cmds[0] = "setgrent";
369 cmds[1] = "getgrent";
370 cmds[2] = "getgrent_r";
371 cmds[3] = "getgrnam";
372 cmds[4] = "getgrnam_r";
373 cmds[5] = "getgrgid";
374 cmds[6] = "getgrgid_r";
375 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
376 cmds[0] = "setgrent";
377 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
378 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
380 CHECK(runtest_cmds(capgrp) == (GETGRENT0 | GETGRENT1 | GETGRENT_R0 |
381 GETGRENT_R1 | GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
387 * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,
388 * getgrgid, getgrgid_r
389 * fields: gr_name, gr_passwd, gr_gid, gr_mem
391 * names: wheel, daemon, kmem, sys, operator
398 capgrp = cap_clone(origcapgrp);
399 CHECK(capgrp != NULL);
401 cmds[0] = "setgrent";
402 cmds[1] = "getgrent_r";
403 cmds[2] = "getgrnam";
404 cmds[3] = "getgrnam_r";
405 cmds[4] = "getgrgid";
406 cmds[5] = "getgrgid_r";
407 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
408 cmds[0] = "setgrent";
409 cmds[1] = "getgrent";
410 cmds[2] = "getgrent_r";
411 cmds[3] = "getgrnam";
412 cmds[4] = "getgrnam_r";
413 cmds[5] = "getgrgid";
414 cmds[6] = "getgrgid_r";
415 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
416 cmds[0] = "getgrent";
417 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
418 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
419 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
421 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |
422 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
428 * cmds: setgrent, getgrent_r, getgrnam, getgrnam_r,
429 * getgrgid, getgrgid_r
430 * fields: gr_name, gr_passwd, gr_gid, gr_mem
433 * gids: 0, 1, 2, 3, 5
439 capgrp = cap_clone(origcapgrp);
440 CHECK(capgrp != NULL);
442 cmds[0] = "setgrent";
443 cmds[1] = "getgrent_r";
444 cmds[2] = "getgrnam";
445 cmds[3] = "getgrnam_r";
446 cmds[4] = "getgrgid";
447 cmds[5] = "getgrgid_r";
448 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
449 cmds[0] = "setgrent";
450 cmds[1] = "getgrent";
451 cmds[2] = "getgrent_r";
452 cmds[3] = "getgrnam";
453 cmds[4] = "getgrnam_r";
454 cmds[5] = "getgrgid";
455 cmds[6] = "getgrgid_r";
456 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
457 cmds[0] = "getgrent";
458 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
459 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
460 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
462 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT_R2 |
463 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
469 * cmds: setgrent, getgrent, getgrnam, getgrnam_r,
470 * getgrgid, getgrgid_r
471 * fields: gr_name, gr_passwd, gr_gid, gr_mem
473 * names: wheel, daemon, kmem, sys, operator
480 capgrp = cap_clone(origcapgrp);
481 CHECK(capgrp != NULL);
483 cmds[0] = "setgrent";
484 cmds[1] = "getgrent";
485 cmds[2] = "getgrnam";
486 cmds[3] = "getgrnam_r";
487 cmds[4] = "getgrgid";
488 cmds[5] = "getgrgid_r";
489 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
490 cmds[0] = "setgrent";
491 cmds[1] = "getgrent";
492 cmds[2] = "getgrent_r";
493 cmds[3] = "getgrnam";
494 cmds[4] = "getgrnam_r";
495 cmds[5] = "getgrgid";
496 cmds[6] = "getgrgid_r";
497 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
498 cmds[0] = "getgrent_r";
499 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
500 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
502 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |
503 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
509 * cmds: setgrent, getgrent, getgrnam, getgrnam_r,
510 * getgrgid, getgrgid_r
511 * fields: gr_name, gr_passwd, gr_gid, gr_mem
514 * gids: 0, 1, 2, 3, 5
520 capgrp = cap_clone(origcapgrp);
521 CHECK(capgrp != NULL);
523 cmds[0] = "setgrent";
524 cmds[1] = "getgrent";
525 cmds[2] = "getgrnam";
526 cmds[3] = "getgrnam_r";
527 cmds[4] = "getgrgid";
528 cmds[5] = "getgrgid_r";
529 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
530 cmds[0] = "setgrent";
531 cmds[1] = "getgrent";
532 cmds[2] = "getgrent_r";
533 cmds[3] = "getgrnam";
534 cmds[4] = "getgrnam_r";
535 cmds[5] = "getgrgid";
536 cmds[6] = "getgrgid_r";
537 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
538 cmds[0] = "getgrent_r";
539 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
540 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
542 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT0 | GETGRENT1 |
543 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
549 * cmds: setgrent, getgrent, getgrent_r, getgrnam_r,
550 * getgrgid, getgrgid_r
551 * fields: gr_name, gr_passwd, gr_gid, gr_mem
553 * names: wheel, daemon, kmem, sys, operator
560 capgrp = cap_clone(origcapgrp);
561 CHECK(capgrp != NULL);
563 cmds[0] = "setgrent";
564 cmds[1] = "getgrent";
565 cmds[2] = "getgrent_r";
566 cmds[3] = "getgrnam_r";
567 cmds[4] = "getgrgid";
568 cmds[5] = "getgrgid_r";
569 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
570 cmds[0] = "setgrent";
571 cmds[1] = "getgrent";
572 cmds[2] = "getgrent_r";
573 cmds[3] = "getgrnam";
574 cmds[4] = "getgrnam_r";
575 cmds[5] = "getgrgid";
576 cmds[6] = "getgrgid_r";
577 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
578 cmds[0] = "getgrnam";
579 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
580 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
581 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
583 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
584 GETGRNAM_R | GETGRGID | GETGRGID_R));
590 * cmds: setgrent, getgrent, getgrent_r, getgrnam_r,
591 * getgrgid, getgrgid_r
592 * fields: gr_name, gr_passwd, gr_gid, gr_mem
595 * gids: 0, 1, 2, 3, 5
601 capgrp = cap_clone(origcapgrp);
602 CHECK(capgrp != NULL);
604 cmds[0] = "setgrent";
605 cmds[1] = "getgrent";
606 cmds[2] = "getgrent_r";
607 cmds[3] = "getgrnam_r";
608 cmds[4] = "getgrgid";
609 cmds[5] = "getgrgid_r";
610 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
611 cmds[0] = "setgrent";
612 cmds[1] = "getgrent";
613 cmds[2] = "getgrent_r";
614 cmds[3] = "getgrnam";
615 cmds[4] = "getgrnam_r";
616 cmds[5] = "getgrgid";
617 cmds[6] = "getgrgid_r";
618 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
619 cmds[0] = "getgrnam";
620 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
621 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
622 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
624 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
625 GETGRNAM_R | GETGRGID | GETGRGID_R));
631 * cmds: setgrent, getgrent, getgrent_r, getgrnam,
632 * getgrgid, getgrgid_r
633 * fields: gr_name, gr_passwd, gr_gid, gr_mem
635 * names: wheel, daemon, kmem, sys, operator
642 capgrp = cap_clone(origcapgrp);
643 CHECK(capgrp != NULL);
645 cmds[0] = "setgrent";
646 cmds[1] = "getgrent";
647 cmds[2] = "getgrent_r";
648 cmds[3] = "getgrnam";
649 cmds[4] = "getgrgid";
650 cmds[5] = "getgrgid_r";
651 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
652 cmds[0] = "setgrent";
653 cmds[1] = "getgrent";
654 cmds[2] = "getgrent_r";
655 cmds[3] = "getgrnam";
656 cmds[4] = "getgrnam_r";
657 cmds[5] = "getgrgid";
658 cmds[6] = "getgrgid_r";
659 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
660 cmds[0] = "getgrnam_r";
661 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
662 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
664 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
665 GETGRNAM | GETGRGID | GETGRGID_R));
671 * cmds: setgrent, getgrent, getgrent_r, getgrnam,
672 * getgrgid, getgrgid_r
673 * fields: gr_name, gr_passwd, gr_gid, gr_mem
676 * gids: 0, 1, 2, 3, 5
682 capgrp = cap_clone(origcapgrp);
683 CHECK(capgrp != NULL);
685 cmds[0] = "setgrent";
686 cmds[1] = "getgrent";
687 cmds[2] = "getgrent_r";
688 cmds[3] = "getgrnam";
689 cmds[4] = "getgrgid";
690 cmds[5] = "getgrgid_r";
691 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
692 cmds[0] = "setgrent";
693 cmds[1] = "getgrent";
694 cmds[2] = "getgrent_r";
695 cmds[3] = "getgrnam";
696 cmds[4] = "getgrnam_r";
697 cmds[5] = "getgrgid";
698 cmds[6] = "getgrgid_r";
699 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
700 cmds[0] = "getgrnam_r";
701 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
702 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
704 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
705 GETGRNAM | GETGRGID | GETGRGID_R));
711 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
713 * fields: gr_name, gr_passwd, gr_gid, gr_mem
715 * names: wheel, daemon, kmem, sys, operator
722 capgrp = cap_clone(origcapgrp);
723 CHECK(capgrp != NULL);
725 cmds[0] = "setgrent";
726 cmds[1] = "getgrent";
727 cmds[2] = "getgrent_r";
728 cmds[3] = "getgrnam";
729 cmds[4] = "getgrnam_r";
730 cmds[5] = "getgrgid_r";
731 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
732 cmds[0] = "setgrent";
733 cmds[1] = "getgrent";
734 cmds[2] = "getgrent_r";
735 cmds[3] = "getgrnam";
736 cmds[4] = "getgrnam_r";
737 cmds[5] = "getgrgid";
738 cmds[6] = "getgrgid_r";
739 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
740 cmds[0] = "getgrgid";
741 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
742 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
743 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
745 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
746 GETGRNAM | GETGRNAM_R | GETGRGID_R));
752 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
754 * fields: gr_name, gr_passwd, gr_gid, gr_mem
757 * gids: 0, 1, 2, 3, 5
763 capgrp = cap_clone(origcapgrp);
764 CHECK(capgrp != NULL);
766 cmds[0] = "setgrent";
767 cmds[1] = "getgrent";
768 cmds[2] = "getgrent_r";
769 cmds[3] = "getgrnam";
770 cmds[4] = "getgrnam_r";
771 cmds[5] = "getgrgid_r";
772 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
773 cmds[0] = "setgrent";
774 cmds[1] = "getgrent";
775 cmds[2] = "getgrent_r";
776 cmds[3] = "getgrnam";
777 cmds[4] = "getgrnam_r";
778 cmds[5] = "getgrgid";
779 cmds[6] = "getgrgid_r";
780 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
781 cmds[0] = "getgrgid";
782 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
783 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
784 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
786 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
787 GETGRNAM | GETGRNAM_R | GETGRGID_R));
793 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
795 * fields: gr_name, gr_passwd, gr_gid, gr_mem
797 * names: wheel, daemon, kmem, sys, operator
804 capgrp = cap_clone(origcapgrp);
805 CHECK(capgrp != NULL);
807 cmds[0] = "setgrent";
808 cmds[1] = "getgrent";
809 cmds[2] = "getgrent_r";
810 cmds[3] = "getgrnam";
811 cmds[4] = "getgrnam_r";
812 cmds[5] = "getgrgid";
813 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
814 cmds[0] = "setgrent";
815 cmds[1] = "getgrent";
816 cmds[2] = "getgrent_r";
817 cmds[3] = "getgrnam";
818 cmds[4] = "getgrnam_r";
819 cmds[5] = "getgrgid";
820 cmds[6] = "getgrgid_r";
821 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
822 cmds[0] = "getgrgid_r";
823 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
824 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
826 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
827 GETGRNAM | GETGRNAM_R | GETGRGID));
833 * cmds: setgrent, getgrent, getgrent_r, getgrnam, getgrnam_r,
835 * fields: gr_name, gr_passwd, gr_gid, gr_mem
838 * gids: 0, 1, 2, 3, 5
844 capgrp = cap_clone(origcapgrp);
845 CHECK(capgrp != NULL);
847 cmds[0] = "setgrent";
848 cmds[1] = "getgrent";
849 cmds[2] = "getgrent_r";
850 cmds[3] = "getgrnam";
851 cmds[4] = "getgrnam_r";
852 cmds[5] = "getgrgid";
853 CHECK(cap_grp_limit_cmds(capgrp, cmds, 6) == 0);
854 cmds[0] = "setgrent";
855 cmds[1] = "getgrent";
856 cmds[2] = "getgrent_r";
857 cmds[3] = "getgrnam";
858 cmds[4] = "getgrnam_r";
859 cmds[5] = "getgrgid";
860 cmds[6] = "getgrgid_r";
861 CHECK(cap_grp_limit_cmds(capgrp, cmds, 7) == -1 && errno == ENOTCAPABLE);
862 cmds[0] = "getgrgid_r";
863 CHECK(cap_grp_limit_cmds(capgrp, cmds, 1) == -1 && errno == ENOTCAPABLE);
864 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 5) == 0);
866 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
867 GETGRNAM | GETGRNAM_R | GETGRGID));
873 #define GR_PASSWD 0x02
878 group_fields(const struct group *grp)
884 if (grp->gr_name != NULL && grp->gr_name[0] != '\0')
887 if (grp->gr_passwd != NULL && grp->gr_passwd[0] != '\0')
890 if (grp->gr_gid != (gid_t)-1)
893 if (grp->gr_mem != NULL && grp->gr_mem[0] != NULL)
900 runtest_fields(cap_channel_t *capgrp, unsigned int expected)
906 (void)cap_setgrent(capgrp);
907 grp = cap_getgrent(capgrp);
908 if (group_fields(grp) != expected)
911 (void)cap_setgrent(capgrp);
912 cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);
913 if (group_fields(grp) != expected)
916 grp = cap_getgrnam(capgrp, "wheel");
917 if (group_fields(grp) != expected)
920 cap_getgrnam_r(capgrp, "wheel", &st, buf, sizeof(buf), &grp);
921 if (group_fields(grp) != expected)
924 grp = cap_getgrgid(capgrp, GID_WHEEL);
925 if (group_fields(grp) != expected)
928 cap_getgrgid_r(capgrp, GID_WHEEL, &st, buf, sizeof(buf), &grp);
929 if (group_fields(grp) != expected)
936 test_fields(cap_channel_t *origcapgrp)
938 cap_channel_t *capgrp;
939 const char *fields[4];
943 CHECK(runtest_fields(origcapgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));
947 * fields: gr_name, gr_passwd, gr_gid, gr_mem
949 capgrp = cap_clone(origcapgrp);
950 CHECK(capgrp != NULL);
952 fields[0] = "gr_name";
953 fields[1] = "gr_passwd";
954 fields[2] = "gr_gid";
955 fields[3] = "gr_mem";
956 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == 0);
958 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID | GR_MEM));
964 * fields: gr_passwd, gr_gid, gr_mem
966 capgrp = cap_clone(origcapgrp);
967 CHECK(capgrp != NULL);
969 fields[0] = "gr_passwd";
970 fields[1] = "gr_gid";
971 fields[2] = "gr_mem";
972 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
973 fields[0] = "gr_name";
974 fields[1] = "gr_passwd";
975 fields[2] = "gr_gid";
976 fields[3] = "gr_mem";
977 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
978 errno == ENOTCAPABLE);
980 CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID | GR_MEM));
986 * fields: gr_name, gr_gid, gr_mem
988 capgrp = cap_clone(origcapgrp);
989 CHECK(capgrp != NULL);
991 fields[0] = "gr_name";
992 fields[1] = "gr_gid";
993 fields[2] = "gr_mem";
994 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
995 fields[0] = "gr_name";
996 fields[1] = "gr_passwd";
997 fields[2] = "gr_gid";
998 fields[3] = "gr_mem";
999 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1000 errno == ENOTCAPABLE);
1001 fields[0] = "gr_passwd";
1002 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1003 errno == ENOTCAPABLE);
1005 CHECK(runtest_fields(capgrp, GR_NAME | GR_GID | GR_MEM));
1011 * fields: gr_name, gr_passwd, gr_mem
1013 capgrp = cap_clone(origcapgrp);
1014 CHECK(capgrp != NULL);
1016 fields[0] = "gr_name";
1017 fields[1] = "gr_passwd";
1018 fields[2] = "gr_mem";
1019 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
1020 fields[0] = "gr_name";
1021 fields[1] = "gr_passwd";
1022 fields[2] = "gr_gid";
1023 fields[3] = "gr_mem";
1024 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1025 errno == ENOTCAPABLE);
1026 fields[0] = "gr_gid";
1027 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1028 errno == ENOTCAPABLE);
1030 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_MEM));
1036 * fields: gr_name, gr_passwd, gr_gid
1038 capgrp = cap_clone(origcapgrp);
1039 CHECK(capgrp != NULL);
1041 fields[0] = "gr_name";
1042 fields[1] = "gr_passwd";
1043 fields[2] = "gr_gid";
1044 CHECK(cap_grp_limit_fields(capgrp, fields, 3) == 0);
1045 fields[0] = "gr_name";
1046 fields[1] = "gr_passwd";
1047 fields[2] = "gr_gid";
1048 fields[3] = "gr_mem";
1049 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1050 errno == ENOTCAPABLE);
1051 fields[0] = "gr_mem";
1052 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1053 errno == ENOTCAPABLE);
1055 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD | GR_GID));
1061 * fields: gr_name, gr_passwd
1063 capgrp = cap_clone(origcapgrp);
1064 CHECK(capgrp != NULL);
1066 fields[0] = "gr_name";
1067 fields[1] = "gr_passwd";
1068 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1069 fields[0] = "gr_name";
1070 fields[1] = "gr_passwd";
1071 fields[2] = "gr_gid";
1072 fields[3] = "gr_mem";
1073 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1074 errno == ENOTCAPABLE);
1075 fields[0] = "gr_gid";
1076 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1077 errno == ENOTCAPABLE);
1079 CHECK(runtest_fields(capgrp, GR_NAME | GR_PASSWD));
1085 * fields: gr_name, gr_gid
1087 capgrp = cap_clone(origcapgrp);
1088 CHECK(capgrp != NULL);
1090 fields[0] = "gr_name";
1091 fields[1] = "gr_gid";
1092 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1093 fields[0] = "gr_name";
1094 fields[1] = "gr_passwd";
1095 fields[2] = "gr_gid";
1096 fields[3] = "gr_mem";
1097 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1098 errno == ENOTCAPABLE);
1099 fields[0] = "gr_mem";
1100 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1101 errno == ENOTCAPABLE);
1103 CHECK(runtest_fields(capgrp, GR_NAME | GR_GID));
1109 * fields: gr_name, gr_mem
1111 capgrp = cap_clone(origcapgrp);
1112 CHECK(capgrp != NULL);
1114 fields[0] = "gr_name";
1115 fields[1] = "gr_mem";
1116 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1117 fields[0] = "gr_name";
1118 fields[1] = "gr_passwd";
1119 fields[2] = "gr_gid";
1120 fields[3] = "gr_mem";
1121 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1122 errno == ENOTCAPABLE);
1123 fields[0] = "gr_passwd";
1124 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1125 errno == ENOTCAPABLE);
1127 CHECK(runtest_fields(capgrp, GR_NAME | GR_MEM));
1133 * fields: gr_passwd, gr_gid
1135 capgrp = cap_clone(origcapgrp);
1136 CHECK(capgrp != NULL);
1138 fields[0] = "gr_passwd";
1139 fields[1] = "gr_gid";
1140 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1141 fields[0] = "gr_name";
1142 fields[1] = "gr_passwd";
1143 fields[2] = "gr_gid";
1144 fields[3] = "gr_mem";
1145 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1146 errno == ENOTCAPABLE);
1147 fields[0] = "gr_mem";
1148 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1149 errno == ENOTCAPABLE);
1151 CHECK(runtest_fields(capgrp, GR_PASSWD | GR_GID));
1157 * fields: gr_passwd, gr_mem
1159 capgrp = cap_clone(origcapgrp);
1160 CHECK(capgrp != NULL);
1162 fields[0] = "gr_passwd";
1163 fields[1] = "gr_mem";
1164 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1165 fields[0] = "gr_name";
1166 fields[1] = "gr_passwd";
1167 fields[2] = "gr_gid";
1168 fields[3] = "gr_mem";
1169 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1170 errno == ENOTCAPABLE);
1171 fields[0] = "gr_gid";
1172 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1173 errno == ENOTCAPABLE);
1175 CHECK(runtest_fields(capgrp, GR_PASSWD | GR_MEM));
1181 * fields: gr_gid, gr_mem
1183 capgrp = cap_clone(origcapgrp);
1184 CHECK(capgrp != NULL);
1186 fields[0] = "gr_gid";
1187 fields[1] = "gr_mem";
1188 CHECK(cap_grp_limit_fields(capgrp, fields, 2) == 0);
1189 fields[0] = "gr_name";
1190 fields[1] = "gr_passwd";
1191 fields[2] = "gr_gid";
1192 fields[3] = "gr_mem";
1193 CHECK(cap_grp_limit_fields(capgrp, fields, 4) == -1 &&
1194 errno == ENOTCAPABLE);
1195 fields[0] = "gr_passwd";
1196 CHECK(cap_grp_limit_fields(capgrp, fields, 1) == -1 &&
1197 errno == ENOTCAPABLE);
1199 CHECK(runtest_fields(capgrp, GR_GID | GR_MEM));
1205 runtest_groups(cap_channel_t *capgrp, const char **names, const gid_t *gids,
1211 unsigned int i, got;
1213 (void)cap_setgrent(capgrp);
1216 grp = cap_getgrent(capgrp);
1220 for (i = 0; i < ngroups; i++) {
1221 if (strcmp(names[i], grp->gr_name) == 0 &&
1222 gids[i] == grp->gr_gid) {
1232 (void)cap_setgrent(capgrp);
1235 cap_getgrent_r(capgrp, &st, buf, sizeof(buf), &grp);
1239 for (i = 0; i < ngroups; i++) {
1240 if (strcmp(names[i], grp->gr_name) == 0 &&
1241 gids[i] == grp->gr_gid) {
1251 for (i = 0; i < ngroups; i++) {
1252 grp = cap_getgrnam(capgrp, names[i]);
1257 for (i = 0; i < ngroups; i++) {
1258 cap_getgrnam_r(capgrp, names[i], &st, buf, sizeof(buf), &grp);
1263 for (i = 0; i < ngroups; i++) {
1264 grp = cap_getgrgid(capgrp, gids[i]);
1269 for (i = 0; i < ngroups; i++) {
1270 cap_getgrgid_r(capgrp, gids[i], &st, buf, sizeof(buf), &grp);
1279 test_groups(cap_channel_t *origcapgrp)
1281 cap_channel_t *capgrp;
1282 const char *names[5];
1288 * names: wheel, daemon, kmem, sys, tty
1291 capgrp = cap_clone(origcapgrp);
1292 CHECK(capgrp != NULL);
1295 names[1] = "daemon";
1299 CHECK(cap_grp_limit_groups(capgrp, names, 5, NULL, 0) == 0);
1306 CHECK(runtest_groups(capgrp, names, gids, 5));
1313 * names: kmem, sys, tty
1316 capgrp = cap_clone(origcapgrp);
1317 CHECK(capgrp != NULL);
1322 CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);
1323 names[3] = "daemon";
1324 CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&
1325 errno == ENOTCAPABLE);
1326 names[0] = "daemon";
1327 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1328 errno == ENOTCAPABLE);
1334 CHECK(runtest_groups(capgrp, names, gids, 3));
1341 * names: wheel, kmem, tty
1344 capgrp = cap_clone(origcapgrp);
1345 CHECK(capgrp != NULL);
1350 CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == 0);
1351 names[3] = "daemon";
1352 CHECK(cap_grp_limit_groups(capgrp, names, 4, NULL, 0) == -1 &&
1353 errno == ENOTCAPABLE);
1354 names[0] = "daemon";
1355 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1356 errno == ENOTCAPABLE);
1362 CHECK(runtest_groups(capgrp, names, gids, 3));
1372 capgrp = cap_clone(origcapgrp);
1373 CHECK(capgrp != NULL);
1381 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);
1383 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&
1384 errno == ENOTCAPABLE);
1386 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1387 errno == ENOTCAPABLE);
1390 CHECK(runtest_groups(capgrp, names, gids, 3));
1400 capgrp = cap_clone(origcapgrp);
1401 CHECK(capgrp != NULL);
1409 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == 0);
1411 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 4) == -1 &&
1412 errno == ENOTCAPABLE);
1414 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1415 errno == ENOTCAPABLE);
1418 CHECK(runtest_groups(capgrp, names, gids, 3));
1428 capgrp = cap_clone(origcapgrp);
1429 CHECK(capgrp != NULL);
1432 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == 0);
1433 names[1] = "daemon";
1434 CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == -1 &&
1435 errno == ENOTCAPABLE);
1436 names[0] = "daemon";
1437 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1438 errno == ENOTCAPABLE);
1442 CHECK(runtest_groups(capgrp, names, gids, 1));
1452 capgrp = cap_clone(origcapgrp);
1453 CHECK(capgrp != NULL);
1457 CHECK(cap_grp_limit_groups(capgrp, names, 2, NULL, 0) == 0);
1458 names[2] = "daemon";
1459 CHECK(cap_grp_limit_groups(capgrp, names, 3, NULL, 0) == -1 &&
1460 errno == ENOTCAPABLE);
1461 names[0] = "daemon";
1462 CHECK(cap_grp_limit_groups(capgrp, names, 1, NULL, 0) == -1 &&
1463 errno == ENOTCAPABLE);
1468 CHECK(runtest_groups(capgrp, names, gids, 2));
1478 capgrp = cap_clone(origcapgrp);
1479 CHECK(capgrp != NULL);
1483 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == 0);
1485 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == -1 &&
1486 errno == ENOTCAPABLE);
1488 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1489 errno == ENOTCAPABLE);
1492 CHECK(runtest_groups(capgrp, names, gids, 1));
1502 capgrp = cap_clone(origcapgrp);
1503 CHECK(capgrp != NULL);
1509 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 2) == 0);
1511 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 3) == -1 &&
1512 errno == ENOTCAPABLE);
1514 CHECK(cap_grp_limit_groups(capgrp, NULL, 0, gids, 1) == -1 &&
1515 errno == ENOTCAPABLE);
1518 CHECK(runtest_groups(capgrp, names, gids, 2));
1526 cap_channel_t *capcas, *capgrp;
1531 capcas = cap_init();
1532 CHECKX(capcas != NULL);
1534 capgrp = cap_service_open(capcas, "system.grp");
1535 CHECKX(capgrp != NULL);
1541 CHECK(runtest_cmds(capgrp) == (SETGRENT | GETGRENT | GETGRENT_R |
1542 GETGRNAM | GETGRNAM_R | GETGRGID | GETGRGID_R));
1546 test_fields(capgrp);
1548 test_groups(capgrp);