📄 solaris.c
字号:
#include <inet/mib2.h>#include <fcntl.h>#include <sys/tihdr.h>voidgkrellm_sys_inet_read_tcp_data() { ActiveTCP tcp; gint tcp_status; static int tcpfd = 0; mib2_tcpConnEntry_t *tp;#if defined(INET6) mib2_tcp6ConnEntry_t *tp6;#endif char buf[512]; int i, flags, getcode, num_ent; struct strbuf ctlbuf, databuf; struct T_optmgmt_req *tor = (struct T_optmgmt_req *)buf; struct T_optmgmt_ack *toa = (struct T_optmgmt_ack *)buf; struct T_error_ack *tea = (struct T_error_ack *)buf; struct opthdr *mibhdr; if (tcpfd == 0) { if ((tcpfd = open("/dev/tcp", O_RDWR)) == -1) { perror("open"); } } tor->PRIM_type = T_SVR4_OPTMGMT_REQ; tor->OPT_offset = sizeof (struct T_optmgmt_req); tor->OPT_length = sizeof (struct opthdr); tor->MGMT_flags = T_CURRENT; mibhdr = (struct opthdr *)&tor[1]; mibhdr->level = MIB2_TCP; mibhdr->name = 0; mibhdr->len = 0; ctlbuf.buf = buf; ctlbuf.len = tor->OPT_offset + tor->OPT_length; flags = 0; /* request to be sent in non-priority */ if (putmsg(tcpfd, &ctlbuf, (struct strbuf *)0, flags) == -1) { perror("putmsg"); } mibhdr = (struct opthdr *)&toa[1]; ctlbuf.maxlen = sizeof (buf); /* now receiving response from stream */ for (;;) { flags = 0; /* read any messages available */ getcode = getmsg(tcpfd, &ctlbuf, (struct strbuf *)0, &flags); if (getcode != MOREDATA || ctlbuf.len < sizeof (struct T_optmgmt_ack) || toa->PRIM_type != T_OPTMGMT_ACK || toa->MGMT_flags != T_SUCCESS) { break; } if (ctlbuf.len >= sizeof (struct T_error_ack) && tea->PRIM_type == T_ERROR_ACK) { perror("ERROR_ACK"); return; } if (getcode == 0 && ctlbuf.len >= sizeof (struct T_optmgmt_ack) && toa->PRIM_type == T_OPTMGMT_ACK && toa->MGMT_flags == T_SUCCESS) { return; } /* prepare for receiving data */ databuf.maxlen = mibhdr->len; databuf.len = 0; databuf.buf = (char *)malloc((int)mibhdr->len); if(!databuf.buf) { perror("malloc"); break; } flags = 0; getcode = getmsg(tcpfd, (struct strbuf *)0, &databuf, &flags); if (mibhdr->level == MIB2_TCP && mibhdr->name == MIB2_TCP_13) { tp = (mib2_tcpConnEntry_t *)databuf.buf; num_ent = mibhdr->len / sizeof(mib2_tcpConnEntry_t); for (i = 0; i < num_ent; i++, tp++) { if (tp->tcpConnState != MIB2_TCP_established) continue; tcp.local_port = tp->tcpConnLocalPort; tcp.remote_addr.s_addr = tp->tcpConnRemAddress; tcp.remote_port = tp->tcpConnRemPort; tcp.family = AF_INET; tcp_status = (tp->tcpConnState == MIB2_TCP_established); if (tcp_status == TCP_ALIVE) gkrellm_inet_log_tcp_port_data(&tcp); } }#if defined(INET6) if (mibhdr->level == MIB2_TCP6 && mibhdr->name == MIB2_TCP6_CONN) { tp6 = (mib2_tcp6ConnEntry_t *)databuf.buf; num_ent = mibhdr->len / sizeof(mib2_tcp6ConnEntry_t); for (i = 0; i < num_ent; i++, tp6++) { if (tp6->tcp6ConnState != MIB2_TCP_established) continue; tcp.local_port = tp6->tcp6ConnLocalPort; tcp.remote_port = tp6->tcp6ConnRemPort; memcpy(&tcp.remote_addr6, &tp6->tcp6ConnRemAddress, sizeof(struct in6_addr)); tcp.family = AF_INET6; tcp_status = (tp6->tcp6ConnState == MIB2_TCP_established); if (tcp_status == TCP_ALIVE) gkrellm_inet_log_tcp_port_data(&tcp); } }#endif /* INET6 */ free(databuf.buf); }}gbooleangkrellm_sys_inet_init(void) { return TRUE; }/* ===================================================================== *//* Net monitor interface */#include <kstat.h>#include <net/if.h>#include <sys/sockio.h>/* * FIXME: I haven't tested Net timer (and never will), but I believe it's * not going to work. Name of the lock file is different from one on Linux. * If you need this functionality, feel free to modify my code. */ voidgkrellm_sys_net_read_data(void) { gulong rx, tx; extern kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; if (kstat_chain_update(kc) == -1) { perror("kstat_chain_update"); return; } for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) { if (!strcmp(ksp->ks_class, "net")) { kstat_read(kc, ksp, NULL); knp = kstat_data_lookup(ksp, "rbytes"); if (knp == NULL) continue; rx = knp->value.ui32; knp = kstat_data_lookup(ksp, "obytes"); if (knp == NULL) continue; tx = knp->value.ui32; gkrellm_net_assign_data(ksp->ks_name, rx, tx); } } }#if 0/* New way is for above gkrellm_sys_net_read_data() to just assign data| for all net interfaces.*/voidgkrellm_sys_net_sync(void) { GList *list; int numifs, numifreqs; int i, sockfd; size_t bufsize; gchar *buf; struct ifreq ifr, *ifrp; struct ifconf ifc; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return; if (ioctl(sockfd, SIOCGIFNUM, (char *)&numifs) < 0) { perror("SIOCGIFNUM"); close(sockfd); return; } bufsize = ((size_t)numifs) * sizeof(struct ifreq); buf = (char *)malloc(bufsize); if (!buf) { perror("malloc"); close(sockfd); return; } ifc.ifc_len = bufsize; ifc.ifc_buf = buf; if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0) { perror("SIOCGIFCONF"); free(buf); close(sockfd); return; }#ifdef DEBUG printf("interfaces probed: "); for (i=0; i < numifs; i++) { printf("%s ", ifc.ifc_req[i].ifr_name); } printf("\n");#endif ifrp = ifc.ifc_req; numifreqs = ifc.ifc_len / sizeof(struct ifreq); for (i = 0; i < numifreqs; i++, ifrp++) { memset((char *)&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name)); if (!strncmp(ifr.ifr_name, "lo", 2)) continue; if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) { perror("SIOCGIFFLAGS"); continue; } if (ifr.ifr_flags & IFF_UP) gkrellm_net_interface_is_up(ifr.ifr_name); } free(buf); close(sockfd); }#endifgbooleangkrellm_sys_net_isdn_online(void) { return FALSE; }voidgkrellm_sys_net_check_routes(void){}gbooleangkrellm_sys_net_init(void) { gkrellm_net_set_lock_directory("/var/spool/locks"); gkrellm_net_add_timer_type_ppp("ipdptp0"); gkrellm_net_add_timer_type_ppp("ppp0"); return TRUE; }/* ===================================================================== *//* Memory/Swap monitor interface */#include <unistd.h>#include <kstat.h>#include <sys/stat.h>#include <sys/swap.h>static guint64 swap_total, swap_used;voidgkrellm_sys_mem_read_data() { gulong pagesize; guint64 total, used = 0, free = 0; static gulong pageshift = 0, physpages = 0; extern kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; struct anoninfo ai; if (!GK.second_tick) return; if (pageshift == 0) { for (pagesize = sysconf(_SC_PAGESIZE); pagesize > 1; pagesize >>= 1) pageshift++; } if (physpages == 0) { physpages = sysconf(_SC_PHYS_PAGES); } total = physpages; total <<= pageshift; ksp = kstat_lookup(kc, "unix", -1, "system_pages"); if (ksp && kstat_read(kc, ksp, NULL) >= 0) { knp = (kstat_named_t *)kstat_data_lookup(ksp, "pagesfree"); if (knp) { free = knp->value.ui32; free <<= pageshift; used = total - free; } } gkrellm_mem_assign_data(total, used, free, 0, 0, 0); if (swapctl(SC_AINFO, &ai) == -1) { perror("swapctl"); } swap_total = ai.ani_max; swap_total <<= pageshift; swap_used = ai.ani_resv; swap_used <<= pageshift; /* NEED TO BE COMPLETED * mem.x_used, mem.shared, mem.buffers, mem.cached * swap_chart.page_in, swap_chart.page_out (for swap pages in/out chart) */ }voidgkrellm_sys_swap_read_data(void) { /* page in/out UNIMPLEMENTED */ gkrellm_swap_assign_data(swap_total, swap_used, 0, 0); }gbooleangkrellm_sys_mem_init(void) { return TRUE; }/* ===================================================================== *//* FS monitor interface */#include <sys/mnttab.h>#include <sys/vfstab.h>#include <sys/statvfs.h>#include <sys/cdio.h>gbooleangkrellm_sys_fs_fstab_modified(void) { struct stat s; static time_t fstab_mtime; gint modified = FALSE; if (stat("/etc/fstab", &s) == 0 && s.st_mtime != fstab_mtime) modified = TRUE; fstab_mtime = s.st_mtime; return modified; }voidgkrellm_sys_fs_get_fstab_list(){ FILE *fp; struct vfstab vfsbuf; if ((fp = fopen(VFSTAB, "r")) == NULL) return; while (getvfsent(fp, &vfsbuf) == 0) { if (!vfsbuf.vfs_fstype || strcmp(vfsbuf.vfs_fstype, "ufs")) continue; gkrellm_fs_add_to_fstab_list( vfsbuf.vfs_mountp ? vfsbuf.vfs_mountp : "", vfsbuf.vfs_special ? vfsbuf.vfs_special : "", vfsbuf.vfs_fstype ? vfsbuf.vfs_fstype : "", vfsbuf.vfs_mntopts ? vfsbuf.vfs_mntopts : ""); } fclose(fp);}void gkrellm_sys_fs_get_mounts_list(void){ FILE *fp; struct mnttab mntbuf; if ((fp = fopen(MNTTAB, "r")) == NULL) return; while (getmntent(fp, &mntbuf) == 0) { if (strcmp(mntbuf.mnt_fstype, "ufs") && strcmp(mntbuf.mnt_fstype, "nfs")) continue; gkrellm_fs_add_to_mounts_list( mntbuf.mnt_mountp ? mntbuf.mnt_mountp : "", mntbuf.mnt_special ? mntbuf.mnt_special : "", mntbuf.mnt_fstype ? mntbuf.mnt_fstype : ""); } fclose(fp);}voidgkrellm_sys_fs_get_fsusage(gpointer fs, gchar *dir){ struct statvfs st; if (dir && statvfs(dir, &st) == 0) { gkrellm_fs_assign_fsusage_data(fs, (glong) st.f_blocks, (glong) st.f_bavail, (glong) st.f_bfree, (glong) st.f_bsize); } else { gkrellm_fs_assign_fsusage_data(fs, 0, 0, 0, 0); } }static voideject_solaris_cdrom(gchar *device) {#if defined(CDROMEJECT) gint d; if ((d = open(device, O_RDONLY)) >= 0) { ioctl(d, CDROMEJECT); close(d); }#endif}gbooleangkrellm_sys_fs_init(void) { gkrellm_fs_setup_eject(NULL, NULL, eject_solaris_cdrom, NULL); return TRUE; }/* ===================================================================== *//* Battery monitor interface */voidgkrellm_sys_battery_read_data(void) { }gbooleangkrellm_sys_battery_init() { return FALSE; }/* ===================================================================== *//* Uptime monitor interface */#include <time.h>#include <kstat.h>time_tgkrellm_sys_uptime_read_uptime(void) { return (time_t) 0; /* Will calculate using base_uptime */ }gbooleangkrellm_sys_uptime_init(void) { time_t boot, now, base_uptime; extern kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; boot = 0; if (kstat_chain_update(kc) == -1) { perror("kstat_chain_update"); return FALSE; } ksp = kstat_lookup(kc, "unix", -1, "system_misc"); if (ksp && kstat_read(kc, ksp, NULL) >= 0) { knp = (kstat_named_t *)kstat_data_lookup(ksp, "boot_time"); if (knp) { boot = knp->value.ui32; } } if (time(&now) < 0) return FALSE; if (now <= boot) return FALSE; base_uptime = now - boot; base_uptime += 30; gkrellm_uptime_set_base_uptime(base_uptime); return (base_uptime == (time_t) 0) ? FALSE : TRUE; }/* ===================================================================== *//* Sensor monitor interface *//* (nonfunctional) */gbooleangkrellm_sys_sensors_init(void){ return FALSE;}gbooleangkrellm_sys_sensors_get_temperature(gchar *name, gint id, gint iodev, gint inter, gfloat *t){ return FALSE;}gbooleangkrellm_sys_sensors_get_fan(gchar *name, gint id, gint iodev, gint inter, gfloat *t){ return FALSE;}gbooleangkrellm_sys_sensors_get_voltage(gchar *name, gint id, gint iodev, gint inter, gfloat *t){ return FALSE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -