]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/hostname/hostnamed.c
tree-wide: use ASSERT_PTR more
[thirdparty/systemd.git] / src / hostname / hostnamed.c
index b855b411121736b60261fd83d172a584d41496c3..d59c783dbc49c35427627c45b6aa8b69475c9d7e 100644 (file)
@@ -208,21 +208,19 @@ static int get_hardware_model(char **ret) {
         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)
@@ -235,6 +233,20 @@ static int get_hardware_serial(char **ret) {
         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);
 
@@ -403,7 +415,7 @@ static char* context_get_chassis(Context *c) {
         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();
@@ -601,6 +613,22 @@ static int property_get_hardware_model(
         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,
@@ -635,8 +663,7 @@ static int property_get_static_hostname(
                 void *userdata,
                 sd_bus_error *error) {
 
-        Context *c = userdata;
-        assert(c);
+        Context *c = ASSERT_PTR(userdata);
 
         context_read_etc_hostname(c);
 
@@ -702,8 +729,7 @@ static int property_get_hostname_source(
                 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);
@@ -823,12 +849,11 @@ static int property_get_uname_field(
 }
 
 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)
@@ -870,13 +895,12 @@ static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *
 }
 
 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)
@@ -1040,12 +1064,11 @@ static int method_set_location(sd_bus_message *m, void *userdata, sd_bus_error *
 
 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)
@@ -1091,11 +1114,10 @@ static int method_get_product_uuid(sd_bus_message *m, void *userdata, sd_bus_err
 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,
@@ -1128,17 +1150,16 @@ static int method_get_hardware_serial(sd_bus_message *m, void *userdata, sd_bus_
 
 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,
@@ -1192,6 +1213,7 @@ static int method_describe(sd_bus_message *m, void *userdata, sd_bus_error *erro
                 (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)),
@@ -1212,6 +1234,7 @@ static int method_describe(sd_bus_message *m, void *userdata, sd_bus_error *erro
                                        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)));
 
@@ -1252,69 +1275,53 @@ static const sd_bus_vtable hostname_vtable[] = {
         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),