diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 9c58f0bf65..6d4a214281 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -48,6 +48,7 @@ #include "../../runloop.h" #include "../../verbosity.h" #include "../../lakka.h" +#include "../../wifi/wifi_driver.h" typedef struct { @@ -2858,6 +2859,13 @@ static int action_ok_rdb_entry(const char *path, entry_idx, ACTION_OK_DL_RDB_ENTRY); } +static int action_ok_wifi(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + driver_wifi_connect_ssid(idx); + return 0; +} + static int action_ok_content_collection_list(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -3891,6 +3899,9 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, case FILE_TYPE_RDB_ENTRY: BIND_ACTION_OK(cbs, action_ok_rdb_entry); break; + case MENU_WIFI: + BIND_ACTION_OK(cbs, action_ok_wifi); + break; case FILE_TYPE_CURSOR: switch (menu_label_hash) { diff --git a/wifi/drivers/connmanctl.c b/wifi/drivers/connmanctl.c index 1b56b9f501..258b745a5e 100644 --- a/wifi/drivers/connmanctl.c +++ b/wifi/drivers/connmanctl.c @@ -14,6 +14,7 @@ */ #include "../wifi_driver.h" +#include "../../runloop.h" #include #include @@ -56,8 +57,11 @@ static void connmanctl_scan() FILE* serv_file = popen("connmanctl services", "r"); while (fgets (line, 512, serv_file) != NULL) { - //char ssid[20]; - //strlcpy(ssid, line+4, sizeof(ssid)); + size_t len = strlen(line); + if (len > 0 && line[len-1] == '\n') { + line[--len] = '\0'; + } + string_list_append(lines, line, attr); } pclose(serv_file); @@ -84,6 +88,31 @@ static bool connmanctl_ssid_is_online(unsigned i) return line[2] == 'O'; } +static bool connmanctl_connect_ssid(unsigned i) +{ + const char *line = lines->elems[i].data; + char service[128]; + char command[256]; + char ln[512]; + strlcpy(service, line+25, sizeof(service)); + + strlcat(command, "connmanctl connect ", sizeof(command)); + strlcat(command, service, sizeof(command)); + strlcat(command, " 2>&1", sizeof(command)); + + printf("%s\n", command); + + FILE* file = popen(command, "r"); + while (fgets (ln, 512, file) != NULL) + { + printf("%s\n", ln); + runloop_msg_queue_push(ln, 1, 180, true); + } + pclose(file); + + return true; +} + wifi_driver_t wifi_connmanctl = { connmanctl_init, connmanctl_free, @@ -92,5 +121,6 @@ wifi_driver_t wifi_connmanctl = { connmanctl_scan, connmanctl_get_ssids, connmanctl_ssid_is_online, + connmanctl_connect_ssid, "connmanctl", }; diff --git a/wifi/drivers/nullwifi.c b/wifi/drivers/nullwifi.c index c7c4fa65ad..239cd23adf 100644 --- a/wifi/drivers/nullwifi.c +++ b/wifi/drivers/nullwifi.c @@ -51,6 +51,11 @@ static bool nullwifi_ssid_is_online(unsigned i) return false; } +static bool nullwifi_connect_ssid(unsigned i) +{ + return false; +} + wifi_driver_t wifi_null = { nullwifi_init, nullwifi_free, @@ -59,5 +64,6 @@ wifi_driver_t wifi_null = { nullwifi_scan, nullwifi_get_ssids, nullwifi_ssid_is_online, + nullwifi_connect_ssid, "null", }; diff --git a/wifi/wifi_driver.c b/wifi/wifi_driver.c index ccc0ddedb5..a8ae030207 100644 --- a/wifi/wifi_driver.c +++ b/wifi/wifi_driver.c @@ -111,6 +111,11 @@ bool driver_wifi_ssid_is_online(unsigned i) return wifi_driver->ssid_is_online(i); } +bool driver_wifi_connect_ssid(unsigned i) +{ + return wifi_driver->connect_ssid(i); +} + bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data) { settings_t *settings = config_get_ptr(); diff --git a/wifi/wifi_driver.h b/wifi/wifi_driver.h index 9090dd336f..f408374ec8 100644 --- a/wifi/wifi_driver.h +++ b/wifi/wifi_driver.h @@ -56,6 +56,7 @@ typedef struct wifi_driver void (*scan)(); void (*get_ssids)(struct string_list *list); bool (*ssid_is_online)(unsigned i); + bool (*connect_ssid)(unsigned i); const char *ident; } wifi_driver_t; @@ -102,6 +103,8 @@ void driver_wifi_get_ssids(struct string_list *list); bool driver_wifi_ssid_is_online(unsigned i); +bool driver_wifi_connect_ssid(unsigned i); + bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data); RETRO_END_DECLS