void ipc_register(IpcPtr ipc, DispatchPtr dispatch) { if (ipc) { if (ipc->dispatch) { dispatch_remove_fd(ipc->dispatch, ipc_read_socket(ipc)); } ipc->dispatch = dispatch; dispatch_add(ipc->dispatch, ipc_read_socket(ipc), POLLIN, ipc_read_zero, NULL, NULL, ipc); } }
static ConnectionPtr connection_new(ServerPtr server, int socket) { if (server) { ConnectionPtr conn = malloc(sizeof(struct Connection)); if (conn) { conn->server = server; conn->socket = socket; conn->buffer = malloc(server->framesize); conn->waiting = 0; conn->destroy = server->conndestroy; conn->destroyarg = server->conndestroyarg; if (server->dispatch) { dispatch_add(server->dispatch, socket, -1, connection_ready, connection_error, NULL, conn); } } return conn; } return NULL; }
ServerPtr server_open(DispatchPtr dispatch, const char *listenaddr, unsigned int port, size_t framesize, ConnectionReceivedFunc recvfn, void *arg) { ServerPtr server = malloc(sizeof(struct Server)); if (server) { log_debug("Opening connection on %s:%u", listenaddr, port); server->listener = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (server->listener != -1) { struct sockaddr_in all_if; memset(&all_if, 0, sizeof(all_if)); all_if.sin_family = AF_INET; all_if.sin_port = htons((uint16_t) port); if (inet_pton(AF_INET, listenaddr, &all_if.sin_addr) == 1) { if (bind(server->listener, (struct sockaddr *) &all_if, sizeof(all_if)) == 0) { if (listen(server->listener, MAX_CONNECTIONS) == 0) { server->dispatch = dispatch; if (dispatch) { log_debug("Registering server socket %d", server->listener); dispatch_add(dispatch, server->listener, POLLIN, server_listener_ready, server_listener_error, NULL, server); } server->connections = list_new((ListDataFreeFunc) connection_free); server->framesize = framesize; server->recvfn = recvfn; server->arg = arg; server->conndestroy = NULL; server->conndestroyarg = NULL; return server; } else { log_error("Error listening on socket: %s", strerror(errno)); } } else { log_error("Error binding to socket: %s", strerror(errno)); } } else { log_error("Error converting address: %s", strerror(errno)); } close(server->listener); } else { log_error("Error creating socket: %s", strerror(errno)); } free(server); } else { log_error("Error allocating server object: %s", strerror(errno)); } return NULL; }
int main(const int argc, const char * argv[]) { watch_t w; watch_init(&w); watch_callback_t wc = { .data = NULL, .func = NULL, }; watch_add(&w, "/dev/mqueue", IN_CREATE | IN_ATTRIB, &wc); dispatch_t d; dispatch_init(&d); dispatch_callback_t dc = { .data = NULL, .func = callback, }; dispatch_add(&d, watch_fileno(&w), EPOLLIN, &dc); dispatch_wait(&d); return 0; }