3535#include "bus-util.h"
3636#include "event-util.h"
3737
38+ #define VALID_DEPLOYMENT_CHARS (DIGITS LETTERS "-.:")
39+
3840enum {
3941 PROP_HOSTNAME ,
4042 PROP_STATIC_HOSTNAME ,
4143 PROP_PRETTY_HOSTNAME ,
4244 PROP_ICON_NAME ,
4345 PROP_CHASSIS ,
46+ PROP_DEPLOYMENT ,
4447 PROP_KERNEL_NAME ,
4548 PROP_KERNEL_RELEASE ,
4649 PROP_KERNEL_VERSION ,
@@ -100,6 +103,7 @@ static int context_read_data(Context *c) {
100103 "PRETTY_HOSTNAME" , & c -> data [PROP_PRETTY_HOSTNAME ],
101104 "ICON_NAME" , & c -> data [PROP_ICON_NAME ],
102105 "CHASSIS" , & c -> data [PROP_CHASSIS ],
106+ "DEPLOYMENT" , & c -> data [PROP_DEPLOYMENT ],
103107 NULL );
104108 if (r < 0 && r != - ENOENT )
105109 return r ;
@@ -134,7 +138,6 @@ static bool check_nss(void) {
134138}
135139
136140static bool valid_chassis (const char * chassis ) {
137-
138141 assert (chassis );
139142
140143 return nulstr_contains (
@@ -149,6 +152,12 @@ static bool valid_chassis(const char *chassis) {
149152 chassis );
150153}
151154
155+ static bool valid_deployment (const char * deployment ) {
156+ assert (deployment );
157+
158+ return strspn (deployment , VALID_DEPLOYMENT_CHARS ) == strlen (deployment );
159+ }
160+
152161static const char * fallback_chassis (void ) {
153162 int r ;
154163 char * type ;
@@ -258,6 +267,7 @@ static char* context_fallback_icon_name(Context *c) {
258267 return strdup ("computer" );
259268}
260269
270+
261271static bool hostname_is_useful (const char * hn ) {
262272 return !isempty (hn ) && !is_localhost (hn );
263273}
@@ -312,7 +322,8 @@ static int context_write_data_machine_info(Context *c) {
312322 static const char * const name [_PROP_MAX ] = {
313323 [PROP_PRETTY_HOSTNAME ] = "PRETTY_HOSTNAME" ,
314324 [PROP_ICON_NAME ] = "ICON_NAME" ,
315- [PROP_CHASSIS ] = "CHASSIS"
325+ [PROP_CHASSIS ] = "CHASSIS" ,
326+ [PROP_DEPLOYMENT ] = "DEPLOYMENT" ,
316327 };
317328
318329 _cleanup_strv_free_ char * * l = NULL ;
@@ -324,7 +335,7 @@ static int context_write_data_machine_info(Context *c) {
324335 if (r < 0 && r != - ENOENT )
325336 return r ;
326337
327- for (p = PROP_PRETTY_HOSTNAME ; p <= PROP_CHASSIS ; p ++ ) {
338+ for (p = PROP_PRETTY_HOSTNAME ; p <= PROP_DEPLOYMENT ; p ++ ) {
328339 char * t , * * u ;
329340
330341 assert (name [p ]);
@@ -402,6 +413,23 @@ static int property_get_chassis(
402413 return sd_bus_message_append (reply , "s" , name );
403414}
404415
416+ static int property_get_deployment (
417+ sd_bus * bus ,
418+ const char * path ,
419+ const char * interface ,
420+ const char * property ,
421+ sd_bus_message * reply ,
422+ void * userdata ,
423+ sd_bus_error * error ) {
424+
425+ Context * c = userdata ;
426+ const char * name ;
427+
428+ name = c -> data [PROP_DEPLOYMENT ];
429+
430+ return sd_bus_message_append (reply , "s" , name );
431+ }
432+
405433static int method_set_hostname (sd_bus * bus , sd_bus_message * m , void * userdata , sd_bus_error * error ) {
406434 Context * c = userdata ;
407435 const char * name ;
@@ -555,6 +583,8 @@ static int set_machine_info(Context *c, sd_bus *bus, sd_bus_message *m, int prop
555583 return sd_bus_error_setf (error , SD_BUS_ERROR_INVALID_ARGS , "Invalid pretty host name '%s'" , name );
556584 if (prop == PROP_CHASSIS && !valid_chassis (name ))
557585 return sd_bus_error_setf (error , SD_BUS_ERROR_INVALID_ARGS , "Invalid chassis '%s'" , name );
586+ if (prop == PROP_DEPLOYMENT && !valid_deployment (name ))
587+ return sd_bus_error_setf (error , SD_BUS_ERROR_INVALID_ARGS , "Invalid deployment '%s'" , name );
558588
559589 h = strdup (name );
560590 if (!h )
@@ -572,11 +602,13 @@ static int set_machine_info(Context *c, sd_bus *bus, sd_bus_message *m, int prop
572602
573603 log_info ("Changed %s to '%s'" ,
574604 prop == PROP_PRETTY_HOSTNAME ? "pretty host name" :
605+ prop == PROP_DEPLOYMENT ? "deployment" :
575606 prop == PROP_CHASSIS ? "chassis" : "icon name" , strna (c -> data [prop ]));
576607
577608 sd_bus_emit_properties_changed (bus , "/org/freedesktop/hostname1" , "org.freedesktop.hostname1" ,
578609 prop == PROP_PRETTY_HOSTNAME ? "PrettyHostname" :
579- prop == PROP_CHASSIS ? "Chassis" : "IconName" , NULL );
610+ prop == PROP_DEPLOYMENT ? "Deployment" :
611+ prop == PROP_CHASSIS ? "Chassis" : "IconName" , NULL );
580612
581613 return sd_bus_reply_method_return (m , NULL );
582614}
@@ -593,13 +625,18 @@ static int method_set_chassis(sd_bus *bus, sd_bus_message *m, void *userdata, sd
593625 return set_machine_info (userdata , bus , m , PROP_CHASSIS , method_set_chassis , error );
594626}
595627
628+ static int method_set_deployment (sd_bus * bus , sd_bus_message * m , void * userdata , sd_bus_error * error ) {
629+ return set_machine_info (userdata , bus , m , PROP_DEPLOYMENT , method_set_deployment , error );
630+ }
631+
596632static const sd_bus_vtable hostname_vtable [] = {
597633 SD_BUS_VTABLE_START (0 ),
598634 SD_BUS_PROPERTY ("Hostname" , "s" , NULL , offsetof(Context , data ) + sizeof (char * ) * PROP_HOSTNAME , 0 ),
599635 SD_BUS_PROPERTY ("StaticHostname" , "s" , NULL , offsetof(Context , data ) + sizeof (char * ) * PROP_STATIC_HOSTNAME , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ),
600636 SD_BUS_PROPERTY ("PrettyHostname" , "s" , NULL , offsetof(Context , data ) + sizeof (char * ) * PROP_PRETTY_HOSTNAME , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ),
601637 SD_BUS_PROPERTY ("IconName" , "s" , property_get_icon_name , 0 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ),
602638 SD_BUS_PROPERTY ("Chassis" , "s" , property_get_chassis , 0 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ),
639+ SD_BUS_PROPERTY ("Deployment" , "s" , property_get_deployment , 0 , SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE ),
603640 SD_BUS_PROPERTY ("KernelName" , "s" , NULL , offsetof(Context , data ) + sizeof (char * ) * PROP_KERNEL_NAME , SD_BUS_VTABLE_PROPERTY_CONST ),
604641 SD_BUS_PROPERTY ("KernelRelease" , "s" , NULL , offsetof(Context , data ) + sizeof (char * ) * PROP_KERNEL_RELEASE , SD_BUS_VTABLE_PROPERTY_CONST ),
605642 SD_BUS_PROPERTY ("KernelVersion" , "s" , NULL , offsetof(Context , data ) + sizeof (char * ) * PROP_KERNEL_VERSION , SD_BUS_VTABLE_PROPERTY_CONST ),
@@ -610,6 +647,7 @@ static const sd_bus_vtable hostname_vtable[] = {
610647 SD_BUS_METHOD ("SetPrettyHostname" , "sb" , NULL , method_set_pretty_hostname , SD_BUS_VTABLE_UNPRIVILEGED ),
611648 SD_BUS_METHOD ("SetIconName" , "sb" , NULL , method_set_icon_name , SD_BUS_VTABLE_UNPRIVILEGED ),
612649 SD_BUS_METHOD ("SetChassis" , "sb" , NULL , method_set_chassis , SD_BUS_VTABLE_UNPRIVILEGED ),
650+ SD_BUS_METHOD ("SetDeployment" , "sb" , NULL , method_set_deployment , SD_BUS_VTABLE_UNPRIVILEGED ),
613651 SD_BUS_VTABLE_END ,
614652};
615653
0 commit comments