summaryrefslogtreecommitdiff
path: root/src/settings/plugins/keyfile
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings/plugins/keyfile')
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-connection.c7
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-connection.h3
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-plugin.c2
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-reader.c54
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-reader.h6
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-writer.c5
-rw-r--r--src/settings/plugins/keyfile/tests/test-keyfile.c1
7 files changed, 67 insertions, 11 deletions
diff --git a/src/settings/plugins/keyfile/nms-keyfile-connection.c b/src/settings/plugins/keyfile/nms-keyfile-connection.c
index 12467b2e20..7511f206ad 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-connection.c
+++ b/src/settings/plugins/keyfile/nms-keyfile-connection.c
@@ -124,6 +124,7 @@ nms_keyfile_connection_init (NMSKeyfileConnection *connection)
NMSKeyfileConnection *
nms_keyfile_connection_new (NMConnection *source,
const char *full_path,
+ const char *profile_dir,
GError **error)
{
GObject *object;
@@ -131,13 +132,15 @@ nms_keyfile_connection_new (NMConnection *source,
const char *uuid;
gboolean update_unsaved = TRUE;
- g_assert (source || full_path);
+ nm_assert (source || full_path);
+ nm_assert (!full_path || full_path[0] == '/');
+ nm_assert (!profile_dir || profile_dir[0] == '/');
/* If we're given a connection already, prefer that instead of re-reading */
if (source)
tmp = g_object_ref (source);
else {
- tmp = nms_keyfile_reader_from_file (full_path, error);
+ tmp = nms_keyfile_reader_from_file (full_path, profile_dir, error);
if (!tmp)
return NULL;
diff --git a/src/settings/plugins/keyfile/nms-keyfile-connection.h b/src/settings/plugins/keyfile/nms-keyfile-connection.h
index f96d7590f0..0773ced0c0 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-connection.h
+++ b/src/settings/plugins/keyfile/nms-keyfile-connection.h
@@ -37,7 +37,8 @@ typedef struct _NMSKeyfileConnectionClass NMSKeyfileConnectionClass;
GType nms_keyfile_connection_get_type (void);
NMSKeyfileConnection *nms_keyfile_connection_new (NMConnection *source,
- const char *filename,
+ const char *full_path,
+ const char *profile_dir,
GError **error);
#endif /* __NMS_KEYFILE_CONNECTION_H__ */
diff --git a/src/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/settings/plugins/keyfile/nms-keyfile-plugin.c
index 3bb872ca27..b3a15ebd5f 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-plugin.c
+++ b/src/settings/plugins/keyfile/nms-keyfile-plugin.c
@@ -195,7 +195,7 @@ update_connection (NMSKeyfilePlugin *self,
return FALSE;
}
- connection_new = nms_keyfile_connection_new (source, full_path, &local);
+ connection_new = nms_keyfile_connection_new (source, full_path, nms_keyfile_utils_get_path (), &local);
if (!connection_new) {
/* Error; remove the connection */
if (source)
diff --git a/src/settings/plugins/keyfile/nms-keyfile-reader.c b/src/settings/plugins/keyfile/nms-keyfile-reader.c
index 4d61ebb45d..f417e4325f 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-reader.c
+++ b/src/settings/plugins/keyfile/nms-keyfile-reader.c
@@ -103,33 +103,77 @@ _handler_read (GKeyFile *keyfile,
NMConnection *
nms_keyfile_reader_from_keyfile (GKeyFile *key_file,
const char *filename,
+ const char *base_dir,
+ const char *profile_dir,
gboolean verbose,
GError **error)
{
+ NMConnection *connection;
HandlerReadData data = {
.verbose = verbose,
};
+ gs_free char *base_dir_free = NULL;
+ gs_free char *profile_filename_free = NULL;
+ const char *profile_filename = NULL;
+
+ nm_assert (filename && filename[0]);
+ nm_assert (!base_dir || base_dir[0] == '/');
+ nm_assert (!profile_dir || profile_dir[0] == '/');
+
+ if (base_dir)
+ nm_assert (!strchr (filename, '/'));
+ else {
+ const char *s;
+
+ nm_assert (filename[0] == '/');
+
+ /* @base_dir may be NULL, in which case @filename must be an absolute path,
+ * and the directory is taken as the @base_dir. */
+ s = strrchr (filename, '/');
+ base_dir = nm_strndup_a (255, filename, s - filename, &base_dir_free);
+ if ( !profile_dir
+ || nm_streq (base_dir, profile_dir))
+ profile_filename = filename;
+ filename = &s[1];
+ }
+
+ connection = nm_keyfile_read (key_file, base_dir, _handler_read, &data, error);
+ if (!connection)
+ return NULL;
+
+ nm_keyfile_read_ensure_id (connection, filename);
- return nm_keyfile_read (key_file, filename, NULL, _handler_read, &data, error);
+ if (!profile_filename) {
+ profile_filename_free = g_build_filename (profile_dir ?: base_dir, filename, NULL);
+ profile_filename = profile_filename_free;
+ }
+ nm_keyfile_read_ensure_uuid (connection, profile_filename);
+
+ return connection;
}
NMConnection *
-nms_keyfile_reader_from_file (const char *filename, GError **error)
+nms_keyfile_reader_from_file (const char *full_filename,
+ const char *profile_dir,
+ GError **error)
{
gs_unref_keyfile GKeyFile *key_file = NULL;
NMConnection *connection = NULL;
GError *verify_error = NULL;
- if (!nms_keyfile_utils_check_file_permissions (filename,
+ nm_assert (full_filename && full_filename[0] == '/');
+ nm_assert (!profile_dir || profile_dir[0] == '/');
+
+ if (!nms_keyfile_utils_check_file_permissions (full_filename,
NULL,
error))
return NULL;
key_file = g_key_file_new ();
- if (!g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, error))
+ if (!g_key_file_load_from_file (key_file, full_filename, G_KEY_FILE_NONE, error))
return NULL;
- connection = nms_keyfile_reader_from_keyfile (key_file, filename, TRUE, error);
+ connection = nms_keyfile_reader_from_keyfile (key_file, full_filename, NULL, profile_dir, TRUE, error);
if (!connection)
return NULL;
diff --git a/src/settings/plugins/keyfile/nms-keyfile-reader.h b/src/settings/plugins/keyfile/nms-keyfile-reader.h
index b60c1e691d..c0fb06d19e 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-reader.h
+++ b/src/settings/plugins/keyfile/nms-keyfile-reader.h
@@ -26,9 +26,13 @@
NMConnection *nms_keyfile_reader_from_keyfile (GKeyFile *key_file,
const char *filename,
+ const char *base_dir,
+ const char *profile_dir,
gboolean verbose,
GError **error);
-NMConnection *nms_keyfile_reader_from_file (const char *filename, GError **error);
+NMConnection *nms_keyfile_reader_from_file (const char *full_filename,
+ const char *profile_dir,
+ GError **error);
#endif /* __NMS_KEYFILE_READER_H__ */
diff --git a/src/settings/plugins/keyfile/nms-keyfile-writer.c b/src/settings/plugins/keyfile/nms-keyfile-writer.c
index 569be76731..6b7c0019c5 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-writer.c
+++ b/src/settings/plugins/keyfile/nms-keyfile-writer.c
@@ -172,6 +172,7 @@ _handler_write (NMConnection *connection,
static gboolean
_internal_write_connection (NMConnection *connection,
const char *keyfile_dir,
+ const char *profile_dir,
uid_t owner_uid,
pid_t owner_grp,
const char *existing_path,
@@ -308,7 +309,7 @@ _internal_write_connection (NMConnection *connection,
gs_unref_object NMConnection *reread = NULL;
gboolean reread_same = FALSE;
- reread = nms_keyfile_reader_from_keyfile (key_file, path, FALSE, NULL);
+ reread = nms_keyfile_reader_from_keyfile (key_file, path, NULL, profile_dir, FALSE, NULL);
nm_assert (NM_IS_CONNECTION (reread));
@@ -358,6 +359,7 @@ nms_keyfile_writer_connection (NMConnection *connection,
return _internal_write_connection (connection,
keyfile_dir,
+ nms_keyfile_utils_get_path (),
0, 0,
existing_path,
force_rename,
@@ -379,6 +381,7 @@ nms_keyfile_writer_test_connection (NMConnection *connection,
{
return _internal_write_connection (connection,
keyfile_dir,
+ keyfile_dir,
owner_uid, owner_grp,
NULL,
FALSE,
diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c
index 3cdbd17762..6b5fe90f0b 100644
--- a/src/settings/plugins/keyfile/tests/test-keyfile.c
+++ b/src/settings/plugins/keyfile/tests/test-keyfile.c
@@ -73,6 +73,7 @@ check_ip_route (NMSettingIPConfig *config, int idx, const char *destination, int
g_assert (full_filename && full_filename[0] == '/'); \
\
_connection = nms_keyfile_reader_from_file (full_filename, \
+ NULL, \
(nmtst_get_rand_int () % 2) ? &_error : NULL); \
nmtst_assert_success (_connection, _error); \
nmtst_assert_connection_verifies_without_normalization (_connection); \