Greenbone Vulnerability Management Libraries  10.0.0
settings.c
Go to the documentation of this file.
1 /* Copyright (C) 2010-2019 Greenbone Networks GmbH
2  *
3  * SPDX-License-Identifier: GPL-2.0-or-later
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
25 #include "settings.h"
26 
27 #include <stdio.h>
28 #include <string.h> /* for strlen */
29 
39 int
40 settings_init_from_file (settings_t *settings, const gchar *filename,
41  const gchar *group)
42 {
43  GError *error = NULL;
44 
45  if (filename == NULL || group == NULL)
46  return -1;
47 
48  gchar *contents = NULL;
49 
50  if (!g_file_get_contents (filename, &contents, NULL, &error))
51  {
52  g_error_free (error);
53  return -1;
54  }
55 
56  if (contents != NULL)
57  {
58  gchar *contents_with_group = g_strjoin ("\n", "[Misc]", contents, NULL);
59  settings->key_file = g_key_file_new ();
60 
61  if (!g_key_file_load_from_data (
62  settings->key_file, contents_with_group,
63  strlen (contents_with_group),
64  G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error))
65  {
66  g_warning ("Failed to load configuration from %s: %s", filename,
67  error->message);
68  g_error_free (error);
69  g_free (contents_with_group);
70  g_free (contents);
71  return -1;
72  }
73  g_free (contents_with_group);
74  g_free (contents);
75  }
76 
77  settings->group_name = g_strdup (group);
78  settings->file_name = g_strdup (filename);
79 
80  return 0;
81 }
82 
88 void
90 {
91  g_free (settings->group_name);
92  g_free (settings->file_name);
93  g_key_file_free (settings->key_file);
94 }
95 
105 int
107  const gchar *filename, const gchar *group)
108 {
109  int ret;
110  gsize keys_length;
111  GError *error = NULL;
112 
113  ret = settings_init_from_file (&iterator->settings, filename, group);
114  if (ret)
115  return ret;
116 
117  iterator->keys = g_key_file_get_keys (iterator->settings.key_file, group,
118  &keys_length, &error);
119 
120  if (iterator->keys == NULL)
121  {
122  if (error)
123  {
124  g_warning ("Failed to retrieve keys of group %s from %s: %s", group,
125  filename, error->message);
126  g_error_free (error);
127  }
128  g_key_file_free (iterator->settings.key_file);
129  return -1;
130  }
131 
132  iterator->current_key = iterator->keys - 1;
133  iterator->last_key = iterator->keys + keys_length - 1;
134 
135  return 0;
136 }
137 
143 void
145 {
146  g_strfreev (iterator->keys);
147  settings_cleanup (&iterator->settings);
148 }
149 
157 gboolean
159 {
160  if (iterator->current_key == iterator->last_key)
161  return FALSE;
162  iterator->current_key++;
163  return TRUE;
164 }
165 
173 const gchar *
175 {
176  return *iterator->current_key;
177 }
178 
186 const gchar *
188 {
189  return g_key_file_get_value (iterator->settings.key_file,
190  iterator->settings.group_name,
191  *iterator->current_key, NULL);
192 }
const gchar * settings_iterator_name(settings_iterator_t *iterator)
Get the name from a settings iterator.
Definition: settings.c:174
GKeyFile * key_file
Definition: settings.h:40
gboolean settings_iterator_next(settings_iterator_t *iterator)
Increment an iterator.
Definition: settings.c:158
void settings_cleanup(settings_t *settings)
Cleanup a settings structure.
Definition: settings.c:89
Struct holding options for settings taken from a key-value config file.
Definition: settings.h:36
gchar ** current_key
Definition: settings.h:53
Struct holding options to iterate over a GKeyFile.
Definition: settings.h:49
gchar ** last_key
Definition: settings.h:54
void cleanup_settings_iterator(settings_iterator_t *iterator)
Cleanup a settings iterator.
Definition: settings.c:144
gchar * file_name
Definition: settings.h:38
const gchar * settings_iterator_value(settings_iterator_t *iterator)
Get the value from a settings iterator.
Definition: settings.c:187
gchar * group_name
Definition: settings.h:39
Protos and data structures for configuration file management.
int init_settings_iterator_from_file(settings_iterator_t *iterator, const gchar *filename, const gchar *group)
Initialise a settings iterator from a file.
Definition: settings.c:106
int settings_init_from_file(settings_t *settings, const gchar *filename, const gchar *group)
Initialise a settings struct from a file.
Definition: settings.c:40
settings_t settings
Definition: settings.h:52