freebsd-ports/sysutils/gkrellm2/files/patch-src::sysdeps::freebsd.c
Hajimu UMEMOTO 3f80d6734a - Gets the sensors to work properly on the amd64 platform.
- Fixes a bug that frees the sensors where it is supposed to allocate
  them.
- Gets the LM sensors to work again on latest version of GKrellM.

Submitted by:	Cyrus Rahman <crahman__at__gmail.com>
2008-10-12 17:47:26 +00:00

630 lines
16 KiB
C

Index: src/sysdeps/freebsd.c
diff -u -p src/sysdeps/freebsd.c.orig src/sysdeps/freebsd.c
--- src/sysdeps/freebsd.c.orig 2008-10-04 09:45:56.000000000 +0900
+++ src/sysdeps/freebsd.c 2008-10-13 02:35:16.000000000 +0900
@@ -33,14 +33,20 @@
| as that of the covered work.
*/
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <osreldate.h>
+
+#if __FreeBSD_version < 500000
#include <kvm.h>
kvm_t *kvmd = NULL;
char errbuf[_POSIX2_LINE_MAX];
+#endif
// extern gboolean force_meminfo_update(void);
-#if defined(__i386__)
+#if defined(__i386__) || defined(__amd64__)
static void scan_for_sensors();
#endif
@@ -51,13 +57,15 @@ gkrellm_sys_main_init(void)
/* We just ignore error, here. Even if GKrellM doesn't have
| kmem privilege, it runs with available information.
*/
+#if __FreeBSD_version < 500000
kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
+#endif
if (setgid(getgid()) != 0)
{
fprintf(stderr, "Can't drop setgid privileges.");
exit(1);
}
-#if defined(__i386__)
+#if defined(__i386__) || defined(__amd64__)
scan_for_sensors();
#endif
if (setuid(getuid()) != 0)
@@ -72,9 +80,6 @@ gkrellm_sys_main_cleanup(void)
{
}
-#include <sys/param.h>
-#include <sys/sysctl.h>
-
static int
gk_sysctlnametomib(const char *name, int *mibp, size_t *lenp)
{
@@ -90,16 +95,11 @@ gk_sysctlnametomib(const char *name, int
/* ===================================================================== */
/* CPU monitor interface */
-#include <osreldate.h>
#if __FreeBSD_version >= 500101
#include <sys/resource.h>
#else
#include <sys/dkstat.h>
#endif
-#include <kvm.h>
-
-
-extern kvm_t *kvmd;
static int oid_cp_time[CTL_MAXNAME + 2];
static size_t oid_cp_time_len = sizeof(oid_cp_time);
@@ -109,12 +109,14 @@ void
gkrellm_sys_cpu_read_data(void)
{
long cp_time[CPUSTATES];
- int len = sizeof(cp_time);
+ size_t len = sizeof(cp_time);
+#if __FreeBSD_version < 500000
static struct nlist nl[] = {
#define N_CP_TIME 0
{ "_cp_time" },
{ "" }
};
+#endif
if (have_cp_time)
{
@@ -122,6 +124,7 @@ gkrellm_sys_cpu_read_data(void)
cp_time, &len, 0, 0) < 0)
return;
}
+#if __FreeBSD_version < 500000
else
{
if (kvmd == NULL)
@@ -133,6 +136,7 @@ gkrellm_sys_cpu_read_data(void)
sizeof(cp_time)) != sizeof(cp_time))
return;
}
+#endif
/* Currently, SMP is not supported */
gkrellm_cpu_assign_data(0, cp_time[CP_USER], cp_time[CP_NICE],
@@ -156,8 +160,6 @@ gkrellm_sys_cpu_init(void)
/* ===================================================================== */
/* Proc monitor interface */
-#include <osreldate.h>
-#include <sys/sysctl.h>
#if __FreeBSD_version >= 400000
#include <sys/user.h>
#endif
@@ -175,13 +177,10 @@ gkrellm_sys_cpu_init(void)
#undef KERNEL
#endif
-#include <kvm.h>
#include <limits.h>
#include <paths.h>
#include <utmp.h>
-extern kvm_t *kvmd;
-
static int oid_v_forks[CTL_MAXNAME + 2];
static int oid_v_vforks[CTL_MAXNAME + 2];
static int oid_v_rforks[CTL_MAXNAME + 2];
@@ -215,17 +214,19 @@ gkrellm_sys_proc_read_data(void)
static int oid_proc[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
#endif
double avenrun;
- static u_int n_processes, n_forks = 0, curpid = -1;
+ static u_int n_processes, n_forks = 0;
u_int n_vforks, n_rforks;
gint r_forks, r_vforks, r_rforks;
- gint len;
+ size_t len;
+#if __FreeBSD_version < 500000
+ static u_int curpid = -1;
gint nextpid, nforked;
static struct nlist nl[] = {
#define N_NEXTPID 0
{ "_nextpid" },
{ "" }
};
-
+#endif
if (getloadavg(&avenrun, 1) <= 0)
avenrun = 0;
@@ -246,6 +247,7 @@ gkrellm_sys_proc_read_data(void)
if (r_forks >= 0 && r_vforks >= 0 && r_rforks >= 0)
n_forks = n_forks + n_vforks + n_rforks;
}
+#if __FreeBSD_version < 500000
else
{
/* workaround: Can I get total number of processes? */
@@ -268,6 +270,7 @@ gkrellm_sys_proc_read_data(void)
}
}
}
+#endif
#if __FreeBSD_version >= 400000
if (sysctl(oid_proc, 3, NULL, &len, NULL, 0) >= 0)
@@ -318,10 +321,6 @@ gkrellm_sys_proc_read_users(void)
#if __FreeBSD_version >= 300000
#include <devstat.h>
static struct statinfo statinfo_cur;
-#else
-#include <kvm.h>
-
-extern kvm_t *kvmd;
#endif
gchar *
@@ -479,11 +478,7 @@ gkrellm_sys_disk_init(void)
#include <netinet6/tcp6_var.h>
#endif
-#include <kvm.h>
#include <nlist.h>
-
-extern kvm_t *kvmd;
-extern char errbuf[];
#endif
@@ -582,7 +577,7 @@ gkrellm_sys_inet_read_tcp_data(void)
gint tcp_status;
struct xinpgen *xig, *oxig;
gchar *buf;
- gint len = 0;
+ size_t len = 0;
if (!initialized)
{
@@ -655,17 +650,14 @@ gkrellm_sys_inet_init(void)
/* ===================================================================== */
/* 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>
+#if __FreeBSD_version < 410000
static struct nlist nl_mem[] = {
#define N_CNT 0
{ "_cnt" },
@@ -687,17 +679,20 @@ static struct nlist nl_mem[] = {
#endif
{ "" }
};
-
-extern kvm_t *kvmd;
-extern char errbuf[];
+#endif
static int
-swapmode(guint64 *retavail, guint64 *retfree)
+swapmode(unsigned long long *retavail, unsigned long long *retfree)
{
guint64 used, avail;
#if __FreeBSD_version >= 400000
static int psize = -1;
struct kvm_swap kvmswap;
+#if __FreeBSD_version >= 500000
+ struct xswdev xsw;
+ size_t mibsize, size;
+ int mib[16], n;
+#endif
#else
char *header;
int hlen, nswap, nswdev, dmmax;
@@ -734,21 +729,37 @@ swapmode(guint64 *retavail, guint64 *ret
}
warning--; /* decrease counter, see end of function */
+#if __FreeBSD_version >= 400000
+#if __FreeBSD_version >= 500000
+ mibsize = sizeof mib / sizeof mib[0];
+ if (gk_sysctlnametomib("vm.swap_info", mib, &mibsize) == -1)
+ return(0);
+ kvmswap.ksw_total = 0;
+ kvmswap.ksw_used = 0;
+ for (n = 0; ; ++n)
+ {
+ mib[mibsize] = n;
+ size = sizeof xsw;
+ if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1)
+ break;
+ kvmswap.ksw_total += xsw.xsw_nblks;
+ kvmswap.ksw_used += xsw.xsw_used;
+ }
+#else
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);
- }
+#endif
if (psize < 0)
- psize = getpagesize();
+ psize = getpagesize();
*retavail = avail = (quad_t)kvmswap.ksw_total * psize;
used = (quad_t)kvmswap.ksw_used * psize;
*retfree = avail - used;
#else
+ if (kvmd == NULL)
+ return(0);
if (kvm_read(kvmd, nl_mem[VM_NSWAP].n_value,
&nswap, sizeof(nswap)) != sizeof(nswap))
return(0);
@@ -942,9 +953,9 @@ static struct mibtab mibs[] = {
#endif
static guint64 swapin,
- swapout,
- swap_total,
- swap_used;
+ swapout;
+static unsigned long long swap_total,
+ swap_used;
void
gkrellm_sys_mem_read_data(void)
@@ -954,15 +965,14 @@ gkrellm_sys_mem_read_data(void)
static gint swappgsin = -1;
static gint swappgsout = -1;
gint dpagein, dpageout;
- struct vmmeter sum;
- guint64 total, used, x_used, free, shared, buffers, cached;
+ guint64 total, used, x_used, free, shared, buffers = 0, 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];
+#else
+ struct vmmeter sum;
#endif
#if 0
@@ -981,60 +991,49 @@ gkrellm_sys_mem_read_data(void)
}
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;
- }
+ if (!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;
- }
+ 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);
}
- fclose(f);
-#endif
- return;
}
+ 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);
+ if (swappgsin < 0)
+ {
+ dpagein = 0;
+ dpageout = 0;
+ }
+ else
+ {
+ dpagein = (mibs[MIB_V_SWAPPGSIN].value - swappgsin) << pshift;
+ dpageout = (mibs[MIB_V_SWAPPGSOUT].value - swappgsout) << pshift;
+ }
+ swappgsin = mibs[MIB_V_SWAPPGSIN].value;
+ swappgsout = mibs[MIB_V_SWAPPGSOUT].value;
+#else
+ if (kvmd == NULL)
+ return;
if (nl_mem[0].n_type == 0)
if (kvm_nlist(kvmd, nl_mem) < 0 || nl_mem[0].n_type == 0)
return;
@@ -1051,6 +1050,7 @@ gkrellm_sys_mem_read_data(void)
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;
@@ -1058,11 +1058,12 @@ gkrellm_sys_mem_read_data(void)
}
else
{
- dpagein = (sum.v_swappgsin - swappgsin) << (pshift - 10);
- dpageout = (sum.v_swappgsout - swappgsout) << (pshift - 10);
+ dpagein = (sum.v_swappgsin - swappgsin) << pshift;
+ dpageout = (sum.v_swappgsout - swappgsout) << pshift;
}
swappgsin = sum.v_swappgsin;
swappgsout = sum.v_swappgsout;
+#endif
if (dpagein > 0 || dpageout > 0 || first_time_done == 0)
{
@@ -1090,8 +1091,8 @@ gkrellm_sys_mem_init(void)
/* ===================================================================== */
/* Battery monitor interface */
+#if defined(__i386__) || defined(__amd64__)
#if defined(__i386__)
-#include <osreldate.h>
#include <machine/apm_bios.h>
#define APMDEV "/dev/apm"
@@ -1099,6 +1100,7 @@ gkrellm_sys_mem_init(void)
#define L_ON_LINE 1
#define L_CHARGING 3
#define L_UNKNOWN 0xFF
+#endif
/* following two definitions are taken from sys/dev/acpica/acpiio.h */
#define ACPI_BATT_STAT_CHARGING 0x0002
@@ -1125,16 +1127,18 @@ gkrellm_sys_battery_read_data(void)
size_t size;
int acpi_info[4];
int i;
+#if defined(__i386__)
int f, r;
struct apm_info info;
+ gint batt_num = 0;
+#endif
gboolean available, on_line, charging;
gint percent, time_left;
- gint batt_num = 0;
if (!first_time_done)
{
first_time_done = TRUE;
-#ifdef ACPI_SUPPORTS_MULTIPLE_BATTERIES
+#if defined(ACPI_SUPPORTS_MULTIPLE_BATTERIES) || defined(__amd64__)
/*
* XXX: Disable getting battery information via ACPI
* to support multiple batteries via APM sim until
@@ -1174,6 +1178,7 @@ gkrellm_sys_battery_read_data(void)
return;
}
+#if defined(__i386__)
if ((f = open(APMDEV, O_RDONLY)) == -1)
return;
if ((r = ioctl(f, APMIO_GETINFO, &info)) == -1) {
@@ -1231,6 +1236,7 @@ gkrellm_sys_battery_read_data(void)
#endif
close(f);
+#endif
}
gboolean
@@ -1258,7 +1264,7 @@ gkrellm_sys_battery_init(void)
/* ===================================================================== */
/* Sensor monitor interface */
-#if defined(__i386__)
+#if defined(__i386__) || defined(__amd64__)
typedef struct
{
@@ -1286,7 +1292,6 @@ static VoltDefault voltdefault0[] =
};
#include <dirent.h>
-#include <osreldate.h>
#include <machine/cpufunc.h>
#if __FreeBSD_version >= 500042
#include <dev/smbus/smb.h>
@@ -1298,6 +1303,7 @@ static VoltDefault voltdefault0[] =
#define INTERFACE_IO 0
#define INTERFACE_SMB 1
#define INTERFACE_ACPI 2
+#define INTERFACE_CORETEMP 3 /* Already in Celsius */
/* Addresses to use for /dev/io */
#define WBIO1 0x295
@@ -1331,7 +1337,7 @@ get_data(int iodev, u_char command, int
struct smbcmd cmd;
bzero(&cmd, sizeof(cmd));
- cmd.data.byte_ptr = &byte;
+ cmd.data.byte_ptr = (char *)&byte;
cmd.slave = 0x5a;
cmd.cmd = command;
if (ioctl(iodev, SMB_READB, (caddr_t)&cmd) == -1)
@@ -1357,6 +1363,8 @@ gkrellm_sys_sensors_get_temperature(gcha
{
u_char byte;
+ int value;
+ size_t size;
if (interface == MBMON_INTERFACE)
{
@@ -1366,15 +1374,24 @@ gkrellm_sys_sensors_get_temperature(gcha
if (interface == INTERFACE_ACPI)
{
- int value;
- size_t size = sizeof(value);
-
+ size = sizeof(value);
if (sysctlbyname(path, &value, &size, NULL, 0) < 0)
return FALSE;
if (temp)
*temp = (gfloat) TZ_KELVTOC(value);
return TRUE;
}
+
+ if (interface == INTERFACE_CORETEMP)
+ {
+ size = sizeof(value);
+ if (sysctlbyname(path, &value, &size, NULL, 0) < 0)
+ return FALSE;
+ if (temp)
+ *temp = (gfloat) value;
+ return TRUE;
+ }
+
if (get_data(iodev, LM78_TEMP, interface, &byte))
{
if (temp)
@@ -1447,7 +1464,7 @@ gkrellm_sys_sensors_init(void)
gchar mib_name[256], label[8];
gint interface, id;
int oid_acpi_temp[CTL_MAXNAME + 2];
- size_t oid_acpi_temp_len = sizeof(oid_acpi_temp);
+ size_t oid_acpi_temp_len;
GList *list;
struct freebsd_sensor *sensor;
@@ -1455,10 +1472,12 @@ gkrellm_sys_sensors_init(void)
*/
gkrellm_sys_sensors_mbmon_check(TRUE);
- for (id = 0;;)
- {
+ /* ACPI Thermal */
+ for (id = 0;; id++)
+ {
snprintf(mib_name, sizeof(mib_name),
"hw.acpi.thermal.tz%d.temperature", id);
+ oid_acpi_temp_len = sizeof(oid_acpi_temp);
if (gk_sysctlnametomib(mib_name, oid_acpi_temp,
&oid_acpi_temp_len) < 0)
break;
@@ -1470,7 +1489,27 @@ gkrellm_sys_sensors_init(void)
gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, NULL,
mib_name, 0, 0,
interface, 1.0, 0.0, NULL, label);
- }
+ }
+
+ /* Coretemp */
+ for (id = 0;; id++)
+ {
+ snprintf(mib_name, sizeof(mib_name),
+ "dev.cpu.%d.temperature", id);
+ oid_acpi_temp_len = sizeof(oid_acpi_temp);
+ if (gk_sysctlnametomib(mib_name, oid_acpi_temp,
+ &oid_acpi_temp_len) < 0)
+ break;
+ interface = INTERFACE_CORETEMP;
+ if (!gkrellm_sys_sensors_get_temperature(mib_name, 0, 0,
+ interface, NULL))
+ continue;
+ snprintf(label, sizeof(label), "cpu%d", id);
+ gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, NULL,
+ mib_name, 0, 0,
+ interface, 1.0, 0.0, NULL, label);
+ }
+
if (freebsd_sensor_list)
{
@@ -1504,13 +1543,7 @@ sensors_add_sensor(gint type, gchar *id_
sensor->factor = factor;
sensor->offset = offset;
sensor->default_label = default_label ? g_strdup(default_label) : NULL;
- if (g_list_append(freebsd_sensor_list, sensor) == NULL) {
- g_free(sensor->id_name);
- if (sensor->default_label)
- g_free(sensor->default_label);
- g_free(sensor);
- return FALSE;
- }
+ freebsd_sensor_list = g_list_append(freebsd_sensor_list, sensor);
return TRUE;
}