diff libpurple/proxy.c @ 22420:316c8565f562

Improve our error handling of Gnome proxy settings. * If the proxy hostname is null then fallback to using Pidgin's proxy settings (and print a debug message). * If a subsequent call to gconftool-2 fails then make sure we free the stuff we've already read.
author Mark Doliner <mark@kingant.net>
date Wed, 05 Mar 2008 10:00:45 +0000
parents 31fb78b1184c
children 7ba68075beea
line wrap: on
line diff
--- a/libpurple/proxy.c	Wed Mar 05 09:43:31 2008 +0000
+++ b/libpurple/proxy.c	Wed Mar 05 10:00:45 2008 +0000
@@ -219,41 +219,66 @@
 
 	g_free(tmp);
 
-	/* See whether to use a proxy. */
-	if (!g_spawn_command_line_sync("gconftool-2 -g /system/proxy/mode", &tmp,
-				       NULL, NULL, NULL))
+	/* Check whether to use a proxy. */
+	if (!g_spawn_command_line_sync("gconftool-2 -g /system/proxy/mode",
+			&tmp, NULL, NULL, NULL))
 		return purple_global_proxy_get_info();
+
 	if (!strcmp(tmp, "none\n")) {
 		info.type = PURPLE_PROXY_NONE;
 		g_free(tmp);
 		return &info;
-	} else if (strcmp(tmp, "manual\n")) {
+	}
+
+	if (strcmp(tmp, "manual\n")) {
+		/* Unknown setting.  Fallback to using our global proxy settings. */
 		g_free(tmp);
 		return purple_global_proxy_get_info();
 	}
 
 	g_free(tmp);
+
+	/* If we get this far then we know we're using an HTTP proxy */
 	info.type = PURPLE_PROXY_HTTP;
 
-	/* Get the new ones */
-	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/host", &info.host,
-				       NULL, NULL, NULL))
+	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/host",
+			&info.host, NULL, NULL, NULL))
 		return purple_global_proxy_get_info();
 	g_strchomp(info.host);
+	if (*info.host == '\0')
+	{
+		purple_debug_info("proxy", "Gnome proxy settings are set to "
+				"'manual' but no proxy server is specified.  Using "
+				"Pidgin's proxy settings instead.\n");
+		g_free(info.host);
+		return purple_global_proxy_get_info();
+	}
 
-	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_user", &info.username,
-				       NULL, NULL, NULL))
+	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_user",
+			&info.username, NULL, NULL, NULL))
+	{
+		g_free(info.host);
 		return purple_global_proxy_get_info();
+	}
 	g_strchomp(info.username);
 
-	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_password", &info.password,
-				       NULL, NULL, NULL))
+	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_password",
+			&info.password, NULL, NULL, NULL))
+	{
+		g_free(info.host);
+		g_free(info.username);
 		return purple_global_proxy_get_info();
+	}
 	g_strchomp(info.password);
 
-	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/port", &tmp,
-				       NULL, NULL, NULL))
+	if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/port",
+			&tmp, NULL, NULL, NULL))
+	{
+		g_free(info.host);
+		g_free(info.username);
+		g_free(info.password);
 		return purple_global_proxy_get_info();
+	}
 	info.port = atoi(tmp);
 	g_free(tmp);