10daf62d9SStanislav Sedov /*- 20daf62d9SStanislav Sedov * Copyright (c) 2009 Stanislav Sedov <stas@FreeBSD.org> 30daf62d9SStanislav Sedov * All rights reserved. 40daf62d9SStanislav Sedov * 50daf62d9SStanislav Sedov * Redistribution and use in source and binary forms, with or without 60daf62d9SStanislav Sedov * modification, are permitted provided that the following conditions 70daf62d9SStanislav Sedov * are met: 80daf62d9SStanislav Sedov * 1. Redistributions of source code must retain the above copyright 90daf62d9SStanislav Sedov * notice, this list of conditions and the following disclaimer. 100daf62d9SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright 110daf62d9SStanislav Sedov * notice, this list of conditions and the following disclaimer in the 120daf62d9SStanislav Sedov * documentation and/or other materials provided with the distribution. 130daf62d9SStanislav Sedov * 140daf62d9SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 150daf62d9SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 160daf62d9SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 170daf62d9SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 180daf62d9SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 190daf62d9SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 200daf62d9SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 210daf62d9SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 220daf62d9SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 230daf62d9SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 240daf62d9SStanislav Sedov * SUCH DAMAGE. 250daf62d9SStanislav Sedov * 260daf62d9SStanislav Sedov * $FreeBSD$ 270daf62d9SStanislav Sedov */ 280daf62d9SStanislav Sedov 290daf62d9SStanislav Sedov #ifndef _LIBPROCSTAT_H_ 300daf62d9SStanislav Sedov #define _LIBPROCSTAT_H_ 310daf62d9SStanislav Sedov 320daf62d9SStanislav Sedov /* 330daf62d9SStanislav Sedov * Vnode types. 340daf62d9SStanislav Sedov */ 350daf62d9SStanislav Sedov #define PS_FST_VTYPE_VNON 1 360daf62d9SStanislav Sedov #define PS_FST_VTYPE_VREG 2 370daf62d9SStanislav Sedov #define PS_FST_VTYPE_VDIR 3 380daf62d9SStanislav Sedov #define PS_FST_VTYPE_VBLK 4 390daf62d9SStanislav Sedov #define PS_FST_VTYPE_VCHR 5 400daf62d9SStanislav Sedov #define PS_FST_VTYPE_VLNK 6 410daf62d9SStanislav Sedov #define PS_FST_VTYPE_VSOCK 7 420daf62d9SStanislav Sedov #define PS_FST_VTYPE_VFIFO 8 430daf62d9SStanislav Sedov #define PS_FST_VTYPE_VBAD 9 440daf62d9SStanislav Sedov #define PS_FST_VTYPE_UNKNOWN 255 450daf62d9SStanislav Sedov 460daf62d9SStanislav Sedov /* 470daf62d9SStanislav Sedov * Descriptor types. 480daf62d9SStanislav Sedov */ 490daf62d9SStanislav Sedov #define PS_FST_TYPE_VNODE 1 500daf62d9SStanislav Sedov #define PS_FST_TYPE_FIFO 2 510daf62d9SStanislav Sedov #define PS_FST_TYPE_SOCKET 3 520daf62d9SStanislav Sedov #define PS_FST_TYPE_PIPE 4 530daf62d9SStanislav Sedov #define PS_FST_TYPE_PTS 5 540daf62d9SStanislav Sedov #define PS_FST_TYPE_KQUEUE 6 550daf62d9SStanislav Sedov #define PS_FST_TYPE_CRYPTO 7 560daf62d9SStanislav Sedov #define PS_FST_TYPE_MQUEUE 8 570daf62d9SStanislav Sedov #define PS_FST_TYPE_SHM 9 580daf62d9SStanislav Sedov #define PS_FST_TYPE_SEM 10 590daf62d9SStanislav Sedov #define PS_FST_TYPE_UNKNOWN 11 600daf62d9SStanislav Sedov #define PS_FST_TYPE_NONE 12 610daf62d9SStanislav Sedov 620daf62d9SStanislav Sedov /* 630daf62d9SStanislav Sedov * Special descriptor numbers. 640daf62d9SStanislav Sedov */ 650daf62d9SStanislav Sedov #define PS_FST_UFLAG_RDIR 0x0001 660daf62d9SStanislav Sedov #define PS_FST_UFLAG_CDIR 0x0002 670daf62d9SStanislav Sedov #define PS_FST_UFLAG_JAIL 0x0004 680daf62d9SStanislav Sedov #define PS_FST_UFLAG_TRACE 0x0008 690daf62d9SStanislav Sedov #define PS_FST_UFLAG_TEXT 0x0010 700daf62d9SStanislav Sedov #define PS_FST_UFLAG_MMAP 0x0020 710daf62d9SStanislav Sedov #define PS_FST_UFLAG_CTTY 0x0040 720daf62d9SStanislav Sedov 730daf62d9SStanislav Sedov /* 740daf62d9SStanislav Sedov * Descriptor flags. 750daf62d9SStanislav Sedov */ 760daf62d9SStanislav Sedov #define PS_FST_FFLAG_READ 0x0001 770daf62d9SStanislav Sedov #define PS_FST_FFLAG_WRITE 0x0002 780daf62d9SStanislav Sedov #define PS_FST_FFLAG_NONBLOCK 0x0004 790daf62d9SStanislav Sedov #define PS_FST_FFLAG_APPEND 0x0008 800daf62d9SStanislav Sedov #define PS_FST_FFLAG_SHLOCK 0x0010 810daf62d9SStanislav Sedov #define PS_FST_FFLAG_EXLOCK 0x0020 820daf62d9SStanislav Sedov #define PS_FST_FFLAG_ASYNC 0x0040 830daf62d9SStanislav Sedov #define PS_FST_FFLAG_SYNC 0x0080 840daf62d9SStanislav Sedov #define PS_FST_FFLAG_NOFOLLOW 0x0100 850daf62d9SStanislav Sedov #define PS_FST_FFLAG_CREAT 0x0200 860daf62d9SStanislav Sedov #define PS_FST_FFLAG_TRUNC 0x0400 870daf62d9SStanislav Sedov #define PS_FST_FFLAG_EXCL 0x0800 880daf62d9SStanislav Sedov #define PS_FST_FFLAG_DIRECT 0x1000 890daf62d9SStanislav Sedov #define PS_FST_FFLAG_EXEC 0x2000 900daf62d9SStanislav Sedov #define PS_FST_FFLAG_HASLOCK 0x4000 910daf62d9SStanislav Sedov 920daf62d9SStanislav Sedov struct procstat; 930daf62d9SStanislav Sedov struct filestat { 940daf62d9SStanislav Sedov int fs_type; /* Descriptor type. */ 950daf62d9SStanislav Sedov int fs_flags; /* filestat specific flags. */ 960daf62d9SStanislav Sedov int fs_fflags; /* Descriptor access flags. */ 970daf62d9SStanislav Sedov int fs_uflags; /* How this file is used. */ 980daf62d9SStanislav Sedov int fs_fd; /* File descriptor number. */ 990daf62d9SStanislav Sedov int fs_ref_count; /* Reference count. */ 1000daf62d9SStanislav Sedov off_t fs_offset; /* Seek location. */ 1010daf62d9SStanislav Sedov void *fs_typedep; /* Type dependent data. */ 1020daf62d9SStanislav Sedov char *fs_path; 1030daf62d9SStanislav Sedov STAILQ_ENTRY(filestat) next; 1040daf62d9SStanislav Sedov }; 1050daf62d9SStanislav Sedov struct vnstat { 1060daf62d9SStanislav Sedov uint64_t vn_fileid; 1070daf62d9SStanislav Sedov uint64_t vn_size; 1080daf62d9SStanislav Sedov char *vn_mntdir; 1090daf62d9SStanislav Sedov uint32_t vn_dev; 1100daf62d9SStanislav Sedov uint32_t vn_fsid; 1110daf62d9SStanislav Sedov int vn_type; 1120daf62d9SStanislav Sedov uint16_t vn_mode; 1130daf62d9SStanislav Sedov char vn_devname[SPECNAMELEN + 1]; 1140daf62d9SStanislav Sedov }; 1150daf62d9SStanislav Sedov struct ptsstat { 1160daf62d9SStanislav Sedov uint32_t dev; 1170daf62d9SStanislav Sedov char devname[SPECNAMELEN + 1]; 1180daf62d9SStanislav Sedov }; 1190daf62d9SStanislav Sedov struct pipestat { 1200daf62d9SStanislav Sedov size_t buffer_cnt; 1210daf62d9SStanislav Sedov uint64_t addr; 1220daf62d9SStanislav Sedov uint64_t peer; 1230daf62d9SStanislav Sedov }; 1240daf62d9SStanislav Sedov struct sockstat { 1250daf62d9SStanislav Sedov uint64_t inp_ppcb; 1260daf62d9SStanislav Sedov uint64_t so_addr; 1270daf62d9SStanislav Sedov uint64_t so_pcb; 1280daf62d9SStanislav Sedov uint64_t unp_conn; 1290daf62d9SStanislav Sedov int dom_family; 1300daf62d9SStanislav Sedov int proto; 1310daf62d9SStanislav Sedov int so_rcv_sb_state; 1320daf62d9SStanislav Sedov int so_snd_sb_state; 1330daf62d9SStanislav Sedov struct sockaddr_storage sa_local; /* Socket address. */ 1340daf62d9SStanislav Sedov struct sockaddr_storage sa_peer; /* Peer address. */ 1350daf62d9SStanislav Sedov int type; 1360daf62d9SStanislav Sedov char dname[32]; 1370daf62d9SStanislav Sedov }; 1380daf62d9SStanislav Sedov 1390daf62d9SStanislav Sedov STAILQ_HEAD(filestat_list, filestat); 1400daf62d9SStanislav Sedov 1410daf62d9SStanislav Sedov void procstat_close(struct procstat *procstat); 1420daf62d9SStanislav Sedov void procstat_freeprocs(struct procstat *procstat, struct kinfo_proc *p); 1430daf62d9SStanislav Sedov void procstat_freefiles(struct procstat *procstat, 1440daf62d9SStanislav Sedov struct filestat_list *head); 1450daf62d9SStanislav Sedov struct filestat_list *procstat_getfiles(struct procstat *procstat, 1460daf62d9SStanislav Sedov struct kinfo_proc *kp, int mmapped); 1470daf62d9SStanislav Sedov struct kinfo_proc *procstat_getprocs(struct procstat *procstat, 1480daf62d9SStanislav Sedov int what, int arg, unsigned int *count); 1490daf62d9SStanislav Sedov int procstat_get_pipe_info(struct procstat *procstat, struct filestat *fst, 1500daf62d9SStanislav Sedov struct pipestat *pipe, char *errbuf); 1510daf62d9SStanislav Sedov int procstat_get_pts_info(struct procstat *procstat, struct filestat *fst, 1520daf62d9SStanislav Sedov struct ptsstat *pts, char *errbuf); 1530daf62d9SStanislav Sedov int procstat_get_socket_info(struct procstat *procstat, struct filestat *fst, 1540daf62d9SStanislav Sedov struct sockstat *sock, char *errbuf); 1550daf62d9SStanislav Sedov int procstat_get_vnode_info(struct procstat *procstat, struct filestat *fst, 1560daf62d9SStanislav Sedov struct vnstat *vn, char *errbuf); 1570daf62d9SStanislav Sedov struct procstat *procstat_open_sysctl(void); 1580daf62d9SStanislav Sedov struct procstat *procstat_open_kvm(const char *nlistf, const char *memf); 1590daf62d9SStanislav Sedov 1600daf62d9SStanislav Sedov #endif /* !_LIBPROCSTAT_H_ */ 161