define new library function getgrouplist
[unix-history] / usr / src / lib / libc / gen / initgroups.c
index 1045719..2288c53 100644 (file)
@@ -2,64 +2,31 @@
  * Copyright (c) 1983 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1983 Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)initgroups.c       5.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)initgroups.c       5.8 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 /*
  * initgroups
  */
 #endif /* LIBC_SCCS and not lint */
 
 /*
  * initgroups
  */
-#include <stdio.h>
 #include <sys/param.h>
 #include <sys/param.h>
-#include <grp.h>
-
-struct group *getgrent();
+#include <stdio.h>
 
 
+int
 initgroups(uname, agroup)
 initgroups(uname, agroup)
-       char *uname;
+       const char *uname;
        int agroup;
 {
        int agroup;
 {
-       int groups[NGROUPS], ngroups = 0;
-       register struct group *grp;
-       register int i;
+       int groups[NGROUPS], ngroups;
 
 
-       /*
-        * If installing primary group, duplicate it;
-        * the first element of groups is the effective gid
-        * and will be overwritten when a setgid file is executed.
-        */
-       if (agroup >= 0) {
-               groups[ngroups++] = agroup;
-               groups[ngroups++] = agroup;
-       }
-       setgrent();
-       while (grp = getgrent()) {
-               if (grp->gr_gid == agroup)
-                       continue;
-               for (i = 0; grp->gr_mem[i]; i++)
-                       if (!strcmp(grp->gr_mem[i], uname)) {
-                               if (ngroups == NGROUPS) {
-fprintf(stderr, "initgroups: %s is in too many groups\n", uname);
-                                       goto toomany;
-                               }
-                               groups[ngroups++] = grp->gr_gid;
-                       }
-       }
-toomany:
-       endgrent();
+       ngroups = NGROUPS;
+       if (getgrouplist(uname, agroup, groups, &ngroups) < 0)
+               fprintf(stderr,
+                   "initgroups: %s is in too many groups, using first %d\n",
+                   uname, ngroups);
        if (setgroups(ngroups, groups) < 0) {
                perror("setgroups");
                return (-1);
        if (setgroups(ngroups, groups) < 0) {
                perror("setgroups");
                return (-1);