Allow connecting wifi networks

This commit is contained in:
Jean-André Santoni 2016-09-22 16:44:51 +02:00 committed by twinaphex
parent cd0ec01928
commit 714db40fa0
5 changed files with 57 additions and 2 deletions

View File

@ -48,6 +48,7 @@
#include "../../runloop.h" #include "../../runloop.h"
#include "../../verbosity.h" #include "../../verbosity.h"
#include "../../lakka.h" #include "../../lakka.h"
#include "../../wifi/wifi_driver.h"
typedef struct typedef struct
{ {
@ -2858,6 +2859,13 @@ static int action_ok_rdb_entry(const char *path,
entry_idx, ACTION_OK_DL_RDB_ENTRY); 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, static int action_ok_content_collection_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx) 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: case FILE_TYPE_RDB_ENTRY:
BIND_ACTION_OK(cbs, action_ok_rdb_entry); BIND_ACTION_OK(cbs, action_ok_rdb_entry);
break; break;
case MENU_WIFI:
BIND_ACTION_OK(cbs, action_ok_wifi);
break;
case FILE_TYPE_CURSOR: case FILE_TYPE_CURSOR:
switch (menu_label_hash) switch (menu_label_hash)
{ {

View File

@ -14,6 +14,7 @@
*/ */
#include "../wifi_driver.h" #include "../wifi_driver.h"
#include "../../runloop.h"
#include <file/file_path.h> #include <file/file_path.h>
#include <compat/strl.h> #include <compat/strl.h>
@ -56,8 +57,11 @@ static void connmanctl_scan()
FILE* serv_file = popen("connmanctl services", "r"); FILE* serv_file = popen("connmanctl services", "r");
while (fgets (line, 512, serv_file) != NULL) while (fgets (line, 512, serv_file) != NULL)
{ {
//char ssid[20]; size_t len = strlen(line);
//strlcpy(ssid, line+4, sizeof(ssid)); if (len > 0 && line[len-1] == '\n') {
line[--len] = '\0';
}
string_list_append(lines, line, attr); string_list_append(lines, line, attr);
} }
pclose(serv_file); pclose(serv_file);
@ -84,6 +88,31 @@ static bool connmanctl_ssid_is_online(unsigned i)
return line[2] == 'O'; 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 = { wifi_driver_t wifi_connmanctl = {
connmanctl_init, connmanctl_init,
connmanctl_free, connmanctl_free,
@ -92,5 +121,6 @@ wifi_driver_t wifi_connmanctl = {
connmanctl_scan, connmanctl_scan,
connmanctl_get_ssids, connmanctl_get_ssids,
connmanctl_ssid_is_online, connmanctl_ssid_is_online,
connmanctl_connect_ssid,
"connmanctl", "connmanctl",
}; };

View File

@ -51,6 +51,11 @@ static bool nullwifi_ssid_is_online(unsigned i)
return false; return false;
} }
static bool nullwifi_connect_ssid(unsigned i)
{
return false;
}
wifi_driver_t wifi_null = { wifi_driver_t wifi_null = {
nullwifi_init, nullwifi_init,
nullwifi_free, nullwifi_free,
@ -59,5 +64,6 @@ wifi_driver_t wifi_null = {
nullwifi_scan, nullwifi_scan,
nullwifi_get_ssids, nullwifi_get_ssids,
nullwifi_ssid_is_online, nullwifi_ssid_is_online,
nullwifi_connect_ssid,
"null", "null",
}; };

View File

@ -111,6 +111,11 @@ bool driver_wifi_ssid_is_online(unsigned i)
return wifi_driver->ssid_is_online(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) bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data)
{ {
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();

View File

@ -56,6 +56,7 @@ typedef struct wifi_driver
void (*scan)(); void (*scan)();
void (*get_ssids)(struct string_list *list); void (*get_ssids)(struct string_list *list);
bool (*ssid_is_online)(unsigned i); bool (*ssid_is_online)(unsigned i);
bool (*connect_ssid)(unsigned i);
const char *ident; const char *ident;
} wifi_driver_t; } 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_ssid_is_online(unsigned i);
bool driver_wifi_connect_ssid(unsigned i);
bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data); bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data);
RETRO_END_DECLS RETRO_END_DECLS