Example #1
0
static gboolean
dhcpcd_wpa_cb(_unused GIOChannel *gio, _unused GIOCondition c,
    gpointer data)
{
	DHCPCD_WPA *wpa;
	DHCPCD_IF *i;

	wpa = (DHCPCD_WPA *)data;
	if (dhcpcd_wpa_get_fd(wpa) == -1) {
		dhcpcd_unwatch(-1, wpa);

		/* If the interface hasn't left, try re-opening */
		i = dhcpcd_wpa_if(wpa);
		if (i == NULL ||
		    g_strcmp0(i->reason, "DEPARTED") == 0 ||
		    g_strcmp0(i->reason, "STOPPED") == 0)
			return TRUE;
		g_warning(_("dhcpcd WPA connection lost: %s"), i->ifname);
		g_timeout_add(DHCPCD_RETRYOPEN, dhcpcd_wpa_try_open, wpa);
		return FALSE;
	}

	dhcpcd_wpa_dispatch(wpa);
	return TRUE;
}
void DhcpcdQt::scanCallback(DHCPCD_WPA *wpa)
{
	DHCPCD_WI_SCAN *scans;
	int fd = dhcpcd_wpa_get_fd(wpa);
	DhcpcdWi *wi;

	wi = findWi(wpa);
	if (fd == -1) {
		qCritical("No fd for WPA");
		if (wi) {
			wis->removeOne(wi);
			wi->deleteLater();
		}
		return;
	}

	DHCPCD_IF *i = dhcpcd_wpa_if(wpa);
	if (i == NULL) {
		qCritical("No interface for WPA");
		if (wi) {
			wis->removeOne(wi);
			wi->deleteLater();
		}
		return;
	}

	qDebug("%s: Received scan results", i->ifname);
	scans = dhcpcd_wi_scans(i);
	if (wi == NULL) {
		wi = new DhcpcdWi(this, wpa);
		if (wi->open()) {
			wis->append(wi);
			wi->setScans(scans);
		} else
			wi->deleteLater();
	} else
		processScans(wi, scans);

	if (!aniTimer->isActive()) {
		DHCPCD_WI_SCAN *scan;
		const char *icon;

		scan = getStrongestSignal();
		if (scan)
			icon = DhcpcdQt::signalStrengthIcon(scan);
		else if (onLine)
			icon = "network-transmit-receive";
		else
			icon = "network-offline";

		setIcon("status", icon);
	}
}
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);
			wi->deleteLater();
		}
	}
}
DHCPCD_WI_SCAN * DhcpcdQt::getStrongestSignal()
{
	DHCPCD_WI_SCAN *scan, *scans, *s;
	DHCPCD_WPA *wpa;
	DHCPCD_IF *i;

	scan = NULL;
	for (auto &wi : *wis) {
		wpa = wi->getWpa();
		i = dhcpcd_wpa_if(wpa);
		scans = wi->getScans();
		for (s = scans; s; s = s->next) {
			if (dhcpcd_wi_associated(i, s) &&
			    (scan == NULL ||
			    s->strength.value > scan->strength.value))
				scan = s;
		}
	}
	return scan;
}
void DhcpcdQt::ifCallback(DHCPCD_IF *i)
{
	char *msg;
	bool new_msg;

	if (strcmp(i->reason, "RENEW") &&
	    strcmp(i->reason, "STOP") &&
	    strcmp(i->reason, "STOPPED"))
	{
		msg = dhcpcd_if_message(i, &new_msg);
		if (msg) {
			qDebug("%s", msg);
			if (new_msg) {
				QSystemTrayIcon::MessageIcon icon =
				    i->up ? QSystemTrayIcon::Information :
				    QSystemTrayIcon::Warning;
				QString t = tr("Network Event");
				QString m = msg;
				notify(t, m, icon);
			}
			free(msg);
		}
	}

	updateOnline(false);

	if (i->wireless) {
		for (auto &wi : *wis) {
			DHCPCD_WPA *wpa = wi->getWpa();
			if (dhcpcd_wpa_if(wpa) == i) {
				DHCPCD_WI_SCAN *scans;

				scans = dhcpcd_wi_scans(i);
				processScans(wi, scans);
			}
		}
	}
}
Example #6
0
static void
dhcpcd_wpa_scan_cb(DHCPCD_WPA *wpa, _unused void *data)
{
	DHCPCD_IF *i;
	WI_SCAN *w;
	DHCPCD_WI_SCAN *scans, *s1, *s2;
	char *txt, *t;
	int lerrno, fd;
	const char *msg;

	/* This could be a new WPA so watch it */
	fd = dhcpcd_wpa_get_fd(wpa);
	if (fd == -1) {
		g_critical("No fd for WPA %p", wpa);
		dhcpcd_unwatch(-1, wpa);
		return;
	}
	dhcpcd_watch(fd, dhcpcd_wpa_cb, wpa);

	i = dhcpcd_wpa_if(wpa);
	if (i == NULL) {
		g_critical("No interface for WPA %p", wpa);
		return;
	}
	g_message(_("%s: Received scan results"), i->ifname);
	lerrno = errno;
	errno = 0;
	scans = dhcpcd_wi_scans(i);
	if (scans == NULL && errno)
		g_warning("%s: %s", i->ifname, strerror(errno));
	errno = lerrno;
	for (w = wi_scans; w; w = w->next)
		if (w->interface == i)
			break;
	if (w == NULL) {
		w = g_malloc(sizeof(*w));
		w->interface = i;
		w->next = wi_scans;
		wi_scans = w;
	} else {
		txt = NULL;
		msg = N_("New Access Point");
		for (s1 = scans; s1; s1 = s1->next) {
			for (s2 = w->scans; s2; s2 = s2->next)
				if (g_strcmp0(s1->ssid, s2->ssid) == 0)
					break;
			if (s2 == NULL) {
				if (txt == NULL)
					txt = g_strdup(s1->ssid);
				else {
					msg = N_("New Access Points");
					t = g_strconcat(txt, "\n",
					    s1->ssid, NULL);
					g_free(txt);
					txt = t;
				}
			}
		}
		if (txt) {
			notify(msg, txt, "network-wireless");
			g_free(txt);
		}
		menu_update_scans(w->interface, scans);
		dhcpcd_wi_scans_free(w->scans);
	}
	w->scans = scans;
}