diff --git a/Changelog b/Changelog index 177066f..e066a0c 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,28 @@ GKrellM Changelog ----------------- +2.3.2 - Not released +------------------------ + * Add OpenSSL license exception (TODO). + Make OpenSSL the default to avoid gnutls symbol conflict crash. + * Patch from Takao Fujiwara: Pass clock/calendar strings to strftime in + current locale. Bump default width up to 100. + * Patch from Leo Schwab: add linux sysfs battery interface. Use + preferencially over deprecated /proc/acpi interface. + * Patch from Lycestra: + - Mac OS X support: + "darwin9" build mode for Leopard, which lacks libkvm + add inet monitor interface + add buffers and cache data to memory monitor + - don't client connect to server in the case read_server_setup() fails + * Bugfixes + o Allow spaces in file system monitor directories. + o Andrey Rahmatullin and Ravi Pinjal both sent a patch to fix: + some memleaks in clock monitor. + o Ken Milmore patch: fix configure script to work for lm_sensors >= 3.1 + o NULL serve_name segfault + * Translation updates + o pl.po from Michal Smoczyk + 2.3.1 - Sun Dec 2, 2007 ------------------------ * Clock/Calendar monitor rewritten to use user configurable display diff --git a/Changelog-plugins.html b/Changelog-plugins.html index 7996167..44efaf6 100644 --- a/Changelog-plugins.html +++ b/Changelog-plugins.html @@ -5,7 +5,7 @@

Changelog for GKrellM Plugins


-

Changes for version 2.3.1

+

Changes for versions 2.3.1 - 2.3.2

none

Changes for version 2.3.0

diff --git a/Changelog-themes.html b/Changelog-themes.html index e2bbc8a..4aa8d69 100644 --- a/Changelog-themes.html +++ b/Changelog-themes.html @@ -10,7 +10,7 @@
 
-Changes in 2.2.3 - 2.3.1
+Changes in 2.2.3 - 2.3.2
 ------------------------
 None
 
diff --git a/Makefile b/Makefile
index dd8a83c..b60fff1 100644
--- a/Makefile
+++ b/Makefile
@@ -87,7 +87,7 @@ BINMODE = 755
 #GTOP_LIBS_D = -L$(GTOP_PREFIX)/lib -lgtop -lgtop_common -lgtop_sysdeps
 #export GTOP_INCLUDE GTOP_LIBS GTOP_LIBS_D
 
-VERSION = 2.3.0
+VERSION = 2.3.2
 
 INSTALLROOT ?= $(DESTDIR)$(PREFIX)
 
@@ -161,7 +161,7 @@ install_gkrellm.pc:
 	$(INSTALL) -d $(PKGCONFIGDIR)
 	$(INSTALL) -m $(INCLUDEMODE) -c gkrellm.pc $(PKGCONFIGDIR)
 
-install_darwin install_macosx: install_gkrellm.pc
+install_darwin install_darwin9 install_macosx: install_gkrellm.pc
 	(cd po && ${MAKE} install)
 	(cd src && ${MAKE} install STRIP="")
 	(cd server && ${MAKE} install STRIP="")
@@ -227,6 +227,17 @@ darwin: gkrellm.pc
 		LINK_FLAGS="-prebind -Wl,-bind_at_load -framework CoreFoundation" \
 		gkrellmd )
 
+darwin9: gkrellm.pc
+	(cd po && ${MAKE} all)
+	(cd src && ${MAKE} GTK_CONFIG=gtk-config STRIP= HAVE_GETADDRINFO=1 \
+		EXTRAOBJS= SYS_LIBS="-framework IOKit" \
+		LINK_FLAGS="-prebind -Wl,-bind_at_load -framework CoreFoundation -lX11" \
+		gkrellm )
+	(cd server && ${MAKE} GTK_CONFIG=gtk-config STRIP= HAVE_GETADDRINFO=1 \
+		EXTRAOBJS= SYS_LIBS="-framework IOKit" \
+		LINK_FLAGS="-prebind -Wl,-bind_at_load -framework CoreFoundation" \
+		gkrellmd )
+
 macosx: gkrellm.pc
 	(cd po && ${MAKE} all)
 	(cd src && ${MAKE} macosx)
diff --git a/gkrellm.spec b/gkrellm.spec
index c69c490..e997270 100644
--- a/gkrellm.spec
+++ b/gkrellm.spec
@@ -1,5 +1,5 @@
 %define name gkrellm
-%define version 2.3.1
+%define version 2.3.2
 %define release 1
 %define prefix /usr
 
diff --git a/server/Makefile b/server/Makefile
index d58206a..caf2bca 100644
--- a/server/Makefile
+++ b/server/Makefile
@@ -136,6 +136,11 @@ darwin:
 		EXTRAOBJS= SYS_LIBS="-lkvm -lmd5" \
 		LINK_FLAGS="-flat_namespace -undefined warning" gkrellmd
 
+darwin9: 
+	$(MAKE) GTK_CONFIG=gtk-config STRIP= \
+		EXTRAOBJS= SYS_LIBS="-lmd5" \
+		LINK_FLAGS="-flat_namespace -undefined warning" gkrellmd
+
 macosx: 
 	$(MAKE) STRIP= HAVE_GETADDRINFO=1 \
 		EXTRAOBJS= SYS_LIBS="-lkvm" \
@@ -192,7 +197,7 @@ uninstall:
 	rm -f $(SINSTALLDIR)/$(PACKAGE_D)
 	rm -f $(SMANDIR)/$(PACKAGE_D).1
 
-install_darwin install_macosx:
+install_darwin install_darwin9 install_macosx:
 	$(MAKE) install STRIP=
 
 install_freebsd:
