10daf62d9SStanislav Sedov /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 35e53a4f9SPedro F. Giffuni * 40daf62d9SStanislav Sedov * Copyright (c) 2009 Stanislav Sedov <stas@FreeBSD.org> 586be94fcSTycho Nightingale * Copyright (c) 2017 Dell EMC 60daf62d9SStanislav Sedov * All rights reserved. 70daf62d9SStanislav Sedov * 80daf62d9SStanislav Sedov * Redistribution and use in source and binary forms, with or without 90daf62d9SStanislav Sedov * modification, are permitted provided that the following conditions 100daf62d9SStanislav Sedov * are met: 110daf62d9SStanislav Sedov * 1. Redistributions of source code must retain the above copyright 120daf62d9SStanislav Sedov * notice, this list of conditions and the following disclaimer. 130daf62d9SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright 140daf62d9SStanislav Sedov * notice, this list of conditions and the following disclaimer in the 150daf62d9SStanislav Sedov * documentation and/or other materials provided with the distribution. 160daf62d9SStanislav Sedov * 170daf62d9SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 180daf62d9SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 190daf62d9SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 200daf62d9SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 210daf62d9SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 220daf62d9SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 230daf62d9SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 240daf62d9SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 250daf62d9SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 260daf62d9SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 270daf62d9SStanislav Sedov * SUCH DAMAGE. 280daf62d9SStanislav Sedov */ 290daf62d9SStanislav Sedov 300daf62d9SStanislav Sedov #ifndef _LIBPROCSTAT_H_ 310daf62d9SStanislav Sedov #define _LIBPROCSTAT_H_ 320daf62d9SStanislav Sedov 330daf62d9SStanislav Sedov /* 342ff020d3SMikolaj Golub * XXX: sys/elf.h conflicts with zfs_context.h. Workaround this by not 352ff020d3SMikolaj Golub * including conflicting parts when building zfs code. 362ff020d3SMikolaj Golub */ 372ff020d3SMikolaj Golub #ifndef ZFS 382ff020d3SMikolaj Golub #include <sys/elf.h> 392ff020d3SMikolaj Golub #endif 407008be5bSPawel Jakub Dawidek #include <sys/caprights.h> 412ff020d3SMikolaj Golub 422ff020d3SMikolaj Golub /* 430daf62d9SStanislav Sedov * Vnode types. 440daf62d9SStanislav Sedov */ 450daf62d9SStanislav Sedov #define PS_FST_VTYPE_VNON 1 460daf62d9SStanislav Sedov #define PS_FST_VTYPE_VREG 2 470daf62d9SStanislav Sedov #define PS_FST_VTYPE_VDIR 3 480daf62d9SStanislav Sedov #define PS_FST_VTYPE_VBLK 4 490daf62d9SStanislav Sedov #define PS_FST_VTYPE_VCHR 5 500daf62d9SStanislav Sedov #define PS_FST_VTYPE_VLNK 6 510daf62d9SStanislav Sedov #define PS_FST_VTYPE_VSOCK 7 520daf62d9SStanislav Sedov #define PS_FST_VTYPE_VFIFO 8 530daf62d9SStanislav Sedov #define PS_FST_VTYPE_VBAD 9 540daf62d9SStanislav Sedov #define PS_FST_VTYPE_UNKNOWN 255 550daf62d9SStanislav Sedov 560daf62d9SStanislav Sedov /* 570daf62d9SStanislav Sedov * Descriptor types. 580daf62d9SStanislav Sedov */ 590daf62d9SStanislav Sedov #define PS_FST_TYPE_VNODE 1 600daf62d9SStanislav Sedov #define PS_FST_TYPE_FIFO 2 610daf62d9SStanislav Sedov #define PS_FST_TYPE_SOCKET 3 620daf62d9SStanislav Sedov #define PS_FST_TYPE_PIPE 4 630daf62d9SStanislav Sedov #define PS_FST_TYPE_PTS 5 640daf62d9SStanislav Sedov #define PS_FST_TYPE_KQUEUE 6 65688f8b82SJohn Baldwin /* was PS_FST_TYPE_CRYPTO 7 */ 660daf62d9SStanislav Sedov #define PS_FST_TYPE_MQUEUE 8 670daf62d9SStanislav Sedov #define PS_FST_TYPE_SHM 9 680daf62d9SStanislav Sedov #define PS_FST_TYPE_SEM 10 690daf62d9SStanislav Sedov #define PS_FST_TYPE_UNKNOWN 11 700daf62d9SStanislav Sedov #define PS_FST_TYPE_NONE 12 713cfa7c6eSEdward Tomasz Napierala #define PS_FST_TYPE_PROCDESC 13 72a66732deSKonstantin Belousov #define PS_FST_TYPE_DEV 14 7367af9abaSKonstantin Belousov #define PS_FST_TYPE_EVENTFD 15 740daf62d9SStanislav Sedov 750daf62d9SStanislav Sedov /* 760daf62d9SStanislav Sedov * Special descriptor numbers. 770daf62d9SStanislav Sedov */ 780daf62d9SStanislav Sedov #define PS_FST_UFLAG_RDIR 0x0001 790daf62d9SStanislav Sedov #define PS_FST_UFLAG_CDIR 0x0002 800daf62d9SStanislav Sedov #define PS_FST_UFLAG_JAIL 0x0004 810daf62d9SStanislav Sedov #define PS_FST_UFLAG_TRACE 0x0008 820daf62d9SStanislav Sedov #define PS_FST_UFLAG_TEXT 0x0010 830daf62d9SStanislav Sedov #define PS_FST_UFLAG_MMAP 0x0020 840daf62d9SStanislav Sedov #define PS_FST_UFLAG_CTTY 0x0040 850daf62d9SStanislav Sedov 860daf62d9SStanislav Sedov /* 870daf62d9SStanislav Sedov * Descriptor flags. 880daf62d9SStanislav Sedov */ 890daf62d9SStanislav Sedov #define PS_FST_FFLAG_READ 0x0001 900daf62d9SStanislav Sedov #define PS_FST_FFLAG_WRITE 0x0002 910daf62d9SStanislav Sedov #define PS_FST_FFLAG_NONBLOCK 0x0004 920daf62d9SStanislav Sedov #define PS_FST_FFLAG_APPEND 0x0008 930daf62d9SStanislav Sedov #define PS_FST_FFLAG_SHLOCK 0x0010 940daf62d9SStanislav Sedov #define PS_FST_FFLAG_EXLOCK 0x0020 950daf62d9SStanislav Sedov #define PS_FST_FFLAG_ASYNC 0x0040 960daf62d9SStanislav Sedov #define PS_FST_FFLAG_SYNC 0x0080 970daf62d9SStanislav Sedov #define PS_FST_FFLAG_NOFOLLOW 0x0100 980daf62d9SStanislav Sedov #define PS_FST_FFLAG_CREAT 0x0200 990daf62d9SStanislav Sedov #define PS_FST_FFLAG_TRUNC 0x0400 1000daf62d9SStanislav Sedov #define PS_FST_FFLAG_EXCL 0x0800 1010daf62d9SStanislav Sedov #define PS_FST_FFLAG_DIRECT 0x1000 1020daf62d9SStanislav Sedov #define PS_FST_FFLAG_EXEC 0x2000 1030daf62d9SStanislav Sedov #define PS_FST_FFLAG_HASLOCK 0x4000 1040daf62d9SStanislav Sedov 105248fe3d3SBrooks Davis #if !defined(__ILP32__) && !defined(__riscv) 106248fe3d3SBrooks Davis /* Target architecture supports 32-bit compat */ 107248fe3d3SBrooks Davis #define PS_ARCH_HAS_FREEBSD32 1 108248fe3d3SBrooks Davis #endif 109248fe3d3SBrooks Davis 11089358231SMikolaj Golub struct kinfo_kstack; 111a28f8335SBrooks Davis struct kinfo_proc; 11239680c7bSMikolaj Golub struct kinfo_vmentry; 113*bf46aec4SKonstantin Belousov struct kinfo_knote; 1140daf62d9SStanislav Sedov struct procstat; 11586be94fcSTycho Nightingale struct ptrace_lwpinfo; 1167cc0ebfdSMikolaj Golub struct rlimit; 1170daf62d9SStanislav Sedov struct filestat { 1180daf62d9SStanislav Sedov int fs_type; /* Descriptor type. */ 1190daf62d9SStanislav Sedov int fs_flags; /* filestat specific flags. */ 1200daf62d9SStanislav Sedov int fs_fflags; /* Descriptor access flags. */ 1210daf62d9SStanislav Sedov int fs_uflags; /* How this file is used. */ 1220daf62d9SStanislav Sedov int fs_fd; /* File descriptor number. */ 1230daf62d9SStanislav Sedov int fs_ref_count; /* Reference count. */ 1240daf62d9SStanislav Sedov off_t fs_offset; /* Seek location. */ 1250daf62d9SStanislav Sedov void *fs_typedep; /* Type dependent data. */ 1260daf62d9SStanislav Sedov char *fs_path; 1270daf62d9SStanislav Sedov STAILQ_ENTRY(filestat) next; 128d57486e2SRobert Watson cap_rights_t fs_cap_rights; /* Capability rights, if flag set. */ 1290daf62d9SStanislav Sedov }; 1300daf62d9SStanislav Sedov struct vnstat { 1310daf62d9SStanislav Sedov uint64_t vn_fileid; 1320daf62d9SStanislav Sedov uint64_t vn_size; 13369921123SKonstantin Belousov uint64_t vn_dev; 13469921123SKonstantin Belousov uint64_t vn_fsid; 1350daf62d9SStanislav Sedov char *vn_mntdir; 1360daf62d9SStanislav Sedov int vn_type; 1370daf62d9SStanislav Sedov uint16_t vn_mode; 1380daf62d9SStanislav Sedov char vn_devname[SPECNAMELEN + 1]; 1390daf62d9SStanislav Sedov }; 1400daf62d9SStanislav Sedov struct ptsstat { 14169921123SKonstantin Belousov uint64_t dev; 1420daf62d9SStanislav Sedov char devname[SPECNAMELEN + 1]; 1430daf62d9SStanislav Sedov }; 1440daf62d9SStanislav Sedov struct pipestat { 1450daf62d9SStanislav Sedov size_t buffer_cnt; 1460daf62d9SStanislav Sedov uint64_t addr; 1470daf62d9SStanislav Sedov uint64_t peer; 1480daf62d9SStanislav Sedov }; 149958aa575SJohn Baldwin struct semstat { 150958aa575SJohn Baldwin uint32_t value; 151958aa575SJohn Baldwin uint16_t mode; 152958aa575SJohn Baldwin }; 153e506e182SJohn Baldwin struct shmstat { 154e506e182SJohn Baldwin uint64_t size; 155e506e182SJohn Baldwin uint16_t mode; 156e506e182SJohn Baldwin }; 1570daf62d9SStanislav Sedov struct sockstat { 1580daf62d9SStanislav Sedov uint64_t so_addr; 1590daf62d9SStanislav Sedov uint64_t so_pcb; 1600daf62d9SStanislav Sedov uint64_t unp_conn; 1610daf62d9SStanislav Sedov int dom_family; 1620daf62d9SStanislav Sedov int proto; 1630daf62d9SStanislav Sedov int so_rcv_sb_state; 1640daf62d9SStanislav Sedov int so_snd_sb_state; 1650daf62d9SStanislav Sedov struct sockaddr_storage sa_local; /* Socket address. */ 1660daf62d9SStanislav Sedov struct sockaddr_storage sa_peer; /* Peer address. */ 1670daf62d9SStanislav Sedov int type; 1680daf62d9SStanislav Sedov char dname[32]; 16995b97895SConrad Meyer unsigned int sendq; 17095b97895SConrad Meyer unsigned int recvq; 1710daf62d9SStanislav Sedov }; 1720daf62d9SStanislav Sedov 1730daf62d9SStanislav Sedov STAILQ_HEAD(filestat_list, filestat); 1740daf62d9SStanislav Sedov 175039d1496SKonstantin Belousov struct advlock { 176039d1496SKonstantin Belousov int rw; /* PS_ADVLOCK_RO/RW */ 177039d1496SKonstantin Belousov int type; /* PS_ADVLOCK_TYPE_ */ 178039d1496SKonstantin Belousov int pid; 179039d1496SKonstantin Belousov int sysid; 180039d1496SKonstantin Belousov uint64_t file_fsid; 181039d1496SKonstantin Belousov uint64_t file_rdev; 182039d1496SKonstantin Belousov uint64_t file_fileid; 183039d1496SKonstantin Belousov off_t start; 184039d1496SKonstantin Belousov off_t len; /* len == 0 till the EOF */ 185039d1496SKonstantin Belousov const char *path; 186039d1496SKonstantin Belousov STAILQ_ENTRY(advlock) next; 187039d1496SKonstantin Belousov }; 188039d1496SKonstantin Belousov 189039d1496SKonstantin Belousov #define PS_ADVLOCK_RO 0x01 190039d1496SKonstantin Belousov #define PS_ADVLOCK_RW 0x02 191039d1496SKonstantin Belousov 192039d1496SKonstantin Belousov #define PS_ADVLOCK_TYPE_FLOCK 0x01 193039d1496SKonstantin Belousov #define PS_ADVLOCK_TYPE_PID 0x02 194039d1496SKonstantin Belousov #define PS_ADVLOCK_TYPE_REMOTE 0x03 195039d1496SKonstantin Belousov 196039d1496SKonstantin Belousov STAILQ_HEAD(advlock_list, advlock); 197039d1496SKonstantin Belousov 198d1145837SMikolaj Golub __BEGIN_DECLS 1990daf62d9SStanislav Sedov void procstat_close(struct procstat *procstat); 200039d1496SKonstantin Belousov void procstat_freeadvlock(struct procstat *procstat, 201039d1496SKonstantin Belousov struct advlock_list *advlocks); 2024482b5e3SMikolaj Golub void procstat_freeargv(struct procstat *procstat); 2032ff020d3SMikolaj Golub #ifndef ZFS 2042ff020d3SMikolaj Golub void procstat_freeauxv(struct procstat *procstat, Elf_Auxinfo *auxv); 2052ff020d3SMikolaj Golub #endif 2064482b5e3SMikolaj Golub void procstat_freeenvv(struct procstat *procstat); 2077f1d14e6SMikolaj Golub void procstat_freegroups(struct procstat *procstat, gid_t *groups); 208*bf46aec4SKonstantin Belousov void procstat_freekqinfo(struct procstat *procstat, struct kinfo_knote *kni); 20989358231SMikolaj Golub void procstat_freekstack(struct procstat *procstat, 21089358231SMikolaj Golub struct kinfo_kstack *kkstp); 2110daf62d9SStanislav Sedov void procstat_freeprocs(struct procstat *procstat, struct kinfo_proc *p); 2120daf62d9SStanislav Sedov void procstat_freefiles(struct procstat *procstat, 2130daf62d9SStanislav Sedov struct filestat_list *head); 21486be94fcSTycho Nightingale void procstat_freeptlwpinfo(struct procstat *procstat, 21586be94fcSTycho Nightingale struct ptrace_lwpinfo *pl); 2166126f4eaSKonstantin Belousov void procstat_freerlimitusage(struct procstat *procstat, rlim_t *resusage); 21739680c7bSMikolaj Golub void procstat_freevmmap(struct procstat *procstat, 21839680c7bSMikolaj Golub struct kinfo_vmentry *vmmap); 219039d1496SKonstantin Belousov struct advlock_list *procstat_getadvlock(struct procstat *procstat); 2200daf62d9SStanislav Sedov struct filestat_list *procstat_getfiles(struct procstat *procstat, 2210daf62d9SStanislav Sedov struct kinfo_proc *kp, int mmapped); 2220daf62d9SStanislav Sedov struct kinfo_proc *procstat_getprocs(struct procstat *procstat, 2230daf62d9SStanislav Sedov int what, int arg, unsigned int *count); 224*bf46aec4SKonstantin Belousov struct kinfo_knote *procstat_get_kqueue_info(struct procstat *procstat, 225*bf46aec4SKonstantin Belousov struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf); 2260daf62d9SStanislav Sedov int procstat_get_pipe_info(struct procstat *procstat, struct filestat *fst, 2270daf62d9SStanislav Sedov struct pipestat *pipe, char *errbuf); 2280daf62d9SStanislav Sedov int procstat_get_pts_info(struct procstat *procstat, struct filestat *fst, 2290daf62d9SStanislav Sedov struct ptsstat *pts, char *errbuf); 230958aa575SJohn Baldwin int procstat_get_sem_info(struct procstat *procstat, struct filestat *fst, 231958aa575SJohn Baldwin struct semstat *sem, char *errbuf); 232e506e182SJohn Baldwin int procstat_get_shm_info(struct procstat *procstat, struct filestat *fst, 233e506e182SJohn Baldwin struct shmstat *shm, char *errbuf); 2340daf62d9SStanislav Sedov int procstat_get_socket_info(struct procstat *procstat, struct filestat *fst, 2350daf62d9SStanislav Sedov struct sockstat *sock, char *errbuf); 2360daf62d9SStanislav Sedov int procstat_get_vnode_info(struct procstat *procstat, struct filestat *fst, 2370daf62d9SStanislav Sedov struct vnstat *vn, char *errbuf); 2384482b5e3SMikolaj Golub char **procstat_getargv(struct procstat *procstat, struct kinfo_proc *p, 2394482b5e3SMikolaj Golub size_t nchr); 2402ff020d3SMikolaj Golub #ifndef ZFS 2412ff020d3SMikolaj Golub Elf_Auxinfo *procstat_getauxv(struct procstat *procstat, 2422ff020d3SMikolaj Golub struct kinfo_proc *kp, unsigned int *cntp); 2432ff020d3SMikolaj Golub #endif 24486be94fcSTycho Nightingale struct ptrace_lwpinfo *procstat_getptlwpinfo(struct procstat *procstat, 24586be94fcSTycho Nightingale unsigned int *cntp); 2464482b5e3SMikolaj Golub char **procstat_getenvv(struct procstat *procstat, struct kinfo_proc *p, 2474482b5e3SMikolaj Golub size_t nchr); 2487f1d14e6SMikolaj Golub gid_t *procstat_getgroups(struct procstat *procstat, struct kinfo_proc *kp, 2497f1d14e6SMikolaj Golub unsigned int *count); 25089358231SMikolaj Golub struct kinfo_kstack *procstat_getkstack(struct procstat *procstat, 25189358231SMikolaj Golub struct kinfo_proc *kp, unsigned int *count); 252eec6cb1cSMikolaj Golub int procstat_getosrel(struct procstat *procstat, struct kinfo_proc *kp, 253eec6cb1cSMikolaj Golub int *osrelp); 2544cdf9796SMikolaj Golub int procstat_getpathname(struct procstat *procstat, struct kinfo_proc *kp, 2554cdf9796SMikolaj Golub char *pathname, size_t maxlen); 2567cc0ebfdSMikolaj Golub int procstat_getrlimit(struct procstat *procstat, struct kinfo_proc *kp, 2577cc0ebfdSMikolaj Golub int which, struct rlimit* rlimit); 2586126f4eaSKonstantin Belousov rlim_t *procstat_getrlimitusage(struct procstat *procstat, 2596126f4eaSKonstantin Belousov struct kinfo_proc *kp, unsigned int *cntp); 2604cdf9796SMikolaj Golub int procstat_getumask(struct procstat *procstat, struct kinfo_proc *kp, 2614cdf9796SMikolaj Golub unsigned short* umask); 26239680c7bSMikolaj Golub struct kinfo_vmentry *procstat_getvmmap(struct procstat *procstat, 26339680c7bSMikolaj Golub struct kinfo_proc *kp, unsigned int *count); 2647153ad2bSMikolaj Golub struct procstat *procstat_open_core(const char *filename); 2650daf62d9SStanislav Sedov struct procstat *procstat_open_sysctl(void); 2660daf62d9SStanislav Sedov struct procstat *procstat_open_kvm(const char *nlistf, const char *memf); 267d1145837SMikolaj Golub __END_DECLS 2680daf62d9SStanislav Sedov 2690daf62d9SStanislav Sedov #endif /* !_LIBPROCSTAT_H_ */ 270