+typedef char* FAST_FUNC ug_func(char *name, int bufsize, long uid);
+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_vector(cp->cache, 2, i);
+ cp->cache[i].id = id;
+ /* Never fails. Generates numeric string if name isn't found */
+ fp(cp->cache[i].name, sizeof(cp->cache[i].name), id);
+ return cp->cache[i].name;
+}
+const char* FAST_FUNC get_cached_username(uid_t uid)
+{
+ return get_cached(&username, uid, bb_getpwuid);
+}
+const char* FAST_FUNC 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)
+{
+ int fd;
+ /* open_read_close() would do two reads, checking for EOF.
+ * When you have 10000 /proc/$NUM/stat to read, it isn't desirable */
+ ssize_t ret = -1;
+ fd = open(filename, O_RDONLY);
+ if (fd >= 0) {
+ ret = read(fd, buf, PROCPS_BUFSIZE-1);
+ close(fd);
+ }
+ ((char *)buf)[ret > 0 ? ret : 0] = '\0';
+ return ret;
+}
+
+static procps_status_t* FAST_FUNC alloc_procps_scan(void)
+{
+ unsigned n = getpagesize();
+ procps_status_t* sp = xzalloc(sizeof(procps_status_t));
+ sp->dir = xopendir("/proc");
+ while (1) {
+ n >>= 1;
+ if (!n) break;
+ sp->shift_pages_to_bytes++;
+ }
+ sp->shift_pages_to_kb = sp->shift_pages_to_bytes - 10;
+ return sp;
+}
+
+void FAST_FUNC free_procps_scan(procps_status_t* sp)
+{
+ closedir(sp->dir);
+ free(sp->argv0);
+ USE_SELINUX(free(sp->context);)
+ free(sp);
+}
+
+#if ENABLE_FEATURE_TOPMEM
+static unsigned long fast_strtoul_16(char **endptr)
+{
+ unsigned char c;
+ char *str = *endptr;
+ unsigned long n = 0;
+
+ while ((c = *str++) != ' ') {
+ c = ((c|0x20) - '0');
+ if (c > 9)
+ // c = c + '0' - 'a' + 10:
+ c = c - ('a' - '0' - 10);
+ n = n*16 + c;
+ }
+ *endptr = str; /* We skip trailing space! */
+ return n;
+}
+/* TOPMEM uses fast_strtoul_10, so... */
+#undef ENABLE_FEATURE_FAST_TOP
+#define ENABLE_FEATURE_FAST_TOP 1