1 /* 2 * Copyright (c) 1991 Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #if defined(LIBC_SCCS) && !defined(lint) 9 static char sccsid[] = "@(#)getgrouplist.c 5.1 (Berkeley) 11/12/91"; 10 #endif /* LIBC_SCCS and not lint */ 11 12 /* 13 * get credential 14 */ 15 #include <sys/types.h> 16 #include <string.h> 17 #include <grp.h> 18 19 int 20 getgrouplist(uname, agroup, groups, grpcnt) 21 const char *uname; 22 int agroup; 23 register int *groups; 24 int *grpcnt; 25 { 26 register struct group *grp; 27 register struct passwd *pw; 28 register int i, ngroups; 29 int ret, maxgroups; 30 31 ret = 0; 32 ngroups = 0; 33 maxgroups = *grpcnt; 34 /* 35 * When installing primary group, duplicate it; 36 * the first element of groups is the effective gid 37 * and will be overwritten when a setgid file is executed. 38 */ 39 groups[ngroups++] = agroup; 40 if (maxgroups > 1) 41 groups[ngroups++] = agroup; 42 /* 43 * Scan the group file to find additional groups. 44 */ 45 setgrent(); 46 while (grp = getgrent()) { 47 if (grp->gr_gid == agroup) 48 continue; 49 if (ngroups >= maxgroups) { 50 ret = -1; 51 break; 52 } 53 for (i = 0; grp->gr_mem[i]; i++) { 54 if (!strcmp(grp->gr_mem[i], uname)) { 55 groups[ngroups++] = grp->gr_gid; 56 break; 57 } 58 } 59 } 60 endgrent(); 61 *grpcnt = ngroups; 62 return (ret); 63 } 64