xref: /illumos-gate/usr/src/man/man3c/getgrouplist.3c (revision 11994f6f6fa6fc668363b92c6b6ef60b2e75ebd6)
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