mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-21 20:12:37 +01:00
storage: Encode SSIDs in file names if necessary
SSIDs with characters other than A-Z0-9_- and space are encoded with l_util_hexstring and prefixed with a = sign to differentiate them.
This commit is contained in:
parent
fc7ca17558
commit
176a5bcf76
@ -33,6 +33,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#include <ell/ell.h>
|
#include <ell/ell.h>
|
||||||
|
|
||||||
@ -167,6 +168,29 @@ error_create_dirs:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *get_network_file_path(const char *type, const char *ssid)
|
||||||
|
{
|
||||||
|
char *path;
|
||||||
|
const char *c;
|
||||||
|
char *hex = NULL;
|
||||||
|
|
||||||
|
for (c = ssid; *c; c++)
|
||||||
|
if (!isalnum(*c) && !strchr("-_ ", *c))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (*c) {
|
||||||
|
hex = l_util_hexstring((const unsigned char *) ssid,
|
||||||
|
strlen(ssid));
|
||||||
|
|
||||||
|
path = l_strdup_printf(STORAGEDIR "/=%s.%s", hex, type);
|
||||||
|
|
||||||
|
l_free(hex);
|
||||||
|
} else
|
||||||
|
path = l_strdup_printf(STORAGEDIR "/%s.%s", ssid, type);
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
struct l_settings *storage_network_open(const char *type, const char *ssid)
|
struct l_settings *storage_network_open(const char *type, const char *ssid)
|
||||||
{
|
{
|
||||||
struct l_settings *settings;
|
struct l_settings *settings;
|
||||||
@ -175,8 +199,7 @@ struct l_settings *storage_network_open(const char *type, const char *ssid)
|
|||||||
if (ssid == NULL || type == NULL)
|
if (ssid == NULL || type == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* TODO: Handle SSID's with filesystem-reserved characters */
|
path = get_network_file_path(type, ssid);
|
||||||
path = l_strdup_printf(STORAGEDIR "/%s.%s", ssid, type);
|
|
||||||
settings = l_settings_new();
|
settings = l_settings_new();
|
||||||
|
|
||||||
l_settings_load_from_file(settings, path);
|
l_settings_load_from_file(settings, path);
|
||||||
@ -193,7 +216,7 @@ int storage_network_touch(const char *type, const char *ssid)
|
|||||||
if (ssid == NULL || type == NULL)
|
if (ssid == NULL || type == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
path = l_strdup_printf(STORAGEDIR "/%s.%s", ssid, type);
|
path = get_network_file_path(type, ssid);
|
||||||
ret = utimensat(0, path, NULL, 0);
|
ret = utimensat(0, path, NULL, 0);
|
||||||
l_free(path);
|
l_free(path);
|
||||||
|
|
||||||
@ -213,7 +236,7 @@ int storage_network_get_mtime(const char *type, const char *ssid,
|
|||||||
if (ssid == NULL || type == NULL)
|
if (ssid == NULL || type == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
path = l_strdup_printf(STORAGEDIR "/%s.%s", ssid, type);
|
path = get_network_file_path(type, ssid);
|
||||||
ret = stat(path, &sb);
|
ret = stat(path, &sb);
|
||||||
l_free(path);
|
l_free(path);
|
||||||
|
|
||||||
@ -234,9 +257,11 @@ void storage_network_sync(const char *type, const char *ssid,
|
|||||||
{
|
{
|
||||||
char *data;
|
char *data;
|
||||||
size_t length = 0;
|
size_t length = 0;
|
||||||
|
char *path;
|
||||||
|
|
||||||
/* TODO: Handle SSID's with filesystem-reserved characters */
|
path = get_network_file_path(type, ssid);
|
||||||
data = l_settings_to_data(settings, &length);
|
data = l_settings_to_data(settings, &length);
|
||||||
write_file(data, length, STORAGEDIR "/%s.%s", ssid, type);
|
write_file(data, length, "%s", path);
|
||||||
l_free(data);
|
l_free(data);
|
||||||
|
l_free(path);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user