Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
Archivo: dispatch.c Proyecto: gdhh/ffs
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;
}