diff options
-rw-r--r-- | libbb/procps.c | 45 |
1 files changed, 17 insertions, 28 deletions
diff --git a/libbb/procps.c b/libbb/procps.c index 75969947b..f56b71b21 100644 --- a/libbb/procps.c +++ b/libbb/procps.c | |||
@@ -21,40 +21,29 @@ typedef struct cache_t { | |||
21 | int size; | 21 | int size; |
22 | } cache_t; | 22 | } cache_t; |
23 | 23 | ||
24 | static cache_t username, groupname; | 24 | static cache_t *cache_user_group; |
25 | 25 | ||
26 | static void clear_cache(cache_t *cp) | ||
27 | { | ||
28 | free(cp->cache); | ||
29 | cp->cache = NULL; | ||
30 | cp->size = 0; | ||
31 | } | ||
32 | void FAST_FUNC clear_username_cache(void) | 26 | void FAST_FUNC clear_username_cache(void) |
33 | { | 27 | { |
34 | clear_cache(&username); | 28 | if (cache_user_group) { |
35 | clear_cache(&groupname); | 29 | free(cache_user_group[0].cache); |
36 | } | 30 | free(cache_user_group[1].cache); |
37 | 31 | free(cache_user_group); | |
38 | #if 0 /* more generic, but we don't need that yet */ | 32 | cache_user_group = NULL; |
39 | /* Returns -N-1 if not found. */ | 33 | } |
40 | /* cp->cache[N] is allocated and must be filled in this case */ | ||
41 | static int get_cached(cache_t *cp, uid_t id) | ||
42 | { | ||
43 | int i; | ||
44 | for (i = 0; i < cp->size; i++) | ||
45 | if (cp->cache[i].id == id) | ||
46 | return i; | ||
47 | i = cp->size++; | ||
48 | cp->cache = xrealloc_vector(cp->cache, 2, i); | ||
49 | cp->cache[i++].id = id; | ||
50 | return -i; | ||
51 | } | 34 | } |
52 | #endif | ||
53 | 35 | ||
54 | static char* get_cached(cache_t *cp, uid_t id, | 36 | static char* get_cached(int user_group, uid_t id, |
55 | char* FAST_FUNC x2x_utoa(uid_t id)) | 37 | char* FAST_FUNC x2x_utoa(uid_t id)) |
56 | { | 38 | { |
39 | cache_t *cp; | ||
57 | int i; | 40 | int i; |
41 | |||
42 | if (!cache_user_group) | ||
43 | cache_user_group = xzalloc(sizeof(cache_user_group[0]) * 2); | ||
44 | |||
45 | cp = &cache_user_group[user_group]; | ||
46 | |||
58 | for (i = 0; i < cp->size; i++) | 47 | for (i = 0; i < cp->size; i++) |
59 | if (cp->cache[i].id == id) | 48 | if (cp->cache[i].id == id) |
60 | return cp->cache[i].name; | 49 | return cp->cache[i].name; |
@@ -67,11 +56,11 @@ static char* get_cached(cache_t *cp, uid_t id, | |||
67 | } | 56 | } |
68 | const char* FAST_FUNC get_cached_username(uid_t uid) | 57 | const char* FAST_FUNC get_cached_username(uid_t uid) |
69 | { | 58 | { |
70 | return get_cached(&username, uid, uid2uname_utoa); | 59 | return get_cached(0, uid, uid2uname_utoa); |
71 | } | 60 | } |
72 | const char* FAST_FUNC get_cached_groupname(gid_t gid) | 61 | const char* FAST_FUNC get_cached_groupname(gid_t gid) |
73 | { | 62 | { |
74 | return get_cached(&groupname, gid, gid2group_utoa); | 63 | return get_cached(1, gid, gid2group_utoa); |
75 | } | 64 | } |
76 | 65 | ||
77 | 66 | ||