1
0

getgrent.c 945 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <stdio.h>
  2. #include <grp.h>
  3. #include <stdlib.h>
  4. #define CL ':'
  5. #define CM ','
  6. #define NL '\n'
  7. #define MAXGRP 100
  8. static char GROUP[] = "/etc/group";
  9. static FILE *grf = NULL;
  10. static char line[BUFSIZ+1];
  11. static struct group group;
  12. static char *gr_mem[MAXGRP];
  13. setgrent()
  14. {
  15. if( !grf )
  16. grf = fopen( GROUP, "r" );
  17. else
  18. rewind( grf );
  19. }
  20. endgrent()
  21. {
  22. if( grf ){
  23. fclose( grf );
  24. grf = NULL;
  25. }
  26. }
  27. static char *
  28. grskip(register char *p, register c)
  29. {
  30. while( *p && *p != c ) ++p;
  31. if( *p ) *p++ = 0;
  32. return( p );
  33. }
  34. struct group *
  35. getgrent()
  36. {
  37. register char *p, **q;
  38. if( !grf && !(grf = fopen( GROUP, "r" )) )
  39. return(NULL);
  40. if( !(p = fgets( line, BUFSIZ, grf )) )
  41. return(NULL);
  42. group.gr_name = p;
  43. p = grskip(p,CL); /* passwd */
  44. group.gr_gid = atoi(p = grskip(p,CL));
  45. group.gr_mem = gr_mem;
  46. p = grskip(p,CL);
  47. grskip(p,NL);
  48. q = gr_mem;
  49. while( *p ){
  50. *q++ = p;
  51. p = grskip(p,CM);
  52. }
  53. *q = NULL;
  54. return( &group );
  55. }