|
|
1.1 ! root 1: #include "asd.h" ! 2: #include <grp.h> ! 3: ! 4: #define CHUNK 16 ! 5: ! 6: struct group *getgrent(); ! 7: ! 8: static struct gtab { ! 9: unsigned gid; ! 10: char *name; ! 11: } *gtab; ! 12: ! 13: static int size; ! 14: ! 15: char * ! 16: strgid (gid) ! 17: register unsigned short gid; ! 18: { ! 19: register int i; ! 20: static char buf[12]; ! 21: ! 22: /* search the cache for the gid */ ! 23: for (i = 0; i < size; i++) ! 24: if (gtab[i].gid == gid) ! 25: return gtab[i].name; ! 26: ! 27: /* search the file, caching */ ! 28: while (expand()) ! 29: if (gtab[size-1].gid == gid) ! 30: return gtab[size-1].name; ! 31: ! 32: /* failure, invent a string */ ! 33: sprintf (buf, "#%u", gid); ! 34: return buf; ! 35: } ! 36: ! 37: int ! 38: numgid (name) ! 39: register char *name; ! 40: { ! 41: register int i; ! 42: ! 43: /* if it starts with a #, use the number */ ! 44: if (name[0] == '#') ! 45: return atoi (name + 1); ! 46: ! 47: /* search the cache */ ! 48: for (i = 0; i < size; i++) ! 49: if (strcmp (gtab[i].name, name) == 0) ! 50: return gtab[i].gid; ! 51: ! 52: /* search the file */ ! 53: while (expand()) ! 54: if (strcmp (gtab[size-1].name, name) == 0) ! 55: return gtab[size-1].gid; ! 56: ! 57: /* failure, invent a value */ ! 58: return getgid(); ! 59: } ! 60: ! 61: static int ! 62: expand() ! 63: { ! 64: register struct group *gr; ! 65: static ended; ! 66: ! 67: if (!ended) { ! 68: gr = getgrent(); ! 69: if (gr == NULL) { ! 70: ended = 1; ! 71: endgrent(); ! 72: return 0; ! 73: } ! 74: if (size % CHUNK == 0) { ! 75: gtab = (struct gtab *) ralloc ((char *) gtab, ! 76: (unsigned) ((size + CHUNK) * sizeof (*gtab))); ! 77: } ! 78: gtab[size].gid = gr->gr_gid; ! 79: gtab[size].name = copy (gr->gr_name); ! 80: size++; ! 81: return 1; ! 82: } ! 83: ! 84: return 0; ! 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.