Changeset View
Changeset View
Standalone View
Standalone View
head/usr.bin/procstat/procstat.c
Show First 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | |||||
static void cmdopt_none(int argc, char * const argv[]); | static void cmdopt_none(int argc, char * const argv[]); | ||||
static void cmdopt_verbose(int argc, char * const argv[]); | static void cmdopt_verbose(int argc, char * const argv[]); | ||||
static void cmdopt_signals(int argc, char * const argv[]); | static void cmdopt_signals(int argc, char * const argv[]); | ||||
static void cmdopt_rusage(int argc, char * const argv[]); | static void cmdopt_rusage(int argc, char * const argv[]); | ||||
static void cmdopt_files(int argc, char * const argv[]); | static void cmdopt_files(int argc, char * const argv[]); | ||||
static void cmdopt_cpuset(int argc, char * const argv[]); | static void cmdopt_cpuset(int argc, char * const argv[]); | ||||
static const char *progname; | |||||
/* aliased program parameters and arguments | |||||
* - usage field is abused to hold the pointer to the function | |||||
* displaying program usage | |||||
*/ | |||||
static const struct procstat_cmd pacmd_table[] = { | |||||
/* arguments are the same as for pwdx: pid or core file */ | |||||
{ "pargs", "args", NULL, &procstat_pargs, &cmdopt_none, | |||||
PS_CMP_NORMAL | PS_MODE_COMPAT }, | |||||
{ "penv", "env", NULL, &procstat_penv, &cmdopt_none, | |||||
PS_CMP_NORMAL | PS_MODE_COMPAT }, | |||||
{ "pwdx", "pwd", NULL, &procstat_pwdx, &cmdopt_none, | |||||
PS_CMP_NORMAL | PS_MODE_COMPAT } | |||||
}; | |||||
/* procstat parameters and arguments */ | |||||
static const struct procstat_cmd cmd_table[] = { | static const struct procstat_cmd cmd_table[] = { | ||||
{ "argument", "arguments", NULL, &procstat_args, &cmdopt_none, | { "argument", "arguments", NULL, &procstat_args, &cmdopt_none, | ||||
PS_CMP_PLURAL | PS_CMP_SUBSTR }, | PS_CMP_PLURAL | PS_CMP_SUBSTR }, | ||||
{ "auxv", "auxv", NULL, &procstat_auxv, &cmdopt_none, PS_CMP_NORMAL }, | { "auxv", "auxv", NULL, &procstat_auxv, &cmdopt_none, PS_CMP_NORMAL }, | ||||
{ "basic", "basic", NULL, &procstat_basic, &cmdopt_none, | { "basic", "basic", NULL, &procstat_basic, &cmdopt_none, | ||||
PS_CMP_NORMAL }, | PS_CMP_NORMAL }, | ||||
{ "binary", "binary", NULL, &procstat_bin, &cmdopt_none, | { "binary", "binary", NULL, &procstat_bin, &cmdopt_none, | ||||
PS_CMP_SUBSTR }, | PS_CMP_SUBSTR }, | ||||
{ "cpuset", "cs", NULL, &procstat_cs, &cmdopt_cpuset, PS_CMP_NORMAL }, | { "cpuset", "cs", NULL, &procstat_cs, &cmdopt_cpuset, PS_CMP_NORMAL }, | ||||
{ "cs", "cs", NULL, &procstat_cs, &cmdopt_cpuset, PS_CMP_NORMAL }, | { "cs", "cs", NULL, &procstat_cs, &cmdopt_cpuset, PS_CMP_NORMAL }, | ||||
{ "credential", "credentials", NULL, &procstat_cred, &cmdopt_none, | { "credential", "credentials", NULL, &procstat_cred, &cmdopt_none, | ||||
PS_CMP_PLURAL | PS_CMP_SUBSTR }, | PS_CMP_PLURAL | PS_CMP_SUBSTR }, | ||||
{ "environment", "environment", NULL, &procstat_env, &cmdopt_none, | { "environment", "environment", NULL, &procstat_env, &cmdopt_none, | ||||
PS_CMP_SUBSTR }, | PS_CMP_SUBSTR }, | ||||
{ "fd", "files", "[-C]", &procstat_files, &cmdopt_files, | { "fd", "files", "[-C]", &procstat_files, &cmdopt_files, | ||||
PS_CMP_PLURAL }, | PS_CMP_PLURAL }, | ||||
{ "file", "files", "[-C]", &procstat_files, &cmdopt_files, | { "file", "files", "[-C]", &procstat_files, &cmdopt_files, | ||||
PS_CMP_PLURAL }, | PS_CMP_PLURAL }, | ||||
{ "kstack", "kstack", "[-v]", &procstat_kstack, &cmdopt_verbose, | { "kstack", "kstack", "[-v]", &procstat_kstack, &cmdopt_verbose, | ||||
PS_CMP_NORMAL }, | PS_CMP_NORMAL }, | ||||
{ "pargs", "args", NULL, &procstat_pargs, &cmdopt_none, | |||||
PS_CMP_NORMAL }, | |||||
{ "penv", "env", NULL, &procstat_penv, &cmdopt_none, | |||||
PS_CMP_NORMAL }, | |||||
{ "ptlwpinfo", "ptlwpinfo", NULL, &procstat_ptlwpinfo, &cmdopt_none, | { "ptlwpinfo", "ptlwpinfo", NULL, &procstat_ptlwpinfo, &cmdopt_none, | ||||
PS_CMP_NORMAL }, | PS_CMP_NORMAL }, | ||||
{ "pwdx", "pwd", NULL, &procstat_pwdx, &cmdopt_none, | |||||
PS_CMP_NORMAL }, | |||||
{ "rlimit", "rlimit", NULL, &procstat_rlimit, &cmdopt_none, | { "rlimit", "rlimit", NULL, &procstat_rlimit, &cmdopt_none, | ||||
PS_CMP_NORMAL }, | PS_CMP_NORMAL }, | ||||
{ "rusage", "rusage", "[-Ht]", &procstat_rusage, &cmdopt_rusage, | { "rusage", "rusage", "[-Ht]", &procstat_rusage, &cmdopt_rusage, | ||||
PS_CMP_NORMAL }, | PS_CMP_NORMAL }, | ||||
{ "sigfastblock", "sigfastblock", NULL, &procstat_sigfastblock, | { "sigfastblock", "sigfastblock", NULL, &procstat_sigfastblock, | ||||
&cmdopt_none, PS_CMP_NORMAL }, | &cmdopt_none, PS_CMP_NORMAL }, | ||||
{ "signal", "signals", "[-n]", &procstat_sigs, &cmdopt_signals, | { "signal", "signals", "[-n]", &procstat_sigs, &cmdopt_signals, | ||||
PS_CMP_PLURAL | PS_CMP_SUBSTR }, | PS_CMP_PLURAL | PS_CMP_SUBSTR }, | ||||
{ "thread", "threads", NULL, &procstat_threads, &cmdopt_none, | { "thread", "threads", NULL, &procstat_threads, &cmdopt_none, | ||||
PS_CMP_PLURAL }, | PS_CMP_PLURAL }, | ||||
{ "tsignal", "thread_signals", "[-n]", &procstat_threads_sigs, | { "tsignal", "thread_signals", "[-n]", &procstat_threads_sigs, | ||||
&cmdopt_signals, PS_CMP_PLURAL | PS_CMP_SUBSTR }, | &cmdopt_signals, PS_CMP_PLURAL | PS_CMP_SUBSTR }, | ||||
{ "vm", "vm", NULL, &procstat_vm, &cmdopt_none, PS_CMP_NORMAL } | { "vm", "vm", NULL, &procstat_vm, &cmdopt_none, PS_CMP_NORMAL } | ||||
}; | }; | ||||
static void | static void | ||||
usage(void) | usage(const struct procstat_cmd *cmd) | ||||
{ | { | ||||
size_t i, l; | size_t i, l; | ||||
int multi; | int multi; | ||||
if (cmd == NULL || (cmd->cmp & PS_MODE_COMPAT) == 0) { | |||||
xo_error("usage: procstat [--libxo] [-h] [-M core] [-N system]" | xo_error("usage: procstat [--libxo] [-h] [-M core] [-N system]" | ||||
" [-w interval] command\n" | " [-w interval] command\n" | ||||
" [pid ... | core ...]\n" | " [pid ... | core ...]\n" | ||||
" procstat [--libxo] -a [-h] [-M core] [-N system] " | " procstat [--libxo] -a [-h] [-M core] [-N system] " | ||||
" [-w interval] command\n" | " [-w interval] command\n" | ||||
" procstat [--libxo] [-h] [-M core] [-N system]" | " procstat [--libxo] [-h] [-M core] [-N system]" | ||||
" [-w interval]\n" | " [-w interval]\n" | ||||
" [-S | -b | -c | -e | -f [-C] | -i [-n] | " | " [-S | -b | -c | -e | -f [-C] | -i [-n] | " | ||||
"-j [-n] | -k [-k] |\n" | "-j [-n] | -k [-k] |\n" | ||||
" -l | -r [-H] | -s | -t | -v | -x] " | " -l | -r [-H] | -s | -t | -v | -x] " | ||||
"[pid ... | core ...]\n" | "[pid ... | core ...]\n" | ||||
" procstat [--libxo] -a [-h] [-M core] [-N system]" | " procstat [--libxo] -a [-h] [-M core] [-N system]" | ||||
" [-w interval]\n" | " [-w interval]\n" | ||||
" [-S | -b | -c | -e | -f [-C] | -i [-n] | " | " [-S | -b | -c | -e | -f [-C] | -i [-n] | " | ||||
"-j [-n] | -k [-k] |\n" | "-j [-n] | -k [-k] |\n" | ||||
" -l | -r [-H] | -s | -t | -v | -x]\n" | " -l | -r [-H] | -s | -t | -v | -x]\n" | ||||
" procstat [--libxo] -L [-h] [-M core] [-N system] core ...\n" | " procstat [--libxo] -L [-h] [-M core] [-N system] core ...\n" | ||||
"Available commands:\n"); | "Available commands:\n"); | ||||
for (i = 0, l = nitems(cmd_table); i < l; i++) { | for (i = 0, l = nitems(cmd_table); i < l; i++) { | ||||
multi = i + 1 < l && cmd_table[i].cmd == cmd_table[i + 1].cmd; | multi = i + 1 < l && cmd_table[i].cmd == | ||||
cmd_table[i + 1].cmd; | |||||
xo_error(" %s%s%s", multi ? "[" : "", | xo_error(" %s%s%s", multi ? "[" : "", | ||||
cmd_table[i].command, (cmd_table[i].cmp & PS_CMP_PLURAL) ? | cmd_table[i].command, (cmd_table[i].cmp & | ||||
"(s)" : ""); | PS_CMP_PLURAL) ? "(s)" : ""); | ||||
for (; i + 1 < l && cmd_table[i].cmd == cmd_table[i + 1].cmd; | for (; i + 1 < l && cmd_table[i].cmd == | ||||
i++) | cmd_table[i + 1].cmd; i++) | ||||
xo_error(" | %s%s", cmd_table[i + 1].command, | xo_error(" | %s%s", cmd_table[i + 1].command, | ||||
(cmd_table[i].cmp & PS_CMP_PLURAL) ? "(s)" : ""); | (cmd_table[i].cmp & PS_CMP_PLURAL) ? | ||||
"(s)" : ""); | |||||
if (multi) | if (multi) | ||||
xo_error("]"); | xo_error("]"); | ||||
if (cmd_table[i].usage != NULL) | if (cmd_table[i].usage != NULL) | ||||
xo_error(" %s", cmd_table[i].usage); | xo_error(" %s", cmd_table[i].usage); | ||||
xo_error("\n"); | xo_error("\n"); | ||||
} | } | ||||
} else { | |||||
xo_error("usage: %s [--libxo] pid ...\n", progname); | |||||
} | |||||
xo_finish(); | xo_finish(); | ||||
exit(EX_USAGE); | exit(EX_USAGE); | ||||
} | } | ||||
static void | static void | ||||
procstat(const struct procstat_cmd *cmd, struct procstat *prstat, | procstat(const struct procstat_cmd *cmd, struct procstat *prstat, | ||||
struct kinfo_proc *kipp) | struct kinfo_proc *kipp) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | if (name[0] == '\0' || strcmp(kipp->ki_comm, name) == 0) { | ||||
name[0] = '-'; | name[0] = '-'; | ||||
name[1] = '\0'; | name[1] = '\0'; | ||||
} | } | ||||
return (name); | return (name); | ||||
} | } | ||||
static const struct procstat_cmd * | static const struct procstat_cmd * | ||||
getcmdbyprogname(const char *pprogname) | |||||
{ | |||||
const char *ca; | |||||
size_t i, len; | |||||
if (pprogname == NULL) | |||||
return (NULL); | |||||
len = strlen(pprogname); | |||||
for (i = 0; i < nitems(pacmd_table); i++) { | |||||
ca = pacmd_table[i].command; | |||||
if (ca != NULL && strcmp(ca, pprogname) == 0) | |||||
return (&pacmd_table[i]); | |||||
} | |||||
return (NULL); | |||||
} | |||||
static const struct procstat_cmd * | |||||
getcmd(const char *str) | getcmd(const char *str) | ||||
{ | { | ||||
const struct procstat_cmd *cmd; | const struct procstat_cmd *cmd; | ||||
size_t i, l; | size_t i, l; | ||||
int cmp, s; | int cmp, s; | ||||
if (str == NULL) | if (str == NULL) | ||||
return (NULL); | return (NULL); | ||||
Show All 18 Lines | if (cmp == 0) | ||||
cmd = &cmd_table[i]; | cmd = &cmd_table[i]; | ||||
} | } | ||||
return (cmd); | return (cmd); | ||||
} | } | ||||
int | int | ||||
main(int argc, char *argv[]) | main(int argc, char *argv[]) | ||||
{ | { | ||||
int ch, interval; | |||||
int i; | |||||
struct kinfo_proc *p; | struct kinfo_proc *p; | ||||
const struct procstat_cmd *cmd; | const struct procstat_cmd *cmd; | ||||
struct procstat *prstat, *cprstat; | struct procstat *prstat, *cprstat; | ||||
char *dummy, *nlistf, *memf; | |||||
const char *xocontainer; | |||||
long l; | long l; | ||||
pid_t pid; | pid_t pid; | ||||
char *dummy; | int aflag, ch, cnt, i, interval; | ||||
char *nlistf, *memf; | |||||
int aflag; | |||||
int cnt; | |||||
interval = 0; | interval = 0; | ||||
cmd = NULL; | cmd = NULL; | ||||
memf = nlistf = NULL; | memf = nlistf = NULL; | ||||
aflag = 0; | aflag = 0; | ||||
argc = xo_parse_args(argc, argv); | argc = xo_parse_args(argc, argv); | ||||
progname = getprogname(); | |||||
cmd = getcmdbyprogname(progname); | |||||
while ((ch = getopt(argc, argv, "abCcefHhijkLlM:N:nrSstvw:x")) != -1) { | while ((ch = getopt(argc, argv, "abCcefHhijkLlM:N:nrSstvw:x")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case 'a': | case 'a': | ||||
aflag++; | aflag++; | ||||
break; | break; | ||||
case 'b': | case 'b': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("binary"); | cmd = getcmd("binary"); | ||||
break; | break; | ||||
case 'C': | case 'C': | ||||
procstat_opts |= PS_OPT_CAPABILITIES; | procstat_opts |= PS_OPT_CAPABILITIES; | ||||
break; | break; | ||||
case 'c': | case 'c': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("arguments"); | cmd = getcmd("arguments"); | ||||
break; | break; | ||||
case 'e': | case 'e': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("environment"); | cmd = getcmd("environment"); | ||||
break; | break; | ||||
case 'f': | case 'f': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("files"); | cmd = getcmd("files"); | ||||
break; | break; | ||||
case 'H': | case 'H': | ||||
procstat_opts |= PS_OPT_PERTHREAD; | procstat_opts |= PS_OPT_PERTHREAD; | ||||
break; | break; | ||||
case 'h': | case 'h': | ||||
procstat_opts |= PS_OPT_NOHEADER; | procstat_opts |= PS_OPT_NOHEADER; | ||||
break; | break; | ||||
case 'i': | case 'i': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("signals"); | cmd = getcmd("signals"); | ||||
break; | break; | ||||
case 'j': | case 'j': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("tsignals"); | cmd = getcmd("tsignals"); | ||||
break; | break; | ||||
case 'k': | case 'k': | ||||
if (cmd != NULL && cmd->cmd == procstat_kstack) { | if (cmd != NULL && cmd->cmd == procstat_kstack) { | ||||
if ((procstat_opts & PS_OPT_VERBOSE) != 0) | if ((procstat_opts & PS_OPT_VERBOSE) != 0) | ||||
usage(); | usage(cmd); | ||||
procstat_opts |= PS_OPT_VERBOSE; | procstat_opts |= PS_OPT_VERBOSE; | ||||
} else { | } else { | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("kstack"); | cmd = getcmd("kstack"); | ||||
} | } | ||||
break; | break; | ||||
case 'L': | case 'L': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("ptlwpinfo"); | cmd = getcmd("ptlwpinfo"); | ||||
break; | break; | ||||
case 'l': | case 'l': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("rlimit"); | cmd = getcmd("rlimit"); | ||||
break; | break; | ||||
case 'M': | case 'M': | ||||
memf = optarg; | memf = optarg; | ||||
break; | break; | ||||
case 'N': | case 'N': | ||||
nlistf = optarg; | nlistf = optarg; | ||||
break; | break; | ||||
case 'n': | case 'n': | ||||
procstat_opts |= PS_OPT_SIGNUM; | procstat_opts |= PS_OPT_SIGNUM; | ||||
break; | break; | ||||
case 'r': | case 'r': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("rusage"); | cmd = getcmd("rusage"); | ||||
break; | break; | ||||
case 'S': | case 'S': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("cpuset"); | cmd = getcmd("cpuset"); | ||||
break; | break; | ||||
case 's': | case 's': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("credentials"); | cmd = getcmd("credentials"); | ||||
break; | break; | ||||
case 't': | case 't': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("threads"); | cmd = getcmd("threads"); | ||||
break; | break; | ||||
case 'v': | case 'v': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("vm"); | cmd = getcmd("vm"); | ||||
break; | break; | ||||
case 'w': | case 'w': | ||||
l = strtol(optarg, &dummy, 10); | l = strtol(optarg, &dummy, 10); | ||||
if (*dummy != '\0') | if (*dummy != '\0') | ||||
usage(); | usage(cmd); | ||||
if (l < 1 || l > INT_MAX) | if (l < 1 || l > INT_MAX) | ||||
usage(); | usage(cmd); | ||||
interval = l; | interval = l; | ||||
break; | break; | ||||
case 'x': | case 'x': | ||||
if (cmd != NULL) | if (cmd != NULL) | ||||
usage(); | usage(cmd); | ||||
cmd = getcmd("auxv"); | cmd = getcmd("auxv"); | ||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
usage(); | usage(cmd); | ||||
} | } | ||||
} | } | ||||
argc -= optind; | argc -= optind; | ||||
argv += optind; | argv += optind; | ||||
if (cmd == NULL && argv[0] != NULL && (cmd = getcmd(argv[0])) != NULL) { | if (cmd == NULL && argv[0] != NULL) | ||||
cmd = getcmd(argv[0]); | |||||
if (cmd != NULL) { | |||||
if ((procstat_opts & PS_SUBCOMMAND_OPTS) != 0) | if ((procstat_opts & PS_SUBCOMMAND_OPTS) != 0) | ||||
usage(); | usage(cmd); | ||||
if (cmd->opt != NULL) { | if (cmd->opt != NULL) { | ||||
optreset = 1; | optreset = 1; | ||||
optind = 1; | optind = 1; | ||||
cmd->opt(argc, argv); | cmd->opt(argc, argv); | ||||
if ((cmd->cmp & PS_MODE_COMPAT) == 0) { | |||||
argc -= optind; | argc -= optind; | ||||
argv += optind; | argv += optind; | ||||
} | |||||
} else { | } else { | ||||
argc -= 1; | argc -= 1; | ||||
argv += 1; | argv += 1; | ||||
} | } | ||||
} else { | } else { | ||||
if (cmd == NULL) | |||||
cmd = getcmd("basic"); | cmd = getcmd("basic"); | ||||
if (cmd->cmd != procstat_files && | |||||
(procstat_opts & PS_OPT_CAPABILITIES) != 0) | |||||
usage(); | |||||
} | } | ||||
if (cmd->cmd != procstat_files && | |||||
(procstat_opts & PS_OPT_CAPABILITIES) != 0 && | |||||
(cmd->cmp & PS_MODE_COMPAT) == 0) | |||||
usage(cmd); | |||||
/* Must specify either the -a flag or a list of pids. */ | /* Must specify either the -a flag or a list of pids. */ | ||||
if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0)) | if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0)) | ||||
usage(); | usage(cmd); | ||||
if (memf != NULL) | if (memf != NULL) | ||||
prstat = procstat_open_kvm(nlistf, memf); | prstat = procstat_open_kvm(nlistf, memf); | ||||
else | else | ||||
prstat = procstat_open_sysctl(); | prstat = procstat_open_sysctl(); | ||||
if (prstat == NULL) | if (prstat == NULL) | ||||
xo_errx(1, "procstat_open()"); | xo_errx(1, "procstat_open()"); | ||||
do { | do { | ||||
xocontainer = cmd->xocontainer != NULL ? cmd->xocontainer : | |||||
cmd->command; | |||||
xo_set_version(PROCSTAT_XO_VERSION); | xo_set_version(PROCSTAT_XO_VERSION); | ||||
xo_open_container("procstat"); | xo_open_container(progname); | ||||
xo_open_container(cmd->xocontainer); | xo_open_container(xocontainer); | ||||
if (aflag) { | if (aflag) { | ||||
p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt); | p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt); | ||||
if (p == NULL) | if (p == NULL) | ||||
xo_errx(1, "procstat_getprocs()"); | xo_errx(1, "procstat_getprocs()"); | ||||
kinfo_proc_sort(p, cnt); | kinfo_proc_sort(p, cnt); | ||||
for (i = 0; i < cnt; i++) { | for (i = 0; i < cnt; i++) { | ||||
procstat(cmd, prstat, &p[i]); | procstat(cmd, prstat, &p[i]); | ||||
/* Suppress header after first process. */ | /* Suppress header after first process. */ | ||||
procstat_opts |= PS_OPT_NOHEADER; | procstat_opts |= PS_OPT_NOHEADER; | ||||
xo_flush(); | xo_flush(); | ||||
} | } | ||||
procstat_freeprocs(prstat, p); | procstat_freeprocs(prstat, p); | ||||
} | } | ||||
for (i = 0; i < argc; i++) { | for (i = 0; i < argc; i++) { | ||||
l = strtol(argv[i], &dummy, 10); | l = strtol(argv[i], &dummy, 10); | ||||
if (*dummy == '\0') { | if (*dummy == '\0') { | ||||
if (l < 0) | if (l < 0) | ||||
usage(); | usage(cmd); | ||||
pid = l; | pid = l; | ||||
p = procstat_getprocs(prstat, KERN_PROC_PID, | p = procstat_getprocs(prstat, KERN_PROC_PID, | ||||
pid, &cnt); | pid, &cnt); | ||||
if (p == NULL) | if (p == NULL) | ||||
xo_errx(1, "procstat_getprocs()"); | xo_errx(1, "procstat_getprocs()"); | ||||
if (cnt != 0) | if (cnt != 0) | ||||
procstat(cmd, prstat, p); | procstat(cmd, prstat, p); | ||||
procstat_freeprocs(prstat, p); | procstat_freeprocs(prstat, p); | ||||
} else { | } else { | ||||
if ((cmd->cmp & PS_MODE_COMPAT) == 0) { | |||||
cprstat = procstat_open_core(argv[i]); | cprstat = procstat_open_core(argv[i]); | ||||
if (cprstat == NULL) { | if (cprstat == NULL) { | ||||
warnx("procstat_open()"); | warnx("procstat_open()"); | ||||
continue; | continue; | ||||
} | } | ||||
p = procstat_getprocs(cprstat, KERN_PROC_PID, | p = procstat_getprocs(cprstat, | ||||
-1, &cnt); | KERN_PROC_PID, -1, &cnt); | ||||
if (p == NULL) | if (p == NULL) { | ||||
xo_errx(1, "procstat_getprocs()"); | xo_errx(1, | ||||
"procstat_getprocs()"); | |||||
} | |||||
if (cnt != 0) | if (cnt != 0) | ||||
procstat(cmd, cprstat, p); | procstat(cmd, cprstat, p); | ||||
procstat_freeprocs(cprstat, p); | procstat_freeprocs(cprstat, p); | ||||
procstat_close(cprstat); | procstat_close(cprstat); | ||||
} else { | |||||
usage(cmd); | |||||
} | } | ||||
} | |||||
if ((cmd->cmp & PS_MODE_COMPAT) == 0) { | |||||
/* Suppress header after first process. */ | /* Suppress header after first process. */ | ||||
procstat_opts |= PS_OPT_NOHEADER; | procstat_opts |= PS_OPT_NOHEADER; | ||||
} | } | ||||
} | |||||
xo_close_container(cmd->xocontainer); | xo_close_container(xocontainer); | ||||
xo_close_container("procstat"); | xo_close_container(progname); | ||||
xo_finish(); | xo_finish(); | ||||
if (interval) | if (interval) | ||||
sleep(interval); | sleep(interval); | ||||
} while (interval); | } while (interval); | ||||
procstat_close(prstat); | procstat_close(prstat); | ||||
exit(0); | exit(0); | ||||
} | } | ||||
void | void | ||||
cmdopt_none(int argc, char * const argv[]) | cmdopt_none(int argc, char * const argv[]) | ||||
{ | { | ||||
int ch; | int ch; | ||||
while ((ch = getopt(argc, argv, "")) != -1) { | while ((ch = getopt(argc, argv, "")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case '?': | case '?': | ||||
default: | default: | ||||
usage(); | usage(NULL); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void | void | ||||
cmdopt_verbose(int argc, char * const argv[]) | cmdopt_verbose(int argc, char * const argv[]) | ||||
{ | { | ||||
int ch; | int ch; | ||||
while ((ch = getopt(argc, argv, "v")) != -1) { | while ((ch = getopt(argc, argv, "v")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case 'v': | case 'v': | ||||
procstat_opts |= PS_OPT_VERBOSE; | procstat_opts |= PS_OPT_VERBOSE; | ||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
usage(); | usage(NULL); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void | void | ||||
cmdopt_signals(int argc, char * const argv[]) | cmdopt_signals(int argc, char * const argv[]) | ||||
{ | { | ||||
int ch; | int ch; | ||||
while ((ch = getopt(argc, argv, "n")) != -1) { | while ((ch = getopt(argc, argv, "n")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case 'n': | case 'n': | ||||
procstat_opts |= PS_OPT_SIGNUM; | procstat_opts |= PS_OPT_SIGNUM; | ||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
usage(); | usage(NULL); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void | void | ||||
cmdopt_rusage(int argc, char * const argv[]) | cmdopt_rusage(int argc, char * const argv[]) | ||||
{ | { | ||||
int ch; | int ch; | ||||
while ((ch = getopt(argc, argv, "Ht")) != -1) { | while ((ch = getopt(argc, argv, "Ht")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case 'H': | case 'H': | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
case 't': | case 't': | ||||
procstat_opts |= PS_OPT_PERTHREAD; | procstat_opts |= PS_OPT_PERTHREAD; | ||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
usage(); | usage(NULL); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void | void | ||||
cmdopt_files(int argc, char * const argv[]) | cmdopt_files(int argc, char * const argv[]) | ||||
{ | { | ||||
int ch; | int ch; | ||||
while ((ch = getopt(argc, argv, "C")) != -1) { | while ((ch = getopt(argc, argv, "C")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case 'C': | case 'C': | ||||
procstat_opts |= PS_OPT_CAPABILITIES; | procstat_opts |= PS_OPT_CAPABILITIES; | ||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
usage(); | usage(NULL); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void | void | ||||
cmdopt_cpuset(int argc, char * const argv[]) | cmdopt_cpuset(int argc, char * const argv[]) | ||||
{ | { | ||||
procstat_opts |= PS_OPT_PERTHREAD; | procstat_opts |= PS_OPT_PERTHREAD; | ||||
cmdopt_none(argc, argv); | cmdopt_none(argc, argv); | ||||
} | } |