From 9b5bd0613805a6ebc3ab3fe5898f091309738dff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 03:37:29 -0400 Subject: [PATCH 01/14] Updates --- src/connman.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++---- src/main.c | 21 ++++++------ 2 files changed, 100 insertions(+), 16 deletions(-) diff --git a/src/connman.c b/src/connman.c index 4a92fbd..b1ca330 100644 --- a/src/connman.c +++ b/src/connman.c @@ -2,26 +2,109 @@ #include #include #include +#include #define BUFFER_SIZE 1024 +// Function prototypes +static gboolean execute_command(const char *command, char *output, size_t output_size); +static void scan_with_connman(GtkTreeStore *store); +static void scan_with_networkmanager(GtkTreeStore *store); +static void scan_with_mac_wifi(GtkTreeStore *store); + void load_saved_networks(GtkTreeStore *store) { - FILE *fp = popen("connmanctl services", "r"); + // Try ConnMan first + if (access("/usr/bin/connmanctl", X_OK) == 0) { + scan_with_connman(store); + } + // Try NetworkManager if ConnMan is not available + else if (access("/usr/bin/nmcli", X_OK) == 0) { + scan_with_networkmanager(store); + } + // Fallback to macOS WiFi scan + else { + scan_with_mac_wifi(store); + } +} + +static gboolean execute_command(const char *command, char *output, size_t output_size) { + FILE *fp = popen(command, "r"); if (fp == NULL) { perror("popen"); - return; + return FALSE; + } + + size_t len = fread(output, 1, output_size - 1, fp); + if (len == (size_t)-1) { + perror("fread"); + pclose(fp); + return FALSE; + } + + output[len] = '\0'; // Null-terminate the output + pclose(fp); + return TRUE; +} + +static void scan_with_connman(GtkTreeStore *store) { + char buffer[BUFFER_SIZE]; + if (execute_command("connmanctl services", buffer, sizeof(buffer))) { + char *line = strtok(buffer, "\n"); + while (line != NULL) { + if (strstr(line, "Wifi")) { + GtkTreeIter iter; + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); + } + line = strtok(NULL, "\n"); + } } +} +static void scan_with_networkmanager(GtkTreeStore *store) { char buffer[BUFFER_SIZE]; - while (fgets(buffer, sizeof(buffer), fp)) { - if (strstr(buffer, "Wifi")) { + if (execute_command("nmcli -f SSID,ACTIVE dev wifi", buffer, sizeof(buffer))) { + char *line = strtok(buffer, "\n"); + while (line != NULL) { + if (strstr(line, "SSID")) { // Skip header + line = strtok(NULL, "\n"); + continue; + } GtkTreeIter iter; gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); + gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); + line = strtok(NULL, "\n"); } } +} - pclose(fp); +static void scan_with_mac_wifi(GtkTreeStore *store) { + char buffer[BUFFER_SIZE]; + // Try using airport first + if (execute_command("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", buffer, sizeof(buffer))) { + char *line = strtok(buffer, "\n"); + while (line != NULL) { + if (strstr(line, "SSID")) { // Skip header + line = strtok(NULL, "\n"); + continue; + } + GtkTreeIter iter; + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); + line = strtok(NULL, "\n"); + } + } else { + // Try using wdutil if airport is deprecated or not working + if (execute_command("wdutil -list", buffer, sizeof(buffer))) { + char *line = strtok(buffer, "\n"); + while (line != NULL) { + GtkTreeIter iter; + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); + line = strtok(NULL, "\n"); + } + } + } } void prompt_for_password_and_connect(const gchar *network_name) { diff --git a/src/main.c b/src/main.c index 364581f..8c260c7 100644 --- a/src/main.c +++ b/src/main.c @@ -6,8 +6,8 @@ // Function prototypes static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview); -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview); -static GtkWidget* create_main_window(); +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store); +static GtkWidget* create_main_window(GtkTreeStore **store_out); static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) { GtkTreeModel *model = gtk_tree_view_get_model(treeview); @@ -26,8 +26,8 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) } } -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview) { - GtkTreeModel *model = gtk_tree_view_get_model(treeview); +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store) { + GtkTreeModel *model = GTK_TREE_MODEL(store); GtkTreeIter iter; GtkTreePath *tree_path = gtk_tree_path_new_from_string(path); gtk_tree_model_get_iter(model, &iter, tree_path); @@ -35,7 +35,7 @@ static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path gtk_tree_model_get(model, &iter, 1, &auto_connect, -1); auto_connect = !auto_connect; - gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 1, auto_connect, -1); + gtk_tree_store_set(store, &iter, 1, auto_connect, -1); gtk_tree_path_free(tree_path); @@ -49,7 +49,7 @@ static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path g_free(network_name); } -static GtkWidget* create_main_window() { +static GtkWidget* create_main_window(GtkTreeStore **store_out) { GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "ConnWifiMaster"); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); @@ -60,6 +60,7 @@ static GtkWidget* create_main_window() { GtkWidget *treeview = gtk_tree_view_new(); GtkTreeStore *store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store)); + *store_out = store; GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("Network", renderer, "text", 0, NULL); @@ -70,14 +71,14 @@ static GtkWidget* create_main_window() { GtkTreeViewColumn *toggle_column = gtk_tree_view_column_new_with_attributes("Auto-Connect", toggle_renderer, "active", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), toggle_column); - g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), treeview); + g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), store); gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0); GtkWidget *connect_button = gtk_button_new_with_label("Connect"); gtk_box_pack_start(GTK_BOX(vbox), connect_button, FALSE, FALSE, 0); - g_signal_connect(connect_button, "clicked", G_CALLBACK(on_connect_button_clicked), treeview); + g_signal_connect(connect_button, "clicked", G_CALLBACK(on_connect_button_clicked), GTK_TREE_VIEW(treeview)); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); return window; @@ -86,11 +87,11 @@ static GtkWidget* create_main_window() { int main(int argc, char *argv[]) { gtk_init(&argc, &argv); - GtkWidget *window = create_main_window(); + GtkTreeStore *store; + GtkWidget *window = create_main_window(&store); gtk_widget_show_all(window); // Load saved networks - GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window))); load_saved_networks(store); gtk_main(); From 87b6638973788ac6dea29781721126da6f756e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 03:43:07 -0400 Subject: [PATCH 02/14] Updates --- src/connman.c | 140 +++++++++++++++++++------------------------------- src/main.c | 22 +++----- 2 files changed, 62 insertions(+), 100 deletions(-) diff --git a/src/connman.c b/src/connman.c index b1ca330..da26cfe 100644 --- a/src/connman.c +++ b/src/connman.c @@ -6,116 +6,85 @@ #define BUFFER_SIZE 1024 -// Function prototypes -static gboolean execute_command(const char *command, char *output, size_t output_size); -static void scan_with_connman(GtkTreeStore *store); -static void scan_with_networkmanager(GtkTreeStore *store); -static void scan_with_mac_wifi(GtkTreeStore *store); - -void load_saved_networks(GtkTreeStore *store) { - // Try ConnMan first - if (access("/usr/bin/connmanctl", X_OK) == 0) { - scan_with_connman(store); - } - // Try NetworkManager if ConnMan is not available - else if (access("/usr/bin/nmcli", X_OK) == 0) { - scan_with_networkmanager(store); - } - // Fallback to macOS WiFi scan - else { - scan_with_mac_wifi(store); - } +// Verifica si connmanctl está disponible +static gboolean is_connman_available() { + return access("/usr/bin/connmanctl", X_OK) == 0; } -static gboolean execute_command(const char *command, char *output, size_t output_size) { - FILE *fp = popen(command, "r"); - if (fp == NULL) { - perror("popen"); - return FALSE; - } - - size_t len = fread(output, 1, output_size - 1, fp); - if (len == (size_t)-1) { - perror("fread"); - pclose(fp); - return FALSE; - } +// Verifica si nmcli está disponible +static gboolean is_networkmanager_available() { + return access("/usr/bin/nmcli", X_OK) == 0; +} - output[len] = '\0'; // Null-terminate the output - pclose(fp); - return TRUE; +// Verifica si el sistema es macOS +static gboolean is_macos() { + return access("/usr/sbin/airport", X_OK) == 0; } -static void scan_with_connman(GtkTreeStore *store) { - char buffer[BUFFER_SIZE]; - if (execute_command("connmanctl services", buffer, sizeof(buffer))) { - char *line = strtok(buffer, "\n"); - while (line != NULL) { - if (strstr(line, "Wifi")) { +// Carga redes guardadas según el sistema de gestión de redes detectado +void load_saved_networks(GtkTreeStore *store) { + if (is_connman_available()) { + FILE *fp = popen("connmanctl services", "r"); + if (fp == NULL) { + perror("popen"); + return; + } + + char buffer[BUFFER_SIZE]; + while (fgets(buffer, sizeof(buffer), fp)) { + if (strstr(buffer, "Wifi")) { GtkTreeIter iter; gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); + gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); } - line = strtok(NULL, "\n"); } - } -} + pclose(fp); + } else if (is_networkmanager_available()) { + FILE *fp = popen("nmcli -f SSID dev wifi", "r"); + if (fp == NULL) { + perror("popen"); + return; + } -static void scan_with_networkmanager(GtkTreeStore *store) { - char buffer[BUFFER_SIZE]; - if (execute_command("nmcli -f SSID,ACTIVE dev wifi", buffer, sizeof(buffer))) { - char *line = strtok(buffer, "\n"); - while (line != NULL) { - if (strstr(line, "SSID")) { // Skip header - line = strtok(NULL, "\n"); - continue; + char buffer[BUFFER_SIZE]; + while (fgets(buffer, sizeof(buffer), fp)) { + if (buffer[0] != '\n') { + GtkTreeIter iter; + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); } - GtkTreeIter iter; - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); - line = strtok(NULL, "\n"); } - } -} + pclose(fp); + } else if (is_macos()) { + FILE *fp = popen("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", "r"); + if (fp == NULL) { + perror("popen"); + return; + } -static void scan_with_mac_wifi(GtkTreeStore *store) { - char buffer[BUFFER_SIZE]; - // Try using airport first - if (execute_command("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", buffer, sizeof(buffer))) { - char *line = strtok(buffer, "\n"); - while (line != NULL) { - if (strstr(line, "SSID")) { // Skip header - line = strtok(NULL, "\n"); - continue; + char buffer[BUFFER_SIZE]; + while (fgets(buffer, sizeof(buffer), fp)) { + if (strstr(buffer, "SSID")) { + continue; // Omitir el encabezado } GtkTreeIter iter; gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); - line = strtok(NULL, "\n"); - } - } else { - // Try using wdutil if airport is deprecated or not working - if (execute_command("wdutil -list", buffer, sizeof(buffer))) { - char *line = strtok(buffer, "\n"); - while (line != NULL) { - GtkTreeIter iter; - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, line, 1, FALSE, -1); - line = strtok(NULL, "\n"); - } + gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); } + pclose(fp); } } +// Muestra un diálogo para ingresar la contraseña y conectar void prompt_for_password_and_connect(const gchar *network_name) { GtkWidget *dialog; GtkWidget *password_entry; GtkWidget *content_area; GtkResponseType result; - dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, - ("Cancel"), GTK_RESPONSE_CANCEL, - ("Connect"), GTK_RESPONSE_ACCEPT, + dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, + ("Cancel"), GTK_RESPONSE_CANCEL, + ("Connect"), GTK_RESPONSE_ACCEPT, NULL); content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -128,7 +97,6 @@ void prompt_for_password_and_connect(const gchar *network_name) { if (result == GTK_RESPONSE_ACCEPT) { const gchar *password = gtk_entry_get_text(GTK_ENTRY(password_entry)); - // Connect using connmanctl with password char command[BUFFER_SIZE]; snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); system(command); @@ -137,8 +105,8 @@ void prompt_for_password_and_connect(const gchar *network_name) { gtk_widget_destroy(dialog); } +// Actualiza la configuración de auto-conexión void update_auto_connect_configuration(const gchar *network_name) { - // Placeholder for actual auto-connect configuration char command[BUFFER_SIZE]; snprintf(command, sizeof(command), "connmanctl enable %s", network_name); system(command); diff --git a/src/main.c b/src/main.c index 8c260c7..7b92b6d 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ // Function prototypes static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview); static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store); -static GtkWidget* create_main_window(GtkTreeStore **store_out); +static GtkWidget* create_main_window(); static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) { GtkTreeModel *model = gtk_tree_view_get_model(treeview); @@ -19,7 +19,6 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) gchar *network_name; gtk_tree_model_get(model, &iter, 0, &network_name, -1); - // Prompt for password if needed and connect prompt_for_password_and_connect(network_name); g_free(network_name); @@ -27,29 +26,26 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) } static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store) { - GtkTreeModel *model = GTK_TREE_MODEL(store); GtkTreeIter iter; GtkTreePath *tree_path = gtk_tree_path_new_from_string(path); - gtk_tree_model_get_iter(model, &iter, tree_path); + gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, tree_path); gboolean auto_connect; - gtk_tree_model_get(model, &iter, 1, &auto_connect, -1); + gtk_tree_model_get(store, &iter, 1, &auto_connect, -1); auto_connect = !auto_connect; gtk_tree_store_set(store, &iter, 1, auto_connect, -1); gtk_tree_path_free(tree_path); - // Retrieve network name for auto-connect configuration gchar *network_name; - gtk_tree_model_get(model, &iter, 0, &network_name, -1); + gtk_tree_model_get(store, &iter, 0, &network_name, -1); - // Update auto-connect configuration update_auto_connect_configuration(network_name); g_free(network_name); } -static GtkWidget* create_main_window(GtkTreeStore **store_out) { +static GtkWidget* create_main_window() { GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "ConnWifiMaster"); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); @@ -60,7 +56,6 @@ static GtkWidget* create_main_window(GtkTreeStore **store_out) { GtkWidget *treeview = gtk_tree_view_new(); GtkTreeStore *store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store)); - *store_out = store; GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("Network", renderer, "text", 0, NULL); @@ -78,7 +73,7 @@ static GtkWidget* create_main_window(GtkTreeStore **store_out) { GtkWidget *connect_button = gtk_button_new_with_label("Connect"); gtk_box_pack_start(GTK_BOX(vbox), connect_button, FALSE, FALSE, 0); - g_signal_connect(connect_button, "clicked", G_CALLBACK(on_connect_button_clicked), GTK_TREE_VIEW(treeview)); + g_signal_connect(connect_button, "clicked", G_CALLBACK(on_connect_button_clicked), treeview); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); return window; @@ -87,11 +82,10 @@ static GtkWidget* create_main_window(GtkTreeStore **store_out) { int main(int argc, char *argv[]) { gtk_init(&argc, &argv); - GtkTreeStore *store; - GtkWidget *window = create_main_window(&store); + GtkWidget *window = create_main_window(); gtk_widget_show_all(window); - // Load saved networks + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window))); load_saved_networks(store); gtk_main(); From 499c57e36471fe07a483ec0d4f9cb6e87022e4e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 03:47:16 -0400 Subject: [PATCH 03/14] Updates --- src/main.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 7b92b6d..297e4ae 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ // Function prototypes static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview); -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store); +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview); static GtkWidget* create_main_window(); static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) { @@ -19,27 +19,32 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) gchar *network_name; gtk_tree_model_get(model, &iter, 0, &network_name, -1); + // Prompt for password if needed and connect prompt_for_password_and_connect(network_name); g_free(network_name); } } -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store) { +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview) { + GtkTreeModel *model = gtk_tree_view_get_model(treeview); GtkTreeIter iter; GtkTreePath *tree_path = gtk_tree_path_new_from_string(path); - gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, tree_path); + gtk_tree_model_get_iter(model, &iter, tree_path); gboolean auto_connect; - gtk_tree_model_get(store, &iter, 1, &auto_connect, -1); + gtk_tree_model_get(model, &iter, 1, &auto_connect, -1); auto_connect = !auto_connect; + GtkTreeStore *store = GTK_TREE_STORE(model); // Cast the model to GtkTreeStore gtk_tree_store_set(store, &iter, 1, auto_connect, -1); gtk_tree_path_free(tree_path); + // Retrieve network name for auto-connect configuration gchar *network_name; - gtk_tree_model_get(store, &iter, 0, &network_name, -1); + gtk_tree_model_get(model, &iter, 0, &network_name, -1); + // Update auto-connect configuration update_auto_connect_configuration(network_name); g_free(network_name); @@ -66,7 +71,7 @@ static GtkWidget* create_main_window() { GtkTreeViewColumn *toggle_column = gtk_tree_view_column_new_with_attributes("Auto-Connect", toggle_renderer, "active", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), toggle_column); - g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), store); + g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), treeview); gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0); @@ -85,6 +90,7 @@ int main(int argc, char *argv[]) { GtkWidget *window = create_main_window(); gtk_widget_show_all(window); + // Load saved networks GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window))); load_saved_networks(store); From ee711eae64d3c13dd9b510552ad9212caf5356de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 03:50:19 -0400 Subject: [PATCH 04/14] Updates --- src/connman.c | 120 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 40 deletions(-) diff --git a/src/connman.c b/src/connman.c index da26cfe..7b143ab 100644 --- a/src/connman.c +++ b/src/connman.c @@ -6,85 +6,116 @@ #define BUFFER_SIZE 1024 -// Verifica si connmanctl está disponible -static gboolean is_connman_available() { - return access("/usr/bin/connmanctl", X_OK) == 0; -} +// Define function prototypes +void load_saved_networks(GtkTreeStore *store); +void prompt_for_password_and_connect(const gchar *network_name); +void update_auto_connect_configuration(const gchar *network_name); -// Verifica si nmcli está disponible -static gboolean is_networkmanager_available() { - return access("/usr/bin/nmcli", X_OK) == 0; -} +// Helper function to detect the WiFi manager +static const char* detect_wifi_manager() { + FILE *fp; + char buffer[BUFFER_SIZE]; + const char *wifi_manager = NULL; + + // Check ConnMan + fp = popen("systemctl is-active connman", "r"); + if (fp != NULL) { + if (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (strstr(buffer, "active") != NULL) { + wifi_manager = "connman"; + } + } + pclose(fp); + } + + // Check NetworkManager + if (wifi_manager == NULL) { + fp = popen("systemctl is-active NetworkManager", "r"); + if (fp != NULL) { + if (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (strstr(buffer, "active") != NULL) { + wifi_manager = "NetworkManager"; + } + } + pclose(fp); + } + } -// Verifica si el sistema es macOS -static gboolean is_macos() { - return access("/usr/sbin/airport", X_OK) == 0; + return wifi_manager; } -// Carga redes guardadas según el sistema de gestión de redes detectado void load_saved_networks(GtkTreeStore *store) { - if (is_connman_available()) { - FILE *fp = popen("connmanctl services", "r"); + const char *wifi_manager = detect_wifi_manager(); + FILE *fp; + char buffer[BUFFER_SIZE]; + GtkTreeIter iter; + + if (wifi_manager == NULL) { + // Fallback to macOS WiFi scan + fp = popen("system_profiler SPAirPortDataType | grep 'Network Name:'", "r"); if (fp == NULL) { perror("popen"); return; } - char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof(buffer), fp)) { - if (strstr(buffer, "Wifi")) { - GtkTreeIter iter; + GtkTreeIter iter; + char *network_name = strtok(buffer, ": "); + if (network_name != NULL) { gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); + gtk_tree_store_set(store, &iter, 0, network_name, 1, FALSE, -1); } } pclose(fp); - } else if (is_networkmanager_available()) { - FILE *fp = popen("nmcli -f SSID dev wifi", "r"); + } else if (strcmp(wifi_manager, "connman") == 0) { + // ConnMan + fp = popen("connmanctl services", "r"); if (fp == NULL) { perror("popen"); return; } - char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof(buffer), fp)) { - if (buffer[0] != '\n') { - GtkTreeIter iter; - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); + if (strstr(buffer, "Wifi")) { + char *network_name = strtok(buffer, " \n"); + if (network_name != NULL) { + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, network_name, 1, FALSE, -1); + } } } pclose(fp); - } else if (is_macos()) { - FILE *fp = popen("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", "r"); + } else if (strcmp(wifi_manager, "NetworkManager") == 0) { + // NetworkManager + fp = popen("nmcli -f SSID dev wifi", "r"); if (fp == NULL) { perror("popen"); return; } - char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof(buffer), fp)) { - if (strstr(buffer, "SSID")) { - continue; // Omitir el encabezado + if (strstr(buffer, "SSID")) continue; // Skip header line + char *network_name = strtok(buffer, " \n"); + if (network_name != NULL) { + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, network_name, 1, FALSE, -1); } - GtkTreeIter iter; - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); } pclose(fp); + } else { + g_print("No supported WiFi manager found.\n"); } } -// Muestra un diálogo para ingresar la contraseña y conectar void prompt_for_password_and_connect(const gchar *network_name) { GtkWidget *dialog; GtkWidget *password_entry; GtkWidget *content_area; GtkResponseType result; - dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, - ("Cancel"), GTK_RESPONSE_CANCEL, - ("Connect"), GTK_RESPONSE_ACCEPT, + dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, + "Cancel", GTK_RESPONSE_CANCEL, + "Connect", GTK_RESPONSE_ACCEPT, NULL); content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -97,17 +128,26 @@ void prompt_for_password_and_connect(const gchar *network_name) { if (result == GTK_RESPONSE_ACCEPT) { const gchar *password = gtk_entry_get_text(GTK_ENTRY(password_entry)); + // Connect using connmanctl or nmcli with password char command[BUFFER_SIZE]; - snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); + if (strstr(network_name, "NetworkManager") != NULL) { + snprintf(command, sizeof(command), "nmcli dev wifi connect '%s' password '%s'", network_name, password); + } else { + snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); + } system(command); } gtk_widget_destroy(dialog); } -// Actualiza la configuración de auto-conexión void update_auto_connect_configuration(const gchar *network_name) { + // Placeholder for actual auto-connect configuration char command[BUFFER_SIZE]; - snprintf(command, sizeof(command), "connmanctl enable %s", network_name); + if (strstr(network_name, "NetworkManager") != NULL) { + snprintf(command, sizeof(command), "nmcli connection modify '%s' connection.autoconnect yes", network_name); + } else { + snprintf(command, sizeof(command), "connmanctl enable %s", network_name); + } system(command); } From 8d2f6d6e9b90853905d69b573d236cb3bfb5b34b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 03:55:51 -0400 Subject: [PATCH 05/14] Updates --- src/connman.c | 131 +++++++++++--------------------------------------- src/main.c | 7 +-- 2 files changed, 33 insertions(+), 105 deletions(-) diff --git a/src/connman.c b/src/connman.c index 7b143ab..b221341 100644 --- a/src/connman.c +++ b/src/connman.c @@ -2,108 +2,43 @@ #include #include #include -#include #define BUFFER_SIZE 1024 -// Define function prototypes -void load_saved_networks(GtkTreeStore *store); -void prompt_for_password_and_connect(const gchar *network_name); -void update_auto_connect_configuration(const gchar *network_name); - -// Helper function to detect the WiFi manager -static const char* detect_wifi_manager() { - FILE *fp; - char buffer[BUFFER_SIZE]; - const char *wifi_manager = NULL; +static gboolean check_command(const char *command) { + int ret = system(command); + return (ret == 0); +} - // Check ConnMan - fp = popen("systemctl is-active connman", "r"); - if (fp != NULL) { - if (fgets(buffer, sizeof(buffer), fp) != NULL) { - if (strstr(buffer, "active") != NULL) { - wifi_manager = "connman"; - } - } - pclose(fp); +static void parse_wifi_networks(const char *command, GtkTreeStore *store) { + FILE *fp = popen(command, "r"); + if (fp == NULL) { + perror("popen"); + return; } - // Check NetworkManager - if (wifi_manager == NULL) { - fp = popen("systemctl is-active NetworkManager", "r"); - if (fp != NULL) { - if (fgets(buffer, sizeof(buffer), fp) != NULL) { - if (strstr(buffer, "active") != NULL) { - wifi_manager = "NetworkManager"; - } - } - pclose(fp); + char buffer[BUFFER_SIZE]; + while (fgets(buffer, sizeof(buffer), fp)) { + // Skip lines that don't look like they contain network names + if (strstr(buffer, "SSID") == NULL && buffer[0] != '\0') { + GtkTreeIter iter; + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); } } - return wifi_manager; + pclose(fp); } void load_saved_networks(GtkTreeStore *store) { - const char *wifi_manager = detect_wifi_manager(); - FILE *fp; - char buffer[BUFFER_SIZE]; - GtkTreeIter iter; - - if (wifi_manager == NULL) { - // Fallback to macOS WiFi scan - fp = popen("system_profiler SPAirPortDataType | grep 'Network Name:'", "r"); - if (fp == NULL) { - perror("popen"); - return; - } - - while (fgets(buffer, sizeof(buffer), fp)) { - GtkTreeIter iter; - char *network_name = strtok(buffer, ": "); - if (network_name != NULL) { - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, network_name, 1, FALSE, -1); - } - } - pclose(fp); - } else if (strcmp(wifi_manager, "connman") == 0) { - // ConnMan - fp = popen("connmanctl services", "r"); - if (fp == NULL) { - perror("popen"); - return; - } - - while (fgets(buffer, sizeof(buffer), fp)) { - if (strstr(buffer, "Wifi")) { - char *network_name = strtok(buffer, " \n"); - if (network_name != NULL) { - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, network_name, 1, FALSE, -1); - } - } - } - pclose(fp); - } else if (strcmp(wifi_manager, "NetworkManager") == 0) { - // NetworkManager - fp = popen("nmcli -f SSID dev wifi", "r"); - if (fp == NULL) { - perror("popen"); - return; - } - - while (fgets(buffer, sizeof(buffer), fp)) { - if (strstr(buffer, "SSID")) continue; // Skip header line - char *network_name = strtok(buffer, " \n"); - if (network_name != NULL) { - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, network_name, 1, FALSE, -1); - } - } - pclose(fp); + if (check_command("connmanctl services")) { + parse_wifi_networks("connmanctl services", store); + } else if (check_command("nmcli -f SSID dev wifi")) { + parse_wifi_networks("nmcli -f SSID dev wifi", store); + } else if (check_command("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s")) { + parse_wifi_networks("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", store); } else { - g_print("No supported WiFi manager found.\n"); + fprintf(stderr, "No WiFi scanning tool is available.\n"); } } @@ -114,8 +49,8 @@ void prompt_for_password_and_connect(const gchar *network_name) { GtkResponseType result; dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, - "Cancel", GTK_RESPONSE_CANCEL, - "Connect", GTK_RESPONSE_ACCEPT, + ("Cancel"), GTK_RESPONSE_CANCEL, + ("Connect"), GTK_RESPONSE_ACCEPT, NULL); content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -128,13 +63,9 @@ void prompt_for_password_and_connect(const gchar *network_name) { if (result == GTK_RESPONSE_ACCEPT) { const gchar *password = gtk_entry_get_text(GTK_ENTRY(password_entry)); - // Connect using connmanctl or nmcli with password + // Connect using the appropriate command with the password char command[BUFFER_SIZE]; - if (strstr(network_name, "NetworkManager") != NULL) { - snprintf(command, sizeof(command), "nmcli dev wifi connect '%s' password '%s'", network_name, password); - } else { - snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); - } + snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); system(command); } @@ -144,10 +75,6 @@ void prompt_for_password_and_connect(const gchar *network_name) { void update_auto_connect_configuration(const gchar *network_name) { // Placeholder for actual auto-connect configuration char command[BUFFER_SIZE]; - if (strstr(network_name, "NetworkManager") != NULL) { - snprintf(command, sizeof(command), "nmcli connection modify '%s' connection.autoconnect yes", network_name); - } else { - snprintf(command, sizeof(command), "connmanctl enable %s", network_name); - } + snprintf(command, sizeof(command), "connmanctl enable %s", network_name); system(command); } diff --git a/src/main.c b/src/main.c index 297e4ae..7118a19 100644 --- a/src/main.c +++ b/src/main.c @@ -35,8 +35,7 @@ static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path gtk_tree_model_get(model, &iter, 1, &auto_connect, -1); auto_connect = !auto_connect; - GtkTreeStore *store = GTK_TREE_STORE(model); // Cast the model to GtkTreeStore - gtk_tree_store_set(store, &iter, 1, auto_connect, -1); + gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 1, auto_connect, -1); gtk_tree_path_free(tree_path); @@ -45,7 +44,9 @@ static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path gtk_tree_model_get(model, &iter, 0, &network_name, -1); // Update auto-connect configuration - update_auto_connect_configuration(network_name); + if (auto_connect) { + update_auto_connect_configuration(network_name); + } g_free(network_name); } From 0a30104658312dc50a6ef25c1a1c81c01ca3567a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 03:58:10 -0400 Subject: [PATCH 06/14] Updates --- src/connman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connman.c b/src/connman.c index b221341..d0a411f 100644 --- a/src/connman.c +++ b/src/connman.c @@ -20,7 +20,7 @@ static void parse_wifi_networks(const char *command, GtkTreeStore *store) { char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof(buffer), fp)) { // Skip lines that don't look like they contain network names - if (strstr(buffer, "SSID") == NULL && buffer[0] != '\0') { + if (buffer[0] != '\0' && buffer[0] != '-' && strstr(buffer, "SSID") == NULL) { GtkTreeIter iter; gtk_tree_store_append(store, &iter, NULL); gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); From 85444d27fa9a4af36eec5fd32955cd5ba89d9888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:01:47 -0400 Subject: [PATCH 07/14] Updates --- src/connman.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/connman.c b/src/connman.c index d0a411f..dbcd63b 100644 --- a/src/connman.c +++ b/src/connman.c @@ -19,6 +19,9 @@ static void parse_wifi_networks(const char *command, GtkTreeStore *store) { char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof(buffer), fp)) { + // Debug print to check the buffer content + printf("Buffer: %s", buffer); + // Skip lines that don't look like they contain network names if (buffer[0] != '\0' && buffer[0] != '-' && strstr(buffer, "SSID") == NULL) { GtkTreeIter iter; @@ -65,7 +68,7 @@ void prompt_for_password_and_connect(const gchar *network_name) { const gchar *password = gtk_entry_get_text(GTK_ENTRY(password_entry)); // Connect using the appropriate command with the password char command[BUFFER_SIZE]; - snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); + snprintf(command, sizeof(command), "nmcli dev wifi connect '%s' password '%s'", network_name, password); system(command); } @@ -75,6 +78,6 @@ void prompt_for_password_and_connect(const gchar *network_name) { void update_auto_connect_configuration(const gchar *network_name) { // Placeholder for actual auto-connect configuration char command[BUFFER_SIZE]; - snprintf(command, sizeof(command), "connmanctl enable %s", network_name); + snprintf(command, sizeof(command), "nmcli connection modify '%s' connection.autoconnect yes", network_name); system(command); } From cb6b3ddc8a9bfed09fde8b5712c8787310e69950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:04:22 -0400 Subject: [PATCH 08/14] Updates --- src/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 7118a19..364581f 100644 --- a/src/main.c +++ b/src/main.c @@ -44,9 +44,7 @@ static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path gtk_tree_model_get(model, &iter, 0, &network_name, -1); // Update auto-connect configuration - if (auto_connect) { - update_auto_connect_configuration(network_name); - } + update_auto_connect_configuration(network_name); g_free(network_name); } From cf8ad8d75480592c4d81ff10bc15c0e55d810edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:05:51 -0400 Subject: [PATCH 09/14] Updates --- src/main.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 364581f..e70e6f7 100644 --- a/src/main.c +++ b/src/main.c @@ -5,11 +5,12 @@ #include "connman.h" // Function prototypes -static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview); -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview); +static void on_connect_button_clicked(GtkButton *button, gpointer user_data); +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data); static GtkWidget* create_main_window(); -static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) { +static void on_connect_button_clicked(GtkButton *button, gpointer user_data) { + GtkTreeView *treeview = GTK_TREE_VIEW(user_data); GtkTreeModel *model = gtk_tree_view_get_model(treeview); GtkTreeIter iter; GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); @@ -26,7 +27,8 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) } } -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeView *treeview) { +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data) { + GtkTreeView *treeview = GTK_TREE_VIEW(user_data); GtkTreeModel *model = gtk_tree_view_get_model(treeview); GtkTreeIter iter; GtkTreePath *tree_path = gtk_tree_path_new_from_string(path); @@ -90,7 +92,7 @@ int main(int argc, char *argv[]) { gtk_widget_show_all(window); // Load saved networks - GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window))); + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtk_bin_get_child(GTK_BIN(window))))); load_saved_networks(store); gtk_main(); From a2c658a9d1a0776362f84116eac0ab47d7191742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:09:46 -0400 Subject: [PATCH 10/14] Updates --- src/connman.c | 85 +++++++++++++++++++++++++++++++-------------------- src/main.c | 23 ++++++-------- 2 files changed, 62 insertions(+), 46 deletions(-) diff --git a/src/connman.c b/src/connman.c index dbcd63b..3e7270f 100644 --- a/src/connman.c +++ b/src/connman.c @@ -2,46 +2,67 @@ #include #include #include +#include #define BUFFER_SIZE 1024 -static gboolean check_command(const char *command) { - int ret = system(command); - return (ret == 0); +static gboolean check_command(const char *cmd) { + return system(cmd) == 0; } -static void parse_wifi_networks(const char *command, GtkTreeStore *store) { - FILE *fp = popen(command, "r"); - if (fp == NULL) { - perror("popen"); - return; - } - +void load_saved_networks(GtkTreeStore *store) { + FILE *fp; char buffer[BUFFER_SIZE]; - while (fgets(buffer, sizeof(buffer), fp)) { - // Debug print to check the buffer content - printf("Buffer: %s", buffer); + + // Check if ConnMan is enabled and available + if (check_command("connmanctl services")) { + fp = popen("connmanctl services", "r"); + if (fp == NULL) { + perror("popen"); + return; + } + + while (fgets(buffer, sizeof(buffer), fp)) { + GtkTreeIter iter; + if (strstr(buffer, "Wifi")) { + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); + } + } + + pclose(fp); + } else if (check_command("nmcli -f SSID dev wifi")) { + fp = popen("nmcli -f SSID dev wifi", "r"); + if (fp == NULL) { + perror("popen"); + return; + } - // Skip lines that don't look like they contain network names - if (buffer[0] != '\0' && buffer[0] != '-' && strstr(buffer, "SSID") == NULL) { + while (fgets(buffer, sizeof(buffer), fp)) { GtkTreeIter iter; + if (strstr(buffer, "SSID")) continue; // Skip header line gtk_tree_store_append(store, &iter, NULL); gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); } - } - pclose(fp); -} + pclose(fp); + } else if (access("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport", X_OK) == 0) { + fp = popen("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", "r"); + if (fp == NULL) { + perror("popen"); + return; + } -void load_saved_networks(GtkTreeStore *store) { - if (check_command("connmanctl services")) { - parse_wifi_networks("connmanctl services", store); - } else if (check_command("nmcli -f SSID dev wifi")) { - parse_wifi_networks("nmcli -f SSID dev wifi", store); - } else if (check_command("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s")) { - parse_wifi_networks("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s", store); + while (fgets(buffer, sizeof(buffer), fp)) { + GtkTreeIter iter; + if (strstr(buffer, "SSID")) continue; // Skip header line + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, buffer, 1, FALSE, -1); + } + + pclose(fp); } else { - fprintf(stderr, "No WiFi scanning tool is available.\n"); + fprintf(stderr, "No compatible network manager found.\n"); } } @@ -51,9 +72,9 @@ void prompt_for_password_and_connect(const gchar *network_name) { GtkWidget *content_area; GtkResponseType result; - dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, - ("Cancel"), GTK_RESPONSE_CANCEL, - ("Connect"), GTK_RESPONSE_ACCEPT, + dialog = gtk_dialog_new_with_buttons("Enter Password", NULL, GTK_DIALOG_MODAL, + "Cancel", GTK_RESPONSE_CANCEL, + "Connect", GTK_RESPONSE_ACCEPT, NULL); content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -66,9 +87,8 @@ void prompt_for_password_and_connect(const gchar *network_name) { if (result == GTK_RESPONSE_ACCEPT) { const gchar *password = gtk_entry_get_text(GTK_ENTRY(password_entry)); - // Connect using the appropriate command with the password char command[BUFFER_SIZE]; - snprintf(command, sizeof(command), "nmcli dev wifi connect '%s' password '%s'", network_name, password); + snprintf(command, sizeof(command), "connmanctl connect %s %s", network_name, password); system(command); } @@ -76,8 +96,7 @@ void prompt_for_password_and_connect(const gchar *network_name) { } void update_auto_connect_configuration(const gchar *network_name) { - // Placeholder for actual auto-connect configuration char command[BUFFER_SIZE]; - snprintf(command, sizeof(command), "nmcli connection modify '%s' connection.autoconnect yes", network_name); + snprintf(command, sizeof(command), "connmanctl enable %s", network_name); system(command); } diff --git a/src/main.c b/src/main.c index e70e6f7..77e47a6 100644 --- a/src/main.c +++ b/src/main.c @@ -5,12 +5,11 @@ #include "connman.h" // Function prototypes -static void on_connect_button_clicked(GtkButton *button, gpointer user_data); -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data); +static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview); +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store); static GtkWidget* create_main_window(); -static void on_connect_button_clicked(GtkButton *button, gpointer user_data) { - GtkTreeView *treeview = GTK_TREE_VIEW(user_data); +static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) { GtkTreeModel *model = gtk_tree_view_get_model(treeview); GtkTreeIter iter; GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); @@ -27,23 +26,21 @@ static void on_connect_button_clicked(GtkButton *button, gpointer user_data) { } } -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data) { - GtkTreeView *treeview = GTK_TREE_VIEW(user_data); - GtkTreeModel *model = gtk_tree_view_get_model(treeview); +static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store) { GtkTreeIter iter; GtkTreePath *tree_path = gtk_tree_path_new_from_string(path); - gtk_tree_model_get_iter(model, &iter, tree_path); + gtk_tree_store_get_iter(store, &iter, tree_path); gboolean auto_connect; - gtk_tree_model_get(model, &iter, 1, &auto_connect, -1); + gtk_tree_store_get(store, &iter, 1, &auto_connect, -1); auto_connect = !auto_connect; - gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 1, auto_connect, -1); + gtk_tree_store_set(store, &iter, 1, auto_connect, -1); gtk_tree_path_free(tree_path); // Retrieve network name for auto-connect configuration gchar *network_name; - gtk_tree_model_get(model, &iter, 0, &network_name, -1); + gtk_tree_store_get(store, &iter, 0, &network_name, -1); // Update auto-connect configuration update_auto_connect_configuration(network_name); @@ -72,7 +69,7 @@ static GtkWidget* create_main_window() { GtkTreeViewColumn *toggle_column = gtk_tree_view_column_new_with_attributes("Auto-Connect", toggle_renderer, "active", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), toggle_column); - g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), treeview); + g_signal_connect(toggle_renderer, "toggled", G_CALLBACK(on_auto_connect_toggled), store); gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0); @@ -92,7 +89,7 @@ int main(int argc, char *argv[]) { gtk_widget_show_all(window); // Load saved networks - GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtk_bin_get_child(GTK_BIN(window))))); + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window))); load_saved_networks(store); gtk_main(); From dfd3be8e3f9f1b2e2fb810a6d5100dd2ac3b3287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:10:48 -0400 Subject: [PATCH 11/14] Updates --- src/main.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main.c b/src/main.c index 77e47a6..84d5547 100644 --- a/src/main.c +++ b/src/main.c @@ -29,23 +29,26 @@ static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store) { GtkTreeIter iter; GtkTreePath *tree_path = gtk_tree_path_new_from_string(path); - gtk_tree_store_get_iter(store, &iter, tree_path); + GtkTreeModel *model = GTK_TREE_MODEL(store); gboolean auto_connect; - gtk_tree_store_get(store, &iter, 1, &auto_connect, -1); - auto_connect = !auto_connect; - gtk_tree_store_set(store, &iter, 1, auto_connect, -1); + if (gtk_tree_model_get_iter(model, &iter, tree_path)) { + gtk_tree_model_get(model, &iter, 1, &auto_connect, -1); + auto_connect = !auto_connect; - gtk_tree_path_free(tree_path); + gtk_tree_store_set(store, &iter, 1, auto_connect, -1); - // Retrieve network name for auto-connect configuration - gchar *network_name; - gtk_tree_store_get(store, &iter, 0, &network_name, -1); + gtk_tree_path_free(tree_path); - // Update auto-connect configuration - update_auto_connect_configuration(network_name); + // Retrieve network name for auto-connect configuration + gchar *network_name; + gtk_tree_model_get(model, &iter, 0, &network_name, -1); + + // Update auto-connect configuration + update_auto_connect_configuration(network_name); - g_free(network_name); + g_free(network_name); + } } static GtkWidget* create_main_window() { From 0e733d68596dd6e9509ee2223766e5549e16b26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:12:56 -0400 Subject: [PATCH 12/14] Updates --- src/main.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/src/main.c b/src/main.c index 84d5547..c67ff7a 100644 --- a/src/main.c +++ b/src/main.c @@ -1,13 +1,20 @@ #include -#include #include +#include #include -#include "connman.h" +#include + +#define AIRPORT_PATH "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" -// Function prototypes -static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview); -static void on_auto_connect_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkTreeStore *store); -static GtkWidget* create_main_window(); +static void update_auto_connect_configuration(const gchar *network_name) { + // Implementar configuración de auto-conexión según la red. + printf("Updating auto-connect for network: %s\n", network_name); +} + +static void prompt_for_password_and_connect(const gchar *network_name) { + // Implementar la lógica para pedir la contraseña y conectar a la red. + printf("Prompting for password and connecting to network: %s\n", network_name); +} static void on_connect_button_clicked(GtkButton *button, GtkTreeView *treeview) { GtkTreeModel *model = gtk_tree_view_get_model(treeview); @@ -85,15 +92,64 @@ static GtkWidget* create_main_window() { return window; } +static void scan_wifi_arch() { + FILE *fp = popen("nmcli -f SSID dev wifi", "r"); + if (fp == NULL) { + perror("Failed to run nmcli command"); + return; + } + + char buffer[256]; + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))); + GtkTreeIter iter; + + while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) { + if (buffer[0] != '\0' && buffer[0] != 'S') { // Skip header line + gchar *ssid = strtok(buffer, "\n"); + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, ssid, 1, FALSE, -1); + } + } + + pclose(fp); +} + +static void scan_wifi_macos() { + char buffer[128]; + FILE *fp = popen(AIRPORT_PATH " -s", "r"); + if (fp == NULL) { + perror("Failed to run airport command"); + return; + } + + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))); + GtkTreeIter iter; + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (buffer[0] != '\0' && buffer[0] != 'S') { // Skip header line + gchar *ssid = strtok(buffer, "\n"); + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, ssid, 1, FALSE, -1); + } + } + + pclose(fp); +} + int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window = create_main_window(); gtk_widget_show_all(window); - // Load saved networks - GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(window))); - load_saved_networks(store); + // Detect and scan WiFi networks based on system + if (system("connmanctl services > /dev/null 2>&1") == 0) { + scan_wifi_arch(); // Arch Linux + } else if (system("nmcli -f SSID dev wifi > /dev/null 2>&1") == 0) { + scan_wifi_arch(); // NetworkManager + } else { + scan_wifi_macos(); // macOS + } gtk_main(); return 0; From 8105d16733579da7f7903e642c570d5c2af8ace6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:14:19 -0400 Subject: [PATCH 13/14] Updates --- src/main.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index c67ff7a..7b3a90c 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,8 @@ #define AIRPORT_PATH "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" +static GtkWidget *treeview; // Declarar treeview globalmente para que sea accesible + static void update_auto_connect_configuration(const gchar *network_name) { // Implementar configuración de auto-conexión según la red. printf("Updating auto-connect for network: %s\n", network_name); @@ -66,7 +68,7 @@ static GtkWidget* create_main_window() { GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_add(GTK_CONTAINER(window), vbox); - GtkWidget *treeview = gtk_tree_view_new(); + treeview = gtk_tree_view_new(); GtkTreeStore *store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store)); @@ -92,7 +94,7 @@ static GtkWidget* create_main_window() { return window; } -static void scan_wifi_arch() { +static void scan_wifi_arch(GtkTreeView *treeview) { FILE *fp = popen("nmcli -f SSID dev wifi", "r"); if (fp == NULL) { perror("Failed to run nmcli command"); @@ -100,7 +102,7 @@ static void scan_wifi_arch() { } char buffer[256]; - GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))); + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); GtkTreeIter iter; while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) { @@ -114,7 +116,7 @@ static void scan_wifi_arch() { pclose(fp); } -static void scan_wifi_macos() { +static void scan_wifi_macos(GtkTreeView *treeview) { char buffer[128]; FILE *fp = popen(AIRPORT_PATH " -s", "r"); if (fp == NULL) { @@ -122,7 +124,7 @@ static void scan_wifi_macos() { return; } - GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))); + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); GtkTreeIter iter; while (fgets(buffer, sizeof(buffer), fp) != NULL) { @@ -144,11 +146,11 @@ int main(int argc, char *argv[]) { // Detect and scan WiFi networks based on system if (system("connmanctl services > /dev/null 2>&1") == 0) { - scan_wifi_arch(); // Arch Linux + scan_wifi_arch(GTK_TREE_VIEW(treeview)); // Arch Linux } else if (system("nmcli -f SSID dev wifi > /dev/null 2>&1") == 0) { - scan_wifi_arch(); // NetworkManager + scan_wifi_arch(GTK_TREE_VIEW(treeview)); // NetworkManager } else { - scan_wifi_macos(); // macOS + scan_wifi_macos(GTK_TREE_VIEW(treeview)); // macOS } gtk_main(); From 3bbb00217801a3b6a03e4337dddb637c631d15a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fellipe=20Alfonso=20Gonz=C3=A1lez?= Date: Sun, 21 Jul 2024 04:16:16 -0400 Subject: [PATCH 14/14] Updates --- src/main.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 7b3a90c..7378f36 100644 --- a/src/main.c +++ b/src/main.c @@ -95,7 +95,7 @@ static GtkWidget* create_main_window() { } static void scan_wifi_arch(GtkTreeView *treeview) { - FILE *fp = popen("nmcli -f SSID dev wifi", "r"); + FILE *fp = popen("nmcli -f SSID,IN-USE dev wifi", "r"); if (fp == NULL) { perror("Failed to run nmcli command"); return; @@ -104,18 +104,24 @@ static void scan_wifi_arch(GtkTreeView *treeview) { char buffer[256]; GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); GtkTreeIter iter; + gboolean in_use; while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) { if (buffer[0] != '\0' && buffer[0] != 'S') { // Skip header line - gchar *ssid = strtok(buffer, "\n"); + char *ssid = strtok(buffer, " \n"); + char *in_use_str = strtok(NULL, " \n"); + + in_use = (in_use_str != NULL && strcmp(in_use_str, "[*]") == 0); + gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, ssid, 1, FALSE, -1); + gtk_tree_store_set(store, &iter, 0, ssid, 1, in_use, -1); } } pclose(fp); } + static void scan_wifi_macos(GtkTreeView *treeview) { char buffer[128]; FILE *fp = popen(AIRPORT_PATH " -s", "r");