xref: /freebsd/tools/test/stress2/misc/kinfo2.sh (revision 8a272653)
18a272653SPeter Holm#!/bin/sh
28a272653SPeter Holm
38a272653SPeter Holm#
48a272653SPeter Holm# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org>
58a272653SPeter Holm# All rights reserved.
68a272653SPeter Holm#
78a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
88a272653SPeter Holm# modification, are permitted provided that the following conditions
98a272653SPeter Holm# are met:
108a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
118a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
128a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
138a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
148a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
158a272653SPeter Holm#
168a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
178a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
208a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
218a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
228a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
238a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268a272653SPeter Holm# SUCH DAMAGE.
278a272653SPeter Holm#
288a272653SPeter Holm
298a272653SPeter Holm# Test scenario by marcus@freebsd.org
308a272653SPeter Holm
318a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
328a272653SPeter Holm
338a272653SPeter Holm. ../default.cfg
348a272653SPeter Holm
358a272653SPeter Holmodir=`pwd`
368a272653SPeter Holmcd /tmp
378a272653SPeter Holmsed '1,/^EOF/d' < $odir/$0 > kinfo2.c
388a272653SPeter Holmmycc -o kinfo2 -Wall -Wextra kinfo2.c -lutil || exit 1
398a272653SPeter Holmrm -f kinfo2.c
408a272653SPeter Holm
418a272653SPeter Holmmount | grep -q procfs || mount -t procfs procfs /proc
428a272653SPeter Holms=0
438a272653SPeter Holmfor i in `jot 15`; do
448a272653SPeter Holm	pids=""
458a272653SPeter Holm	for j in `jot 5`; do
468a272653SPeter Holm		/tmp/kinfo2 &
478a272653SPeter Holm		pids="$pids $!"
488a272653SPeter Holm	done
498a272653SPeter Holm	for p in $pids; do
508a272653SPeter Holm		wait $p
518a272653SPeter Holm		[ $? -ne 0 ] && s=1
528a272653SPeter Holm	done
538a272653SPeter Holmdone
548a272653SPeter Holm
558a272653SPeter Holmrm -f /tmp/kinfo2
568a272653SPeter Holmexit $s
578a272653SPeter HolmEOF
588a272653SPeter Holm
598a272653SPeter Holm#include <sys/types.h>
608a272653SPeter Holm#include <sys/signal.h>
618a272653SPeter Holm#include <sys/stat.h>
628a272653SPeter Holm#include <sys/wait.h>
638a272653SPeter Holm
648a272653SPeter Holm#include <dirent.h>
658a272653SPeter Holm#include <err.h>
668a272653SPeter Holm#include <fcntl.h>
678a272653SPeter Holm#include <libutil.h>
688a272653SPeter Holm#include <stdio.h>
698a272653SPeter Holm#include <stdlib.h>
708a272653SPeter Holm#include <strings.h>
718a272653SPeter Holm#include <unistd.h>
728a272653SPeter Holm
738a272653SPeter Holmstatic char buf[8096];
748a272653SPeter Holm
758a272653SPeter Holmstatic void
768a272653SPeter Holmhandler(int i __unused) {
778a272653SPeter Holm	_exit(0);
788a272653SPeter Holm}
798a272653SPeter Holm
808a272653SPeter Holm/* Stir /dev/proc */
818a272653SPeter Holmstatic void
828a272653SPeter Holmchurning(void) {
838a272653SPeter Holm	pid_t r;
848a272653SPeter Holm	int fd, status;
858a272653SPeter Holm
868a272653SPeter Holm	for (;;) {
878a272653SPeter Holm		r = fork();
888a272653SPeter Holm		if (r == 0) {
898a272653SPeter Holm			if ((fd = open("/proc/curproc/mem", O_RDONLY)) == -1)
908a272653SPeter Holm				err(1, "open(/proc/curproc/mem)");
918a272653SPeter Holm			bzero(buf, sizeof(buf));
928a272653SPeter Holm			_exit(0);
938a272653SPeter Holm		}
948a272653SPeter Holm		if (r < 0) {
958a272653SPeter Holm			perror("fork");
968a272653SPeter Holm			exit(2);
978a272653SPeter Holm		}
988a272653SPeter Holm		wait(&status);
998a272653SPeter Holm	}
1008a272653SPeter Holm}
1018a272653SPeter Holm
1028a272653SPeter Holm/* Get files for each proc */
1038a272653SPeter Holmvoid
1048a272653SPeter Holmlist(void)
1058a272653SPeter Holm{
1068a272653SPeter Holm	struct dirent *dp;
1078a272653SPeter Holm        struct kinfo_file *freep;
1088a272653SPeter Holm	struct kinfo_vmentry *freep_vm;
1098a272653SPeter Holm	struct stat sb;
1108a272653SPeter Holm	pid_t pid;
1118a272653SPeter Holm	off_t base;
1128a272653SPeter Holm	long l;
1138a272653SPeter Holm	int cnt, fd, n;
1148a272653SPeter Holm	int space = sizeof(buf);
1158a272653SPeter Holm	char *bp = buf;
1168a272653SPeter Holm	char *dummy;
1178a272653SPeter Holm
1188a272653SPeter Holm	if ((fd = open("/proc", O_RDONLY)) == -1)
1198a272653SPeter Holm		err(1, "open(%s)", "/proc");
1208a272653SPeter Holm
1218a272653SPeter Holm	if (fstat(fd, &sb) == -1)
1228a272653SPeter Holm		err(1, "fstat()");
1238a272653SPeter Holm	do {
1248a272653SPeter Holm		if ((n = getdirentries(fd, bp, space, &base)) == -1)
1258a272653SPeter Holm			err(1, "getdirentries");
1268a272653SPeter Holm		space = space - n;
1278a272653SPeter Holm		if (space < sb.st_blksize)
1288a272653SPeter Holm			break;
1298a272653SPeter Holm		bp   = bp + n;
1308a272653SPeter Holm	} while (n != 0);
1318a272653SPeter Holm	close(fd);
1328a272653SPeter Holm
1338a272653SPeter Holm	bp = buf;
1348a272653SPeter Holm	dp = (struct dirent *)bp;
1358a272653SPeter Holm	for (;;) {
1368a272653SPeter Holm#if defined(DEBUG)
1378a272653SPeter Holm		printf("name: %-10s, inode %7ju, type %2d, namelen %d, "
1388a272653SPeter Holm		    "d_reclen %d\n",
1398a272653SPeter Holm		    dp->d_name, (uintmax_t)dp->d_fileno, dp->d_type,
1408a272653SPeter Holm		    dp->d_namlen, dp->d_reclen); fflush(stdout);
1418a272653SPeter Holm#endif
1428a272653SPeter Holm
1438a272653SPeter Holm		if (dp->d_type == DT_DIR &&
1448a272653SPeter Holm		    (dp->d_name[0] >= '0' && dp->d_name[0] <= '9')) {
1458a272653SPeter Holm			l = strtol(dp->d_name, &dummy, 10);
1468a272653SPeter Holm			pid = l;
1478a272653SPeter Holm
1488a272653SPeter Holm			/* The tests start here */
1498a272653SPeter Holm			freep = kinfo_getfile(pid, &cnt);
1508a272653SPeter Holm			free(freep);
1518a272653SPeter Holm
1528a272653SPeter Holm			freep_vm = kinfo_getvmmap(pid, &cnt);
1538a272653SPeter Holm			free(freep_vm);
1548a272653SPeter Holm			/* End test */
1558a272653SPeter Holm		}
1568a272653SPeter Holm
1578a272653SPeter Holm		bp = bp + dp->d_reclen;
1588a272653SPeter Holm		dp = (struct dirent *)bp;
1598a272653SPeter Holm		if (dp->d_reclen <= 0)
1608a272653SPeter Holm			break;
1618a272653SPeter Holm	}
1628a272653SPeter Holm}
1638a272653SPeter Holm
1648a272653SPeter Holmint
1658a272653SPeter Holmmain(void)
1668a272653SPeter Holm{
1678a272653SPeter Holm	pid_t r;
1688a272653SPeter Holm
1698a272653SPeter Holm	signal(SIGALRM, handler);
1708a272653SPeter Holm	alarm(60);
1718a272653SPeter Holm
1728a272653SPeter Holm	if ((r = fork()) == 0) {
1738a272653SPeter Holm		alarm(60);
1748a272653SPeter Holm		for (;;)
1758a272653SPeter Holm			churning();
1768a272653SPeter Holm	}
1778a272653SPeter Holm	if (r < 0) {
1788a272653SPeter Holm		perror("fork");
1798a272653SPeter Holm		exit(2);
1808a272653SPeter Holm	}
1818a272653SPeter Holm
1828a272653SPeter Holm	for (;;)
1838a272653SPeter Holm		list();
1848a272653SPeter Holm
1858a272653SPeter Holm	return (0);
1868a272653SPeter Holm}
187