summaryrefslogtreecommitdiff
path: root/src/NetworkManagerUtils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/NetworkManagerUtils.c')
-rw-r--r--src/NetworkManagerUtils.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 24a6f952cb..4ca8bc89b6 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -1419,6 +1419,85 @@ nm_match_spec_split (const char *value)
return g_slist_reverse (pieces);
}
+/**
+ * nm_match_spec_join:
+ * @specs: the device specs to join
+ *
+ * This is based on g_key_file_parse_string_as_value(), analog to
+ * nm_match_spec_split() which is based on g_key_file_parse_value_as_string().
+ *
+ * Returns: (transfer-full): a joined list of device specs that can be
+ * split again with nm_match_spec_split(). Note that
+ * nm_match_spec_split (nm_match_spec_join (specs)) yields the original
+ * result (which is not true the other way around because there are multiple
+ * ways to encode the same joined specs string).
+ */
+char *
+nm_match_spec_join (GSList *specs)
+{
+ const char *p;
+ GString *str;
+
+ str = g_string_new ("");
+
+ for (; specs; specs = specs->next) {
+ p = specs->data;
+
+ if (!p || !*p)
+ continue;
+
+ if (str->len > 0)
+ g_string_append_c (str, ',');
+
+ /* escape leading whitespace */
+ switch (*p) {
+ case ' ':
+ g_string_append (str, "\\s");
+ p++;
+ break;
+ case '\t':
+ g_string_append (str, "\\t");
+ p++;
+ break;
+ }
+
+ for (; *p; p++) {
+ switch (*p) {
+ case '\n':
+ g_string_append (str, "\\n");
+ break;
+ case '\r':
+ g_string_append (str, "\\r");
+ break;
+ case '\\':
+ g_string_append (str, "\\\\");
+ break;
+ case ',':
+ g_string_append (str, "\\,");
+ break;
+ case ';':
+ g_string_append (str, "\\;");
+ break;
+ default:
+ g_string_append_c (str, *p);
+ break;
+ }
+ }
+
+ /* escape trailing whitespaces */
+ switch (str->str[str->len - 1]) {
+ case ' ':
+ g_string_overwrite (str, str->len - 1, "\\s");
+ break;
+ case '\t':
+ g_string_overwrite (str, str->len - 1, "\\t");
+ break;
+ }
+ }
+
+ return g_string_free (str, FALSE);
+}
+
const char *
nm_utils_get_shared_wifi_permission (NMConnection *connection)
{