summaryrefslogtreecommitdiff
path: root/src/settings/plugins/keyfile/nms-keyfile-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings/plugins/keyfile/nms-keyfile-reader.c')
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-reader.c54
1 files changed, 49 insertions, 5 deletions
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;