From 21c36beefd0304a600a2f781a60559f647d569fb Mon Sep 17 00:00:00 2001 From: Evgeniy Alexeev Date: Mon, 10 Oct 2022 19:07:45 +0500 Subject: Begin to add variant type --- meson.build | 3 ++- src/d_bus.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-- src/d_bus_commands.c | 25 ++++++++++++++++------ src/d_bus_commands.h | 10 ++++++--- src/d_bus_variant.c | 10 +++++++++ src/d_bus_variant.h | 20 ++++++++++++++++++ src/host_commands.c | 46 +++++++++++++++++++++++++++++++++++----- src/power_commands.c | 22 ++++++++++---------- 8 files changed, 167 insertions(+), 28 deletions(-) create mode 100644 src/d_bus_variant.c create mode 100644 src/d_bus_variant.h diff --git a/meson.build b/meson.build index cf2a685..fc53052 100644 --- a/meson.build +++ b/meson.build @@ -12,7 +12,8 @@ src = [ 'src/users.c', 'src/d_bus.c', 'src/power_commands.c', - 'src/d_bus_commands.c' + 'src/d_bus_commands.c', + 'src/d_bus_variant.c' ] readline = dependency('readline') diff --git a/src/d_bus.c b/src/d_bus.c index ab6b658..76a84fc 100644 --- a/src/d_bus.c +++ b/src/d_bus.c @@ -2,11 +2,13 @@ #include #include #include +#include #include -#include -#include +#include "utils.h" +#include "d_bus_variant.h" +#include "d_bus.h" int dbus_set_property_string(const string_quadruple_t* path, const char* value) @@ -41,6 +43,59 @@ int dbus_set_property_string(const string_quadruple_t* path, const char* value) return (r>0?(0):(r)); } +int dbus_set_property(const string_quadruple_t* path, dbus_value_variant_t value) +{ + _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_bus_message_unref_ sd_bus_message *m = NULL; + _cleanup_bus_unref_ sd_bus *bus = NULL; + + int r; + + /* Connect to the system bus */ + r = sd_bus_open_system(&bus); + if (r >= 0) + { + + if(strcmp(value.type, "s") ==0 ) + { + + r = sd_bus_set_property( + bus, + path->first, + path->second, + path->third, + path->fourth, + &error, + value.type, + value.string); + } + else if(strcmp(value.type, "b") ==0 ) + { + + r = sd_bus_set_property( + bus, + path->first, + path->second, + path->third, + path->fourth, + &error, + value.type, + value.boolean); + } + else { + fprintf(stderr, "Failed to find type: %s\n", value.type); + return -EOPNOTSUPP; + } + } + if (r < 0) + { + fprintf(stderr, "Failed to issue dbus call: %d %s\n", r, error.message); + } + + return (r>0?(0):(r)); +} + + char* dbus_get_property_string(const string_quadruple_t* path ) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; diff --git a/src/d_bus_commands.c b/src/d_bus_commands.c index c7878a6..5cb5767 100644 --- a/src/d_bus_commands.c +++ b/src/d_bus_commands.c @@ -3,6 +3,7 @@ #include #include "d_bus_commands.h" +#include void print_command_help(const universal_command_t* cmds) { @@ -43,20 +44,32 @@ const string_quadruple_t* get_dbus_command_interface(int cmd, const command_dbus return NULL; } -const char* get_dbus_command_member(int cmd, const command_dbus_member_t* values) + +const dbus_value_variant_t* get_dbus_command_member(int cmd, const command_dbus_member_t* values) { - for(const command_dbus_member_t* current = values; current->member!=NULL; current++) + for(const command_dbus_member_t* current = values; current->member.type != NULL; current++) { - if(current->command == cmd)return current->member; + if(current->command == cmd)return &(current->member); + } + return NULL; +} + + +const char* get_dbus_command_member_string(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 dbus_variant_get_string(&(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!=NULL; current++) + for(const command_dbus_member_t* current = values; current->member.type != NULL; current++) { - if(strcmp(member, current->member) == 0 )return current; + + if(strcmp(member, dbus_variant_get_string(¤t->member)) == 0 )return current; } return NULL; } @@ -72,7 +85,7 @@ 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(cmd, values); + const char* property_val = get_dbus_command_member_string(cmd, values); if(!property_val) return -EOPNOTSUPP; return dbus_set_property_string(dbus_power_interface, property_val); diff --git a/src/d_bus_commands.h b/src/d_bus_commands.h index 35eee6b..51ad2fe 100644 --- a/src/d_bus_commands.h +++ b/src/d_bus_commands.h @@ -1,9 +1,10 @@ #ifndef D_BUS_COMMANDS_H #define D_BUS_COMMANDS_H - +#include #include "d_bus.h" +#include "d_bus_variant.h" #ifdef __cplusplus extern "C" { @@ -16,10 +17,12 @@ typedef struct const string_quadruple_t * path; }command_dbus_path_t; + + typedef struct { int command; - const char* member; + dbus_value_variant_t member; }command_dbus_member_t; typedef struct @@ -31,7 +34,8 @@ typedef struct int parse_command2enum(const char* command, const universal_command_t* cmds); const string_quadruple_t* get_dbus_command_interface(int cmd, const command_dbus_path_t* pathes); -const char* get_dbus_command_member(int cmd, const command_dbus_member_t* values); +const char* get_dbus_command_member_string(int cmd, const command_dbus_member_t* values); +const dbus_value_variant_t* get_dbus_command_member(int cmd, const command_dbus_member_t* values); int com_dbus_property( char *arg, const universal_command_t* commands, const command_dbus_path_t* paths, const command_dbus_member_t* values); void print_command_help(const universal_command_t* cmds); const command_dbus_member_t* get_dbus_command_by_member(const char* member, const command_dbus_member_t* values); diff --git a/src/d_bus_variant.c b/src/d_bus_variant.c new file mode 100644 index 0000000..6218a49 --- /dev/null +++ b/src/d_bus_variant.c @@ -0,0 +1,10 @@ +#include +#include + +#include "d_bus_variant.h" + +const char* dbus_variant_get_string(const dbus_value_variant_t* val) +{ + if(strcmp(val->type, "s"))return NULL; + return val->string; +} diff --git a/src/d_bus_variant.h b/src/d_bus_variant.h new file mode 100644 index 0000000..e4f261b --- /dev/null +++ b/src/d_bus_variant.h @@ -0,0 +1,20 @@ +#ifndef D_BUS_VARIANT_H +#define D_BUS_VARIANT_H + +#include + +typedef struct +{ + //dbus coded type letter + const char* type; + union + { + const char* string; + int integer; + bool boolean; + }; +}dbus_value_variant_t; + +const char* dbus_variant_get_string(const dbus_value_variant_t* val); + +#endif // D_BUS_VARIANT_H diff --git a/src/host_commands.c b/src/host_commands.c index 6687f02..df2d93a 100644 --- a/src/host_commands.c +++ b/src/host_commands.c @@ -1,7 +1,43 @@ #include "host_commands.h" -static const string_quadruple_t chassis_dbus = { - "xyz.openbmc_project.State.Chassis", - "/xyz/openbmc_project/state/chassis0", - "xyz.openbmc_project.State.Chassis", - "RequestedPowerTransition"}; +static const string_quadruple_t boot_override_type_dbus = { + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/boot", + "xyz.openbmc_project.Control.Boot.Type", + "BootType"}; + +static const string_quadruple_t boot_override_mode_dbus = { + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/boot", + "xyz.openbmc_project.Control.Boot.Mode", + "BootMode"}; + +static const string_quadruple_t boot_override_source_dbus = { + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/boot", + "xyz.openbmc_project.Control.Boot.Source", + "BootSource"}; + +static const string_quadruple_t boot_override_enable_dbus = { + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/boot", + "xyz.openbmc_project.Object.Enable", + "Enabled"}; + +static const string_quadruple_t boot_override_once_dbus = { + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/boot/one_time", + "xyz.openbmc_project.Object.Enable", + "Enabled"}; + +typedef enum +{ + HOST_UNKNOWN=-1, + HOST_CD, + HOST_USB, + HOST_BIOS, + HOST_ONE_TIME, + HOST_CONTINOUS, + HOST_LEGACY, + HOST_UEFI +}host_command_t; diff --git a/src/power_commands.c b/src/power_commands.c index c811e19..3e63e23 100644 --- a/src/power_commands.c +++ b/src/power_commands.c @@ -48,13 +48,13 @@ const command_dbus_path_t power_command_paths[] = { }; const command_dbus_member_t power_command_values[] = { - { POWER_ON_GRACEFUL, "xyz.openbmc_project.State.Host.Transition.On" }, - { POWER_ON_FORCE, "xyz.openbmc_project.State.Host.Transition.On" }, - { POWER_OFF_GRACEFUL, "xyz.openbmc_project.State.Host.Transition.Off" }, - { POWER_OFF_FORCE, "xyz.openbmc_project.State.Chassis.Transition.Off" }, - { POWER_RESET_GRACEFUL, "xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot" }, - { POWER_RESET_FORCE, "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot" }, - { 0, NULL } + { 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" }}, + { POWER_OFF_FORCE, {.type="s", .string="xyz.openbmc_project.State.Chassis.Transition.Off" }}, + { POWER_RESET_GRACEFUL, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot" }}, + { POWER_RESET_FORCE, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.ForceWarmReboot" }}, + { 0, {.type=NULL, .integer=0}} }; typedef enum @@ -95,10 +95,10 @@ const command_dbus_path_t power_command_policy_paths[] = { }; const command_dbus_member_t power_command_policy_values[] = { - { POWER_POLICY_ON, "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn" }, - { POWER_POLICY_OFF, "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff" }, - { POWER_POLICY_RESTORE, "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore" }, - { 0, NULL } + { 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" }}, + { 0, {.type=NULL, .integer=0 }} }; int com_status(const universal_command_t *commands, const command_dbus_path_t * paths, const command_dbus_member_t * values) -- cgit v1.2.3