diff options
Diffstat (limited to 'lib/libprocstat')
-rw-r--r-- | lib/libprocstat/Makefile | 26 | ||||
-rw-r--r-- | lib/libprocstat/Symbol.map | 7 | ||||
-rw-r--r-- | lib/libprocstat/cd9660.c | 4 | ||||
-rw-r--r-- | lib/libprocstat/common_kvm.c | 1 | ||||
-rw-r--r-- | lib/libprocstat/core.c | 69 | ||||
-rw-r--r-- | lib/libprocstat/core.h | 3 | ||||
-rw-r--r-- | lib/libprocstat/libprocstat.c | 234 | ||||
-rw-r--r-- | lib/libprocstat/libprocstat.h | 14 | ||||
-rw-r--r-- | lib/libprocstat/libprocstat_compat.c | 3 | ||||
-rw-r--r-- | lib/libprocstat/msdosfs.c | 15 | ||||
-rw-r--r-- | lib/libprocstat/smbfs.c | 3 | ||||
-rw-r--r-- | lib/libprocstat/udf.c | 2 | ||||
-rw-r--r-- | lib/libprocstat/zfs.c | 50 | ||||
-rw-r--r-- | lib/libprocstat/zfs/Makefile | 26 | ||||
-rw-r--r-- | lib/libprocstat/zfs/Makefile.depend | 11 | ||||
-rw-r--r-- | lib/libprocstat/zfs_defs.c | 82 | ||||
-rw-r--r-- | lib/libprocstat/zfs_defs.h | 36 |
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 */ |