fix arrays
This commit is contained in:
parent
0d5385f295
commit
8d5a5bec49
5 changed files with 73 additions and 14 deletions
3
match.c
3
match.c
|
@ -10,6 +10,7 @@
|
||||||
void match_rule_free(match_rule_t *rule)
|
void match_rule_free(match_rule_t *rule)
|
||||||
{
|
{
|
||||||
if (rule) {
|
if (rule) {
|
||||||
|
free(rule->rule_string);
|
||||||
free(rule->sender);
|
free(rule->sender);
|
||||||
free(rule->interface);
|
free(rule->interface);
|
||||||
free(rule->member);
|
free(rule->member);
|
||||||
|
@ -41,6 +42,8 @@ match_rule_t *match_rule_from_string(char *d)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rule->rule_string = string_dup(d);
|
||||||
|
|
||||||
while (*d) {
|
while (*d) {
|
||||||
/* key */
|
/* key */
|
||||||
key = d;
|
key = d;
|
||||||
|
|
2
match.h
2
match.h
|
@ -11,7 +11,7 @@
|
||||||
typedef struct match_rule {
|
typedef struct match_rule {
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
bool eavesdrop;
|
bool eavesdrop;
|
||||||
char *sender, *interface, *member, *path, *path_namespace, *destination, *arg0namespace;
|
char *sender, *interface, *member, *path, *path_namespace, *destination, *arg0namespace, *rule_string;
|
||||||
char *arg[MATCH_RULE_MAX_ARG]; /* TODO: spec states that indexes 0 to 63 should be supported */
|
char *arg[MATCH_RULE_MAX_ARG]; /* TODO: spec states that indexes 0 to 63 should be supported */
|
||||||
char *arg_path[MATCH_RULE_MAX_ARG]; /* TODO: spec states that indexes 0 to 63 should be supported */
|
char *arg_path[MATCH_RULE_MAX_ARG]; /* TODO: spec states that indexes 0 to 63 should be supported */
|
||||||
} match_rule_t;
|
} match_rule_t;
|
||||||
|
|
68
server.c
68
server.c
|
@ -288,6 +288,8 @@ int jb_server_client_process_message(struct jb_server *s, int i, uint8_t *data,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("process_message: processed %d/%zu bytes\n", ctx.byte_cursor, data_len);
|
||||||
|
|
||||||
wire_message_field_t *destination_field = &msg.fields[DBUS_HEADER_FIELD_DESTINATION];
|
wire_message_field_t *destination_field = &msg.fields[DBUS_HEADER_FIELD_DESTINATION];
|
||||||
wire_message_field_t *member_field = &msg.fields[DBUS_HEADER_FIELD_MEMBER];
|
wire_message_field_t *member_field = &msg.fields[DBUS_HEADER_FIELD_MEMBER];
|
||||||
bool should_forward = false;
|
bool should_forward = false;
|
||||||
|
@ -390,19 +392,24 @@ int jb_server_client_process_message(struct jb_server *s, int i, uint8_t *data,
|
||||||
} _reply_end()
|
} _reply_end()
|
||||||
} else if (strcmp(member, "ListNames") == 0) {
|
} else if (strcmp(member, "ListNames") == 0) {
|
||||||
_reply_begin("as") {
|
_reply_begin("as") {
|
||||||
TRYPTR(wire_set_u32(&reply_ctx, s->names_count));
|
uint32_t *array_length = TRYPTR(wire_set_u32(&reply_ctx, 0));
|
||||||
printf("ListNames %d\n", s->names_count);
|
|
||||||
|
/* arrays start with the alignment of the type they contain */
|
||||||
|
TRYPTR(wire_write_align(&reply_ctx, 4));
|
||||||
|
|
||||||
|
uint32_t array_start = reply_ctx.byte_cursor;
|
||||||
|
|
||||||
|
TRYPTR(wire_set_string(&reply_ctx, "org.freedesktop.DBus"));
|
||||||
|
|
||||||
int left = s->names_count;
|
int left = s->names_count;
|
||||||
for (int i = 0; i < JB_MAX_NAMES; i++) {
|
for (int i = 0; i < JB_MAX_NAMES && left > 0; i++) {
|
||||||
if (s->names[i].name && s->names[i].client_index >= 0) {
|
if (s->names[i].name && s->names[i].client_index >= 0) {
|
||||||
left--;
|
left--;
|
||||||
TRYPTR(wire_set_string(&reply_ctx, s->names[i].name));
|
TRYPTR(wire_set_string(&reply_ctx, s->names[i].name));
|
||||||
}
|
}
|
||||||
if (left <= 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*array_length = reply_ctx.byte_cursor - array_start;
|
||||||
} _reply_end()
|
} _reply_end()
|
||||||
} else if (strcmp(member, "ListActivatableNames") == 0) {
|
} else if (strcmp(member, "ListActivatableNames") == 0) {
|
||||||
// TODO: stub (always returns empty array)
|
// TODO: stub (always returns empty array)
|
||||||
|
@ -436,9 +443,9 @@ int jb_server_client_process_message(struct jb_server *s, int i, uint8_t *data,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRYST(jb_server_client_match_add(s, i, match));
|
printf("client index %d adding match rule: '%s'\n", i, match);
|
||||||
|
|
||||||
printf("client index %d just added match rule: '%s'\n", i, match);
|
TRYST(jb_server_client_match_add(s, i, match));
|
||||||
|
|
||||||
_reply_begin("") {} _reply_end()
|
_reply_begin("") {} _reply_end()
|
||||||
} else if (strcmp(member, "RemoveMatch") == 0) {
|
} else if (strcmp(member, "RemoveMatch") == 0) {
|
||||||
|
@ -453,6 +460,44 @@ int jb_server_client_process_message(struct jb_server *s, int i, uint8_t *data,
|
||||||
printf("FIXME: STUB: RemoveMatch: %s\n", match);
|
printf("FIXME: STUB: RemoveMatch: %s\n", match);
|
||||||
|
|
||||||
_reply_begin("") {} _reply_end()
|
_reply_begin("") {} _reply_end()
|
||||||
|
} else if (strcmp(member, "GetAllMatchRules") == 0) {
|
||||||
|
_reply_begin("a{sas}") {
|
||||||
|
uint32_t *outer_array_len = TRYPTR(wire_set_u32(&reply_ctx, 0));
|
||||||
|
TRYPTR(wire_write_align(&reply_ctx, 8)); /* arrays start with the alignment of the type they contain */
|
||||||
|
uint32_t outer_array_start = reply_ctx.byte_cursor;
|
||||||
|
|
||||||
|
int left = s->names_count;
|
||||||
|
for (int i = 0; i < JB_MAX_NAMES && left > 0; i++) {
|
||||||
|
struct jb_name *n = &s->names[i];
|
||||||
|
if (!n->name || n->client_index < 0 || *n->name != ':') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
left--;
|
||||||
|
|
||||||
|
TRYPTR(wire_write_align(&reply_ctx, 8)); /* structs always aligned to 8 */
|
||||||
|
|
||||||
|
struct jb_client *c = &s->clients[s->names[i].client_index];
|
||||||
|
|
||||||
|
TRYPTR(wire_set_string(&reply_ctx, s->names[i].name)); /* unique name */
|
||||||
|
|
||||||
|
/* array of all match rules */
|
||||||
|
int match_left = c->match_count;
|
||||||
|
uint32_t *name_array_len = TRYPTR(wire_set_u32(&reply_ctx, 0));
|
||||||
|
TRYPTR(wire_write_align(&reply_ctx, 4)); /* arrays start with the alignment of the type they contain */
|
||||||
|
uint32_t name_array_start = reply_ctx.byte_cursor;
|
||||||
|
for (int i = 0; i < JB_MAX_MATCH && match_left > 0; i++) {
|
||||||
|
if (!c->matches[i]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
match_left--;
|
||||||
|
|
||||||
|
TRYPTR(wire_set_string(&reply_ctx, c->matches[i]->rule_string));
|
||||||
|
}
|
||||||
|
*name_array_len = reply_ctx.byte_cursor - name_array_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
*outer_array_len = reply_ctx.byte_cursor - outer_array_start;
|
||||||
|
} _reply_end()
|
||||||
} else {
|
} else {
|
||||||
printf("FIXME: daemon method '%s' is not implemented or invalid\n", member);
|
printf("FIXME: daemon method '%s' is not implemented or invalid\n", member);
|
||||||
_reply_error("org.freedesktop.DBus.Error.UnknownMethod");
|
_reply_error("org.freedesktop.DBus.Error.UnknownMethod");
|
||||||
|
@ -497,6 +542,11 @@ int jb_server_client_process_message(struct jb_server *s, int i, uint8_t *data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx.byte_cursor < ctx.data_len && ctx.data[ctx.byte_cursor] == 'l') {
|
||||||
|
// another message
|
||||||
|
TRYST(jb_server_client_process_message(s, i, ctx.data + ctx.byte_cursor, ctx.data_len - ctx.byte_cursor));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -637,6 +687,8 @@ int jb_server_turn(struct jb_server *s)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("\nrecv: got %zd bytes\n", bytes);
|
||||||
|
|
||||||
struct jb_client *c = &s->clients[i];
|
struct jb_client *c = &s->clients[i];
|
||||||
switch (c->state) {
|
switch (c->state) {
|
||||||
case JB_CLIENT_STATE_WAIT_AUTH: {
|
case JB_CLIENT_STATE_WAIT_AUTH: {
|
||||||
|
|
12
try.h
12
try.h
|
@ -1,5 +1,9 @@
|
||||||
#define TRYPTR_NIL(M_expr) ({ void* _result = (void*)(M_expr); if (!_result) { return (NULL); } _result; })
|
#define __TRY_TRACE() do { \
|
||||||
#define TRYPTR(M_expr) ({ void* _result = (void*)(M_expr); if (!_result) { return (-1); } _result; })
|
printf("trace: %s:%d\n", __FILE__, __LINE__); \
|
||||||
|
} while(0) \
|
||||||
|
|
||||||
#define TRYST_NIL(M_expr) ({ int _result = (int)(M_expr); if (_result < 0) { return (NULL); } _result; })
|
#define TRYPTR_NIL(M_expr) ({ void* _result = (void*)(M_expr); if (!_result) { __TRY_TRACE(); return (NULL); } _result; })
|
||||||
#define TRYST(M_expr) ({ int _result = (int)(M_expr); if (_result < 0) { return (-1); } _result; })
|
#define TRYPTR(M_expr) ({ void* _result = (void*)(M_expr); if (!_result) { __TRY_TRACE(); return (-1); } _result; })
|
||||||
|
|
||||||
|
#define TRYST_NIL(M_expr) ({ int _result = (int)(M_expr); if (_result < 0) { __TRY_TRACE(); return (NULL); } _result; })
|
||||||
|
#define TRYST(M_expr) ({ int _result = (int)(M_expr); if (_result < 0) { __TRY_TRACE(); return (-1); } _result; })
|
||||||
|
|
2
wire.c
2
wire.c
|
@ -118,7 +118,7 @@ int wire_parse_message(wire_context_t *c, wire_message_t *msg)
|
||||||
|
|
||||||
size_t header_fields_end = c->byte_cursor + msg->header_fields_length;
|
size_t header_fields_end = c->byte_cursor + msg->header_fields_length;
|
||||||
|
|
||||||
WIRE_VERBOSE("\nstart parse message: type=%d, no_reply_expected=%d\n", msg->type, msg->flags & DBUS_FLAG_NO_REPLY_EXPECTED);
|
WIRE_VERBOSE("start parse message: type=%d, no_reply_expected=%d\n", msg->type, msg->flags & DBUS_FLAG_NO_REPLY_EXPECTED);
|
||||||
|
|
||||||
while (c->byte_cursor < header_fields_end) {
|
while (c->byte_cursor < header_fields_end) {
|
||||||
uint8_t field_code = *(uint8_t*)TRYPTR(wire_get_u8(c));
|
uint8_t field_code = *(uint8_t*)TRYPTR(wire_get_u8(c));
|
||||||
|
|
Loading…
Reference in a new issue