Changes.old: Add missing piece to 5.00 changelog
[man-pages.git] / man2 / getgroups.2
blobebe0d60cd1dcdaedbf5caa8dacb1afead8a55577
1 .\" Copyright 1993 Rickard E. Faith (faith@cs.unc.edu)
2 .\" and Copyright (C) 2008, 2010, 2015, Michael Kerrisk <mtk.manpages@gmail.com>
3 .\"
4 .\" %%%LICENSE_START(VERBATIM)
5 .\" Permission is granted to make and distribute verbatim copies of this
6 .\" manual provided the copyright notice and this permission notice are
7 .\" preserved on all copies.
8 .\"
9 .\" Permission is granted to copy and distribute modified versions of this
10 .\" manual under the conditions for verbatim copying, provided that the
11 .\" entire resulting derived work is distributed under the terms of a
12 .\" permission notice identical to this one.
13 .\"
14 .\" Since the Linux kernel and libraries are constantly changing, this
15 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
16 .\" responsibility for errors or omissions, or for damages resulting from
17 .\" the use of the information contained herein.  The author(s) may not
18 .\" have taken the same level of care in the production of this manual,
19 .\" which is licensed free of charge, as they might when working
20 .\" professionally.
21 .\"
22 .\" Formatted or processed versions of this manual, if unaccompanied by
23 .\" the source, must acknowledge the copyright and authors of this work.
24 .\" %%%LICENSE_END
25 .\"
26 .\" Modified Thu Oct 31 12:04:29 1996 by Eric S. Raymond <esr@thyrsus.com>
27 .\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
28 .\"     Added notes on capability requirements
29 .\" 2008-05-03, mtk, expanded and rewrote parts of DESCRIPTION and RETURN
30 .\"     VALUE, made style of page more consistent with man-pages style.
31 .\"
32 .TH GETGROUPS 2 2019-03-06 "Linux" "Linux Programmer's Manual"
33 .SH NAME
34 getgroups, setgroups \- get/set list of supplementary group IDs
35 .SH SYNOPSIS
36 .B #include <sys/types.h>
37 .br
38 .B #include <unistd.h>
39 .PP
40 .BI "int getgroups(int " size ", gid_t " list []);
42 .B #include <grp.h>
43 .PP
44 .BI "int setgroups(size_t " size ", const gid_t *" list );
45 .PP
46 .in -4n
47 Feature Test Macro Requirements for glibc (see
48 .BR feature_test_macros (7)):
49 .in
50 .PP
51 .BR setgroups ():
52     Since glibc 2.19:
53         _DEFAULT_SOURCE
54     Glibc 2.19 and earlier:
55         _BSD_SOURCE
56 .SH DESCRIPTION
57 .PP
58 .BR getgroups ()
59 returns the supplementary group IDs of the calling process in
60 .IR list .
61 The argument
62 .I size
63 should be set to the maximum number of items that can be stored in the
64 buffer pointed to by
65 .IR list .
66 If the calling process is a member of more than
67 .I size
68 supplementary groups, then an error results.
69 It is unspecified whether the effective group ID of the calling process
70 is included in the returned list.
71 (Thus, an application should also call
72 .BR getegid (2)
73 and add or remove the resulting value.)
74 .PP
76 .I size
77 is zero,
78 .I list
79 is not modified, but the total number of supplementary group IDs for the
80 process is returned.
81 This allows the caller to determine the size of a dynamically allocated
82 .I list
83 to be used in a further call to
84 .BR getgroups ().
85 .PP
86 .BR setgroups ()
87 sets the supplementary group IDs for the calling process.
88 Appropriate privileges are required (see the description of the
89 .BR EPERM
90 error, below).
91 The
92 .I size
93 argument specifies the number of supplementary group IDs
94 in the buffer pointed to by
95 .IR list .
96 A process can drop all of its supplementary groups with the call:
97 .PP
98 .in +4n
99 .EX
100 setgroups(0, NULL);
103 .SH RETURN VALUE
104 On success,
105 .BR getgroups ()
106 returns the number of supplementary group IDs.
107 On error, \-1 is returned, and
108 .I errno
109 is set appropriately.
111 On success,
112 .BR setgroups ()
113 returns 0.
114 On error, \-1 is returned, and
115 .I errno
116 is set appropriately.
117 .SH ERRORS
119 .B EFAULT
120 .I list
121 has an invalid address.
123 .BR getgroups ()
124 can additionally fail with the following error:
126 .B EINVAL
127 .I size
128 is less than the number of supplementary group IDs, but is not zero.
130 .BR setgroups ()
131 can additionally fail with the following errors:
133 .B EINVAL
134 .I size
135 is greater than
136 .B NGROUPS_MAX
137 (32 before Linux 2.6.4; 65536 since Linux 2.6.4).
139 .B ENOMEM
140 Out of memory.
142 .B EPERM
143 The calling process has insufficient privilege
144 (the caller does not have the
145 .BR CAP_SETGID
146 capability in the user namespace in which it resides).
148 .BR EPERM " (since Linux 3.19)"
149 The use of
150 .BR setgroups ()
151 is denied in this user namespace.
152 See the description of
153 .IR /proc/[pid]/setgroups
155 .BR user_namespaces (7).
156 .SH CONFORMING TO
157 .BR getgroups ():
158 SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.
160 .BR setgroups ():
161 SVr4, 4.3BSD.
162 Since
163 .BR setgroups ()
164 requires privilege, it is not covered by POSIX.1.
165 .SH NOTES
166 A process can have up to
167 .B NGROUPS_MAX
168 supplementary group IDs
169 in addition to the effective group ID.
170 The constant
171 .B NGROUPS_MAX
172 is defined in
173 .IR <limits.h> .
174 The set of supplementary group IDs
175 is inherited from the parent process, and preserved across an
176 .BR execve (2).
178 The maximum number of supplementary group IDs can be found at run time using
179 .BR sysconf (3):
181 .in +4n
183 long ngroups_max;
184 ngroups_max = sysconf(_SC_NGROUPS_MAX);
188 The maximum return value of
189 .BR getgroups ()
190 cannot be larger than one more than this value.
191 Since Linux 2.6.4, the maximum number of supplementary group IDs is also
192 exposed via the Linux-specific read-only file,
193 .IR /proc/sys/kernel/ngroups_max .
195 The original Linux
196 .BR getgroups ()
197 system call supported only 16-bit group IDs.
198 Subsequently, Linux 2.4 added
199 .BR getgroups32 (),
200 supporting 32-bit IDs.
201 The glibc
202 .BR getgroups ()
203 wrapper function transparently deals with the variation across kernel versions.
205 .SS C library/kernel differences
206 At the kernel level, user IDs and group IDs are a per-thread attribute.
207 However, POSIX requires that all threads in a process
208 share the same credentials.
209 The NPTL threading implementation handles the POSIX requirements by
210 providing wrapper functions for
211 the various system calls that change process UIDs and GIDs.
212 These wrapper functions (including the one for
213 .BR setgroups ())
214 employ a signal-based technique to ensure
215 that when one thread changes credentials,
216 all of the other threads in the process also change their credentials.
217 For details, see
218 .BR nptl (7).
219 .SH SEE ALSO
220 .BR getgid (2),
221 .BR setgid (2),
222 .BR getgrouplist (3),
223 .BR group_member (3),
224 .BR initgroups (3),
225 .BR capabilities (7),
226 .BR credentials (7)