OpenCoverage

getugroups.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/getugroups.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* getugroups.c -- return a list of the groups a user is in-
2-
3 Copyright (C) 1990-1991, 1998-2000, 2003-2018 Free Software Foundation, Inc.-
4-
5 This program is free software: you can redistribute it and/or modify-
6 it under the terms of the GNU General Public License as published by-
7 the Free Software Foundation; either version 3 of the License, or-
8 (at your option) any later version.-
9-
10 This program is distributed in the hope that it will be useful,-
11 but WITHOUT ANY WARRANTY; without even the implied warranty of-
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
13 GNU General Public License for more details.-
14-
15 You should have received a copy of the GNU General Public License-
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
17-
18/* Written by David MacKenzie. */-
19-
20#include <config.h>-
21-
22#include "getugroups.h"-
23-
24#include <errno.h>-
25#include <limits.h>-
26#include <stdio.h> /* grp.h on alpha OSF1 V2.0 uses "FILE *". */-
27#include <string.h>-
28#include <unistd.h>-
29-
30#if !HAVE_GRP_H || defined __ANDROID__-
31-
32/* Mingw lacks all things related to group management. The best we-
33 can do is fail with ENOSYS.-
34-
35 Bionic declares e.g. getgrent() in <grp.h> but it isn't actually-
36 defined in the library. */-
37-
38int-
39getugroups (int maxcount _GL_UNUSED,-
40 gid_t *grouplist _GL_UNUSED,-
41 char const *username _GL_UNUSED,-
42 gid_t gid _GL_UNUSED)-
43{-
44 errno = ENOSYS;-
45 return -1;-
46}-
47-
48#else /* HAVE_GRP_H */-
49# include <grp.h>-
50-
51# define STREQ(a, b) (strcmp (a, b) == 0)-
52-
53/* Like 'getgroups', but for user USERNAME instead of for the current-
54 process. Store at most MAXCOUNT group IDs in the GROUPLIST array.-
55 If GID is not -1, store it first (if possible). GID should be the-
56 group ID (pw_gid) obtained from getpwuid, in case USERNAME is not-
57 listed in /etc/groups. Upon failure, set errno and return -1.-
58 Otherwise, return the number of IDs we've written into GROUPLIST. */-
59-
60int-
61getugroups (int maxcount, gid_t *grouplist, char const *username,-
62 gid_t gid)-
63{-
64 int count = 0;-
65-
66 if (gid != (gid_t) -1)
gid != (gid_t) -1Description
TRUEnever evaluated
FALSEnever evaluated
0
67 {-
68 if (maxcount != 0)
maxcount != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
69 grouplist[count] = gid;
never executed: grouplist[count] = gid;
0
70 ++count;-
71 }
never executed: end of block
0
72-
73 setgrent ();-
74 while (1)-
75 {-
76 char **cp;-
77 struct group *grp;-
78-
79 errno = 0;-
80 grp = getgrent ();-
81 if (grp == NULL)
grp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
82 break;
never executed: break;
0
83-
84 for (cp = grp->gr_mem; *cp; ++cp)
*cpDescription
TRUEnever evaluated
FALSEnever evaluated
0
85 {-
86 int n;-
87-
88 if ( ! STREQ (username, *cp))
never executed: __result = (((const unsigned char *) (const char *) ( username ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( *cp ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
! ( __extensio...)))); }) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
89 continue;
never executed: continue;
0
90-
91 /* See if this group number is already on the list. */-
92 for (n = 0; n < count; ++n)
n < countDescription
TRUEnever evaluated
FALSEnever evaluated
0
93 if (grouplist && grouplist[n] == grp->gr_gid)
grouplistDescription
TRUEnever evaluated
FALSEnever evaluated
grouplist[n] == grp->gr_gidDescription
TRUEnever evaluated
FALSEnever evaluated
0
94 break;
never executed: break;
0
95-
96 /* If it's a new group number, then try to add it to the list. */-
97 if (n == count)
n == countDescription
TRUEnever evaluated
FALSEnever evaluated
0
98 {-
99 if (maxcount != 0)
maxcount != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
100 {-
101 if (count >= maxcount)
count >= maxcountDescription
TRUEnever evaluated
FALSEnever evaluated
0
102 goto done;
never executed: goto done;
0
103 grouplist[count] = grp->gr_gid;-
104 }
never executed: end of block
0
105 if (count == INT_MAX)
count == 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
0
106 {-
107 errno = EOVERFLOW;-
108 goto done;
never executed: goto done;
0
109 }-
110 count++;-
111 }
never executed: end of block
0
112 }
never executed: end of block
0
113 }
never executed: end of block
0
114-
115 if (errno != 0)
(*__errno_location ()) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
116 count = -1;
never executed: count = -1;
0
117-
118 done:
code before this statement never executed: done:
0
119 {-
120 int saved_errno = errno;-
121 endgrent ();-
122 errno = saved_errno;-
123 }-
124-
125 return count;
never executed: return count;
0
126}-
127-
128#endif /* HAVE_GRP_H */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2