1f2c438c5SJason King.\" 2f2c438c5SJason King.\" This file and its contents are supplied under the terms of the 3f2c438c5SJason King.\" Common Development and Distribution License ("CDDL"), version 1.0. 4f2c438c5SJason King.\" You may only use this file in accordance with the terms of version 5f2c438c5SJason King.\" 1.0 of the CDDL. 6f2c438c5SJason King.\" 7f2c438c5SJason King.\" A full copy of the text of the CDDL should have accompanied this 8f2c438c5SJason King.\" source. A copy of the CDDL is also available via the Internet at 9f2c438c5SJason King.\" http://www.illumos.org/license/CDDL. 10f2c438c5SJason King.\" 11f2c438c5SJason King.\" 12f2c438c5SJason King.\" Copyright 2020 Joyent, Inc. 13f2c438c5SJason King.\" 14*11994f6fSRobert Mustacchi.Dd December 2, 2023 15f2c438c5SJason King.Dt GETGROUPLIST 3C 16f2c438c5SJason King.Os 17f2c438c5SJason King.Sh NAME 18f2c438c5SJason King.Nm getgrouplist 19f2c438c5SJason King.Nd calculate group access list 20f2c438c5SJason King.Sh SYNOPSIS 21f2c438c5SJason King.In grp.h 22f2c438c5SJason King.Ft int 23f2c438c5SJason King.Fo getgrouplist 24f2c438c5SJason King.Fa "const char *user" 25f2c438c5SJason King.Fa "gid_t agroup" 26f2c438c5SJason King.Fa "gid_t *groups" 27f2c438c5SJason King.Fa "int *ngroups" 28f2c438c5SJason King.Fc 29f2c438c5SJason King.Sh DESCRIPTION 30f2c438c5SJason KingThe 31f2c438c5SJason King.Fn getgrouplist 32f2c438c5SJason Kingfunction queries the group database to obtain the list of groups that 33f2c438c5SJason King.Fa user 34f2c438c5SJason Kingbelongs to. 35f2c438c5SJason KingThe 36f2c438c5SJason King.Fa agroup 37f2c438c5SJason Kinggroup is always added to the resulting group list. 38f2c438c5SJason KingThis value is typically the primary gid of the user from the 39f2c438c5SJason King.Sy passwd 40f2c438c5SJason Kingdatabase. 41f2c438c5SJason King.Pp 42f2c438c5SJason KingWhen calling 43f2c438c5SJason King.Fn getgrouplist , 44f2c438c5SJason Kingthe caller should set the maximum number of groups that 45f2c438c5SJason King.Fa groups 46f2c438c5SJason Kingcan hold in 47f2c438c5SJason King.Fa *ngroups . 48f2c438c5SJason KingThe value of 49f2c438c5SJason King.Dv NGROUPS_MAX 50f2c438c5SJason Kingcan be used to size 51f2c438c5SJason King.Fa groups 52f2c438c5SJason Kingto ensure it can hold any number of groups supported by the system. 53f2c438c5SJason King.Pp 54f2c438c5SJason KingUpon return, 55f2c438c5SJason King.Fn getgrouplist 56f2c438c5SJason Kingstores the list of groups that 57f2c438c5SJason King.Fa user 58f2c438c5SJason Kingbelongs to in 59f2c438c5SJason King.Fa groups 60f2c438c5SJason Kingand stores the number of groups 61f2c438c5SJason King.Fa user 62f2c438c5SJason Kingbelongs to in 63f2c438c5SJason King.Fa *ngroups 64f2c438c5SJason King.Po 65f2c438c5SJason Kingthis may be a smaller than the value passed in when 66f2c438c5SJason Kingcalling 67f2c438c5SJason King.Fn getgrouplist 68f2c438c5SJason King.Pc . 69f2c438c5SJason KingIf 70f2c438c5SJason King.Fa groups 71f2c438c5SJason Kingis too small to hold all of the groups 72f2c438c5SJason King.Fa user 73f2c438c5SJason Kingbelongs to, 74f2c438c5SJason King.Fn getgrouplist 75f2c438c5SJason Kingfails and sets 76f2c438c5SJason King.Fa *ngroups 77f2c438c5SJason Kingto a value large enough to hold the full result. 78f2c438c5SJason King.Sh RETURN VALUES 79f2c438c5SJason KingOn success, 80f2c438c5SJason King.Fn getgrouplist 81f2c438c5SJason Kingreturns the number of groups 82f2c438c5SJason King.Fa user 83f2c438c5SJason Kingbelongs to, fills in 84f2c438c5SJason King.Fa groups 85f2c438c5SJason Kingwith the gids of the groups 86f2c438c5SJason King.Fa user 87f2c438c5SJason Kingbelongs to, and also sets 88f2c438c5SJason King.Fa *ngroups 89f2c438c5SJason Kingto the number of groups 90f2c438c5SJason King.Fa user 91f2c438c5SJason Kingbelongs to. 92f2c438c5SJason King.Pp 93f2c438c5SJason KingOn failure, 94f2c438c5SJason King.Fn getgrouplist 95f2c438c5SJason Kingreturns -1 and 96f2c438c5SJason King.Va errno 97f2c438c5SJason Kingis set. 98f2c438c5SJason King.Pp 99f2c438c5SJason KingThe behavior of 100f2c438c5SJason King.Fn getgrouplist 101f2c438c5SJason Kingis undefined if the total number of groups a user belongs to exceeds 102f2c438c5SJason King.Dv NGROUPS_MAX . 103f2c438c5SJason King.Pp 104f2c438c5SJason KingNote that on 105f2c438c5SJason King.Fx , 106f2c438c5SJason King.Fn getgrouplist 107f2c438c5SJason Kingalways returns -1 on failure or 0 on success. 108f2c438c5SJason KingA caller must rely on the value set in 109f2c438c5SJason King.Fa *ngroups 110f2c438c5SJason Kingupon return to determine the number of entries in 111f2c438c5SJason King.Fa groups . 112f2c438c5SJason King.Pp 113f2c438c5SJason KingOn Linux, both glibc and musl return the number of groups 114f2c438c5SJason King.Fa user 1151aff3eeeSPeter Tribblebelongs to on success and return -1 on failure. 116f2c438c5SJason King.Pp 117f2c438c5SJason KingNone of these other implementations document any 118f2c438c5SJason King.Va errno 119f2c438c5SJason Kingvalues on failure, however their implementations show that 120f2c438c5SJason King.Va errno 121f2c438c5SJason Kingmay be set on failure. 122f2c438c5SJason KingSoftware using 123f2c438c5SJason King.Fn getgrouplist 1242cdd73dbSPeter Tribbleshould be aware of these differences when attempting to write portable 125f2c438c5SJason Kingsoftware. 126f2c438c5SJason King.Sh EXAMPLES 127f2c438c5SJason King.Sy Example 1 128f2c438c5SJason KingPrint all the groups for a user. 129f2c438c5SJason King.Bd -literal 130f2c438c5SJason King#include <pwd.h> 131f2c438c5SJason King#include <grp.h> 132f2c438c5SJason King#include <stdlib.h> 133f2c438c5SJason King#include <stdio.h> 134f2c438c5SJason King#include <limits.h> 135f2c438c5SJason King#include <err.h> 136f2c438c5SJason King 137f2c438c5SJason Kingvoid 138f2c438c5SJason Kingprintgroups(const char *user) 139f2c438c5SJason King{ 140f2c438c5SJason King struct passwd *pw; 141f2c438c5SJason King gid_t *groups; 142f2c438c5SJason King int ngroups, ret; 143f2c438c5SJason King 144f2c438c5SJason King if ((groups = calloc(NGROUPS_MAX, sizeof (gid_t))) == NULL) 145f2c438c5SJason King err(EXIT_FAILURE, "calloc"); 146f2c438c5SJason King 147f2c438c5SJason King if ((pw = getpwnam(user)) == NULL) 1481aff3eeeSPeter Tribble err(EXIT_FAILURE, "getpwnam"); 149f2c438c5SJason King 150f2c438c5SJason King ngroups = NGROUPS_MAX; 151f2c438c5SJason King ret = getgrouplist(user, pw->pw_gid, groups, &ngroups); 152f2c438c5SJason King if (ret < 0) 153f2c438c5SJason King err(EXIT_FAILURE, "getgrouplist"); 154f2c438c5SJason King 155f2c438c5SJason King for (int i = 0; i < ret; i++) { 156f2c438c5SJason King struct group *gr = getgrgid(groups[i]); 157f2c438c5SJason King 158f2c438c5SJason King (void) printf("%s ", gr->gr_name); 159f2c438c5SJason King } 160*11994f6fSRobert Mustacchi (void) fputc('\en', stdout); 161f2c438c5SJason King 162f2c438c5SJason King free(groups); 163f2c438c5SJason King} 164f2c438c5SJason King.Ed 165f2c438c5SJason King.Sh ERRORS 166f2c438c5SJason KingOn failure, 167f2c438c5SJason King.Fn getgrouplist 1681aff3eeeSPeter Tribblereturns -1, and will set errno to one of the following values: 169f2c438c5SJason King.Bl -tag -width Dv 170f2c438c5SJason King.It Er ENOMEM 171f2c438c5SJason KingNot enough memory to complete the request. 172f2c438c5SJason King.It Er EINVAL 173f2c438c5SJason KingOne of the parameters is invalid 174f2c438c5SJason King.Po 175f2c438c5SJason Kingfor example, 176f2c438c5SJason King.Fa ngroups 177f2c438c5SJason Kingis 178f2c438c5SJason King.Dv NULL 179f2c438c5SJason King.Pc . 180f2c438c5SJason King.It Dv ERANGE 181f2c438c5SJason KingThe supplied value of 182f2c438c5SJason King.Fa *ngroups 183f2c438c5SJason Kingis too small to hold the results. 184f2c438c5SJason King.Fa *ngroups 185f2c438c5SJason Kingis set 186f2c438c5SJason King.Po 187f2c438c5SJason Kingupon return 188f2c438c5SJason King.Pc 189f2c438c5SJason Kingto a value large enough to hold the results, and a partial set of 190f2c438c5SJason Kingresults is written to 191f2c438c5SJason King.Fa groups . 192f2c438c5SJason KingThe value written to 193f2c438c5SJason King.Fa *ngroups 194f2c438c5SJason Kingmay be larger than the value returned by a successful call to 195f2c438c5SJason King.Fn getgrouplist . 196f2c438c5SJason King.El 197f2c438c5SJason King.Sh INTERFACE STABILITY 198f2c438c5SJason King.Sy Uncommitted 199f2c438c5SJason King.Sh MT-LEVEL 200f2c438c5SJason King.Sy MT-Safe 201f2c438c5SJason King.Sh SEE ALSO 202f2c438c5SJason King.Xr groups 1 , 2032cdd73dbSPeter Tribble.Xr getgroups 2 , 204f2c438c5SJason King.Xr getuid 2 , 205f2c438c5SJason King.Xr getgrnam 3C , 206f2c438c5SJason King.Xr initgroups 3C , 207f2c438c5SJason King.Xr limits.h 3HEAD 208