getgrent.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /* $Id$ */
  2. /*
  3. * get entry from group file
  4. *
  5. * By: Patrick van Kleef
  6. */
  7. #include <grp.h>
  8. #define PRIVATE static
  9. PRIVATE char _gr_file[] = "/etc/group";
  10. PRIVATE char _grbuf[256];
  11. PRIVATE char _buffer[1024];
  12. PRIVATE char *_pnt;
  13. PRIVATE char *_buf;
  14. PRIVATE int _gfd = -1;
  15. PRIVATE int _bufcnt;
  16. PRIVATE struct group grp;
  17. setgrent ()
  18. {
  19. if (_gfd >= 0)
  20. lseek (_gfd, 0L, 0);
  21. else
  22. _gfd = open (_gr_file, 0);
  23. _bufcnt = 0;
  24. return (_gfd);
  25. }
  26. endgrent ()
  27. {
  28. if (_gfd >= 0)
  29. close (_gfd);
  30. _gfd = -1;
  31. _bufcnt = 0;
  32. }
  33. static getline ()
  34. {
  35. if (_gfd < 0 && setgrent () < 0)
  36. return (0);
  37. _buf = _grbuf;
  38. do {
  39. if (--_bufcnt <= 0){
  40. if ((_bufcnt = read (_gfd, _buffer, 1024)) <= 0)
  41. return (0);
  42. else
  43. _pnt = _buffer;
  44. }
  45. *_buf++ = *_pnt++;
  46. } while (*_pnt != '\n');
  47. _pnt++;
  48. _bufcnt--;
  49. *_buf = 0;
  50. _buf = _grbuf;
  51. return (1);
  52. }
  53. static skip_period ()
  54. {
  55. while (*_buf && *_buf != ':')
  56. _buf++;
  57. *_buf++ = '\0';
  58. }
  59. struct group *getgrent ()
  60. {
  61. if (getline () == 0)
  62. return (0);
  63. grp.gr_name = _buf;
  64. skip_period ();
  65. grp.gr_passwd = _buf;
  66. skip_period ();
  67. grp.gr_gid = atoi (_buf);
  68. skip_period ();
  69. return (&grp);
  70. }
  71. struct group *getgrnam (name)
  72. char *name;
  73. {
  74. struct group *grp;
  75. setgrent ();
  76. while ((grp = getgrent ()) != 0)
  77. if (!strcmp (grp -> gr_name, name))
  78. break;
  79. endgrent ();
  80. if (grp != 0)
  81. return (grp);
  82. else
  83. return (0);
  84. }
  85. struct group *getgrgid (gid)
  86. int gid;
  87. {
  88. struct group *grp;
  89. setgrent ();
  90. while ((grp = getgrent ()) != 0)
  91. if (grp -> gr_gid == gid)
  92. break;
  93. endgrent ();
  94. if (grp != 0)
  95. return (grp);
  96. else
  97. return (0);
  98. }