From: Roy Marples Date: Fri, 12 Sep 2014 11:58:08 +0000 (+0000) Subject: Remove the DhcpcdWi instance if the wpa_supplicant connection is lost. X-Git-Tag: dhcpcd-ui-0.7.0~17 X-Git-Url: https://roy.marples.name/git Remove the DhcpcdWi instance if the wpa_supplicant connection is lost. --- diff --git a/src/dhcpcd-qt/dhcpcd-qt.cpp b/src/dhcpcd-qt/dhcpcd-qt.cpp index 57c278e..5e88aa7 100644 --- a/src/dhcpcd-qt/dhcpcd-qt.cpp +++ b/src/dhcpcd-qt/dhcpcd-qt.cpp @@ -69,6 +69,7 @@ DhcpcdQt::DhcpcdQt() dhcpcd_set_status_callback(con, dhcpcd_status_cb, this); dhcpcd_set_if_callback(con, dhcpcd_if_cb, this); dhcpcd_wpa_set_scan_callback(con, dhcpcd_wpa_scan_cb, this); + dhcpcd_wpa_set_status_callback(con, dhcpcd_wpa_status_cb, this); tryOpen(); } @@ -317,6 +318,29 @@ void DhcpcdQt::dhcpcd_wpa_scan_cb(DHCPCD_WPA *wpa, void *d) dhcpcdQt->scanCallback(wpa); } +void DhcpcdQt::wpaStatusCallback(DHCPCD_WPA *wpa, const char *status) +{ + DHCPCD_IF *i; + + i = dhcpcd_wpa_if(wpa); + qDebug("%s: WPA status %s", i->ifname, status); + if (strcmp(status, "down") == 0) { + DhcpcdWi *wi = findWi(wpa); + if (wi) { + wis->removeOne(wi); + delete wi; + } + } +} + +void DhcpcdQt::dhcpcd_wpa_status_cb(DHCPCD_WPA *wpa, const char *status, + void *d) +{ + DhcpcdQt *dhcpcdQt = (DhcpcdQt *)d; + + dhcpcdQt->wpaStatusCallback(wpa, status); +} + void DhcpcdQt::tryOpen() { int fd = dhcpcd_open(con); static int last_error; diff --git a/src/dhcpcd-qt/dhcpcd-qt.h b/src/dhcpcd-qt/dhcpcd-qt.h index a6c70e7..efa1bf0 100644 --- a/src/dhcpcd-qt/dhcpcd-qt.h +++ b/src/dhcpcd-qt/dhcpcd-qt.h @@ -66,6 +66,9 @@ public: static void dhcpcd_wpa_scan_cb(DHCPCD_WPA *wpa, void *d); void scanCallback(DHCPCD_WPA *wpa); + static void dhcpcd_wpa_status_cb(DHCPCD_WPA *wpa, const char *status, + void *d); + void wpaStatusCallback(DHCPCD_WPA *wpa, const char *status); static QIcon getIcon(QString category, QString name); diff --git a/src/dhcpcd-qt/dhcpcd-wi.cpp b/src/dhcpcd-qt/dhcpcd-wi.cpp index 5aa4663..b8f2c54 100644 --- a/src/dhcpcd-qt/dhcpcd-wi.cpp +++ b/src/dhcpcd-qt/dhcpcd-wi.cpp @@ -58,8 +58,14 @@ DhcpcdWi::DhcpcdWi(DhcpcdQt *parent, DHCPCD_WPA *wpa) DhcpcdWi::~DhcpcdWi() { + if (menu) { + delete menu; + menu = NULL; + } + dhcpcd_wi_scans_free(scans); - if (notifier != NULL) + + if (notifier) delete notifier; } diff --git a/src/libdhcpcd/wpa.c b/src/libdhcpcd/wpa.c index 472b265..354dd41 100644 --- a/src/libdhcpcd/wpa.c +++ b/src/libdhcpcd/wpa.c @@ -629,6 +629,16 @@ dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *con, con->wi_scanresults_context = context; } + +void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION * con, + void (*cb)(DHCPCD_WPA *, const char *, void *), void *context) +{ + + assert(con); + con->wpa_status_cb = cb; + con->wpa_status_context = context; +} + void dhcpcd_wpa_dispatch(DHCPCD_WPA *wpa) {