===================================================================
@@ -1073,6 +1073,19 @@ typedef enum {
} ObjectPropertyLinkFlags;
/**
+ * object_property_add_alias:
+ * @obj: the object to add a property to
+ * @name: the name of the property
+ * @alias: the alias object
+ * @errp: if an error occurs, a pointer to an area to store the area
+ *
+ * Add a link under obj, named name, pointing to alias.
+ *
+ */
+void object_property_add_alias(Object *obj, const char *name,
+ Object *alias, Error **errp);
+
+/**
* object_property_allow_set_link:
*
* The default implementation of the object_property_add_link() check()
===================================================================
@@ -1023,27 +1023,71 @@ out:
g_free(type);
}
+typedef struct {
+ Object *child;
+ Object **childp;
+ void (*check)(Object *, const char *, Object *, Error **);
+ ObjectPropertyLinkFlags flags;
+} LinkProperty;
+
+static void object_get_alias_property(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ LinkProperty *prop = opaque;
+ Object *child = prop->child;
+ gchar *path;
+
+ path = object_get_canonical_path(child);
+ visit_type_str(v, &path, name, errp);
+ g_free(path);
+}
+
+static void object_release_alias_property(Object *obj, const char *name,
+ void *opaque)
+{
+ LinkProperty *prop = opaque;
+
+ g_free(prop);
+}
+
+void object_property_add_alias(Object *obj, const char *name,
+ Object *alias, Error **errp)
+{
+ Error *local_err = NULL;
+ gchar *type;
+ LinkProperty *prop = g_malloc(sizeof(*prop));
+
+ type = g_strdup_printf("link<%s>", object_get_typename(OBJECT(alias)));
+
+ prop->child = alias;
+ prop->check = NULL;
+ prop->flags = 0;
+
+ object_property_add(obj, name, type, object_get_alias_property, NULL,
+ object_release_alias_property, prop, &local_err);
+ if (local_err) {
+ g_free(prop);
+ error_propagate(errp, local_err);
+ }
+
+ g_free(type);
+}
+
void object_property_allow_set_link(Object *obj, const char *name,
Object *val, Error **errp)
{
/* Allow the link to be set, always */
}
-typedef struct {
- Object **child;
- void (*check)(Object *, const char *, Object *, Error **);
- ObjectPropertyLinkFlags flags;
-} LinkProperty;
-
static void object_get_link_property(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
{
LinkProperty *lprop = opaque;
- Object **child = lprop->child;
+ Object *child = lprop->child;
gchar *path;
- if (*child) {
- path = object_get_canonical_path(*child);
+ if (child) {
+ path = object_get_canonical_path(child);
visit_type_str(v, &path, name, errp);
g_free(path);
} else {
@@ -1096,7 +1140,7 @@ static void object_set_link_property(Obj
{
Error *local_err = NULL;
LinkProperty *prop = opaque;
- Object **child = prop->child;
+ Object **child = prop->childp;
Object *old_target = *child;
Object *new_target = NULL;
char *path = NULL;
@@ -1133,8 +1177,8 @@ static void object_release_link_property
{
LinkProperty *prop = opaque;
- if ((prop->flags & OBJ_PROP_LINK_UNREF_ON_RELEASE) && *prop->child) {
- object_unref(*prop->child);
+ if ((prop->flags & OBJ_PROP_LINK_UNREF_ON_RELEASE) && prop->child) {
+ object_unref(prop->child);
}
g_free(prop);
}
@@ -1150,7 +1194,8 @@ void object_property_add_link(Object *ob
LinkProperty *prop = g_malloc(sizeof(*prop));
gchar *full_type;
- prop->child = child;
+ prop->childp = child;
+ prop->child = *child;
prop->check = check;
prop->flags = flags;
@@ -1227,7 +1272,7 @@ Object *object_resolve_path_component(Ob
if (object_property_is_link(prop)) {
LinkProperty *lprop = prop->opaque;
- return *lprop->child;
+ return lprop->child;
} else if (object_property_is_child(prop)) {
return prop->opaque;
} else {
Allowing addition of a link without keeping pointer-to-pointer. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>