};
static struct watch *watches;
-WI_SCAN *wi_scans;
+WI_SCANS wi_scans;
static gboolean dhcpcd_try_open(gpointer data);
static gboolean dhcpcd_wpa_try_open(gpointer data);
WI_SCAN *w;
DHCPCD_WI_SCAN *dw;
- for (w = wi_scans; w; w = w->next) {
+ TAILQ_FOREACH(w, &wi_scans, next) {
for (dw = w->scans; dw; dw = dw->next)
if (dw == scan)
- break;
- if (dw)
- return w;
+ return w;
}
return NULL;
}
if (online != ison || carrier != iscarrier) {
online = ison;
+ carrier = iscarrier;
if (ani_timer != 0) {
g_source_remove(ani_timer);
ani_timer = 0;
}
static void
-dhcpcd_status_cb(DHCPCD_CONNECTION *con, const char *status, _unused void *data)
+dhcpcd_status_cb(DHCPCD_CONNECTION *con, const char *status,
+ _unused void *data)
{
static char *last = NULL;
const char *msg;
ani_timer = 0;
ani_counter = 0;
}
+ online = carrier = false;
gtk_status_icon_set_from_icon_name(status_icon,
"network-offline");
gtk_status_icon_set_tooltip_text(status_icon, msg);
- notify(_("No network"), msg, "network-offline");
- dhcpcd_prefs_abort();
- while (wi_scans) {
- w = wi_scans->next;
- dhcpcd_wi_scans_free(wi_scans->scans);
- g_free(wi_scans);
- wi_scans = w;
+ prefs_abort();
+ menu_abort();
+ wpa_abort();
+ while ((w = TAILQ_FIRST(&wi_scans))) {
+ TAILQ_REMOVE(&wi_scans, w, next);
+ dhcpcd_wi_scans_free(w->scans);
+ g_free(w);
}
dhcpcd_unwatch(-1, con);
g_timeout_add(DHCPCD_RETRYOPEN, dhcpcd_try_open, con);
static int last_error;
con = (DHCPCD_CONNECTION *)data;
- fd = dhcpcd_open(con);
+ fd = dhcpcd_open(con, true);
if (fd == -1) {
+ if (errno == EACCES || errno == EPERM) {
+ if ((fd = dhcpcd_open(con, false)) != -1)
+ goto unprived;
+ }
if (errno != last_error) {
g_critical("dhcpcd_open: %s", strerror(errno));
last_error = errno;
return TRUE;
}
+unprived:
if (!dhcpcd_watch(fd, dhcpcd_cb, con)) {
dhcpcd_close(con);
return TRUE;
const char *icon;
bool new_msg;
- /* Update the tooltip with connection information */
- con = dhcpcd_if_connection(i);
- update_online(con, false);
-
/* We should ignore renew and stop so we don't annoy the user */
- if (g_strcmp0(i->reason, "RENEW") == 0 ||
- g_strcmp0(i->reason, "STOP") == 0 ||
- g_strcmp0(i->reason, "STOPPED") == 0)
- return;
-
- msg = dhcpcd_if_message(i, &new_msg);
- if (msg) {
- g_message("%s", msg);
- if (new_msg) {
- if (i->up)
- icon = "network-transmit-receive";
- //else
- // icon = "network-transmit";
- if (!i->up)
- icon = "network-offline";
- notify(_("Network event"), msg, icon);
+ if (g_strcmp0(i->reason, "RENEW") &&
+ g_strcmp0(i->reason, "STOP") &&
+ g_strcmp0(i->reason, "STOPPED"))
+ {
+ msg = dhcpcd_if_message(i, &new_msg);
+ if (msg) {
+ g_message("%s", msg);
+ if (new_msg) {
+ if (i->up)
+ icon = "network-transmit-receive";
+ //else
+ // icon = "network-transmit";
+ if (!i->up)
+ icon = "network-offline";
+ notify(_("Network event"), msg, icon);
+ }
+ g_free(msg);
}
- g_free(msg);
}
+
+ /* Update the tooltip with connection information */
+ con = dhcpcd_if_connection(i);
+ update_online(con, false);
}
static gboolean
if (scans == NULL && errno)
g_warning("%s: %s", i->ifname, strerror(errno));
errno = lerrno;
- for (w = wi_scans; w; w = w->next)
+ TAILQ_FOREACH(w, &wi_scans, next) {
if (w->interface == i)
break;
+ }
if (w == NULL) {
w = g_malloc(sizeof(*w));
w->interface = i;
- w->next = wi_scans;
- wi_scans = w;
+ w->scans = scans;
+ w->ifmenu = NULL;
+ TAILQ_INIT(&w->menus);
+ TAILQ_INSERT_TAIL(&wi_scans, w, next);
} else {
txt = NULL;
msg = N_("New Access Point");
notify(msg, txt, "network-wireless");
g_free(txt);
}
- dhcpcd_wi_scans_free(w->scans);
+ menu_update_scans(w, scans);
}
- w->scans = scans;
+}
+
+static void
+dhcpcd_wpa_status_cb(DHCPCD_WPA *wpa, const char *status, _unused void *data)
+{
+ DHCPCD_IF *i;
+
+ i = dhcpcd_wpa_if(wpa);
+ g_message("%s: WPA status %s", i->ifname, status);
+ if (g_strcmp0(status, "down") == 0)
+ dhcpcd_unwatch(-1, wpa);
}
int
notify_init(PACKAGE);
#endif
+ TAILQ_INIT(&wi_scans);
g_message(_("Connecting ..."));
con = dhcpcd_new();
if (con == NULL) {
g_critical("libdhcpcd: %s", strerror(errno));
exit(EXIT_FAILURE);
}
+ dhcpcd_set_progname(con, "dhcpcd-gtk");
dhcpcd_set_status_callback(con, dhcpcd_status_cb, NULL);
dhcpcd_set_if_callback(con, dhcpcd_if_cb, NULL);
dhcpcd_wpa_set_scan_callback(con, dhcpcd_wpa_scan_cb, NULL);
- //dhcpcd_wpa_set_status_callback(con, dhcpcd_wpa_status_cb, NULL);
+ dhcpcd_wpa_set_status_callback(con, dhcpcd_wpa_status_cb, NULL);
if (dhcpcd_try_open(con))
g_timeout_add(DHCPCD_RETRYOPEN, dhcpcd_try_open, con);