Annotation of researchv10no/cmd/dist/lib/id.c, revision 1.1

1.1     ! root        1: #define _POSIX_SOURCE
        !             2: #include <limits.h>
        !             3: #include <stdio.h>
        !             4: #include <time.h>
        !             5: #include <pwd.h>
        !             6: #include <grp.h>
        !             7: #include "lib.h"
        !             8: 
        !             9: struct idmap {
        !            10:        char *str;
        !            11:        int num;
        !            12:        struct idmap *next;
        !            13: };
        !            14: 
        !            15: static struct idmap *umap, *gmap;
        !            16: 
        !            17: static struct idmap *
        !            18: idnum(struct idmap **map, char *str)
        !            19: {
        !            20:        while (*map) {
        !            21:                if ((*map)->str && strcmp((*map)->str, str) == 0)
        !            22:                        return *map;
        !            23:                map = &(*map)->next;
        !            24:        }
        !            25:        return 0;
        !            26: }
        !            27: 
        !            28: static struct idmap *
        !            29: idstr(struct idmap **map, int num)
        !            30: {
        !            31:        while (*map) {
        !            32:                if ((*map)->num == num)
        !            33:                        return *map;
        !            34:                map = &(*map)->next;
        !            35:        }
        !            36:        return 0;
        !            37: }
        !            38: 
        !            39: static struct idmap *
        !            40: idset(struct idmap **map, char *str, int num)
        !            41: {
        !            42:        struct idmap *mapent;
        !            43: 
        !            44:        mapent = xmalloc(sizeof (struct idmap));
        !            45:        if (str)
        !            46:                mapent->str = xstrdup(str);
        !            47:        else
        !            48:                mapent->str = 0;
        !            49:        mapent->num = num;
        !            50:        mapent->next = *map;
        !            51:        *map = mapent;
        !            52:        return mapent;
        !            53: }
        !            54: 
        !            55: int
        !            56: uidnum(char *str)
        !            57: {
        !            58:        struct idmap *id;
        !            59:        struct passwd *pw;
        !            60:        int num;
        !            61: 
        !            62:        id = idnum(&umap, str);
        !            63:        if (!id) {
        !            64:                pw = getpwnam(str);
        !            65:                id = idset(&umap, str, pw ? pw->pw_uid : -1);
        !            66:        }
        !            67:        return id->num;
        !            68: }
        !            69: 
        !            70: char *
        !            71: uidstr(int num)
        !            72: {
        !            73:        struct idmap *id;
        !            74:        struct passwd *pw;
        !            75:        char *str;
        !            76: 
        !            77:        id = idstr(&umap, num);
        !            78:        if (!id) {
        !            79:                pw = getpwuid(num);
        !            80:                id = idset(&umap, pw ? pw->pw_name : 0, num);
        !            81:        }
        !            82:        return id->str;
        !            83: }
        !            84: 
        !            85: int
        !            86: gidnum(char *str)
        !            87: {
        !            88:        struct idmap *id;
        !            89:        struct group *gr;
        !            90:        int num;
        !            91: 
        !            92:        id = idnum(&gmap, str);
        !            93:        if (!id) {
        !            94:                gr = getgrnam(str);
        !            95:                id = idset(&gmap, str, gr ? gr->gr_gid : -1);
        !            96:        }
        !            97:        return id->num;
        !            98: }
        !            99: 
        !           100: char *
        !           101: gidstr(int num)
        !           102: {
        !           103:        struct idmap *id;
        !           104:        struct group *gr;
        !           105:        char *str;
        !           106: 
        !           107:        id = idstr(&gmap, num);
        !           108:        if (!id) {
        !           109:                gr = getgrgid(num);
        !           110:                id = idset(&gmap, gr ? gr->gr_name : 0, num);
        !           111:        }
        !           112:        return id->str;
        !           113: }

unix.superglobalmegacorp.com

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