xref: /dflybsd-src/test/stress/stress2/misc/kinfo2.sh (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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