summaryrefslogtreecommitdiff
blob: b2911db71a9a1cc765d0ef1b8437a10cd828bda2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
--- NetworkManager_Patched/system-settings/plugins/ifnet/net_utils.c	2010-11-04 04:10:52.000000000 +0800
+++ NetworkManager-0.8.2/system-settings/plugins/ifnet/net_utils.c	2010-11-23 15:11:08.024000011 +0800
@@ -19,7 +19,6 @@
  * Copyright (C) 1999-2010 Gentoo Foundation, Inc.
  */
 
-#include <config.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -194,6 +193,32 @@
 	return error_quark;
 }
 
+static char *
+find_default_gateway_str (char *str)
+{
+	char *tmp;
+
+	if ((tmp = strstr (str, "default via ")) != NULL) {
+		return tmp + strlen ("default via ");
+	} else if ((tmp = strstr (str, "default gw ")) != NULL) {
+		return tmp + strlen ("default gw ");
+	}
+	return NULL;
+}
+
+static char *
+find_gateway_str (char *str)
+{
+	char *tmp;
+
+	if ((tmp = strstr (str, "via ")) != NULL) {
+		return tmp + strlen ("via ");
+	} else if ((tmp = strstr (str, "gw ")) != NULL) {
+		return tmp + strlen ("gw ");
+	}
+	return NULL;
+}
+
 gboolean
 reload_parsers ()
 {
@@ -362,11 +387,10 @@
 	if (!tmp)
 		return FALSE;
 	routes = g_strdup (tmp);
-	tmp = strstr (routes, "default via ");
+	tmp = find_default_gateway_str (routes);
 	if (!tmp) {
 		goto error;
 	}
-	tmp += strlen ("default via ");
 	g_strstrip (tmp);
 	if ((end = strstr (tmp, "\"")) != NULL)
 		*end = '\0';
@@ -483,8 +507,13 @@
 
 	if (!gateway)
 		return 0;
-	tmp = strstr (gateway, "via ");
-	tmp = g_strdup (tmp + strlen ("via "));
+	tmp = find_gateway_str(gateway);
+	if (!tmp) {
+		PLUGIN_WARN (IFNET_PLUGIN_NAME,
+			     "Couldn't obtain gateway in \"%s\"", gateway);
+		return 0;
+	}
+	tmp = g_strdup (tmp);
 	strip_string (tmp, ' ');
 	strip_string (tmp, '"');
 	if ((split = strstr (tmp, "\"")) != NULL)
@@ -509,8 +538,13 @@
 
 	if (!next_hop)
 		return 0;
-	tmp = strstr (next_hop, "via ");
-	tmp = g_strdup (tmp + strlen ("via "));
+	tmp = find_gateway_str(next_hop);
+	if (!tmp) {
+		PLUGIN_WARN (IFNET_PLUGIN_NAME,
+			     "Couldn't obtain next_hop in \"%s\"", next_hop);
+		return 0;
+	}
+	tmp = g_strdup (tmp);
 	strip_string (tmp, ' ');
 	strip_string (tmp, '"');
 	g_strstrip (tmp);
@@ -671,8 +705,8 @@
 	length = g_strv_length (ipset);
 	for (i = 0; i < length; i++) {
 		ip = ipset[i];
-		if (strstr (ip, "default via ") || strstr (ip, "::")
-		    || !strstr (ip, "via"))
+		if (find_default_gateway_str (ip) || strstr (ip, "::")
+		    || !find_gateway_str (ip))
 			continue;
 		ip = strip_string (ip, '"');
 		iblock = create_ip4_block (ip);
@@ -712,9 +746,7 @@
 		ip = strip_string (ip, '"');
 		if (ip[0] == '\0')
 			continue;
-		printf ("ip:%s\n", ip);
-		if ((tmp_addr = strstr (ip, "default via ")) != NULL) {
-			tmp_addr += strlen ("default via ");
+		if ((tmp_addr = find_default_gateway_str (ip)) != NULL) {
 			if (!is_ip6_address (tmp_addr))
 				continue;
 			else {
@@ -855,7 +887,7 @@
 void
 get_dhcp_hostname_and_client_id (char **hostname, char **client_id)
 {
-	gchar *dhcp_client = ifnet_get_global_setting ("main", "dhcp");
+	gchar *dhcp_client = NULL;
 	const gchar *dhcpcd_conf = "/etc/dhcpcd.conf";
 	const gchar *dhclient_conf = "/etc/dhcp/dhclient.conf";
 	gchar *line = NULL, *tmp = NULL, *contents = NULL;
@@ -864,6 +896,7 @@
 
 	*hostname = NULL;
 	*client_id = NULL;
+	dhcp_client = ifnet_get_global_setting ("main", "dhcp");
 	if (dhcp_client) {
 		if (!strcmp (dhcp_client, "dhclient"))
 			g_file_get_contents (dhclient_conf, &contents, NULL,
@@ -871,6 +904,7 @@
 		else if (!strcmp (dhcp_client, "dhcpcd"))
 			g_file_get_contents (dhcpcd_conf, &contents, NULL,
 					     NULL);
+		g_free (dhcp_client);
 	} else {
 		if (g_file_test (dhclient_conf, G_FILE_TEST_IS_REGULAR))
 			g_file_get_contents (dhclient_conf, &contents, NULL,