diff options
-rw-r--r-- | toys/pending/ps.c | 105 |
1 files changed, 56 insertions, 49 deletions
diff --git a/toys/pending/ps.c b/toys/pending/ps.c index fddf2f3f..f6680bf7 100644 --- a/toys/pending/ps.c +++ b/toys/pending/ps.c @@ -2,6 +2,7 @@ * * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com> * Copyright 2013 Kyungwan Han <asura321@gmail.com> + * * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html USE_PS(NEWTOY(ps, ">0o*T", TOYFLAG_BIN)) @@ -13,9 +14,11 @@ config PS usage: ps [-o COL1,COL2=HEADER] [-T] Show list of processes + -o COL1,COL2=HEADER Select columns for display -T Show threads */ + #define FOR_ps #include "toys.h" @@ -34,26 +37,6 @@ struct header_list { struct header_list *next; }; -struct header_list def_header[] = { - {"user", "USER", "%-*s ", 8, 0, NULL}, - {"group", "GROUP", "%-*s ", 8, 1, NULL}, - {"comm", "COMMAND", "%-*s ",16, 2, NULL}, - {"args", "COMMAND", "%-*s ",30, 3, NULL}, - {"pid", "PID", "%*s ", 5, 4, NULL}, - {"ppid","PPID", "%*s ", 5, 5, NULL}, - {"pgid", "PGID", "%*s ", 5, 6, NULL}, - {"etime","ELAPSED", "%*s ", 7, 7, NULL}, - {"nice", "NI", "%*s ", 5, 8, NULL}, - {"rgroup","RGROUP", "%-*s ", 8, 9, NULL}, - {"ruser","RUSER", "%-*s ", 8, 10, NULL}, - {"time", "TIME", "%*s ", 6, 11, NULL}, - {"tty", "TT", "%-*s ", 6, 12, NULL}, - {"vsz","VSZ", "%*s ", 7, 13, NULL}, - {"stat", "STAT", "%-*s ", 4, 14, NULL}, - {"rss", "RSS", "%*s ", 4, 15, NULL}, - {NULL, NULL, NULL, 0, 0, NULL}, -}; - struct header_list *o_list = NULL; //List of Header attributes. /* @@ -73,66 +56,67 @@ static void list_add(struct header_list **list, struct header_list *data, char * new->position = data->position; if (temp) { - while (temp->next != NULL) temp = temp->next; + while (temp->next) temp = temp->next; temp->next = new; - } else (*list) = new; + } else *list = new; } //print the default header OR header with -o args -static void print_header(void) +static void print_header(struct header_list *hdr, int hdr_len) { int i = 0; char *ptr = NULL, *str, *temp; struct arg_list *node = TT.llist_o; - if (!(toys.optflags & FLAG_o)) { - xprintf(" PID"" ""USER"" "" TIME"" ""COMMAND"); - list_add(&o_list, &def_header[4], NULL); //pid - list_add(&o_list, &def_header[0], NULL); //user - list_add(&o_list, &def_header[11], NULL); //time - list_add(&o_list, &def_header[3], NULL); //comm - xputc('\n'); - return ; + // Default pid, user, time, comm + if (!node) { + list_add(&o_list, hdr+4, 0); + list_add(&o_list, hdr, 0); + list_add(&o_list, hdr+11, 0); + list_add(&o_list, hdr+3, 0); } + while (node) { + char *s = str = xstrdup(node->arg); + i = 0; - str = xstrdup(node->arg); while (str) { if ((ptr = strsep(&str, ","))) { //seprate list if ((temp = strchr(ptr, '='))) { // Handle ppid = MOM *temp = 0; temp++; - while (def_header[i].name) { - if (!(strcmp(def_header[i].name, ptr))) { // search from default header - if (str) ptr = xmprintf("%s,%s", temp, str); //handle condition like ppid = M,OM + while (hdr[i].name) { + // search from default header + if (!(strcmp(hdr[i].name, ptr))) { + //handle condition like ppid = M,OM + if (str) ptr = xmprintf("%s,%s", temp, str); else ptr = xmprintf("%s", temp); - list_add(&o_list, &def_header[i], ptr); + list_add(&o_list, &hdr[i], ptr); break; } i++; } - if (!def_header[i].name) perror_exit("Invalid arg for -o option"); + if (!hdr[i].name) perror_exit("Invalid arg for -o option"); break; } else { - while (def_header[i].name) { - if (!(strcmp(def_header[i].name, ptr))) { - list_add(&o_list, &def_header[i], NULL); + while (hdr[i].name) { + if (!(strcmp(hdr[i].name, ptr))) { + list_add(&o_list, &hdr[i], 0); break; } i++; } - if (!def_header[i].name) perror_exit("Invalid arg for -o option"); + if (!hdr[i].name) error_exit("bad -o"); i = 0; } } } + free(s); node = node->next; } - struct header_list *p = o_list; - while (p) { //print Header - printf(p->format , p->width, p->header); - p = p->next; - } + + for (hdr = o_list; hdr; hdr = hdr->next) + printf(hdr->format , hdr->width, hdr->header); xputc('\n'); } @@ -140,6 +124,7 @@ static void print_header(void) static void get_uid_gid(char *p, char *id_str, unsigned *id) { FILE *f; + if(!p) return; f = xfopen(p, "r"); while (fgets(toybuf, BUFF_SIZE, f)) { @@ -158,6 +143,7 @@ void get_etime(unsigned long s_time) unsigned sec; struct sysinfo info; char *temp; + sysinfo(&info); min = s_time/sysconf(_SC_CLK_TCK); min = info.uptime - min; @@ -174,6 +160,7 @@ void get_time(unsigned long s_time, unsigned long u_time) unsigned long min; unsigned sec; char *temp; + min = (s_time + u_time)/sysconf(_SC_CLK_TCK); sec = min % 60; min = min / 60; @@ -188,7 +175,8 @@ void get_time(unsigned long s_time, unsigned long u_time) */ static void read_cmdline(int fd, char *cmd_ptr) { - int size = read(fd, cmd_ptr, 1024); //sizeof(cmd_buf) + int size = read(fd, cmd_ptr, BUFF_SIZE); //sizeof(cmd_buf) + cmd_ptr[size] = '\0'; while (--size > 0 && cmd_ptr[size] == '\0'); //reach to last char @@ -204,7 +192,7 @@ static void read_cmdline(int fd, char *cmd_ptr) */ static void do_ps_line(int pid, int tid) { - char *stat_buff = toybuf + 1024, *cmd_buff = toybuf + 2048; + char *stat_buff = toybuf + BUFF_SIZE, *cmd_buff = toybuf + (2*BUFF_SIZE); char state[4] = {0,}; int tty, tty_major, tty_minor, fd, n, nice, width_counter = 0; struct stat stats; @@ -392,10 +380,29 @@ void ps_main(void) DIR *dp; struct dirent *entry; int pid; + struct header_list def_header[] = { + {"user", "USER", "%-*s ", 8, 0, NULL}, + {"group", "GROUP", "%-*s ", 8, 1, NULL}, + {"comm", "COMMAND", "%-*s ",16, 2, NULL}, + {"args", "COMMAND", "%-*s ",30, 3, NULL}, + {"pid", "PID", "%*s ", 5, 4, NULL}, + {"ppid","PPID", "%*s ", 5, 5, NULL}, + {"pgid", "PGID", "%*s ", 5, 6, NULL}, + {"etime","ELAPSED", "%*s ", 7, 7, NULL}, + {"nice", "NI", "%*s ", 5, 8, NULL}, + {"rgroup","RGROUP", "%-*s ", 8, 9, NULL}, + {"ruser","RUSER", "%-*s ", 8, 10, NULL}, + {"time", "TIME", "%*s ", 6, 11, NULL}, + {"tty", "TT", "%-*s ", 6, 12, NULL}, + {"vsz","VSZ", "%*s ", 7, 13, NULL}, + {"stat", "STAT", "%-*s ", 4, 14, NULL}, + {"rss", "RSS", "%*s ", 4, 15, NULL}, +{0,0,0,0,0,0} + }; TT.screen_width = 80; //default width terminal_size(&TT.screen_width, NULL); - print_header(); + print_header(def_header, ARRAY_LEN(def_header)); if (!(dp = opendir("/proc"))) perror_exit("opendir"); while ((entry = readdir(dp))) { |