summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-10-21 16:05:14 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-10-21 16:05:14 +0200
commited02522335e0496a7ce29d8ffa707d5ad880f3a4 (patch)
tree04c474b991d6da25cc8f28f8b58bec63b72ed3e3
parent2617ee896fec1216241075ab9c0ac48c86c50957 (diff)
downloadNetworkManager-ed02522335e0496a7ce29d8ffa707d5ad880f3a4.tar.gz
checkpoint: export list of checkpoints
-rw-r--r--src/nm-checkpoint-manager.c53
-rw-r--r--src/nm-checkpoint-manager.h2
2 files changed, 54 insertions, 1 deletions
diff --git a/src/nm-checkpoint-manager.c b/src/nm-checkpoint-manager.c
index 5db5c324f8..7f1a8db863 100644
--- a/src/nm-checkpoint-manager.c
+++ b/src/nm-checkpoint-manager.c
@@ -31,6 +31,10 @@
#include "nm-utils.h"
#include "nm-utils/c-list.h"
+NM_GOBJECT_PROPERTIES_DEFINE (NMCheckpointManager,
+ PROP_CHECKPOINTS,
+);
+
typedef struct {
NMManager *_manager;
GHashTable *checkpoints;
@@ -95,6 +99,7 @@ rollback_timeout_cb (NMCheckpointManager *self)
GHashTableIter iter;
GVariant *result;
gint64 ts, now;
+ gboolean removed = FALSE;
now = nm_utils_get_monotonic_timestamp_ms ();
@@ -106,12 +111,16 @@ rollback_timeout_cb (NMCheckpointManager *self)
if (result)
g_variant_unref (result);
g_hash_table_iter_remove (&iter);
+ removed = TRUE;
}
}
priv->rollback_timeout_id = 0;
update_rollback_timeout (self);
+ if (removed)
+ _notify (self, PROP_CHECKPOINTS);
+
return G_SOURCE_REMOVE;
}
@@ -233,6 +242,7 @@ nm_checkpoint_manager_create (NMCheckpointManager *self,
item))
g_return_val_if_reached (NULL);
+ _notify (self, PROP_CHECKPOINTS);
update_rollback_timeout (self);
return checkpoint;
@@ -248,6 +258,7 @@ nm_checkpoint_manager_destroy_all (NMCheckpointManager *self,
priv = NM_CHECKPOINT_MANAGER_GET_PRIVATE (self);
g_hash_table_remove_all (priv->checkpoints);
+ _notify (self, PROP_CHECKPOINTS);
return TRUE;
}
@@ -268,7 +279,9 @@ nm_checkpoint_manager_destroy (NMCheckpointManager *self,
if (!nm_streq (checkpoint_path, "/")) {
ret = g_hash_table_remove (priv->checkpoints, checkpoint_path);
- if (!ret) {
+ if (ret) {
+ _notify (self, PROP_CHECKPOINTS);
+ } else {
g_set_error (error,
NM_MANAGER_ERROR,
NM_MANAGER_ERROR_INVALID_ARGUMENTS,
@@ -304,11 +317,40 @@ nm_checkpoint_manager_rollback (NMCheckpointManager *self,
*results = nm_checkpoint_rollback (item->checkpoint);
g_hash_table_remove (priv->checkpoints, checkpoint_path);
+ _notify (self, PROP_CHECKPOINTS);
return TRUE;
}
/*****************************************************************************/
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ NMCheckpointManager *self = NM_CHECKPOINT_MANAGER (object);
+ NMCheckpointManagerPrivate *priv = NM_CHECKPOINT_MANAGER_GET_PRIVATE (self);
+ CheckpointItem *item;
+ char **strv;
+ guint num, i = 0;
+ CList *iter;
+
+ switch (prop_id) {
+ case PROP_CHECKPOINTS:
+ num = g_hash_table_size (priv->checkpoints);
+ strv = g_new (char *, num + 1);
+ c_list_for_each (iter, &priv->list) {
+ item = c_list_entry (iter, CheckpointItem, list);
+ strv[i++] = g_strdup (nm_exported_object_get_path (NM_EXPORTED_OBJECT (item->checkpoint)));
+ }
+ nm_assert (i == num);
+ strv[i] = NULL;
+ g_value_take_boxed (value, strv);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
static void
nm_checkpoint_manager_init (NMCheckpointManager *self)
@@ -357,5 +399,14 @@ nm_checkpoint_manager_class_init (NMCheckpointManagerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ obj_properties[PROP_CHECKPOINTS] =
+ g_param_spec_boxed (NM_CHECKPOINT_MANAGER_CHECKPOINTS, "", "",
+ G_TYPE_STRV,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
+
object_class->dispose = dispose;
+ object_class->get_property = get_property;
}
diff --git a/src/nm-checkpoint-manager.h b/src/nm-checkpoint-manager.h
index 6ad792682d..4d1224dea4 100644
--- a/src/nm-checkpoint-manager.h
+++ b/src/nm-checkpoint-manager.h
@@ -31,6 +31,8 @@
#define NM_IS_CHECKPOINT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CHECKPOINT_MANAGER))
#define NM_CHECKPOINT_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CHECKPOINT_MANAGER, NMCheckpointManagerClass))
+#define NM_CHECKPOINT_MANAGER_CHECKPOINTS "checkpoints"
+
typedef struct _NMCheckpointManagerClass NMCheckpointManagerClass;
typedef struct _NMCheckpointManager NMCheckpointManager;