153047392SDaniel P. Berrange /* 253047392SDaniel P. Berrange * QEMU network listener 353047392SDaniel P. Berrange * 453047392SDaniel P. Berrange * Copyright (c) 2016-2017 Red Hat, Inc. 553047392SDaniel P. Berrange * 653047392SDaniel P. Berrange * This program is free software; you can redistribute it and/or modify 753047392SDaniel P. Berrange * it under the terms of the GNU General Public License as published by 853047392SDaniel P. Berrange * the Free Software Foundation; either version 2 of the License, or 953047392SDaniel P. Berrange * (at your option) any later version. 1053047392SDaniel P. Berrange * 1153047392SDaniel P. Berrange * This program is distributed in the hope that it will be useful, 1253047392SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 1353047392SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1453047392SDaniel P. Berrange * GNU General Public License for more details. 1553047392SDaniel P. Berrange * 1653047392SDaniel P. Berrange * You should have received a copy of the GNU General Public License along 1753047392SDaniel P. Berrange * with this program; if not, see <http://www.gnu.org/licenses/>. 1853047392SDaniel P. Berrange * 1953047392SDaniel P. Berrange */ 2053047392SDaniel P. Berrange 2153047392SDaniel P. Berrange #ifndef QIO_NET_LISTENER_H 2253047392SDaniel P. Berrange #define QIO_NET_LISTENER_H 2353047392SDaniel P. Berrange 2453047392SDaniel P. Berrange #include "io/channel-socket.h" 25db1015e9SEduardo Habkost #include "qom/object.h" 2653047392SDaniel P. Berrange 2753047392SDaniel P. Berrange #define TYPE_QIO_NET_LISTENER "qio-net-listener" 28*30b5707cSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(QIONetListener, 29c734cd40SEduardo Habkost QIO_NET_LISTENER) 3053047392SDaniel P. Berrange 3153047392SDaniel P. Berrange 3253047392SDaniel P. Berrange typedef void (*QIONetListenerClientFunc)(QIONetListener *listener, 3353047392SDaniel P. Berrange QIOChannelSocket *sioc, 3453047392SDaniel P. Berrange gpointer data); 3553047392SDaniel P. Berrange 3653047392SDaniel P. Berrange /** 3753047392SDaniel P. Berrange * QIONetListener: 3853047392SDaniel P. Berrange * 3953047392SDaniel P. Berrange * The QIONetListener object encapsulates the management of a 4053047392SDaniel P. Berrange * listening socket. It is able to listen on multiple sockets 4153047392SDaniel P. Berrange * concurrently, to deal with the scenario where IPv4 / IPv6 4253047392SDaniel P. Berrange * needs separate sockets, or there is a need to listen on a 4353047392SDaniel P. Berrange * subset of interface IP addresses, instead of the wildcard 4453047392SDaniel P. Berrange * address. 4553047392SDaniel P. Berrange */ 4653047392SDaniel P. Berrange struct QIONetListener { 4753047392SDaniel P. Berrange Object parent; 4853047392SDaniel P. Berrange 4953047392SDaniel P. Berrange char *name; 5053047392SDaniel P. Berrange QIOChannelSocket **sioc; 51938c8b79SPeter Xu GSource **io_source; 5253047392SDaniel P. Berrange size_t nsioc; 5353047392SDaniel P. Berrange 5453047392SDaniel P. Berrange bool connected; 5553047392SDaniel P. Berrange 5653047392SDaniel P. Berrange QIONetListenerClientFunc io_func; 5753047392SDaniel P. Berrange gpointer io_data; 5853047392SDaniel P. Berrange GDestroyNotify io_notify; 5953047392SDaniel P. Berrange }; 6053047392SDaniel P. Berrange 6153047392SDaniel P. Berrange 6253047392SDaniel P. Berrange 6353047392SDaniel P. Berrange /** 6453047392SDaniel P. Berrange * qio_net_listener_new: 6553047392SDaniel P. Berrange * 6653047392SDaniel P. Berrange * Create a new network listener service, which is not 6753047392SDaniel P. Berrange * listening on any sockets initially. 6853047392SDaniel P. Berrange * 6953047392SDaniel P. Berrange * Returns: the new listener 7053047392SDaniel P. Berrange */ 7153047392SDaniel P. Berrange QIONetListener *qio_net_listener_new(void); 7253047392SDaniel P. Berrange 7353047392SDaniel P. Berrange 7453047392SDaniel P. Berrange /** 7553047392SDaniel P. Berrange * qio_net_listener_set_name: 7653047392SDaniel P. Berrange * @listener: the network listener object 7753047392SDaniel P. Berrange * @name: the listener name 7853047392SDaniel P. Berrange * 7953047392SDaniel P. Berrange * Set the name of the listener. This is used as a debugging 8053047392SDaniel P. Berrange * aid, to set names on any GSource instances associated 8153047392SDaniel P. Berrange * with the listener 8253047392SDaniel P. Berrange */ 8353047392SDaniel P. Berrange void qio_net_listener_set_name(QIONetListener *listener, 8453047392SDaniel P. Berrange const char *name); 8553047392SDaniel P. Berrange 8653047392SDaniel P. Berrange /** 8753047392SDaniel P. Berrange * qio_net_listener_open_sync: 8853047392SDaniel P. Berrange * @listener: the network listener object 8953047392SDaniel P. Berrange * @addr: the address to listen on 90fc8135c6SJuan Quintela * @num: the amount of expected connections 9153047392SDaniel P. Berrange * @errp: pointer to a NULL initialized error object 9253047392SDaniel P. Berrange * 9353047392SDaniel P. Berrange * Synchronously open a listening connection on all 9453047392SDaniel P. Berrange * addresses associated with @addr. This method may 9553047392SDaniel P. Berrange * also be invoked multiple times, in order to have a 9653047392SDaniel P. Berrange * single listener on multiple distinct addresses. 9753047392SDaniel P. Berrange */ 9853047392SDaniel P. Berrange int qio_net_listener_open_sync(QIONetListener *listener, 9953047392SDaniel P. Berrange SocketAddress *addr, 100fc8135c6SJuan Quintela int num, 10153047392SDaniel P. Berrange Error **errp); 10253047392SDaniel P. Berrange 10353047392SDaniel P. Berrange /** 10453047392SDaniel P. Berrange * qio_net_listener_add: 10553047392SDaniel P. Berrange * @listener: the network listener object 10653047392SDaniel P. Berrange * @sioc: the socket I/O channel 10753047392SDaniel P. Berrange * 10853047392SDaniel P. Berrange * Associate a listening socket I/O channel with the 10953047392SDaniel P. Berrange * listener. The listener will acquire a new reference 11053047392SDaniel P. Berrange * on @sioc, so the caller should release its own reference 11153047392SDaniel P. Berrange * if it no longer requires the object. 11253047392SDaniel P. Berrange */ 11353047392SDaniel P. Berrange void qio_net_listener_add(QIONetListener *listener, 11453047392SDaniel P. Berrange QIOChannelSocket *sioc); 11553047392SDaniel P. Berrange 11653047392SDaniel P. Berrange /** 117938c8b79SPeter Xu * qio_net_listener_set_client_func_full: 118938c8b79SPeter Xu * @listener: the network listener object 119938c8b79SPeter Xu * @func: the callback function 120938c8b79SPeter Xu * @data: opaque data to pass to @func 121938c8b79SPeter Xu * @notify: callback to free @data 122938c8b79SPeter Xu * @context: the context that the sources will be bound to. If %NULL, 123938c8b79SPeter Xu * the default context will be used. 124938c8b79SPeter Xu * 125938c8b79SPeter Xu * Register @func to be invoked whenever a new client 126938c8b79SPeter Xu * connects to the listener. @func will be invoked 127938c8b79SPeter Xu * passing in the QIOChannelSocket instance for the 128938c8b79SPeter Xu * client. 129938c8b79SPeter Xu */ 130938c8b79SPeter Xu void qio_net_listener_set_client_func_full(QIONetListener *listener, 131938c8b79SPeter Xu QIONetListenerClientFunc func, 132938c8b79SPeter Xu gpointer data, 133938c8b79SPeter Xu GDestroyNotify notify, 134938c8b79SPeter Xu GMainContext *context); 135938c8b79SPeter Xu 136938c8b79SPeter Xu /** 13753047392SDaniel P. Berrange * qio_net_listener_set_client_func: 13853047392SDaniel P. Berrange * @listener: the network listener object 13953047392SDaniel P. Berrange * @func: the callback function 14053047392SDaniel P. Berrange * @data: opaque data to pass to @func 14153047392SDaniel P. Berrange * @notify: callback to free @data 14253047392SDaniel P. Berrange * 143938c8b79SPeter Xu * Wrapper of qio_net_listener_set_client_func_full(), only that the 144938c8b79SPeter Xu * sources will always be bound to default main context. 14553047392SDaniel P. Berrange */ 14653047392SDaniel P. Berrange void qio_net_listener_set_client_func(QIONetListener *listener, 14753047392SDaniel P. Berrange QIONetListenerClientFunc func, 14853047392SDaniel P. Berrange gpointer data, 14953047392SDaniel P. Berrange GDestroyNotify notify); 15053047392SDaniel P. Berrange 15153047392SDaniel P. Berrange /** 15253047392SDaniel P. Berrange * qio_net_listener_wait_client: 15353047392SDaniel P. Berrange * @listener: the network listener object 15453047392SDaniel P. Berrange * 15553047392SDaniel P. Berrange * Block execution of the caller until a new client arrives 15653047392SDaniel P. Berrange * on one of the listening sockets. If there was previously 15753047392SDaniel P. Berrange * a callback registered with qio_net_listener_set_client_func 15853047392SDaniel P. Berrange * it will be temporarily disabled, and re-enabled afterwards. 15953047392SDaniel P. Berrange * 16053047392SDaniel P. Berrange * Returns: the new client socket 16153047392SDaniel P. Berrange */ 16253047392SDaniel P. Berrange QIOChannelSocket *qio_net_listener_wait_client(QIONetListener *listener); 16353047392SDaniel P. Berrange 16453047392SDaniel P. Berrange 16553047392SDaniel P. Berrange /** 16653047392SDaniel P. Berrange * qio_net_listener_disconnect: 16753047392SDaniel P. Berrange * @listener: the network listener object 16853047392SDaniel P. Berrange * 16953047392SDaniel P. Berrange * Disconnect the listener, removing all I/O callback 17053047392SDaniel P. Berrange * watches and closing the socket channels. 17153047392SDaniel P. Berrange */ 17253047392SDaniel P. Berrange void qio_net_listener_disconnect(QIONetListener *listener); 17353047392SDaniel P. Berrange 17453047392SDaniel P. Berrange 17553047392SDaniel P. Berrange /** 17653047392SDaniel P. Berrange * qio_net_listener_is_connected: 17753047392SDaniel P. Berrange * @listener: the network listener object 17853047392SDaniel P. Berrange * 17953047392SDaniel P. Berrange * Determine if the listener is connected to any socket 18053047392SDaniel P. Berrange * channels 18153047392SDaniel P. Berrange * 18253047392SDaniel P. Berrange * Returns: true if connected, false otherwise 18353047392SDaniel P. Berrange */ 18453047392SDaniel P. Berrange bool qio_net_listener_is_connected(QIONetListener *listener); 18553047392SDaniel P. Berrange 18653047392SDaniel P. Berrange #endif /* QIO_NET_LISTENER_H */ 187