return get_dmi_data("ID_MODEL_FROM_DATABASE", "ID_MODEL", ret);
}
-static int get_hardware_serial(char **ret) {
+static int get_hardware_firmware_data(const char *sysattr, char **ret) {
_cleanup_(sd_device_unrefp) sd_device *device = NULL;
_cleanup_free_ char *b = NULL;
const char *s = NULL;
int r;
+ assert(sysattr);
+
r = sd_device_new_from_syspath(&device, "/sys/class/dmi/id");
if (r < 0)
return log_debug_errno(r, "Failed to open /sys/class/dmi/id device, ignoring: %m");
- (void) sd_device_get_sysattr_value(device, "product_serial", &s);
- if (isempty(s))
- /* Fallback to board serial */
- (void) sd_device_get_sysattr_value(device, "board_serial", &s);
-
+ (void) sd_device_get_sysattr_value(device, sysattr, &s);
if (!isempty(s)) {
b = strdup(s);
if (!b)
return !isempty(s);
}
+static int get_hardware_serial(char **ret) {
+ int r;
+
+ r = get_hardware_firmware_data("product_serial", ret);
+ if (r <= 0)
+ return get_hardware_firmware_data("board_serial", ret);
+
+ return r;
+}
+
+static int get_firmware_version(char **ret) {
+ return get_hardware_firmware_data("bios_version", ret);
+}
+
static const char* valid_chassis(const char *chassis) {
assert(chassis);
if (!isempty(c->data[PROP_CHASSIS]))
return strdup(c->data[PROP_CHASSIS]);
- if (get_dmi_data("ID_CHASSIS", NULL, &dmi) >= 0)
+ if (get_dmi_data("ID_CHASSIS", NULL, &dmi) > 0)
return dmi;
fallback = fallback_chassis();
return property_get_hardware_property(reply, userdata, PROP_HARDWARE_MODEL, get_hardware_model);
}
+static int property_get_firmware_version(
+ sd_bus *bus,
+ const char *path,
+ const char *interface,
+ const char *property,
+ sd_bus_message *reply,
+ void *userdata,
+ sd_bus_error *error) {
+
+ _cleanup_free_ char *firmware_version = NULL;
+
+ (void) get_firmware_version(&firmware_version);
+
+ return sd_bus_message_append(reply, "s", firmware_version);
+}
+
static int property_get_hostname(
sd_bus *bus,
const char *path,
void *userdata,
sd_bus_error *error) {
- Context *c = userdata;
- assert(c);
+ Context *c = ASSERT_PTR(userdata);
context_read_etc_hostname(c);
void *userdata,
sd_bus_error *error) {
- Context *c = userdata;
- assert(c);
+ Context *c = ASSERT_PTR(userdata);
context_read_etc_hostname(c);
context_determine_hostname_source(c);
}
static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- Context *c = userdata;
+ Context *c = ASSERT_PTR(userdata);
const char *name;
int interactive, r;
assert(m);
- assert(c);
r = sd_bus_message_read(m, "sb", &name, &interactive);
if (r < 0)
}
static int method_set_static_hostname(sd_bus_message *m, void *userdata, sd_bus_error *error) {
- Context *c = userdata;
+ Context *c = ASSERT_PTR(userdata);
const char *name;
int interactive;
int r;
assert(m);
- assert(c);
r = sd_bus_message_read(m, "sb", &name, &interactive);
if (r < 0)
static int method_get_product_uuid(sd_bus_message *m, void *userdata, sd_bus_error *error) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- Context *c = userdata;
+ Context *c = ASSERT_PTR(userdata);
int interactive, r;
sd_id128_t uuid;
assert(m);
- assert(c);
r = sd_bus_message_read(m, "b", &interactive);
if (r < 0)
static int method_get_hardware_serial(sd_bus_message *m, void *userdata, sd_bus_error *error) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_free_ char *serial = NULL;
- Context *c = userdata;
+ Context *c = ASSERT_PTR(userdata);
int r;
assert(m);
- assert(c);
r = bus_verify_polkit_async(
m,
static int method_describe(sd_bus_message *m, void *userdata, sd_bus_error *error) {
_cleanup_free_ char *hn = NULL, *dhn = NULL, *in = NULL, *text = NULL,
- *chassis = NULL, *vendor = NULL, *model = NULL, *serial = NULL;
+ *chassis = NULL, *vendor = NULL, *model = NULL, *serial = NULL, *firmware_version = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
sd_id128_t product_uuid = SD_ID128_NULL;
- Context *c = userdata;
+ Context *c = ASSERT_PTR(userdata);
bool privileged;
struct utsname u;
int r;
assert(m);
- assert(c);
r = bus_verify_polkit_async(
m,
(void) id128_get_product(&product_uuid);
(void) get_hardware_serial(&serial);
}
+ (void) get_firmware_version(&firmware_version);
r = json_build(&v, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR("Hostname", JSON_BUILD_STRING(hn)),
JSON_BUILD_PAIR("HardwareVendor", JSON_BUILD_STRING(vendor ?: c->data[PROP_HARDWARE_VENDOR])),
JSON_BUILD_PAIR("HardwareModel", JSON_BUILD_STRING(model ?: c->data[PROP_HARDWARE_MODEL])),
JSON_BUILD_PAIR("HardwareSerial", JSON_BUILD_STRING(serial)),
+ JSON_BUILD_PAIR("FirmwareVersion", JSON_BUILD_STRING(firmware_version)),
JSON_BUILD_PAIR_CONDITION(!sd_id128_is_null(product_uuid), "ProductUUID", JSON_BUILD_ID128(product_uuid)),
JSON_BUILD_PAIR_CONDITION(sd_id128_is_null(product_uuid), "ProductUUID", JSON_BUILD_NULL)));
SD_BUS_PROPERTY("HomeURL", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_HOME_URL, SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("HardwareVendor", "s", property_get_hardware_vendor, 0, SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("HardwareModel", "s", property_get_hardware_model, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("FirmwareVersion", "s", property_get_firmware_version, 0, SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_METHOD_WITH_NAMES("SetHostname",
- "sb",
- SD_BUS_PARAM(hostname)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_hostname,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("SetStaticHostname",
- "sb",
- SD_BUS_PARAM(hostname)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_static_hostname,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("SetPrettyHostname",
- "sb",
- SD_BUS_PARAM(hostname)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_pretty_hostname,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("SetIconName",
- "sb",
- SD_BUS_PARAM(icon)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_icon_name,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("SetChassis",
- "sb",
- SD_BUS_PARAM(chassis)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_chassis,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("SetDeployment",
- "sb",
- SD_BUS_PARAM(deployment)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_deployment,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("SetLocation",
- "sb",
- SD_BUS_PARAM(location)
- SD_BUS_PARAM(interactive),
- NULL,,
- method_set_location,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("GetProductUUID",
- "b",
- SD_BUS_PARAM(interactive),
- "ay",
- SD_BUS_PARAM(uuid),
- method_get_product_uuid,
- SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD_WITH_NAMES("GetHardwareSerial",
- NULL,,
- "s",
- SD_BUS_PARAM(serial),
- method_get_hardware_serial,
- SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetHostname",
+ SD_BUS_ARGS("s", hostname, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_hostname,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetStaticHostname",
+ SD_BUS_ARGS("s", hostname, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_static_hostname,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetPrettyHostname",
+ SD_BUS_ARGS("s", hostname, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_pretty_hostname,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetIconName",
+ SD_BUS_ARGS("s", icon, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_icon_name,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetChassis",
+ SD_BUS_ARGS("s", chassis, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_chassis,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetDeployment",
+ SD_BUS_ARGS("s", deployment, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_deployment,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("SetLocation",
+ SD_BUS_ARGS("s", location, "b", interactive),
+ SD_BUS_NO_RESULT,
+ method_set_location,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("GetProductUUID",
+ SD_BUS_ARGS("b", interactive),
+ SD_BUS_RESULT("ay", uuid),
+ method_get_product_uuid,
+ SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD_WITH_ARGS("GetHardwareSerial",
+ SD_BUS_NO_ARGS,
+ SD_BUS_RESULT("s", serial),
+ method_get_hardware_serial,
+ SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD_WITH_ARGS("Describe",
SD_BUS_NO_ARGS,
SD_BUS_RESULT("s", json),