*
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
* Fix for SELinux Support:(c)2007 Hiroshi Shinji <shiroshi@my.email.ne.jp>
- (c)2007 Yuichi Nakamura <ynakam@hitachisoft.jp>
+ * (c)2007 Yuichi Nakamura <ynakam@hitachisoft.jp>
*
* Licensed under the GPL version 2, see the file LICENSE in this tarball.
*/
#if ENABLE_SELINUX
-#define SELINIX_O_PREFIX "label,"
-#define DEFAULT_O_STR (SELINIX_O_PREFIX "pid,user" USE_FEATURE_PS_TIME(",time") ",args")
+#define SELINUX_O_PREFIX "label,"
+#define DEFAULT_O_STR (SELINUX_O_PREFIX "pid,user" IF_FEATURE_PS_TIME(",time") ",args")
#else
-#define DEFAULT_O_STR ("pid,user" USE_FEATURE_PS_TIME(",time") ",args")
+#define DEFAULT_O_STR ("pid,user" IF_FEATURE_PS_TIME(",time") ",args")
#endif
typedef struct {
uint16_t width;
- char name[6];
+ char name6[6];
const char *header;
void (*f)(char *buf, int size, const procps_status_t *ps);
int ps_flags;
static void func_user(char *buf, int size, const procps_status_t *ps)
{
+#if 1
safe_strncpy(buf, get_cached_username(ps->uid), size+1);
+#else
+ /* "compatible" version, but it's larger */
+ /* procps 2.18 shows numeric UID if name overflows the field */
+ /* TODO: get_cached_username() returns numeric string if
+ * user has no passwd record, we will display it
+ * left-justified here; too long usernames are shown
+ * as _right-justified_ IDs. Is it worth fixing? */
+ const char *user = get_cached_username(ps->uid);
+ if (strlen(user) <= size)
+ safe_strncpy(buf, user, size+1);
+ else
+ sprintf(buf, "%*u", size, (unsigned)ps->uid);
+#endif
+}
+
+static void func_group(char *buf, int size, const procps_status_t *ps)
+{
+ safe_strncpy(buf, get_cached_groupname(ps->gid), size+1);
}
static void func_comm(char *buf, int size, const procps_status_t *ps)
static void put_lu(char *buf, int size, unsigned long u)
{
- char buf5[5];
+ char buf4[5];
/* see http://en.wikipedia.org/wiki/Tera */
- smart_ulltoa4(u, buf5, " mgtpezy");
- buf5[5] = '\0';
- sprintf(buf, "%.*s", size, buf5);
+ smart_ulltoa4(u, buf4, " mgtpezy");
+ buf4[4] = '\0';
+ sprintf(buf, "%.*s", size, buf4);
}
static void func_vsz(char *buf, int size, const procps_status_t *ps)
snprintf(buf, size+1, "%u,%u", ps->tty_major, ps->tty_minor);
}
+
+#if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
+
+static void func_rgroup(char *buf, int size, const procps_status_t *ps)
+{
+ safe_strncpy(buf, get_cached_groupname(ps->rgid), size+1);
+}
+
+static void func_ruser(char *buf, int size, const procps_status_t *ps)
+{
+ safe_strncpy(buf, get_cached_username(ps->ruid), size+1);
+}
+
+static void func_nice(char *buf, int size, const procps_status_t *ps)
+{
+ sprintf(buf, "%*d", size, ps->niceness);
+}
+
+#endif /* FEATURE_PS_ADDITIONAL_COLUMNS */
+
#if ENABLE_FEATURE_PS_TIME
static void func_etime(char *buf, int size, const procps_status_t *ps)
{
static const ps_out_t out_spec[] = {
// Mandated by POSIX:
{ 8 , "user" ,"USER" ,func_user ,PSSCAN_UIDGID },
+ { 8 , "group" ,"GROUP" ,func_group ,PSSCAN_UIDGID },
{ 16 , "comm" ,"COMMAND",func_comm ,PSSCAN_COMM },
{ 256 , "args" ,"COMMAND",func_args ,PSSCAN_COMM },
{ 5 , "pid" ,"PID" ,func_pid ,PSSCAN_PID },
#if ENABLE_FEATURE_PS_TIME
{ sizeof("ELAPSED")-1, "etime" ,"ELAPSED",func_etime ,PSSCAN_START_TIME },
#endif
-// { sizeof("GROUP" )-1, "group" ,"GROUP" ,func_group ,PSSCAN_UIDGID },
-// { sizeof("NI" )-1, "nice" ,"NI" ,func_nice ,PSSCAN_ },
-// { sizeof("%CPU" )-1, "pcpu" ,"%CPU" ,func_pcpu ,PSSCAN_ },
-// { sizeof("RGROUP" )-1, "rgroup","RGROUP" ,func_rgroup,PSSCAN_UIDGID },
-// { sizeof("RUSER" )-1, "ruser" ,"RUSER" ,func_ruser ,PSSCAN_UIDGID },
+#if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
+ { 5 , "nice" ,"NI" ,func_nice ,PSSCAN_NICE },
+ { 8 , "rgroup","RGROUP" ,func_rgroup,PSSCAN_RUIDGID },
+ { 8 , "ruser" ,"RUSER" ,func_ruser ,PSSCAN_RUIDGID },
+// { 5 , "pcpu" ,"%CPU" ,func_pcpu ,PSSCAN_ },
+#endif
#if ENABLE_FEATURE_PS_TIME
{ 6 , "time" ,"TIME" ,func_time ,PSSCAN_STIME | PSSCAN_UTIME },
#endif
static ps_out_t* new_out_t(void)
{
- int i = out_cnt++;
- out = xrealloc(out, out_cnt * sizeof(*out));
- return &out[i];
+ out = xrealloc_vector(out, 2, out_cnt);
+ return &out[out_cnt++];
}
static const ps_out_t* find_out_spec(const char *name)
{
- int i;
+ unsigned i;
for (i = 0; i < ARRAY_SIZE(out_spec); i++) {
- if (!strcmp(name, out_spec[i].name))
+ if (!strncmp(name, out_spec[i].name6, 6))
return &out_spec[i];
}
bb_error_msg_and_die("bad -o argument '%s'", name);
}
int ps_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int ps_main(int argc, char **argv)
+int ps_main(int argc UNUSED_PARAM, char **argv)
{
procps_status_t *p;
llist_t* opt_o = NULL;
- USE_SELINUX(int opt;)
+ IF_SELINUX(int opt;)
// POSIX:
// -a Write information for all processes associated with terminals
// Select which columns to display
/* We allow (and ignore) most of the above. FIXME */
opt_complementary = "o::";
- USE_SELINUX(opt =) getopt32(argv, "Zo:aAdefl", &opt_o);
+ IF_SELINUX(opt =) getopt32(argv, "Zo:aAdefl", &opt_o);
if (opt_o) {
do {
- parse_o(opt_o->data);
- opt_o = opt_o->link;
+ parse_o(llist_pop(&opt_o));
} while (opt_o);
} else {
/* Below: parse_o() needs char*, NOT const char*... */
#if ENABLE_SELINUX
if (!(opt & 1) || !is_selinux_enabled()) {
/* no -Z or no SELinux: do not show LABEL */
- strcpy(default_o, DEFAULT_O_STR + sizeof(SELINIX_O_PREFIX)-1);
+ strcpy(default_o, DEFAULT_O_STR + sizeof(SELINUX_O_PREFIX)-1);
} else
#endif
{
int ps_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int ps_main(int argc, char **argv)
+int ps_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
{
procps_status_t *p = NULL;
int len;
- SKIP_SELINUX(const) int use_selinux = 0;
- USE_SELINUX(int i;)
+ IF_NOT_SELINUX(const) int use_selinux = 0;
+ IF_SELINUX(int i;)
#if !ENABLE_FEATURE_PS_WIDE
enum { terminal_width = 79 };
#else
- int terminal_width;
+ unsigned terminal_width;
int w_count = 0;
#endif
#if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX
#if ENABLE_FEATURE_PS_WIDE
opt_complementary = "-:ww";
- USE_SELINUX(i =) getopt32(argv, USE_SELINUX("Z") "w", &w_count);
+ IF_SELINUX(i =) getopt32(argv, IF_SELINUX("Z") "w", &w_count);
/* if w is given once, GNU ps sets the width to 132,
* if w is given more than once, it is "unlimited"
*/