From 4ca788c95231709813bbe99220f93b4ef3e9c4ef Mon Sep 17 00:00:00 2001 From: Evgeniy Alexeev Date: Wed, 12 Oct 2022 12:19:45 +0500 Subject: Add host boot commands, pooulate variant functions --- meson.build | 3 ++- src/d_bus.h | 3 +++ src/d_bus_commands.c | 13 ++++++++++-- src/host_commands.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/host_commands.h | 2 ++ src/main.c | 7 +++++- src/power_commands.c | 12 +++++------ 7 files changed, 89 insertions(+), 11 deletions(-) diff --git a/meson.build b/meson.build index fc53052..55d1870 100644 --- a/meson.build +++ b/meson.build @@ -13,7 +13,8 @@ src = [ 'src/d_bus.c', 'src/power_commands.c', 'src/d_bus_commands.c', - 'src/d_bus_variant.c' + 'src/d_bus_variant.c', + 'src/host_commands.c' ] readline = dependency('readline') diff --git a/src/d_bus.h b/src/d_bus.h index d947677..e6be821 100644 --- a/src/d_bus.h +++ b/src/d_bus.h @@ -1,6 +1,8 @@ #ifndef __SD_BUS_COMMANDS_H #define __SD_BUS_COMMANDS_H +#include "d_bus_variant.h" + #ifdef __cplusplus extern "C" { #endif @@ -30,6 +32,7 @@ int cmd_get_string(); int dbus_set_property_string(const string_quadruple_t* path, const char* value); char* dbus_get_property_string(const string_quadruple_t* path ); +int dbus_set_property(const string_quadruple_t* path, dbus_value_variant_t value); #ifdef __cplusplus } #endif diff --git a/src/d_bus_commands.c b/src/d_bus_commands.c index 5cb5767..8ae2351 100644 --- a/src/d_bus_commands.c +++ b/src/d_bus_commands.c @@ -64,6 +64,15 @@ const char* get_dbus_command_member_string(int cmd, const command_dbus_member_t* return NULL; } +const dbus_value_variant_t* get_dbus_command_member_variant(int cmd, const command_dbus_member_t* values) +{ + for(const command_dbus_member_t* current = values; current->member.type != NULL; current++) + { + if(current->command == cmd)return &(current->member); + } + return NULL; +} + const command_dbus_member_t* get_dbus_command_by_member(const char* member, const command_dbus_member_t* values) { for(const command_dbus_member_t* current = values; current->member.type != NULL; current++) @@ -85,9 +94,9 @@ int com_dbus_property( char *arg, const universal_command_t* commands, const com const string_quadruple_t* dbus_power_interface = get_dbus_command_interface(cmd, paths); if(!dbus_power_interface) return -EOPNOTSUPP; - const char* property_val = get_dbus_command_member_string(cmd, values); + const dbus_value_variant_t* property_val = get_dbus_command_member_variant(cmd, values); if(!property_val) return -EOPNOTSUPP; - return dbus_set_property_string(dbus_power_interface, property_val); + return dbus_set_property(dbus_power_interface, *property_val); return 0; } diff --git a/src/host_commands.c b/src/host_commands.c index df2d93a..d832ef8 100644 --- a/src/host_commands.c +++ b/src/host_commands.c @@ -1,3 +1,6 @@ +#include +#include + #include "host_commands.h" static const string_quadruple_t boot_override_type_dbus = { @@ -35,9 +38,64 @@ typedef enum HOST_UNKNOWN=-1, HOST_CD, HOST_USB, - HOST_BIOS, + HOST_BOOT_OVERRIDE, + HOST_BOOT_NO_OVERRIDE, + HOST_BOOT_REGULAR, + HOST_BOOT_BIOS, + HOST_BOOT_SAFE, HOST_ONE_TIME, HOST_CONTINOUS, HOST_LEGACY, HOST_UEFI }host_command_t; + +static universal_command_t host_commands[] = { + { "cd", HOST_CD, "Boot from virtual CD-ROM"}, + { "usb", HOST_USB, "Boot from virtual USB drive"}, + { "override", HOST_BOOT_OVERRIDE, "Override host chosen boot options"}, + { "no-override", HOST_BOOT_NO_OVERRIDE, "Don't override host chosen boot options"}, + { "regular", HOST_BOOT_REGULAR, "Regular boot type"}, + { "bios", HOST_BOOT_BIOS, "Boot into BIOS"}, + { "safe", HOST_BOOT_SAFE, "Boot in safe mode"}, + { "override-once", HOST_ONE_TIME, "Override only next boot"}, + { "override-always", HOST_CONTINOUS, "Override always"}, + { "legacy", HOST_LEGACY, "Legacy type boot"}, + { "uefi", HOST_UEFI, "UEFI boot"}, + { NULL, 0, NULL } +}; + +static const command_dbus_path_t host_command_paths[] = { + { HOST_CD, &boot_override_source_dbus }, + { HOST_USB, &boot_override_source_dbus }, + { HOST_BOOT_OVERRIDE, &boot_override_enable_dbus }, + { HOST_BOOT_NO_OVERRIDE, &boot_override_enable_dbus }, + { HOST_BOOT_REGULAR, &boot_override_mode_dbus }, + { HOST_BOOT_BIOS, &boot_override_mode_dbus }, + { HOST_BOOT_SAFE, &boot_override_mode_dbus }, + { HOST_ONE_TIME, &boot_override_once_dbus }, + { HOST_CONTINOUS, &boot_override_once_dbus }, + { HOST_LEGACY, &boot_override_type_dbus }, + { HOST_UEFI, &boot_override_type_dbus }, + { 0, NULL } +}; + +static const command_dbus_member_t host_command_values[] = { + { HOST_CD, { .type="s", .string="xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"}}, + { HOST_USB, { .type="s", .string="xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia"}}, + { HOST_BOOT_OVERRIDE, { .type="b", .boolean=true}}, + { HOST_BOOT_NO_OVERRIDE, { .type="b", .boolean=false}}, + { HOST_BOOT_REGULAR, { .type="s", .string="xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"}}, + { HOST_BOOT_BIOS, { .type="s", .string="xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"}}, + { HOST_BOOT_SAFE,{ .type="s", .string="xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"}}, + { HOST_ONE_TIME, { .type="b", .boolean=true}}, + { HOST_CONTINOUS, { .type="b", .boolean=false}}, + { HOST_LEGACY, { .type="s", .string="xyz.openbmc_project.Control.Boot.Type.Types.Legacy"} }, + { HOST_UEFI, { .type="s", .string="xyz.openbmc_project.Control.Boot.Type.Types.EFI"} }, + { 0, {.type=NULL, .integer=0}} +}; + +int com_boot( char *arg ) +{ + //if(strcmp(arg, "status")==0)return power_status(); + return com_dbus_property(arg, host_commands, host_command_paths, host_command_values); +} diff --git a/src/host_commands.h b/src/host_commands.h index 4bb5e3f..daafda4 100644 --- a/src/host_commands.h +++ b/src/host_commands.h @@ -3,4 +3,6 @@ #include "d_bus_commands.h" +int com_boot( char *arg ); + #endif // HOST_COMMANDS_H diff --git a/src/main.c b/src/main.c index 529436c..bef33f5 100644 --- a/src/main.c +++ b/src/main.c @@ -21,7 +21,8 @@ #include #include #include -#include +#include + char *progname; /* The name of this program, as taken from argv[0]. */ int done; /* When non-zero, this global means the user is done using this program. */ @@ -162,6 +163,7 @@ COMMAND server_admin_list[] = { { "?", com_help, "Synonym for `help'" }, { "power", com_power, "Return to top menu" }, { "restore-policy", com_power_policy, "Set power restore policy" }, + { "boot", com_boot, "Set host boot options" }, { "..", com_top, "Return to top menu" }, { "quit", com_quit, "Quit using SILA Shell" }, { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } @@ -172,6 +174,7 @@ COMMAND server_operator_list[] = { { "?", com_help, "Synonym for `help'" }, { "power", com_power, "Run on/off/reset" }, { "restore-policy", com_power_policy, "Set power restore policy" }, + { "boot", com_boot, "Set host boot options" }, { "..", com_top, "Return to top menu" }, { "quit", com_quit, "Quit using SILA Shell" }, { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } @@ -182,11 +185,13 @@ COMMAND server_user_list[] = { { "?", com_help, "Synonym for `help'" }, { "power", com_power, "Return to top menu" }, { "restore-policy", com_power_policy, "Set power restore policy" }, + { "boot", com_boot, "Set host boot options" }, { "..", com_top, "Return to top menu" }, { "quit", com_quit, "Quit using SILA Shell" }, { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } }; + COMMAND_LIST server = {"server", NULL}; COMMAND_LIST *current; diff --git a/src/power_commands.c b/src/power_commands.c index 3e63e23..e91b31d 100644 --- a/src/power_commands.c +++ b/src/power_commands.c @@ -37,7 +37,7 @@ typedef enum POWER_RESET_FORCE }power_command_t; -const command_dbus_path_t power_command_paths[] = { +static const command_dbus_path_t power_command_paths[] = { { POWER_ON_GRACEFUL, &host_dbus }, { POWER_ON_FORCE, &host_dbus }, { POWER_OFF_GRACEFUL, &host_dbus }, @@ -47,7 +47,7 @@ const command_dbus_path_t power_command_paths[] = { { 0, NULL } }; -const command_dbus_member_t power_command_values[] = { +static const command_dbus_member_t power_command_values[] = { { POWER_ON_GRACEFUL, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.On" }}, { POWER_ON_FORCE, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.On" }}, { POWER_OFF_GRACEFUL, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.Off" }}, @@ -67,7 +67,7 @@ typedef enum }power_policy_command_t; -universal_command_t power_commands[] = { +static universal_command_t power_commands[] = { { "on-graceful", POWER_ON_GRACEFUL, "Graceful Power On" }, { "on", POWER_ON_GRACEFUL, "Graceful Power On" }, { "on-force", POWER_ON_FORCE, "Force Power On" }, @@ -80,21 +80,21 @@ universal_command_t power_commands[] = { { NULL, 0, NULL } }; -const universal_command_t power_policy_commands[] = { +static const universal_command_t power_policy_commands[] = { {"always-on", POWER_POLICY_ON, "Server is always ON"}, {"always-off", POWER_POLICY_OFF, "Server is always ON"}, {"restore", POWER_POLICY_RESTORE, "Server restores previous state"}, { NULL, 0, NULL } }; -const command_dbus_path_t power_command_policy_paths[] = { +static const command_dbus_path_t power_command_policy_paths[] = { { POWER_POLICY_ON, &policy_dbus }, { POWER_POLICY_OFF, &policy_dbus }, { POWER_POLICY_RESTORE, &policy_dbus }, { 0, NULL } }; -const command_dbus_member_t power_command_policy_values[] = { +static const command_dbus_member_t power_command_policy_values[] = { { POWER_POLICY_ON, {.type="s", .string="xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn" }}, { POWER_POLICY_OFF, {.type="s", .string="xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff" }}, { POWER_POLICY_RESTORE, {.type="s", .string="xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore" }}, -- cgit v1.2.3