summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorDaniel Playfair Cal <daniel.playfair.cal@gmail.com>2020-01-06 12:29:12 +1100
committerDaniel Playfair Cal <daniel.playfair.cal@gmail.com>2020-12-19 12:39:35 +1100
commit658af7018a349eb925503f920a3c6b5a948b0cc1 (patch)
tree91c9ec8cc96d11a3cad6f4c595ef7ab3a112f9ac /service
parentd23b3fddd62cf5310c7f8869663ddb1c54c192dc (diff)
downloaddconf-658af7018a349eb925503f920a3c6b5a948b0cc1.tar.gz
move dconf-gvdb-utils from service into common
Diffstat (limited to 'service')
-rw-r--r--service/dconf-gvdb-utils.c219
-rw-r--r--service/dconf-gvdb-utils.h33
-rw-r--r--service/dconf-writer.c2
-rw-r--r--service/meson.build7
4 files changed, 4 insertions, 257 deletions
diff --git a/service/dconf-gvdb-utils.c b/service/dconf-gvdb-utils.c
deleted file mode 100644
index d77ae97..0000000
--- a/service/dconf-gvdb-utils.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright © 2010 Codethink Limited
- * Copyright © 2012 Canonical Limited
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the licence, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Ryan Lortie <desrt@desrt.ca>
- */
-
-#include "config.h"
-
-#include "dconf-gvdb-utils.h"
-
-#include "../common/dconf-paths.h"
-#include "../gvdb/gvdb-builder.h"
-#include "../gvdb/gvdb-reader.h"
-
-#include <errno.h>
-#include <glib.h>
-#include <glib/gstdio.h>
-#include <string.h>
-
-DConfChangeset *
-dconf_gvdb_utils_read_and_back_up_file (const gchar *filename,
- gboolean *file_missing,
- GError **error)
-{
- DConfChangeset *database;
- GError *my_error = NULL;
- GvdbTable *table = NULL;
- gchar *contents;
- gsize size;
-
- if (g_file_get_contents (filename, &contents, &size, &my_error))
- {
- GBytes *bytes;
-
- bytes = g_bytes_new_take (contents, size);
- table = gvdb_table_new_from_bytes (bytes, FALSE, &my_error);
- g_bytes_unref (bytes);
- }
-
- /* It is perfectly fine if the file does not exist -- then it's
- * just empty.
- */
- if (g_error_matches (my_error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
- g_clear_error (&my_error);
-
- /* Otherwise, we should report errors to prevent ourselves from
- * overwriting the database in other situations...
- */
- if (g_error_matches (my_error, G_FILE_ERROR, G_FILE_ERROR_INVAL))
- {
- /* Move the database to a backup file, warn and continue with a new
- * database. The alternative is erroring out and exiting the daemon,
- * which leaves the user’s session essentially unusable.
- *
- * The code to find an unused backup filename is racy, but this is an
- * error handling path. Who cares. */
- g_autofree gchar *backup_filename = NULL;
- guint i;
-
- for (i = 0;
- i < G_MAXUINT &&
- (backup_filename == NULL || g_file_test (backup_filename, G_FILE_TEST_EXISTS));
- i++)
- {
- g_free (backup_filename);
- backup_filename = g_strdup_printf ("%s~%u", filename, i);
- }
-
- if (g_rename (filename, backup_filename) != 0)
- g_warning ("Error renaming corrupt database from ‘%s’ to ‘%s’: %s",
- filename, backup_filename, g_strerror (errno));
- else
- g_warning ("Database ‘%s’ was corrupt: moved it to ‘%s’ and created an empty replacement",
- filename, backup_filename);
-
- g_clear_error (&my_error);
- }
- else if (my_error)
- {
- g_propagate_prefixed_error (error, my_error, "Cannot open dconf database: ");
- return NULL;
- }
-
- /* Only allocate once we know we are in a non-error situation */
- database = dconf_changeset_new_database (NULL);
-
- /* Fill the table up with the initial state */
- if (table != NULL)
- {
- gchar **names;
- gsize n_names;
- gsize i;
-
- names = gvdb_table_get_names (table, &n_names);
- for (i = 0; i < n_names; i++)
- {
- if (dconf_is_key (names[i], NULL))
- {
- GVariant *value;
-
- value = gvdb_table_get_value (table, names[i]);
-
- if (value != NULL)
- {
- dconf_changeset_set (database, names[i], value);
- g_variant_unref (value);
- }
- }
-
- g_free (names[i]);
- }
-
- gvdb_table_free (table);
- g_free (names);
- }
-
- if (file_missing)
- *file_missing = (table == NULL);
-
- return database;
-}
-
-static GvdbItem *
-dconf_gvdb_utils_get_parent (GHashTable *table,
- const gchar *key)
-{
- GvdbItem *grandparent, *parent;
- gchar *parent_name;
- gint len;
-
- if (g_str_equal (key, "/"))
- return NULL;
-
- len = strlen (key);
- if (key[len - 1] == '/')
- len--;
-
- while (key[len - 1] != '/')
- len--;
-
- parent_name = g_strndup (key, len);
- parent = g_hash_table_lookup (table, parent_name);
-
- if (parent == NULL)
- {
- parent = gvdb_hash_table_insert (table, parent_name);
-
- grandparent = dconf_gvdb_utils_get_parent (table, parent_name);
-
- if (grandparent != NULL)
- gvdb_item_set_parent (parent, grandparent);
- }
-
- g_free (parent_name);
-
- return parent;
-}
-
-static gboolean
-dconf_gvdb_utils_add_key (const gchar *path,
- GVariant *value,
- gpointer user_data)
-{
- GHashTable *gvdb = user_data;
- GvdbItem *item;
-
- g_assert (g_hash_table_lookup (gvdb, path) == NULL);
- item = gvdb_hash_table_insert (gvdb, path);
- gvdb_item_set_parent (item, dconf_gvdb_utils_get_parent (gvdb, path));
- gvdb_item_set_value (item, value);
-
- return TRUE;
-}
-
-gboolean
-dconf_gvdb_utils_write_file (const gchar *filename,
- DConfChangeset *database,
- GError **error)
-{
- GHashTable *gvdb;
- gboolean success;
-
- gvdb = gvdb_hash_table_new (NULL, NULL);
- dconf_changeset_all (database, dconf_gvdb_utils_add_key, gvdb);
- success = gvdb_table_write_contents (gvdb, filename, FALSE, error);
-
- if (!success)
- {
- gchar *dirname;
-
- /* Maybe it failed because the directory doesn't exist. Try
- * again, after mkdir().
- */
- dirname = g_path_get_dirname (filename);
- g_mkdir_with_parents (dirname, 0700);
- g_free (dirname);
-
- g_clear_error (error);
- success = gvdb_table_write_contents (gvdb, filename, FALSE, error);
- }
-
- g_hash_table_unref (gvdb);
-
- return success;
-}
diff --git a/service/dconf-gvdb-utils.h b/service/dconf-gvdb-utils.h
deleted file mode 100644
index 7076781..0000000
--- a/service/dconf-gvdb-utils.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright © 2010 Codethink Limited
- * Copyright © 2012 Canonical Limited
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the licence, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Ryan Lortie <desrt@desrt.ca>
- */
-
-#ifndef __dconf_gvdb_utils_h__
-#define __dconf_gvdb_utils_h__
-
-#include "../common/dconf-changeset.h"
-
-DConfChangeset * dconf_gvdb_utils_read_and_back_up_file (const gchar *filename,
- gboolean *file_missing,
- GError **error);
-gboolean dconf_gvdb_utils_write_file (const gchar *filename,
- DConfChangeset *database,
- GError **error);
-
-#endif /* __dconf_gvdb_utils_h__ */
diff --git a/service/dconf-writer.c b/service/dconf-writer.c
index 4d054c8..438c77b 100644
--- a/service/dconf-writer.c
+++ b/service/dconf-writer.c
@@ -23,7 +23,7 @@
#include "dconf-writer.h"
#include "../shm/dconf-shm.h"
-#include "dconf-gvdb-utils.h"
+#include "../common/dconf-gvdb-utils.h"
#include "dconf-generated.h"
#include "dconf-blame.h"
diff --git a/service/meson.build b/service/meson.build
index 19fe670..51e3090 100644
--- a/service/meson.build
+++ b/service/meson.build
@@ -12,7 +12,6 @@ configure_file(
lib_sources = [
'dconf-blame.c',
- 'dconf-gvdb-utils.c',
'dconf-keyfile-writer.c',
'dconf-service.c',
'dconf-shm-writer.c',
@@ -36,7 +35,7 @@ libdconf_service = static_library(
sources: lib_sources,
include_directories: top_inc,
c_args: dconf_c_args,
- dependencies: gio_unix_dep,
+ dependencies: [gio_unix_dep, libdconf_common_dep],
link_with: [
libdconf_common,
libdconf_shm,
@@ -46,7 +45,7 @@ libdconf_service = static_library(
libdconf_service_dep = declare_dependency(
link_with: libdconf_service,
- dependencies: gio_unix_dep,
+ dependencies: [gio_unix_dep, libdconf_common_dep],
sources: dconf_generated,
)
@@ -55,7 +54,7 @@ dconf_service = executable(
sources,
include_directories: top_inc,
c_args: dconf_c_args,
- dependencies: gio_unix_dep,
+ dependencies: [gio_unix_dep, libdconf_common_dep],
link_with: libdconf_service,
install: true,
install_dir: dconf_libexecdir,