1 // Copyright (C) 1992-1998 by Michael K. Johnson, johnsonm (at) redhat.com 2 // Note: most likely none of his code remains 3 // 4 // Copyright 2002, Albert Cahalan 5 // 6 // This file is placed under the conditions of the GNU Library 7 // General Public License, version 2, or any later version. 8 // See file COPYING for information on distribution conditions. 9 10 #include <stdio.h> 11 #include <sys/types.h> 12 #include <stdlib.h> 13 #include <pwd.h> 14 #include "alloc.h" 15 #include "pwcache.h" 16 #include <grp.h> 17 18 // might as well fill cache lines... else we waste memory anyway 19 20 #define HASHSIZE 64 /* power of 2 */ 21 #define HASH(x) ((x) & (HASHSIZE - 1)) 22 23 #define NAMESIZE 20 24 #define NAMELENGTH "19" 25 26 static struct pwbuf { 27 struct pwbuf *next; 28 uid_t uid; 29 char name[NAMESIZE]; 30 } *pwhash[HASHSIZE]; 31 32 char *user_from_uid(uid_t uid) 33 { 34 struct pwbuf **p; 35 struct passwd *pw; 36 37 p = &pwhash[HASH(uid)]; 38 while (*p) { 39 if ((*p)->uid == uid) 40 return ((*p)->name); 41 p = &(*p)->next; 42 } 43 *p = (struct pwbuf *)xmalloc(sizeof(struct pwbuf)); 44 (*p)->uid = uid; 45 if ((pw = getpwuid(uid)) == NULL) 46 sprintf((*p)->name, "#%d", uid); 47 else 48 sprintf((*p)->name, "%-." NAMELENGTH "s", pw->pw_name); 49 (*p)->next = NULL; 50 return ((*p)->name); 51 } 52 53 static struct grpbuf { 54 struct grpbuf *next; 55 gid_t gid; 56 char name[NAMESIZE]; 57 } *grphash[HASHSIZE]; 58 59 char *group_from_gid(gid_t gid) 60 { 61 struct grpbuf **g; 62 struct group *gr; 63 64 g = &grphash[HASH(gid)]; 65 while (*g) { 66 if ((*g)->gid == gid) 67 return ((*g)->name); 68 g = &(*g)->next; 69 } 70 *g = (struct grpbuf *)malloc(sizeof(struct grpbuf)); 71 (*g)->gid = gid; 72 if ((gr = getgrgid(gid)) == NULL) 73 sprintf((*g)->name, "#%d", gid); 74 else 75 sprintf((*g)->name, "%-." NAMELENGTH "s", gr->gr_name); 76 (*g)->next = NULL; 77 return ((*g)->name); 78 } 79