diff --git a/coreutils/ls.c b/coreutils/ls.c index ae28f6420..ff0831dac 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -291,7 +291,7 @@ static void dfree(struct dnode **dnp, int nfiles) free(dnp); /* free the array holding the dnode pointers */ } #else -#define dfree(...) do {} while (0) +#define dfree(...) ((void)0) #endif static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which) @@ -375,7 +375,7 @@ static void dnsort(struct dnode **dn, int size) qsort(dn, size, sizeof(*dn), sortcmp); } #else -#define dnsort(dn, size) do {} while (0) +#define dnsort(dn, size) ((void)0) #endif @@ -541,9 +541,6 @@ static int list_single(struct dnode *dn) { int i, column = 0; -#if ENABLE_FEATURE_LS_USERNAME - char scratch[16]; -#endif #if ENABLE_FEATURE_LS_TIMESTAMPS char *filetime; time_t ttime, age; @@ -584,10 +581,9 @@ static int list_single(struct dnode *dn) break; case LIST_ID_NAME: #if ENABLE_FEATURE_LS_USERNAME - bb_getpwuid(scratch, dn->dstat.st_uid, sizeof(scratch)); - printf("%-8.8s ", scratch); - bb_getgrgid(scratch, dn->dstat.st_gid, sizeof(scratch)); - printf("%-8.8s", scratch); + printf("%-8.8s %-8.8s", + get_cached_username(dn->dstat.st_uid), + get_cached_groupname(dn->dstat.st_gid)); column += 17; break; #endif diff --git a/include/libbb.h b/include/libbb.h index 7721cbf82..30d3006ad 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -223,7 +223,6 @@ struct sysinfo { extern int sysinfo(struct sysinfo* info); - extern void chomp(char *s); extern void trim(char *s); extern char *skip_whitespace(const char *); @@ -410,20 +409,26 @@ uint16_t xatou16(const char *numstr); /* These parse entries in /etc/passwd and /etc/group. This is desirable * for BusyBox since we want to avoid using the glibc NSS stuff, which * increases target size and is often not needed on embedded systems. */ -extern long xuname2uid(const char *name); -extern long xgroup2gid(const char *name); +long xuname2uid(const char *name); +long xgroup2gid(const char *name); /* wrapper: allows string to contain numeric uid or gid */ -extern unsigned long get_ug_id(const char *s, long (*xname2id)(const char *)); +unsigned long get_ug_id(const char *s, long (*xname2id)(const char *)); /* from chpst. Does not die, returns 0 on failure */ struct bb_uidgid_t { uid_t uid; gid_t gid; }; -extern int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok); +int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok); /* what is this? */ /*extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix);*/ -extern char *bb_getpwuid(char *name, long uid, int bufsize); -extern char *bb_getgrgid(char *group, long gid, int bufsize); +char *bb_getpwuid(char *name, long uid, int bufsize); +char *bb_getgrgid(char *group, long gid, int bufsize); +/* versions which cache results (useful for ps, ls etc) */ +const char* get_cached_username(uid_t uid); +const char* get_cached_groupname(gid_t gid); +void clear_username_cache(void); +/* internally usernames are saved in fixed-sized char[] buffers */ +enum { USERNAME_MAX_SIZE = 16 - sizeof(int) }; enum { BB_GETOPT_ERROR = 0x80000000 }; @@ -626,9 +631,6 @@ void free_procps_scan(procps_status_t* sp); procps_status_t* procps_scan(procps_status_t* sp, int flags); pid_t *find_pid_by_name(const char* procName); pid_t *pidlist_reverse(pid_t *pidList); -void clear_username_cache(void); -const char* get_cached_username(uid_t uid); -const char* get_cached_groupname(gid_t gid); extern const char bb_uuenc_tbl_base64[]; diff --git a/libbb/procps.c b/libbb/procps.c index a799bf927..e7635e5f4 100644 --- a/libbb/procps.c +++ b/libbb/procps.c @@ -13,7 +13,7 @@ typedef struct unsigned_to_name_map_t { unsigned id; - char name[12]; + char name[USERNAME_MAX_SIZE]; } unsigned_to_name_map_t; typedef struct cache_t { @@ -137,7 +137,7 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags) if (flags & PSSCAN_UIDGID) { if (stat(filename, &sb)) break; - /* Need comment - is this effective or read UID/GID? */ + /* Need comment - is this effective or real UID/GID? */ sp->uid = sb.st_uid; sp->gid = sb.st_gid; } @@ -209,7 +209,7 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags) if ((unsigned char)(buf[n]) < ' ') buf[n] = ' '; } while (n); - sp->cmd = strdup(buf); + sp->cmd = xstrdup(buf); } break; }