static gboolean handle_create_osname (RPMOSTreeSysroot *object, GDBusMethodInvocation *invocation, const gchar *osname) { RpmostreedSysroot *self = RPMOSTREED_SYSROOT (object); GError *error = NULL; g_autofree gchar *dbus_path = NULL; if (!ostree_sysroot_ensure_initialized (self->ot_sysroot, self->cancellable, &error)) goto out; if (strchr (osname, '/') != 0) { g_set_error_literal (&error, RPM_OSTREED_ERROR, RPM_OSTREED_ERROR_FAILED, "Invalid osname"); goto out; } if (!ostree_sysroot_init_osname (self->ot_sysroot, osname, self->cancellable, &error)) goto out; dbus_path = rpmostreed_generate_object_path (BASE_DBUS_PATH, osname, NULL); rpmostree_sysroot_complete_create_osname (RPMOSTREE_SYSROOT (self), invocation, g_strdup (dbus_path)); out: if (error) g_dbus_method_invocation_take_error (invocation, error); return TRUE; }
RPMOSTreeOSExperimental * rpmostreed_osexperimental_new (OstreeSysroot *sysroot, OstreeRepo *repo, const char *name, RpmostreedTransactionMonitor *monitor) { RpmostreedOSExperimental *obj = NULL; g_autofree char *path = NULL; g_return_val_if_fail (OSTREE_IS_SYSROOT (sysroot), NULL); g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (RPMOSTREED_IS_TRANSACTION_MONITOR (monitor), NULL); path = rpmostreed_generate_object_path (BASE_DBUS_PATH, name, NULL); obj = g_object_new (RPMOSTREED_TYPE_OSEXPERIMENTAL, NULL); /* FIXME Make this a construct-only property? */ obj->transaction_monitor = g_object_ref (monitor); rpmostreed_daemon_publish (rpmostreed_daemon_get (), path, FALSE, obj); return RPMOSTREE_OSEXPERIMENTAL (obj); }
static gboolean sysroot_populate_deployments_unlocked (RpmostreedSysroot *self, gboolean *out_changed, GError **error) { gboolean ret = FALSE; OstreeDeployment *booted = NULL; /* owned by sysroot */ g_autofree gchar *booted_id = NULL; g_autoptr(GPtrArray) deployments = NULL; g_autoptr(GHashTable) seen_osnames = NULL; GHashTableIter iter; gpointer hashkey; gpointer value; GVariantBuilder builder; guint i; gboolean sysroot_changed; gboolean repo_changed; struct stat repo_new_stat; if (!ostree_sysroot_load_if_changed (self->ot_sysroot, &sysroot_changed, self->cancellable, error)) goto out; if (fstat (ostree_repo_get_dfd (self->repo), &repo_new_stat) < 0) { glnx_set_error_from_errno (error); goto out; } repo_changed = !(self->repo_last_stat.st_mtim.tv_sec == repo_new_stat.st_mtim.tv_sec && self->repo_last_stat.st_mtim.tv_nsec == repo_new_stat.st_mtim.tv_nsec); if (repo_changed) self->repo_last_stat = repo_new_stat; if (!(sysroot_changed || repo_changed)) { ret = TRUE; if (out_changed) *out_changed = FALSE; goto out; } g_debug ("loading deployments"); g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); seen_osnames = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); /* Updated booted property */ booted = ostree_sysroot_get_booted_deployment (self->ot_sysroot); if (booted) { const gchar *os = ostree_deployment_get_osname (booted); g_autofree gchar *path = rpmostreed_generate_object_path (BASE_DBUS_PATH, os, NULL); rpmostree_sysroot_set_booted (RPMOSTREE_SYSROOT (self), path); booted_id = rpmostreed_deployment_generate_id (booted); } else { rpmostree_sysroot_set_booted (RPMOSTREE_SYSROOT (self), "/"); } /* Add deployment interfaces */ deployments = ostree_sysroot_get_deployments (self->ot_sysroot); for (i = 0; deployments != NULL && i < deployments->len; i++) { GVariant *variant; OstreeDeployment *deployment = deployments->pdata[i]; const char *deployment_os; variant = rpmostreed_deployment_generate_variant (deployment, booted_id, self->repo, error); if (!variant) goto out; g_variant_builder_add_value (&builder, variant); deployment_os = ostree_deployment_get_osname (deployment); /* Have we not seen this osname instance before? If so, add it * now. */ if (!g_hash_table_contains (self->os_interfaces, deployment_os)) { RPMOSTreeOS *obj = rpmostreed_os_new (self->ot_sysroot, self->repo, deployment_os, self->transaction_monitor); g_hash_table_insert (self->os_interfaces, g_strdup (deployment_os), obj); } /* Owned by deployment, hash lifetime is smaller */ g_hash_table_add (seen_osnames, (char*)deployment_os); } /* Remove dead os paths */ g_hash_table_iter_init (&iter, self->os_interfaces); while (g_hash_table_iter_next (&iter, &hashkey, &value)) { if (!g_hash_table_contains (seen_osnames, hashkey)) { g_object_run_dispose (G_OBJECT (value)); g_hash_table_iter_remove (&iter); } } rpmostree_sysroot_set_deployments (RPMOSTREE_SYSROOT (self), g_variant_builder_end (&builder)); g_debug ("finished deployments"); ret = TRUE; if (out_changed) *out_changed = TRUE; out: return ret; }