Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/getugroups.c @ 7302:8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
longer worry about uses that don't define HAVE_CONFIG_H.
* acl.c, alloca.c, argmatch.c, atexit.c, backupfile.c:
* basename.c, c-stack.c, c-strtod.c, calloc.c, canon-host.c:
* canonicalize.c, chdir-long.c, chdir-safer.c, chown.c:
* cloexec.c, close-stream.c, closeout.c, creat-safer.c:
* cycle-check.c, diacrit.c, dirchownmod.c, dirfd.c, dirname.c:
* dup-safer.c, dup2.c, error.c, euidaccess.c, exclude.c:
* exitfail.c, fchmodat.c, fchown-stub.c, fd-safer.c:
* file-type.c, fileblocks.c, filemode.c, filenamecat.c:
* fnmatch.c, fopen-safer.c, fprintftime.c, free.c, fsusage.c:
* ftruncate.c, fts-cycle.c, fts.c, full-write.c, gai_strerror.c:
* getcwd.c, getdate.y, getdomainname.c, getgroups.c:
* gethostname.c, gethrxtime.c, getloadavg.c, getlogin_r.c:
* getndelim2.c, getnline.c, getopt.c, getopt1.c, getpass.c:
* gettime.c, gettimeofday.c, getugroups.c, getusershell.c:
* glob.c, group-member.c, hard-locale.c, hash-pjw.c, hash.c:
* human.c, idcache.c, inet_ntop.c, inet_pton.c, inttostr.c:
* isdir.c, lchown.c, linebuffer.c, long-options.c, lstat.c:
* malloc.c, md5.c, memcasecmp.c, memchr.c, memcmp.c, memcoll.c:
* memcpy.c, memmove.c, memrchr.c, mkancesdirs.c, mkdir-p.c:
* mkdir.c, mkdirat.c, mkstemp-safer.c, mkstemp.c, modechange.c:
* mountlist.c, nanosleep.c, obstack.c, open-safer.c:
* openat-die.c, openat.c, pagealign_alloc.c, physmem.c:
* pipe-safer.c, posixtm.c, posixver.c, putenv.c, quote.c:
* quotearg.c, raise.c, readtokens.c, readtokens0.c, readutmp.c:
* realloc.c, regex.c, rename.c, rmdir.c, rpmatch.c, safe-read.c:
* same.c, save-cwd.c, savedir.c, setenv.c, settime.c, sha1.c:
* sig2str.c, snprintf.c, strdup.c, strerror.c, strftime.c:
* stripslash.c, strndup.c, strnlen.c, strpbrk.c, strtod.c:
* strtoimax.c, strtol.c, strverscmp.c, tempname.c, time_r.c:
* timegm.c, tmpfile-safer.c, unlinkdir.c, userspec.c, utime.c:
* utimecmp.c, utimens.c, version-etc-fsf.c, version-etc.c:
* xalloc-die.c, xgetcwd.c, xgethostname.c, xmalloc.c:
* xmemcoll.c, xnanosleep.c, xreadlink.c, xstrtod.c:
* xstrtoimax.c, xstrtol.c, xstrtoumax.c, yesno.c:
Likewise.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Wed, 13 Sep 2006 22:38:14 +0000 |
parents | 211a3b19d9ef |
children | c69012fcd861 |
rev | line source |
---|---|
9 | 1 /* getugroups.c -- return a list of the groups a user is in |
5159 | 2 |
7302
8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents:
6793
diff
changeset
|
3 Copyright (C) 1990, 1991, 1998, 1999, 2000, 2003, 2004, 2005, 2006 |
8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents:
6793
diff
changeset
|
4 Free Software Foundation. |
9 | 5 |
6 This program is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 2, or (at your option) | |
9 any later version. | |
10 | |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
651
242f0fe39aa7
update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents:
578
diff
changeset
|
17 along with this program; if not, write to the Free Software Foundation, |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5159
diff
changeset
|
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
9 | 19 |
20 /* Written by David MacKenzie. */ | |
21 | |
7302
8a1a9361108c
* _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents:
6793
diff
changeset
|
22 #include <config.h> |
578
3cea4259ae09
Include stdio.h before grp.h.
Jim Meyering <jim@meyering.net>
parents:
9
diff
changeset
|
23 |
9 | 24 #include <sys/types.h> |
578
3cea4259ae09
Include stdio.h before grp.h.
Jim Meyering <jim@meyering.net>
parents:
9
diff
changeset
|
25 #include <stdio.h> /* grp.h on alpha OSF1 V2.0 uses "FILE *". */ |
9 | 26 #include <grp.h> |
27 | |
6275 | 28 #include <unistd.h> |
9 | 29 |
5159 | 30 #include <errno.h> |
31 #ifndef EOVERFLOW | |
32 # define EOVERFLOW EINVAL | |
33 #endif | |
34 | |
6793
211a3b19d9ef
Correct an outdated comment. From Bruno Haible.
Jim Meyering <jim@meyering.net>
parents:
6275
diff
changeset
|
35 /* Some old header files might not declare setgrent, getgrent, and endgrent. |
9 | 36 If you don't have them at all, we can't implement this function. |
37 You lose! */ | |
38 struct group *getgrent (); | |
39 | |
4654 | 40 #include <string.h> |
9 | 41 |
1843
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
42 #define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) |
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
43 |
1733
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
44 /* Like `getgroups', but for user USERNAME instead of for the current |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
45 process. Store at most MAXCOUNT group IDs in the GROUPLIST array. |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
46 If GID is not -1, store it first (if possible). GID should be the |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
47 group ID (pw_gid) obtained from getpwuid, in case USERNAME is not |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
48 listed in /etc/groups. |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
49 Always return the number of groups of which USERNAME is a member. */ |
9 | 50 |
51 int | |
1730
05413a4755ee
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1263
diff
changeset
|
52 getugroups (int maxcount, GETGROUPS_T *grouplist, char *username, gid_t gid) |
9 | 53 { |
54 struct group *grp; | |
55 register char **cp; | |
56 register int count = 0; | |
57 | |
2571
a3aef28bde56
(getugroups): Cast -1 to gid_t, for systems like
Jim Meyering <jim@meyering.net>
parents:
1843
diff
changeset
|
58 if (gid != (gid_t) -1) |
1733
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
59 { |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
60 if (maxcount != 0) |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
61 grouplist[count] = gid; |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
62 ++count; |
6b0ff21d3888
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1731
diff
changeset
|
63 } |
1730
05413a4755ee
(getugroups): Take new parameter, gid.
Jim Meyering <jim@meyering.net>
parents:
1263
diff
changeset
|
64 |
9 | 65 setgrent (); |
66 while ((grp = getgrent ()) != 0) | |
1843
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
67 { |
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
68 for (cp = grp->gr_mem; *cp; ++cp) |
9 | 69 { |
1262
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
70 int n; |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
71 |
1843
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
72 if ( ! STREQ (username, *cp)) |
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
73 continue; |
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
74 |
1262
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
75 /* See if this group number is already on the list. */ |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
76 for (n = 0; n < count; ++n) |
1843
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
77 if (grouplist && grouplist[n] == grp->gr_gid) |
1262
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
78 break; |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
79 |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
80 /* If it's a new group number, then try to add it to the list. */ |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
81 if (n == count) |
9 | 82 { |
1262
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
83 if (maxcount != 0) |
9 | 84 { |
1262
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
85 if (count >= maxcount) |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
86 { |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
87 endgrent (); |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
88 return count; |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
89 } |
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
90 grouplist[count] = grp->gr_gid; |
9 | 91 } |
1262
662622cf616f
(getugroups): Don't add a group number if it would be a duplicate.
Jim Meyering <jim@meyering.net>
parents:
653
diff
changeset
|
92 count++; |
5159 | 93 if (count < 0) |
94 { | |
95 errno = EOVERFLOW; | |
96 return -1; | |
97 } | |
9 | 98 } |
99 } | |
1843
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
100 } |
9 | 101 endgrent (); |
1843
d9e10c329845
(getugroups): Don't dereference a null pointer when
Jim Meyering <jim@meyering.net>
parents:
1733
diff
changeset
|
102 |
9 | 103 return count; |
104 } |