/*
* Copyright © 2017 Red Hat, Inc
*
* This program 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.1 of the License, 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 .
*
* Authors:
* Christian J. Kellner
*/
#include "config.h"
#include "boltctl-cmds.h"
#include "boltctl-uidfmt.h"
#include "bolt-str.h"
#include
/* domain related commands */
static void
print_domain (BoltDomain *domain, gboolean verbose)
{
g_auto(GStrv) bootacl = NULL;
const char *tree_branch;
const char *tree_right;
const char *tree_cont;
const char *tree_space;
const char *uid;
const char *name;
const char *syspath;
const char *security;
BoltSecurity sl;
gboolean online;
gboolean iommu;
tree_branch = bolt_glyph (TREE_BRANCH);
tree_right = bolt_glyph (TREE_RIGHT);
tree_cont = bolt_glyph (TREE_VERTICAL);
tree_space = bolt_glyph (TREE_SPACE);
uid = bolt_domain_get_uid (domain);
name = bolt_domain_get_id (domain);
sl = bolt_domain_get_security (domain);
syspath = bolt_domain_get_syspath (domain);
security = bolt_security_to_string (sl);
bootacl = bolt_domain_get_bootacl (domain);
online = syspath != NULL;
if (online)
{
g_print (" %s%s%s ",
bolt_color (ANSI_GREEN),
bolt_glyph (BLACK_CIRCLE),
bolt_color (ANSI_NORMAL));
}
else
{
g_print (" %s ", bolt_glyph (WHITE_CIRCLE));
}
g_print ("%s %s", (name ? : "domain"), format_uid (uid));
g_print ("\n");
if (verbose)
g_print (" %s online: %s\n", tree_branch, bolt_yesno (online));
if (verbose && syspath != NULL)
g_print (" %s syspath: %s\n", tree_branch, syspath);
if (bootacl)
{
guint acl_max = g_strv_length ((char **) bootacl);
guint used = 0;
guint i;
for (i = 0; i < acl_max; i++)
if (!bolt_strzero (bootacl[i]))
used++;
g_print (" %s bootacl: %u/%u\n", tree_branch, used, acl_max);
for (i = 0; i < acl_max; i++)
{
const char *tree_sym = used > 1 ? tree_branch : tree_right;
if (bolt_strzero (bootacl[i]))
continue;
g_print (" %s %s[%u]", tree_cont, tree_sym, i);
g_print (" %s\n", format_uid (bootacl[i]));
used--;
}
}
iommu = bolt_domain_has_iommu (domain);
g_print (" %s security: ", tree_right);
if (bolt_security_is_interactive (sl) && iommu)
g_print ("iommu+%s", security);
else if (bolt_security_allows_pcie (sl) && iommu)
g_print ("iommu");
else
g_print ("%s", security);
g_print ("\n");
if (verbose)
{
g_print (" %s %s iommu: %s\n", tree_space, tree_branch,
bolt_yesno (iommu));
g_print (" %s %s level: %s\n", tree_space, tree_right,
security);
}
g_print ("\n");
}
int
list_domains (BoltClient *client, int argc, char **argv)
{
g_autoptr(GOptionContext) optctx = NULL;
g_autoptr(GError) err = NULL;
g_autoptr(GPtrArray) domains = NULL;
gboolean details = FALSE;
GOptionEntry options[] = {
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &details, "Show more details", NULL },
{ NULL }
};
optctx = g_option_context_new ("- List thunderbolt domains");
g_option_context_add_main_entries (optctx, options, NULL);
if (!g_option_context_parse (optctx, &argc, &argv, &err))
return usage_error (err);
domains = bolt_client_list_domains (client, NULL, &err);
if (domains == NULL)
{
g_warning ("Could not list domains: %s", err->message);
domains = g_ptr_array_new_with_free_func (g_object_unref);
}
for (guint i = 0; i < domains->len; i++)
{
BoltDomain *dom = g_ptr_array_index (domains, i);
print_domain (dom, details);
}
return EXIT_SUCCESS;
}