getgrent.c 762 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "pwf.h"
  2. static FILE *f;
  3. void setgrent()
  4. {
  5. if (f) fclose(f);
  6. f = 0;
  7. }
  8. weak_alias(setgrent, endgrent);
  9. struct group *getgrent()
  10. {
  11. static char *line, **mem;
  12. static struct group gr;
  13. size_t size=0, nmem=0;
  14. if (!f) f = fopen("/etc/group", "rb");
  15. if (!f) return 0;
  16. return __getgrent_a(f, &gr, &line, &size, &mem, &nmem);
  17. }
  18. struct group *getgrgid(gid_t gid)
  19. {
  20. struct group *gr;
  21. int errno_saved;
  22. setgrent();
  23. while ((gr=getgrent()) && gr->gr_gid != gid);
  24. errno_saved = errno;
  25. endgrent();
  26. errno = errno_saved;
  27. return gr;
  28. }
  29. struct group *getgrnam(const char *name)
  30. {
  31. struct group *gr;
  32. int errno_saved;
  33. setgrent();
  34. while ((gr=getgrent()) && strcmp(gr->gr_name, name));
  35. errno_saved = errno;
  36. endgrent();
  37. errno = errno_saved;
  38. return gr;
  39. }