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

📄 freebsd.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 3 页
字号:
		if (in6pcb.in6p_prev != prev6)			break;		if (kvm_read(kvmd, (u_long)in6pcb.in6p_ppcb, (char *)&tcp6cb,			     sizeof(tcp6cb)) != sizeof(tcp6cb))			return;		tcp.local_port = ntohs(in6pcb.in6p_lport);		memcpy(&tcp.remote_addr6, &in6pcb.in6p_faddr,		       sizeof(struct in6_addr));		tcp.remote_port = ntohs(in6pcb.in6p_fport);		tcp_status = (tcp6cb.t_state == TCPS_ESTABLISHED);		tcp.family = AF_INET6;		if (tcp_status == TCP_ALIVE)			gkrellm_inet_log_tcp_port_data(&tcp);		prev6 = next6;		}#endif	}#elsevoidgkrellm_sys_inet_read_tcp_data(void)	{	static char	*name = "net.inet.tcp.pcblist";	static int	oid_pcblist[CTL_MAXNAME + 2];	static size_t	oid_pcblist_len = sizeof(oid_pcblist);	static gint	initialized = 0;	ActiveTCP	tcp;	gint		tcp_status;	struct xinpgen	*xig, *oxig;	gchar		*buf;	gint		len = 0;	if (!initialized)		{		if (gk_sysctlnametomib(name, oid_pcblist,				       &oid_pcblist_len) < 0)			return;		++initialized;		}	if (sysctl(oid_pcblist, oid_pcblist_len, 0, &len, 0, 0) < 0)		return;	if ((buf = malloc(len)) == 0)		return;	if (sysctl(oid_pcblist, oid_pcblist_len, buf, &len, 0, 0) >= 0)		{		oxig = xig = (struct xinpgen *)buf;		for (xig = (struct xinpgen *)((char *)xig + xig->xig_len);		     xig->xig_len > sizeof(struct xinpgen);		     xig = (struct xinpgen *)((char *)xig + xig->xig_len))			{			struct tcpcb *tp = &((struct xtcpcb *)xig)->xt_tp;			struct inpcb *inp = &((struct xtcpcb *)xig)->xt_inp;			struct xsocket *so = &((struct xtcpcb *)xig)->xt_socket;			/* Ignore sockets for protocols other than tcp. */			if (so->xso_protocol != IPPROTO_TCP)				continue;			/* Ignore PCBs which were freed during copyout. */			if (inp->inp_gencnt > oxig->xig_gen)				continue;#if defined(INET6)			if (inp->inp_vflag & INP_IPV4)				{				tcp.remote_addr.s_addr = inp->inp_faddr.s_addr;				tcp.family = AF_INET;				}			else if (inp->inp_vflag & INP_IPV6)				{					memcpy(&tcp.remote_addr6,					       &inp->in6p_faddr,					       sizeof(struct in6_addr));					tcp.family = AF_INET6;				}			else				continue;#else			tcp.remote_addr.s_addr = inp->inp_faddr.s_addr;			tcp.family = AF_INET;#endif			tcp.remote_port = ntohs(inp->inp_fport);			tcp.local_port = ntohs(inp->inp_lport);			tcp_status = (tp->t_state == TCPS_ESTABLISHED);			if (tcp_status == TCP_ALIVE)				gkrellm_inet_log_tcp_port_data(&tcp);			}		}	free(buf);	}#endifgbooleangkrellm_sys_inet_init(void)	{	return TRUE;	}/* ===================================================================== *//* Memory/Swap monitor interface */#include <osreldate.h>#include <kvm.h>#include <limits.h>#include <sys/conf.h>#if __FreeBSD_version < 400000#include <sys/rlist.h>#endif#include <sys/vmmeter.h>#include <sys/sysctl.h>#include <vm/vm_param.h>static struct nlist nl_mem[] = {#define N_CNT		0	{ "_cnt" },#if __FreeBSD_version < 400000#define VM_SWAPLIST	1	{ "_swaplist" },#define VM_SWDEVT	2	{ "_swdevt" },#define VM_NSWAP	3	{ "_nswap" },#define VM_NSWDEV	4	{ "_nswdev" },#define VM_DMMAX	5	{ "_dmmax" },#if  __FreeBSD_version < 300000#define N_BUFSPACE	6	{ "_bufspace" },#endif#endif	{ "" }};extern	kvm_t	*kvmd;extern	char	errbuf[];static intswapmode(guint64 *retavail, guint64 *retfree)	{	guint64 used, avail;#if  __FreeBSD_version >= 400000	static int psize = -1;	struct kvm_swap kvmswap;#else	char *header;	int hlen, nswap, nswdev, dmmax;	int i, div, nfree, npfree;	struct swdevt *sw;	long blocksize, *perdev;	u_long ptr;	struct rlist head;#  if __FreeBSD_version >= 220000	struct rlisthdr swaplist;#  else 	struct rlist *swaplist;#  endif	struct rlist *swapptr;#endif	/*	 * Counter for error messages. If we reach the limit,	 * stop reading information from swap devices and	 * return zero. This prevent endless 'bad address'	 * messages.	 */	static int warning = 10;	if (warning <= 0)		{		/* a single warning */		if (!warning)	    		{			warning--;			fprintf(stderr, "Too much errors, stop reading swap devices ...\n");			}		return(0);		}	warning--;		/* decrease counter, see end of function */	if (kvmd == NULL)		return(0);#if  __FreeBSD_version >= 400000	if (kvm_getswapinfo(kvmd, &kvmswap, 1, 0) < 0)		{		fprintf(stderr, "kvm_getswapinfo failed\n");		return(0);		}	if (psize < 0)	    psize = getpagesize();	*retavail = avail = (quad_t)kvmswap.ksw_total * psize;	used = (quad_t)kvmswap.ksw_used * psize;	*retfree = avail - used;#else	if (kvm_read(kvmd, nl_mem[VM_NSWAP].n_value,		     &nswap, sizeof(nswap)) != sizeof(nswap))		return(0);	if (!nswap)		{		fprintf(stderr, "No swap space available\n");		return(0);		}	if (kvm_read(kvmd, nl_mem[VM_NSWDEV].n_value,		     &nswdev, sizeof(nswdev)) != sizeof(nswdev))		return(0);	if (kvm_read(kvmd, nl_mem[VM_DMMAX].n_value,		     &dmmax, sizeof(dmmax)) != sizeof(dmmax))		return(0);	if (kvm_read(kvmd, nl_mem[VM_SWAPLIST].n_value,		     &swaplist, sizeof(swaplist)) != sizeof(swaplist))		return(0);	if ((sw = (struct swdevt *)malloc(nswdev * sizeof(*sw))) == NULL ||	    (perdev = (long *)malloc(nswdev * sizeof(*perdev))) == NULL)		{		perror("malloc");		exit(1);		}	if (kvm_read(kvmd, nl_mem[VM_SWDEVT].n_value,		     &ptr, sizeof ptr) != sizeof ptr)		return(0);	if (kvm_read(kvmd, ptr,		     sw, nswdev * sizeof(*sw)) != nswdev * sizeof(*sw))		return(0);	/* Count up swap space. */	nfree = 0;	memset(perdev, 0, nswdev * sizeof(*perdev));#if  __FreeBSD_version >= 220000	swapptr = swaplist.rlh_list;	while (swapptr)#else	while (swaplist)#endif		{		int	top, bottom, next_block;#if  __FreeBSD_version >= 220000		if (kvm_read(kvmd, (u_long)swapptr, &head,			     sizeof(struct rlist)) != sizeof(struct rlist))			return (0);#else		if (kvm_read(kvmd, (u_long)swaplist, &head,			     sizeof(struct rlist)) != sizeof(struct rlist))			return (0);#endif		top = head.rl_end;		bottom = head.rl_start;		nfree += top - bottom + 1;		/*		 * Swap space is split up among the configured disks.		 *		 * For interleaved swap devices, the first dmmax blocks		 * of swap space some from the first disk, the next dmmax		 * blocks from the next, and so on up to nswap blocks.		 *		 * The list of free space joins adjacent free blocks,		 * ignoring device boundries.  If we want to keep track		 * of this information per device, we'll just have to		 * extract it ourselves.		 */		while (top / dmmax != bottom / dmmax)			{			next_block = ((bottom + dmmax) / dmmax);			perdev[(bottom / dmmax) % nswdev] +=				next_block * dmmax - bottom;			bottom = next_block * dmmax;			}		perdev[(bottom / dmmax) % nswdev] +=			top - bottom + 1;#if  __FreeBSD_version >= 220000		swapptr = head.rl_next;#else		swaplist = head.rl_next;#endif		}	header = getbsize(&hlen, &blocksize);	div = blocksize / 512;	avail = npfree = 0;	for (i = 0; i < nswdev; i++)		{		int xsize, xfree;		/*		 * Don't report statistics for partitions which have not		 * yet been activated via swapon(8).		 */		xsize = sw[i].sw_nblks;		xfree = perdev[i];		used = xsize - xfree;		npfree++;		avail += xsize;		}	/* 	 * If only one partition has been set up via swapon(8), we don't	 * need to bother with totals.	 */	*retavail = avail << 9;	*retfree = nfree << 9;	used = avail - nfree;	free(sw); free(perdev);#endif /* __FreeBSD_version >= 400000 */	/* increase counter, no errors occurs */	warning++; 	return  (int)(((double)used / (double)avail * 100.0) + 0.5);	}static intget_bufspace(guint64 *bufspacep)	{#if  __FreeBSD_version < 300000	u_int	bufspace;	if (kvm_read(kvmd, nl_mem[N_BUFSPACE].n_value, (char *)&bufspace,		     sizeof(bufspace)) != sizeof(bufspace))		return 0;#else	static char	*name = "vfs.bufspace";	static int	oid_bufspace[CTL_MAXNAME + 2];	static size_t	oid_bufspace_len = sizeof(oid_bufspace);	static gint	initialized = 0;	u_int		bufspace;	size_t		bufspace_len = sizeof(bufspace);	if (!initialized)		{		if (gk_sysctlnametomib(name, oid_bufspace,				       &oid_bufspace_len) < 0)			return 0;		++initialized;		}	if (sysctl(oid_bufspace, oid_bufspace_len,		   &bufspace, &bufspace_len, 0, 0) < 0)		return 0;#endif	*bufspacep = bufspace;	return 1;		}#if __FreeBSD_version >= 410000struct mibtab {    char	*name;    int		oid[CTL_MAXNAME + 2];    size_t	oid_len;    u_int	value;    size_t	value_len;};static struct mibtab mibs[] = {#define MIB_V_PAGE_COUNT	0    { "vm.stats.vm.v_page_count" },#define MIB_V_FREE_COUNT	1    { "vm.stats.vm.v_free_count" },#define MIB_V_WIRE_COUNT	2    { "vm.stats.vm.v_wire_count" },#define MIB_V_ACTIVE_COUNT	3    { "vm.stats.vm.v_active_count" },#define MIB_V_INACTIVE_COUNT	4    { "vm.stats.vm.v_inactive_count" },#define MIB_V_CACHE_COUNT	5    { "vm.stats.vm.v_cache_count" },#define MIB_V_SWAPPGSIN		6    { "vm.stats.vm.v_swappgsin" },#define MIB_V_SWAPPGSOUT	7    { "vm.stats.vm.v_swappgsout" },    { NULL }};#define	PROC_MEMINFO_FILE	"/compat/linux/proc/meminfo"#endif#ifndef VM_TOTAL#define VM_TOTAL	VM_METER#endifstatic guint64	swapin,		swapout,		swap_total,		swap_used;voidgkrellm_sys_mem_read_data(void)	{	static gint	psize, pshift = 0;	static gint	first_time_done = 0;	static gint	swappgsin = -1;	static gint	swappgsout = -1;	gint		dpagein, dpageout;	struct vmmeter	sum;	guint64		total, used, x_used, free, shared, buffers, cached;	struct vmtotal	vmt;	size_t		length_vmt = sizeof(vmt);	static int	oid_vmt[] = { CTL_VM, VM_TOTAL };#if __FreeBSD_version >= 410000	gint		i;	FILE		*f;	gchar		buf[160];#endif#if 0	/* mem.c does a force_meminfo_update() before calling this */	/* Collecting meminfo data is expensive under FreeBSD, so	|  take extra precautions to minimize reading it.	*/	if (!GK.ten_second_tick && !force_meminfo_update())		return;#endif	if (pshift == 0)		{		for (psize = getpagesize(); psize > 1; psize >>= 1)			pshift++;		}	shared = 0;	if (kvmd == NULL)		{#if __FreeBSD_version >= 410000		if (!first_time_done)			{			for (i = 0; mibs[i].name; ++i)				{				mibs[i].oid_len = sizeof(mibs[i].oid);				if (gk_sysctlnametomib(mibs[i].name,						       mibs[i].oid,						       &mibs[i].oid_len) < 0)				 	return;				mibs[i].value_len = sizeof(mibs[i].value);				}			++first_time_done;			}		for (i = 0; mibs[i].name; ++i)			if (sysctl(mibs[i].oid, mibs[i].oid_len,				   &mibs[i].value,				   &mibs[i].value_len, 0, 0) < 0)				return;		total = (mibs[MIB_V_PAGE_COUNT].value -			     mibs[MIB_V_WIRE_COUNT].value) << pshift;		x_used = (mibs[MIB_V_ACTIVE_COUNT].value +			      mibs[MIB_V_INACTIVE_COUNT].value) << pshift;		free = mibs[MIB_V_FREE_COUNT].value << pshift;		if (sysctl(oid_vmt, 2, &vmt, &length_vmt, NULL, 0) == 0)			shared = vmt.t_rmshr << pshift;		get_bufspace(&buffers);		cached = mibs[MIB_V_CACHE_COUNT].value << pshift;		used = x_used - buffers - cached;		gkrellm_mem_assign_data(total, used, free, shared, buffers, cached);		swapin = mibs[MIB_V_SWAPPGSIN].value;		swapout = mibs[MIB_V_SWAPPGSOUT].value;		/* Try linprocfs for swap info */		if ((f = fopen(PROC_MEMINFO_FILE, "r")) == NULL)			return;		/* total: used: free: shared: buffers: cached: */		while ((fgets(buf, sizeof(buf), f)) != NULL)			{			if (strncmp(buf, "Swap:", 5) == 0)				{				sscanf(buf, "Swap: %llu %llu",				       &swap_total, &swap_used);				break;				}			}		fclose(f);#endif		return;		}	if (nl_mem[0].n_type == 0)		if (kvm_nlist(kvmd, nl_mem) < 0 || nl_mem[0].n_type == 0)			return;	if (kvm_read(kvmd, nl_mem[N_CNT].n_value, (char *)&sum,		     sizeof(sum)) != sizeof(sum))		return;	total = (sum.v_page_count - sum.v_wire_count) << pshift;	x_used = (sum.v_active_count + sum.v_inactive_count) << pshift;	free = sum.v_free_count << pshift;	if (sysctl(oid_vmt, 2, &vmt, &length_vmt, NULL, 0) == 0)		shared = vmt.t_rmshr << pshift;	get_bufspace(&buffers);	cached = sum.v_cache_count << pshift;	used = x_used - buffers - cached;	gkrellm_mem_assign_data(total, used, free, shared, buffers, cached);	if (swappgsin < 0)		{		dpagein = 0;		dpageout = 0;		}	else		{		dpagein = (sum.v_swappgsin - swappgsin) << (pshift - 10);		dpageout = (sum.v_swappgsout - swappgsout) << (pshift - 10);		}	swappgsin = sum.v_swappgsin;	swappgsout = sum.v_swappgsout;	if (dpagein > 0 || dpageout > 0 || first_time_done == 0)		{		swapmode(&swap_total, &swap_used);		swap_used = swap_total - swap_used;		}	first_time_done = 1;	swapin = swappgsin;	swapout = swappgsout;	}voidgkrellm_sys_swap_read_data(void)	{	gkrellm_swap_assign_data(swap_total, swap_used, swapin, swapout);	}gbooleangkrellm_sys_mem_init(void)	{	return TRUE;	}/* ===================================================================== *//* Battery monitor interface */#if defined(__i386__)#include <osreldate.h>#include <machine/apm_bios.h>#define	APMDEV		"/dev/apm"#define	L_NO_BATTERY	0x80

⌨️ 快捷键说明

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