summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Alexeev <e.alekseev@k-soft-spb.ru>2022-10-10 11:35:37 +0300
committerEvgeniy Alexeev <e.alekseev@k-soft-spb.ru>2022-10-10 11:35:37 +0300
commit72405cee84fbddb8866a8a3d96350010266fc137 (patch)
treed7faaf852fcc4833c0f5edc49635e57356f420f5
parent81f88de144d6803bf4d53986193bf342772367eb (diff)
downloadsila-shell-72405cee84fbddb8866a8a3d96350010266fc137.tar.xz
Add power&policy status, get sdbus property func
-rw-r--r--src/d_bus.c13
-rw-r--r--src/d_bus.h2
-rw-r--r--src/d_bus_commands.c18
-rw-r--r--src/d_bus_commands.h2
-rw-r--r--src/host_commands.c7
-rw-r--r--src/host_commands.h6
-rw-r--r--src/power_commands.c70
-rw-r--r--src/utils.h7
8 files changed, 115 insertions, 10 deletions
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 <string.h>
#include <errno.h>
-#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
}