From 72405cee84fbddb8866a8a3d96350010266fc137 Mon Sep 17 00:00:00 2001 From: Evgeniy Alexeev Date: Mon, 10 Oct 2022 13:35:37 +0500 Subject: Add power&policy status, get sdbus property func --- src/d_bus.c | 13 ++++------ src/d_bus.h | 2 +- src/d_bus_commands.c | 18 ++++++++++++++ src/d_bus_commands.h | 2 ++ src/host_commands.c | 7 ++++++ src/host_commands.h | 6 +++++ src/power_commands.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/utils.h | 7 ++++++ 8 files changed, 115 insertions(+), 10 deletions(-) create mode 100644 src/host_commands.c create mode 100644 src/host_commands.h diff --git a/src/d_bus.c b/src/d_bus.c index 79405f5..79ac6ab 100644 --- a/src/d_bus.c +++ b/src/d_bus.c @@ -41,10 +41,7 @@ int dbus_set_property_string(const string_quadruple_t* path, const char* value) return (r>0?(0):(r)); } -const char* dbus_get_property_string(const char *destination, - const char *path, - const char *interface, - const char *member) +char* dbus_get_property_string(const string_quadruple_t* path ) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_bus_message_unref_ sd_bus_message *m = NULL; @@ -59,10 +56,10 @@ const char* dbus_get_property_string(const char *destination, r = sd_bus_get_property_string( bus, - destination, - path, - interface, - member, + path->first, + path->second, + path->third, + path->fourth, &error, &state); if (r >= 0) diff --git a/src/d_bus.h b/src/d_bus.h index c2742d0..d947677 100644 --- a/src/d_bus.h +++ b/src/d_bus.h @@ -29,7 +29,7 @@ typedef struct 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 ); #ifdef __cplusplus } #endif diff --git a/src/d_bus_commands.c b/src/d_bus_commands.c index 6c96085..c7878a6 100644 --- a/src/d_bus_commands.c +++ b/src/d_bus_commands.c @@ -24,6 +24,16 @@ int parse_command2enum(const char* command, const universal_command_t* cmds) return result; } +const universal_command_t* get_command_by_enum(int cmd, const universal_command_t* cmds) +{ + for(const universal_command_t* cur_cmd = cmds; cur_cmd->name != NULL; cur_cmd++) + { + if(cur_cmd->command == cmd) + return cur_cmd; + } + return NULL; +} + const string_quadruple_t* get_dbus_command_interface(int cmd, const command_dbus_path_t* pathes) { for(const command_dbus_path_t* current = pathes; current->path!=NULL; current++) @@ -42,6 +52,14 @@ const char* get_dbus_command_member(int cmd, const command_dbus_member_t* values 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++) + { + if(strcmp(member, current->member) == 0 )return current; + } + return NULL; +} int com_dbus_property( char *arg, const universal_command_t* commands, const command_dbus_path_t* paths, const command_dbus_member_t* values) { diff --git a/src/d_bus_commands.h b/src/d_bus_commands.h index 24e1c80..35eee6b 100644 --- a/src/d_bus_commands.h +++ b/src/d_bus_commands.h @@ -34,6 +34,8 @@ const string_quadruple_t* get_dbus_command_interface(int cmd, const command_dbus const char* 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); +const universal_command_t* get_command_by_enum(int cmd, const universal_command_t* cmds); #ifdef __cplusplus } diff --git a/src/host_commands.c b/src/host_commands.c new file mode 100644 index 0000000..6687f02 --- /dev/null +++ b/src/host_commands.c @@ -0,0 +1,7 @@ +#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"}; diff --git a/src/host_commands.h b/src/host_commands.h new file mode 100644 index 0000000..4bb5e3f --- /dev/null +++ b/src/host_commands.h @@ -0,0 +1,6 @@ +#ifndef HOST_COMMANDS_H +#define HOST_COMMANDS_H + +#include "d_bus_commands.h" + +#endif // HOST_COMMANDS_H diff --git a/src/power_commands.c b/src/power_commands.c index 4000733..9c98a25 100644 --- a/src/power_commands.c +++ b/src/power_commands.c @@ -2,8 +2,9 @@ #include #include -#include "d_bus_commands.h" +#include "utils.h" +#include "d_bus_commands.h" #include "power_commands.h" static const string_quadruple_t chassis_dbus = { @@ -100,12 +101,79 @@ const command_dbus_member_t power_command_policy_values[] = { { 0, NULL } }; +int com_status(const universal_command_t *commands, const command_dbus_path_t * paths, const command_dbus_member_t * values) +{ + for(const command_dbus_path_t * cur_path = paths;cur_path->path !=NULL; cur_path++) + { + _cleanup_string_ char * value = dbus_get_property_string(cur_path->path); + if(!value)continue; + const command_dbus_member_t* member = get_dbus_command_by_member(value, values); + if(!member)continue; + const universal_command_t* cur_cmd = get_command_by_enum(member->command, commands); + if(!cur_cmd) + continue; + printf("Current status: %s - %s\n", cur_cmd->name, cur_cmd->help); + + } + return 0; +} + +static int power_status() +{ + + _cleanup_string_ char * host_value = dbus_get_property_string(&host_dbus); + if(!host_value) + return -EOPNOTSUPP; + const command_dbus_member_t* member = get_dbus_command_by_member(host_value, power_command_values); + if(!member) + return -EOPNOTSUPP; + const universal_command_t* cur_cmd = get_command_by_enum(member->command, power_commands); + if(!cur_cmd) + return -EOPNOTSUPP; + printf("Power status: \n"); + printf("\tHost: %s - %s\n", cur_cmd->name, cur_cmd->help); + _cleanup_string_ char * chassis_value = dbus_get_property_string(&chassis_dbus); + if(!host_value) + return -EOPNOTSUPP; + member = get_dbus_command_by_member(host_value, power_command_values); + if(!member) + return -EOPNOTSUPP; + cur_cmd = get_command_by_enum(member->command, power_commands); + if(!cur_cmd) + return -EOPNOTSUPP; + + printf("\tChassis: %s - %s\n", cur_cmd->name, cur_cmd->help); + + + return 0; +} + +static int power_policy_status() +{ + + _cleanup_string_ char * host_value = dbus_get_property_string(&host_dbus); + if(!host_value) + return -EOPNOTSUPP; + const command_dbus_member_t* member = get_dbus_command_by_member(host_value, power_command_values); + if(!member) + return -EOPNOTSUPP; + const universal_command_t* cur_cmd = get_command_by_enum(member->command, power_commands); + if(!cur_cmd) + return -EOPNOTSUPP; + printf("Power policy tatus: \n"); + printf("\tHost: %s - %s\n", cur_cmd->name, cur_cmd->help); + + return 0; +} + int com_power( char *arg ) { + power_status(); return com_dbus_property(arg, power_commands, power_command_paths, power_command_values); } int com_power_policy( char* arg ) { + power_policy_status(); return com_dbus_property(arg, power_policy_commands, power_command_policy_paths, power_command_policy_values); } diff --git a/src/utils.h b/src/utils.h index 841579d..32d8b4b 100644 --- a/src/utils.h +++ b/src/utils.h @@ -22,6 +22,12 @@ static inline void freep(void **p) free(*p); } +static inline void string_freep(char **p) +{ + if (*p) + free(*p); +} + #define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func) \ static inline void func##p(type *p) \ { \ @@ -31,6 +37,7 @@ static inline void freep(void **p) #define _cleanup_(_some_) __attribute__((__cleanup__(_some_))) #define _cleanup_free_ _cleanup_(freep) +#define _cleanup_string_ _cleanup_(string_freep) #ifdef __cplusplus } -- cgit v1.2.3