key-file: Add support for non ini style config files

In some cases me way want to parse key=value style config files from
outside of plymouth which lack ini style groups.

This commit adds a new ply_key_file_load_groupless_file function which
supports loading such files. When a file is loaded this way, NULL must
be passed as group_name for subsequent ply_key_file_get_* calls.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Hans de Goede 2019-09-28 22:31:38 +02:00
parent eb73c37c0d
commit c00955ce03
2 changed files with 25 additions and 0 deletions

View file

@ -60,6 +60,7 @@ struct _ply_key_file
FILE *fp;
ply_hashtable_t *groups;
ply_key_file_group_t *groupless_group;
};
typedef struct
@ -152,6 +153,8 @@ ply_key_file_free (ply_key_file_t *key_file)
ply_key_file_free_group,
NULL);
if (key_file->groupless_group)
ply_key_file_free_group (NULL, key_file->groupless_group, NULL);
ply_hashtable_free (key_file->groups);
free (key_file->filename);
@ -303,6 +306,9 @@ static ply_key_file_group_t *
ply_key_file_find_group (ply_key_file_t *key_file,
const char *group_name)
{
if (!group_name)
return key_file->groupless_group;
return ply_hashtable_lookup (key_file->groups, (void *) group_name);
}
@ -463,4 +469,18 @@ ply_key_file_foreach_entry (ply_key_file_t *key_file,
&func_data);
}
bool
ply_key_file_load_groupless_file (ply_key_file_t *key_file)
{
if (!ply_key_file_open_file (key_file))
return false;
key_file->groupless_group =
ply_key_file_load_group (key_file, "NONE");
ply_key_file_close_file (key_file);
return key_file->groupless_group != NULL;
}
/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */

View file

@ -36,6 +36,11 @@ typedef void (ply_key_file_foreach_func_t) (const char *group_name,
ply_key_file_t *ply_key_file_new (const char *filename);
void ply_key_file_free (ply_key_file_t *key_file);
bool ply_key_file_load (ply_key_file_t *key_file);
/* For loading key=value pair files, which do not have ini style groups.
* When a file is loaded this way, NULL must be passed as group_name
* for subsequent ply_key_file_get_* calls.
*/
bool ply_key_file_load_groupless_file (ply_key_file_t *key_file);
bool ply_key_file_has_key (ply_key_file_t *key_file,
const char *group_name,
const char *key);