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

📄 solaris.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -