home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / OS9_Unix.lzh / RSHSRC / getpw.c < prev    next >
C/C++ Source or Header  |  1992-09-10  |  2KB  |  101 lines

  1. #include <stdio.h>
  2. #include <pwd.h>
  3.  
  4. extern int errno;
  5. extern char *strtok();
  6. extern char *malloc();
  7.  
  8. #define PASSWORDFILE "/dd/sys/password"
  9.  
  10. static FILE *pwfile = NULL;
  11. static struct passwd pwbuf;
  12. static char pwline[512];
  13. static char *pwfilename = NULL;
  14.  
  15. struct passwd *getpwent() {
  16.     int saveerr;
  17.     static char colon[] = ",.:\n";
  18.     register char *cp;
  19.  
  20.     if(pwfile == NULL) {
  21.         pwfile = fopen(pwfilename == NULL ? PASSWORDFILE : pwfilename, "r");
  22.     if(pwfile == NULL) return NULL;
  23.     }
  24.     if(fgets(pwline, sizeof pwline, pwfile) == NULL) {
  25.         saveerr = errno;
  26.     fclose(pwfile);
  27.     pwfile = NULL;
  28.     errno = saveerr;
  29.     return NULL;
  30.     }
  31.     pwbuf.pw_name = strtok(pwline, colon);
  32.     pwbuf.pw_passwd = strtok((char *)NULL, colon);
  33.     cp = strtok((char *)NULL, colon);
  34.     pwbuf.pw_gid = (cp == NULL) ? -1 : atoi(cp);
  35.     cp = strtok((char *)NULL, colon);
  36.     pwbuf.pw_uid = (cp == NULL) ? -1 : atoi(cp);
  37.     cp = strtok((char *)NULL, colon);
  38.     pwbuf.pw_priority = (cp == NULL) ? 0 : atoi(cp);
  39. /*    pwbuf.pw_gecos = strtok((char *)NULL, colon); */
  40.     pwbuf.pw_gecos="No GECOS!";
  41.     pwbuf.pw_xdir = strtok((char *)NULL, colon);
  42.     pwbuf.pw_dir = strtok((char *)NULL, colon);
  43.     pwbuf.pw_shell = strtok((char *)NULL, "\n");
  44.     return &pwbuf;
  45. }
  46.  
  47. setpwent() {
  48.     if(pwfile != NULL) {
  49.         return fseek(pwfile, 0, 0);
  50.     }
  51.     return 0;
  52. }
  53.  
  54. endpwent() {
  55.     if(pwfile != NULL) {
  56.         fclose(pwfile);
  57.     pwfile = NULL;
  58.     }
  59.     return 0;
  60. }
  61.  
  62. setpwfile(name)
  63. register char *name;
  64. {
  65.     if(pwfilename != NULL) free(pwfilename);
  66.     if(name != NULL) {
  67.         pwfilename = malloc(strlen(name) + 1);
  68.     if(pwfilename == NULL) return -1;
  69.     strcpy(pwfilename, name);
  70.     } else {
  71.         pwfilename = NULL;
  72.     }
  73.     return 0;
  74. }
  75.  
  76. struct passwd *getpwuid(giduid)
  77. int giduid;
  78. {
  79.     register unsigned short gid, uid;
  80.  
  81.     gid = giduid >> 16;
  82.     uid = giduid & 0xffff;
  83.     setpwent();
  84.     while(getpwent() != NULL) {
  85.         if(pwbuf.pw_uid == uid && pwbuf.pw_gid == gid) return &pwbuf;
  86.     }
  87.     return NULL;
  88. }
  89.  
  90. struct passwd *getpwnam(name)
  91. register char *name;
  92. {
  93.     register struct passwd *pw;
  94.  
  95.     setpwent();
  96.     while((pw = getpwent()) != NULL) {
  97.         if(strcmp(pw->pw_name, name) == 0) return pw;
  98.     }
  99.     return NULL;
  100. }
  101.