|
|
1.1 ! root 1: /* initgroups.c 4.4 83/06/17 */ ! 2: ! 3: /* ! 4: * initgroups ! 5: */ ! 6: #include <stdio.h> ! 7: #include <sys/param.h> ! 8: #include <grp.h> ! 9: ! 10: struct group *getgrent(); ! 11: ! 12: initgroups(uname, agroup) ! 13: char *uname; ! 14: int agroup; ! 15: { ! 16: int groups[NGROUPS], ngroups = 0; ! 17: register struct group *grp; ! 18: register int i; ! 19: ! 20: if (agroup >= 0) ! 21: groups[ngroups++] = agroup; ! 22: setgrent(); ! 23: while (grp = getgrent()) { ! 24: if (grp->gr_gid == agroup) ! 25: continue; ! 26: for (i = 0; grp->gr_mem[i]; i++) ! 27: if (!strcmp(grp->gr_mem[i], uname)) { ! 28: if (ngroups == NGROUPS) { ! 29: fprintf(stderr, "initgroups: %s is in too many groups\n", uname); ! 30: goto toomany; ! 31: } ! 32: groups[ngroups++] = grp->gr_gid; ! 33: } ! 34: } ! 35: toomany: ! 36: endgrent(); ! 37: if (setgroups(ngroups, groups) < 0) { ! 38: perror("setgroups"); ! 39: return (1); ! 40: } ! 41: return (0); ! 42: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.