📄 bsd-common.c
字号:
/* GKrellM| Copyright (C) 1999-2006 Bill Wilson|| Author: Bill Wilson billw@gkrellm.net| Latest versions might be found at: http://gkrellm.net|| BSD code: Hajimu UMEMOTO <ume@FreeBSD.org>| Anthony Mallet <anthony.mallet@useless-ficus.net>|| This program is free software which I release under the GNU General Public| License. You may redistribute and/or modify this program under the terms| of that license as published by the Free Software Foundation; either| version 2 of the License, or (at your option) any later version.|| This program is distributed in the hope that it will be useful,| but WITHOUT ANY WARRANTY; without even the implied warranty of| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the| GNU General Public License for more details. Version 2 is in the| COPYRIGHT file in the top level directory of this distribution.| | To get a copy of the GNU General Puplic License, write to the Free Software| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#if !(defined(__FreeBSD__) && __FreeBSD_version < 410000) && \ !(defined(__NetBSD__) && __NetBSD_version < 105000000) && \ !(defined(__OpenBSD__) && OpenBSD < 200006) && \ !defined(__APPLE__)#define HAVE_GETIFADDRS 1#endif#if defined(HAVE_GETIFADDRS)#include <sys/types.h>#include <sys/socket.h>#include <net/if.h>#include <ifaddrs.h>voidgkrellm_sys_net_read_data(void) { struct ifaddrs *ifap, *ifa; struct if_data *ifd; if (getifaddrs(&ifap) < 0) return; for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if (ifa->ifa_flags & IFF_UP) { if (ifa->ifa_addr->sa_family != AF_LINK) continue; ifd = (struct if_data *)ifa->ifa_data; gkrellm_net_assign_data(ifa->ifa_name, ifd->ifi_ibytes, ifd->ifi_obytes); } } freeifaddrs(ifap); }#else /* HAVE_GETIFADDRS */#include <sys/sysctl.h>#include <sys/socket.h> // For PF_ROUTE, etc#include <net/if.h>#include <net/if_dl.h>#include <net/route.h>static int mib_net[] = { CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0 };static char *buf;static int alloc;voidgkrellm_sys_net_read_data(void) { struct if_msghdr *ifm, *nextifm; struct sockaddr_dl *sdl; char *lim, *next; size_t needed; gchar s[32]; if (sysctl(mib_net, 6, NULL, &needed, NULL, 0) < 0) return; if (alloc < needed) { if (buf != NULL) free(buf); buf = malloc(needed); if (buf == NULL) return; alloc = needed; } if (sysctl(mib_net, 6, buf, &needed, NULL, 0) < 0) return; lim = buf + needed; next = buf; while (next < lim) { ifm = (struct if_msghdr *)next; if (ifm->ifm_type != RTM_IFINFO) return; next += ifm->ifm_msglen; while (next < lim) { nextifm = (struct if_msghdr *)next; if (nextifm->ifm_type != RTM_NEWADDR) break; next += nextifm->ifm_msglen; } if (ifm->ifm_flags & IFF_UP) { sdl = (struct sockaddr_dl *)(ifm + 1); if (sdl->sdl_family != AF_LINK) continue; strncpy(s, sdl->sdl_data, sdl->sdl_nlen); s[sdl->sdl_nlen] = '\0'; gkrellm_net_assign_data(s, ifm->ifm_data.ifi_ibytes, ifm->ifm_data.ifi_obytes); } } }#endif /* HAVE_GETIFADDRS */ /* This would be needed only if net up (or routed) state is available in | a different way than for reading net stats. */voidgkrellm_sys_net_check_routes(void) { return; }gbooleangkrellm_sys_net_isdn_online(void) { return FALSE; }gbooleangkrellm_sys_net_init(void) { gkrellm_net_set_lock_directory("/var/spool/lock"); gkrellm_net_add_timer_type_ppp("tun0"); gkrellm_net_add_timer_type_ppp("ppp0"); return TRUE; }/* ===================================================================== *//* FS monitor interface */#include <sys/mount.h>#if !defined(__APPLE__)#include <sys/cdio.h>#endif#include <sys/wait.h>#if defined(__FreeBSD__)#include <osreldate.h>#if __FreeBSD_version < 300000static char *mnttype[] = INITMOUNTNAMES;#endif#endifstatic voidfix_fstab_name(gchar *buf) { gchar *rp, *wp; if (buf[0] == '\0') return; rp = buf; wp = buf; do /* This loop same as in libc6 getmntent() */ if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '4' && rp[3] == '0') { *wp++ = ' '; /* \040 is a SPACE. */ rp += 3; } else if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '1' && rp[3] == '2') { *wp++ = '\t'; /* \012 is a TAB. */ rp += 3; } else if (rp[0] == '\\' && rp[1] == '\\') { *wp++ = '\\'; /* \\ is a \ */ rp += 1; } else *wp++ = *rp; while (*rp++ != '\0'); }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(void) { FILE *f; gchar buf[1024], *s; gchar dev[65], dir[129], type[65], opt[129]; if ((f = fopen("/etc/fstab", "r")) == NULL) return; while (fgets(buf, sizeof(buf), f)) { s = buf; while (*s == ' ' || *s == '\t') ++s; if (*s == '\0' || *s == '#' || *s == '\n') continue; dev[0] = dir[0] = type[0] = opt[0] = '\0'; sscanf(s, "%64s %128s %64s %128s", dev, dir, type, opt); fix_fstab_name(dev); fix_fstab_name(dir); fix_fstab_name(type); fix_fstab_name(opt); if ( type[0] == '\0' || !strcmp(type, "devpts") || !strcmp(type, "swap") || !strcmp(type, "proc") || !strcmp(type, "usbdevfs") || !strcmp(type, "ignore") ) continue; gkrellm_fs_add_to_fstab_list(dir, dev, type, opt); } fclose(f); }voidgkrellm_sys_fs_get_mounts_list(void) { gchar *s, *dev, *dir, *type; struct statfs *mntbuf; gint mntsize, i; if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) return; for (i = 0; i < mntsize; i++) {#if defined(__FreeBSD__) && __FreeBSD_version < 300000 type = mnttype[mntbuf[i].f_type];#else type = mntbuf[i].f_fstypename;#endif dir = mntbuf[i].f_mntonname; dev = mntbuf[i].f_mntfromname; /* Strip trailing / from the directory. */ s = strrchr(dir, (int) '/'); if (s && s != dir && *(s+1) == '\0') *s = '\0'; gkrellm_fs_add_to_mounts_list(dir, dev, type); } }voidgkrellm_sys_fs_get_fsusage(gpointer fs, gchar *dir) { struct statfs st; if (!statfs(dir, &st)) 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); }#if defined(__APPLE__)#include <IOKit/storage/IOMediaBSDClient.h>static voideject_darwin_cdrom(gchar *device) { gint d; if ((d = open(device, O_RDONLY)) >= 0) { ioctl(d, DKIOCEJECT); close(d); } }#else /* FreeBSD || NetBSD || OpenBSD */static voideject_bsd_cdrom(gchar *device) { gint d; if ((d = open(device, O_RDONLY)) >= 0) { (void) ioctl(d, CDIOCALLOW); ioctl(d, CDIOCEJECT); close(d); } }#endif#if defined(__APPLE__)gbooleangkrellm_sys_fs_init(void) { gchar *eject_command = NULL, *close_command = NULL;#if defined(WEXITSTATUS) gint n; n = system("hdiutil info > /dev/null 2>&1"); if (WEXITSTATUS(n) == 0) { eject_command = "hdiutil eject %s"; close_command = "disktool -o %s"; }#endif gkrellm_fs_setup_eject(eject_command, close_command, eject_darwin_cdrom, NULL); return TRUE; }#endif#if defined(__FreeBSD__)gbooleangkrellm_sys_fs_init(void) { gchar *eject_command = NULL, *close_command = NULL;#if defined(WEXITSTATUS) gint n; n = system("cdcontrol quit > /dev/null 2>&1"); if (WEXITSTATUS(n) == 0) { eject_command = "cdcontrol -f %s eject"; close_command = "cdcontrol -f %s close"; }#endif gkrellm_fs_setup_eject(eject_command, close_command, eject_bsd_cdrom, NULL); return TRUE; }#endif /* __FreeBSD__ */#if defined(__NetBSD__)gbooleangkrellm_sys_fs_init(void) { gchar *eject_command = NULL, *close_command = NULL;#if defined(WEXITSTATUS) gint n; n = system("eject -n > /dev/null 2>&1"); if (WEXITSTATUS(n) == 0) { eject_command = "eject %s"; close_command = "eject -l %s"; }#endif gkrellm_fs_setup_eject(eject_command, close_command, eject_bsd_cdrom, NULL); return TRUE; }#endif /* __NetBSD__ */#if defined(__OpenBSD__)gbooleangkrellm_sys_fs_init(void) { gkrellm_fs_setup_eject(NULL, NULL, eject_bsd_cdrom, NULL); return TRUE; }#endif /* __OpenBSD__ *//* ===================================================================== *//* Uptime monitor interface */#include <sys/sysctl.h>time_tgkrellm_sys_uptime_read_uptime(void) { return (time_t) 0; /* Will calculate using base_uptime */ }gbooleangkrellm_sys_uptime_init(void) { static int mib[] = { CTL_KERN, KERN_BOOTTIME }; struct timeval boottime; size_t size = sizeof(boottime); time_t base_uptime, now; base_uptime = (time_t) 0; if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { (void)time(&now); base_uptime = now - boottime.tv_sec; base_uptime += 30; } gkrellm_uptime_set_base_uptime(base_uptime); return (base_uptime == (time_t) 0) ? FALSE : TRUE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -