97 lines
2.9 KiB
C
97 lines
2.9 KiB
C
|
#include "linuxnm.h"
|
||
|
#include "../util.h"
|
||
|
|
||
|
#include <NetworkManager.h>
|
||
|
#include <signal.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#define TYPE_NO_MANAGER 0x1
|
||
|
#define TYPE_WIRED 0x2
|
||
|
#define TYPE_WIRELESS 0x4
|
||
|
#define TYPE_VPN 0x8
|
||
|
|
||
|
typedef int connection_type;
|
||
|
|
||
|
static connection_type active_types;
|
||
|
|
||
|
static int is_connection_vpn(NMConnection *connection) {
|
||
|
if (nm_connection_get_setting_vpn(connection)) {
|
||
|
return TRUE;
|
||
|
}
|
||
|
const char *type = nm_connection_get_connection_type(connection);
|
||
|
return strcmp(type, "wireguard") == 0;
|
||
|
}
|
||
|
|
||
|
static void update_connections(NMClient *client) {
|
||
|
const GPtrArray *active_connections =
|
||
|
nm_client_get_active_connections(client);
|
||
|
guint i;
|
||
|
for (i = 0; i < active_connections->len; ++i) {
|
||
|
NMActiveConnection *current_active =
|
||
|
g_ptr_array_index(active_connections, i);
|
||
|
NMConnection *current =
|
||
|
NM_CONNECTION(nm_active_connection_get_connection(current_active));
|
||
|
const char *type = nm_connection_get_connection_type(current);
|
||
|
if (is_connection_vpn(current)) {
|
||
|
active_types |= TYPE_VPN;
|
||
|
} else if (nm_connection_get_setting_wired(current)) {
|
||
|
active_types |= TYPE_WIRED;
|
||
|
} else if (nm_connection_get_setting_wireless(current)) {
|
||
|
active_types |= TYPE_WIRELESS;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void connections_changed(NMClient *client, GParamSpec *pspec,
|
||
|
gpointer user_data) {
|
||
|
active_types = 0;
|
||
|
if (!nm_client_get_nm_running(client)) {
|
||
|
active_types = TYPE_NO_MANAGER;
|
||
|
} else {
|
||
|
update_connections(client);
|
||
|
}
|
||
|
qtb_signal_modules(2);
|
||
|
}
|
||
|
|
||
|
static void *thread_action(gpointer user_data) {
|
||
|
GMainContext *context = g_main_context_new();
|
||
|
g_main_context_push_thread_default(context);
|
||
|
GError *err = NULL;
|
||
|
NMClient *client = nm_client_new(NULL, &err);
|
||
|
if (err) {
|
||
|
return err->message;
|
||
|
}
|
||
|
g_signal_connect(client, "notify::" NM_CLIENT_ACTIVE_CONNECTIONS,
|
||
|
G_CALLBACK(connections_changed), NULL);
|
||
|
g_signal_connect(client, "notify::" NM_CLIENT_NM_RUNNING,
|
||
|
G_CALLBACK(connections_changed), NULL);
|
||
|
connections_changed(client, NULL, NULL);
|
||
|
GMainLoop *main_loop = g_main_loop_new(context, FALSE);
|
||
|
g_main_loop_run(main_loop);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void linuxnm_module_init() {
|
||
|
g_thread_new("network-module", &thread_action, NULL);
|
||
|
}
|
||
|
|
||
|
char *linuxnm_module_poll() {
|
||
|
char *output = qtb_calloc(8, 1);
|
||
|
if ((active_types & TYPE_NO_MANAGER) == TYPE_NO_MANAGER) {
|
||
|
strcat(output, "ﳤ");
|
||
|
}
|
||
|
if ((active_types & TYPE_VPN) == TYPE_VPN) {
|
||
|
strcat(output, "嬨");
|
||
|
}
|
||
|
if ((active_types & TYPE_WIRED) == TYPE_WIRED) {
|
||
|
strcat(output, "");
|
||
|
}
|
||
|
if ((active_types & TYPE_WIRELESS) == TYPE_WIRELESS) {
|
||
|
strcat(output, "直");
|
||
|
}
|
||
|
if (active_types == 0) { /* no valid connections found */
|
||
|
strcat(output, "");
|
||
|
}
|
||
|
return output;
|
||
|
}
|