14 #include "kdbus-api.h"
15 #include "kdbus-util.h"
16 #include "kdbus-enum.h"
17 #include "kdbus-test.h"
19 static wur struct kdbus_item *kdbus_get_item(struct kdbus_info *info,
22 struct kdbus_item *item;
24 KDBUS_ITEM_FOREACH(item, info, items)
25 if (item->type == type)
31 static wur int test_bus_creator_info(const char *bus_path)
35 struct kdbus_conn *conn;
36 struct kdbus_info *info;
37 struct kdbus_item *item;
40 /* extract the bus-name from @bus_path */
41 tmp = strdup(bus_path);
43 busname = strrchr(tmp, '/');
44 ASSERT_NONZERO(busname);
46 busname = strrchr(tmp, '/');
47 ASSERT_NONZERO(busname);
50 conn = kdbus_hello(bus_path, 0, NULL, 0);
53 ASSERT_ZERO(kdbus_bus_creator_info(conn, _KDBUS_ATTACH_ALL, &offset));
55 info = (struct kdbus_info *)(conn->buf + offset);
57 item = kdbus_get_item(info, KDBUS_ITEM_MAKE_NAME);
59 ASSERT_ZERO(strcmp(item->str, busname));
61 ret = kdbus_free(conn, offset);
62 ASSERT_RETURN_VAL(ret,==,0, ret);
65 kdbus_conn_free(conn);
69 wur int kdbus_test_bus_make(struct kdbus_test_env *env)
78 struct kdbus_bloom_parameter bloom;
86 char s[PATH_MAX], *name;
90 name = unique_name("");
93 snprintf(s, sizeof(s), "%s/control", env->root);
94 env->control_fd = open(s, O_RDWR|O_CLOEXEC);
95 ASSERT_RETURN(env->control_fd,>=,0);
97 control_fd2 = open(s, O_RDWR|O_CLOEXEC);
98 ASSERT_RETURN(control_fd2,>=,0);
100 memset(&bus_make, 0, sizeof(bus_make));
102 bus_make.bs.size = sizeof(bus_make.bs);
103 bus_make.bs.type = KDBUS_ITEM_BLOOM_PARAMETER;
104 bus_make.bs.bloom.size = 64;
105 bus_make.bs.bloom.n_hash = 1;
107 bus_make.n_type = KDBUS_ITEM_MAKE_NAME;
111 /* missing uid prefix */
112 snprintf(bus_make.name, sizeof(bus_make.name), "foo");
113 bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
114 bus_make.cmd.size = sizeof(struct kdbus_cmd) +
115 sizeof(bus_make.bs) + bus_make.n_size;
116 ASSERT_RETURN(-EINVAL,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
118 /* non alphanumeric character */
119 snprintf(bus_make.name, sizeof(bus_make.name), "%u-blah@123", uid);
120 bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
121 bus_make.cmd.size = sizeof(struct kdbus_cmd) +
122 sizeof(bus_make.bs) + bus_make.n_size;
123 ASSERT_RETURN(-EINVAL,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
126 snprintf(bus_make.name, sizeof(bus_make.name), "%u-blah-", uid);
127 bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
128 bus_make.cmd.size = sizeof(struct kdbus_cmd) +
129 sizeof(bus_make.bs) + bus_make.n_size;
130 ASSERT_RETURN(-EINVAL,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
132 /* create a new bus */
133 snprintf(bus_make.name, sizeof(bus_make.name), "%u-%s-1", uid, name);
134 bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
135 bus_make.cmd.size = sizeof(struct kdbus_cmd) +
136 sizeof(bus_make.bs) + bus_make.n_size;
137 ASSERT_ZERO(kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
139 ASSERT_RETURN(-EEXIST,==,kdbus_cmd_bus_make(control_fd2, &bus_make.cmd));
141 snprintf(s, sizeof(s), "%s/%u-%s-1/bus", env->root, uid, name);
142 ASSERT_ZERO(access(s, F_OK));
144 ASSERT_ZERO(test_bus_creator_info(s));
146 /* can't use the same fd for bus make twice, even though a different
149 snprintf(bus_make.name, sizeof(bus_make.name), "%u-%s-2", uid, name);
150 bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
151 bus_make.cmd.size = sizeof(struct kdbus_cmd) +
152 sizeof(bus_make.bs) + bus_make.n_size;
153 ASSERT_RETURN(-EBADFD,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
155 /* create a new bus, with different fd and different bus name */
156 snprintf(bus_make.name, sizeof(bus_make.name), "%u-%s-2", uid, name);
157 bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
158 bus_make.cmd.size = sizeof(struct kdbus_cmd) +
159 sizeof(bus_make.bs) + bus_make.n_size;
160 ASSERT_ZERO(kdbus_cmd_bus_make(control_fd2, &bus_make.cmd));