getgrouplist.c 509 B

1234567891011121314151617181920212223
  1. #include <grp.h>
  2. #include <string.h>
  3. #include <limits.h>
  4. int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
  5. {
  6. size_t n, i;
  7. struct group *gr;
  8. if (*ngroups<1) return -1;
  9. n = *ngroups;
  10. *groups++ = gid;
  11. *ngroups = 1;
  12. setgrent();
  13. while ((gr = getgrent()) && *ngroups < INT_MAX) {
  14. for (i=0; gr->gr_mem[i] && strcmp(user, gr->gr_mem[i]); i++);
  15. if (!gr->gr_mem[i]) continue;
  16. if (++*ngroups <= n) *groups++ = gr->gr_gid;
  17. }
  18. endgrent();
  19. return *ngroups > n ? -1 : *ngroups;
  20. }