/* * QEMU network listener * * Copyright (c) 2016-2017 Red Hat, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see . * */ #ifndef QIO_NET_LISTENER_H #define QIO_NET_LISTENER_H #include "io/channel-socket.h" #define TYPE_QIO_NET_LISTENER "qio-net-listener" #define QIO_NET_LISTENER(obj) \ OBJECT_CHECK(QIONetListener, (obj), TYPE_QIO_NET_LISTENER) #define QIO_NET_LISTENER_CLASS(klass) \ OBJECT_CLASS_CHECK(QIONetListenerClass, klass, TYPE_QIO_NET_LISTENER) #define QIO_NET_LISTENER_GET_CLASS(obj) \ OBJECT_GET_CLASS(QIONetListenerClass, obj, TYPE_QIO_NET_LISTENER) typedef struct QIONetListener QIONetListener; typedef struct QIONetListenerClass QIONetListenerClass; typedef void (*QIONetListenerClientFunc)(QIONetListener *listener, QIOChannelSocket *sioc, gpointer data); /** * QIONetListener: * * The QIONetListener object encapsulates the management of a * listening socket. It is able to listen on multiple sockets * concurrently, to deal with the scenario where IPv4 / IPv6 * needs separate sockets, or there is a need to listen on a * subset of interface IP addresses, instead of the wildcard * address. */ struct QIONetListener { Object parent; char *name; QIOChannelSocket **sioc; GSource **io_source; size_t nsioc; bool connected; QIONetListenerClientFunc io_func; gpointer io_data; GDestroyNotify io_notify; }; struct QIONetListenerClass { ObjectClass parent; }; /** * qio_net_listener_new: * * Create a new network listener service, which is not * listening on any sockets initially. * * Returns: the new listener */ QIONetListener *qio_net_listener_new(void); /** * qio_net_listener_set_name: * @listener: the network listener object * @name: the listener name * * Set the name of the listener. This is used as a debugging * aid, to set names on any GSource instances associated * with the listener */ void qio_net_listener_set_name(QIONetListener *listener, const char *name); /** * qio_net_listener_open_sync: * @listener: the network listener object * @addr: the address to listen on * @num: the amount of expected connections * @errp: pointer to a NULL initialized error object * * Synchronously open a listening connection on all * addresses associated with @addr. This method may * also be invoked multiple times, in order to have a * single listener on multiple distinct addresses. */ int qio_net_listener_open_sync(QIONetListener *listener, SocketAddress *addr, int num, Error **errp); /** * qio_net_listener_add: * @listener: the network listener object * @sioc: the socket I/O channel * * Associate a listening socket I/O channel with the * listener. The listener will acquire a new reference * on @sioc, so the caller should release its own reference * if it no longer requires the object. */ void qio_net_listener_add(QIONetListener *listener, QIOChannelSocket *sioc); /** * qio_net_listener_set_client_func_full: * @listener: the network listener object * @func: the callback function * @data: opaque data to pass to @func * @notify: callback to free @data * @context: the context that the sources will be bound to. If %NULL, * the default context will be used. * * Register @func to be invoked whenever a new client * connects to the listener. @func will be invoked * passing in the QIOChannelSocket instance for the * client. */ void qio_net_listener_set_client_func_full(QIONetListener *listener, QIONetListenerClientFunc func, gpointer data, GDestroyNotify notify, GMainContext *context); /** * qio_net_listener_set_client_func: * @listener: the network listener object * @func: the callback function * @data: opaque data to pass to @func * @notify: callback to free @data * * Wrapper of qio_net_listener_set_client_func_full(), only that the * sources will always be bound to default main context. */ void qio_net_listener_set_client_func(QIONetListener *listener, QIONetListenerClientFunc func, gpointer data, GDestroyNotify notify); /** * qio_net_listener_wait_client: * @listener: the network listener object * * Block execution of the caller until a new client arrives * on one of the listening sockets. If there was previously * a callback registered with qio_net_listener_set_client_func * it will be temporarily disabled, and re-enabled afterwards. * * Returns: the new client socket */ QIOChannelSocket *qio_net_listener_wait_client(QIONetListener *listener); /** * qio_net_listener_disconnect: * @listener: the network listener object * * Disconnect the listener, removing all I/O callback * watches and closing the socket channels. */ void qio_net_listener_disconnect(QIONetListener *listener); /** * qio_net_listener_is_connected: * @listener: the network listener object * * Determine if the listener is connected to any socket * channels * * Returns: true if connected, false otherwise */ bool qio_net_listener_is_connected(QIONetListener *listener); #endif /* QIO_NET_LISTENER_H */