getgrouplist.c 529 B

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