⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pstat.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * Copyright (c) 1980, 1991, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1980, 1991, 1993\n\	The Regents of the University of California.  All rights reserved.\n";#endif /* not lint */#ifndef lintstatic char sccsid[] = "@(#)pstat.c	8.9 (Berkeley) 2/16/94";#endif /* not lint */#include <sys/param.h>#include <sys/time.h>#include <sys/vnode.h>#include <sys/map.h>#include <sys/ucred.h>#define KERNEL#include <sys/file.h>#include <ufs/ufs/quota.h>#include <ufs/ufs/inode.h>#define NFS#include <sys/mount.h>#undef NFS#undef KERNEL#include <sys/stat.h>#include <nfs/nfsnode.h>#include <sys/ioctl.h>#include <sys/tty.h>#include <sys/conf.h>#include <sys/sysctl.h>#include <err.h>#include <kvm.h>#include <limits.h>#include <nlist.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>struct nlist nl[] = {#define VM_SWAPMAP	0	{ "_swapmap" },	/* list of free swap areas */#define VM_NSWAPMAP	1	{ "_nswapmap" },/* size of the swap map */#define VM_SWDEVT	2	{ "_swdevt" },	/* list of swap devices and sizes */#define VM_NSWAP	3	{ "_nswap" },	/* size of largest swap device */#define VM_NSWDEV	4	{ "_nswdev" },	/* number of swap devices */#define VM_DMMAX	5	{ "_dmmax" },	/* maximum size of a swap block */#define	V_MOUNTLIST	6	{ "_mountlist" },	/* address of head of mount list. */#define V_NUMV		7	{ "_numvnodes" },#define	FNL_NFILE	8	{"_nfiles"},#define FNL_MAXFILE	9	{"_maxfiles"},#define NLMANDATORY FNL_MAXFILE	/* names up to here are mandatory */#define VM_NISWAP	NLMANDATORY + 1	{ "_niswap" },#define VM_NISWDEV	NLMANDATORY + 2	{ "_niswdev" },#define	SCONS		NLMANDATORY + 3	{ "_cons" },#define	SPTY		NLMANDATORY + 4	{ "_pt_tty" },#define	SNPTY		NLMANDATORY + 5	{ "_npty" },#ifdef hp300#define	SDCA	(SNPTY+1)	{ "_dca_tty" },#define	SNDCA	(SNPTY+2)	{ "_ndca" },#define	SDCM	(SNPTY+3)	{ "_dcm_tty" },#define	SNDCM	(SNPTY+4)	{ "_ndcm" },#define	SDCL	(SNPTY+5)	{ "_dcl_tty" },#define	SNDCL	(SNPTY+6)	{ "_ndcl" },#define	SITE	(SNPTY+7)	{ "_ite_tty" },#define	SNITE	(SNPTY+8)	{ "_nite" },#endif#ifdef mips#define SDC	(SNPTY+1)	{ "_dc_tty" },#define SNDC	(SNPTY+2)	{ "_dc_cnt" },#endif	{ "" }};int	usenumflag;int	totalflag;char	*nlistf	= NULL;char	*memf	= NULL;kvm_t	*kd;#define	SVAR(var) __STRING(var)	/* to force expansion */#define	KGET(idx, var)							\	KGET1(idx, &var, sizeof(var), SVAR(var))#define	KGET1(idx, p, s, msg)						\	KGET2(nl[idx].n_value, p, s, msg)#define	KGET2(addr, p, s, msg)						\	if (kvm_read(kd, (u_long)(addr), p, s) != s)			\		warnx("cannot read %s: %s", msg, kvm_geterr(kd))#define	KGETRET(addr, p, s, msg)					\	if (kvm_read(kd, (u_long)(addr), p, s) != s) {			\		warnx("cannot read %s: %s", msg, kvm_geterr(kd));	\		return (0);						\	}void	filemode __P((void));int	getfiles __P((char **, int *));struct mount *	getmnt __P((struct mount *));struct e_vnode *	kinfo_vnodes __P((int *));struct e_vnode *	loadvnodes __P((int *));void	mount_print __P((struct mount *));void	nfs_header __P((void));int	nfs_print __P((struct vnode *));void	swapmode __P((void));void	ttymode __P((void));void	ttyprt __P((struct tty *, int));void	ttytype __P((struct tty *, char *, int, int));void	ufs_header __P((void));int	ufs_print __P((struct vnode *));void	usage __P((void));void	vnode_header __P((void));void	vnode_print __P((struct vnode *, struct vnode *));void	vnodemode __P((void));intmain(argc, argv)	int argc;	char *argv[];{	extern char *optarg;	extern int optind;	int ch, i, quit, ret;	int fileflag, swapflag, ttyflag, vnodeflag;	char buf[_POSIX2_LINE_MAX];	fileflag = swapflag = ttyflag = vnodeflag = 0;	while ((ch = getopt(argc, argv, "TM:N:finstv")) != EOF)		switch (ch) {		case 'f':			fileflag = 1;			break;		case 'M':			memf = optarg;			break;		case 'N':			nlistf = optarg;			break;		case 'n':			usenumflag = 1;			break;		case 's':			swapflag = 1;			break;		case 'T':			totalflag = 1;			break;		case 't':			ttyflag = 1;			break;		case 'v':		case 'i':		/* Backward compatibility. */			vnodeflag = 1;			break;		default:			usage();		}	argc -= optind;	argv += optind;	/*	 * Discard setgid privileges if not the running kernel so that bad	 * guys can't print interesting stuff from kernel memory.	 */	if (nlistf != NULL || memf != NULL)		(void)setgid(getgid());	if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == 0)		errx(1, "kvm_openfiles: %s", buf);	if ((ret = kvm_nlist(kd, nl)) != 0) {		if (ret == -1)			errx(1, "kvm_nlist: %s", kvm_geterr(kd));		for (i = quit = 0; i <= NLMANDATORY; i++)			if (!nl[i].n_value) {				quit = 1;				warnx("undefined symbol: %s\n", nl[i].n_name);			}		if (quit)			exit(1);	}	if (!(fileflag | vnodeflag | ttyflag | swapflag | totalflag))		usage();	if (fileflag || totalflag)		filemode();	if (vnodeflag || totalflag)		vnodemode();	if (ttyflag)		ttymode();	if (swapflag || totalflag)		swapmode();	exit (0);}struct e_vnode {	struct vnode *avnode;	struct vnode vnode;};voidvnodemode(){	register struct e_vnode *e_vnodebase, *endvnode, *evp;	register struct vnode *vp;	register struct mount *maddr, *mp;	int numvnodes;	e_vnodebase = loadvnodes(&numvnodes);	if (totalflag) {		(void)printf("%7d vnodes\n", numvnodes);		return;	}	endvnode = e_vnodebase + numvnodes;	(void)printf("%d active vnodes\n", numvnodes);#define ST	mp->mnt_stat	maddr = NULL;	for (evp = e_vnodebase; evp < endvnode; evp++) {		vp = &evp->vnode;		if (vp->v_mount != maddr) {			/*			 * New filesystem			 */			if ((mp = getmnt(vp->v_mount)) == NULL)				continue;			maddr = vp->v_mount;			mount_print(mp);			vnode_header();			switch(ST.f_type) {			case MOUNT_UFS:			case MOUNT_MFS:				ufs_header();				break;			case MOUNT_NFS:				nfs_header();				break;			case MOUNT_NONE:			case MOUNT_MSDOS:			default:				break;			}			(void)printf("\n");		}		vnode_print(evp->avnode, vp);		switch(ST.f_type) {		case MOUNT_UFS:		case MOUNT_MFS:			ufs_print(vp);			break;		case MOUNT_NFS:			nfs_print(vp);			break;		case MOUNT_NONE:		case MOUNT_MSDOS:		default:			break;		}		(void)printf("\n");	}	free(e_vnodebase);}voidvnode_header(){	(void)printf("ADDR     TYP VFLAG  USE HOLD");}voidvnode_print(avnode, vp)	struct vnode *avnode;	struct vnode *vp;{	char *type, flags[16]; 	char *fp = flags;	register int flag;	/*	 * set type	 */	switch(vp->v_type) {	case VNON:		type = "non"; break;	case VREG:		type = "reg"; break;	case VDIR:		type = "dir"; break;	case VBLK:		type = "blk"; break;	case VCHR:		type = "chr"; break;	case VLNK:		type = "lnk"; break;	case VSOCK:		type = "soc"; break;	case VFIFO:		type = "fif"; break;	case VBAD:		type = "bad"; break;	default: 		type = "unk"; break;	}	/*	 * gather flags	 */	flag = vp->v_flag;	if (flag & VROOT)		*fp++ = 'R';	if (flag & VTEXT)		*fp++ = 'T';	if (flag & VSYSTEM)		*fp++ = 'S';	if (flag & VXLOCK)		*fp++ = 'L';	if (flag & VXWANT)		*fp++ = 'W';	if (flag & VBWAIT)		*fp++ = 'B';	if (flag & VALIASED)		*fp++ = 'A';	if (flag == 0)		*fp++ = '-';	*fp = '\0';	(void)printf("%8x %s %5s %4d %4d",	    avnode, type, flags, vp->v_usecount, vp->v_holdcnt);}voidufs_header() {	(void)printf(" FILEID IFLAG RDEV|SZ");}intufs_print(vp) 	struct vnode *vp;{	register int flag;	struct inode inode, *ip = &inode;	char flagbuf[16], *flags = flagbuf;	char *name;	mode_t type;	KGETRET(VTOI(vp), &inode, sizeof(struct inode), "vnode's inode");	flag = ip->i_flag;	if (flag & IN_LOCKED)		*flags++ = 'L';	if (flag & IN_WANTED)		*flags++ = 'W';	if (flag & IN_RENAME)		*flags++ = 'R';	if (flag & IN_UPDATE)		*flags++ = 'U';	if (flag & IN_ACCESS)		*flags++ = 'A';	if (flag & IN_CHANGE)		*flags++ = 'C';	if (flag & IN_MODIFIED)		*flags++ = 'M';	if (flag & IN_SHLOCK)		*flags++ = 'S';	if (flag & IN_EXLOCK)		*flags++ = 'E';	if (flag & IN_LWAIT)		*flags++ = 'Z';	if (flag == 0)		*flags++ = '-';	*flags = '\0';	(void)printf(" %6d %5s", ip->i_number, flagbuf);	type = ip->i_mode & S_IFMT;	if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))		if (usenumflag || ((name = devname(ip->i_rdev, type)) == NULL))			(void)printf("   %2d,%-2d", 			    major(ip->i_rdev), minor(ip->i_rdev));		else			(void)printf(" %7s", name);	else		(void)printf(" %7qd", ip->i_size);	return (0);}voidnfs_header() {	(void)printf(" FILEID NFLAG RDEV|SZ");}intnfs_print(vp) 	struct vnode *vp;{	struct nfsnode nfsnode, *np = &nfsnode;	char flagbuf[16], *flags = flagbuf;	register int flag;	char *name;	mode_t type;	KGETRET(VTONFS(vp), &nfsnode, sizeof(nfsnode), "vnode's nfsnode");	flag = np->n_flag;	if (flag & NFLUSHWANT)		*flags++ = 'W';	if (flag & NFLUSHINPROG)		*flags++ = 'P';	if (flag & NMODIFIED)		*flags++ = 'M';	if (flag & NWRITEERR)		*flags++ = 'E';	if (flag & NQNFSNONCACHE)		*flags++ = 'X';	if (flag & NQNFSWRITE)		*flags++ = 'O';	if (flag & NQNFSEVICTED)		*flags++ = 'G';	if (flag == 0)		*flags++ = '-';	*flags = '\0';#define VT	np->n_vattr	(void)printf(" %6d %5s", VT.va_fileid, flagbuf);	type = VT.va_mode & S_IFMT;	if (S_ISCHR(VT.va_mode) || S_ISBLK(VT.va_mode))		if (usenumflag || ((name = devname(VT.va_rdev, type)) == NULL))			(void)printf("   %2d,%-2d", 			    major(VT.va_rdev), minor(VT.va_rdev));		else			(void)printf(" %7s", name);	else		(void)printf(" %7qd", np->n_size);	return (0);}	/* * Given a pointer to a mount structure in kernel space, * read it in and return a usable pointer to it. */struct mount *getmnt(maddr)	struct mount *maddr;{	static struct mtab {		struct mtab *next;		struct mount *maddr;		struct mount mount;	} *mhead = NULL;	register struct mtab *mt;	for (mt = mhead; mt != NULL; mt = mt->next)		if (maddr == mt->maddr)			return (&mt->mount);	if ((mt = malloc(sizeof(struct mtab))) == NULL)		err(1, NULL);	KGETRET(maddr, &mt->mount, sizeof(struct mount), "mount table");	mt->maddr = maddr;	mt->next = mhead;	mhead = mt;	return (&mt->mount);}voidmount_print(mp)	struct mount *mp;{	register int flags;	char *type;#define ST	mp->mnt_stat	(void)printf("*** MOUNT ");	switch (ST.f_type) {	case MOUNT_NONE:		type = "none";		break;	case MOUNT_UFS:		type = "ufs";		break;	case MOUNT_NFS:		type = "nfs";		break;	case MOUNT_MFS:		type = "mfs";		break;	case MOUNT_MSDOS:		type = "pc";		break;	default:		type = "unknown";		break;	}	(void)printf("%s %s on %s", type, ST.f_mntfromname, ST.f_mntonname);	if (flags = mp->mnt_flag) {		char *comma = "(";		putchar(' ');		/* user visable flags */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -