#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 { uint8_t type; bool has_arg_rules; 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 */ } MatchRule; // 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_name { char *name; struct bus_client *client; uint16_t chain_count; uint16_t root_index; } BusName; typedef struct bus_client { int fd; BusName *unique_name; int16_t fd_index; uint8_t state; int8_t match_count; MatchRule *matches[BUS_MAX_MATCH]; BusName *owned_names[BUS_NAMES_PER_CLIENT]; } BusClient; typedef struct { int sock_fd; int fd_num; int names_count; int clients_count; int urandom_fd; BusClient clients[BUS_MAX_CLIENTS]; BusName names[BUS_MAX_NAMES]; struct pollfd fds[BUS_MAX_CLIENTS + 1]; } Bus; typedef struct { const char *name; int (*handler)(Bus *bus, BusClient *client, WireMsg *msg, WireCtx *ctx, WireCtx *reply_ctx); } BusMethodHandler; int bus_client_add(Bus *s, int fd); void bus_client_remove(Bus *s, BusClient *client); void bus_free(Bus *s); Bus *bus_create(const char *socket_path); int bus_turn(Bus *s); #endif // _JITTERBUG__SERVER_H