#ifndef _JITTERBUG__SERVER_H #define _JITTERBUG__SERVER_H #include "wire.h" #include #include #define MATCH_RULE_MAX 1024 #define MATCH_RULE_MAX_ARG 12 typedef struct match_rule { uint8_t type; bool eavesdrop; 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_path[MATCH_RULE_MAX_ARG]; /* TODO: spec states that indexes 0 to 63 should be supported */ } match_rule_t; // TODO: dynamically size the arrays #define BUS_MAX_CLIENTS 256 #define BUS_MAX_NAMES 512 #define BUS_MAX_MATCH 12 #define BUS_NAMES_PER_CLIENT 4 #define BUS_BACKLOG 12 enum { BUS_CLIENT_STATE_NONE, BUS_CLIENT_STATE_WAIT_AUTH, BUS_CLIENT_STATE_WAIT_BEGIN, BUS_CLIENT_STATE_READY }; typedef struct bus_client { int fd; int16_t unique_name_index; uint8_t state; int8_t match_count; match_rule_t *matches[BUS_MAX_MATCH]; int16_t owned_names[BUS_NAMES_PER_CLIENT]; } bus_client_t; typedef struct bus_name { char *name; int32_t client_index; } bus_name_t; typedef struct bus { int sock_fd; int fd_num; int names_count; int clients_count; int urandom_fd; bus_client_t clients[BUS_MAX_CLIENTS]; bus_name_t names[BUS_MAX_NAMES]; struct pollfd fds[BUS_MAX_CLIENTS + 1]; } bus_t; typedef struct bus_method_handler { const char *name; int (*handler)(bus_t *bus, int client_index, wire_message_t *msg, wire_context_t *ctx, wire_context_t *reply_ctx); } bus_method_handler_t; int bus_client_add(bus_t *s, int fd); void bus_client_remove(bus_t *s, int i); void bus_free(bus_t *s); bus_t *bus_create(const char *socket_path); int bus_turn(bus_t *s); #endif // _JITTERBUG__SERVER_H