156a79104SMariusz Zaborski.\" Copyright (c) 2018 Mariusz Zaborski <oshogbo@FreeBSD.org> 256a79104SMariusz Zaborski.\" All rights reserved. 356a79104SMariusz Zaborski.\" 456a79104SMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without 556a79104SMariusz Zaborski.\" modification, are permitted provided that the following conditions 656a79104SMariusz Zaborski.\" are met: 756a79104SMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright 856a79104SMariusz Zaborski.\" notice, this list of conditions and the following disclaimer. 956a79104SMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright 1056a79104SMariusz Zaborski.\" notice, this list of conditions and the following disclaimer in the 1156a79104SMariusz Zaborski.\" documentation and/or other materials provided with the distribution. 1256a79104SMariusz Zaborski.\" 1356a79104SMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 1456a79104SMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1556a79104SMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1656a79104SMariusz Zaborski.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 1756a79104SMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1856a79104SMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 1956a79104SMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2056a79104SMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2156a79104SMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2256a79104SMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2356a79104SMariusz Zaborski.\" SUCH DAMAGE. 2456a79104SMariusz Zaborski.\" 25cf037972SAlan Somers.Dd December 6, 2023 2656a79104SMariusz Zaborski.Dt CAP_GRP 3 2756a79104SMariusz Zaborski.Os 2856a79104SMariusz Zaborski.Sh NAME 2956a79104SMariusz Zaborski.Nm cap_getgrent , 3056a79104SMariusz Zaborski.Nm cap_getgrnam , 3156a79104SMariusz Zaborski.Nm cap_getgrgid , 3256a79104SMariusz Zaborski.Nm cap_getgrent_r , 3356a79104SMariusz Zaborski.Nm cap_getgrnam_r , 3456a79104SMariusz Zaborski.Nm cap_getgrgid_r , 3556a79104SMariusz Zaborski.Nm cap_setgroupent , 3656a79104SMariusz Zaborski.Nm cap_setgrent , 3756a79104SMariusz Zaborski.Nm cap_endgrent , 3856a79104SMariusz Zaborski.Nm cap_grp_limit_cmds , 3956a79104SMariusz Zaborski.Nm cap_grp_limit_fields , 4056a79104SMariusz Zaborski.Nm cap_grp_limit_groups 4156a79104SMariusz Zaborski.Nd "library for group database operations in capability mode" 4256a79104SMariusz Zaborski.Sh LIBRARY 4356a79104SMariusz Zaborski.Lb libcap_grp 4456a79104SMariusz Zaborski.Sh SYNOPSIS 4556a79104SMariusz Zaborski.In sys/nv.h 4656a79104SMariusz Zaborski.In libcasper.h 4756a79104SMariusz Zaborski.In casper/cap_grp.h 4856a79104SMariusz Zaborski.Ft "struct group *" 4956a79104SMariusz Zaborski.Fn cap_getgrent "cap_channel_t *chan" 5056a79104SMariusz Zaborski.Ft "struct group *" 5156a79104SMariusz Zaborski.Fn cap_getgrnam "cap_channel_t *chan" "const char *name" 5256a79104SMariusz Zaborski.Ft "struct group *" 5356a79104SMariusz Zaborski.Fn cap_getgrgid "cap_channel_t *chan" "gid_t gid" 5456a79104SMariusz Zaborski.Ft "int" 5556a79104SMariusz Zaborski.Fn cap_getgrent_r "cap_channel_t *chan" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result" 5656a79104SMariusz Zaborski.Ft "int" 5756a79104SMariusz Zaborski.Fn cap_getgrnam_r "cap_channel_t *chan" "const char *name" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result" 5856a79104SMariusz Zaborski.Ft int 5956a79104SMariusz Zaborski.Fn cap_getgrgid_r "cap_channel_t *chan" "gid_t gid" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result" 6056a79104SMariusz Zaborski.Ft int 6156a79104SMariusz Zaborski.Fn cap_setgroupent "cap_channel_t *chan" "int stayopen" 62*c8b31033SGraham Percival.Ft int 6356a79104SMariusz Zaborski.Fn cap_setgrent "cap_channel_t *chan" 6456a79104SMariusz Zaborski.Ft void 6556a79104SMariusz Zaborski.Fn cap_endgrent "cap_channel_t *chan" 6656a79104SMariusz Zaborski.Ft int 6756a79104SMariusz Zaborski.Fn cap_grp_limit_cmds "cap_channel_t *chan" "const char * const *cmds" "size_t ncmds" 6856a79104SMariusz Zaborski.Ft int 6956a79104SMariusz Zaborski.Fn cap_grp_limit_fields "cap_channel_t *chan" "const char * const *fields" "size_t nfields" 7056a79104SMariusz Zaborski.Ft int 714468cd1aSMariusz Zaborski.Fn cap_grp_limit_groups "cap_channel_t *chan" "const char * const *names" "size_t nnames" "const gid_t *gids" "size_t ngids" 7256a79104SMariusz Zaborski.Sh DESCRIPTION 7356a79104SMariusz ZaborskiThe functions 7456a79104SMariusz Zaborski.Fn cap_getgrent , 7556a79104SMariusz Zaborski.Fn cap_getgrnam , 7656a79104SMariusz Zaborski.Fn cap_getgrgid , 7756a79104SMariusz Zaborski.Fn cap_getgrent_r , 7856a79104SMariusz Zaborski.Fn cap_getgrnam_r , 7956a79104SMariusz Zaborski.Fn cap_getgrgid_r , 8056a79104SMariusz Zaborski.Fn cap_setgroupent , 8156a79104SMariusz Zaborski.Fn cap_setgrent , 8256a79104SMariusz Zaborskiand 8356a79104SMariusz Zaborski.Fn cap_endgrent 8456a79104SMariusz Zaborskiare respectively equivalent to 8556a79104SMariusz Zaborski.Xr getgrent 3 , 8656a79104SMariusz Zaborski.Xr getgrnam 3 , 8756a79104SMariusz Zaborski.Xr getgrgid 3 , 8856a79104SMariusz Zaborski.Xr getgrent_r 3 , 8956a79104SMariusz Zaborski.Xr getgrnam_r 3 , 9056a79104SMariusz Zaborski.Xr getgrgid_r 3 , 9156a79104SMariusz Zaborski.Xr setgroupent 3 , 9256a79104SMariusz Zaborski.Xr setgrent 3 , 9356a79104SMariusz Zaborskiand 9456a79104SMariusz Zaborski.Xr endgrent 3 9556a79104SMariusz Zaborskiexcept that the connection to the 9656a79104SMariusz Zaborski.Nm system.grp 9756a79104SMariusz Zaborskiservice needs to be provided. 9856a79104SMariusz Zaborski.Pp 9956a79104SMariusz ZaborskiThe 10056a79104SMariusz Zaborski.Fn cap_grp_limit_cmds 10156a79104SMariusz Zaborskifunction limits the functions allowed in the service. 10256a79104SMariusz ZaborskiThe 10356a79104SMariusz Zaborski.Fa cmds 1048763ae35SMariusz Zaborskivariable can be set to 10556a79104SMariusz Zaborski.Dv getgrent , 10656a79104SMariusz Zaborski.Dv getgrnam , 10756a79104SMariusz Zaborski.Dv getgrgid , 10856a79104SMariusz Zaborski.Dv getgrent_r , 10956a79104SMariusz Zaborski.Dv getgrnam_r , 11056a79104SMariusz Zaborski.Dv getgrgid_r , 11156a79104SMariusz Zaborski.Dv setgroupent , 11256a79104SMariusz Zaborski.Dv setgrent , 11356a79104SMariusz Zaborskior 11456a79104SMariusz Zaborski.Dv endgrent 11556a79104SMariusz Zaborskiwhich will allow to use the function associated with the name. 11656a79104SMariusz ZaborskiThe 11756a79104SMariusz Zaborski.Fa ncmds 11856a79104SMariusz Zaborskivariable contains the number of 11956a79104SMariusz Zaborski.Fa cmds 12056a79104SMariusz Zaborskiprovided. 12156a79104SMariusz Zaborski.Pp 12256a79104SMariusz ZaborskiThe 12356a79104SMariusz Zaborski.Fn cap_grp_limit_fields 12456a79104SMariusz Zaborskifunction allows limit fields returned in the structure 12556a79104SMariusz Zaborski.Vt group . 12656a79104SMariusz ZaborskiThe 12756a79104SMariusz Zaborski.Fa fields 12856a79104SMariusz Zaborskivariable can be set to 12956a79104SMariusz Zaborski.Dv gr_name 13056a79104SMariusz Zaborski.Dv gr_passwd 13156a79104SMariusz Zaborski.Dv gr_gid 13256a79104SMariusz Zaborskior 13356a79104SMariusz Zaborski.Dv gr_mem . 13456a79104SMariusz ZaborskiThe field which was set as the limit will be returned, while the rest of the 13556a79104SMariusz Zaborskivalues not set this way will have default values. 13656a79104SMariusz ZaborskiThe 13756a79104SMariusz Zaborski.Fa nfields 13856a79104SMariusz Zaborskivariable contains the number of 13956a79104SMariusz Zaborski.Fa fields 14056a79104SMariusz Zaborskiprovided. 14156a79104SMariusz Zaborski.Pp 14256a79104SMariusz ZaborskiThe 14356a79104SMariusz Zaborski.Fn cap_grp_limit_groups 14456a79104SMariusz Zaborskifunction allows to limit access to groups. 14556a79104SMariusz ZaborskiThe 14656a79104SMariusz Zaborski.Fa names 14756a79104SMariusz Zaborskivariable allows to limit groups by name and the 14856a79104SMariusz Zaborski.Fa gids 14956a79104SMariusz Zaborskivariable by the group number. 15056a79104SMariusz ZaborskiThe 15156a79104SMariusz Zaborski.Fa nnames 15256a79104SMariusz Zaborskiand 15356a79104SMariusz Zaborski.Fa ngids 15456a79104SMariusz Zaborskivariables provide numbers of limited names and gids. 155cf037972SAlan Somers.Pp 156cf037972SAlan SomersAll of these functions are reentrant but not thread-safe. 157cf037972SAlan SomersThat is, they may be called from separate threads only with different 158cf037972SAlan Somers.Vt cap_channel_t 159cf037972SAlan Somersarguments or with synchronization. 16056a79104SMariusz Zaborski.Sh EXAMPLES 16156a79104SMariusz ZaborskiThe following example first opens a capability to casper and then uses this 16256a79104SMariusz Zaborskicapability to create the 16356a79104SMariusz Zaborski.Nm system.grp 16456a79104SMariusz Zaborskicasper service and uses it to get a group name. 16556a79104SMariusz Zaborski.Bd -literal 16656a79104SMariusz Zaborskicap_channel_t *capcas, *capgrp; 16756a79104SMariusz Zaborskiconst char *cmds[] = { "getgrgid" }; 16856a79104SMariusz Zaborskiconst char *fields[] = { "gr_name" }; 1694468cd1aSMariusz Zaborskiconst gid_t gid[] = { 1 }; 17056a79104SMariusz Zaborskistruct group *group; 17156a79104SMariusz Zaborski 17256a79104SMariusz Zaborski/* Open capability to Casper. */ 17356a79104SMariusz Zaborskicapcas = cap_init(); 17456a79104SMariusz Zaborskiif (capcas == NULL) 17556a79104SMariusz Zaborski err(1, "Unable to contact Casper"); 17656a79104SMariusz Zaborski 17756a79104SMariusz Zaborski/* Enter capability mode sandbox. */ 17856a79104SMariusz Zaborskiif (cap_enter() < 0 && errno != ENOSYS) 17956a79104SMariusz Zaborski err(1, "Unable to enter capability mode"); 18056a79104SMariusz Zaborski 18156a79104SMariusz Zaborski/* Use Casper capability to create capability to the system.grp service. */ 18256a79104SMariusz Zaborskicapgrp = cap_service_open(capcas, "system.grp"); 18356a79104SMariusz Zaborskiif (capgrp == NULL) 18456a79104SMariusz Zaborski err(1, "Unable to open system.grp service"); 18556a79104SMariusz Zaborski 18656a79104SMariusz Zaborski/* Close Casper capability, we don't need it anymore. */ 18756a79104SMariusz Zaborskicap_close(capcas); 18856a79104SMariusz Zaborski 18956a79104SMariusz Zaborski/* Limit service to one single function. */ 19056a79104SMariusz Zaborskiif (cap_grp_limit_cmds(capgrp, cmds, nitems(cmds))) 19156a79104SMariusz Zaborski err(1, "Unable to limit access to system.grp service"); 19256a79104SMariusz Zaborski 19356a79104SMariusz Zaborski/* Limit service to one field as we only need name of the group. */ 19456a79104SMariusz Zaborskiif (cap_grp_limit_fields(capgrp, fields, nitems(fields))) 19556a79104SMariusz Zaborski err(1, "Unable to limit access to system.grp service"); 19656a79104SMariusz Zaborski 19756a79104SMariusz Zaborski/* Limit service to one gid. */ 19856a79104SMariusz Zaborskiif (cap_grp_limit_groups(capgrp, NULL, 0, gid, nitems(gid))) 19956a79104SMariusz Zaborski err(1, "Unable to limit access to system.grp service"); 20056a79104SMariusz Zaborski 20156a79104SMariusz Zaborskigroup = cap_getgrgid(capgrp, gid[0]); 20256a79104SMariusz Zaborskiif (group == NULL) 20356a79104SMariusz Zaborski err(1, "Unable to get name of group"); 20456a79104SMariusz Zaborski 20556a79104SMariusz Zaborskiprintf("GID %d is associated with name %s.\\n", gid[0], group->gr_name); 20656a79104SMariusz Zaborski 20756a79104SMariusz Zaborskicap_close(capgrp); 20856a79104SMariusz Zaborski.Ed 20956a79104SMariusz Zaborski.Sh SEE ALSO 21056a79104SMariusz Zaborski.Xr cap_enter 2 , 21156a79104SMariusz Zaborski.Xr endgrent 3 , 21256a79104SMariusz Zaborski.Xr err 3 , 21356a79104SMariusz Zaborski.Xr getgrent 3 , 21456a79104SMariusz Zaborski.Xr getgrent_r 3 , 21556a79104SMariusz Zaborski.Xr getgrgid 3 , 21656a79104SMariusz Zaborski.Xr getgrgid_r 3 , 21756a79104SMariusz Zaborski.Xr getgrnam 3 , 21856a79104SMariusz Zaborski.Xr getgrnam_r 3 , 21956a79104SMariusz Zaborski.Xr setgrent 3 , 22056a79104SMariusz Zaborski.Xr setgroupent 3 , 22185ebe1f1SMariusz Zaborski.Xr capsicum 4 , 22285ebe1f1SMariusz Zaborski.Xr nv 9 223421f325eSGordon Bergling.Sh HISTORY 224421f325eSGordon BerglingThe 225421f325eSGordon Bergling.Nm cap_grp 226421f325eSGordon Berglingservice first appeared in 227421f325eSGordon Bergling.Fx 10.3 . 22856a79104SMariusz Zaborski.Sh AUTHORS 22956a79104SMariusz ZaborskiThe 23056a79104SMariusz Zaborski.Nm cap_grp 23156a79104SMariusz Zaborskiservice was implemented by 23256a79104SMariusz Zaborski.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net 23356a79104SMariusz Zaborskiunder sponsorship from the FreeBSD Foundation. 23456a79104SMariusz Zaborski.Pp 23556a79104SMariusz ZaborskiThis manual page was written by 23656a79104SMariusz Zaborski.An Mariusz Zaborski Aq Mt oshogbo@FreeBSD.org . 237