mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-26 18:59:22 +01:00
storage: Add storage_network_ssid_from_path
The operation opposite to get_network_file_path.
This commit is contained in:
parent
11f23d500c
commit
b6c9508912
@ -37,6 +37,7 @@
|
||||
|
||||
#include <ell/ell.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "storage.h"
|
||||
|
||||
#ifdef TEMP_FAILURE_RETRY
|
||||
@ -191,6 +192,63 @@ static char *get_network_file_path(const char *type, const char *ssid)
|
||||
return path;
|
||||
}
|
||||
|
||||
char *storage_network_ssid_from_path(const char *path, enum security *type)
|
||||
{
|
||||
const char *filename = strrchr(path, '/');
|
||||
const char *c, *end;
|
||||
char *decoded;
|
||||
static char buf[67];
|
||||
|
||||
if (filename)
|
||||
filename++; /* Skip the / */
|
||||
else
|
||||
filename = path;
|
||||
|
||||
end = strchr(filename, '.');
|
||||
|
||||
if (!end || !security_from_str(end + 1, type))
|
||||
return NULL;
|
||||
|
||||
if (filename[0] != '=') {
|
||||
if (end == filename || end - filename > 32)
|
||||
return NULL;
|
||||
|
||||
for (c = filename; c < end; c++)
|
||||
if (!isalnum(*c) && !strchr("-_ ", *c))
|
||||
break;
|
||||
|
||||
if (c < end)
|
||||
return NULL;
|
||||
|
||||
memcpy(buf, filename, end - filename);
|
||||
buf[end - filename] = '\0';
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
if (end - filename <= 1 || end - filename > 65)
|
||||
return NULL;
|
||||
|
||||
memcpy(buf, filename + 1, end - filename - 1);
|
||||
buf[end - filename - 1] = '0';
|
||||
buf[end - filename + 0] = '0';
|
||||
buf[end - filename + 1] = '\0';
|
||||
|
||||
decoded = (char *) l_util_from_hexstring(buf, NULL);
|
||||
if (!decoded)
|
||||
return NULL;
|
||||
|
||||
if (!l_utf8_validate(decoded, (end - filename) / 2, NULL)) {
|
||||
l_free(decoded);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strcpy(buf, decoded);
|
||||
l_free(decoded);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
struct l_settings *storage_network_open(const char *type, const char *ssid)
|
||||
{
|
||||
struct l_settings *settings;
|
||||
|
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
struct l_settings;
|
||||
enum security;
|
||||
|
||||
int create_dirs(const char *filename);
|
||||
|
||||
@ -30,6 +31,8 @@ ssize_t read_file(void *buffer, size_t len, const char *path_fmt, ...)
|
||||
ssize_t write_file(const void *buffer, size_t len, const char *path_fmt, ...)
|
||||
__attribute__((format(printf, 3, 4)));
|
||||
|
||||
char *storage_network_ssid_from_path(const char *path, enum security *type);
|
||||
|
||||
struct l_settings *storage_network_open(const char *type, const char *ssid);
|
||||
int storage_network_touch(const char *type, const char *ssid);
|
||||
int storage_network_get_mtime(const char *type, const char *ssid,
|
||||
|
Loading…
Reference in New Issue
Block a user