@@ -1338,9 +1338,51 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) {
13381338 return fd ;
13391339}
13401340
1341- int bus_kernel_create_starter (const char * bus , const char * name ) {
1341+ static void bus_kernel_translate_policy (const BusNamePolicy * policy , struct kdbus_item * item )
1342+ {
1343+ switch (policy -> type ) {
1344+ case BUSNAME_POLICY_TYPE_USER :
1345+ item -> policy_access .type = KDBUS_POLICY_ACCESS_USER ;
1346+ item -> policy_access .id = policy -> uid ;
1347+ break ;
1348+
1349+ case BUSNAME_POLICY_TYPE_GROUP :
1350+ item -> policy_access .type = KDBUS_POLICY_ACCESS_GROUP ;
1351+ item -> policy_access .id = policy -> gid ;
1352+ break ;
1353+
1354+ case BUSNAME_POLICY_TYPE_WORLD :
1355+ item -> policy_access .type = KDBUS_POLICY_ACCESS_WORLD ;
1356+ break ;
1357+
1358+ default :
1359+ assert_not_reached ("Unknown policy type" );
1360+ }
1361+
1362+ switch (policy -> access ) {
1363+ case BUSNAME_POLICY_ACCESS_SEE :
1364+ item -> policy_access .access = KDBUS_POLICY_SEE ;
1365+ break ;
1366+
1367+ case BUSNAME_POLICY_ACCESS_TALK :
1368+ item -> policy_access .access = KDBUS_POLICY_TALK ;
1369+ break ;
1370+
1371+ case BUSNAME_POLICY_ACCESS_OWN :
1372+ item -> policy_access .access = KDBUS_POLICY_OWN ;
1373+ break ;
1374+
1375+ default :
1376+ assert_not_reached ("Unknown policy access" );
1377+ }
1378+ }
1379+
1380+ int bus_kernel_create_starter (const char * bus , const char * name , BusNamePolicy * policy ) {
13421381 struct kdbus_cmd_hello * hello ;
13431382 struct kdbus_item * n ;
1383+ size_t policy_cnt = 0 ;
1384+ BusNamePolicy * po ;
1385+ size_t size ;
13441386 char * p ;
13451387 int fd ;
13461388
@@ -1354,16 +1396,29 @@ int bus_kernel_create_starter(const char *bus, const char *name) {
13541396 if (fd < 0 )
13551397 return - errno ;
13561398
1357- hello = alloca0 (ALIGN8 (offsetof(struct kdbus_cmd_hello , items ) +
1358- offsetof(struct kdbus_item , str ) +
1359- strlen (name ) + 1 ));
1399+ LIST_FOREACH (policy , po , policy )
1400+ policy_cnt ++ ;
1401+
1402+ size = ALIGN8 (offsetof(struct kdbus_cmd_hello , items )) +
1403+ ALIGN8 (offsetof(struct kdbus_item , str ) + strlen (name ) + 1 ) +
1404+ policy_cnt * ALIGN8 (offsetof(struct kdbus_item , policy_access ) + sizeof (struct kdbus_policy_access ));
1405+
1406+ hello = alloca0 (size );
13601407
13611408 n = hello -> items ;
13621409 strcpy (n -> str , name );
13631410 n -> size = offsetof(struct kdbus_item , str ) + strlen (n -> str ) + 1 ;
13641411 n -> type = KDBUS_ITEM_NAME ;
1412+ n = KDBUS_ITEM_NEXT (n );
1413+
1414+ LIST_FOREACH (policy , po , policy ) {
1415+ n -> type = KDBUS_ITEM_POLICY_ACCESS ;
1416+ n -> size = offsetof(struct kdbus_item , policy_access ) + sizeof (struct kdbus_policy_access );
1417+ bus_kernel_translate_policy (po , n );
1418+ n = KDBUS_ITEM_NEXT (n );
1419+ }
13651420
1366- hello -> size = ALIGN8 (offsetof( struct kdbus_cmd_hello , items ) + n -> size ) ;
1421+ hello -> size = size ;
13671422 hello -> conn_flags = KDBUS_HELLO_ACTIVATOR ;
13681423 hello -> pool_size = KDBUS_POOL_SIZE ;
13691424
0 commit comments