aboutsummaryrefslogtreecommitdiff
path: root/lib/libprocstat
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libprocstat')
-rw-r--r--lib/libprocstat/Makefile26
-rw-r--r--lib/libprocstat/Symbol.map7
-rw-r--r--lib/libprocstat/cd9660.c4
-rw-r--r--lib/libprocstat/common_kvm.c1
-rw-r--r--lib/libprocstat/core.c69
-rw-r--r--lib/libprocstat/core.h3
-rw-r--r--lib/libprocstat/libprocstat.c234
-rw-r--r--lib/libprocstat/libprocstat.h14
-rw-r--r--lib/libprocstat/libprocstat_compat.c3
-rw-r--r--lib/libprocstat/msdosfs.c15
-rw-r--r--lib/libprocstat/smbfs.c3
-rw-r--r--lib/libprocstat/udf.c2
-rw-r--r--lib/libprocstat/zfs.c50
-rw-r--r--lib/libprocstat/zfs/Makefile26
-rw-r--r--lib/libprocstat/zfs/Makefile.depend11
-rw-r--r--lib/libprocstat/zfs_defs.c82
-rw-r--r--lib/libprocstat/zfs_defs.h36
17 files changed, 308 insertions, 278 deletions
diff --git a/lib/libprocstat/Makefile b/lib/libprocstat/Makefile
index 0c8d1b63488b..e20518910ba3 100644
--- a/lib/libprocstat/Makefile
+++ b/lib/libprocstat/Makefile
@@ -1,4 +1,3 @@
-
.include <src.opts.mk>
LIB= procstat
@@ -53,20 +52,23 @@ MLINKS+=libprocstat.3 procstat_close.3 \
libprocstat.3 procstat_open_kvm.3 \
libprocstat.3 procstat_open_sysctl.3
-# XXX This is a hack.
.if ${MK_CDDL} != "no"
CFLAGS+= -DLIBPROCSTAT_ZFS
SRCS+= zfs.c
-OBJS+= zfs/zfs_defs.o
-SUBDIR= zfs
-zfs/zfs_defs.o: .PHONY
- @cd ${.CURDIR}/zfs && ${MAKE} zfs_defs.o
-zfs/zfs_defs.pico: .PHONY
- @cd ${.CURDIR}/zfs && ${MAKE} zfs_defs.pico
-zfs/zfs_defs.pieo: .PHONY
- @cd ${.CURDIR}/zfs && ${MAKE} zfs_defs.pieo
-zfs/zfs_defs.po: .PHONY
- @cd ${.CURDIR}/zfs && ${MAKE} zfs_defs.po
+ZFSTOP= ${SRCTOP}/sys/contrib/openzfs
+CFLAGS.zfs.c+= -DIN_BASE
+CFLAGS.zfs.c+= -DHAVE_ISSETUGID
+CFLAGS.zfs.c+= -DZFS_DEBUG
+CFLAGS.zfs.c+= -I${ZFSTOP}/include
+CFLAGS.zfs.c+= -I${ZFSTOP}/lib/libspl/include
+CFLAGS.zfs.c+= -I${ZFSTOP}/lib/libspl/include/os/freebsd
+CFLAGS.zfs.c+= -I${ZFSTOP}/include/os/freebsd/zfs
+CFLAGS.zfs.c+= -I${ZFSTOP}/module/icp/include
+CFLAGS.zfs.c+= -I${SRCTOP}/sys
+CFLAGS.zfs.c+= -I${SRCTOP}/sys/modules/zfs
+CFLAGS.zfs.c+= -include ${ZFSTOP}/include/os/freebsd/spl/sys/ccompile.h
+CFLAGS.zfs.c+= -include ${SRCTOP}/sys/modules/zfs/zfs_config.h
+CFLAGS.zfs.c+= -Wno-cast-qual
.endif
.include <bsd.lib.mk>
diff --git a/lib/libprocstat/Symbol.map b/lib/libprocstat/Symbol.map
index 4c8a0c7edefb..3d71c3eaae4a 100644
--- a/lib/libprocstat/Symbol.map
+++ b/lib/libprocstat/Symbol.map
@@ -47,4 +47,11 @@ FBSD_1.6 {
FBSD_1.7 {
procstat_getadvlock;
procstat_freeadvlock;
+};
+
+FBSD_1.8 {
+ procstat_get_kqueue_info;
+ procstat_getrlimitusage;
+ procstat_freekqinfo;
+ procstat_freerlimitusage;
}; \ No newline at end of file
diff --git a/lib/libprocstat/cd9660.c b/lib/libprocstat/cd9660.c
index 0d0030715c28..ec37f49df0f6 100644
--- a/lib/libprocstat/cd9660.c
+++ b/lib/libprocstat/cd9660.c
@@ -42,7 +42,6 @@
* conflicts with UFS.
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/time.h>
@@ -53,9 +52,8 @@
#include <err.h>
-#define _KERNEL
+#define _WANT_ISO_MNT
#include <isofs/cd9660/iso.h>
-#undef _KERNEL
#include <isofs/cd9660/cd9660_node.h>
#include <kvm.h>
diff --git a/lib/libprocstat/common_kvm.c b/lib/libprocstat/common_kvm.c
index 9d96d935be6a..a129605e7fa0 100644
--- a/lib/libprocstat/common_kvm.c
+++ b/lib/libprocstat/common_kvm.c
@@ -34,7 +34,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/user.h>
#include <sys/stat.h>
diff --git a/lib/libprocstat/core.c b/lib/libprocstat/core.c
index dea078c848eb..b27b35de3bab 100644
--- a/lib/libprocstat/core.c
+++ b/lib/libprocstat/core.c
@@ -27,7 +27,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/elf.h>
#include <sys/exec.h>
@@ -58,22 +57,62 @@ struct procstat_core
GElf_Phdr pc_phdr;
};
-static struct psc_type_info {
+static const struct psc_type_info {
unsigned int n_type;
int structsize;
} psc_type_info[PSC_TYPE_MAX] = {
- { .n_type = NT_PROCSTAT_PROC, .structsize = sizeof(struct kinfo_proc) },
- { .n_type = NT_PROCSTAT_FILES, .structsize = sizeof(struct kinfo_file) },
- { .n_type = NT_PROCSTAT_VMMAP, .structsize = sizeof(struct kinfo_vmentry) },
- { .n_type = NT_PROCSTAT_GROUPS, .structsize = sizeof(gid_t) },
- { .n_type = NT_PROCSTAT_UMASK, .structsize = sizeof(u_short) },
- { .n_type = NT_PROCSTAT_RLIMIT, .structsize = sizeof(struct rlimit) * RLIM_NLIMITS },
- { .n_type = NT_PROCSTAT_OSREL, .structsize = sizeof(int) },
- { .n_type = NT_PROCSTAT_PSSTRINGS, .structsize = sizeof(vm_offset_t) },
- { .n_type = NT_PROCSTAT_PSSTRINGS, .structsize = sizeof(vm_offset_t) },
- { .n_type = NT_PROCSTAT_PSSTRINGS, .structsize = sizeof(vm_offset_t) },
- { .n_type = NT_PROCSTAT_AUXV, .structsize = sizeof(Elf_Auxinfo) },
- { .n_type = NT_PTLWPINFO, .structsize = sizeof(struct ptrace_lwpinfo) },
+ [PSC_TYPE_PROC] = {
+ .n_type = NT_PROCSTAT_PROC,
+ .structsize = sizeof(struct kinfo_proc)
+ },
+ [PSC_TYPE_FILES] = {
+ .n_type = NT_PROCSTAT_FILES,
+ .structsize = sizeof(struct kinfo_file)
+ },
+ [PSC_TYPE_VMMAP] = {
+ .n_type = NT_PROCSTAT_VMMAP,
+ .structsize = sizeof(struct kinfo_vmentry)
+ },
+ [PSC_TYPE_GROUPS] = {
+ .n_type = NT_PROCSTAT_GROUPS,
+ .structsize = sizeof(gid_t)
+ },
+ [PSC_TYPE_UMASK] = {
+ .n_type = NT_PROCSTAT_UMASK,
+ .structsize = sizeof(u_short)
+ },
+ [PSC_TYPE_RLIMIT] = {
+ .n_type = NT_PROCSTAT_RLIMIT,
+ .structsize = sizeof(struct rlimit) * RLIM_NLIMITS
+ },
+ [PSC_TYPE_OSREL] = {
+ .n_type = NT_PROCSTAT_OSREL,
+ .structsize = sizeof(int)
+ },
+ [PSC_TYPE_PSSTRINGS] = {
+ .n_type = NT_PROCSTAT_PSSTRINGS,
+ .structsize = sizeof(vm_offset_t)
+ },
+ [PSC_TYPE_ARGV] = {
+ .n_type = NT_PROCSTAT_PSSTRINGS,
+ .structsize = sizeof(vm_offset_t)
+ },
+ [PSC_TYPE_ENVV] = {
+ .n_type = NT_PROCSTAT_PSSTRINGS,
+ .structsize = sizeof(vm_offset_t)
+ },
+ [PSC_TYPE_AUXV] = {
+ .n_type = NT_PROCSTAT_AUXV,
+ .structsize = sizeof(Elf_Auxinfo)
+ },
+ [PSC_TYPE_PTLWPINFO] = {
+ .n_type = NT_PTLWPINFO,
+ .structsize = sizeof(struct ptrace_lwpinfo)
+ },
+ [PSC_TYPE_KQUEUES] = {
+ .n_type = NT_PROCSTAT_KQUEUES,
+ .structsize = sizeof(struct kinfo_knote)
+ },
};
static bool core_offset(struct procstat_core *core, off_t offset);
@@ -119,7 +158,7 @@ procstat_core_open(const char *filename)
warnx("%s is not a CORE file", filename);
goto fail;
}
- if (elf_getphnum(e, &nph) == 0) {
+ if (elf_getphdrnum(e, &nph) == -1) {
warnx("program headers not found");
goto fail;
}
diff --git a/lib/libprocstat/core.h b/lib/libprocstat/core.h
index d6cb60dc9e25..f4276fbdf09e 100644
--- a/lib/libprocstat/core.h
+++ b/lib/libprocstat/core.h
@@ -31,7 +31,7 @@
#define _CORE_H
enum psc_type {
- PSC_TYPE_PROC,
+ PSC_TYPE_PROC = 0,
PSC_TYPE_FILES,
PSC_TYPE_VMMAP,
PSC_TYPE_GROUPS,
@@ -43,6 +43,7 @@ enum psc_type {
PSC_TYPE_ENVV,
PSC_TYPE_AUXV,
PSC_TYPE_PTLWPINFO,
+ PSC_TYPE_KQUEUES,
PSC_TYPE_MAX
};
diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c
index 0af79b6e63a0..eb8137f6c76f 100644
--- a/lib/libprocstat/libprocstat.c
+++ b/lib/libprocstat/libprocstat.c
@@ -35,7 +35,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/elf.h>
#include <sys/time.h>
@@ -51,6 +50,7 @@
#define _WANT_SOCKET
#include <sys/socketvar.h>
#include <sys/domain.h>
+#define _WANT_PROTOSW
#include <sys/protosw.h>
#include <sys/un.h>
#define _WANT_UNPCB
@@ -84,8 +84,6 @@
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
-#define _WANT_INPCB
-#include <netinet/in_pcb.h>
#include <assert.h>
#include <ctype.h>
@@ -347,7 +345,7 @@ struct filestat_list *
procstat_getfiles(struct procstat *procstat, struct kinfo_proc *kp, int mmapped)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
return (procstat_getfiles_kvm(procstat, kp, mmapped));
case PROCSTAT_SYSCTL:
@@ -627,6 +625,10 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap
type = PS_FST_TYPE_EVENTFD;
data = file.f_data;
break;
+ case DTYPE_INOTIFY:
+ type = PS_FST_TYPE_INOTIFY;
+ data = file.f_data;
+ break;
default:
continue;
}
@@ -719,6 +721,7 @@ kinfo_type2fst(int kftype)
{ KF_TYPE_SOCKET, PS_FST_TYPE_SOCKET },
{ KF_TYPE_VNODE, PS_FST_TYPE_VNODE },
{ KF_TYPE_EVENTFD, PS_FST_TYPE_EVENTFD },
+ { KF_TYPE_INOTIFY, PS_FST_TYPE_INOTIFY },
{ KF_TYPE_UNKNOWN, PS_FST_TYPE_UNKNOWN }
};
#define NKFTYPES (sizeof(kftypes2fst) / sizeof(*kftypes2fst))
@@ -1474,7 +1477,6 @@ procstat_get_socket_info_kvm(kvm_t *kd, struct filestat *fst,
struct sockstat *sock, char *errbuf)
{
struct domain dom;
- struct inpcb inpcb;
struct protosw proto;
struct socket s;
struct unpcb unpcb;
@@ -1523,28 +1525,15 @@ procstat_get_socket_info_kvm(kvm_t *kd, struct filestat *fst,
sock->proto = proto.pr_protocol;
sock->dom_family = dom.dom_family;
sock->so_pcb = (uintptr_t)s.so_pcb;
+ sock->sendq = s.so_snd.sb_ccc;
+ sock->recvq = s.so_rcv.sb_ccc;
+ sock->so_rcv_sb_state = s.so_rcv.sb_state;
+ sock->so_snd_sb_state = s.so_snd.sb_state;
/*
* Protocol specific data.
*/
- switch(dom.dom_family) {
- case AF_INET:
- case AF_INET6:
- if (proto.pr_protocol == IPPROTO_TCP) {
- if (s.so_pcb) {
- if (kvm_read(kd, (u_long)s.so_pcb,
- (char *)&inpcb, sizeof(struct inpcb))
- != sizeof(struct inpcb)) {
- warnx("can't read inpcb at %p",
- (void *)s.so_pcb);
- } else
- sock->inp_ppcb =
- (uintptr_t)inpcb.inp_ppcb;
- sock->sendq = s.so_snd.sb_ccc;
- sock->recvq = s.so_rcv.sb_ccc;
- }
- }
- break;
+ switch (dom.dom_family) {
case AF_UNIX:
if (s.so_pcb) {
if (kvm_read(kd, (u_long)s.so_pcb, (char *)&unpcb,
@@ -1552,11 +1541,7 @@ procstat_get_socket_info_kvm(kvm_t *kd, struct filestat *fst,
warnx("can't read unpcb at %p",
(void *)s.so_pcb);
} else if (unpcb.unp_conn) {
- sock->so_rcv_sb_state = s.so_rcv.sb_state;
- sock->so_snd_sb_state = s.so_snd.sb_state;
sock->unp_conn = (uintptr_t)unpcb.unp_conn;
- sock->sendq = s.so_snd.sb_ccc;
- sock->recvq = s.so_rcv.sb_ccc;
}
}
break;
@@ -1600,11 +1585,10 @@ procstat_get_socket_info_sysctl(struct filestat *fst, struct sockstat *sock,
/*
* Protocol specific data.
*/
- switch(sock->dom_family) {
+ switch (sock->dom_family) {
case AF_INET:
case AF_INET6:
if (sock->proto == IPPROTO_TCP) {
- sock->inp_ppcb = kif->kf_un.kf_sock.kf_sock_inpcb;
sock->sendq = kif->kf_un.kf_sock.kf_sock_sendq;
sock->recvq = kif->kf_un.kf_sock.kf_sock_recvq;
}
@@ -1961,7 +1945,7 @@ procstat_getvmmap(struct procstat *procstat, struct kinfo_proc *kp,
unsigned int *cntp)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
warnx("kvm method is not supported");
return (NULL);
@@ -2066,7 +2050,7 @@ gid_t *
procstat_getgroups(struct procstat *procstat, struct kinfo_proc *kp,
unsigned int *cntp)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
return (procstat_getgroups_kvm(procstat->kd, kp, cntp));
case PROCSTAT_SYSCTL:
@@ -2144,7 +2128,7 @@ int
procstat_getumask(struct procstat *procstat, struct kinfo_proc *kp,
unsigned short *maskp)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
return (procstat_getumask_kvm(procstat->kd, kp, maskp));
case PROCSTAT_SYSCTL:
@@ -2234,7 +2218,7 @@ int
procstat_getrlimit(struct procstat *procstat, struct kinfo_proc *kp, int which,
struct rlimit* rlimit)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
return (procstat_getrlimit_kvm(procstat->kd, kp, which,
rlimit));
@@ -2293,7 +2277,7 @@ int
procstat_getpathname(struct procstat *procstat, struct kinfo_proc *kp,
char *pathname, size_t maxlen)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
/* XXX: Return empty string. */
if (maxlen > 0)
@@ -2366,7 +2350,7 @@ procstat_getosrel_core(struct procstat_core *core, int *osrelp)
int
procstat_getosrel(struct procstat *procstat, struct kinfo_proc *kp, int *osrelp)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
return (procstat_getosrel_kvm(procstat->kd, kp, osrelp));
case PROCSTAT_SYSCTL:
@@ -2381,7 +2365,7 @@ procstat_getosrel(struct procstat *procstat, struct kinfo_proc *kp, int *osrelp)
#define PROC_AUXV_MAX 256
-#if __ELF_WORD_SIZE == 64
+#ifdef PS_ARCH_HAS_FREEBSD32
static const char *elf32_sv_names[] = {
"Linux ELF32",
"FreeBSD ELF32",
@@ -2392,7 +2376,7 @@ is_elf32_sysctl(pid_t pid)
{
int error, name[4];
size_t len, i;
- static char sv_name[256];
+ char sv_name[32];
name[0] = CTL_KERN;
name[1] = KERN_PROC;
@@ -2414,7 +2398,6 @@ procstat_getauxv32_sysctl(pid_t pid, unsigned int *cntp)
{
Elf_Auxinfo *auxv;
Elf32_Auxinfo *auxv32;
- void *ptr;
size_t len;
unsigned int i, count;
int name[4];
@@ -2435,8 +2418,8 @@ procstat_getauxv32_sysctl(pid_t pid, unsigned int *cntp)
warn("sysctl: kern.proc.auxv: %d: %d", pid, errno);
goto out;
}
- count = len / sizeof(Elf_Auxinfo);
- auxv = malloc(count * sizeof(Elf_Auxinfo));
+ count = len / sizeof(Elf32_Auxinfo);
+ auxv = malloc(count * sizeof(Elf_Auxinfo));
if (auxv == NULL) {
warn("malloc(%zu)", count * sizeof(Elf_Auxinfo));
goto out;
@@ -2448,15 +2431,24 @@ procstat_getauxv32_sysctl(pid_t pid, unsigned int *cntp)
* necessarily true.
*/
auxv[i].a_type = auxv32[i].a_type;
- ptr = &auxv32[i].a_un;
- auxv[i].a_un.a_val = *((uint32_t *)ptr);
+ /*
+ * Don't sign extend values. Existing entries are positive
+ * integers or pointers. Under freebsd32, programs typically
+ * have a full [0, 2^32) address space (perhaps minus the last
+ * page) and treating this as a signed integer would be
+ * confusing since these are not kernel pointers.
+ *
+ * XXX: A more complete translation would be ABI and
+ * type-aware.
+ */
+ auxv[i].a_un.a_val = (uint32_t)auxv32[i].a_un.a_val;
}
*cntp = count;
out:
free(auxv32);
return (auxv);
}
-#endif /* __ELF_WORD_SIZE == 64 */
+#endif /* PS_ARCH_HAS_FREEBSD32 */
static Elf_Auxinfo *
procstat_getauxv_sysctl(pid_t pid, unsigned int *cntp)
@@ -2465,7 +2457,7 @@ procstat_getauxv_sysctl(pid_t pid, unsigned int *cntp)
int name[4];
size_t len;
-#if __ELF_WORD_SIZE == 64
+#ifdef PS_ARCH_HAS_FREEBSD32
if (is_elf32_sysctl(pid))
return (procstat_getauxv32_sysctl(pid, cntp));
#endif
@@ -2506,7 +2498,7 @@ Elf_Auxinfo *
procstat_getauxv(struct procstat *procstat, struct kinfo_proc *kp,
unsigned int *cntp)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
warnx("kvm method is not supported");
return (NULL);
@@ -2620,7 +2612,7 @@ struct kinfo_kstack *
procstat_getkstack(struct procstat *procstat, struct kinfo_proc *kp,
unsigned int *cntp)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
warnx("kvm method is not supported");
return (NULL);
@@ -2749,7 +2741,7 @@ fail:
struct advlock_list *
procstat_getadvlock(struct procstat *procstat)
{
- switch(procstat->type) {
+ switch (procstat->type) {
case PROCSTAT_KVM:
warnx("kvm method is not supported");
return (NULL);
@@ -2777,3 +2769,151 @@ procstat_freeadvlock(struct procstat *procstat __unused,
free(lst);
}
+static rlim_t *
+procstat_getrlimitusage_sysctl(pid_t pid, unsigned *cntp)
+{
+ int error, name[4];
+ rlim_t *val;
+ size_t len;
+
+ name[0] = CTL_KERN;
+ name[1] = KERN_PROC;
+ name[2] = KERN_PROC_RLIMIT_USAGE;
+ name[3] = pid;
+
+ len = 0;
+ error = sysctl(name, nitems(name), NULL, &len, NULL, 0);
+ if (error == -1)
+ return (NULL);
+ val = malloc(len);
+ if (val == NULL)
+ return (NULL);
+
+ error = sysctl(name, nitems(name), val, &len, NULL, 0);
+ if (error == -1) {
+ free(val);
+ return (NULL);
+ }
+ *cntp = len / sizeof(rlim_t);
+ return (val);
+}
+
+rlim_t *
+procstat_getrlimitusage(struct procstat *procstat, struct kinfo_proc *kp,
+ unsigned int *cntp)
+{
+ switch (procstat->type) {
+ case PROCSTAT_KVM:
+ warnx("kvm method is not supported");
+ return (NULL);
+ case PROCSTAT_SYSCTL:
+ return (procstat_getrlimitusage_sysctl(kp->ki_pid, cntp));
+ case PROCSTAT_CORE:
+ warnx("core method is not supported");
+ return (NULL);
+ default:
+ warnx("unknown access method: %d", procstat->type);
+ return (NULL);
+ }
+}
+
+void
+procstat_freerlimitusage(struct procstat *procstat __unused, rlim_t *resusage)
+{
+ free(resusage);
+}
+
+static struct kinfo_knote *
+procstat_get_kqueue_info_sysctl(pid_t pid, int kqfd, unsigned int *cntp,
+ char *errbuf)
+{
+ int error, name[5];
+ struct kinfo_knote *val;
+ size_t len;
+
+ name[0] = CTL_KERN;
+ name[1] = KERN_PROC;
+ name[2] = KERN_PROC_KQUEUE;
+ name[3] = pid;
+ name[4] = kqfd;
+
+ len = 0;
+ error = sysctl(name, nitems(name), NULL, &len, NULL, 0);
+ if (error == -1) {
+ snprintf(errbuf, _POSIX2_LINE_MAX,
+ "KERN_PROC_KQUEUE.pid<%d>.kq<%d> (size q) failed: %s",
+ pid, kqfd, strerror(errno));
+ return (NULL);
+ }
+ val = malloc(len);
+ if (val == NULL) {
+ snprintf(errbuf, _POSIX2_LINE_MAX, "no memory");
+ return (NULL);
+ }
+
+ error = sysctl(name, nitems(name), val, &len, NULL, 0);
+ if (error == -1) {
+ snprintf(errbuf, _POSIX2_LINE_MAX,
+ "KERN_PROC_KQUEUE.pid<%d>.kq<%d> failed: %s",
+ pid, kqfd, strerror(errno));
+ free(val);
+ return (NULL);
+ }
+ *cntp = len / sizeof(*val);
+ return (val);
+}
+
+struct kinfo_knote *
+procstat_get_kqueue_info(struct procstat *procstat,
+ struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf)
+{
+ struct kinfo_knote *kn, *k, *res, *rn;
+ size_t len, kqn;
+
+ switch (procstat->type) {
+ case PROCSTAT_KVM:
+ warnx("kvm method is not supported");
+ return (NULL);
+ case PROCSTAT_SYSCTL:
+ return (procstat_get_kqueue_info_sysctl(kp->ki_pid, kqfd,
+ count, errbuf));
+ case PROCSTAT_CORE:
+ k = procstat_core_get(procstat->core, PSC_TYPE_KQUEUES,
+ NULL, &len);
+ if (k == NULL) {
+ snprintf(errbuf, _POSIX2_LINE_MAX,
+ "getting NT_PROCSTAT_KQUEUES note failed");
+ *count = 0;
+ return (NULL);
+ }
+ for (kqn = 0, kn = k; kn < k + len / sizeof(*kn); kn++) {
+ if (kn->knt_kq_fd == kqfd)
+ kqn++;
+ }
+ res = calloc(kqn, sizeof(*res));
+ if (res == NULL) {
+ free(k);
+ snprintf(errbuf, _POSIX2_LINE_MAX,
+ "no memory");
+ return (NULL);
+ }
+ for (kn = k, rn = res; kn < k + len / sizeof(*kn); kn++) {
+ if (kn->knt_kq_fd != kqfd)
+ continue;
+ *rn = *kn;
+ rn++;
+ }
+ *count = kqn;
+ free(k);
+ return (res);
+ default:
+ warnx("unknown access method: %d", procstat->type);
+ return (NULL);
+ }
+}
+
+void
+procstat_freekqinfo(struct procstat *procstat __unused, struct kinfo_knote *v)
+{
+ free(v);
+}
diff --git a/lib/libprocstat/libprocstat.h b/lib/libprocstat/libprocstat.h
index 0df01817663e..548747f90171 100644
--- a/lib/libprocstat/libprocstat.h
+++ b/lib/libprocstat/libprocstat.h
@@ -71,6 +71,7 @@
#define PS_FST_TYPE_PROCDESC 13
#define PS_FST_TYPE_DEV 14
#define PS_FST_TYPE_EVENTFD 15
+#define PS_FST_TYPE_INOTIFY 16
/*
* Special descriptor numbers.
@@ -102,9 +103,15 @@
#define PS_FST_FFLAG_EXEC 0x2000
#define PS_FST_FFLAG_HASLOCK 0x4000
+#if !defined(__ILP32__) && !defined(__riscv)
+/* Target architecture supports 32-bit compat */
+#define PS_ARCH_HAS_FREEBSD32 1
+#endif
+
struct kinfo_kstack;
struct kinfo_proc;
struct kinfo_vmentry;
+struct kinfo_knote;
struct procstat;
struct ptrace_lwpinfo;
struct rlimit;
@@ -149,7 +156,6 @@ struct shmstat {
uint16_t mode;
};
struct sockstat {
- uint64_t inp_ppcb;
uint64_t so_addr;
uint64_t so_pcb;
uint64_t unp_conn;
@@ -200,6 +206,7 @@ void procstat_freeauxv(struct procstat *procstat, Elf_Auxinfo *auxv);
#endif
void procstat_freeenvv(struct procstat *procstat);
void procstat_freegroups(struct procstat *procstat, gid_t *groups);
+void procstat_freekqinfo(struct procstat *procstat, struct kinfo_knote *kni);
void procstat_freekstack(struct procstat *procstat,
struct kinfo_kstack *kkstp);
void procstat_freeprocs(struct procstat *procstat, struct kinfo_proc *p);
@@ -207,6 +214,7 @@ void procstat_freefiles(struct procstat *procstat,
struct filestat_list *head);
void procstat_freeptlwpinfo(struct procstat *procstat,
struct ptrace_lwpinfo *pl);
+void procstat_freerlimitusage(struct procstat *procstat, rlim_t *resusage);
void procstat_freevmmap(struct procstat *procstat,
struct kinfo_vmentry *vmmap);
struct advlock_list *procstat_getadvlock(struct procstat *procstat);
@@ -214,6 +222,8 @@ struct filestat_list *procstat_getfiles(struct procstat *procstat,
struct kinfo_proc *kp, int mmapped);
struct kinfo_proc *procstat_getprocs(struct procstat *procstat,
int what, int arg, unsigned int *count);
+struct kinfo_knote *procstat_get_kqueue_info(struct procstat *procstat,
+ struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf);
int procstat_get_pipe_info(struct procstat *procstat, struct filestat *fst,
struct pipestat *pipe, char *errbuf);
int procstat_get_pts_info(struct procstat *procstat, struct filestat *fst,
@@ -246,6 +256,8 @@ int procstat_getpathname(struct procstat *procstat, struct kinfo_proc *kp,
char *pathname, size_t maxlen);
int procstat_getrlimit(struct procstat *procstat, struct kinfo_proc *kp,
int which, struct rlimit* rlimit);
+rlim_t *procstat_getrlimitusage(struct procstat *procstat,
+ struct kinfo_proc *kp, unsigned int *cntp);
int procstat_getumask(struct procstat *procstat, struct kinfo_proc *kp,
unsigned short* umask);
struct kinfo_vmentry *procstat_getvmmap(struct procstat *procstat,
diff --git a/lib/libprocstat/libprocstat_compat.c b/lib/libprocstat/libprocstat_compat.c
index 58c4ce0d2558..63eb35678752 100644
--- a/lib/libprocstat/libprocstat_compat.c
+++ b/lib/libprocstat/libprocstat_compat.c
@@ -24,7 +24,6 @@
* SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/user.h>
#include <sys/socket.h>
@@ -183,7 +182,7 @@ freebsd11_procstat_get_socket_info(struct procstat *procstat, struct filestat *f
r = procstat_get_socket_info(procstat, fst, &sock, errbuf);
if (r != 0)
return (r);
- sock_compat->inp_ppcb = sock.inp_ppcb;
+ sock_compat->inp_ppcb = sock.so_pcb;
sock_compat->so_addr = sock.so_addr;
sock_compat->so_pcb = sock.so_pcb;
sock_compat->unp_conn = sock.unp_conn;
diff --git a/lib/libprocstat/msdosfs.c b/lib/libprocstat/msdosfs.c
index bb1ad65e6b1a..01345bb8d334 100644
--- a/lib/libprocstat/msdosfs.c
+++ b/lib/libprocstat/msdosfs.c
@@ -44,17 +44,15 @@
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/vnode.h>
+#include <sys/mount.h>
#include <netinet/in.h>
-#define _KERNEL
-#include <sys/mount.h>
+#define _WANT_MSDOSFS_INTERNALS
#include <fs/msdosfs/bpb.h>
#include <fs/msdosfs/msdosfsmount.h>
-#undef _KERNEL
-
-#include <fs/msdosfs/denode.h>
#include <fs/msdosfs/direntry.h>
+#include <fs/msdosfs/denode.h>
#include <fs/msdosfs/fat.h>
#include <err.h>
@@ -62,13 +60,6 @@
#include <stdio.h>
#include <stdlib.h>
-/*
- * XXX -
- * VTODE is defined in denode.h only if _KERNEL is defined, but that leads to
- * header explosion
- */
-#define VTODE(vp) ((struct denode *)getvnodedata(vp))
-
#include "libprocstat.h"
#include "common_kvm.h"
diff --git a/lib/libprocstat/smbfs.c b/lib/libprocstat/smbfs.c
index 136cceacb471..cbd32cf8f597 100644
--- a/lib/libprocstat/smbfs.c
+++ b/lib/libprocstat/smbfs.c
@@ -32,9 +32,8 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/vnode.h>
-#define _KERNEL
+#define _WANT_MOUNT
#include <sys/mount.h>
-#undef _KERNEL
#include <netinet/in.h>
diff --git a/lib/libprocstat/udf.c b/lib/libprocstat/udf.c
index 9a110950f8b0..3298af6dec5f 100644
--- a/lib/libprocstat/udf.c
+++ b/lib/libprocstat/udf.c
@@ -32,9 +32,7 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/vnode.h>
-#define _KERNEL
#include <sys/mount.h>
-#undef _KERNEL
#include <netinet/in.h>
diff --git a/lib/libprocstat/zfs.c b/lib/libprocstat/zfs.c
index 422f923ac15c..6dc23d7573fd 100644
--- a/lib/libprocstat/zfs.c
+++ b/lib/libprocstat/zfs.c
@@ -26,37 +26,36 @@
* SUCH DAMAGE.
*/
-#include <stdbool.h>
-
#include <sys/param.h>
-#define _KERNEL
+#define _WANT_MOUNT
#include <sys/mount.h>
-#undef _KERNEL
#include <sys/queue.h>
#include <sys/stat.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/vnode.h>
+#define _WANT_ZNODE
+#include <sys/zfs_context.h>
+#include <sys/zfs_znode.h>
#include <netinet/in.h>
#include <err.h>
#include <kvm.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define ZFS
#include "libprocstat.h"
#include "common_kvm.h"
-#include "zfs_defs.h"
int
zfs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn)
{
struct mount mount, *mountptr;
- void *znodeptr;
- char *dataptr;
+ znode_t *kznodeptr, *znode;
size_t len;
int size;
@@ -65,27 +64,30 @@ zfs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn)
warnx("error getting sysctl");
return (1);
}
- dataptr = malloc(size);
- if (dataptr == NULL) {
+ znode = malloc(size);
+ if (znode == NULL) {
warnx("error allocating memory for znode storage");
return (1);
}
- if ((size_t)size < offsetof_z_id + sizeof(uint64_t) ||
- (size_t)size < offsetof_z_mode + sizeof(mode_t) ||
- (size_t)size < offsetof_z_size + sizeof(uint64_t)) {
+ if ((size_t)size != sizeof(znode_t))
+ warnx("znode_t size mismatch, data could be wrong");
+
+ if ((size_t)size < offsetof(znode_t, z_id) + sizeof(znode->z_id) ||
+ (size_t)size < offsetof(znode_t, z_mode) + sizeof(znode->z_mode) ||
+ (size_t)size < offsetof(znode_t, z_size) + sizeof(znode->z_size)) {
warnx("znode_t size is too small");
goto bad;
}
- if ((size_t)size != sizeof_znode_t)
- warnx("znode_t size mismatch, data could be wrong");
-
- /* Since we have problems including vnode.h, we'll use the wrappers. */
- znodeptr = getvnodedata(vp);
- if (!kvm_read_all(kd, (unsigned long)znodeptr, dataptr,
- (size_t)size)) {
- warnx("can't read znode at %p", (void *)znodeptr);
+ /*
+ * OpenZFS's libspl provides a dummy sys/vnode.h that shadows ours so
+ * struct vnode is an incomplete type. Use the wrapper until that is
+ * resolved.
+ */
+ kznodeptr = getvnodedata(vp);
+ if (!kvm_read_all(kd, (unsigned long)kznodeptr, znode, (size_t)size)) {
+ warnx("can't read znode at %p", (void *)kznodeptr);
goto bad;
}
@@ -101,12 +103,10 @@ zfs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn)
* under .zfs/.
*/
vn->vn_fsid = mount.mnt_stat.f_fsid.val[0];
- vn->vn_fileid = *(uint64_t *)(void *)(dataptr + offsetof_z_id);
- vn->vn_mode = *(mode_t *)(void *)(dataptr + offsetof_z_mode);
- vn->vn_size = *(uint64_t *)(void *)(dataptr + offsetof_z_size);
- free(dataptr);
+ vn->vn_fileid = znode->z_id;
+ vn->vn_mode = znode->z_mode;
+ vn->vn_size = znode->z_size;
return (0);
bad:
- free(dataptr);
return (1);
}
diff --git a/lib/libprocstat/zfs/Makefile b/lib/libprocstat/zfs/Makefile
deleted file mode 100644
index da689fdd3e81..000000000000
--- a/lib/libprocstat/zfs/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-
-.PATH: ${.CURDIR:H}
-
-SRCS= zfs_defs.c
-OBJS= zfs_defs.o
-WARNS?= 1
-
-
-CFLAGS+= -DIN_BASE -D__KERNEL__ -D_KERNEL -I. -I${.CURDIR}
-CFLAGS+= -I${SRCTOP}/sys/contrib/openzfs/include
-CFLAGS+= -I${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/spl
-CFLAGS+= -I${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/
-CFLAGS+= -I${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/zfs
-CFLAGS+= -I${SRCTOP}/sys/contrib/ck/include
-
-CFLAGS+= -I${SRCTOP}/sys -I. -I..
-CFLAGS+= -I${SRCTOP}/sys/contrib/openzfs/module/icp/include
-CFLAGS+= -include ${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/spl/sys/ccompile.h
-CFLAGS+= -DHAVE_ISSETUGID -D_SYS_VMEM_H_ -UKLD_TIED -DKLD_MODULE
-
-CFLAGS+= -fno-builtin -nostdlib
-
-all: ${OBJS}
-CLEANFILES= ${OBJS}
-
-.include <bsd.lib.mk>
diff --git a/lib/libprocstat/zfs/Makefile.depend b/lib/libprocstat/zfs/Makefile.depend
deleted file mode 100644
index 993ab0638f4a..000000000000
--- a/lib/libprocstat/zfs/Makefile.depend
+++ /dev/null
@@ -1,11 +0,0 @@
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- include \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/lib/libprocstat/zfs_defs.c b/lib/libprocstat/zfs_defs.c
deleted file mode 100644
index c03c99249f42..000000000000
--- a/lib/libprocstat/zfs_defs.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2020 Andriy Gapon <avg@FreeBSD.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-/*
- * Prevent some headers from getting included and fake some types
- * in order to allow this file to compile without bringing in
- * too many kernel build dependencies.
- */
-#define _OPENSOLARIS_SYS_PATHNAME_H_
-#define _OPENSOLARIS_SYS_POLICY_H_
-#define _VNODE_PAGER_
-
-
-enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD,
- VMARKER };
-
-/*
- * Vnode attributes. A field value of VNOVAL represents a field whose value
- * is unavailable (getattr) or which is not to be changed (setattr).
- */
-struct vattr {
- enum vtype va_type; /* vnode type (for create) */
- u_short va_mode; /* files access mode and type */
- u_short va_padding0;
- uid_t va_uid; /* owner user id */
- gid_t va_gid; /* owner group id */
- nlink_t va_nlink; /* number of references to file */
- dev_t va_fsid; /* filesystem id */
- ino_t va_fileid; /* file id */
- u_quad_t va_size; /* file size in bytes */
- long va_blocksize; /* blocksize preferred for i/o */
- struct timespec va_atime; /* time of last access */
- struct timespec va_mtime; /* time of last modification */
- struct timespec va_ctime; /* time file changed */
- struct timespec va_birthtime; /* time file created */
- u_long va_gen; /* generation number of file */
- u_long va_flags; /* flags defined for file */
- dev_t va_rdev; /* device the special file represents */
- u_quad_t va_bytes; /* bytes of disk space held by file */
- u_quad_t va_filerev; /* file modification number */
- u_int va_vaflags; /* operations flags, see below */
- long va_spare; /* remain quad aligned */
-};
-
-#define _WANT_MOUNT
-#include <sys/zfs_context.h>
-#include <sys/zfs_znode.h>
-
-size_t sizeof_znode_t = sizeof(znode_t);
-size_t offsetof_z_id = offsetof(znode_t, z_id);
-size_t offsetof_z_size = offsetof(znode_t, z_size);
-size_t offsetof_z_mode = offsetof(znode_t, z_mode);
-
-/* Keep pcpu.h satisfied. */
-uintptr_t *__start_set_pcpu;
-uintptr_t *__stop_set_pcpu;
diff --git a/lib/libprocstat/zfs_defs.h b/lib/libprocstat/zfs_defs.h
deleted file mode 100644
index de17efba5630..000000000000
--- a/lib/libprocstat/zfs_defs.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2020 Andriy Gapon <avg@FreeBSD.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _LIBPROCSTAT_ZFS_DEFS_H
-#define _LIBPROCSTAT_ZFS_DEFS_H
-
-extern size_t sizeof_znode_t;
-extern size_t offsetof_z_id;
-extern size_t offsetof_z_size;
-extern size_t offsetof_z_mode;
-
-#endif /* _LIBPROCSTAT_ZFS_DEFS_H */