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

📄 monitor.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 4 页
字号:
	{	"disk",	update_disk,	serve_disk_data,	serve_disk_setup	};static GkrellmdMonitor *init_disk_monitor(void)	{	if (gkrellm_sys_disk_init())		return &disk_monitor;	return NULL;	}/* ======================================================= */#include "../src/inet.h"typedef struct	{	ActiveTCP	tcp;	gboolean	alive,				new_connection;	}	InetData;static GList	*inet_list,				*inet_dead_list;static gboolean	inet_unsupported,				inet_new;voidgkrellm_inet_log_tcp_port_data(gpointer data)	{	GList		*list;	InetData	*in;	ActiveTCP	*tcp, *active_tcp = NULL;	gchar		*ap, *aap;	gint		slen;	tcp = (ActiveTCP *) data;	for (list = inet_list; list; list = list->next)		{		in = (InetData *) list->data;		active_tcp = &in->tcp;		if (tcp->family == AF_INET)			{			ap = (char *)&tcp->remote_addr;			aap = (char *)&active_tcp->remote_addr;			slen = sizeof(struct in_addr);			}#if defined(INET6)		else if (tcp->family == AF_INET6)			{			ap = (char *)&tcp->remote_addr6;			aap = (char *)&active_tcp->remote_addr6;			slen = sizeof(struct in6_addr);			}#endif		else			return;		if (   memcmp(aap, ap, slen) == 0			&& active_tcp->remote_port == tcp->remote_port			&& active_tcp->local_port == tcp->local_port		   )			{			in->alive = TRUE;	/* Old alive connection still alive */			return;			}		}	inet_new = TRUE;	in = g_new0(InetData, 1);	in->tcp = *tcp;	in->alive = TRUE;	in->new_connection = TRUE;	inet_list = g_list_append(inet_list, in);	}static voidupdate_inet(GkrellmdMonitor *mon, gboolean first_update)	{	GList		*list;	InetData	*in;	static gint	check_tcp;		if (!first_update && !GK.second_tick)		return;	if (first_update || check_tcp == 0)		{		gkrellm_free_glist_and_data(&inet_dead_list);		inet_new = FALSE;		for (list = inet_list; list; list = list->next)			{			in = (InetData *) list->data;			in->alive = FALSE;			in->new_connection = FALSE;			}		gkrellm_sys_inet_read_tcp_data();		for (list = inet_list; list; )			{			in = (InetData *) list->data;			if (!in->alive)				{				if (list == inet_list)					inet_list = inet_list->next;				list = g_list_remove(list, in);				inet_dead_list = g_list_append(inet_dead_list, in);				}			else				list = list->next;			}		if (inet_new || inet_dead_list)			gkrellmd_need_serve(mon);		}	check_tcp = (check_tcp + 1) % _GK.inet_interval;	}static voidserve_inet_data(GkrellmdMonitor *mon, gboolean first_serve)	{	InetData	*in;	ActiveTCP	*tcp;	GList		*list;	gchar		buf[128], *cp;#if defined(INET6) && defined(HAVE_GETADDRINFO)	struct sockaddr_in6	sin6;	char		addrbuf[NI_MAXHOST];#endif	if (inet_new || first_serve)		{		gkrellmd_set_serve_name(mon, "inet");		for (list = inet_list; list; list = list->next)			{			in = (InetData *) list->data;			tcp = &in->tcp;			if (   tcp->family == AF_INET				&& (in->new_connection || first_serve)			   )				{				cp = inet_ntoa(tcp->remote_addr);				sprintf(buf, "+0 %x %s:%x\n",							tcp->local_port, cp, tcp->remote_port);				}#if defined(INET6) && defined(HAVE_GETADDRINFO)			else if (tcp->family == AF_INET6				 && (in->new_connection || first_serve))				{				memset(&sin6, 0, sizeof(sin6));				memcpy(&sin6.sin6_addr, &tcp->remote_addr6,				       sizeof(struct in6_addr));				sin6.sin6_family = AF_INET6;#ifdef SIN6_LEN				sin6.sin6_len = sizeof(struct sockaddr_in6);#endif				if (getnameinfo((struct sockaddr *)&sin6,						sizeof(struct sockaddr_in6),						addrbuf, sizeof(addrbuf),						NULL, 0,						NI_NUMERICHOST|NI_WITHSCOPEID)				    != 0)					continue;				snprintf(buf, sizeof(buf), "+6 %x [%s]:%x\n",					 tcp->local_port, addrbuf,					 tcp->remote_port);				}#endif			else				continue;			gkrellmd_serve_data(mon, buf);			}		}	if (!first_serve)		{		gkrellmd_set_serve_name(mon, "inet");		for (list = inet_dead_list; list; list = list->next)			{			in = (InetData *) list->data;			tcp = &in->tcp;			if (tcp->family == AF_INET)				{				cp = inet_ntoa(tcp->remote_addr);				sprintf(buf, "-0 %x %s:%x\n",							tcp->local_port, cp, tcp->remote_port);				}#if defined(INET6) && defined(HAVE_GETADDRINFO)			else if (tcp->family == AF_INET6)				{				memset(&sin6, 0, sizeof(sin6));				memcpy(&sin6.sin6_addr, &tcp->remote_addr6,				       sizeof(struct in6_addr));				sin6.sin6_family = AF_INET6;#ifdef SIN6_LEN				sin6.sin6_len = sizeof(struct sockaddr_in6);#endif				if (getnameinfo((struct sockaddr *)&sin6,						sizeof(struct sockaddr_in6),						addrbuf, sizeof(addrbuf),						NULL, 0,						NI_NUMERICHOST|NI_WITHSCOPEID)				    != 0)					continue;				snprintf(buf, sizeof(buf), "-6 %x [%s]:%x\n",					 tcp->local_port, addrbuf,					 tcp->remote_port);				}#endif			else				continue;			gkrellmd_serve_data(mon, buf);			}		}	}static voidserve_inet_setup(GkrellmdMonitor *mon)	{	GkrellmdClient	*client = mon->privat->client;	if (inet_unsupported)		gkrellmd_send_to_client(client, "<inet_setup>\ninet_unsupported\n");	}static GkrellmdMonitor inet_monitor =	{	"inet",	update_inet,	serve_inet_data,	serve_inet_setup	};static GkrellmdMonitor *init_inet_monitor(void)	{	if (_GK.inet_interval > 0 && gkrellm_sys_inet_init())		return &inet_monitor;	inet_unsupported = TRUE;	return NULL;	}/* ======================================================= */#define TIMER_TYPE_NONE	0#define TIMER_TYPE_PPP	1#define TIMER_TYPE_IPPP	2typedef struct	{	gchar		*name;	gboolean	changed,				up,				up_prev,				up_event,				down_event;	gboolean	timed_changed;	time_t		up_time;	gulong		rx,				tx;	}	NetData;static NetData	*net_timer;static GList	*net_list,				*net_sys_list;static time_t	net_timer0;static gint		net_timer_type;static gboolean	net_use_routed;gchar *gkrellm_net_mon_first(void)	{	gchar	*name = NULL;	net_sys_list = net_list;	if (net_sys_list)		{		name = ((NetData *) (net_sys_list->data))->name;		net_sys_list = net_sys_list->next;		}	return name;	}gchar *gkrellm_net_mon_next(void)	{	gchar	*name = NULL;	if (net_sys_list)		{		name = ((NetData *) (net_sys_list->data))->name;		net_sys_list = net_sys_list->next;		}	return name;	}voidgkrellm_net_use_routed(gboolean real_routed /* not applicable in server */)	{	net_use_routed = TRUE;	}static NetData *net_new(gchar *name)	{	NetData	*net;	net = g_new0(NetData, 1);	net->name = g_strdup(name);	net_list = g_list_append(net_list, net);	if (net_timer_type != TIMER_TYPE_NONE && !strcmp(_GK.net_timer, net->name))		net_timer = net;	return net;	}voidgkrellm_net_assign_data(gchar *name, gulong rx, gulong tx)	{	GList	*list;	NetData	*net;	for (list = net_list; list; list = list->next)		{		net = (NetData *) list->data;		if (!strcmp(net->name, name))			{			if (net->rx != rx || net->tx != tx)				net->changed = TRUE;			else				net->changed = FALSE;			break;			}		}	if (!list)		net = net_new(name);	if (GK.second_tick && !net_use_routed)		net->up = TRUE;	net->rx = rx;	net->tx = tx;	}voidgkrellm_net_routed_event(gchar *name, gboolean routed)	{	GList	*list;	NetData	*net;	for (list = net_list; list; list = list->next)		{		net = (NetData *) list->data;		if (!strcmp(net->name, name))			break;		}	if (!list)		net = net_new(name);	if (routed)		net->up_event = TRUE;	else		net->down_event = TRUE;	net->up = routed;	}voidgkrellm_net_add_timer_type_ppp(gchar *name)	{	if (!_GK.net_timer)		return;	if (name && !strncmp(_GK.net_timer, name, strlen(name) - 1))		net_timer_type = TIMER_TYPE_PPP;	}voidgkrellm_net_add_timer_type_ippp(gchar *name)	{	if (!_GK.net_timer)		return;	if (name && !strncmp(_GK.net_timer, name, strlen(name) - 1))		net_timer_type = TIMER_TYPE_IPPP;	}voidgkrellm_net_set_lock_directory(gchar *dir)	{	/* Not supported remotely */	}static voidupdate_net(GkrellmdMonitor *mon, gboolean first_update)	{	GList		*list;	NetData		*net;	gint		up_time = 0;	if (GK.second_tick)		{		if (!net_use_routed)			{			for (list = net_list; list; list = list->next)				{				net = (NetData *) list->data;				net->up_prev = net->up;				net->up = FALSE;				}			}		else			gkrellm_sys_net_check_routes();		}	gkrellm_sys_net_read_data();		if (GK.second_tick && !net_use_routed)		{		for (list = net_list; list; list = list->next)			{			net = (NetData *) list->data;			if (net->up && !net->up_prev)				net->up_event = TRUE;			else if (!net->up && net->up_prev)				net->down_event = TRUE;			}		}	if (net_timer && GK.second_tick)		{		if (net_timer_type == TIMER_TYPE_PPP)			{			struct stat		st;			gchar			buf[256];			if (net_timer->up_event)				{				snprintf(buf, sizeof(buf), "/var/run/%s.pid", net_timer->name);				if (stat(buf, &st) == 0)					net_timer0 = st.st_mtime;				else					time(&net_timer0);				}			if (net_timer->up)				up_time = (int) (time(0) - net_timer0);			}		else if (net_timer_type == TIMER_TYPE_IPPP)			{			/* get all isdn status from its connect state because the			|  net_timer->up can be UP even with isdn line not connected.			|  Can't get time history if gkrellmd started after connects.			*/			static gboolean		old_connected;			gboolean			connected;			connected = gkrellm_sys_net_isdn_online();			if (connected && !old_connected)				time(&net_timer0);			/* New session just started */			old_connected = connected;			up_time = (int) (time(0) - net_timer0);			}		if (up_time != net_timer->up_time)			net_timer->timed_changed = TRUE;		net_timer->up_time = up_time;		}	gkrellmd_need_serve(mon);	/* serve func checks for changed */	}static voidserve_net_data(GkrellmdMonitor *mon, gboolean first_serve)	{	NetData		*net;	GList		*list;	gchar		buf[128];	gboolean	fake_up_event;	gkrellmd_set_serve_name(mon, "net");	for (list = net_list; list; list = list->next)		{		net = (NetData *) list->data;		if (net->changed || first_serve)			{			sprintf(buf, "%s %lu %lu\n", net->name, net->rx, net->tx);			gkrellmd_serve_data(mon, buf);			}		}	/* Since the server transmits changes only, use the routed interface	|  to the client regardless if the sysdep code uses routed.	*/	if (GK.second_tick || first_serve)		{		gkrellmd_set_serve_name(mon, "net_routed");		for (list = net_list; list; list = list->next)			{			net = (NetData *) list->data;			fake_up_event = (first_serve && net->up);			if (net->up_event || net->down_event || fake_up_event)				{				sprintf(buf, "%s %d\n", net->name,						fake_up_event ? TRUE : net->up_event);				gkrellmd_serve_data(mon, buf);				}			if (mon->privat->client->last_client)				net->up_event = net->down_event = FALSE;			}		}	if (net_timer && GK.second_tick)		{		if (net_timer->timed_changed || first_serve)			{			gkrellmd_set_serve_name(mon, "net_timer");			sprintf(buf, "%s %d\n", net_timer->name, (gint)net_timer->up_time);			gkrellmd_serve_data(mon, buf);			}		}	}static voidserve_net_setup(GkrellmdMonitor *mon)	{	GkrellmdClient	*client = mon->privat->client;	gchar			buf[128];	/* The client <-> server link always uses routed mode, but the client	|  needs to know if server sysdep uses routed for config purposes.	*/	if (net_use_routed)		gkrellmd_send_to_client(client, "<net_setup>\nnet_use_routed\n");	if (net_timer_type != TIMER_TYPE_NONE)		{		snprintf(buf, sizeof(buf),				"<net_setup>\nnet_timer %s\n", _GK.net_timer);		gkrellmd_send_to_client(client, buf);		}	}static GkrellmdMonitor net_monitor =	{	"net",	update_net,	serve_net_data,	serve_net_setup	};static GkrellmdMonitor *init_net_monitor(void)	{	net_timer_type = TIMER_TYPE_NONE;	if (gkrellm_sys_net_init())		return &net_monitor;	return NULL;	}/* ======================================================= */struct	{	gboolean	mem_changed;	guint64		total,				used,				free,				shared,				buffers,				cached;	gboolean	swap_changed;	guint64		swap_total,

⌨️ 快捷键说明

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