+
+typedef char* ug_func(char *name, long uid, int bufsize);
+static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
+{
+ int i;
+ for (i = 0; i < cp->size; i++)
+ if (cp->cache[i].id == id)
+ return cp->cache[i].name;
+ i = cp->size++;
+ cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache));
+ cp->cache[i].id = id;
+ fp(cp->cache[i].name, id, sizeof(cp->cache[i].name));
+ return cp->cache[i].name;
+}
+const char* get_cached_username(uid_t uid)
+{
+ return get_cached(&username, uid, bb_getpwuid);
+}
+const char* get_cached_groupname(gid_t gid)
+{
+ return get_cached(&groupname, gid, bb_getgrgid);
+}
+
+
+#define PROCPS_BUFSIZE 1024
+
+static int read_to_buf(const char *filename, void *buf)
+{
+ ssize_t ret;
+ ret = open_read_close(filename, buf, PROCPS_BUFSIZE-1);
+ ((char *)buf)[ret > 0 ? ret : 0] = '\0';
+ return ret;
+}
+
+procps_status_t* alloc_procps_scan(int flags)
+{
+ procps_status_t* sp = xzalloc(sizeof(procps_status_t));
+ sp->dir = xopendir("/proc");
+ return sp;
+}
+
+void free_procps_scan(procps_status_t* sp)
+{
+ closedir(sp->dir);
+ free(sp->cmd);
+ free(sp);
+}
+
+void BUG_comm_size(void);
+procps_status_t* procps_scan(procps_status_t* sp, int flags)