getpwent.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <stdio.h>
  2. #include <pwd.h>
  3. #include <stdlib.h>
  4. static char PASSWD[] = "/etc/passwd";
  5. static FILE *pwf = NULL;
  6. static char line[BUFSIZ+2];
  7. static struct passwd passwd;
  8. void
  9. setpwent(void)
  10. {
  11. if( pwf == NULL )
  12. pwf = fopen( PASSWD, "r" );
  13. else
  14. rewind( pwf );
  15. }
  16. void
  17. endpwent(void)
  18. {
  19. if( pwf != NULL ){
  20. fclose( pwf );
  21. pwf = NULL;
  22. }
  23. }
  24. static char *
  25. pwskip(char *p)
  26. {
  27. while( *p && *p != ':' && *p != '\n' )
  28. ++p;
  29. if( *p ) *p++ = 0;
  30. else p[1] = 0;
  31. return(p);
  32. }
  33. struct passwd *
  34. pwdecode(char *p)
  35. {
  36. passwd.pw_name = p;
  37. p = pwskip(p);
  38. p = pwskip(p); /* passwd */
  39. passwd.pw_uid = atoi(p);
  40. p = pwskip(p);
  41. passwd.pw_gid = atoi(p);
  42. p = pwskip(p); /* comment */
  43. p = pwskip(p); /* gecos */
  44. passwd.pw_dir = p;
  45. p = pwskip(p);
  46. passwd.pw_shell = p;
  47. p = pwskip(p);
  48. return(&passwd);
  49. }
  50. struct passwd *
  51. getpwent(void)
  52. {
  53. register char *p;
  54. if (pwf == NULL) {
  55. if( (pwf = fopen( PASSWD, "r" )) == NULL )
  56. return(0);
  57. }
  58. p = fgets(line, BUFSIZ, pwf);
  59. if (p==NULL)
  60. return(0);
  61. return pwdecode (p);
  62. }