Annotation of coherent/a/tmp/smail/pw.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)pw.c        2.5 (smail) 9/15/87";
        !             3: #endif
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <sys/types.h>
        !             7: #include <sys/stat.h>
        !             8: #include <pwd.h>
        !             9: #include "defs.h"
        !            10: #include <ctype.h>
        !            11: 
        !            12: char *malloc();
        !            13: void free();
        !            14: 
        !            15: typedef struct pw_node pwlist;
        !            16: 
        !            17: struct pw_node {
        !            18:        char *lname;                    /* login name */
        !            19:        char *fname;                    /* full name  */
        !            20:        int  uid;                       /* user-id    */
        !            21:        char *home;                     /* login name */
        !            22:        pwlist *vlink;                  /* link to next item */
        !            23: };
        !            24: 
        !            25: pwlist *pwhead;                /* head of linked list */
        !            26: pwlist *pwparse();     /* head of linked list */
        !            27: 
        !            28: #define PNULL  ((pwlist *) 0)
        !            29: 
        !            30: char *
        !            31: pwfnam(user)
        !            32: char *user;
        !            33: {
        !            34:        pwlist *f;
        !            35: 
        !            36:        /*
        !            37:        ** check for previously cached user
        !            38:        */
        !            39: 
        !            40:        for(f=pwhead; f != NULL; f=f->vlink) {
        !            41:                if(strcmp(user, f->lname) == 0) {
        !            42:                        return(f->fname);
        !            43:                }
        !            44:        }
        !            45:        /*
        !            46:        ** not found parse the password file
        !            47:        */
        !            48: 
        !            49:        while((f=pwparse()) != PNULL) {
        !            50:                if(strcmp(user, f->lname) == 0) {
        !            51:                        return(f->fname);
        !            52:                }
        !            53:        }
        !            54:        return(NULL);
        !            55: }
        !            56: 
        !            57: char *
        !            58: pwuid(uid)
        !            59: int uid;
        !            60: {
        !            61:        pwlist *f;
        !            62: 
        !            63:        /*
        !            64:        ** check for previously cached user
        !            65:        */
        !            66: 
        !            67:        for(f=pwhead; f != NULL; f=f->vlink) {
        !            68:                if(uid == f->uid) {
        !            69:                        return(f->lname);
        !            70:                }
        !            71:        }
        !            72:        /*
        !            73:        ** not found parse the password file
        !            74:        */
        !            75: 
        !            76:        while((f=pwparse()) != PNULL) {
        !            77:                if(uid == f->uid) {
        !            78:                        return(f->lname);
        !            79:                }
        !            80:        }
        !            81:        return(NULL);
        !            82: }
        !            83: 
        !            84: #ifndef SENDMAIL
        !            85: char *
        !            86: tilde(user)
        !            87: char *user;
        !            88: {
        !            89:        pwlist *f;
        !            90: 
        !            91:        /*
        !            92:        ** check for previously cached user
        !            93:        */
        !            94: 
        !            95:        for(f=pwhead; f != NULL; f=f->vlink) {
        !            96:                if(strcmp(user, f->lname) == 0) {
        !            97:                        return(f->home);
        !            98:                }
        !            99:        }
        !           100:        /*
        !           101:        ** not found parse the password file
        !           102:        */
        !           103: 
        !           104:        while((f=pwparse()) != PNULL) {
        !           105:                if(strcmp(user, f->lname) == 0) {
        !           106:                        return(f->home);
        !           107:                }
        !           108:        }
        !           109:        return(NULL);
        !           110: }
        !           111: #endif /* not SENDMAIL */
        !           112: 
        !           113: char *
        !           114: fullname(gecos)
        !           115: char *gecos;
        !           116: {
        !           117:        static char fname[SMLBUF];
        !           118:        register char *cend;
        !           119: 
        !           120:        (void) strcpy(fname, gecos);
        !           121:        if (cend = index(fname, ','))
        !           122:                *cend = '\0';
        !           123:        if (cend = index(fname, '('))
        !           124:                *cend = '\0';
        !           125:        /*
        !           126:        ** Skip USG-style 0000-Name nonsense if necessary.
        !           127:        */
        !           128:        if (isdigit(*(cend = fname))) {
        !           129:                if ((cend = index(fname, '-')) != NULL)
        !           130:                        cend++;
        !           131:                else
        !           132:                        /*
        !           133:                        ** There was no `-' following digits.
        !           134:                        */
        !           135:                        cend = fname;
        !           136:        }
        !           137:        return (cend);
        !           138: }
        !           139: 
        !           140: pwlist *
        !           141: pwparse()
        !           142: {
        !           143:        pwlist *f;
        !           144:        char *p, *name;
        !           145:        struct passwd *pwent, *getpwent();
        !           146:        unsigned int i;
        !           147:        static int pw_eof = 0;
        !           148: 
        !           149:        if((pw_eof == 1)
        !           150:        || ((pwent = getpwent()) == (struct passwd *) NULL)) {
        !           151:                /* We've parsed and cached the entire passwd file.  */
        !           152:                pw_eof = 1;
        !           153:                endpwent();
        !           154:                return(PNULL);
        !           155:        }
        !           156:        /*
        !           157:        ** Get an entry from the password file.
        !           158:        ** Parse relevant strings.
        !           159:        */
        !           160:        f = (pwlist *) malloc(sizeof(pwlist));
        !           161:        if(f == PNULL) return(PNULL);
        !           162: 
        !           163:        f->vlink = pwhead;
        !           164:        pwhead   = f;
        !           165:        f->uid   = pwent->pw_uid;
        !           166: 
        !           167:        i=strlen(pwent->pw_name)+1;
        !           168:        p = malloc(i);
        !           169:        if(p == NULL) return(PNULL);
        !           170:        f->lname = strcpy(p, pwent->pw_name);
        !           171: 
        !           172:        i=strlen(pwent->pw_dir)+1;
        !           173:        p = malloc(i);
        !           174:        if(p == NULL) return(PNULL);
        !           175:        f->home  = strcpy(p, pwent->pw_dir);
        !           176: 
        !           177:        name = fullname(pwent->pw_gecos);
        !           178:        i=strlen(name)+1;
        !           179:        p = malloc(i);
        !           180:        if(p == NULL) return(PNULL);
        !           181:        f->fname = strcpy(p, name);
        !           182:        return(f);
        !           183: }
        !           184: 
        !           185: #ifdef FULLNAME
        !           186: /*
        !           187: ** Resolve a full name to a login name.
        !           188: ** Not too much smarts here.
        !           189: */
        !           190: 
        !           191: char *
        !           192: res_fname(user)
        !           193: register char *user;
        !           194: {
        !           195:        long pos, middle, hi, lo;
        !           196:        static long pathlength = 0;
        !           197:        register char *s;
        !           198:        int c;
        !           199:        static FILE *file;
        !           200:        int flag;
        !           201:        char namebuf[SMLBUF], *path;
        !           202:        extern enum edebug debug;
        !           203:        extern char *fnlist;
        !           204: 
        !           205: 
        !           206: 
        !           207: DEBUG("res_fname: looking for '%s'\n", user);
        !           208: 
        !           209:        if(pathlength == 0) {   /* open file on first use */
        !           210:                if((file=fopen(fnlist, "r")) == NULL) {
        !           211:                        DEBUG( "can't access %s.\n", fnlist);
        !           212:                        pathlength = -1;
        !           213:                } else {
        !           214:                        (void) fseek(file, 0L, 2);      /* find length */
        !           215:                        pathlength = ftell(file);
        !           216:                }
        !           217:        }
        !           218: 
        !           219:        if(pathlength == -1 ) return(NULL);
        !           220: 
        !           221:        lo = 0;
        !           222:        hi = pathlength;
        !           223:        path = namebuf;
        !           224: 
        !           225:        (void) strcpy( path, user );
        !           226:        (void) strcat( path, "\t" );
        !           227: 
        !           228:        for( ;; ) {
        !           229:                pos = middle = ( hi+lo+1 )/2;
        !           230:                (void) fseek( file, pos, 0 );   /* find midpoint */
        !           231:                if (pos != 0)           /* to beginning of next line */
        !           232:                        while( ( c=getc( file ) ) != EOF && c != '\n' );
        !           233:                for( flag = 0, s = path; flag == 0; s++ ) { /* match??? */
        !           234:                        if ( *s == '\0' ) {
        !           235:                                goto solved;
        !           236:                        }
        !           237:                        c = getc( file );
        !           238:                        flag = lower( c ) - lower( *s );
        !           239:                } 
        !           240:                if (lo >= middle)               /* failure? */
        !           241:                        return(NULL);
        !           242: 
        !           243:                if(c != EOF && flag < 0)        /* close window */
        !           244:                        lo = middle;
        !           245:                else 
        !           246:                        hi = middle - 1;
        !           247:        }
        !           248: /* 
        !           249: ** Now just copy the result.
        !           250: */
        !           251: solved:
        !           252:        while(((c  = getc(file)) != EOF) && (c != '\t') && (c != '\n')) {
        !           253:                *path++ = c;
        !           254:        }
        !           255: 
        !           256:        if(path == namebuf) {   /* NULL alias field */
        !           257:                return(NULL);
        !           258:        }
        !           259: 
        !           260:        *path = '\0';
        !           261:        if((path = malloc((unsigned) strlen(namebuf)+1)) == NULL) {
        !           262:                return(NULL);   /* sorry, no memory */
        !           263:        }
        !           264: 
        !           265:        (void) strcpy(path, namebuf);
        !           266:        return(path);
        !           267: 
        !           268: }
        !           269: #endif /* FULLNAME */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.