ps: new usage function
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
parent
3c77055c5e
commit
db6aea7d3f
12
ps/common.h
12
ps/common.h
@ -25,6 +25,16 @@
|
||||
|
||||
/***************** GENERAL DEFINE ********************/
|
||||
|
||||
/* usage output sections */
|
||||
enum {
|
||||
USAGE_DEFAULT,
|
||||
USAGE_ALL,
|
||||
USAGE_SELECTION,
|
||||
USAGE_LIST,
|
||||
USAGE_OUTPUT,
|
||||
USAGE_THREADS,
|
||||
USAGE_MISC
|
||||
};
|
||||
|
||||
/* selection list */
|
||||
#define SEL_RUID 1
|
||||
@ -326,7 +336,7 @@ extern int want_this_proc(proc_t *buf);
|
||||
extern const char *select_bits_setup(void);
|
||||
|
||||
/* help.c */
|
||||
extern const char *help_message;
|
||||
extern void __attribute__ ((__noreturn__)) usage(FILE * out, int section);
|
||||
|
||||
/* global.c */
|
||||
extern void self_info(void);
|
||||
|
123
ps/help.c
123
ps/help.c
@ -9,37 +9,102 @@
|
||||
* GNU Library General Public License for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The help message must not become longer, because it must fit
|
||||
* on an 80x24 screen _with_ the error message and command prompt.
|
||||
*/
|
||||
|
||||
const char *help_message =
|
||||
"********* simple selection ********* ********* selection by list *********\n"
|
||||
"-A all processes -C by command name\n"
|
||||
"-N negate selection -G by real group ID (supports names)\n"
|
||||
"-a all w/ tty except session leaders -U by real user ID (supports names)\n"
|
||||
"-d all except session leaders -g by session OR by effective group name\n"
|
||||
"-e all processes -p by process ID\n"
|
||||
"T all processes on this terminal -s processes in the sessions given\n"
|
||||
"a all w/ tty, including other users -t by tty\n"
|
||||
"g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)\n"
|
||||
"r only running processes U processes for specified users\n"
|
||||
"x processes w/o controlling ttys t by tty\n"
|
||||
"*********** output format ********** *********** long options ***********\n"
|
||||
"-o,o user-defined -f full --Group --User --pid --cols --ppid\n"
|
||||
"-j,j job control s signal --group --user --sid --rows --info\n"
|
||||
"-O,O preloaded -o v virtual memory --cumulative --format --deselect\n"
|
||||
"-l,l long u user-oriented --sort --tty --forest --version\n"
|
||||
"-F extra full X registers --heading --no-heading --context\n"
|
||||
" ********* misc options *********\n"
|
||||
"-V,V show version L list format codes f ASCII art forest\n"
|
||||
"-m,m,-L,-T,H threads S children in sum -y change -l format\n"
|
||||
"-M,Z security data c true command name -c scheduling class\n"
|
||||
"-w,w wide output n numeric WCHAN,UID -H process hierarchy\n"
|
||||
;
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void __attribute__ ((__noreturn__)) usage(FILE * out, int section)
|
||||
{
|
||||
fprintf(out,
|
||||
"\nUsage: %s [options]\n", program_invocation_short_name);
|
||||
if (section == USAGE_SELECTION || section == USAGE_ALL) {
|
||||
fprintf(out,
|
||||
"\nSimple options:\n"
|
||||
" -A all processes\n"
|
||||
" -N, --deselect negate selection\n"
|
||||
" -a all without tty and session leader\n"
|
||||
" -d all except session leader\n"
|
||||
" -e all processes\n"
|
||||
" T all processes on this terminal\n"
|
||||
" a all without tty, including other users\n"
|
||||
" g obsolete, do not use\n"
|
||||
" r only running processes\n"
|
||||
" x processes without controlling ttys\n");
|
||||
}
|
||||
if (section == USAGE_LIST || section == USAGE_ALL) {
|
||||
fprintf(out,
|
||||
"\nSelection by list:\n"
|
||||
" -C <command> command name\n"
|
||||
" U, -u, --user <uid> effective user id or name\n"
|
||||
" -U, --User <uid> real user id or name\n"
|
||||
" -G, --Group <gid> real group id or name\n"
|
||||
" -g, --group <group> session or effective group name\n"
|
||||
" -p, --pid <pid> process id\n"
|
||||
" --ppid <pid> select by parent process id\n"
|
||||
" -s, --sid <session> session id\n"
|
||||
" t, -t, --tty <tty> terminal\n"
|
||||
"\n selection <arguments> take csv list e.g. `-u root,nobody'\n");
|
||||
}
|
||||
if (section == USAGE_OUTPUT || section == USAGE_ALL) {
|
||||
fprintf(out,
|
||||
"\nOutput formats:\n"
|
||||
" o, -o, --format <format>"
|
||||
" user defined format\n"
|
||||
" O <format> preloaded -o allowing sorting\n"
|
||||
" -O <format> preloaded, with default columns, allowing sorting\n"
|
||||
" -j jobs format\n"
|
||||
" j BSD job control format\n"
|
||||
" -l long format\n"
|
||||
" l BSD long format\n"
|
||||
" y do not show flags, show rrs in place addr (used with -l)\n"
|
||||
" -f full-format\n"
|
||||
" -F extra full\n"
|
||||
" s signal format\n"
|
||||
" v virtual memory\n"
|
||||
" u user-oriented format\n"
|
||||
" X register format\n"
|
||||
" Z, -M security data (for SE Linux)\n"
|
||||
" f, --forest ascii art process tree\n"
|
||||
" -H show process hierarchy\n"
|
||||
" --context display security context (for SE Linux)\n"
|
||||
" --heading repeat header lines\n"
|
||||
" --no-headers do not print header at all\n"
|
||||
" --cols <num> set screen width\n"
|
||||
" --rows <num> set screen height\n");
|
||||
}
|
||||
if (section == USAGE_THREADS || section == USAGE_ALL) {
|
||||
fprintf(out,
|
||||
"\nShow threads:\n"
|
||||
" H as if they where processes\n"
|
||||
" -L possibly with LWP and NLWP columns\n"
|
||||
" -T possibly with SPID column\n"
|
||||
" m, -m after processes\n");
|
||||
}
|
||||
if (section == USAGE_MISC || section == USAGE_ALL) {
|
||||
fprintf(out,
|
||||
"\nMisc options:\n"
|
||||
" w, -w unlimited output width\n"
|
||||
" L list format codes\n"
|
||||
" c true command name\n"
|
||||
" n display numeric uid and wchan\n"
|
||||
" -y do not show flags, show rss (only with -l)\n"
|
||||
" -c show scheduling class\n"
|
||||
" --sort <spec> specify sort order, can be a csv list\n"
|
||||
" S, --cumulative include some dead child process data\n"
|
||||
" --info print debuggin information\n"
|
||||
" V,-V, --version display version information and exit\n"
|
||||
" --help <selection|list|output|threads|misc|all>\n"
|
||||
" display help\n");
|
||||
}
|
||||
if (section == USAGE_DEFAULT)
|
||||
fprintf(out,
|
||||
"\n Try `%s --help <selection|list|output|threads|misc|all>'\n"
|
||||
" for more information.\n", program_invocation_short_name);
|
||||
fprintf(out, "\nFor more information see ps(1).\n");
|
||||
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
/* Missing:
|
||||
*
|
||||
|
32
ps/parser.c
32
ps/parser.c
@ -162,6 +162,23 @@ found_it:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_usage_section(const char *opt)
|
||||
{
|
||||
if (!strcmp(opt, "s") || !strcmp(opt, "selection"))
|
||||
return USAGE_SELECTION;
|
||||
if (!strcmp(opt, "e") || !strcmp(opt, "list"))
|
||||
return USAGE_LIST;
|
||||
if (!strcmp(opt, "o") || !strcmp(opt, "output"))
|
||||
return USAGE_OUTPUT;
|
||||
if (!strcmp(opt, "t") || !strcmp(opt, "threads"))
|
||||
return USAGE_THREADS;
|
||||
if (!strcmp(opt, "m") || !strcmp(opt, "misc"))
|
||||
return USAGE_MISC;
|
||||
if (!strcmp(opt, "a") || !strcmp(opt, "all"))
|
||||
return USAGE_ALL;
|
||||
return USAGE_DEFAULT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used to parse lists in a generic way. (function pointers)
|
||||
*/
|
||||
@ -786,6 +803,7 @@ static const char *parse_gnu_option(void){
|
||||
char buf[16];
|
||||
gnu_table_struct findme = { buf, NULL};
|
||||
gnu_table_struct *found;
|
||||
int usage_section;
|
||||
static const gnu_table_struct gnu_table[] = {
|
||||
{"Group", &&case_Group}, /* rgid */
|
||||
{"User", &&case_User}, /* ruid */
|
||||
@ -923,10 +941,12 @@ static const char *parse_gnu_option(void){
|
||||
return NULL;
|
||||
case_help:
|
||||
trace("--help\n");
|
||||
exclusive("--help");
|
||||
fwrite(help_message,1,strlen(help_message),stdout);
|
||||
exit(0);
|
||||
return NULL;
|
||||
arg = grab_gnu_arg();
|
||||
if(!arg)
|
||||
usage_section = USAGE_DEFAULT;
|
||||
else
|
||||
usage_section = parse_usage_section(arg);
|
||||
usage(stdout, usage_section);
|
||||
case_info:
|
||||
trace("--info\n");
|
||||
exclusive("--info");
|
||||
@ -1256,7 +1276,5 @@ total_failure:
|
||||
reset_parser();
|
||||
if(personality & PER_FORCE_BSD) fprintf(stderr, "ERROR: %s\n", err2);
|
||||
else fprintf(stderr, "ERROR: %s\n", err);
|
||||
fwrite(help_message,1,strlen(help_message),stderr);
|
||||
exit(1);
|
||||
/* return 1; */ /* useless */
|
||||
usage(stderr, USAGE_DEFAULT);
|
||||
}
|
||||
|
12
ps/ps.1
12
ps/ps.1
@ -633,8 +633,16 @@ Show threads, possibly with SPID column.
|
||||
.SH "OTHER INFORMATION"
|
||||
.PD 0
|
||||
|
||||
.opt \-\-help
|
||||
Print a help message.
|
||||
.opt \-\-help \ section
|
||||
Print a help message. The section argument can be
|
||||
.IR selection ,
|
||||
.IR list ,
|
||||
.IR output ,
|
||||
.IR threads ,
|
||||
.IR misc
|
||||
or
|
||||
.IR all .
|
||||
Arguments can be shorthanded to first letter.
|
||||
|
||||
.opt \-\-info
|
||||
Print debugging info.
|
||||
|
Loading…
Reference in New Issue
Block a user