1 /*- 2 * Copyright (c) 2014 Gleb Kurtsou <gleb@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29 #include <sys/cdefs.h> 30 __FBSDID("$FreeBSD$"); 31 32 #include <sys/param.h> 33 #include <sys/user.h> 34 #include <sys/socket.h> 35 #include <string.h> 36 37 #include "libprocstat.h" 38 39 struct freebsd11_ptsstat { 40 uint32_t dev; 41 char devname[SPECNAMELEN + 1]; 42 }; 43 44 struct freebsd11_vnstat { 45 uint64_t vn_fileid; 46 uint64_t vn_size; 47 char *vn_mntdir; 48 uint32_t vn_dev; 49 uint32_t vn_fsid; 50 int vn_type; 51 uint16_t vn_mode; 52 char vn_devname[SPECNAMELEN + 1]; 53 }; 54 struct freebsd11_semstat { 55 uint32_t value; 56 uint16_t mode; 57 }; 58 struct freebsd11_shmstat { 59 uint64_t size; 60 uint16_t mode; 61 }; 62 63 int freebsd11_procstat_get_pts_info(struct procstat *procstat, 64 struct filestat *fst, struct freebsd11_ptsstat *pts, char *errbuf); 65 int freebsd11_procstat_get_sem_info(struct procstat *procstat, 66 struct filestat *fst, struct freebsd11_semstat *sem, char *errbuf); 67 int freebsd11_procstat_get_shm_info(struct procstat *procstat, 68 struct filestat *fst, struct freebsd11_shmstat *shm, char *errbuf); 69 int freebsd11_procstat_get_vnode_info(struct procstat *procstat, 70 struct filestat *fst, struct freebsd11_vnstat *vn, char *errbuf); 71 72 int 73 freebsd11_procstat_get_pts_info(struct procstat *procstat, 74 struct filestat *fst, struct freebsd11_ptsstat *pts_compat, char *errbuf) 75 { 76 struct ptsstat pts; 77 int r; 78 79 r = procstat_get_pts_info(procstat, fst, &pts, errbuf); 80 if (r != 0) 81 return (r); 82 pts_compat->dev = pts.dev; 83 memcpy(pts_compat->devname, pts.devname, 84 sizeof(pts_compat->devname)); 85 return (0); 86 } 87 88 int 89 freebsd11_procstat_get_sem_info(struct procstat *procstat, 90 struct filestat *fst, struct freebsd11_semstat *sem_compat, char *errbuf) 91 { 92 struct semstat sem; 93 int r; 94 95 r = procstat_get_sem_info(procstat, fst, &sem, errbuf); 96 if (r != 0) 97 return (r); 98 sem_compat->value = sem.value; 99 sem_compat->mode = sem.mode; 100 return (0); 101 } 102 103 int 104 freebsd11_procstat_get_shm_info(struct procstat *procstat, 105 struct filestat *fst, struct freebsd11_shmstat *shm_compat, char *errbuf) 106 { 107 struct shmstat shm; 108 int r; 109 110 r = procstat_get_shm_info(procstat, fst, &shm, errbuf); 111 if (r != 0) 112 return (r); 113 shm_compat->size = shm.size; 114 shm_compat->mode = shm.mode; 115 return (0); 116 } 117 118 int 119 freebsd11_procstat_get_vnode_info(struct procstat *procstat, 120 struct filestat *fst, struct freebsd11_vnstat *vn_compat, char *errbuf) 121 { 122 struct vnstat vn; 123 int r; 124 125 r = procstat_get_vnode_info(procstat, fst, &vn, errbuf); 126 if (r != 0) 127 return (r); 128 vn_compat->vn_fileid = vn.vn_fileid; 129 vn_compat->vn_size = vn.vn_size; 130 vn_compat->vn_mntdir = vn.vn_mntdir; 131 vn_compat->vn_dev = vn.vn_dev; 132 vn_compat->vn_fsid = vn.vn_fsid; 133 vn_compat->vn_type = vn.vn_type; 134 vn_compat->vn_mode = vn.vn_mode; 135 memcpy(vn_compat->vn_devname, vn.vn_devname, 136 sizeof(vn_compat->vn_devname)); 137 return (0); 138 } 139 140 __sym_compat(procstat_get_pts_info, freebsd11_procstat_get_pts_info, FBSD_1.2); 141 __sym_compat(procstat_get_vnode_info, freebsd11_procstat_get_vnode_info, 142 FBSD_1.2); 143 __sym_compat(procstat_get_sem_info, freebsd11_procstat_get_sem_info, FBSD_1.3); 144 __sym_compat(procstat_get_shm_info, freebsd11_procstat_get_shm_info, FBSD_1.3); 145