1#!/bin/sh 2 3# 4# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org> 5# All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28# $FreeBSD$ 29# 30 31# Test scenario by marcus@freebsd.org 32 33[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 34 35. ../default.cfg 36 37odir=`pwd` 38cd /tmp 39sed '1,/^EOF/d' < $odir/$0 > kinfo.c 40cc -o kinfo -Wall kinfo.c -lutil 41rm -f kinfo.c 42 43mount | grep -q procfs || mount -t procfs procfs /procfs 44for i in `jot 30`; do 45 for j in `jot 5`; do 46 /tmp/kinfo & 47 done 48 49 for j in `jot 5`; do 50 wait 51 done 52done 53 54rm -f /tmp/kinfo 55exit 56EOF 57 58#include <sys/types.h> 59#include <stdio.h> 60#include <stdlib.h> 61#include <unistd.h> 62#include <sys/signal.h> 63#include <dirent.h> 64#include <fcntl.h> 65#include <err.h> 66#include <strings.h> 67#include <sys/wait.h> 68#include <libutil.h> 69 70char buf[8096]; 71 72void 73handler(int i) { 74 exit(0); 75} 76 77/* Stir /dev/proc */ 78int 79churning(void) { 80 pid_t r; 81 int fd, status; 82 83 for (;;) { 84 r = fork(); 85 if (r == 0) { 86 if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1) 87 err(1, "open(/proc/curproc/mem)"); 88 bzero(buf, sizeof(buf)); 89 exit(0); 90 } 91 if (r < 0) { 92 perror("fork"); 93 exit(2); 94 } 95 wait(&status); 96 } 97} 98 99/* Get files for each proc */ 100void 101list(void) 102{ 103 int cnt, fd, n; 104 int space = sizeof(buf); 105 long base; 106 struct dirent *dp; 107 struct kinfo_file *freep; 108 struct kinfo_vmentry *freep_vm; 109 char *bp = buf; 110 pid_t pid; 111 long l; 112 char *dummy; 113 114 if ((fd = open("/proc", O_RDONLY)) == -1) 115 err(1, "open(%s)", "/proc"); 116 117 do { 118 if ((n = getdirentries(fd, bp, space, &base)) == -1) 119 err(1, "getdirentries"); 120 space = space - n; 121 bp = bp + n; 122 } while (n != 0); 123 close(fd); 124 125 bp = buf; 126 dp = (struct dirent *)bp; 127 for (;;) { 128#if 0 129 printf("name: %-10s, inode %7d, type %2d, namelen %d, d_reclen %d\n", 130 dp->d_name, dp->d_fileno, dp->d_type, dp->d_namlen, 131 dp->d_reclen); fflush(stdout); 132#endif 133 134 if (dp->d_type == DT_DIR && 135 (dp->d_name[0] >= '0' && dp->d_name[0] <= '9')) { 136 l = strtol(dp->d_name, &dummy, 10); 137 pid = l; 138 139 /* The tests start here */ 140 freep = kinfo_getfile(pid, &cnt); 141 free(freep); 142 143 freep_vm = kinfo_getvmmap(pid, &cnt); 144 free(freep_vm); 145 /* End test */ 146 } 147 148 bp = bp + dp->d_reclen; 149 dp = (struct dirent *)bp; 150 if (dp->d_reclen <= 0) 151 break; 152 } 153} 154 155int 156main(int argc, char **argv) 157{ 158 pid_t r; 159 signal(SIGALRM, handler); 160 alarm(60); 161 162 if ((r = fork()) == 0) { 163 alarm(60); 164 for (;;) 165 churning(); 166 } 167 if (r < 0) { 168 perror("fork"); 169 exit(2); 170 } 171 172 for (;;) 173 list(); 174 175 return (0); 176} 177