📄 freebsd.c
字号:
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 + -