186d7f5d3SJohn Marino#!/bin/sh 286d7f5d3SJohn Marino 386d7f5d3SJohn Marino# 486d7f5d3SJohn Marino# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org> 586d7f5d3SJohn Marino# All rights reserved. 686d7f5d3SJohn Marino# 786d7f5d3SJohn Marino# Redistribution and use in source and binary forms, with or without 886d7f5d3SJohn Marino# modification, are permitted provided that the following conditions 986d7f5d3SJohn Marino# are met: 1086d7f5d3SJohn Marino# 1. Redistributions of source code must retain the above copyright 1186d7f5d3SJohn Marino# notice, this list of conditions and the following disclaimer. 1286d7f5d3SJohn Marino# 2. Redistributions in binary form must reproduce the above copyright 1386d7f5d3SJohn Marino# notice, this list of conditions and the following disclaimer in the 1486d7f5d3SJohn Marino# documentation and/or other materials provided with the distribution. 1586d7f5d3SJohn Marino# 1686d7f5d3SJohn Marino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1786d7f5d3SJohn Marino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1886d7f5d3SJohn Marino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1986d7f5d3SJohn Marino# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2086d7f5d3SJohn Marino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2186d7f5d3SJohn Marino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2286d7f5d3SJohn Marino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2386d7f5d3SJohn Marino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2486d7f5d3SJohn Marino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2586d7f5d3SJohn Marino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2686d7f5d3SJohn Marino# SUCH DAMAGE. 2786d7f5d3SJohn Marino# 2886d7f5d3SJohn Marino# $FreeBSD$ 2986d7f5d3SJohn Marino# 3086d7f5d3SJohn Marino 3186d7f5d3SJohn Marino# Test scenario by marcus@freebsd.org 3286d7f5d3SJohn Marino 3386d7f5d3SJohn Marino[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 3486d7f5d3SJohn Marino 3586d7f5d3SJohn Marino. ../default.cfg 3686d7f5d3SJohn Marino 3786d7f5d3SJohn Marinoodir=`pwd` 3886d7f5d3SJohn Marinocd /tmp 3986d7f5d3SJohn Marinosed '1,/^EOF/d' < $odir/$0 > kinfo.c 4086d7f5d3SJohn Marinocc -o kinfo -Wall kinfo.c -lutil 4186d7f5d3SJohn Marinorm -f kinfo.c 4286d7f5d3SJohn Marino 4386d7f5d3SJohn Marinomount | grep -q procfs || mount -t procfs procfs /procfs 4486d7f5d3SJohn Marinofor i in `jot 30`; do 4586d7f5d3SJohn Marino for j in `jot 5`; do 4686d7f5d3SJohn Marino /tmp/kinfo & 4786d7f5d3SJohn Marino done 4886d7f5d3SJohn Marino 4986d7f5d3SJohn Marino for j in `jot 5`; do 5086d7f5d3SJohn Marino wait 5186d7f5d3SJohn Marino done 5286d7f5d3SJohn Marinodone 5386d7f5d3SJohn Marino 5486d7f5d3SJohn Marinorm -f /tmp/kinfo 5586d7f5d3SJohn Marinoexit 5686d7f5d3SJohn MarinoEOF 5786d7f5d3SJohn Marino 5886d7f5d3SJohn Marino#include <sys/types.h> 5986d7f5d3SJohn Marino#include <stdio.h> 6086d7f5d3SJohn Marino#include <stdlib.h> 6186d7f5d3SJohn Marino#include <unistd.h> 6286d7f5d3SJohn Marino#include <sys/signal.h> 6386d7f5d3SJohn Marino#include <dirent.h> 6486d7f5d3SJohn Marino#include <fcntl.h> 6586d7f5d3SJohn Marino#include <err.h> 6686d7f5d3SJohn Marino#include <strings.h> 6786d7f5d3SJohn Marino#include <sys/wait.h> 6886d7f5d3SJohn Marino#include <libutil.h> 6986d7f5d3SJohn Marino 7086d7f5d3SJohn Marinochar buf[8096]; 7186d7f5d3SJohn Marino 7286d7f5d3SJohn Marinovoid 7386d7f5d3SJohn Marinohandler(int i) { 7486d7f5d3SJohn Marino exit(0); 7586d7f5d3SJohn Marino} 7686d7f5d3SJohn Marino 7786d7f5d3SJohn Marino/* Stir /dev/proc */ 7886d7f5d3SJohn Marinoint 7986d7f5d3SJohn Marinochurning(void) { 8086d7f5d3SJohn Marino pid_t r; 8186d7f5d3SJohn Marino int fd, status; 8286d7f5d3SJohn Marino 8386d7f5d3SJohn Marino for (;;) { 8486d7f5d3SJohn Marino r = fork(); 8586d7f5d3SJohn Marino if (r == 0) { 8686d7f5d3SJohn Marino if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1) 8786d7f5d3SJohn Marino err(1, "open(/proc/curproc/mem)"); 8886d7f5d3SJohn Marino bzero(buf, sizeof(buf)); 8986d7f5d3SJohn Marino exit(0); 9086d7f5d3SJohn Marino } 9186d7f5d3SJohn Marino if (r < 0) { 9286d7f5d3SJohn Marino perror("fork"); 9386d7f5d3SJohn Marino exit(2); 9486d7f5d3SJohn Marino } 9586d7f5d3SJohn Marino wait(&status); 9686d7f5d3SJohn Marino } 9786d7f5d3SJohn Marino} 9886d7f5d3SJohn Marino 9986d7f5d3SJohn Marino/* Get files for each proc */ 10086d7f5d3SJohn Marinovoid 10186d7f5d3SJohn Marinolist(void) 10286d7f5d3SJohn Marino{ 10386d7f5d3SJohn Marino int cnt, fd, n; 10486d7f5d3SJohn Marino int space = sizeof(buf); 10586d7f5d3SJohn Marino long base; 10686d7f5d3SJohn Marino struct dirent *dp; 10786d7f5d3SJohn Marino struct kinfo_file *freep; 10886d7f5d3SJohn Marino struct kinfo_vmentry *freep_vm; 10986d7f5d3SJohn Marino char *bp = buf; 11086d7f5d3SJohn Marino pid_t pid; 11186d7f5d3SJohn Marino long l; 11286d7f5d3SJohn Marino char *dummy; 11386d7f5d3SJohn Marino 11486d7f5d3SJohn Marino if ((fd = open("/proc", O_RDONLY)) == -1) 11586d7f5d3SJohn Marino err(1, "open(%s)", "/proc"); 11686d7f5d3SJohn Marino 11786d7f5d3SJohn Marino do { 11886d7f5d3SJohn Marino if ((n = getdirentries(fd, bp, space, &base)) == -1) 11986d7f5d3SJohn Marino err(1, "getdirentries"); 12086d7f5d3SJohn Marino space = space - n; 12186d7f5d3SJohn Marino bp = bp + n; 12286d7f5d3SJohn Marino } while (n != 0); 12386d7f5d3SJohn Marino close(fd); 12486d7f5d3SJohn Marino 12586d7f5d3SJohn Marino bp = buf; 12686d7f5d3SJohn Marino dp = (struct dirent *)bp; 12786d7f5d3SJohn Marino for (;;) { 12886d7f5d3SJohn Marino#if 0 12986d7f5d3SJohn Marino printf("name: %-10s, inode %7d, type %2d, namelen %d, d_reclen %d\n", 13086d7f5d3SJohn Marino dp->d_name, dp->d_fileno, dp->d_type, dp->d_namlen, 13186d7f5d3SJohn Marino dp->d_reclen); fflush(stdout); 13286d7f5d3SJohn Marino#endif 13386d7f5d3SJohn Marino 13486d7f5d3SJohn Marino if (dp->d_type == DT_DIR && 13586d7f5d3SJohn Marino (dp->d_name[0] >= '0' && dp->d_name[0] <= '9')) { 13686d7f5d3SJohn Marino l = strtol(dp->d_name, &dummy, 10); 13786d7f5d3SJohn Marino pid = l; 13886d7f5d3SJohn Marino 13986d7f5d3SJohn Marino /* The tests start here */ 14086d7f5d3SJohn Marino freep = kinfo_getfile(pid, &cnt); 14186d7f5d3SJohn Marino free(freep); 14286d7f5d3SJohn Marino 14386d7f5d3SJohn Marino freep_vm = kinfo_getvmmap(pid, &cnt); 14486d7f5d3SJohn Marino free(freep_vm); 14586d7f5d3SJohn Marino /* End test */ 14686d7f5d3SJohn Marino } 14786d7f5d3SJohn Marino 14886d7f5d3SJohn Marino bp = bp + dp->d_reclen; 14986d7f5d3SJohn Marino dp = (struct dirent *)bp; 15086d7f5d3SJohn Marino if (dp->d_reclen <= 0) 15186d7f5d3SJohn Marino break; 15286d7f5d3SJohn Marino } 15386d7f5d3SJohn Marino} 15486d7f5d3SJohn Marino 15586d7f5d3SJohn Marinoint 15686d7f5d3SJohn Marinomain(int argc, char **argv) 15786d7f5d3SJohn Marino{ 15886d7f5d3SJohn Marino pid_t r; 15986d7f5d3SJohn Marino signal(SIGALRM, handler); 16086d7f5d3SJohn Marino alarm(60); 16186d7f5d3SJohn Marino 16286d7f5d3SJohn Marino if ((r = fork()) == 0) { 16386d7f5d3SJohn Marino alarm(60); 16486d7f5d3SJohn Marino for (;;) 16586d7f5d3SJohn Marino churning(); 16686d7f5d3SJohn Marino } 16786d7f5d3SJohn Marino if (r < 0) { 16886d7f5d3SJohn Marino perror("fork"); 16986d7f5d3SJohn Marino exit(2); 17086d7f5d3SJohn Marino } 17186d7f5d3SJohn Marino 17286d7f5d3SJohn Marino for (;;) 17386d7f5d3SJohn Marino list(); 17486d7f5d3SJohn Marino 17586d7f5d3SJohn Marino return (0); 17686d7f5d3SJohn Marino} 177