diff --git NetworkManager/src/supplicant-manager/nm-supplicant-interface.c NetworkManager/src/supplicant-manager/nm-supplicant-interface.c index 43cd167..8ceb3b2 100644 --- NetworkManager/src/supplicant-manager/nm-supplicant-interface.c +++ NetworkManager/src/supplicant-manager/nm-supplicant-interface.c @@ -22,6 +22,12 @@ #include #include #include +/*strtoul(), kill() end errno in kill_wpa_supplicant()*/ +#include +#include +#include +/*sleep()*/ +#include #include "nm-supplicant-interface.h" #include "nm-supplicant-manager.h" @@ -725,6 +731,33 @@ nm_supplicant_interface_add_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpoi } } +static void +kill_wpa_supplicant (const char *iface) +{ + char *pidfile = NULL; + char *pid_contents = NULL; + + g_assert(iface != NULL); + + pidfile = g_strdup_printf("/var/run/wpa_supplicant-%s.pid", iface); + g_assert(pidfile != NULL); + + if (g_file_get_contents (pidfile, &pid_contents, NULL, NULL)) + { + unsigned long int pid = strtoul (pid_contents, NULL, 10); + if ( !((pid == ULONG_MAX) && (errno == ERANGE)) ) + { + if(!kill((pid_t)pid, SIGTERM)) + { + remove (pidfile); + sleep(1); + } + } + g_free(pid_contents); + } + g_free(pidfile); +} + static void nm_supplicant_interface_add_to_supplicant (NMSupplicantInterface * self, gboolean get_only) @@ -757,6 +790,8 @@ nm_supplicant_interface_add_to_supplicant (NMSupplicantInterface * self, g_value_set_string (driver, priv->is_wireless ? "wext" : "wired"); g_hash_table_insert (hash, "driver", driver); + kill_wpa_supplicant(priv->dev); + call = dbus_g_proxy_begin_call (proxy, "addInterface", nm_supplicant_interface_add_cb,