summaryrefslogtreecommitdiffstats
path: root/usr.bin/procstat
diff options
context:
space:
mode:
authorstas <stas@FreeBSD.org>2011-05-12 10:11:39 +0000
committerstas <stas@FreeBSD.org>2011-05-12 10:11:39 +0000
commit5f9f79547658271f3f469b6423a176831fef7683 (patch)
tree9f873599b157e2ba06c3088d82cad8a221b42d18 /usr.bin/procstat
parentf47d00001ad33e13ec3b6fc74732b959cd485dc7 (diff)
downloadFreeBSD-src-5f9f79547658271f3f469b6423a176831fef7683.zip
FreeBSD-src-5f9f79547658271f3f469b6423a176831fef7683.tar.gz
- Commit work from libprocstat project. These patches add support for runtime
file and processes information retrieval from the running kernel via sysctl in the form of new library, libprocstat. The library also supports KVM backend for analyzing memory crash dumps. Both procstat(1) and fstat(1) utilities have been modified to take advantage of the library (as the bonus point the fstat(1) utility no longer need superuser privileges to operate), and the procstat(1) utility is now able to display information from memory dumps as well. The newly introduced fuser(1) utility also uses this library and able to operate via sysctl and kvm backends. The library is by no means complete (e.g. KVM backend is missing vnode name resolution routines, and there're no manpages for the library itself) so I plan to improve it further. I'm commiting it so it will get wider exposure and review. We won't be able to MFC this work as it relies on changes in HEAD, which was introduced some time ago, that break kernel ABI. OTOH we may be able to merge the library with KVM backend if we really need it there. Discussed with: rwatson
Diffstat (limited to 'usr.bin/procstat')
-rw-r--r--usr.bin/procstat/Makefile2
-rw-r--r--usr.bin/procstat/procstat.c117
-rw-r--r--usr.bin/procstat/procstat.h20
-rw-r--r--usr.bin/procstat/procstat_args.c9
-rw-r--r--usr.bin/procstat/procstat_basic.c3
-rw-r--r--usr.bin/procstat/procstat_bin.c9
-rw-r--r--usr.bin/procstat/procstat_cred.c9
-rw-r--r--usr.bin/procstat/procstat_files.c156
-rw-r--r--usr.bin/procstat/procstat_kstack.c17
-rw-r--r--usr.bin/procstat/procstat_sigs.c9
-rw-r--r--usr.bin/procstat/procstat_threads.c11
-rw-r--r--usr.bin/procstat/procstat_vm.c7
12 files changed, 182 insertions, 187 deletions
diff --git a/usr.bin/procstat/Makefile b/usr.bin/procstat/Makefile
index fa1c3b4..e8e35ed 100644
--- a/usr.bin/procstat/Makefile
+++ b/usr.bin/procstat/Makefile
@@ -13,7 +13,7 @@ SRCS= procstat.c \
procstat_threads.c \
procstat_vm.c
-LDADD+= -lutil
+LDADD+= -lutil -lprocstat -lkvm
DPADD+= ${LIBUTIL}
.include <bsd.prog.mk>
diff --git a/usr.bin/procstat/procstat.c b/usr.bin/procstat/procstat.c
index ee95ae2..69648fd 100644
--- a/usr.bin/procstat/procstat.c
+++ b/usr.bin/procstat/procstat.c
@@ -31,6 +31,7 @@
#include <sys/user.h>
#include <err.h>
+#include <libprocstat.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
@@ -45,36 +46,36 @@ static void
usage(void)
{
- fprintf(stderr, "usage: procstat [-h] [-n] [-w interval] [-b | -c | -f | "
- "-i | -j | -k | -s | -t | -v]\n");
+ fprintf(stderr, "usage: procstat [-h] [-M core] [-N system] "
+ "[-w interval] [-b | -c | -f | -i | -j | -k | -s | -t | -v]\n");
fprintf(stderr, " [-a | pid ...]\n");
exit(EX_USAGE);
}
static void
-procstat(pid_t pid, struct kinfo_proc *kipp)
+procstat(struct procstat *prstat, struct kinfo_proc *kipp)
{
if (bflag)
- procstat_bin(pid, kipp);
+ procstat_bin(kipp);
else if (cflag)
- procstat_args(pid, kipp);
+ procstat_args(kipp);
else if (fflag)
- procstat_files(pid, kipp);
+ procstat_files(prstat, kipp);
else if (iflag)
- procstat_sigs(pid, kipp);
+ procstat_sigs(prstat, kipp);
else if (jflag)
- procstat_threads_sigs(pid, kipp);
+ procstat_threads_sigs(prstat, kipp);
else if (kflag)
- procstat_kstack(pid, kipp, kflag);
+ procstat_kstack(kipp, kflag);
else if (sflag)
- procstat_cred(pid, kipp);
+ procstat_cred(kipp);
else if (tflag)
- procstat_threads(pid, kipp);
+ procstat_threads(kipp);
else if (vflag)
- procstat_vm(pid, kipp);
+ procstat_vm(kipp);
else
- procstat_basic(pid, kipp);
+ procstat_basic(kipp);
}
/*
@@ -104,17 +105,26 @@ kinfo_proc_sort(struct kinfo_proc *kipp, int count)
int
main(int argc, char *argv[])
{
- int ch, interval, name[4], tmp;
- unsigned int i;
- struct kinfo_proc *kipp;
- size_t len;
+ int ch, interval, tmp;
+ int i;
+ struct kinfo_proc *p;
+ struct procstat *prstat;
long l;
pid_t pid;
char *dummy;
+ char *nlistf, *memf;
+ int cnt;
interval = 0;
- while ((ch = getopt(argc, argv, "abcfijknhstvw:")) != -1) {
+ memf = nlistf = NULL;
+ while ((ch = getopt(argc, argv, "N:M:abcfijkhstvw:")) != -1) {
switch (ch) {
+ case 'M':
+ memf = optarg;
+ break;
+ case 'N':
+ nlistf = optarg;
+ break;
case 'a':
aflag++;
break;
@@ -194,38 +204,27 @@ main(int argc, char *argv[])
if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0))
usage();
+ if (memf != NULL)
+ prstat = procstat_open_kvm(nlistf, memf);
+ else
+ prstat = procstat_open_sysctl();
+ if (prstat == NULL)
+ errx(1, "procstat_open()");
do {
if (aflag) {
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PROC;
-
- len = 0;
- if (sysctl(name, 3, NULL, &len, NULL, 0) < 0)
- err(-1, "sysctl: kern.proc.all");
-
- kipp = malloc(len);
- if (kipp == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 3, kipp, &len, NULL, 0) < 0) {
- free(kipp);
- err(-1, "sysctl: kern.proc.all");
- }
- if (len % sizeof(*kipp) != 0)
- err(-1, "kinfo_proc mismatch");
- if (kipp->ki_structsize != sizeof(*kipp))
- err(-1, "kinfo_proc structure mismatch");
- kinfo_proc_sort(kipp, len / sizeof(*kipp));
- for (i = 0; i < len / sizeof(*kipp); i++) {
- procstat(kipp[i].ki_pid, &kipp[i]);
+ p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt);
+ if (p == NULL)
+ 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;
}
- free(kipp);
+ procstat_freeprocs(prstat, p);
}
- for (i = 0; i < (unsigned int)argc; i++) {
+ for (i = 0; i < argc; i++) {
l = strtol(argv[i], &dummy, 10);
if (*dummy != '\0')
usage();
@@ -233,31 +232,12 @@ main(int argc, char *argv[])
usage();
pid = l;
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_PID;
- name[3] = pid;
-
- len = 0;
- if (sysctl(name, 4, NULL, &len, NULL, 0) < 0)
- err(-1, "sysctl: kern.proc.pid: %d", pid);
-
- kipp = malloc(len);
- if (kipp == NULL)
- err(-1, "malloc");
-
- if (sysctl(name, 4, kipp, &len, NULL, 0) < 0) {
- free(kipp);
- err(-1, "sysctl: kern.proc.pid: %d", pid);
- }
- if (len != sizeof(*kipp))
- err(-1, "kinfo_proc mismatch");
- if (kipp->ki_structsize != sizeof(*kipp))
- errx(-1, "kinfo_proc structure mismatch");
- if (kipp->ki_pid != pid)
- errx(-1, "kinfo_proc pid mismatch");
- procstat(pid, kipp);
- free(kipp);
+ p = procstat_getprocs(prstat, KERN_PROC_PID, pid, &cnt);
+ if (p == NULL)
+ errx(1, "procstat_getprocs()");
+ if (cnt != 0)
+ procstat(prstat, p);
+ procstat_freeprocs(prstat, p);
/* Suppress header after first process. */
hflag = 1;
@@ -265,5 +245,6 @@ main(int argc, char *argv[])
if (interval)
sleep(interval);
} while (interval);
+ procstat_close(prstat);
exit(0);
}
diff --git a/usr.bin/procstat/procstat.h b/usr.bin/procstat/procstat.h
index d73a203..ad425f3 100644
--- a/usr.bin/procstat/procstat.h
+++ b/usr.bin/procstat/procstat.h
@@ -34,15 +34,15 @@ extern int hflag, nflag;
struct kinfo_proc;
void kinfo_proc_sort(struct kinfo_proc *kipp, int count);
-void procstat_args(pid_t pid, struct kinfo_proc *kipp);
-void procstat_basic(pid_t pid, struct kinfo_proc *kipp);
-void procstat_bin(pid_t pid, struct kinfo_proc *kipp);
-void procstat_cred(pid_t pid, struct kinfo_proc *kipp);
-void procstat_files(pid_t pid, struct kinfo_proc *kipp);
-void procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag);
-void procstat_sigs(pid_t pid, struct kinfo_proc *kipp);
-void procstat_threads(pid_t pid, struct kinfo_proc *kipp);
-void procstat_threads_sigs(pid_t pid, struct kinfo_proc *kipp);
-void procstat_vm(pid_t pid, struct kinfo_proc *kipp);
+void procstat_args(struct kinfo_proc *kipp);
+void procstat_basic(struct kinfo_proc *kipp);
+void procstat_bin(struct kinfo_proc *kipp);
+void procstat_cred(struct kinfo_proc *kipp);
+void procstat_files(struct procstat *prstat, struct kinfo_proc *kipp);
+void procstat_kstack(struct kinfo_proc *kipp, int kflag);
+void procstat_sigs(struct procstat *prstat, struct kinfo_proc *kipp);
+void procstat_threads(struct kinfo_proc *kipp);
+void procstat_threads_sigs(struct procstat *prstat, struct kinfo_proc *kipp);
+void procstat_vm(struct kinfo_proc *kipp);
#endif /* !PROCSTAT_H */
diff --git a/usr.bin/procstat/procstat_args.c b/usr.bin/procstat/procstat_args.c
index e5a7acd..e8e6b94 100644
--- a/usr.bin/procstat/procstat_args.c
+++ b/usr.bin/procstat/procstat_args.c
@@ -32,6 +32,7 @@
#include <err.h>
#include <errno.h>
+#include <libprocstat.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -42,7 +43,7 @@
static char args[ARG_MAX];
void
-procstat_args(pid_t pid, struct kinfo_proc *kipp)
+procstat_args(struct kinfo_proc *kipp)
{
int error, name[4];
size_t len;
@@ -54,11 +55,11 @@ procstat_args(pid_t pid, struct kinfo_proc *kipp)
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_ARGS;
- name[3] = pid;
+ name[3] = kipp->ki_pid;
len = sizeof(args);
error = sysctl(name, 4, args, &len, NULL, 0);
if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.args: %d", pid);
+ warn("sysctl: kern.proc.args: %d", kipp->ki_pid);
return;
}
if (error < 0)
@@ -68,7 +69,7 @@ procstat_args(pid_t pid, struct kinfo_proc *kipp)
len = strlen(args) + 1;
}
- printf("%5d ", pid);
+ printf("%5d ", kipp->ki_pid);
printf("%-16s ", kipp->ki_comm);
for (cp = args; cp < args + len; cp += strlen(cp) + 1)
printf("%s%s", cp != args ? " " : "", cp);
diff --git a/usr.bin/procstat/procstat_basic.c b/usr.bin/procstat/procstat_basic.c
index 2775172..af43fd1 100644
--- a/usr.bin/procstat/procstat_basic.c
+++ b/usr.bin/procstat/procstat_basic.c
@@ -31,13 +31,14 @@
#include <sys/user.h>
#include <err.h>
+#include <libprocstat.h>
#include <stdio.h>
#include <string.h>
#include "procstat.h"
void
-procstat_basic(pid_t pid __unused, struct kinfo_proc *kipp)
+procstat_basic(struct kinfo_proc *kipp)
{
if (!hflag)
diff --git a/usr.bin/procstat/procstat_bin.c b/usr.bin/procstat/procstat_bin.c
index 8ed5efe..cf4ca5b 100644
--- a/usr.bin/procstat/procstat_bin.c
+++ b/usr.bin/procstat/procstat_bin.c
@@ -32,6 +32,7 @@
#include <err.h>
#include <errno.h>
+#include <libprocstat.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
@@ -39,7 +40,7 @@
#include "procstat.h"
void
-procstat_bin(pid_t pid, struct kinfo_proc *kipp)
+procstat_bin(struct kinfo_proc *kipp)
{
char pathname[PATH_MAX];
int error, name[4];
@@ -51,12 +52,12 @@ procstat_bin(pid_t pid, struct kinfo_proc *kipp)
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_PATHNAME;
- name[3] = pid;
+ name[3] = kipp->ki_pid;
len = sizeof(pathname);
error = sysctl(name, 4, pathname, &len, NULL, 0);
if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.pathname: %d", pid);
+ warn("sysctl: kern.proc.pathname: %d", kipp->ki_pid);
return;
}
if (error < 0)
@@ -64,7 +65,7 @@ procstat_bin(pid_t pid, struct kinfo_proc *kipp)
if (len == 0 || strlen(pathname) == 0)
strcpy(pathname, "-");
- printf("%5d ", pid);
+ printf("%5d ", kipp->ki_pid);
printf("%-16s ", kipp->ki_comm);
printf("%s\n", pathname);
}
diff --git a/usr.bin/procstat/procstat_cred.c b/usr.bin/procstat/procstat_cred.c
index 1e91a94..ea8fdfd 100644
--- a/usr.bin/procstat/procstat_cred.c
+++ b/usr.bin/procstat/procstat_cred.c
@@ -31,6 +31,7 @@
#include <sys/user.h>
#include <err.h>
+#include <libprocstat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
@@ -38,7 +39,7 @@
#include "procstat.h"
void
-procstat_cred(pid_t pid, struct kinfo_proc *kipp)
+procstat_cred(struct kinfo_proc *kipp)
{
int i;
int mib[4];
@@ -51,7 +52,7 @@ procstat_cred(pid_t pid, struct kinfo_proc *kipp)
"COMM", "EUID", "RUID", "SVUID", "EGID", "RGID", "SVGID",
"GROUPS");
- printf("%5d ", pid);
+ printf("%5d ", kipp->ki_pid);
printf("%-16s ", kipp->ki_comm);
printf("%5d ", kipp->ki_uid);
printf("%5d ", kipp->ki_ruid);
@@ -69,7 +70,7 @@ procstat_cred(pid_t pid, struct kinfo_proc *kipp)
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_GROUPS;
- mib[3] = pid;
+ mib[3] = kipp->ki_pid;
ngroups = sysconf(_SC_NGROUPS_MAX) + 1;
len = ngroups * sizeof(gid_t);
@@ -78,7 +79,7 @@ procstat_cred(pid_t pid, struct kinfo_proc *kipp)
if (sysctl(mib, 4, groups, &len, NULL, 0) == -1) {
warn("sysctl: kern.proc.groups: %d "
- "group list truncated", pid);
+ "group list truncated", kipp->ki_pid);
free(groups);
groups = NULL;
}
diff --git a/usr.bin/procstat/procstat_files.c b/usr.bin/procstat/procstat_files.c
index debb0e4..f7d91a4 100644
--- a/usr.bin/procstat/procstat_files.c
+++ b/usr.bin/procstat/procstat_files.c
@@ -37,11 +37,11 @@
#include <arpa/inet.h>
#include <err.h>
+#include <libprocstat.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <libutil.h>
#include "procstat.h"
@@ -132,162 +132,165 @@ print_address(struct sockaddr_storage *ss)
}
void
-procstat_files(pid_t pid, struct kinfo_proc *kipp)
-{
- struct kinfo_file *freep, *kif;
- int i, cnt;
+procstat_files(struct procstat *procstat, struct kinfo_proc *kipp)
+{
+ struct sockstat sock;
+ struct filestat_list *head;
+ struct filestat *fst;
const char *str;
+ struct vnstat vn;
+ int error;
if (!hflag)
printf("%5s %-16s %4s %1s %1s %-8s %3s %7s %-3s %-12s\n",
"PID", "COMM", "FD", "T", "V", "FLAGS", "REF", "OFFSET",
"PRO", "NAME");
- freep = kinfo_getfile(pid, &cnt);
- if (freep == NULL)
+ head = procstat_getfiles(procstat, kipp, 0);
+ if (head == NULL)
return;
- for (i = 0; i < cnt; i++) {
- kif = &freep[i];
-
- printf("%5d ", pid);
+ STAILQ_FOREACH(fst, head, next) {
+ printf("%5d ", kipp->ki_pid);
printf("%-16s ", kipp->ki_comm);
- switch (kif->kf_fd) {
- case KF_FD_TYPE_CWD:
+ if (fst->fs_uflags & PS_FST_UFLAG_CTTY)
+ printf("ctty ");
+ else if (fst->fs_uflags & PS_FST_UFLAG_CDIR)
printf(" cwd ");
- break;
-
- case KF_FD_TYPE_ROOT:
- printf("root ");
- break;
-
- case KF_FD_TYPE_JAIL:
+ else if (fst->fs_uflags & PS_FST_UFLAG_JAIL)
printf("jail ");
- break;
+ else if (fst->fs_uflags & PS_FST_UFLAG_RDIR)
+ printf("root ");
+ else if (fst->fs_uflags & PS_FST_UFLAG_TEXT)
+ printf("text ");
+ else if (fst->fs_uflags & PS_FST_UFLAG_TRACE)
+ printf("trace ");
+ else
+ printf("%4d ", fst->fs_fd);
- default:
- printf("%4d ", kif->kf_fd);
- break;
- }
- switch (kif->kf_type) {
- case KF_TYPE_VNODE:
+ switch (fst->fs_type) {
+ case PS_FST_TYPE_VNODE:
str = "v";
break;
- case KF_TYPE_SOCKET:
+ case PS_FST_TYPE_SOCKET:
str = "s";
break;
- case KF_TYPE_PIPE:
+ case PS_FST_TYPE_PIPE:
str = "p";
break;
- case KF_TYPE_FIFO:
+ case PS_FST_TYPE_FIFO:
str = "f";
break;
- case KF_TYPE_KQUEUE:
+ case PS_FST_TYPE_KQUEUE:
str = "k";
break;
- case KF_TYPE_CRYPTO:
+ case PS_FST_TYPE_CRYPTO:
str = "c";
break;
- case KF_TYPE_MQUEUE:
+ case PS_FST_TYPE_MQUEUE:
str = "m";
break;
- case KF_TYPE_SHM:
+ case PS_FST_TYPE_SHM:
str = "h";
break;
- case KF_TYPE_PTS:
+ case PS_FST_TYPE_PTS:
str = "t";
break;
- case KF_TYPE_SEM:
+ case PS_FST_TYPE_SEM:
str = "e";
break;
- case KF_TYPE_NONE:
- case KF_TYPE_UNKNOWN:
+ case PS_FST_TYPE_NONE:
+ case PS_FST_TYPE_UNKNOWN:
default:
str = "?";
break;
}
printf("%1s ", str);
str = "-";
- if (kif->kf_type == KF_TYPE_VNODE) {
- switch (kif->kf_vnode_type) {
- case KF_VTYPE_VREG:
+ if (fst->fs_type == PS_FST_TYPE_VNODE) {
+ error = procstat_get_vnode_info(procstat, fst, &vn, NULL);
+ switch (vn.vn_type) {
+ case PS_FST_VTYPE_VREG:
str = "r";
break;
- case KF_VTYPE_VDIR:
+ case PS_FST_VTYPE_VDIR:
str = "d";
break;
- case KF_VTYPE_VBLK:
+ case PS_FST_VTYPE_VBLK:
str = "b";
break;
- case KF_VTYPE_VCHR:
+ case PS_FST_VTYPE_VCHR:
str = "c";
break;
- case KF_VTYPE_VLNK:
+ case PS_FST_VTYPE_VLNK:
str = "l";
break;
- case KF_VTYPE_VSOCK:
+ case PS_FST_VTYPE_VSOCK:
str = "s";
break;
- case KF_VTYPE_VFIFO:
+ case PS_FST_VTYPE_VFIFO:
str = "f";
break;
- case KF_VTYPE_VBAD:
+ case PS_FST_VTYPE_VBAD:
str = "x";
break;
- case KF_VTYPE_VNON:
- case KF_VTYPE_UNKNOWN:
+ case PS_FST_VTYPE_VNON:
+ case PS_FST_VTYPE_UNKNOWN:
default:
str = "?";
break;
}
}
printf("%1s ", str);
- printf("%s", kif->kf_flags & KF_FLAG_READ ? "r" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_WRITE ? "w" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_APPEND ? "a" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_ASYNC ? "s" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_FSYNC ? "f" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_NONBLOCK ? "n" : "-");
- printf("%s", kif->kf_flags & KF_FLAG_DIRECT ? "d" : "-");
- printf("%s ", kif->kf_flags & KF_FLAG_HASLOCK ? "l" : "-");
- if (kif->kf_ref_count > -1)
- printf("%3d ", kif->kf_ref_count);
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_READ ? "r" : "-");
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_WRITE ? "w" : "-");
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_APPEND ? "a" : "-");
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_ASYNC ? "s" : "-");
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_SYNC ? "f" : "-");
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_NONBLOCK ? "n" : "-");
+ printf("%s", fst->fs_fflags & PS_FST_FFLAG_DIRECT ? "d" : "-");
+ printf("%s ", fst->fs_fflags & PS_FST_FFLAG_HASLOCK ? "l" : "-");
+ if (fst->fs_ref_count > -1)
+ printf("%3d ", fst->fs_ref_count);
else
printf("%3c ", '-');
- if (kif->kf_offset > -1)
- printf("%7jd ", (intmax_t)kif->kf_offset);
+ if (fst->fs_offset > -1)
+ printf("%7jd ", (intmax_t)fst->fs_offset);
else
printf("%7c ", '-');
- switch (kif->kf_type) {
- case KF_TYPE_VNODE:
- case KF_TYPE_FIFO:
- case KF_TYPE_PTS:
+ switch (fst->fs_type) {
+ case PS_FST_TYPE_VNODE:
+ case PS_FST_TYPE_FIFO:
+ case PS_FST_TYPE_PTS:
printf("%-3s ", "-");
- printf("%-18s", kif->kf_path);
+ printf("%-18s", fst->fs_path != NULL ? fst->fs_path : "-");
break;
- case KF_TYPE_SOCKET:
+ case PS_FST_TYPE_SOCKET:
+ error = procstat_get_socket_info(procstat, fst, &sock, NULL);
+ if (error != 0)
+ break;
printf("%-3s ",
- protocol_to_string(kif->kf_sock_domain,
- kif->kf_sock_type, kif->kf_sock_protocol));
+ protocol_to_string(sock.dom_family,
+ sock.type, sock.proto));
/*
* While generally we like to print two addresses,
* local and peer, for sockets, it turns out to be
@@ -295,18 +298,18 @@ procstat_files(pid_t pid, struct kinfo_proc *kipp)
* local sockets, as typically they aren't bound and
* connected, and the path strings can get long.
*/
- if (kif->kf_sock_domain == AF_LOCAL) {
+ if (sock.dom_family == AF_LOCAL) {
struct sockaddr_un *sun =
- (struct sockaddr_un *)&kif->kf_sa_local;
+ (struct sockaddr_un *)&sock.sa_local;
if (sun->sun_path[0] != 0)
- print_address(&kif->kf_sa_local);
+ print_address(&sock.sa_local);
else
- print_address(&kif->kf_sa_peer);
+ print_address(&sock.sa_peer);
} else {
- print_address(&kif->kf_sa_local);
+ print_address(&sock.sa_local);
printf(" ");
- print_address(&kif->kf_sa_peer);
+ print_address(&sock.sa_peer);
}
break;
@@ -317,5 +320,4 @@ procstat_files(pid_t pid, struct kinfo_proc *kipp)
printf("\n");
}
- free(freep);
}
diff --git a/usr.bin/procstat/procstat_kstack.c b/usr.bin/procstat/procstat_kstack.c
index 9d5f71e..fd2b9ab 100644
--- a/usr.bin/procstat/procstat_kstack.c
+++ b/usr.bin/procstat/procstat_kstack.c
@@ -32,6 +32,7 @@
#include <err.h>
#include <errno.h>
+#include <libprocstat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -124,7 +125,7 @@ kinfo_kstack_sort(struct kinfo_kstack *kkstp, int count)
void
-procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
+procstat_kstack(struct kinfo_proc *kipp, int kflag)
{
struct kinfo_kstack *kkstp, *kkstp_free;
struct kinfo_proc *kip, *kip_free;
@@ -140,12 +141,12 @@ procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_KSTACK;
- name[3] = pid;
+ name[3] = kipp->ki_pid;
kstk_len = 0;
error = sysctl(name, 4, NULL, &kstk_len, NULL, 0);
if (error < 0 && errno != ESRCH && errno != EPERM && errno != ENOENT) {
- warn("sysctl: kern.proc.kstack: %d", pid);
+ warn("sysctl: kern.proc.kstack: %d", kipp->ki_pid);
return;
}
if (error < 0 && errno == ENOENT) {
@@ -160,7 +161,7 @@ procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
err(-1, "malloc");
if (sysctl(name, 4, kkstp, &kstk_len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.pid: %d", pid);
+ warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
free(kkstp);
return;
}
@@ -171,12 +172,12 @@ procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
- name[3] = pid;
+ name[3] = kipp->ki_pid;
kip_len = 0;
error = sysctl(name, 4, NULL, &kip_len, NULL, 0);
if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.pid: %d", pid);
+ warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
return;
}
if (error < 0)
@@ -187,7 +188,7 @@ procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
err(-1, "malloc");
if (sysctl(name, 4, kip, &kip_len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.pid: %d", pid);
+ warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
free(kip);
return;
}
@@ -209,7 +210,7 @@ procstat_kstack(pid_t pid, struct kinfo_proc *kipp, int kflag)
if (kipp == NULL)
continue;
- printf("%5d ", pid);
+ printf("%5d ", kipp->ki_pid);
printf("%6d ", kkstp->kkst_tid);
printf("%-16s ", kipp->ki_comm);
printf("%-16s ", (strlen(kipp->ki_ocomm) &&
diff --git a/usr.bin/procstat/procstat_sigs.c b/usr.bin/procstat/procstat_sigs.c
index b1f5e35..70df250 100644
--- a/usr.bin/procstat/procstat_sigs.c
+++ b/usr.bin/procstat/procstat_sigs.c
@@ -37,6 +37,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libprocstat.h>
#include "procstat.h"
@@ -63,10 +64,12 @@ procstat_print_sig(const sigset_t *set, int sig, char flag)
}
void
-procstat_sigs(pid_t pid, struct kinfo_proc *kipp)
+procstat_sigs(struct procstat *prstat __unused, struct kinfo_proc *kipp)
{
int j;
+ pid_t pid;
+ pid = kipp->ki_pid;
if (!hflag)
printf("%5s %-16s %-7s %4s\n", "PID", "COMM", "SIG", "FLAGS");
@@ -83,13 +86,15 @@ procstat_sigs(pid_t pid, struct kinfo_proc *kipp)
}
void
-procstat_threads_sigs(pid_t pid, struct kinfo_proc *kipp)
+procstat_threads_sigs(struct procstat *prstat __unused, struct kinfo_proc *kipp)
{
struct kinfo_proc *kip;
+ pid_t pid;
int error, name[4], j;
unsigned int i;
size_t len;
+ pid = kipp->ki_pid;
if (!hflag)
printf("%5s %6s %-16s %-7s %4s\n", "PID", "TID", "COMM",
"SIG", "FLAGS");
diff --git a/usr.bin/procstat/procstat_threads.c b/usr.bin/procstat/procstat_threads.c
index 64e0a36..7633608 100644
--- a/usr.bin/procstat/procstat_threads.c
+++ b/usr.bin/procstat/procstat_threads.c
@@ -32,6 +32,7 @@
#include <err.h>
#include <errno.h>
+#include <libprocstat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -39,7 +40,7 @@
#include "procstat.h"
void
-procstat_threads(pid_t pid, struct kinfo_proc *kipp)
+procstat_threads(struct kinfo_proc *kipp)
{
struct kinfo_proc *kip;
int error, name[4];
@@ -57,12 +58,12 @@ procstat_threads(pid_t pid, struct kinfo_proc *kipp)
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
- name[3] = pid;
+ name[3] = kipp->ki_pid;
len = 0;
error = sysctl(name, 4, NULL, &len, NULL, 0);
if (error < 0 && errno != ESRCH) {
- warn("sysctl: kern.proc.pid: %d", pid);
+ warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
return;
}
if (error < 0)
@@ -73,7 +74,7 @@ procstat_threads(pid_t pid, struct kinfo_proc *kipp)
err(-1, "malloc");
if (sysctl(name, 4, kip, &len, NULL, 0) < 0) {
- warn("sysctl: kern.proc.pid: %d", pid);
+ warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
free(kip);
return;
}
@@ -81,7 +82,7 @@ procstat_threads(pid_t pid, struct kinfo_proc *kipp)
kinfo_proc_sort(kip, len / sizeof(*kipp));
for (i = 0; i < len / sizeof(*kipp); i++) {
kipp = &kip[i];
- printf("%5d ", pid);
+ printf("%5d ", kipp->ki_pid);
printf("%6d ", kipp->ki_tid);
printf("%-16s ", strlen(kipp->ki_comm) ?
kipp->ki_comm : "-");
diff --git a/usr.bin/procstat/procstat_vm.c b/usr.bin/procstat/procstat_vm.c
index 5c965a9..2eada92 100644
--- a/usr.bin/procstat/procstat_vm.c
+++ b/usr.bin/procstat/procstat_vm.c
@@ -32,6 +32,7 @@
#include <err.h>
#include <errno.h>
+#include <libprocstat.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -40,7 +41,7 @@
#include "procstat.h"
void
-procstat_vm(pid_t pid, struct kinfo_proc *kipp __unused)
+procstat_vm(struct kinfo_proc *kipp)
{
struct kinfo_vmentry *freep, *kve;
int ptrwidth;
@@ -53,12 +54,12 @@ procstat_vm(pid_t pid, struct kinfo_proc *kipp __unused)
"PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES",
"PRES", "REF", "SHD", "FL", "TP", "PATH");
- freep = kinfo_getvmmap(pid, &cnt);
+ freep = kinfo_getvmmap(kipp->ki_pid, &cnt);
if (freep == NULL)
return;
for (i = 0; i < cnt; i++) {
kve = &freep[i];
- printf("%5d ", pid);
+ printf("%5d ", kipp->ki_pid);
printf("%#*jx ", ptrwidth, (uintmax_t)kve->kve_start);
printf("%#*jx ", ptrwidth, (uintmax_t)kve->kve_end);
printf("%s", kve->kve_protection & KVME_PROT_READ ? "r" : "-");
OpenPOWER on IntegriCloud