summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Alexeev <e.alekseev@k-soft-spb.ru>2022-10-10 17:07:45 +0300
committerEvgeniy Alexeev <e.alekseev@k-soft-spb.ru>2022-10-10 17:07:45 +0300
commit21c36beefd0304a600a2f781a60559f647d569fb (patch)
treee2862ee2d9f3f807487601319055ce726fdd00ad
parentb6f6416fa4dfbff9c677c4491fb42c5d3adb9d44 (diff)
downloadsila-shell-21c36beefd0304a600a2f781a60559f647d569fb.tar.xz
Begin to add variant type
-rw-r--r--meson.build3
-rw-r--r--src/d_bus.c59
-rw-r--r--src/d_bus_commands.c25
-rw-r--r--src/d_bus_commands.h10
-rw-r--r--src/d_bus_variant.c10
-rw-r--r--src/d_bus_variant.h20
-rw-r--r--src/host_commands.c46
-rw-r--r--src/power_commands.c22
8 files changed, 167 insertions, 28 deletions
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 <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
+#include <errno.h>
#include <systemd/sd-bus.h>
-#include <utils.h>
-#include <d_bus.h>
+#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 <errno.h>
#include "d_bus_commands.h"
+#include <d_bus_variant.h>
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(&current->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 <stdbool.h>
#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 <string.h>
+#include <stdio.h>
+
+#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 <stdbool.h>
+
+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)