From 6d50d4cbbf6ff34ed68dba61d30c434b57b23332 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Tue, 17 May 2016 12:10:07 -0500 Subject: Add bufgetpwuid. (Repeated calls to getpwuid() are really expensive.) --- lib/lib.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'lib/lib.c') diff --git a/lib/lib.c b/lib/lib.c index 0df45bf9..98597b24 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -1074,3 +1074,31 @@ int dev_makedev(int major, int minor) { return (minor&0xff)|((major&0xfff)<<8)|((minor&0xfff00)<<12); } + +// Return cached passwd entries. +struct passwd *bufgetpwuid(uid_t uid) +{ + struct pwuidbuf_list { + struct pwuidbuf_list *next; + struct passwd pw; + } *list; + struct passwd *temp; + static struct pwuidbuf_list *pwuidbuf; + + for (list = pwuidbuf; list; list = list->next) + if (list->pw.pw_uid == uid) return &(list->pw); + + list = xmalloc(512); + list->next = pwuidbuf; + + errno = getpwuid_r(uid, &list->pw, sizeof(*list)+(char *)list, + 512-sizeof(*list), &temp); + if (!temp) { + free(list); + + return 0; + } + pwuidbuf = list; + + return &list->pw; +} -- cgit v1.2.3