diff --git a/server/gkrellmd.h b/server/gkrellmd.h
index e52242a..9ae59ed 100644
--- a/server/gkrellmd.h
+++ b/server/gkrellmd.h
@@ -95,7 +95,7 @@
 */
 #define GKRELLMD_VERSION_MAJOR   2
 #define GKRELLMD_VERSION_MINOR   3
-#define GKRELLMD_VERSION_REV     1
+#define GKRELLMD_VERSION_REV     2
 #define GKRELLMD_EXTRAVERSION    ""
 
 #define GKRELLMD_CHECK_VERSION(major,minor,rev)    \
diff --git a/server/monitor.c b/server/monitor.c
index f396d52..2e7162d 100644
--- a/server/monitor.c
+++ b/server/monitor.c
@@ -965,7 +965,7 @@ gkrellm_net_routed_event(gchar *name, gboolean routed)
 void
 gkrellm_net_add_timer_type_ppp(gchar *name)
 	{
-	if (!_GK.net_timer)
+	if (!_GK.net_timer || !name)
 		return;
 	if (name && !strncmp(_GK.net_timer, name, strlen(name) - 1))
 		net_timer_type = TIMER_TYPE_PPP;
@@ -974,7 +974,7 @@ gkrellm_net_add_timer_type_ppp(gchar *name)
 void
 gkrellm_net_add_timer_type_ippp(gchar *name)
 	{
-	if (!_GK.net_timer)
+	if (!_GK.net_timer || !name)
 		return;
 	if (name && !strncmp(_GK.net_timer, name, strlen(name) - 1))
 		net_timer_type = TIMER_TYPE_IPPP;
@@ -2328,6 +2328,8 @@ gkrellmd_client_read(gint fd, gint nbytes)
 				{
 				mon = (GkrellmdMonitor *) list->data;
 				mp = mon->privat;
+				if (!mp->serve_name)
+					continue;
 				n = strlen(mp->serve_name);
 				e = s + n;
 				if (*e == '>' && !strncmp(mp->serve_name, s, n))
diff --git a/src/Makefile b/src/Makefile
index ae36df2..034a764 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -152,9 +152,20 @@ else
 		gkrellm
 endif
 
+darwin9: 
+ifeq ($(HAVE_SSL),1)
+	$(MAKE) GTK_CONFIG=gtk-config STRIP= \
+		EXTRAOBJS= SYS_LIBS="" \
+		gkrellm
+else
+	$(MAKE) GTK_CONFIG=gtk-config STRIP= \
+		EXTRAOBJS= SYS_LIBS="-lmd5" \
+		gkrellm
+endif
+
 macosx: 
 	$(MAKE) STRIP= HAVE_GETADDRINFO=1 \
-		EXTRAOBJS="winops-gtk-mac.o sysdeps-unix.o" \
+		EXTRAOBJS="winops-gtk-mac.o" \
 		LINK_FLAGS="-Wl,-bind_at_load -framework CoreFoundation" \
 		SYS_LIBS="-lkvm -framework IOKit" \
 		SMC_LIBS="" \
@@ -207,7 +218,7 @@ uninstall:
 	$(RM) $(MANDIR)/$(PACKAGE).1
 	$(RM) $(LIBDIR)/libgkrellm.a
 
-install_darwin install_macosx:
+install_darwin install_darwin9 install_macosx:
 	$(MAKE) install STRIP=
 
 install_freebsd:
diff --git a/src/client.c b/src/client.c
index ebe174c..af262ac 100644
--- a/src/client.c
+++ b/src/client.c
@@ -1481,6 +1481,8 @@ client_plugin_func(gchar *line)
 	for (list = client_plugin_serve_data_list; list; list = list->next)
 		{
 		plug = (ClientPlugin *) list->data;
+		if (!plug->key_name)
+			continue;
 		n = strlen(plug->key_name);
 		s = line + n;
 		if (*s == '>' && !strncmp(plug->key_name, line, n))
@@ -1539,7 +1541,7 @@ client_send_to_server(gchar *buf)
 	{
 	gint	n;
 
-	if (!server_alive || client_fd < 0)
+	if (!server_alive || client_fd < 0 || !buf)
 		return FALSE;
 #if defined(MSG_NOSIGNAL)
 	n = send(client_fd, buf, strlen(buf), MSG_NOSIGNAL);
@@ -1681,7 +1683,7 @@ process_server_line(KeyTable *table, gint table_size, gchar *line)
   /* Read setup info from gkrellmd server.  Stuff needed before the
   |  client_init calls must be read here.
   */
-static void
+static gboolean
 read_server_setup(gint fd)
 	{
 	gchar			buf[256];
@@ -1696,9 +1698,13 @@ read_server_setup(gint fd)
 
 	gkrellm_free_glist_and_data(&client_plugin_setup_line_list);
 
+    gint rs;
+    
 	while (1)
 		{
-		getline(fd, buf, sizeof(buf));
+		rs=getline(fd, buf, sizeof(buf));
+        if(rs<0)
+            return FALSE;
 		if (!strcmp(buf, ""))
 			break;
 		process_server_line(&setup_table[0], table_size, buf);
@@ -1714,12 +1720,15 @@ read_server_setup(gint fd)
 	table_size = sizeof(update_table) / sizeof(KeyTable);
 	while (1)
 		{
-		getline(fd, buf, sizeof(buf));
+		rs=getline(fd, buf, sizeof(buf));
+        if(rs<0)
+            return FALSE;
 		if (!strcmp(buf, ""))
 			break;
 		process_server_line(&update_table[0], table_size, buf);
 		}
 	setup_done = TRUE;
+    return TRUE;
 	}
 
 void
@@ -1870,7 +1879,10 @@ gkrellm_client_mode_connect(void)
 
 	/* Initial setup lines from server are read in blocking mode.
 	*/
-	read_server_setup(client_fd);
+	if(!read_server_setup(client_fd)){
+        close(client_fd);
+        return FALSE;
+    }
 
 	/* Extra stuff not handled in read_server_setup()
 	*/
diff --git a/src/clock.c b/src/clock.c
index 4f12d2b..9d6789a 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -144,6 +144,7 @@ get_color_name(GdkColor *color, gchar **color_string)
 			(color->green >> 8) & 0xff,
 			(color->blue >> 8) & 0xff );
 	gkrellm_dup_string(color_string, cstring);
+	g_free(cstring);
 	}
 
 static void
@@ -192,6 +193,7 @@ static gchar *
 strftime_format(gchar *format, gchar *alt_color)
 	{
 	struct tm	*t;
+	gchar		*locale_format = NULL;
 	gchar		buf1[512], buf2[512];
 
 	if (_GK.client_mode)
@@ -199,12 +201,14 @@ strftime_format(gchar *format, gchar *alt_color)
 	else
 		t = &gkrellm_current_tm;
 
-	strftime(buf1, sizeof(buf1), format, t);
+	locale_format = g_locale_from_utf8 (format, -1, NULL, NULL, NULL);
+	strftime(buf1, sizeof(buf1), locale_format, t);
+	g_free (locale_format);
 	format_alt_color(buf1, buf2, sizeof(buf2), alt_color);
 
 // printf("%s\n", buf2);
 
-	return g_strdup(buf2);
+	return g_locale_to_utf8 (buf2, -1, NULL, NULL, NULL);
 	}
 
 static gint
diff --git a/src/config.c b/src/config.c
index 098d58b..ea432cd 100644
--- a/src/config.c
+++ b/src/config.c
@@ -2291,7 +2291,7 @@ gkrellm_load_user_config(GkrellmMonitor *mon_only, gboolean monitor_values)
 		_GK.enable_hostname = TRUE;
 		_GK.hostname_short = FALSE;
 		_GK.enable_system_name = FALSE;
-		_GK.chart_width = 60;
+		_GK.chart_width = 100;
 		_GK.update_HZ = 10;
 		_GK.theme_scale = 100;
 		_GK.float_factor = 1.0;
diff --git a/src/configure b/src/configure
index 6488578..cf08c55 100755
--- a/src/configure
+++ b/src/configure
@@ -34,6 +34,46 @@ exec 5>./configure.log
 
 rm -f test test.exe test.o test.c
 
+
+
+if [ "$without_ssl" != "yes" ]
+then
+# echo "Checking for ssl... " 1>& 2
+echo "Checking for ssl... " 1>& 5
+
+cat << EOF > test.c
+#include 
+
+int main()
+	{
+	SSL_METHOD	*ssl_method  = NULL;
+
+	SSLeay_add_ssl_algorithms();
+	SSL_load_error_strings();
+	if ((ssl_method = SSLv23_client_method()) == NULL)
+		return 1;
+	return 0;
+	}
+EOF
+
+$CC ${CFLAGS} ${PKG_INCLUDE} -c test.c -o test.o 2>& 5
+$CC test.o -o test ${LINK_FLAGS} ${PKG_LIBS} -lssl -lcrypto 2>& 5
+
+if [ -x ./test ] && ./test
+then
+#	echo 'Defining HAVE_SSL' 1>& 2
+	echo 'Defining HAVE_SSL' 1>& 5
+	echo '#define HAVE_SSL 1' >> configure.h
+	without_gnutls=yes
+else
+#	echo "Not found, mail check will not have ssl support..." 1>& 2
+	echo "Not found, mail check will not have ssl support..." 1>& 5
+fi
+fi
+# end of ssl check
+
+rm -f test test.exe test.o test.c
+
 if [ "$without_gnutls" != "yes" ]
 then
 # echo "Checking for gnutls... " 1>& 2
@@ -71,7 +111,6 @@ then
 	echo 'Defining HAVE_GNUTLS' 1>& 5
 	echo '#define HAVE_GNUTLS 1' >> configure.h
 	echo '#define HAVE_SSL 1' >> configure.h
-	without_ssl=yes
 else
 #	echo "Not found, mail check will not have gnutls support..." 1>& 2
 	echo "Not found, mail check will not have gnutls support..." 1>& 5
@@ -79,44 +118,6 @@ fi
 fi
 # end of gnutls check
 
-rm -f test test.exe test.o test.c
-
-
-if [ "$without_ssl" != "yes" ]
-then
-# echo "Checking for ssl... " 1>& 2
-echo "Checking for ssl... " 1>& 5
-
-cat << EOF > test.c
-#include 
-
-int main()
-	{
-	SSL_METHOD	*ssl_method  = NULL;
-
-	SSLeay_add_ssl_algorithms();
-	SSL_load_error_strings();
-	if ((ssl_method = SSLv23_client_method()) == NULL)
-		return 1;
-	return 0;
-	}
-EOF
-
-$CC ${CFLAGS} ${PKG_INCLUDE} -c test.c -o test.o 2>& 5
-$CC test.o -o test ${LINK_FLAGS} ${PKG_LIBS} -lssl -lcrypto 2>& 5
-
-if [ -x ./test ] && ./test
-then
-#	echo 'Defining HAVE_SSL' 1>& 2
-	echo 'Defining HAVE_SSL' 1>& 5
-	echo '#define HAVE_SSL 1' >> configure.h
-else
-#	echo "Not found, mail check will not have ssl support..." 1>& 2
-	echo "Not found, mail check will not have ssl support..." 1>& 5
-fi
-fi
-# end of ssl check
-
 
 rm -f test test.exe test.o test.c
 
@@ -130,6 +131,7 @@ cat << EOF > test.c
 
 int main()
 	{
+#if SENSORS_API_VERSION < 0x400 /* libsensors 3 code */
 	FILE	*f;
 
 	f = fopen("/etc/sensors.conf", "r");
@@ -139,6 +141,11 @@ int main()
 		return 1;
 	fclose(f);
 	return 0;
+#else /* libsensors 4 code */
+	if (sensors_init(NULL) != 0)
+		return 1;
+	return 0;
+#endif
 	}
 EOF
 
diff --git a/src/disk.c b/src/disk.c
index 6b5b186..eb69398 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -1354,13 +1354,11 @@ create_disk_tab(GtkWidget *tab_vbox)
 	gtk_box_pack_start(GTK_BOX(tab_vbox), tabs, TRUE, TRUE, 0);
 
 /* -- Options tab */
-	vbox = gkrellm_gtk_notebook_page(tabs, _("Options"));
+	vbox = gkrellm_gtk_framed_notebook_page(tabs, _("Options"));
 
 	scrolled = gtk_scrolled_window_new(NULL, NULL);
 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
 				GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled),
-			GTK_SHADOW_IN);
 	gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
 
 	model = create_model();
@@ -1428,6 +1426,8 @@ create_disk_tab(GtkWidget *tab_vbox)
 				4, 0, TRUE);
 	launch_vbox = gkrellm_gtk_scrolled_vbox(vbox, NULL,
 						GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_widget_show(launch_vbox);
+	gtk_widget_realize(launch_vbox);
 	for (i = 0, list = disk_mon_list; list; list = list->next, ++i)
 		{
 		disk = (DiskMon *) list->data;
diff --git a/src/fs.c b/src/fs.c
index 75ceef2..1d2a42e 100644
--- a/src/fs.c
+++ b/src/fs.c
@@ -599,7 +599,7 @@ mount_command(FSmon *fs)
 	if (fs->is_mounted)
 		{
 		if (fs->fstab_mounting)
-			snprintf(cmd, sizeof(cmd), "umount %s", fs->mount.directory);
+			snprintf(cmd, sizeof(cmd), "umount '%s'", fs->mount.directory);
 		else
 			snprintf(cmd, sizeof(cmd), "%s", fs->launch_umount.command);
 		fs->label_is_data = FALSE;
@@ -613,7 +613,7 @@ mount_command(FSmon *fs)
 		if (fs->ejectable)
 			close_tray(fs);
 		if (fs->fstab_mounting)
-			snprintf(cmd, sizeof(cmd), "mount %s", fs->mount.directory);
+			snprintf(cmd, sizeof(cmd), "mount '%s'", fs->mount.directory);
 		else
 			snprintf(cmd, sizeof(cmd), "%s", fs->launch_mount.command);
 		fs->blocks = fs->bfree = fs->bavail = fs->bsize = 0;
@@ -1299,14 +1299,15 @@ fs_config_save(FILE *f)
 	{
 	GList	*list;
 	FSmon	*fs;
-	gchar	quoted_label[64];
+	gchar	quoted_label[64], quoted_dir[512];
 
 	for (list = fs_mon_list; list; list = list->next)
 		{
 		fs = (FSmon *) list->data;
 		snprintf(quoted_label, sizeof(quoted_label), "\"%s\"", fs->label);
+		snprintf(quoted_dir, sizeof(quoted_dir), "\"%s\"",fs->mount.directory);
 		fprintf(f, "%s %s %s %d %d %d %d %d\n", FS_CONFIG_KEYWORD,
-				quoted_label, fs->mount.directory,
+				quoted_label, quoted_dir,
 				fs->fstab_mounting, fs->secondary,
 				fs->show_if_mounted, fs->label_is_data, fs->ejectable);
 		if (*(fs->launch_mount.command))
@@ -1387,8 +1388,8 @@ fs_config_load(gchar *arg)
 	{
 	static FSmon	*fs_prev;
 	FSmon			*fs;
-	gchar			*label;
-	gchar			config[32], item[CFG_BUFSIZE], dir[CFG_BUFSIZE];
+	gchar			*cut_label, *cut_dir;
+	gchar			config[32], item[CFG_BUFSIZE];
 	gchar			name[64], item1[CFG_BUFSIZE];
 	gint 			n;
 
@@ -1435,13 +1436,14 @@ fs_config_load(gchar *arg)
 		}
 	else
 		{
-		if ((label = gkrellm_cut_quoted_string(arg, &arg)) != NULL)
+		if (   (cut_label = gkrellm_cut_quoted_string(arg, &arg)) != NULL
+			&& (cut_dir = gkrellm_cut_quoted_string(arg, &arg)) != NULL
+	       )
 			{
 			fs = g_new0(FSmon, 1);
-			gkrellm_locale_dup_string(&fs->label, label, &fs->label_shadow);
-			dir[0] = '\0';
+			gkrellm_locale_dup_string(&fs->label, cut_label,&fs->label_shadow);
 
-			sscanf(arg, "%s %d %d %d %d %d",  dir, &fs->fstab_mounting,
+			sscanf(arg, "%d %d %d %d %d", &fs->fstab_mounting,
 					&fs->secondary, &fs->show_if_mounted,
 					&fs->label_is_data, &fs->ejectable);
 			if (fs->fstab_mounting > 1)		/* pre 2.0.0 config fix */
@@ -1452,7 +1454,7 @@ fs_config_load(gchar *arg)
 				fs->fstab_mounting = fs->show_if_mounted = FALSE;
 			if (fs->secondary)
 				have_secondary_panels = TRUE;
-			fs->mount.directory = g_strdup(dir);
+			fs->mount.directory = g_strdup(cut_dir);
 			fs->restore_label = fs->label_is_data;
 
 			fix_fstab_mountable_changed(fs);
diff --git a/src/gkrellm.h b/src/gkrellm.h
index 40210aa..cd4e475 100644
--- a/src/gkrellm.h
+++ b/src/gkrellm.h
@@ -95,7 +95,7 @@
 */
 #define	GKRELLM_VERSION_MAJOR	2
 #define	GKRELLM_VERSION_MINOR	3
-#define	GKRELLM_VERSION_REV		1
+#define	GKRELLM_VERSION_REV		2
 #define	GKRELLM_EXTRAVERSION	""
 
 #define GKRELLM_CHECK_VERSION(major,minor,rev)    \
diff --git a/src/inet.c b/src/inet.c
index 6bf8ebf..7d510ed 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -2027,6 +2027,8 @@ create_inet_tab(GtkWidget *tab_vbox)
 				4, 0, TRUE);
 	launch_vbox = gkrellm_gtk_scrolled_vbox(vbox1, NULL,
 				GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_widget_show(launch_vbox);
+	gtk_widget_realize(launch_vbox);
 	for (i = 0, list = inet_mon_list; list; list = list->next, ++i)
 		{
 		in = (InetMon *) list->data;
diff --git a/src/main.c b/src/main.c
index 4caea5a..d0a9b73 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2036,8 +2036,6 @@ main(gint argc, gchar **argv)
 	gint		i;
 	gchar		*s;
 
-	//gkrellm_sys_main_init();
-
 #ifdef ENABLE_NLS
 	gtk_set_locale();
 #endif
diff --git a/src/sysdeps/darwin.c b/src/sysdeps/darwin.c
index dbbc956..a1cbc42 100644
--- a/src/sysdeps/darwin.c
+++ b/src/sysdeps/darwin.c
@@ -21,19 +21,23 @@
 |  along with this program. If not, see http://www.gnu.org/licenses/
 */
 
+#ifdef HAVE_KVM_H
 #include 
+#endif
 
 #include 
 #include 
 #include 
 
+#ifdef HAVE_KVM_H
 kvm_t	*kvmd = NULL;
 char	errbuf[_POSIX2_LINE_MAX];
-
+#endif
 
 void
 gkrellm_sys_main_init(void)
 	{
+#ifdef HAVE_KVM_H
 	/* We just ignore error, here.  Even if GKrellM doesn't have
 	|  kmem privilege, it runs with available information.
 	*/
@@ -43,6 +47,7 @@ gkrellm_sys_main_init(void)
 		fprintf(stderr, "Can't drop setgid privileges.");
 		exit(1);
 		}
+#endif
 	}
 
 void
@@ -53,7 +58,7 @@ gkrellm_sys_main_cleanup(void)
 /* ===================================================================== */
 /* CPU monitor interface */
 
-static gint		n_cpus;
+static guint		n_cpus;
 
 void
 gkrellm_sys_cpu_read_data(void)
@@ -107,7 +112,9 @@ gkrellm_sys_cpu_init(void)
 #include 
 #define	PID_MAX		30000
 
+#ifdef HAVE_KVM_H
 #include 
+#endif
 #include 
 #include 
 #include 
@@ -154,13 +161,14 @@ gkrellm_sys_proc_read_data(void)
 	u_int		n_vforks, n_rforks;
 	gint		r_forks, r_vforks, r_rforks;
 	size_t		len;
+#ifdef HAVE_KVM_H
 	gint		nextpid, nforked;
 	static struct nlist nl[] = {
 #define N_NEXTPID	0
 		{ "_nextpid" },
 		{ "" }
 	};
-
+#endif
 
 	if (getloadavg(&avenrun, 1) <= 0)
 		avenrun = 0;
@@ -181,6 +189,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;
 		}
+#ifdef HAVE_KVM_H
 	else
 		{
 		/* workaround: Can I get total number of processes? */
@@ -203,7 +212,8 @@ gkrellm_sys_proc_read_data(void)
 				}
 			}
 		}
-
+#endif
+        
 	if (sysctl(oid_proc, 3, NULL, &len, NULL, 0) >= 0)
 		n_processes = len / sizeof(struct kinfo_proc);
 
@@ -395,19 +405,117 @@ gkrellm_sys_disk_init(void)
 }
 
 
-/* ===================================================================== */
-/* Inet monitor interface - not implemented */
+#include "../inet.h"
 
-void
-gkrellm_sys_inet_read_tcp_data(void)
-	{
-	}
+#include 
+#include 
+#include 
+#include 
+#ifdef INET6
+#include 
+#endif /* INET6 */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#define TCPSTATES
+#include 
+#include 
+#include 
+#include 
+#include 
 
-gboolean
-gkrellm_sys_inet_init(void)
-	{
-	return FALSE;
+#define warn(x...) fprintf(stderr,x)
+ 
+ void
+ gkrellm_sys_inet_read_tcp_data(void)
+{
+	ActiveTCP	tcp;
+    const char *mibvar="net.inet.tcp.pcblist";
+	char *buf;
+	struct tcpcb *tp = NULL;
+	struct inpcb *inp;
+	struct xinpgen *xig, *oxig;
+	struct xsocket *so;
+	size_t len=0;
+	if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
+		if (errno != ENOENT)
+			warn("sysctl: %s", mibvar);
+		return;
+	}        
+	if ((buf = malloc(len)) == 0) {
+		warn("malloc %lu bytes", (u_long)len);
+		return;
+ 	}
+	if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) {
+		warn("sysctl: %s", mibvar);
+		free(buf);
+		return;
 	}
+     /*
+         * Bail-out to avoid logic error in the loop below when
+         * there is in fact no more control block to process
+         */
+        if (len <= sizeof(struct xinpgen)) {
+            free(buf);
+            return;
+        }
+ 	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)) {
+    	tp = &((struct xtcpcb *)xig)->xt_tp;
+	   	inp = &((struct xtcpcb *)xig)->xt_inp;
+		so = &((struct xtcpcb *)xig)->xt_socket;
+    if (so->xso_protocol != IPPROTO_TCP)
+ 			continue;
+		/* Ignore PCBs which were freed during copyout. */
+		if (inp->inp_gencnt > oxig->xig_gen)
+			continue;
+	if ((inp->inp_vflag & INP_IPV4) == 0
+#ifdef INET6
+		    && (inp->inp_vflag & INP_IPV6) == 0
+#endif /* INET6 */
+			)
+			continue;
+                /*
+                 * Local address is not an indication of listening socket or
+                 * server sockey but just rather the socket has been bound.
+                 * That why many UDP sockets were not displayed in the original code.
+                 */
+                if (tp->t_state <= TCPS_LISTEN){
+                    continue;
+                    }
+			if (inp->inp_vflag & INP_IPV4) {
+			     tcp.local_port=ntohs(inp->inp_lport);
+			     tcp.remote_addr.s_addr=(uint32_t)inp->inp_faddr.s_addr;
+			     tcp.remote_port=ntohs(inp->inp_fport);
+			     tcp.family=AF_INET;
+			     gkrellm_inet_log_tcp_port_data(&tcp);
+            }
+#ifdef INET6
+			else if (inp->inp_vflag & INP_IPV6) {
+			     tcp.local_port=ntohs(inp->inp_lport);
+    			 memcpy(&(tcp.remote_addr6),&(inp->in6p_faddr),sizeof(struct in6_addr));
+			     tcp.remote_port=ntohs(inp->inp_fport);
+			     tcp.family=AF_INET6;
+			     gkrellm_inet_log_tcp_port_data(&tcp);
+			} /* else nothing printed now */
+#endif /* INET6 */
+}  
+free(buf);
+}
+ 
+ gboolean
+ gkrellm_sys_inet_init(void)
+ 	{
+	return TRUE;
+ 	}
+ 
 
 
 /* ===================================================================== */
@@ -453,12 +561,12 @@ gkrellm_sys_mem_read_data(void)
 			pshift++;
 	}
 	
-	used = (natural_t)(vm_info.active_count + vm_info.inactive_count + vm_info.wire_count) << pshift;
-	free = (natural_t)vm_info.free_count << pshift;	
-	total = (natural_t)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
+	used = (guint64)(vm_info.active_count) << pshift;
+	free = (guint64)vm_info.free_count << pshift;	
+	total = (guint64)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
 	/* Don't know how to get cached or buffers. */
-	buffers = 0;
-	cached = 0;
+	buffers =  (guint64) (vm_info.wire_count) << pshift;
+	cached = (guint64) (vm_info.inactive_count) << pshift;
 	/* shared  0 for now, shared is a PITA */
         shared = 0;	
 	gkrellm_mem_assign_data(total, used, free, shared, buffers, cached);
diff --git a/src/sysdeps/linux.c b/src/sysdeps/linux.c
index 2f1c290..87ac211 100644
--- a/src/sysdeps/linux.c
+++ b/src/sysdeps/linux.c
@@ -1363,13 +1363,18 @@ void
 gkrellm_sys_fs_get_mounts_list(void)
 	{
 	FILE		*f;
-	gchar		*s, buf[512], dev[256], dir[256], type[64];
+	gchar		*s, buf[1024], dev[512], dir[512], type[128];
 
 	if ((f = fopen(PROC_MOUNTS_FILE, "r")) == NULL)
 		return;
 	while (fgets(buf, sizeof(buf), f))
 		{
-		sscanf(buf, "%255s %255s %63s", dev, dir, type);
+		dev[0] = dir[0] = type[0] = '\0';
+		sscanf(buf, "%512s %512s %127s", dev, dir, type);
+		fix_fstab_name(dev);
+		fix_fstab_name(dir);
+		fix_fstab_name(type);
+
 		if (   !strcmp(type, "devpts")
 			|| !strcmp(type, "proc")
 			|| !strcmp(type, "usbdevfs")
@@ -1429,8 +1434,8 @@ gkrellm_sys_fs_init(void)
 	n = system("eject -d > /dev/null 2>&1");
 	if (WEXITSTATUS(n) == 0)
 		{
-		eject_command = "eject %s";
-		close_command = "eject -t %s";
+		eject_command = "eject '%s'";
+		close_command = "eject -t '%s'";
 		}
 #endif
 	gkrellm_fs_setup_eject(eject_command, close_command,
@@ -1441,12 +1446,13 @@ gkrellm_sys_fs_init(void)
 /* ===================================================================== */
 /* Battery monitor interface	*/
 
-/* ---------------------------- */
-/* ACPI battery interface		*/
+/* ---------------------- */
+/* ACPI battery interface */
 
 #define	ACPI_BATTERY_DIR			"/proc/acpi/battery/"
 #define	ACPI_AC_ADAPTOR_DIR			"/proc/acpi/ac_adapter/"
 
+
 typedef struct
 	{
 	gint		id;
@@ -1557,6 +1563,7 @@ acpi_setup(void)
 		}
 	}
 
+
 static gboolean
 fgets_lower_case(gchar *buf, gint len, FILE *f)
 	{
@@ -1727,6 +1734,328 @@ acpi_battery_data(BatteryFile *bf)
 	return TRUE;
 	}
 
+
+/* ---------------------------- */
+/* sysfs power interface		*/
+#define	SYSFS_POWER_SUPPLIES		"/sys/class/power_supply/"
+#define	SYSFS_TYPE_BATTERY			"battery"
+#define	SYSFS_TYPE_AC_ADAPTER		"mains"
+
+
+typedef struct syspower
+	{
+	gint		type;
+	gint		id;
+	gint		charge_units;
+	gchar const	*sysdir;
+	gchar const	*sys_charge_full;
+	gchar const	*sys_charge_now;
+	gboolean	present;
+	gboolean	ac_present;
+	gboolean	charging;
+	}
+	syspower;
+#define	PWRTYPE_BATTERY		0
+#define	PWRTYPE_UPS			1
+#define	PWRTYPE_MAINS		2
+#define	PWRTYPE_USB			3
+
+#define	CHGUNITS_INVALID	0
+#define	CHGUNITS_PERCENT	1	/*  'capacity'  */
+#define	CHGUNITS_uWH		2	/*  'energy'	*/
+#define	CHGUNITS_uAH		3	/*  'charge'	*/
+
+/*
+ * Ordering in this list is significant:  Mains power sources appear before
+ * battery sources.
+ */
+static GList	*g_sysfs_power_list;
+static gint		g_on_line;
+static gint		g_pwr_id;
+
+
+static gboolean
+read_sysfs_entry (gchar *buf, gint buflen, gchar const *sysentry)
+	{
+	FILE *f;
+
+	if ((f = fopen (sysentry, "r")))
+		{
+		if (fgets (buf, buflen, f))
+			{
+			gchar *nl;
+
+			/*  Squash trailing newline if present.  */
+			nl = buf + strlen (buf) - 1;
+			if (*nl == '\n')
+				*nl = '\0';
+			fclose (f);
+			return TRUE;
+			}
+		fclose (f);
+		}
+	return FALSE;
+	}
+
+static gboolean
+sysfs_power_data (struct syspower *sp)
+	{
+	uint64_t	charge_full, charge_now;
+	gint		time_left;
+	gint		present;
+	gint		percent;
+	gchar		sysentry[128];
+	gchar		buf[128];
+	gchar		*syszap;
+	gboolean	charging;
+	gboolean	stat_full;
+
+	time_left = -1;
+	charge_full = charge_now = 0;
+	present = 0;
+	percent = 0;
+	charging = FALSE;
+
+	strcpy (sysentry, sp->sysdir);
+	syszap = sysentry + strlen (sysentry);
+
+	/*  What type of entry is this?  */
+	if (sp->type == PWRTYPE_MAINS)
+		{
+		/*  Get the 'on-line' status.  */
+		*syszap = '\0';
+		strcat (sysentry, "/online");
+		if (read_sysfs_entry (buf, sizeof (buf), sysentry))
+			g_on_line = strtol (buf, NULL, 0);
+		return TRUE;
+		}
+	
+	/*
+	 * The rest of this code doesn't know how to handle anything other than
+	 * a battery.
+	 */
+	if (sp->type != PWRTYPE_BATTERY)
+		return FALSE;
+
+	/*  Is the battery still there?  */
+	*syszap = '\0';
+	strcat (sysentry, "/present");
+	if (read_sysfs_entry (buf, sizeof (buf), sysentry))
+		present = strtol (buf, NULL, 0);
+
+	if (present)
+		{
+		if (read_sysfs_entry (buf, sizeof (buf), sp->sys_charge_full))
+			{
+			charge_full = strtoll (buf, NULL, 0);
+			}
+		if (read_sysfs_entry (buf, sizeof (buf), sp->sys_charge_now))
+			{
+			charge_now = strtoll (buf, NULL, 0);
+			}
+		if (sp->charge_units == CHGUNITS_PERCENT)
+			{
+			percent = charge_now;
+			}
+		else
+			{
+			percent = charge_now * 100 / charge_full;
+			}
+
+		/*  Get charging status.  */
+		*syszap = '\0';
+		strcat (sysentry, "/status");
+		if (read_sysfs_entry (buf, sizeof (buf), sysentry))
+			{
+			charging = !strcasecmp (buf, "charging");
+			stat_full = !strcasecmp (buf, "full");
+			}
+		}
+
+	gkrellm_battery_assign_data (sp->id, present, g_on_line, charging,
+	                             percent, time_left);
+	return TRUE;
+	}
+
+
+static gboolean
+setup_sysfs_ac_power (gchar const *sysdir)
+	{
+	syspower	*sp;
+
+	if (_GK.debug_level & DEBUG_BATTERY)
+		printf ("setup_sysfs_ac_power: %s\n", sysdir);
+	sp = g_new0 (syspower, 1);
+	sp->type			= PWRTYPE_MAINS;
+	sp->id				= g_pwr_id++;
+	sp->charge_units	= CHGUNITS_INVALID;
+	sp->sysdir			= g_strdup (sysdir);
+	sp->sys_charge_full	=
+	sp->sys_charge_now	= NULL;
+
+	/*  Add mains power sources to head of list.  */
+	g_sysfs_power_list = g_list_prepend (g_sysfs_power_list, sp);
+
+	return TRUE;
+	}
+
+static gboolean
+setup_sysfs_battery (gchar const *sysdir)
+	{
+	syspower	*sp;
+	gchar		*sys_charge_full = NULL,
+				*sys_charge_now = NULL;
+	gint		units;
+	gboolean	retval = FALSE;
+
+	/*
+	 * There are three flavors of reporting:  'energy', 'charge', and
+	 * 'capacity'.  Check for them in that order.  (Apologies for the
+	 * ugliness; you try coding an unrolled 'if ((A || B) && C)' and make it
+	 * pretty.)
+	 */
+	if (_GK.debug_level & DEBUG_BATTERY)
+		printf ("setup_sysfs_battery: %s\n", sysdir);
+	units = CHGUNITS_uWH;
+	sys_charge_full = g_strconcat (sysdir, "/energy_full", NULL);
+	if (access (sys_charge_full, F_OK | R_OK))
+		{
+		g_free (sys_charge_full);
+		sys_charge_full = g_strconcat (sysdir, "/energy_full_design", NULL);
+		if (access (sys_charge_full, F_OK | R_OK))
+			{
+			goto try_charge;	/*  Look down  */
+			}
+		}
+	sys_charge_now = g_strconcat (sysdir, "/energy_now", NULL);
+	if (!access (sys_charge_now, F_OK | R_OK))
+		goto done;	/*  Look down  */
+
+try_charge:
+	if (sys_charge_full)	g_free (sys_charge_full), sys_charge_full = NULL;
+	if (sys_charge_now)		g_free (sys_charge_now), sys_charge_now = NULL;
+
+	units = CHGUNITS_uAH;
+	sys_charge_full = g_strconcat (sysdir, "/charge_full", NULL);
+	if (access (sys_charge_full, F_OK | R_OK))
+		{
+		g_free (sys_charge_full);
+		sys_charge_full = g_strconcat (sysdir, "/charge_full_design", NULL);
+		if (access (sys_charge_full, F_OK | R_OK))
+			{
+			goto try_capacity;	/*  Look down  */
+			}
+		}
+	sys_charge_now = g_strconcat (sysdir, "/charge_now", NULL);
+	if (!access (sys_charge_now, F_OK | R_OK))
+		goto done;	/*  Look down  */
+
+try_capacity:
+	if (sys_charge_full)	g_free (sys_charge_full), sys_charge_full = NULL;
+	if (sys_charge_now)		g_free (sys_charge_now), sys_charge_now = NULL;
+
+	/*  This one's a little simpler...  */
+	units = CHGUNITS_PERCENT;
+	/*
+	 * FIXME: I have no idea if 'capacity_full' actually shows up, since
+	 * 'capacity' always defines "full" as always 100%
+	 */
+	sys_charge_full = g_strconcat (sysdir, "/capacity_full", NULL);
+	if (access (sys_charge_full, F_OK | R_OK))
+		goto ackphft;	/*  Look down  */
+
+	sys_charge_now = g_strconcat (sysdir, "/capacity_now", NULL);
+	if (access (sys_charge_now, F_OK | R_OK))
+		goto ackphft;	/*  Look down  */
+
+done:
+	sp = g_new0 (syspower, 1);
+	sp->type			= PWRTYPE_BATTERY;
+	sp->id				= g_pwr_id++;
+	sp->charge_units	= units;
+	sp->sysdir			= g_strdup (sysdir);
+	sp->sys_charge_full	= sys_charge_full;
+	sp->sys_charge_now	= sys_charge_now;
+
+	/*  Battery power sources are appended to the end of the list.  */
+	g_sysfs_power_list = g_list_append (g_sysfs_power_list, sp);
+	if (_GK.debug_level & DEBUG_BATTERY)
+		printf ("setup_sysfs_battery: %s, %s\n",
+		        sys_charge_full, sys_charge_now);
+	retval = TRUE;
+
+	if (0)
+		{
+ackphft:
+		if (sys_charge_full)	g_free (sys_charge_full);
+		if (sys_charge_now)		g_free (sys_charge_now);
+		}
+	return retval;
+	}
+
+static gboolean
+setup_sysfs_power_entry (gchar const *sysentry)
+	{
+	gchar		*sysdir;
+	gboolean	retval = FALSE;
+
+	sysdir = g_strconcat (SYSFS_POWER_SUPPLIES, sysentry, NULL);
+	if (!access (sysdir, F_OK | R_OK))
+		{
+		/*
+		 * Read the type of this power source, and setup the appropriate
+		 * entry for it.
+		 */
+		gchar *type;
+		gchar buf[64];
+
+		type = g_strconcat (sysdir, "/type", NULL);
+		if (_GK.debug_level & DEBUG_BATTERY)
+			printf ("setup_sysfs_power_entry: checking %s\n", type);
+		if (read_sysfs_entry (buf, sizeof (buf), type))
+			{
+			if (!strcasecmp (buf, SYSFS_TYPE_AC_ADAPTER))
+				retval = setup_sysfs_ac_power (sysdir);
+			else if (!strcasecmp (buf, SYSFS_TYPE_BATTERY))
+				retval = setup_sysfs_battery (sysdir);
+			else if (_GK.debug_level & DEBUG_BATTERY)
+				printf ("setup_sysfs_power_entry: unknown power type: %s\n",
+						buf);
+			}
+		g_free (type);
+		}
+	g_free (sysdir);
+
+	return retval;
+	}
+
+static gboolean
+sysfs_power_setup (void)
+	{
+	DIR				*d;
+	struct dirent	*de;
+	gboolean		retval = FALSE;
+
+	if (_GK.debug_level & DEBUG_BATTERY)
+		printf ("sysfs_power_setup() entry\n");
+	if ((d = opendir (SYSFS_POWER_SUPPLIES)) == NULL)
+		return retval;
+
+	while ((de = readdir (d)) != NULL)
+		{
+		if (    !strcmp (de->d_name, ".")
+		    ||  !strcmp (de->d_name, ".."))
+			{
+			continue;
+			}
+		retval |= setup_sysfs_power_entry (de->d_name);
+		}
+	closedir (d);
+
+	return retval;
+	}
+
+
 /* ---------------------------- */
 /* APM battery interface		*/
 
@@ -1871,9 +2200,16 @@ gkrellm_sys_battery_read_data(void)
 	{
 	GList	*list;
 
-	if (acpi_battery_list)
-		for (list = acpi_battery_list; list; list = list->next)
+	if (g_sysfs_power_list)
+		{
+		for (list = g_sysfs_power_list;  list;  list = list->next)
+			sysfs_power_data ((syspower *) (list->data));
+		}
+	else if (acpi_battery_list)
+		{
+		for (list = acpi_battery_list;  list;  list = list->next)
 			acpi_battery_data((BatteryFile *)(list->data));
+		}
 	else
 		apm_battery_data();
 	}
@@ -1881,7 +2217,9 @@ gkrellm_sys_battery_read_data(void)
 gboolean
 gkrellm_sys_battery_init()
 	{
-	acpi_setup();
+	/*  Prefer sysfs power data to /proc/acpi (which is deprecated).  */
+	if (!sysfs_power_setup ())
+		acpi_setup();
 	return TRUE;
 	}