aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/procstat/procstat.c
diff options
context:
space:
mode:
authorAllan Jude <allanjude@FreeBSD.org>2015-09-05 17:02:01 +0000
committerAllan Jude <allanjude@FreeBSD.org>2015-09-05 17:02:01 +0000
commit474b62b876718890adf24759cc7c15fa5cb7778e (patch)
tree4806bed030076ad0f4a32b484130a17d3ddf5b58 /usr.bin/procstat/procstat.c
parent4569e7cfe25b562e09629471fc645262bc726f8c (diff)
downloadsrc-474b62b876718890adf24759cc7c15fa5cb7778e.tar.gz
src-474b62b876718890adf24759cc7c15fa5cb7778e.zip
Introduce libxo to procstat(1)
Reviewed by: rodrigc, bapt Approved by: marcel (mentor) Relnotes: yes Sponsored by: ScaleEngine Inc. Differential Revision: https://reviews.freebsd.org/D2446
Notes
Notes: svn path=/head/; revision=287486
Diffstat (limited to 'usr.bin/procstat/procstat.c')
-rw-r--r--usr.bin/procstat/procstat.c61
1 files changed, 51 insertions, 10 deletions
diff --git a/usr.bin/procstat/procstat.c b/usr.bin/procstat/procstat.c
index 48a2135180a2..cafb33525b27 100644
--- a/usr.bin/procstat/procstat.c
+++ b/usr.bin/procstat/procstat.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2007, 2011 Robert N. M. Watson
+ * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -47,17 +48,24 @@ static void
usage(void)
{
- fprintf(stderr, "usage: procstat [-CHhn] [-M core] [-N system] "
- "[-w interval] \n");
- fprintf(stderr, " [-b | -c | -e | -f | -i | -j | -k | "
- "-l | -r | -s | -S | -t | -v | -x]\n");
- fprintf(stderr, " [-a | pid | core ...]\n");
+ xo_error("usage: procstat [-CHhn] [-M core] [-N system] "
+ "[-w interval]\n"
+ " [-b | -c | -e | -f | -i | -j | -k | "
+ "-l | -r | -s | -S | -t | -v | -x]\n"
+ " [-a | pid | core ...]\n");
+ xo_finish();
exit(EX_USAGE);
}
static void
procstat(struct procstat *prstat, struct kinfo_proc *kipp)
{
+ char *pidstr = NULL;
+
+ asprintf(&pidstr, "%d", kipp->ki_pid);
+ if (pidstr == NULL)
+ xo_errc(1, ENOMEM, "Failed to allocate memory in procstat()");
+ xo_open_container(pidstr);
if (bflag)
procstat_bin(prstat, kipp);
@@ -89,6 +97,9 @@ procstat(struct procstat *prstat, struct kinfo_proc *kipp)
procstat_cs(prstat, kipp);
else
procstat_basic(kipp);
+
+ xo_close_container(pidstr);
+ free(pidstr);
}
/*
@@ -126,10 +137,14 @@ main(int argc, char *argv[])
pid_t pid;
char *dummy;
char *nlistf, *memf;
+ const char *xocontainer;
int cnt;
interval = 0;
memf = nlistf = NULL;
+ argc = xo_parse_args(argc, argv);
+ xocontainer = "basic";
+
while ((ch = getopt(argc, argv, "CHN:M:abcefijklhrsStvw:x")) != -1) {
switch (ch) {
case 'C':
@@ -148,6 +163,7 @@ main(int argc, char *argv[])
break;
case 'S':
Sflag++;
+ xocontainer = "cs";
break;
case 'a':
aflag++;
@@ -155,34 +171,42 @@ main(int argc, char *argv[])
case 'b':
bflag++;
+ xocontainer = "binary";
break;
case 'c':
cflag++;
+ xocontainer = "arguments";
break;
case 'e':
eflag++;
+ xocontainer = "environment";
break;
case 'f':
fflag++;
+ xocontainer = "files";
break;
case 'i':
iflag++;
+ xocontainer = "signals";
break;
case 'j':
jflag++;
+ xocontainer = "thread_signals";
break;
case 'k':
kflag++;
+ xocontainer = "kstack";
break;
case 'l':
lflag++;
+ xocontainer = "rlimit";
break;
case 'n':
@@ -195,18 +219,22 @@ main(int argc, char *argv[])
case 'r':
rflag++;
+ xocontainer = "rusage";
break;
case 's':
sflag++;
+ xocontainer = "credentials";
break;
case 't':
tflag++;
+ xocontainer = "threads";
break;
case 'v':
vflag++;
+ xocontainer = "vm";
break;
case 'w':
@@ -220,6 +248,7 @@ main(int argc, char *argv[])
case 'x':
xflag++;
+ xocontainer = "auxv";
break;
case '?':
@@ -254,18 +283,23 @@ main(int argc, char *argv[])
else
prstat = procstat_open_sysctl();
if (prstat == NULL)
- errx(1, "procstat_open()");
+ xo_errx(1, "procstat_open()");
do {
+ xo_set_version(PROCSTAT_XO_VERSION);
+ xo_open_container("procstat");
+ xo_open_container(xocontainer);
+
if (aflag) {
p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt);
if (p == NULL)
- errx(1, "procstat_getprocs()");
+ xo_errx(1, "procstat_getprocs()");
kinfo_proc_sort(p, cnt);
for (i = 0; i < cnt; i++) {
procstat(prstat, &p[i]);
/* Suppress header after first process. */
hflag = 1;
+ xo_flush();
}
procstat_freeprocs(prstat, p);
}
@@ -276,9 +310,10 @@ main(int argc, char *argv[])
usage();
pid = l;
- p = procstat_getprocs(prstat, KERN_PROC_PID, pid, &cnt);
+ p = procstat_getprocs(prstat, KERN_PROC_PID,
+ pid, &cnt);
if (p == NULL)
- errx(1, "procstat_getprocs()");
+ xo_errx(1, "procstat_getprocs()");
if (cnt != 0)
procstat(prstat, p);
procstat_freeprocs(prstat, p);
@@ -291,7 +326,7 @@ main(int argc, char *argv[])
p = procstat_getprocs(cprstat, KERN_PROC_PID,
-1, &cnt);
if (p == NULL)
- errx(1, "procstat_getprocs()");
+ xo_errx(1, "procstat_getprocs()");
if (cnt != 0)
procstat(cprstat, p);
procstat_freeprocs(cprstat, p);
@@ -300,9 +335,15 @@ main(int argc, char *argv[])
/* Suppress header after first process. */
hflag = 1;
}
+
+ xo_close_container(xocontainer);
+ xo_close_container("procstat");
+ xo_finish();
if (interval)
sleep(interval);
} while (interval);
+
procstat_close(prstat);
+
exit(0);
}